summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorGravatar t8952024-02-17 19:34:34 -0500
committerGravatar t8952024-02-17 22:45:33 -0500
commit0010d42f82b2d2bdb276eb2cab000d0e09a6b264 (patch)
tree1860661fd05a6a1b2415436234512d6f4b115bff /src/android
parentMerge pull request #13052 from t895/serializable-stuff (diff)
downloadyuzu-0010d42f82b2d2bdb276eb2cab000d0e09a6b264.tar.gz
yuzu-0010d42f82b2d2bdb276eb2cab000d0e09a6b264.tar.xz
yuzu-0010d42f82b2d2bdb276eb2cab000d0e09a6b264.zip
android: Use extension functions for view visibility and text marquee
Diffstat (limited to 'src/android')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/DriverAdapter.kt26
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt10
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt11
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt28
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/HomeSettingAdapter.kt14
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/InstallableAdapter.kt14
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/LicenseAdapter.kt4
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/SetupAdapter.kt6
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSearchFragment.kt9
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt9
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputViewHolder.kt29
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt17
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt23
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt21
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt17
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt19
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt27
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt10
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt7
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt13
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt9
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt10
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt19
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt33
-rw-r--r--src/android/app/src/main/res/layout/card_driver_option.xml9
-rw-r--r--src/android/app/src/main/res/layout/card_folder.xml3
-rw-r--r--src/android/app/src/main/res/layout/card_game.xml3
-rw-r--r--src/android/app/src/main/res/layout/card_simple_outlined.xml3
-rw-r--r--src/android/app/src/main/res/layout/fragment_game_properties.xml3
31 files changed, 166 insertions, 265 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/DriverAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/DriverAdapter.kt
index f218c76ef..50663ad91 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/DriverAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/DriverAdapter.kt
@@ -3,15 +3,15 @@
3 3
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.text.TextUtils
7import android.view.LayoutInflater 6import android.view.LayoutInflater
8import android.view.View
9import android.view.ViewGroup 7import android.view.ViewGroup
10import org.yuzu.yuzu_emu.R 8import org.yuzu.yuzu_emu.R
11import org.yuzu.yuzu_emu.databinding.CardDriverOptionBinding 9import org.yuzu.yuzu_emu.databinding.CardDriverOptionBinding
12import org.yuzu.yuzu_emu.features.settings.model.StringSetting 10import org.yuzu.yuzu_emu.features.settings.model.StringSetting
13import org.yuzu.yuzu_emu.model.Driver 11import org.yuzu.yuzu_emu.model.Driver
14import org.yuzu.yuzu_emu.model.DriverViewModel 12import org.yuzu.yuzu_emu.model.DriverViewModel
13import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
14import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
15import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 15import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
16 16
17class DriverAdapter(private val driverViewModel: DriverViewModel) : 17class DriverAdapter(private val driverViewModel: DriverViewModel) :
@@ -44,25 +44,15 @@ class DriverAdapter(private val driverViewModel: DriverViewModel) :
44 } 44 }
45 45
46 // Delay marquee by 3s 46 // Delay marquee by 3s
47 title.postDelayed( 47 title.marquee()
48 { 48 version.marquee()
49 title.isSelected = true 49 description.marquee()
50 title.ellipsize = TextUtils.TruncateAt.MARQUEE
51 version.isSelected = true
52 version.ellipsize = TextUtils.TruncateAt.MARQUEE
53 description.isSelected = true
54 description.ellipsize = TextUtils.TruncateAt.MARQUEE
55 },
56 3000
57 )
58 title.text = model.title 50 title.text = model.title
59 version.text = model.version 51 version.text = model.version
60 description.text = model.description 52 description.text = model.description
61 if (model.title != binding.root.context.getString(R.string.system_gpu_driver)) { 53 buttonDelete.setVisible(
62 buttonDelete.visibility = View.VISIBLE 54 model.title != binding.root.context.getString(R.string.system_gpu_driver)
63 } else { 55 )
64 buttonDelete.visibility = View.GONE
65 }
66 } 56 }
67 } 57 }
68 } 58 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt
index 3d8f0bda8..5cbd15d2a 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.net.Uri 6import android.net.Uri
7import android.text.TextUtils
8import android.view.LayoutInflater 7import android.view.LayoutInflater
9import android.view.ViewGroup 8import android.view.ViewGroup
10import androidx.fragment.app.FragmentActivity 9import androidx.fragment.app.FragmentActivity
@@ -12,6 +11,7 @@ import org.yuzu.yuzu_emu.databinding.CardFolderBinding
12import org.yuzu.yuzu_emu.fragments.GameFolderPropertiesDialogFragment 11import org.yuzu.yuzu_emu.fragments.GameFolderPropertiesDialogFragment
13import org.yuzu.yuzu_emu.model.GameDir 12import org.yuzu.yuzu_emu.model.GameDir
14import org.yuzu.yuzu_emu.model.GamesViewModel 13import org.yuzu.yuzu_emu.model.GamesViewModel
14import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
15import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 15import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
16 16
17class FolderAdapter(val activity: FragmentActivity, val gamesViewModel: GamesViewModel) : 17class FolderAdapter(val activity: FragmentActivity, val gamesViewModel: GamesViewModel) :
@@ -29,13 +29,7 @@ class FolderAdapter(val activity: FragmentActivity, val gamesViewModel: GamesVie
29 override fun bind(model: GameDir) { 29 override fun bind(model: GameDir) {
30 binding.apply { 30 binding.apply {
31 path.text = Uri.parse(model.uriString).path 31 path.text = Uri.parse(model.uriString).path
32 path.postDelayed( 32 path.marquee()
33 {
34 path.isSelected = true
35 path.ellipsize = TextUtils.TruncateAt.MARQUEE
36 },
37 3000
38 )
39 33
40 buttonEdit.setOnClickListener { 34 buttonEdit.setOnClickListener {
41 GameFolderPropertiesDialogFragment.newInstance(model) 35 GameFolderPropertiesDialogFragment.newInstance(model)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
index 85c8249e6..b1f247ac3 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.net.Uri 6import android.net.Uri
7import android.text.TextUtils
8import android.view.LayoutInflater 7import android.view.LayoutInflater
9import android.view.ViewGroup 8import android.view.ViewGroup
10import android.widget.ImageView 9import android.widget.ImageView
@@ -27,6 +26,7 @@ import org.yuzu.yuzu_emu.databinding.CardGameBinding
27import org.yuzu.yuzu_emu.model.Game 26import org.yuzu.yuzu_emu.model.Game
28import org.yuzu.yuzu_emu.model.GamesViewModel 27import org.yuzu.yuzu_emu.model.GamesViewModel
29import org.yuzu.yuzu_emu.utils.GameIconUtils 28import org.yuzu.yuzu_emu.utils.GameIconUtils
29import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
30import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 30import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
31 31
32class GameAdapter(private val activity: AppCompatActivity) : 32class GameAdapter(private val activity: AppCompatActivity) :
@@ -44,14 +44,7 @@ class GameAdapter(private val activity: AppCompatActivity) :
44 44
45 binding.textGameTitle.text = model.title.replace("[\\t\\n\\r]+".toRegex(), " ") 45 binding.textGameTitle.text = model.title.replace("[\\t\\n\\r]+".toRegex(), " ")
46 46
47 binding.textGameTitle.postDelayed( 47 binding.textGameTitle.marquee()
48 {
49 binding.textGameTitle.ellipsize = TextUtils.TruncateAt.MARQUEE
50 binding.textGameTitle.isSelected = true
51 },
52 3000
53 )
54
55 binding.cardGame.setOnClickListener { onClick(model) } 48 binding.cardGame.setOnClickListener { onClick(model) }
56 binding.cardGame.setOnLongClickListener { onLongClick(model) } 49 binding.cardGame.setOnLongClickListener { onLongClick(model) }
57 } 50 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt
index 0046d5314..017306875 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt
@@ -3,9 +3,7 @@
3 3
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.text.TextUtils
7import android.view.LayoutInflater 6import android.view.LayoutInflater
8import android.view.View
9import android.view.ViewGroup 7import android.view.ViewGroup
10import androidx.core.content.res.ResourcesCompat 8import androidx.core.content.res.ResourcesCompat
11import androidx.lifecycle.Lifecycle 9import androidx.lifecycle.Lifecycle
@@ -18,6 +16,8 @@ import org.yuzu.yuzu_emu.databinding.CardSimpleOutlinedBinding
18import org.yuzu.yuzu_emu.model.GameProperty 16import org.yuzu.yuzu_emu.model.GameProperty
19import org.yuzu.yuzu_emu.model.InstallableProperty 17import org.yuzu.yuzu_emu.model.InstallableProperty
20import org.yuzu.yuzu_emu.model.SubmenuProperty 18import org.yuzu.yuzu_emu.model.SubmenuProperty
19import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
20import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
21import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 21import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
22 22
23class GamePropertiesAdapter( 23class GamePropertiesAdapter(
@@ -76,23 +76,19 @@ class GamePropertiesAdapter(
76 ) 76 )
77 ) 77 )
78 78
79 binding.details.postDelayed({ 79 binding.details.marquee()
80 binding.details.isSelected = true
81 binding.details.ellipsize = TextUtils.TruncateAt.MARQUEE
82 }, 3000)
83
84 if (submenuProperty.details != null) { 80 if (submenuProperty.details != null) {
85 binding.details.visibility = View.VISIBLE 81 binding.details.setVisible(true)
86 binding.details.text = submenuProperty.details.invoke() 82 binding.details.text = submenuProperty.details.invoke()
87 } else if (submenuProperty.detailsFlow != null) { 83 } else if (submenuProperty.detailsFlow != null) {
88 binding.details.visibility = View.VISIBLE 84 binding.details.setVisible(true)
89 viewLifecycle.lifecycleScope.launch { 85 viewLifecycle.lifecycleScope.launch {
90 viewLifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { 86 viewLifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
91 submenuProperty.detailsFlow.collect { binding.details.text = it } 87 submenuProperty.detailsFlow.collect { binding.details.text = it }
92 } 88 }
93 } 89 }
94 } else { 90 } else {
95 binding.details.visibility = View.GONE 91 binding.details.setVisible(false)
96 } 92 }
97 } 93 }
98 } 94 }
@@ -112,14 +108,10 @@ class GamePropertiesAdapter(
112 ) 108 )
113 ) 109 )
114 110
115 if (installableProperty.install != null) { 111 binding.buttonInstall.setVisible(installableProperty.install != null)
116 binding.buttonInstall.visibility = View.VISIBLE 112 binding.buttonInstall.setOnClickListener { installableProperty.install?.invoke() }
117 binding.buttonInstall.setOnClickListener { installableProperty.install.invoke() } 113 binding.buttonExport.setVisible(installableProperty.export != null)
118 } 114 binding.buttonExport.setOnClickListener { installableProperty.export?.invoke() }
119 if (installableProperty.export != null) {
120 binding.buttonExport.visibility = View.VISIBLE
121 binding.buttonExport.setOnClickListener { installableProperty.export.invoke() }
122 }
123 } 115 }
124 } 116 }
125 117
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/HomeSettingAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/HomeSettingAdapter.kt
index b512845d5..9234a4901 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/HomeSettingAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/HomeSettingAdapter.kt
@@ -3,9 +3,7 @@
3 3
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.text.TextUtils
7import android.view.LayoutInflater 6import android.view.LayoutInflater
8import android.view.View
9import android.view.ViewGroup 7import android.view.ViewGroup
10import androidx.appcompat.app.AppCompatActivity 8import androidx.appcompat.app.AppCompatActivity
11import androidx.core.content.ContextCompat 9import androidx.core.content.ContextCompat
@@ -19,6 +17,8 @@ import org.yuzu.yuzu_emu.R
19import org.yuzu.yuzu_emu.databinding.CardHomeOptionBinding 17import org.yuzu.yuzu_emu.databinding.CardHomeOptionBinding
20import org.yuzu.yuzu_emu.fragments.MessageDialogFragment 18import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
21import org.yuzu.yuzu_emu.model.HomeSetting 19import org.yuzu.yuzu_emu.model.HomeSetting
20import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
21import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
22import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 22import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
23 23
24class HomeSettingAdapter( 24class HomeSettingAdapter(
@@ -64,13 +64,7 @@ class HomeSettingAdapter(
64 model.details.collect { updateOptionDetails(it) } 64 model.details.collect { updateOptionDetails(it) }
65 } 65 }
66 } 66 }
67 binding.optionDetail.postDelayed( 67 binding.optionDetail.marquee()
68 {
69 binding.optionDetail.ellipsize = TextUtils.TruncateAt.MARQUEE
70 binding.optionDetail.isSelected = true
71 },
72 3000
73 )
74 68
75 binding.root.setOnClickListener { onClick(model) } 69 binding.root.setOnClickListener { onClick(model) }
76 } 70 }
@@ -90,7 +84,7 @@ class HomeSettingAdapter(
90 private fun updateOptionDetails(detailString: String) { 84 private fun updateOptionDetails(detailString: String) {
91 if (detailString.isNotEmpty()) { 85 if (detailString.isNotEmpty()) {
92 binding.optionDetail.text = detailString 86 binding.optionDetail.text = detailString
93 binding.optionDetail.visibility = View.VISIBLE 87 binding.optionDetail.setVisible(true)
94 } 88 }
95 } 89 }
96 } 90 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/InstallableAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/InstallableAdapter.kt
index 4218c4e52..1ba75fa2f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/InstallableAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/InstallableAdapter.kt
@@ -4,10 +4,10 @@
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.view.LayoutInflater 6import android.view.LayoutInflater
7import android.view.View
8import android.view.ViewGroup 7import android.view.ViewGroup
9import org.yuzu.yuzu_emu.databinding.CardInstallableBinding 8import org.yuzu.yuzu_emu.databinding.CardInstallableBinding
10import org.yuzu.yuzu_emu.model.Installable 9import org.yuzu.yuzu_emu.model.Installable
10import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
11import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 11import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
12 12
13class InstallableAdapter(installables: List<Installable>) : 13class InstallableAdapter(installables: List<Installable>) :
@@ -26,14 +26,10 @@ class InstallableAdapter(installables: List<Installable>) :
26 binding.title.setText(model.titleId) 26 binding.title.setText(model.titleId)
27 binding.description.setText(model.descriptionId) 27 binding.description.setText(model.descriptionId)
28 28
29 if (model.install != null) { 29 binding.buttonInstall.setVisible(model.install != null)
30 binding.buttonInstall.visibility = View.VISIBLE 30 binding.buttonInstall.setOnClickListener { model.install?.invoke() }
31 binding.buttonInstall.setOnClickListener { model.install.invoke() } 31 binding.buttonExport.setVisible(model.export != null)
32 } 32 binding.buttonExport.setOnClickListener { model.export?.invoke() }
33 if (model.export != null) {
34 binding.buttonExport.visibility = View.VISIBLE
35 binding.buttonExport.setOnClickListener { model.export.invoke() }
36 }
37 } 33 }
38 } 34 }
39} 35}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/LicenseAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/LicenseAdapter.kt
index 38bb1f96f..1379968f9 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/LicenseAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/LicenseAdapter.kt
@@ -4,12 +4,12 @@
4package org.yuzu.yuzu_emu.adapters 4package org.yuzu.yuzu_emu.adapters
5 5
6import android.view.LayoutInflater 6import android.view.LayoutInflater
7import android.view.View
8import android.view.ViewGroup 7import android.view.ViewGroup
9import androidx.appcompat.app.AppCompatActivity 8import androidx.appcompat.app.AppCompatActivity
10import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding 9import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
11import org.yuzu.yuzu_emu.fragments.LicenseBottomSheetDialogFragment 10import org.yuzu.yuzu_emu.fragments.LicenseBottomSheetDialogFragment
12import org.yuzu.yuzu_emu.model.License 11import org.yuzu.yuzu_emu.model.License
12import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
13import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 13import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
14 14
15class LicenseAdapter(private val activity: AppCompatActivity, licenses: List<License>) : 15class LicenseAdapter(private val activity: AppCompatActivity, licenses: List<License>) :
@@ -25,7 +25,7 @@ class LicenseAdapter(private val activity: AppCompatActivity, licenses: List<Lic
25 binding.apply { 25 binding.apply {
26 textSettingName.text = root.context.getString(model.titleId) 26 textSettingName.text = root.context.getString(model.titleId)
27 textSettingDescription.text = root.context.getString(model.descriptionId) 27 textSettingDescription.text = root.context.getString(model.descriptionId)
28 textSettingValue.visibility = View.GONE 28 textSettingValue.setVisible(false)
29 29
30 root.setOnClickListener { onClick(model) } 30 root.setOnClickListener { onClick(model) }
31 } 31 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/SetupAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/SetupAdapter.kt
index 02118e1a8..a5f610b31 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/SetupAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/SetupAdapter.kt
@@ -5,7 +5,6 @@ package org.yuzu.yuzu_emu.adapters
5 5
6import android.text.Html 6import android.text.Html
7import android.view.LayoutInflater 7import android.view.LayoutInflater
8import android.view.View
9import android.view.ViewGroup 8import android.view.ViewGroup
10import androidx.appcompat.app.AppCompatActivity 9import androidx.appcompat.app.AppCompatActivity
11import androidx.core.content.res.ResourcesCompat 10import androidx.core.content.res.ResourcesCompat
@@ -17,6 +16,7 @@ import org.yuzu.yuzu_emu.model.SetupCallback
17import org.yuzu.yuzu_emu.model.SetupPage 16import org.yuzu.yuzu_emu.model.SetupPage
18import org.yuzu.yuzu_emu.model.StepState 17import org.yuzu.yuzu_emu.model.StepState
19import org.yuzu.yuzu_emu.utils.ViewUtils 18import org.yuzu.yuzu_emu.utils.ViewUtils
19import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
20import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder 20import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
21 21
22class SetupAdapter(val activity: AppCompatActivity, pages: List<SetupPage>) : 22class SetupAdapter(val activity: AppCompatActivity, pages: List<SetupPage>) :
@@ -30,8 +30,8 @@ class SetupAdapter(val activity: AppCompatActivity, pages: List<SetupPage>) :
30 AbstractViewHolder<SetupPage>(binding), SetupCallback { 30 AbstractViewHolder<SetupPage>(binding), SetupCallback {
31 override fun bind(model: SetupPage) { 31 override fun bind(model: SetupPage) {
32 if (model.stepCompleted.invoke() == StepState.COMPLETE) { 32 if (model.stepCompleted.invoke() == StepState.COMPLETE) {
33 binding.buttonAction.visibility = View.INVISIBLE 33 binding.buttonAction.setVisible(visible = false, gone = false)
34 binding.textConfirmation.visibility = View.VISIBLE 34 binding.textConfirmation.setVisible(true)
35 } 35 }
36 36
37 binding.icon.setImageDrawable( 37 binding.icon.setImageDrawable(
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSearchFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSearchFragment.kt
index 51740a2ac..c4c1d563a 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSearchFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSearchFragment.kt
@@ -27,6 +27,7 @@ import org.yuzu.yuzu_emu.R
27import org.yuzu.yuzu_emu.databinding.FragmentSettingsSearchBinding 27import org.yuzu.yuzu_emu.databinding.FragmentSettingsSearchBinding
28import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 28import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
29import org.yuzu.yuzu_emu.utils.NativeConfig 29import org.yuzu.yuzu_emu.utils.NativeConfig
30import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
30import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins 31import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
31 32
32class SettingsSearchFragment : Fragment() { 33class SettingsSearchFragment : Fragment() {
@@ -106,10 +107,9 @@ class SettingsSearchFragment : Fragment() {
106 107
107 private fun search() { 108 private fun search() {
108 val searchTerm = binding.searchText.text.toString().lowercase() 109 val searchTerm = binding.searchText.text.toString().lowercase()
109 binding.clearButton.visibility = 110 binding.clearButton.setVisible(visible = searchTerm.isNotEmpty(), gone = false)
110 if (searchTerm.isEmpty()) View.INVISIBLE else View.VISIBLE
111 if (searchTerm.isEmpty()) { 111 if (searchTerm.isEmpty()) {
112 binding.noResultsView.visibility = View.VISIBLE 112 binding.noResultsView.setVisible(visible = false, gone = false)
113 settingsAdapter?.submitList(emptyList()) 113 settingsAdapter?.submitList(emptyList())
114 return 114 return
115 } 115 }
@@ -136,8 +136,7 @@ class SettingsSearchFragment : Fragment() {
136 optionalSetting 136 optionalSetting
137 } 137 }
138 settingsAdapter?.submitList(sortedList) 138 settingsAdapter?.submitList(sortedList)
139 binding.noResultsView.visibility = 139 binding.noResultsView.setVisible(visible = sortedList.isEmpty(), gone = false)
140 if (sortedList.isEmpty()) View.VISIBLE else View.INVISIBLE
141 } 140 }
142 141
143 private fun focusSearch() { 142 private fun focusSearch() {
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
index a43f7b1fe..367db7fd2 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
@@ -14,6 +14,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.DateTimeSetting
14import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 14import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
15import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 15import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
16import org.yuzu.yuzu_emu.utils.NativeConfig 16import org.yuzu.yuzu_emu.utils.NativeConfig
17import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
17 18
18class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : 19class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
19 SettingViewHolder(binding.root, adapter) { 20 SettingViewHolder(binding.root, adapter) {
@@ -22,27 +23,18 @@ class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
22 override fun bind(item: SettingsItem) { 23 override fun bind(item: SettingsItem) {
23 setting = item as DateTimeSetting 24 setting = item as DateTimeSetting
24 binding.textSettingName.text = item.title 25 binding.textSettingName.text = item.title
25 if (setting.description.isNotEmpty()) { 26 binding.textSettingDescription.setVisible(item.description.isNotEmpty())
26 binding.textSettingDescription.text = item.description 27 binding.textSettingDescription.text = item.description
27 binding.textSettingDescription.visibility = View.VISIBLE 28 binding.textSettingValue.setVisible(true)
28 } else {
29 binding.textSettingDescription.visibility = View.GONE
30 }
31
32 binding.textSettingValue.visibility = View.VISIBLE
33 val epochTime = setting.getValue() 29 val epochTime = setting.getValue()
34 val instant = Instant.ofEpochMilli(epochTime * 1000) 30 val instant = Instant.ofEpochMilli(epochTime * 1000)
35 val zonedTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")) 31 val zonedTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC"))
36 val dateFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM) 32 val dateFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
37 binding.textSettingValue.text = dateFormatter.format(zonedTime) 33 binding.textSettingValue.text = dateFormatter.format(zonedTime)
38 34
39 binding.buttonClear.visibility = if (setting.setting.global || 35 binding.buttonClear.setVisible(
40 !NativeConfig.isPerGameConfigLoaded() 36 !setting.setting.global || NativeConfig.isPerGameConfigLoaded()
41 ) { 37 )
42 View.GONE
43 } else {
44 View.VISIBLE
45 }
46 binding.buttonClear.setOnClickListener { 38 binding.buttonClear.setOnClickListener {
47 adapter.onClearClick(setting, bindingAdapterPosition) 39 adapter.onClearClick(setting, bindingAdapterPosition)
48 } 40 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt
index 81161d5d3..86af3a226 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt
@@ -9,6 +9,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.InputProfileSetting
9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
10import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 10import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
11import org.yuzu.yuzu_emu.R 11import org.yuzu.yuzu_emu.R
12import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
12 13
13class InputProfileViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : 14class InputProfileViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
14 SettingViewHolder(binding.root, adapter) { 15 SettingViewHolder(binding.root, adapter) {
@@ -20,10 +21,10 @@ class InputProfileViewHolder(val binding: ListItemSettingBinding, adapter: Setti
20 binding.textSettingValue.text = 21 binding.textSettingValue.text =
21 setting.getCurrentProfile().ifEmpty { binding.root.context.getString(R.string.not_set) } 22 setting.getCurrentProfile().ifEmpty { binding.root.context.getString(R.string.not_set) }
22 23
23 binding.textSettingDescription.visibility = View.GONE 24 binding.textSettingDescription.setVisible(false)
24 binding.buttonClear.visibility = View.GONE 25 binding.buttonClear.setVisible(false)
25 binding.icon.visibility = View.GONE 26 binding.icon.setVisible(false)
26 binding.buttonClear.visibility = View.GONE 27 binding.buttonClear.setVisible(false)
27 } 28 }
28 29
29 override fun onClick(clicked: View) = 30 override fun onClick(clicked: View) =
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputViewHolder.kt
index 1f1f08190..9d9047804 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputViewHolder.kt
@@ -12,6 +12,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.InputSetting
12import org.yuzu.yuzu_emu.features.settings.model.view.ModifierInputSetting 12import org.yuzu.yuzu_emu.features.settings.model.view.ModifierInputSetting
13import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 13import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
14import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 14import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
15import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
15 16
16class InputViewHolder(val binding: ListItemSettingInputBinding, adapter: SettingsAdapter) : 17class InputViewHolder(val binding: ListItemSettingInputBinding, adapter: SettingsAdapter) :
17 SettingViewHolder(binding.root, adapter) { 18 SettingViewHolder(binding.root, adapter) {
@@ -22,38 +23,26 @@ class InputViewHolder(val binding: ListItemSettingInputBinding, adapter: Setting
22 binding.textSettingName.text = setting.title 23 binding.textSettingName.text = setting.title
23 binding.textSettingValue.text = setting.getSelectedValue() 24 binding.textSettingValue.text = setting.getSelectedValue()
24 25
25 binding.buttonOptions.visibility = when (item) { 26 when (item) {
26 is AnalogInputSetting -> { 27 is AnalogInputSetting -> {
27 val param = NativeInput.getStickParam(item.playerIndex, item.nativeAnalog) 28 val param = NativeInput.getStickParam(item.playerIndex, item.nativeAnalog)
28 if ( 29 binding.buttonOptions.setVisible(
29 param.get("engine", "") == "analog_from_button" || 30 param.get("engine", "") == "analog_from_button" ||
30 param.has("axis_x") || param.has("axis_y") 31 param.has("axis_x") || param.has("axis_y")
31 ) { 32 )
32 View.VISIBLE
33 } else {
34 View.GONE
35 }
36 } 33 }
37 34
38 is ButtonInputSetting -> { 35 is ButtonInputSetting -> {
39 val param = NativeInput.getButtonParam(item.playerIndex, item.nativeButton) 36 val param = NativeInput.getButtonParam(item.playerIndex, item.nativeButton)
40 if ( 37 binding.buttonOptions.setVisible(
41 param.has("code") || param.has("button") || param.has("hat") || 38 param.has("code") || param.has("button") || param.has("hat") ||
42 param.has("axis") 39 param.has("axis")
43 ) { 40 )
44 View.VISIBLE
45 } else {
46 View.GONE
47 }
48 } 41 }
49 42
50 is ModifierInputSetting -> { 43 is ModifierInputSetting -> {
51 val params = NativeInput.getStickParam(item.playerIndex, item.nativeAnalog) 44 val params = NativeInput.getStickParam(item.playerIndex, item.nativeAnalog)
52 if (params.has("modifier")) { 45 binding.buttonOptions.setVisible(params.has("modifier"))
53 View.VISIBLE
54 } else {
55 View.GONE
56 }
57 } 46 }
58 } 47 }
59 48
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt
index 2841520a5..fc2ffb515 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt
@@ -9,6 +9,7 @@ import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
9import org.yuzu.yuzu_emu.features.settings.model.view.RunnableSetting 9import org.yuzu.yuzu_emu.features.settings.model.view.RunnableSetting
10import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 10import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
12import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
12 13
13class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : 14class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
14 SettingViewHolder(binding.root, adapter) { 15 SettingViewHolder(binding.root, adapter) {
@@ -16,8 +17,8 @@ class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
16 17
17 override fun bind(item: SettingsItem) { 18 override fun bind(item: SettingsItem) {
18 setting = item as RunnableSetting 19 setting = item as RunnableSetting
20 binding.icon.setVisible(setting.iconId != 0)
19 if (setting.iconId != 0) { 21 if (setting.iconId != 0) {
20 binding.icon.visibility = View.VISIBLE
21 binding.icon.setImageDrawable( 22 binding.icon.setImageDrawable(
22 ResourcesCompat.getDrawable( 23 ResourcesCompat.getDrawable(
23 binding.icon.resources, 24 binding.icon.resources,
@@ -25,19 +26,13 @@ class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
25 binding.icon.context.theme 26 binding.icon.context.theme
26 ) 27 )
27 ) 28 )
28 } else {
29 binding.icon.visibility = View.GONE
30 } 29 }
31 30
32 binding.textSettingName.text = setting.title 31 binding.textSettingName.text = setting.title
33 if (setting.description.isNotEmpty()) { 32 binding.textSettingDescription.setVisible(setting.description.isNotEmpty())
34 binding.textSettingDescription.setText(item.descriptionId) 33 binding.textSettingDescription.text = item.description
35 binding.textSettingDescription.visibility = View.VISIBLE 34 binding.textSettingValue.setVisible(false)
36 } else { 35 binding.buttonClear.setVisible(false)
37 binding.textSettingDescription.visibility = View.GONE
38 }
39 binding.textSettingValue.visibility = View.GONE
40 binding.buttonClear.visibility = View.GONE
41 36
42 setStyle(setting.isEditable, binding) 37 setStyle(setting.isEditable, binding)
43 } 38 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
index 9705d428c..e2fe0b072 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
@@ -11,6 +11,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting
11import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting 11import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting
12import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 12import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
13import org.yuzu.yuzu_emu.utils.NativeConfig 13import org.yuzu.yuzu_emu.utils.NativeConfig
14import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
14 15
15class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : 16class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
16 SettingViewHolder(binding.root, adapter) { 17 SettingViewHolder(binding.root, adapter) {
@@ -19,14 +20,10 @@ class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: Setti
19 override fun bind(item: SettingsItem) { 20 override fun bind(item: SettingsItem) {
20 setting = item 21 setting = item
21 binding.textSettingName.text = setting.title 22 binding.textSettingName.text = setting.title
22 if (item.description.isNotEmpty()) { 23 binding.textSettingDescription.setVisible(item.description.isNotEmpty())
23 binding.textSettingDescription.text = item.description 24 binding.textSettingDescription.text = item.description
24 binding.textSettingDescription.visibility = View.VISIBLE
25 } else {
26 binding.textSettingDescription.visibility = View.GONE
27 }
28 25
29 binding.textSettingValue.visibility = View.VISIBLE 26 binding.textSettingValue.setVisible(true)
30 when (item) { 27 when (item) {
31 is SingleChoiceSetting -> { 28 is SingleChoiceSetting -> {
32 val resMgr = binding.textSettingValue.context.resources 29 val resMgr = binding.textSettingValue.context.resources
@@ -48,16 +45,12 @@ class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: Setti
48 } 45 }
49 } 46 }
50 if (binding.textSettingValue.text.isEmpty()) { 47 if (binding.textSettingValue.text.isEmpty()) {
51 binding.textSettingValue.visibility = View.GONE 48 binding.textSettingValue.setVisible(false)
52 } 49 }
53 50
54 binding.buttonClear.visibility = if (setting.setting.global || 51 binding.buttonClear.setVisible(
55 !NativeConfig.isPerGameConfigLoaded() 52 !setting.setting.global || NativeConfig.isPerGameConfigLoaded()
56 ) { 53 )
57 View.GONE
58 } else {
59 View.VISIBLE
60 }
61 binding.buttonClear.setOnClickListener { 54 binding.buttonClear.setOnClickListener {
62 adapter.onClearClick(setting, bindingAdapterPosition) 55 adapter.onClearClick(setting, bindingAdapterPosition)
63 } 56 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
index fcfac040e..a37b59b44 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
@@ -10,6 +10,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
10import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting 10import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting
11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
12import org.yuzu.yuzu_emu.utils.NativeConfig 12import org.yuzu.yuzu_emu.utils.NativeConfig
13import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
13 14
14class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : 15class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
15 SettingViewHolder(binding.root, adapter) { 16 SettingViewHolder(binding.root, adapter) {
@@ -18,26 +19,18 @@ class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAda
18 override fun bind(item: SettingsItem) { 19 override fun bind(item: SettingsItem) {
19 setting = item as SliderSetting 20 setting = item as SliderSetting
20 binding.textSettingName.text = setting.title 21 binding.textSettingName.text = setting.title
21 if (item.description.isNotEmpty()) { 22 binding.textSettingDescription.setVisible(item.description.isNotEmpty())
22 binding.textSettingDescription.text = setting.description 23 binding.textSettingDescription.text = setting.description
23 binding.textSettingDescription.visibility = View.VISIBLE 24 binding.textSettingValue.setVisible(true)
24 } else {
25 binding.textSettingDescription.visibility = View.GONE
26 }
27 binding.textSettingValue.visibility = View.VISIBLE
28 binding.textSettingValue.text = String.format( 25 binding.textSettingValue.text = String.format(
29 binding.textSettingValue.context.getString(R.string.value_with_units), 26 binding.textSettingValue.context.getString(R.string.value_with_units),
30 setting.getSelectedValue(), 27 setting.getSelectedValue(),
31 setting.units 28 setting.units
32 ) 29 )
33 30
34 binding.buttonClear.visibility = if (setting.setting.global || 31 binding.buttonClear.setVisible(
35 !NativeConfig.isPerGameConfigLoaded() 32 !setting.setting.global || NativeConfig.isPerGameConfigLoaded()
36 ) { 33 )
37 View.GONE
38 } else {
39 View.VISIBLE
40 }
41 binding.buttonClear.setOnClickListener { 34 binding.buttonClear.setOnClickListener {
42 adapter.onClearClick(setting, bindingAdapterPosition) 35 adapter.onClearClick(setting, bindingAdapterPosition)
43 } 36 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt
index 165c765b3..f7a9c08c3 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt
@@ -9,6 +9,7 @@ import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
10import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting 10import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting
11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
12import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
12 13
13class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : 14class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
14 SettingViewHolder(binding.root, adapter) { 15 SettingViewHolder(binding.root, adapter) {
@@ -16,8 +17,8 @@ class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAd
16 17
17 override fun bind(item: SettingsItem) { 18 override fun bind(item: SettingsItem) {
18 setting = item as SubmenuSetting 19 setting = item as SubmenuSetting
20 binding.icon.setVisible(setting.iconId != 0)
19 if (setting.iconId != 0) { 21 if (setting.iconId != 0) {
20 binding.icon.visibility = View.VISIBLE
21 binding.icon.setImageDrawable( 22 binding.icon.setImageDrawable(
22 ResourcesCompat.getDrawable( 23 ResourcesCompat.getDrawable(
23 binding.icon.resources, 24 binding.icon.resources,
@@ -25,19 +26,13 @@ class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAd
25 binding.icon.context.theme 26 binding.icon.context.theme
26 ) 27 )
27 ) 28 )
28 } else {
29 binding.icon.visibility = View.GONE
30 } 29 }
31 30
32 binding.textSettingName.text = setting.title 31 binding.textSettingName.text = setting.title
33 if (setting.description.isNotEmpty()) { 32 binding.textSettingDescription.setVisible(setting.description.isNotEmpty())
34 binding.textSettingDescription.text = setting.description 33 binding.textSettingDescription.text = setting.description
35 binding.textSettingDescription.visibility = View.VISIBLE 34 binding.textSettingValue.setVisible(false)
36 } else { 35 binding.buttonClear.setVisible(false)
37 binding.textSettingDescription.visibility = View.GONE
38 }
39 binding.textSettingValue.visibility = View.GONE
40 binding.buttonClear.visibility = View.GONE
41 } 36 }
42 37
43 override fun onClick(clicked: View) { 38 override fun onClick(clicked: View) {
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
index f779a7b60..53f7b301f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
@@ -10,6 +10,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
10import org.yuzu.yuzu_emu.features.settings.model.view.SwitchSetting 10import org.yuzu.yuzu_emu.features.settings.model.view.SwitchSetting
11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
12import org.yuzu.yuzu_emu.utils.NativeConfig 12import org.yuzu.yuzu_emu.utils.NativeConfig
13import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
13 14
14class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter: SettingsAdapter) : 15class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter: SettingsAdapter) :
15 SettingViewHolder(binding.root, adapter) { 16 SettingViewHolder(binding.root, adapter) {
@@ -19,12 +20,8 @@ class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter
19 override fun bind(item: SettingsItem) { 20 override fun bind(item: SettingsItem) {
20 setting = item as SwitchSetting 21 setting = item as SwitchSetting
21 binding.textSettingName.text = setting.title 22 binding.textSettingName.text = setting.title
22 if (setting.description.isNotEmpty()) { 23 binding.textSettingDescription.setVisible(setting.description.isNotEmpty())
23 binding.textSettingDescription.text = setting.description 24 binding.textSettingDescription.text = setting.description
24 binding.textSettingDescription.visibility = View.VISIBLE
25 } else {
26 binding.textSettingDescription.visibility = View.GONE
27 }
28 25
29 binding.switchWidget.setOnCheckedChangeListener(null) 26 binding.switchWidget.setOnCheckedChangeListener(null)
30 binding.switchWidget.isChecked = setting.getIsChecked(setting.needsRuntimeGlobal) 27 binding.switchWidget.isChecked = setting.getIsChecked(setting.needsRuntimeGlobal)
@@ -32,13 +29,9 @@ class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter
32 adapter.onBooleanClick(setting, binding.switchWidget.isChecked, bindingAdapterPosition) 29 adapter.onBooleanClick(setting, binding.switchWidget.isChecked, bindingAdapterPosition)
33 } 30 }
34 31
35 binding.buttonClear.visibility = if (setting.setting.global || 32 binding.buttonClear.setVisible(
36 !NativeConfig.isPerGameConfigLoaded() 33 !setting.setting.global || NativeConfig.isPerGameConfigLoaded()
37 ) { 34 )
38 View.GONE
39 } else {
40 View.VISIBLE
41 }
42 binding.buttonClear.setOnClickListener { 35 binding.buttonClear.setOnClickListener {
43 adapter.onClearClick(setting, bindingAdapterPosition) 36 adapter.onClearClick(setting, bindingAdapterPosition)
44 } 37 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
index c737ed5e8..aedc128d6 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
@@ -63,6 +63,7 @@ import org.yuzu.yuzu_emu.model.EmulationViewModel
63import org.yuzu.yuzu_emu.overlay.model.OverlayControl 63import org.yuzu.yuzu_emu.overlay.model.OverlayControl
64import org.yuzu.yuzu_emu.overlay.model.OverlayLayout 64import org.yuzu.yuzu_emu.overlay.model.OverlayLayout
65import org.yuzu.yuzu_emu.utils.* 65import org.yuzu.yuzu_emu.utils.*
66import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
66import java.lang.NullPointerException 67import java.lang.NullPointerException
67 68
68class EmulationFragment : Fragment(), SurfaceHolder.Callback { 69class EmulationFragment : Fragment(), SurfaceHolder.Callback {
@@ -500,14 +501,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
500 binding.drawerLayout.close() 501 binding.drawerLayout.close()
501 } 502 }
502 if (showInputOverlay) { 503 if (showInputOverlay) {
503 binding.surfaceInputOverlay.visibility = View.INVISIBLE 504 binding.surfaceInputOverlay.setVisible(visible = false, gone = false)
504 } 505 }
505 } else { 506 } else {
506 if (showInputOverlay && emulationViewModel.emulationStarted.value) { 507 binding.surfaceInputOverlay.setVisible(
507 binding.surfaceInputOverlay.visibility = View.VISIBLE 508 showInputOverlay && emulationViewModel.emulationStarted.value
508 } else { 509 )
509 binding.surfaceInputOverlay.visibility = View.INVISIBLE
510 }
511 if (!isInFoldableLayout) { 510 if (!isInFoldableLayout) {
512 if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 511 if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
513 binding.surfaceInputOverlay.layout = OverlayLayout.Portrait 512 binding.surfaceInputOverlay.layout = OverlayLayout.Portrait
@@ -544,7 +543,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
544 } 543 }
545 544
546 private fun updateShowFpsOverlay() { 545 private fun updateShowFpsOverlay() {
547 if (BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()) { 546 val showOverlay = BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()
547 binding.showFpsText.setVisible(showOverlay)
548 if (showOverlay) {
548 val SYSTEM_FPS = 0 549 val SYSTEM_FPS = 0
549 val FPS = 1 550 val FPS = 1
550 val FRAMETIME = 2 551 val FRAMETIME = 2
@@ -564,17 +565,17 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
564 } 565 }
565 } 566 }
566 perfStatsUpdateHandler.post(perfStatsUpdater!!) 567 perfStatsUpdateHandler.post(perfStatsUpdater!!)
567 binding.showFpsText.visibility = View.VISIBLE
568 } else { 568 } else {
569 if (perfStatsUpdater != null) { 569 if (perfStatsUpdater != null) {
570 perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!) 570 perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!)
571 } 571 }
572 binding.showFpsText.visibility = View.GONE
573 } 572 }
574 } 573 }
575 574
576 private fun updateThermalOverlay() { 575 private fun updateThermalOverlay() {
577 if (BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean()) { 576 val showOverlay = BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean()
577 binding.showThermalsText.setVisible(showOverlay)
578 if (showOverlay) {
578 thermalStatsUpdater = { 579 thermalStatsUpdater = {
579 if (emulationViewModel.emulationStarted.value && 580 if (emulationViewModel.emulationStarted.value &&
580 !emulationViewModel.isEmulationStopping.value 581 !emulationViewModel.isEmulationStopping.value
@@ -596,12 +597,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
596 } 597 }
597 } 598 }
598 thermalStatsUpdateHandler.post(thermalStatsUpdater!!) 599 thermalStatsUpdateHandler.post(thermalStatsUpdater!!)
599 binding.showThermalsText.visibility = View.VISIBLE
600 } else { 600 } else {
601 if (thermalStatsUpdater != null) { 601 if (thermalStatsUpdater != null) {
602 thermalStatsUpdateHandler.removeCallbacks(thermalStatsUpdater!!) 602 thermalStatsUpdateHandler.removeCallbacks(thermalStatsUpdater!!)
603 } 603 }
604 binding.showThermalsText.visibility = View.GONE
605 } 604 }
606 } 605 }
607 606
@@ -870,12 +869,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
870 } 869 }
871 } 870 }
872 } 871 }
873 binding.doneControlConfig.visibility = View.VISIBLE 872 binding.doneControlConfig.setVisible(false)
874 binding.surfaceInputOverlay.setIsInEditMode(true) 873 binding.surfaceInputOverlay.setIsInEditMode(true)
875 } 874 }
876 875
877 private fun stopConfiguringControls() { 876 private fun stopConfiguringControls() {
878 binding.doneControlConfig.visibility = View.GONE 877 binding.doneControlConfig.setVisible(false)
879 binding.surfaceInputOverlay.setIsInEditMode(false) 878 binding.surfaceInputOverlay.setIsInEditMode(false)
880 // Unlock the orientation if it was locked for editing 879 // Unlock the orientation if it was locked for editing
881 if (IntSetting.RENDERER_SCREEN_LAYOUT.getInt() == EmulationOrientation.Unspecified.int) { 880 if (IntSetting.RENDERER_SCREEN_LAYOUT.getInt() == EmulationOrientation.Unspecified.int) {
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
index dbd56e84f..97a8954bb 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
@@ -27,6 +27,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding
27import org.yuzu.yuzu_emu.model.GameVerificationResult 27import org.yuzu.yuzu_emu.model.GameVerificationResult
28import org.yuzu.yuzu_emu.model.HomeViewModel 28import org.yuzu.yuzu_emu.model.HomeViewModel
29import org.yuzu.yuzu_emu.utils.GameMetadata 29import org.yuzu.yuzu_emu.utils.GameMetadata
30import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
30import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins 31import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
31 32
32class GameInfoFragment : Fragment() { 33class GameInfoFragment : Fragment() {
@@ -85,7 +86,7 @@ class GameInfoFragment : Fragment() {
85 copyToClipboard(getString(R.string.developer), args.game.developer) 86 copyToClipboard(getString(R.string.developer), args.game.developer)
86 } 87 }
87 } else { 88 } else {
88 developer.visibility = View.GONE 89 developer.setVisible(false)
89 } 90 }
90 91
91 version.setHint(R.string.version) 92 version.setHint(R.string.version)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
index 3ea5e16ca..c4da1a65d 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
@@ -7,7 +7,6 @@ import android.annotation.SuppressLint
7import android.content.pm.ShortcutInfo 7import android.content.pm.ShortcutInfo
8import android.content.pm.ShortcutManager 8import android.content.pm.ShortcutManager
9import android.os.Bundle 9import android.os.Bundle
10import android.text.TextUtils
11import android.view.LayoutInflater 10import android.view.LayoutInflater
12import android.view.View 11import android.view.View
13import android.view.ViewGroup 12import android.view.ViewGroup
@@ -46,6 +45,7 @@ import org.yuzu.yuzu_emu.utils.FileUtil
46import org.yuzu.yuzu_emu.utils.GameIconUtils 45import org.yuzu.yuzu_emu.utils.GameIconUtils
47import org.yuzu.yuzu_emu.utils.GpuDriverHelper 46import org.yuzu.yuzu_emu.utils.GpuDriverHelper
48import org.yuzu.yuzu_emu.utils.MemoryUtil 47import org.yuzu.yuzu_emu.utils.MemoryUtil
48import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
49import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins 49import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
50import java.io.BufferedOutputStream 50import java.io.BufferedOutputStream
51import java.io.File 51import java.io.File
@@ -107,13 +107,7 @@ class GamePropertiesFragment : Fragment() {
107 107
108 GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen) 108 GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen)
109 binding.title.text = args.game.title 109 binding.title.text = args.game.title
110 binding.title.postDelayed( 110 binding.title.marquee()
111 {
112 binding.title.ellipsize = TextUtils.TruncateAt.MARQUEE
113 binding.title.isSelected = true
114 },
115 3000
116 )
117 111
118 binding.buttonStart.setOnClickListener { 112 binding.buttonStart.setOnClickListener {
119 LaunchGameDialogFragment.newInstance(args.game) 113 LaunchGameDialogFragment.newInstance(args.game)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt
index d201cb80c..ae29e9cd1 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt
@@ -22,6 +22,7 @@ import kotlinx.coroutines.launch
22import org.yuzu.yuzu_emu.R 22import org.yuzu.yuzu_emu.R
23import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding 23import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
24import org.yuzu.yuzu_emu.model.TaskViewModel 24import org.yuzu.yuzu_emu.model.TaskViewModel
25import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
25 26
26class ProgressDialogFragment : DialogFragment() { 27class ProgressDialogFragment : DialogFragment() {
27 private val taskViewModel: TaskViewModel by activityViewModels() 28 private val taskViewModel: TaskViewModel by activityViewModels()
@@ -120,10 +121,8 @@ class ProgressDialogFragment : DialogFragment() {
120 launch { 121 launch {
121 repeatOnLifecycle(Lifecycle.State.CREATED) { 122 repeatOnLifecycle(Lifecycle.State.CREATED) {
122 taskViewModel.message.collect { 123 taskViewModel.message.collect {
123 if (it.isEmpty()) { 124 binding.message.setVisible(it.isNotEmpty())
124 binding.message.visibility = View.GONE 125 if (it.isNotEmpty()) {
125 } else {
126 binding.message.visibility = View.VISIBLE
127 binding.message.text = it 126 binding.message.text = it
128 } 127 }
129 } 128 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt
index 20b10b1a0..9f6509605 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt
@@ -35,6 +35,7 @@ import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager
35import org.yuzu.yuzu_emu.model.Game 35import org.yuzu.yuzu_emu.model.Game
36import org.yuzu.yuzu_emu.model.GamesViewModel 36import org.yuzu.yuzu_emu.model.GamesViewModel
37import org.yuzu.yuzu_emu.model.HomeViewModel 37import org.yuzu.yuzu_emu.model.HomeViewModel
38import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
38 39
39class SearchFragment : Fragment() { 40class SearchFragment : Fragment() {
40 private var _binding: FragmentSearchBinding? = null 41 private var _binding: FragmentSearchBinding? = null
@@ -81,11 +82,7 @@ class SearchFragment : Fragment() {
81 binding.chipGroup.setOnCheckedStateChangeListener { _, _ -> filterAndSearch() } 82 binding.chipGroup.setOnCheckedStateChangeListener { _, _ -> filterAndSearch() }
82 83
83 binding.searchText.doOnTextChanged { text: CharSequence?, _: Int, _: Int, _: Int -> 84 binding.searchText.doOnTextChanged { text: CharSequence?, _: Int, _: Int, _: Int ->
84 if (text.toString().isNotEmpty()) { 85 binding.clearButton.setVisible(text.toString().isNotEmpty())
85 binding.clearButton.visibility = View.VISIBLE
86 } else {
87 binding.clearButton.visibility = View.INVISIBLE
88 }
89 filterAndSearch() 86 filterAndSearch()
90 } 87 }
91 88
@@ -109,11 +106,7 @@ class SearchFragment : Fragment() {
109 repeatOnLifecycle(Lifecycle.State.CREATED) { 106 repeatOnLifecycle(Lifecycle.State.CREATED) {
110 gamesViewModel.searchedGames.collect { 107 gamesViewModel.searchedGames.collect {
111 (binding.gridGamesSearch.adapter as GameAdapter).submitList(it) 108 (binding.gridGamesSearch.adapter as GameAdapter).submitList(it)
112 if (it.isEmpty()) { 109 binding.noResultsView.setVisible(it.isEmpty())
113 binding.noResultsView.visibility = View.VISIBLE
114 } else {
115 binding.noResultsView.visibility = View.GONE
116 }
117 } 110 }
118 } 111 }
119 } 112 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt
index ebf41a639..eb279d309 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt
@@ -46,6 +46,7 @@ import org.yuzu.yuzu_emu.ui.main.MainActivity
46import org.yuzu.yuzu_emu.utils.DirectoryInitialization 46import org.yuzu.yuzu_emu.utils.DirectoryInitialization
47import org.yuzu.yuzu_emu.utils.NativeConfig 47import org.yuzu.yuzu_emu.utils.NativeConfig
48import org.yuzu.yuzu_emu.utils.ViewUtils 48import org.yuzu.yuzu_emu.utils.ViewUtils
49import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
49 50
50class SetupFragment : Fragment() { 51class SetupFragment : Fragment() {
51 private var _binding: FragmentSetupBinding? = null 52 private var _binding: FragmentSetupBinding? = null
@@ -292,12 +293,8 @@ class SetupFragment : Fragment() {
292 val backIsVisible = savedInstanceState.getBoolean(KEY_BACK_VISIBILITY) 293 val backIsVisible = savedInstanceState.getBoolean(KEY_BACK_VISIBILITY)
293 hasBeenWarned = savedInstanceState.getBooleanArray(KEY_HAS_BEEN_WARNED)!! 294 hasBeenWarned = savedInstanceState.getBooleanArray(KEY_HAS_BEEN_WARNED)!!
294 295
295 if (nextIsVisible) { 296 binding.buttonNext.setVisible(nextIsVisible)
296 binding.buttonNext.visibility = View.VISIBLE 297 binding.buttonBack.setVisible(backIsVisible)
297 }
298 if (backIsVisible) {
299 binding.buttonBack.visibility = View.VISIBLE
300 }
301 } else { 298 } else {
302 hasBeenWarned = BooleanArray(pages.size) 299 hasBeenWarned = BooleanArray(pages.size)
303 } 300 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt
index 23ca49b53..b3248585e 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt
@@ -26,6 +26,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentGamesBinding
26import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager 26import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager
27import org.yuzu.yuzu_emu.model.GamesViewModel 27import org.yuzu.yuzu_emu.model.GamesViewModel
28import org.yuzu.yuzu_emu.model.HomeViewModel 28import org.yuzu.yuzu_emu.model.HomeViewModel
29import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
29import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins 30import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
30 31
31class GamesFragment : Fragment() { 32class GamesFragment : Fragment() {
@@ -93,11 +94,10 @@ class GamesFragment : Fragment() {
93 repeatOnLifecycle(Lifecycle.State.RESUMED) { 94 repeatOnLifecycle(Lifecycle.State.RESUMED) {
94 gamesViewModel.isReloading.collect { 95 gamesViewModel.isReloading.collect {
95 binding.swipeRefresh.isRefreshing = it 96 binding.swipeRefresh.isRefreshing = it
96 if (gamesViewModel.games.value.isEmpty() && !it) { 97 binding.noticeText.setVisible(
97 binding.noticeText.visibility = View.VISIBLE 98 visible = gamesViewModel.games.value.isEmpty() && !it,
98 } else { 99 gone = false
99 binding.noticeText.visibility = View.INVISIBLE 100 )
100 }
101 } 101 }
102 } 102 }
103 } 103 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
index 4df4ac4c6..703fbaf3e 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
@@ -47,6 +47,7 @@ import org.yuzu.yuzu_emu.model.InstallResult
47import org.yuzu.yuzu_emu.model.TaskState 47import org.yuzu.yuzu_emu.model.TaskState
48import org.yuzu.yuzu_emu.model.TaskViewModel 48import org.yuzu.yuzu_emu.model.TaskViewModel
49import org.yuzu.yuzu_emu.utils.* 49import org.yuzu.yuzu_emu.utils.*
50import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
50import java.io.BufferedInputStream 51import java.io.BufferedInputStream
51import java.io.BufferedOutputStream 52import java.io.BufferedOutputStream
52import java.util.zip.ZipEntry 53import java.util.zip.ZipEntry
@@ -139,8 +140,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
139 140
140 // Prevents navigation from being drawn for a short time on recreation if set to hidden 141 // Prevents navigation from being drawn for a short time on recreation if set to hidden
141 if (!homeViewModel.navigationVisible.value.first) { 142 if (!homeViewModel.navigationVisible.value.first) {
142 binding.navigationView.visibility = View.INVISIBLE 143 binding.navigationView.setVisible(visible = false, gone = false)
143 binding.statusBarShade.visibility = View.INVISIBLE 144 binding.statusBarShade.setVisible(visible = false, gone = false)
144 } 145 }
145 146
146 lifecycleScope.apply { 147 lifecycleScope.apply {
@@ -214,18 +215,14 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
214 215
215 private fun showNavigation(visible: Boolean, animated: Boolean) { 216 private fun showNavigation(visible: Boolean, animated: Boolean) {
216 if (!animated) { 217 if (!animated) {
217 if (visible) { 218 binding.navigationView.setVisible(visible)
218 binding.navigationView.visibility = View.VISIBLE
219 } else {
220 binding.navigationView.visibility = View.INVISIBLE
221 }
222 return 219 return
223 } 220 }
224 221
225 val smallLayout = resources.getBoolean(R.bool.small_layout) 222 val smallLayout = resources.getBoolean(R.bool.small_layout)
226 binding.navigationView.animate().apply { 223 binding.navigationView.animate().apply {
227 if (visible) { 224 if (visible) {
228 binding.navigationView.visibility = View.VISIBLE 225 binding.navigationView.setVisible(true)
229 duration = 300 226 duration = 300
230 interpolator = PathInterpolator(0.05f, 0.7f, 0.1f, 1f) 227 interpolator = PathInterpolator(0.05f, 0.7f, 0.1f, 1f)
231 228
@@ -264,7 +261,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
264 } 261 }
265 }.withEndAction { 262 }.withEndAction {
266 if (!visible) { 263 if (!visible) {
267 binding.navigationView.visibility = View.INVISIBLE 264 binding.navigationView.setVisible(visible = false, gone = false)
268 } 265 }
269 }.start() 266 }.start()
270 } 267 }
@@ -272,7 +269,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
272 private fun showStatusBarShade(visible: Boolean) { 269 private fun showStatusBarShade(visible: Boolean) {
273 binding.statusBarShade.animate().apply { 270 binding.statusBarShade.animate().apply {
274 if (visible) { 271 if (visible) {
275 binding.statusBarShade.visibility = View.VISIBLE 272 binding.statusBarShade.setVisible(true)
276 binding.statusBarShade.translationY = binding.statusBarShade.height.toFloat() * -2 273 binding.statusBarShade.translationY = binding.statusBarShade.height.toFloat() * -2
277 duration = 300 274 duration = 300
278 translationY(0f) 275 translationY(0f)
@@ -284,7 +281,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
284 } 281 }
285 }.withEndAction { 282 }.withEndAction {
286 if (!visible) { 283 if (!visible) {
287 binding.statusBarShade.visibility = View.INVISIBLE 284 binding.statusBarShade.setVisible(visible = false, gone = false)
288 } 285 }
289 }.start() 286 }.start()
290 } 287 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt
index ffbfa9337..244091aec 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt
@@ -3,8 +3,10 @@
3 3
4package org.yuzu.yuzu_emu.utils 4package org.yuzu.yuzu_emu.utils
5 5
6import android.text.TextUtils
6import android.view.View 7import android.view.View
7import android.view.ViewGroup 8import android.view.ViewGroup
9import android.widget.TextView
8 10
9object ViewUtils { 11object ViewUtils {
10 fun showView(view: View, length: Long = 300) { 12 fun showView(view: View, length: Long = 300) {
@@ -57,4 +59,35 @@ object ViewUtils {
57 } 59 }
58 this.layoutParams = layoutParams 60 this.layoutParams = layoutParams
59 } 61 }
62
63 /**
64 * Shows or hides a view.
65 * @param visible Whether a view will be made View.VISIBLE or View.INVISIBLE/GONE.
66 * @param gone Optional parameter for hiding a view. Uses View.GONE if true and View.INVISIBLE otherwise.
67 */
68 fun View.setVisible(visible: Boolean, gone: Boolean = true) {
69 visibility = if (visible) {
70 View.VISIBLE
71 } else {
72 if (gone) {
73 View.GONE
74 } else {
75 View.INVISIBLE
76 }
77 }
78 }
79
80 /**
81 * Starts a marquee on some text.
82 * @param delay Optional parameter for changing the start delay. 3 seconds of delay by default.
83 */
84 fun TextView.marquee(delay: Long = 3000) {
85 ellipsize = null
86 marqueeRepeatLimit = -1
87 isSingleLine = true
88 postDelayed({
89 ellipsize = TextUtils.TruncateAt.MARQUEE
90 isSelected = true
91 }, delay)
92 }
60} 93}
diff --git a/src/android/app/src/main/res/layout/card_driver_option.xml b/src/android/app/src/main/res/layout/card_driver_option.xml
index bda524f0f..09e26990b 100644
--- a/src/android/app/src/main/res/layout/card_driver_option.xml
+++ b/src/android/app/src/main/res/layout/card_driver_option.xml
@@ -39,10 +39,7 @@
39 style="@style/TextAppearance.Material3.TitleMedium" 39 style="@style/TextAppearance.Material3.TitleMedium"
40 android:layout_width="match_parent" 40 android:layout_width="match_parent"
41 android:layout_height="wrap_content" 41 android:layout_height="wrap_content"
42 android:ellipsize="none"
43 android:marqueeRepeatLimit="marquee_forever"
44 android:requiresFadingEdge="horizontal" 42 android:requiresFadingEdge="horizontal"
45 android:singleLine="true"
46 android:textAlignment="viewStart" 43 android:textAlignment="viewStart"
47 tools:text="@string/select_gpu_driver_default" /> 44 tools:text="@string/select_gpu_driver_default" />
48 45
@@ -52,10 +49,7 @@
52 android:layout_width="match_parent" 49 android:layout_width="match_parent"
53 android:layout_height="wrap_content" 50 android:layout_height="wrap_content"
54 android:layout_marginTop="6dp" 51 android:layout_marginTop="6dp"
55 android:ellipsize="none"
56 android:marqueeRepeatLimit="marquee_forever"
57 android:requiresFadingEdge="horizontal" 52 android:requiresFadingEdge="horizontal"
58 android:singleLine="true"
59 android:textAlignment="viewStart" 53 android:textAlignment="viewStart"
60 tools:text="@string/install_gpu_driver_description" /> 54 tools:text="@string/install_gpu_driver_description" />
61 55
@@ -65,10 +59,7 @@
65 android:layout_width="match_parent" 59 android:layout_width="match_parent"
66 android:layout_height="wrap_content" 60 android:layout_height="wrap_content"
67 android:layout_marginTop="6dp" 61 android:layout_marginTop="6dp"
68 android:ellipsize="none"
69 android:marqueeRepeatLimit="marquee_forever"
70 android:requiresFadingEdge="horizontal" 62 android:requiresFadingEdge="horizontal"
71 android:singleLine="true"
72 android:textAlignment="viewStart" 63 android:textAlignment="viewStart"
73 tools:text="@string/install_gpu_driver_description" /> 64 tools:text="@string/install_gpu_driver_description" />
74 65
diff --git a/src/android/app/src/main/res/layout/card_folder.xml b/src/android/app/src/main/res/layout/card_folder.xml
index ed4a7ca8f..e3a5f1a86 100644
--- a/src/android/app/src/main/res/layout/card_folder.xml
+++ b/src/android/app/src/main/res/layout/card_folder.xml
@@ -21,10 +21,7 @@
21 android:layout_width="0dp" 21 android:layout_width="0dp"
22 android:layout_height="wrap_content" 22 android:layout_height="wrap_content"
23 android:layout_gravity="center_vertical|start" 23 android:layout_gravity="center_vertical|start"
24 android:ellipsize="none"
25 android:marqueeRepeatLimit="marquee_forever"
26 android:requiresFadingEdge="horizontal" 24 android:requiresFadingEdge="horizontal"
27 android:singleLine="true"
28 android:textAlignment="viewStart" 25 android:textAlignment="viewStart"
29 app:layout_constraintBottom_toBottomOf="parent" 26 app:layout_constraintBottom_toBottomOf="parent"
30 app:layout_constraintEnd_toStartOf="@+id/button_layout" 27 app:layout_constraintEnd_toStartOf="@+id/button_layout"
diff --git a/src/android/app/src/main/res/layout/card_game.xml b/src/android/app/src/main/res/layout/card_game.xml
index 6340171ec..411b50315 100644
--- a/src/android/app/src/main/res/layout/card_game.xml
+++ b/src/android/app/src/main/res/layout/card_game.xml
@@ -40,10 +40,7 @@
40 android:layout_width="0dp" 40 android:layout_width="0dp"
41 android:layout_height="wrap_content" 41 android:layout_height="wrap_content"
42 android:layout_marginTop="8dp" 42 android:layout_marginTop="8dp"
43 android:ellipsize="none"
44 android:marqueeRepeatLimit="marquee_forever"
45 android:requiresFadingEdge="horizontal" 43 android:requiresFadingEdge="horizontal"
46 android:singleLine="true"
47 android:textAlignment="center" 44 android:textAlignment="center"
48 android:textSize="14sp" 45 android:textSize="14sp"
49 app:layout_constraintEnd_toEndOf="@+id/image_game_screen" 46 app:layout_constraintEnd_toEndOf="@+id/image_game_screen"
diff --git a/src/android/app/src/main/res/layout/card_simple_outlined.xml b/src/android/app/src/main/res/layout/card_simple_outlined.xml
index b73930e7e..e29df6a2d 100644
--- a/src/android/app/src/main/res/layout/card_simple_outlined.xml
+++ b/src/android/app/src/main/res/layout/card_simple_outlined.xml
@@ -59,9 +59,6 @@
59 android:textAlignment="viewStart" 59 android:textAlignment="viewStart"
60 android:textSize="14sp" 60 android:textSize="14sp"
61 android:textStyle="bold" 61 android:textStyle="bold"
62 android:singleLine="true"
63 android:marqueeRepeatLimit="marquee_forever"
64 android:ellipsize="none"
65 android:requiresFadingEdge="horizontal" 62 android:requiresFadingEdge="horizontal"
66 android:layout_marginTop="6dp" 63 android:layout_marginTop="6dp"
67 android:visibility="gone" 64 android:visibility="gone"
diff --git a/src/android/app/src/main/res/layout/fragment_game_properties.xml b/src/android/app/src/main/res/layout/fragment_game_properties.xml
index 436ebd79d..5e3f3cf28 100644
--- a/src/android/app/src/main/res/layout/fragment_game_properties.xml
+++ b/src/android/app/src/main/res/layout/fragment_game_properties.xml
@@ -76,10 +76,7 @@
76 android:layout_marginTop="12dp" 76 android:layout_marginTop="12dp"
77 android:layout_marginBottom="12dp" 77 android:layout_marginBottom="12dp"
78 android:layout_marginHorizontal="16dp" 78 android:layout_marginHorizontal="16dp"
79 android:ellipsize="none"
80 android:marqueeRepeatLimit="marquee_forever"
81 android:requiresFadingEdge="horizontal" 79 android:requiresFadingEdge="horizontal"
82 android:singleLine="true"
83 android:textAlignment="center" 80 android:textAlignment="center"
84 tools:text="deko_basic" /> 81 tools:text="deko_basic" />
85 82