mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #13050 from t895/marquee-helper
android: Use extension functions for view visibility and text marquee
This commit is contained in:
		@@ -3,15 +3,15 @@
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.text.TextUtils
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import org.yuzu.yuzu_emu.R
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.CardDriverOptionBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.model.Driver
 | 
			
		||||
import org.yuzu.yuzu_emu.model.DriverViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class DriverAdapter(private val driverViewModel: DriverViewModel) :
 | 
			
		||||
@@ -44,25 +44,15 @@ class DriverAdapter(private val driverViewModel: DriverViewModel) :
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Delay marquee by 3s
 | 
			
		||||
                title.postDelayed(
 | 
			
		||||
                    {
 | 
			
		||||
                        title.isSelected = true
 | 
			
		||||
                        title.ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
                        version.isSelected = true
 | 
			
		||||
                        version.ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
                        description.isSelected = true
 | 
			
		||||
                        description.ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
                    },
 | 
			
		||||
                    3000
 | 
			
		||||
                )
 | 
			
		||||
                title.marquee()
 | 
			
		||||
                version.marquee()
 | 
			
		||||
                description.marquee()
 | 
			
		||||
                title.text = model.title
 | 
			
		||||
                version.text = model.version
 | 
			
		||||
                description.text = model.description
 | 
			
		||||
                if (model.title != binding.root.context.getString(R.string.system_gpu_driver)) {
 | 
			
		||||
                    buttonDelete.visibility = View.VISIBLE
 | 
			
		||||
                } else {
 | 
			
		||||
                    buttonDelete.visibility = View.GONE
 | 
			
		||||
                }
 | 
			
		||||
                buttonDelete.setVisible(
 | 
			
		||||
                    model.title != binding.root.context.getString(R.string.system_gpu_driver)
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@
 | 
			
		||||
package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.text.TextUtils
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import androidx.fragment.app.FragmentActivity
 | 
			
		||||
@@ -12,6 +11,7 @@ import org.yuzu.yuzu_emu.databinding.CardFolderBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.fragments.GameFolderPropertiesDialogFragment
 | 
			
		||||
import org.yuzu.yuzu_emu.model.GameDir
 | 
			
		||||
import org.yuzu.yuzu_emu.model.GamesViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class FolderAdapter(val activity: FragmentActivity, val gamesViewModel: GamesViewModel) :
 | 
			
		||||
@@ -29,13 +29,7 @@ class FolderAdapter(val activity: FragmentActivity, val gamesViewModel: GamesVie
 | 
			
		||||
        override fun bind(model: GameDir) {
 | 
			
		||||
            binding.apply {
 | 
			
		||||
                path.text = Uri.parse(model.uriString).path
 | 
			
		||||
                path.postDelayed(
 | 
			
		||||
                    {
 | 
			
		||||
                        path.isSelected = true
 | 
			
		||||
                        path.ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
                    },
 | 
			
		||||
                    3000
 | 
			
		||||
                )
 | 
			
		||||
                path.marquee()
 | 
			
		||||
 | 
			
		||||
                buttonEdit.setOnClickListener {
 | 
			
		||||
                    GameFolderPropertiesDialogFragment.newInstance(model)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@
 | 
			
		||||
package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.text.TextUtils
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import android.widget.ImageView
 | 
			
		||||
@@ -27,6 +26,7 @@ import org.yuzu.yuzu_emu.databinding.CardGameBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.model.Game
 | 
			
		||||
import org.yuzu.yuzu_emu.model.GamesViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.GameIconUtils
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class GameAdapter(private val activity: AppCompatActivity) :
 | 
			
		||||
@@ -44,14 +44,7 @@ class GameAdapter(private val activity: AppCompatActivity) :
 | 
			
		||||
 | 
			
		||||
            binding.textGameTitle.text = model.title.replace("[\\t\\n\\r]+".toRegex(), " ")
 | 
			
		||||
 | 
			
		||||
            binding.textGameTitle.postDelayed(
 | 
			
		||||
                {
 | 
			
		||||
                    binding.textGameTitle.ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
                    binding.textGameTitle.isSelected = true
 | 
			
		||||
                },
 | 
			
		||||
                3000
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            binding.textGameTitle.marquee()
 | 
			
		||||
            binding.cardGame.setOnClickListener { onClick(model) }
 | 
			
		||||
            binding.cardGame.setOnLongClickListener { onLongClick(model) }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,7 @@
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.text.TextUtils
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import androidx.core.content.res.ResourcesCompat
 | 
			
		||||
import androidx.lifecycle.Lifecycle
 | 
			
		||||
@@ -18,6 +16,8 @@ import org.yuzu.yuzu_emu.databinding.CardSimpleOutlinedBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.model.GameProperty
 | 
			
		||||
import org.yuzu.yuzu_emu.model.InstallableProperty
 | 
			
		||||
import org.yuzu.yuzu_emu.model.SubmenuProperty
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class GamePropertiesAdapter(
 | 
			
		||||
@@ -76,23 +76,19 @@ class GamePropertiesAdapter(
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            binding.details.postDelayed({
 | 
			
		||||
                binding.details.isSelected = true
 | 
			
		||||
                binding.details.ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
            }, 3000)
 | 
			
		||||
 | 
			
		||||
            binding.details.marquee()
 | 
			
		||||
            if (submenuProperty.details != null) {
 | 
			
		||||
                binding.details.visibility = View.VISIBLE
 | 
			
		||||
                binding.details.setVisible(true)
 | 
			
		||||
                binding.details.text = submenuProperty.details.invoke()
 | 
			
		||||
            } else if (submenuProperty.detailsFlow != null) {
 | 
			
		||||
                binding.details.visibility = View.VISIBLE
 | 
			
		||||
                binding.details.setVisible(true)
 | 
			
		||||
                viewLifecycle.lifecycleScope.launch {
 | 
			
		||||
                    viewLifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
 | 
			
		||||
                        submenuProperty.detailsFlow.collect { binding.details.text = it }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                binding.details.visibility = View.GONE
 | 
			
		||||
                binding.details.setVisible(false)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -112,14 +108,10 @@ class GamePropertiesAdapter(
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            if (installableProperty.install != null) {
 | 
			
		||||
                binding.buttonInstall.visibility = View.VISIBLE
 | 
			
		||||
                binding.buttonInstall.setOnClickListener { installableProperty.install.invoke() }
 | 
			
		||||
            }
 | 
			
		||||
            if (installableProperty.export != null) {
 | 
			
		||||
                binding.buttonExport.visibility = View.VISIBLE
 | 
			
		||||
                binding.buttonExport.setOnClickListener { installableProperty.export.invoke() }
 | 
			
		||||
            }
 | 
			
		||||
            binding.buttonInstall.setVisible(installableProperty.install != null)
 | 
			
		||||
            binding.buttonInstall.setOnClickListener { installableProperty.install?.invoke() }
 | 
			
		||||
            binding.buttonExport.setVisible(installableProperty.export != null)
 | 
			
		||||
            binding.buttonExport.setOnClickListener { installableProperty.export?.invoke() }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,7 @@
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.text.TextUtils
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
@@ -19,6 +17,8 @@ import org.yuzu.yuzu_emu.R
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.CardHomeOptionBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
 | 
			
		||||
import org.yuzu.yuzu_emu.model.HomeSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class HomeSettingAdapter(
 | 
			
		||||
@@ -64,13 +64,7 @@ class HomeSettingAdapter(
 | 
			
		||||
                    model.details.collect { updateOptionDetails(it) }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            binding.optionDetail.postDelayed(
 | 
			
		||||
                {
 | 
			
		||||
                    binding.optionDetail.ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
                    binding.optionDetail.isSelected = true
 | 
			
		||||
                },
 | 
			
		||||
                3000
 | 
			
		||||
            )
 | 
			
		||||
            binding.optionDetail.marquee()
 | 
			
		||||
 | 
			
		||||
            binding.root.setOnClickListener { onClick(model) }
 | 
			
		||||
        }
 | 
			
		||||
@@ -90,7 +84,7 @@ class HomeSettingAdapter(
 | 
			
		||||
        private fun updateOptionDetails(detailString: String) {
 | 
			
		||||
            if (detailString.isNotEmpty()) {
 | 
			
		||||
                binding.optionDetail.text = detailString
 | 
			
		||||
                binding.optionDetail.visibility = View.VISIBLE
 | 
			
		||||
                binding.optionDetail.setVisible(true)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,10 @@
 | 
			
		||||
package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.CardInstallableBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.model.Installable
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class InstallableAdapter(installables: List<Installable>) :
 | 
			
		||||
@@ -26,14 +26,10 @@ class InstallableAdapter(installables: List<Installable>) :
 | 
			
		||||
            binding.title.setText(model.titleId)
 | 
			
		||||
            binding.description.setText(model.descriptionId)
 | 
			
		||||
 | 
			
		||||
            if (model.install != null) {
 | 
			
		||||
                binding.buttonInstall.visibility = View.VISIBLE
 | 
			
		||||
                binding.buttonInstall.setOnClickListener { model.install.invoke() }
 | 
			
		||||
            }
 | 
			
		||||
            if (model.export != null) {
 | 
			
		||||
                binding.buttonExport.visibility = View.VISIBLE
 | 
			
		||||
                binding.buttonExport.setOnClickListener { model.export.invoke() }
 | 
			
		||||
            }
 | 
			
		||||
            binding.buttonInstall.setVisible(model.install != null)
 | 
			
		||||
            binding.buttonInstall.setOnClickListener { model.install?.invoke() }
 | 
			
		||||
            binding.buttonExport.setVisible(model.export != null)
 | 
			
		||||
            binding.buttonExport.setOnClickListener { model.export?.invoke() }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,12 @@
 | 
			
		||||
package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.fragments.LicenseBottomSheetDialogFragment
 | 
			
		||||
import org.yuzu.yuzu_emu.model.License
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class LicenseAdapter(private val activity: AppCompatActivity, licenses: List<License>) :
 | 
			
		||||
@@ -25,7 +25,7 @@ class LicenseAdapter(private val activity: AppCompatActivity, licenses: List<Lic
 | 
			
		||||
            binding.apply {
 | 
			
		||||
                textSettingName.text = root.context.getString(model.titleId)
 | 
			
		||||
                textSettingDescription.text = root.context.getString(model.descriptionId)
 | 
			
		||||
                textSettingValue.visibility = View.GONE
 | 
			
		||||
                textSettingValue.setVisible(false)
 | 
			
		||||
 | 
			
		||||
                root.setOnClickListener { onClick(model) }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ package org.yuzu.yuzu_emu.adapters
 | 
			
		||||
 | 
			
		||||
import android.text.Html
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.core.content.res.ResourcesCompat
 | 
			
		||||
@@ -17,6 +16,7 @@ import org.yuzu.yuzu_emu.model.SetupCallback
 | 
			
		||||
import org.yuzu.yuzu_emu.model.SetupPage
 | 
			
		||||
import org.yuzu.yuzu_emu.model.StepState
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
 | 
			
		||||
 | 
			
		||||
class SetupAdapter(val activity: AppCompatActivity, pages: List<SetupPage>) :
 | 
			
		||||
@@ -30,8 +30,8 @@ class SetupAdapter(val activity: AppCompatActivity, pages: List<SetupPage>) :
 | 
			
		||||
        AbstractViewHolder<SetupPage>(binding), SetupCallback {
 | 
			
		||||
        override fun bind(model: SetupPage) {
 | 
			
		||||
            if (model.stepCompleted.invoke() == StepState.COMPLETE) {
 | 
			
		||||
                binding.buttonAction.visibility = View.INVISIBLE
 | 
			
		||||
                binding.textConfirmation.visibility = View.VISIBLE
 | 
			
		||||
                binding.buttonAction.setVisible(visible = false, gone = false)
 | 
			
		||||
                binding.textConfirmation.setVisible(true)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            binding.icon.setImageDrawable(
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ import org.yuzu.yuzu_emu.R
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.FragmentSettingsSearchBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.NativeConfig
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
 | 
			
		||||
 | 
			
		||||
class SettingsSearchFragment : Fragment() {
 | 
			
		||||
@@ -106,10 +107,9 @@ class SettingsSearchFragment : Fragment() {
 | 
			
		||||
 | 
			
		||||
    private fun search() {
 | 
			
		||||
        val searchTerm = binding.searchText.text.toString().lowercase()
 | 
			
		||||
        binding.clearButton.visibility =
 | 
			
		||||
            if (searchTerm.isEmpty()) View.INVISIBLE else View.VISIBLE
 | 
			
		||||
        binding.clearButton.setVisible(visible = searchTerm.isNotEmpty(), gone = false)
 | 
			
		||||
        if (searchTerm.isEmpty()) {
 | 
			
		||||
            binding.noResultsView.visibility = View.VISIBLE
 | 
			
		||||
            binding.noResultsView.setVisible(visible = false, gone = false)
 | 
			
		||||
            settingsAdapter?.submitList(emptyList())
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
@@ -136,8 +136,7 @@ class SettingsSearchFragment : Fragment() {
 | 
			
		||||
            optionalSetting
 | 
			
		||||
        }
 | 
			
		||||
        settingsAdapter?.submitList(sortedList)
 | 
			
		||||
        binding.noResultsView.visibility =
 | 
			
		||||
            if (sortedList.isEmpty()) View.VISIBLE else View.INVISIBLE
 | 
			
		||||
        binding.noResultsView.setVisible(visible = sortedList.isEmpty(), gone = false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun focusSearch() {
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.DateTimeSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.NativeConfig
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
 | 
			
		||||
    SettingViewHolder(binding.root, adapter) {
 | 
			
		||||
@@ -22,27 +23,18 @@ class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
 | 
			
		||||
    override fun bind(item: SettingsItem) {
 | 
			
		||||
        setting = item as DateTimeSetting
 | 
			
		||||
        binding.textSettingName.text = item.title
 | 
			
		||||
        if (setting.description.isNotEmpty()) {
 | 
			
		||||
        binding.textSettingDescription.setVisible(item.description.isNotEmpty())
 | 
			
		||||
        binding.textSettingDescription.text = item.description
 | 
			
		||||
            binding.textSettingDescription.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.textSettingDescription.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.textSettingValue.visibility = View.VISIBLE
 | 
			
		||||
        binding.textSettingValue.setVisible(true)
 | 
			
		||||
        val epochTime = setting.getValue()
 | 
			
		||||
        val instant = Instant.ofEpochMilli(epochTime * 1000)
 | 
			
		||||
        val zonedTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC"))
 | 
			
		||||
        val dateFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
 | 
			
		||||
        binding.textSettingValue.text = dateFormatter.format(zonedTime)
 | 
			
		||||
 | 
			
		||||
        binding.buttonClear.visibility = if (setting.setting.global ||
 | 
			
		||||
            !NativeConfig.isPerGameConfigLoaded()
 | 
			
		||||
        ) {
 | 
			
		||||
            View.GONE
 | 
			
		||||
        } else {
 | 
			
		||||
            View.VISIBLE
 | 
			
		||||
        }
 | 
			
		||||
        binding.buttonClear.setVisible(
 | 
			
		||||
            !setting.setting.global || NativeConfig.isPerGameConfigLoaded()
 | 
			
		||||
        )
 | 
			
		||||
        binding.buttonClear.setOnClickListener {
 | 
			
		||||
            adapter.onClearClick(setting, bindingAdapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.InputProfileSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.R
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class InputProfileViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
 | 
			
		||||
    SettingViewHolder(binding.root, adapter) {
 | 
			
		||||
@@ -20,10 +21,10 @@ class InputProfileViewHolder(val binding: ListItemSettingBinding, adapter: Setti
 | 
			
		||||
        binding.textSettingValue.text =
 | 
			
		||||
            setting.getCurrentProfile().ifEmpty { binding.root.context.getString(R.string.not_set) }
 | 
			
		||||
 | 
			
		||||
        binding.textSettingDescription.visibility = View.GONE
 | 
			
		||||
        binding.buttonClear.visibility = View.GONE
 | 
			
		||||
        binding.icon.visibility = View.GONE
 | 
			
		||||
        binding.buttonClear.visibility = View.GONE
 | 
			
		||||
        binding.textSettingDescription.setVisible(false)
 | 
			
		||||
        binding.buttonClear.setVisible(false)
 | 
			
		||||
        binding.icon.setVisible(false)
 | 
			
		||||
        binding.buttonClear.setVisible(false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onClick(clicked: View) =
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.InputSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.ModifierInputSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class InputViewHolder(val binding: ListItemSettingInputBinding, adapter: SettingsAdapter) :
 | 
			
		||||
    SettingViewHolder(binding.root, adapter) {
 | 
			
		||||
@@ -22,38 +23,26 @@ class InputViewHolder(val binding: ListItemSettingInputBinding, adapter: Setting
 | 
			
		||||
        binding.textSettingName.text = setting.title
 | 
			
		||||
        binding.textSettingValue.text = setting.getSelectedValue()
 | 
			
		||||
 | 
			
		||||
        binding.buttonOptions.visibility = when (item) {
 | 
			
		||||
        when (item) {
 | 
			
		||||
            is AnalogInputSetting -> {
 | 
			
		||||
                val param = NativeInput.getStickParam(item.playerIndex, item.nativeAnalog)
 | 
			
		||||
                if (
 | 
			
		||||
                binding.buttonOptions.setVisible(
 | 
			
		||||
                    param.get("engine", "") == "analog_from_button" ||
 | 
			
		||||
                        param.has("axis_x") || param.has("axis_y")
 | 
			
		||||
                ) {
 | 
			
		||||
                    View.VISIBLE
 | 
			
		||||
                } else {
 | 
			
		||||
                    View.GONE
 | 
			
		||||
                }
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            is ButtonInputSetting -> {
 | 
			
		||||
                val param = NativeInput.getButtonParam(item.playerIndex, item.nativeButton)
 | 
			
		||||
                if (
 | 
			
		||||
                binding.buttonOptions.setVisible(
 | 
			
		||||
                    param.has("code") || param.has("button") || param.has("hat") ||
 | 
			
		||||
                        param.has("axis")
 | 
			
		||||
                ) {
 | 
			
		||||
                    View.VISIBLE
 | 
			
		||||
                } else {
 | 
			
		||||
                    View.GONE
 | 
			
		||||
                }
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            is ModifierInputSetting -> {
 | 
			
		||||
                val params = NativeInput.getStickParam(item.playerIndex, item.nativeAnalog)
 | 
			
		||||
                if (params.has("modifier")) {
 | 
			
		||||
                    View.VISIBLE
 | 
			
		||||
                } else {
 | 
			
		||||
                    View.GONE
 | 
			
		||||
                }
 | 
			
		||||
                binding.buttonOptions.setVisible(params.has("modifier"))
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.RunnableSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
 | 
			
		||||
    SettingViewHolder(binding.root, adapter) {
 | 
			
		||||
@@ -16,8 +17,8 @@ class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
 | 
			
		||||
 | 
			
		||||
    override fun bind(item: SettingsItem) {
 | 
			
		||||
        setting = item as RunnableSetting
 | 
			
		||||
        binding.icon.setVisible(setting.iconId != 0)
 | 
			
		||||
        if (setting.iconId != 0) {
 | 
			
		||||
            binding.icon.visibility = View.VISIBLE
 | 
			
		||||
            binding.icon.setImageDrawable(
 | 
			
		||||
                ResourcesCompat.getDrawable(
 | 
			
		||||
                    binding.icon.resources,
 | 
			
		||||
@@ -25,19 +26,13 @@ class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
 | 
			
		||||
                    binding.icon.context.theme
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.icon.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.textSettingName.text = setting.title
 | 
			
		||||
        if (setting.description.isNotEmpty()) {
 | 
			
		||||
            binding.textSettingDescription.setText(item.descriptionId)
 | 
			
		||||
            binding.textSettingDescription.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.textSettingDescription.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
        binding.textSettingValue.visibility = View.GONE
 | 
			
		||||
        binding.buttonClear.visibility = View.GONE
 | 
			
		||||
        binding.textSettingDescription.setVisible(setting.description.isNotEmpty())
 | 
			
		||||
        binding.textSettingDescription.text = item.description
 | 
			
		||||
        binding.textSettingValue.setVisible(false)
 | 
			
		||||
        binding.buttonClear.setVisible(false)
 | 
			
		||||
 | 
			
		||||
        setStyle(setting.isEditable, binding)
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.NativeConfig
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
 | 
			
		||||
    SettingViewHolder(binding.root, adapter) {
 | 
			
		||||
@@ -19,14 +20,10 @@ class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: Setti
 | 
			
		||||
    override fun bind(item: SettingsItem) {
 | 
			
		||||
        setting = item
 | 
			
		||||
        binding.textSettingName.text = setting.title
 | 
			
		||||
        if (item.description.isNotEmpty()) {
 | 
			
		||||
        binding.textSettingDescription.setVisible(item.description.isNotEmpty())
 | 
			
		||||
        binding.textSettingDescription.text = item.description
 | 
			
		||||
            binding.textSettingDescription.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.textSettingDescription.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.textSettingValue.visibility = View.VISIBLE
 | 
			
		||||
        binding.textSettingValue.setVisible(true)
 | 
			
		||||
        when (item) {
 | 
			
		||||
            is SingleChoiceSetting -> {
 | 
			
		||||
                val resMgr = binding.textSettingValue.context.resources
 | 
			
		||||
@@ -48,16 +45,12 @@ class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: Setti
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (binding.textSettingValue.text.isEmpty()) {
 | 
			
		||||
            binding.textSettingValue.visibility = View.GONE
 | 
			
		||||
            binding.textSettingValue.setVisible(false)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.buttonClear.visibility = if (setting.setting.global ||
 | 
			
		||||
            !NativeConfig.isPerGameConfigLoaded()
 | 
			
		||||
        ) {
 | 
			
		||||
            View.GONE
 | 
			
		||||
        } else {
 | 
			
		||||
            View.VISIBLE
 | 
			
		||||
        }
 | 
			
		||||
        binding.buttonClear.setVisible(
 | 
			
		||||
            !setting.setting.global || NativeConfig.isPerGameConfigLoaded()
 | 
			
		||||
        )
 | 
			
		||||
        binding.buttonClear.setOnClickListener {
 | 
			
		||||
            adapter.onClearClick(setting, bindingAdapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.NativeConfig
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
 | 
			
		||||
    SettingViewHolder(binding.root, adapter) {
 | 
			
		||||
@@ -18,26 +19,18 @@ class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAda
 | 
			
		||||
    override fun bind(item: SettingsItem) {
 | 
			
		||||
        setting = item as SliderSetting
 | 
			
		||||
        binding.textSettingName.text = setting.title
 | 
			
		||||
        if (item.description.isNotEmpty()) {
 | 
			
		||||
        binding.textSettingDescription.setVisible(item.description.isNotEmpty())
 | 
			
		||||
        binding.textSettingDescription.text = setting.description
 | 
			
		||||
            binding.textSettingDescription.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.textSettingDescription.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
        binding.textSettingValue.visibility = View.VISIBLE
 | 
			
		||||
        binding.textSettingValue.setVisible(true)
 | 
			
		||||
        binding.textSettingValue.text = String.format(
 | 
			
		||||
            binding.textSettingValue.context.getString(R.string.value_with_units),
 | 
			
		||||
            setting.getSelectedValue(),
 | 
			
		||||
            setting.units
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        binding.buttonClear.visibility = if (setting.setting.global ||
 | 
			
		||||
            !NativeConfig.isPerGameConfigLoaded()
 | 
			
		||||
        ) {
 | 
			
		||||
            View.GONE
 | 
			
		||||
        } else {
 | 
			
		||||
            View.VISIBLE
 | 
			
		||||
        }
 | 
			
		||||
        binding.buttonClear.setVisible(
 | 
			
		||||
            !setting.setting.global || NativeConfig.isPerGameConfigLoaded()
 | 
			
		||||
        )
 | 
			
		||||
        binding.buttonClear.setOnClickListener {
 | 
			
		||||
            adapter.onClearClick(setting, bindingAdapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
 | 
			
		||||
    SettingViewHolder(binding.root, adapter) {
 | 
			
		||||
@@ -16,8 +17,8 @@ class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAd
 | 
			
		||||
 | 
			
		||||
    override fun bind(item: SettingsItem) {
 | 
			
		||||
        setting = item as SubmenuSetting
 | 
			
		||||
        binding.icon.setVisible(setting.iconId != 0)
 | 
			
		||||
        if (setting.iconId != 0) {
 | 
			
		||||
            binding.icon.visibility = View.VISIBLE
 | 
			
		||||
            binding.icon.setImageDrawable(
 | 
			
		||||
                ResourcesCompat.getDrawable(
 | 
			
		||||
                    binding.icon.resources,
 | 
			
		||||
@@ -25,19 +26,13 @@ class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAd
 | 
			
		||||
                    binding.icon.context.theme
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.icon.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.textSettingName.text = setting.title
 | 
			
		||||
        if (setting.description.isNotEmpty()) {
 | 
			
		||||
        binding.textSettingDescription.setVisible(setting.description.isNotEmpty())
 | 
			
		||||
        binding.textSettingDescription.text = setting.description
 | 
			
		||||
            binding.textSettingDescription.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.textSettingDescription.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
        binding.textSettingValue.visibility = View.GONE
 | 
			
		||||
        binding.buttonClear.visibility = View.GONE
 | 
			
		||||
        binding.textSettingValue.setVisible(false)
 | 
			
		||||
        binding.buttonClear.setVisible(false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onClick(clicked: View) {
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SwitchSetting
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.NativeConfig
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter: SettingsAdapter) :
 | 
			
		||||
    SettingViewHolder(binding.root, adapter) {
 | 
			
		||||
@@ -19,12 +20,8 @@ class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter
 | 
			
		||||
    override fun bind(item: SettingsItem) {
 | 
			
		||||
        setting = item as SwitchSetting
 | 
			
		||||
        binding.textSettingName.text = setting.title
 | 
			
		||||
        if (setting.description.isNotEmpty()) {
 | 
			
		||||
        binding.textSettingDescription.setVisible(setting.description.isNotEmpty())
 | 
			
		||||
        binding.textSettingDescription.text = setting.description
 | 
			
		||||
            binding.textSettingDescription.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.textSettingDescription.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.switchWidget.setOnCheckedChangeListener(null)
 | 
			
		||||
        binding.switchWidget.isChecked = setting.getIsChecked(setting.needsRuntimeGlobal)
 | 
			
		||||
@@ -32,13 +29,9 @@ class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter
 | 
			
		||||
            adapter.onBooleanClick(setting, binding.switchWidget.isChecked, bindingAdapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.buttonClear.visibility = if (setting.setting.global ||
 | 
			
		||||
            !NativeConfig.isPerGameConfigLoaded()
 | 
			
		||||
        ) {
 | 
			
		||||
            View.GONE
 | 
			
		||||
        } else {
 | 
			
		||||
            View.VISIBLE
 | 
			
		||||
        }
 | 
			
		||||
        binding.buttonClear.setVisible(
 | 
			
		||||
            !setting.setting.global || NativeConfig.isPerGameConfigLoaded()
 | 
			
		||||
        )
 | 
			
		||||
        binding.buttonClear.setOnClickListener {
 | 
			
		||||
            adapter.onClearClick(setting, bindingAdapterPosition)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,7 @@ import org.yuzu.yuzu_emu.model.EmulationViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.overlay.model.OverlayControl
 | 
			
		||||
import org.yuzu.yuzu_emu.overlay.model.OverlayLayout
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.*
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import java.lang.NullPointerException
 | 
			
		||||
 | 
			
		||||
class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
@@ -500,14 +501,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
                binding.drawerLayout.close()
 | 
			
		||||
            }
 | 
			
		||||
            if (showInputOverlay) {
 | 
			
		||||
                binding.surfaceInputOverlay.visibility = View.INVISIBLE
 | 
			
		||||
                binding.surfaceInputOverlay.setVisible(visible = false, gone = false)
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if (showInputOverlay && emulationViewModel.emulationStarted.value) {
 | 
			
		||||
                binding.surfaceInputOverlay.visibility = View.VISIBLE
 | 
			
		||||
            } else {
 | 
			
		||||
                binding.surfaceInputOverlay.visibility = View.INVISIBLE
 | 
			
		||||
            }
 | 
			
		||||
            binding.surfaceInputOverlay.setVisible(
 | 
			
		||||
                showInputOverlay && emulationViewModel.emulationStarted.value
 | 
			
		||||
            )
 | 
			
		||||
            if (!isInFoldableLayout) {
 | 
			
		||||
                if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
 | 
			
		||||
                    binding.surfaceInputOverlay.layout = OverlayLayout.Portrait
 | 
			
		||||
@@ -544,7 +543,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun updateShowFpsOverlay() {
 | 
			
		||||
        if (BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()) {
 | 
			
		||||
        val showOverlay = BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()
 | 
			
		||||
        binding.showFpsText.setVisible(showOverlay)
 | 
			
		||||
        if (showOverlay) {
 | 
			
		||||
            val SYSTEM_FPS = 0
 | 
			
		||||
            val FPS = 1
 | 
			
		||||
            val FRAMETIME = 2
 | 
			
		||||
@@ -564,17 +565,17 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            perfStatsUpdateHandler.post(perfStatsUpdater!!)
 | 
			
		||||
            binding.showFpsText.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            if (perfStatsUpdater != null) {
 | 
			
		||||
                perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!)
 | 
			
		||||
            }
 | 
			
		||||
            binding.showFpsText.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun updateThermalOverlay() {
 | 
			
		||||
        if (BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean()) {
 | 
			
		||||
        val showOverlay = BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean()
 | 
			
		||||
        binding.showThermalsText.setVisible(showOverlay)
 | 
			
		||||
        if (showOverlay) {
 | 
			
		||||
            thermalStatsUpdater = {
 | 
			
		||||
                if (emulationViewModel.emulationStarted.value &&
 | 
			
		||||
                    !emulationViewModel.isEmulationStopping.value
 | 
			
		||||
@@ -596,12 +597,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            thermalStatsUpdateHandler.post(thermalStatsUpdater!!)
 | 
			
		||||
            binding.showThermalsText.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            if (thermalStatsUpdater != null) {
 | 
			
		||||
                thermalStatsUpdateHandler.removeCallbacks(thermalStatsUpdater!!)
 | 
			
		||||
            }
 | 
			
		||||
            binding.showThermalsText.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -870,12 +869,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
                    }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        binding.doneControlConfig.visibility = View.VISIBLE
 | 
			
		||||
        binding.doneControlConfig.setVisible(false)
 | 
			
		||||
        binding.surfaceInputOverlay.setIsInEditMode(true)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun stopConfiguringControls() {
 | 
			
		||||
        binding.doneControlConfig.visibility = View.GONE
 | 
			
		||||
        binding.doneControlConfig.setVisible(false)
 | 
			
		||||
        binding.surfaceInputOverlay.setIsInEditMode(false)
 | 
			
		||||
        // Unlock the orientation if it was locked for editing
 | 
			
		||||
        if (IntSetting.RENDERER_SCREEN_LAYOUT.getInt() == EmulationOrientation.Unspecified.int) {
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.model.GameVerificationResult
 | 
			
		||||
import org.yuzu.yuzu_emu.model.HomeViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.GameMetadata
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
 | 
			
		||||
 | 
			
		||||
class GameInfoFragment : Fragment() {
 | 
			
		||||
@@ -85,7 +86,7 @@ class GameInfoFragment : Fragment() {
 | 
			
		||||
                    copyToClipboard(getString(R.string.developer), args.game.developer)
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                developer.visibility = View.GONE
 | 
			
		||||
                developer.setVisible(false)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            version.setHint(R.string.version)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ import android.annotation.SuppressLint
 | 
			
		||||
import android.content.pm.ShortcutInfo
 | 
			
		||||
import android.content.pm.ShortcutManager
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.text.TextUtils
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
@@ -46,6 +45,7 @@ import org.yuzu.yuzu_emu.utils.FileUtil
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.GameIconUtils
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.MemoryUtil
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.marquee
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
 | 
			
		||||
import java.io.BufferedOutputStream
 | 
			
		||||
import java.io.File
 | 
			
		||||
@@ -107,13 +107,7 @@ class GamePropertiesFragment : Fragment() {
 | 
			
		||||
 | 
			
		||||
        GameIconUtils.loadGameIcon(args.game, binding.imageGameScreen)
 | 
			
		||||
        binding.title.text = args.game.title
 | 
			
		||||
        binding.title.postDelayed(
 | 
			
		||||
            {
 | 
			
		||||
                binding.title.ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
                binding.title.isSelected = true
 | 
			
		||||
            },
 | 
			
		||||
            3000
 | 
			
		||||
        )
 | 
			
		||||
        binding.title.marquee()
 | 
			
		||||
 | 
			
		||||
        binding.buttonStart.setOnClickListener {
 | 
			
		||||
            LaunchGameDialogFragment.newInstance(args.game)
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@ import kotlinx.coroutines.launch
 | 
			
		||||
import org.yuzu.yuzu_emu.R
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.model.TaskViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class ProgressDialogFragment : DialogFragment() {
 | 
			
		||||
    private val taskViewModel: TaskViewModel by activityViewModels()
 | 
			
		||||
@@ -120,10 +121,8 @@ class ProgressDialogFragment : DialogFragment() {
 | 
			
		||||
            launch {
 | 
			
		||||
                repeatOnLifecycle(Lifecycle.State.CREATED) {
 | 
			
		||||
                    taskViewModel.message.collect {
 | 
			
		||||
                        if (it.isEmpty()) {
 | 
			
		||||
                            binding.message.visibility = View.GONE
 | 
			
		||||
                        } else {
 | 
			
		||||
                            binding.message.visibility = View.VISIBLE
 | 
			
		||||
                        binding.message.setVisible(it.isNotEmpty())
 | 
			
		||||
                        if (it.isNotEmpty()) {
 | 
			
		||||
                            binding.message.text = it
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,7 @@ import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager
 | 
			
		||||
import org.yuzu.yuzu_emu.model.Game
 | 
			
		||||
import org.yuzu.yuzu_emu.model.GamesViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.model.HomeViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class SearchFragment : Fragment() {
 | 
			
		||||
    private var _binding: FragmentSearchBinding? = null
 | 
			
		||||
@@ -81,11 +82,7 @@ class SearchFragment : Fragment() {
 | 
			
		||||
        binding.chipGroup.setOnCheckedStateChangeListener { _, _ -> filterAndSearch() }
 | 
			
		||||
 | 
			
		||||
        binding.searchText.doOnTextChanged { text: CharSequence?, _: Int, _: Int, _: Int ->
 | 
			
		||||
            if (text.toString().isNotEmpty()) {
 | 
			
		||||
                binding.clearButton.visibility = View.VISIBLE
 | 
			
		||||
            } else {
 | 
			
		||||
                binding.clearButton.visibility = View.INVISIBLE
 | 
			
		||||
            }
 | 
			
		||||
            binding.clearButton.setVisible(text.toString().isNotEmpty())
 | 
			
		||||
            filterAndSearch()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -109,11 +106,7 @@ class SearchFragment : Fragment() {
 | 
			
		||||
                repeatOnLifecycle(Lifecycle.State.CREATED) {
 | 
			
		||||
                    gamesViewModel.searchedGames.collect {
 | 
			
		||||
                        (binding.gridGamesSearch.adapter as GameAdapter).submitList(it)
 | 
			
		||||
                        if (it.isEmpty()) {
 | 
			
		||||
                            binding.noResultsView.visibility = View.VISIBLE
 | 
			
		||||
                        } else {
 | 
			
		||||
                            binding.noResultsView.visibility = View.GONE
 | 
			
		||||
                        }
 | 
			
		||||
                        binding.noResultsView.setVisible(it.isEmpty())
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,7 @@ import org.yuzu.yuzu_emu.ui.main.MainActivity
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.NativeConfig
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
 | 
			
		||||
class SetupFragment : Fragment() {
 | 
			
		||||
    private var _binding: FragmentSetupBinding? = null
 | 
			
		||||
@@ -292,12 +293,8 @@ class SetupFragment : Fragment() {
 | 
			
		||||
            val backIsVisible = savedInstanceState.getBoolean(KEY_BACK_VISIBILITY)
 | 
			
		||||
            hasBeenWarned = savedInstanceState.getBooleanArray(KEY_HAS_BEEN_WARNED)!!
 | 
			
		||||
 | 
			
		||||
            if (nextIsVisible) {
 | 
			
		||||
                binding.buttonNext.visibility = View.VISIBLE
 | 
			
		||||
            }
 | 
			
		||||
            if (backIsVisible) {
 | 
			
		||||
                binding.buttonBack.visibility = View.VISIBLE
 | 
			
		||||
            }
 | 
			
		||||
            binding.buttonNext.setVisible(nextIsVisible)
 | 
			
		||||
            binding.buttonBack.setVisible(backIsVisible)
 | 
			
		||||
        } else {
 | 
			
		||||
            hasBeenWarned = BooleanArray(pages.size)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentGamesBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager
 | 
			
		||||
import org.yuzu.yuzu_emu.model.GamesViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.model.HomeViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
 | 
			
		||||
 | 
			
		||||
class GamesFragment : Fragment() {
 | 
			
		||||
@@ -93,11 +94,10 @@ class GamesFragment : Fragment() {
 | 
			
		||||
                repeatOnLifecycle(Lifecycle.State.RESUMED) {
 | 
			
		||||
                    gamesViewModel.isReloading.collect {
 | 
			
		||||
                        binding.swipeRefresh.isRefreshing = it
 | 
			
		||||
                        if (gamesViewModel.games.value.isEmpty() && !it) {
 | 
			
		||||
                            binding.noticeText.visibility = View.VISIBLE
 | 
			
		||||
                        } else {
 | 
			
		||||
                            binding.noticeText.visibility = View.INVISIBLE
 | 
			
		||||
                        }
 | 
			
		||||
                        binding.noticeText.setVisible(
 | 
			
		||||
                            visible = gamesViewModel.games.value.isEmpty() && !it,
 | 
			
		||||
                            gone = false
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -47,6 +47,7 @@ import org.yuzu.yuzu_emu.model.InstallResult
 | 
			
		||||
import org.yuzu.yuzu_emu.model.TaskState
 | 
			
		||||
import org.yuzu.yuzu_emu.model.TaskViewModel
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.*
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
 | 
			
		||||
import java.io.BufferedInputStream
 | 
			
		||||
import java.io.BufferedOutputStream
 | 
			
		||||
import java.util.zip.ZipEntry
 | 
			
		||||
@@ -139,8 +140,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
 | 
			
		||||
        // Prevents navigation from being drawn for a short time on recreation if set to hidden
 | 
			
		||||
        if (!homeViewModel.navigationVisible.value.first) {
 | 
			
		||||
            binding.navigationView.visibility = View.INVISIBLE
 | 
			
		||||
            binding.statusBarShade.visibility = View.INVISIBLE
 | 
			
		||||
            binding.navigationView.setVisible(visible = false, gone = false)
 | 
			
		||||
            binding.statusBarShade.setVisible(visible = false, gone = false)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        lifecycleScope.apply {
 | 
			
		||||
@@ -214,18 +215,14 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
 | 
			
		||||
    private fun showNavigation(visible: Boolean, animated: Boolean) {
 | 
			
		||||
        if (!animated) {
 | 
			
		||||
            if (visible) {
 | 
			
		||||
                binding.navigationView.visibility = View.VISIBLE
 | 
			
		||||
            } else {
 | 
			
		||||
                binding.navigationView.visibility = View.INVISIBLE
 | 
			
		||||
            }
 | 
			
		||||
            binding.navigationView.setVisible(visible)
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val smallLayout = resources.getBoolean(R.bool.small_layout)
 | 
			
		||||
        binding.navigationView.animate().apply {
 | 
			
		||||
            if (visible) {
 | 
			
		||||
                binding.navigationView.visibility = View.VISIBLE
 | 
			
		||||
                binding.navigationView.setVisible(true)
 | 
			
		||||
                duration = 300
 | 
			
		||||
                interpolator = PathInterpolator(0.05f, 0.7f, 0.1f, 1f)
 | 
			
		||||
 | 
			
		||||
@@ -264,7 +261,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
            }
 | 
			
		||||
        }.withEndAction {
 | 
			
		||||
            if (!visible) {
 | 
			
		||||
                binding.navigationView.visibility = View.INVISIBLE
 | 
			
		||||
                binding.navigationView.setVisible(visible = false, gone = false)
 | 
			
		||||
            }
 | 
			
		||||
        }.start()
 | 
			
		||||
    }
 | 
			
		||||
@@ -272,7 +269,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
    private fun showStatusBarShade(visible: Boolean) {
 | 
			
		||||
        binding.statusBarShade.animate().apply {
 | 
			
		||||
            if (visible) {
 | 
			
		||||
                binding.statusBarShade.visibility = View.VISIBLE
 | 
			
		||||
                binding.statusBarShade.setVisible(true)
 | 
			
		||||
                binding.statusBarShade.translationY = binding.statusBarShade.height.toFloat() * -2
 | 
			
		||||
                duration = 300
 | 
			
		||||
                translationY(0f)
 | 
			
		||||
@@ -284,7 +281,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
            }
 | 
			
		||||
        }.withEndAction {
 | 
			
		||||
            if (!visible) {
 | 
			
		||||
                binding.statusBarShade.visibility = View.INVISIBLE
 | 
			
		||||
                binding.statusBarShade.setVisible(visible = false, gone = false)
 | 
			
		||||
            }
 | 
			
		||||
        }.start()
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,10 @@
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.utils
 | 
			
		||||
 | 
			
		||||
import android.text.TextUtils
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
 | 
			
		||||
object ViewUtils {
 | 
			
		||||
    fun showView(view: View, length: Long = 300) {
 | 
			
		||||
@@ -57,4 +59,35 @@ object ViewUtils {
 | 
			
		||||
        }
 | 
			
		||||
        this.layoutParams = layoutParams
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Shows or hides a view.
 | 
			
		||||
     * @param visible Whether a view will be made View.VISIBLE or View.INVISIBLE/GONE.
 | 
			
		||||
     * @param gone Optional parameter for hiding a view. Uses View.GONE if true and View.INVISIBLE otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    fun View.setVisible(visible: Boolean, gone: Boolean = true) {
 | 
			
		||||
        visibility = if (visible) {
 | 
			
		||||
            View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            if (gone) {
 | 
			
		||||
                View.GONE
 | 
			
		||||
            } else {
 | 
			
		||||
                View.INVISIBLE
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Starts a marquee on some text.
 | 
			
		||||
     * @param delay Optional parameter for changing the start delay. 3 seconds of delay by default.
 | 
			
		||||
     */
 | 
			
		||||
    fun TextView.marquee(delay: Long = 3000) {
 | 
			
		||||
        ellipsize = null
 | 
			
		||||
        marqueeRepeatLimit = -1
 | 
			
		||||
        isSingleLine = true
 | 
			
		||||
        postDelayed({
 | 
			
		||||
            ellipsize = TextUtils.TruncateAt.MARQUEE
 | 
			
		||||
            isSelected = true
 | 
			
		||||
        }, delay)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -39,10 +39,7 @@
 | 
			
		||||
                style="@style/TextAppearance.Material3.TitleMedium"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:ellipsize="none"
 | 
			
		||||
                android:marqueeRepeatLimit="marquee_forever"
 | 
			
		||||
                android:requiresFadingEdge="horizontal"
 | 
			
		||||
                android:singleLine="true"
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                tools:text="@string/select_gpu_driver_default" />
 | 
			
		||||
 | 
			
		||||
@@ -52,10 +49,7 @@
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="6dp"
 | 
			
		||||
                android:ellipsize="none"
 | 
			
		||||
                android:marqueeRepeatLimit="marquee_forever"
 | 
			
		||||
                android:requiresFadingEdge="horizontal"
 | 
			
		||||
                android:singleLine="true"
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                tools:text="@string/install_gpu_driver_description" />
 | 
			
		||||
 | 
			
		||||
@@ -65,10 +59,7 @@
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="6dp"
 | 
			
		||||
                android:ellipsize="none"
 | 
			
		||||
                android:marqueeRepeatLimit="marquee_forever"
 | 
			
		||||
                android:requiresFadingEdge="horizontal"
 | 
			
		||||
                android:singleLine="true"
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                tools:text="@string/install_gpu_driver_description" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,10 +21,7 @@
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_gravity="center_vertical|start"
 | 
			
		||||
            android:ellipsize="none"
 | 
			
		||||
            android:marqueeRepeatLimit="marquee_forever"
 | 
			
		||||
            android:requiresFadingEdge="horizontal"
 | 
			
		||||
            android:singleLine="true"
 | 
			
		||||
            android:textAlignment="viewStart"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@+id/button_layout"
 | 
			
		||||
 
 | 
			
		||||
@@ -40,10 +40,7 @@
 | 
			
		||||
                android:layout_width="0dp"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:ellipsize="none"
 | 
			
		||||
                android:marqueeRepeatLimit="marquee_forever"
 | 
			
		||||
                android:requiresFadingEdge="horizontal"
 | 
			
		||||
                android:singleLine="true"
 | 
			
		||||
                android:textAlignment="center"
 | 
			
		||||
                android:textSize="14sp"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="@+id/image_game_screen"
 | 
			
		||||
 
 | 
			
		||||
@@ -59,9 +59,6 @@
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                android:textSize="14sp"
 | 
			
		||||
                android:textStyle="bold"
 | 
			
		||||
                android:singleLine="true"
 | 
			
		||||
                android:marqueeRepeatLimit="marquee_forever"
 | 
			
		||||
                android:ellipsize="none"
 | 
			
		||||
                android:requiresFadingEdge="horizontal"
 | 
			
		||||
                android:layout_marginTop="6dp"
 | 
			
		||||
                android:visibility="gone"
 | 
			
		||||
 
 | 
			
		||||
@@ -76,10 +76,7 @@
 | 
			
		||||
                android:layout_marginTop="12dp"
 | 
			
		||||
                android:layout_marginBottom="12dp"
 | 
			
		||||
                android:layout_marginHorizontal="16dp"
 | 
			
		||||
                android:ellipsize="none"
 | 
			
		||||
                android:marqueeRepeatLimit="marquee_forever"
 | 
			
		||||
                android:requiresFadingEdge="horizontal"
 | 
			
		||||
                android:singleLine="true"
 | 
			
		||||
                android:textAlignment="center"
 | 
			
		||||
                tools:text="deko_basic" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user