summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt27
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt36
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt26
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt43
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt33
-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/HeaderViewHolder.kt14
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SettingViewHolder.kt8
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt26
-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.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt38
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt56
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt27
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.kt47
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholders/GameViewHolder.kt27
16 files changed, 189 insertions, 284 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
index 44d002016..b222344c3 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
@@ -8,11 +8,9 @@ import android.content.DialogInterface
8import android.content.Intent 8import android.content.Intent
9import android.graphics.Rect 9import android.graphics.Rect
10import android.os.Bundle 10import android.os.Bundle
11import android.view.LayoutInflater
12import android.view.MotionEvent 11import android.view.MotionEvent
13import android.view.View 12import android.view.View
14import android.view.WindowManager 13import android.view.WindowManager
15import android.widget.TextView
16import androidx.activity.OnBackPressedCallback 14import androidx.activity.OnBackPressedCallback
17import androidx.annotation.IntDef 15import androidx.annotation.IntDef
18import androidx.appcompat.app.AppCompatActivity 16import androidx.appcompat.app.AppCompatActivity
@@ -21,10 +19,10 @@ import androidx.fragment.app.FragmentActivity
21import androidx.fragment.app.FragmentManager 19import androidx.fragment.app.FragmentManager
22import androidx.preference.PreferenceManager 20import androidx.preference.PreferenceManager
23import com.google.android.material.dialog.MaterialAlertDialogBuilder 21import com.google.android.material.dialog.MaterialAlertDialogBuilder
24import com.google.android.material.slider.Slider
25import com.google.android.material.slider.Slider.OnChangeListener 22import com.google.android.material.slider.Slider.OnChangeListener
26import org.yuzu.yuzu_emu.NativeLibrary 23import org.yuzu.yuzu_emu.NativeLibrary
27import org.yuzu.yuzu_emu.R 24import org.yuzu.yuzu_emu.R
25import org.yuzu.yuzu_emu.databinding.DialogSliderBinding
28import org.yuzu.yuzu_emu.features.settings.model.Settings 26import org.yuzu.yuzu_emu.features.settings.model.Settings
29import org.yuzu.yuzu_emu.fragments.EmulationFragment 27import org.yuzu.yuzu_emu.fragments.EmulationFragment
30import org.yuzu.yuzu_emu.fragments.MenuFragment 28import org.yuzu.yuzu_emu.fragments.MenuFragment
@@ -139,27 +137,22 @@ open class EmulationActivity : AppCompatActivity() {
139 } 137 }
140 138
141 private fun adjustScale() { 139 private fun adjustScale() {
142 val inflater = LayoutInflater.from(this) 140 val sliderBinding = DialogSliderBinding.inflate(layoutInflater)
143 val view = inflater.inflate(R.layout.dialog_slider, null) 141 sliderBinding.slider.valueTo = 150F
144 val slider = view.findViewById<Slider>(R.id.slider) 142 sliderBinding.slider.value = PreferenceManager.getDefaultSharedPreferences(applicationContext)
145 val textValue = view.findViewById<TextView>(R.id.text_value)
146 val units = view.findViewById<TextView>(R.id.text_units)
147
148 slider.valueTo = 150F
149 slider.value = PreferenceManager.getDefaultSharedPreferences(applicationContext)
150 .getInt(Settings.PREF_CONTROL_SCALE, 50).toFloat() 143 .getInt(Settings.PREF_CONTROL_SCALE, 50).toFloat()
151 slider.addOnChangeListener(OnChangeListener { _, value, _ -> 144 sliderBinding.slider.addOnChangeListener(OnChangeListener { _, value, _ ->
152 textValue.text = value.toString() 145 sliderBinding.textValue.text = value.toString()
153 setControlScale(value.toInt()) 146 setControlScale(value.toInt())
154 }) 147 })
155 textValue.text = slider.value.toString() 148 sliderBinding.textValue.text = sliderBinding.slider.value.toString()
156 units.text = "%" 149 sliderBinding.textUnits.text = "%"
157 MaterialAlertDialogBuilder(this) 150 MaterialAlertDialogBuilder(this)
158 .setTitle(R.string.emulation_control_scale) 151 .setTitle(R.string.emulation_control_scale)
159 .setView(view) 152 .setView(sliderBinding.root)
160 .setNegativeButton(android.R.string.cancel, null) 153 .setNegativeButton(android.R.string.cancel, null)
161 .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int -> 154 .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->
162 setControlScale(slider.value.toInt()) 155 setControlScale(sliderBinding.slider.value.toInt())
163 } 156 }
164 .setNeutralButton(R.string.slider_default) { _: DialogInterface?, _: Int -> 157 .setNeutralButton(R.string.slider_default) { _: DialogInterface?, _: Int ->
165 setControlScale(50) 158 setControlScale(50)
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 8891705a5..4114f3fdc 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
@@ -24,6 +24,8 @@ import kotlinx.coroutines.withContext
24import org.yuzu.yuzu_emu.NativeLibrary 24import org.yuzu.yuzu_emu.NativeLibrary
25import org.yuzu.yuzu_emu.R 25import org.yuzu.yuzu_emu.R
26import org.yuzu.yuzu_emu.activities.EmulationActivity.Companion.launch 26import org.yuzu.yuzu_emu.activities.EmulationActivity.Companion.launch
27import org.yuzu.yuzu_emu.databinding.CardGameBinding
28import org.yuzu.yuzu_emu.model.Game
27import org.yuzu.yuzu_emu.model.GameDatabase 29import org.yuzu.yuzu_emu.model.GameDatabase
28import org.yuzu.yuzu_emu.utils.Log 30import org.yuzu.yuzu_emu.utils.Log
29import org.yuzu.yuzu_emu.viewholders.GameViewHolder 31import org.yuzu.yuzu_emu.viewholders.GameViewHolder
@@ -51,25 +53,24 @@ class GameAdapter(private val activity: AppCompatActivity) : RecyclerView.Adapte
51 53
52 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder { 54 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GameViewHolder {
53 // Create a new view. 55 // Create a new view.
54 val gameCard = LayoutInflater.from(parent.context) 56 val binding = CardGameBinding.inflate(LayoutInflater.from(parent.context))
55 .inflate(R.layout.card_game, parent, false) 57 binding.root.setOnClickListener(this)
56 gameCard.setOnClickListener(this)
57 58
58 // Use that view to create a ViewHolder. 59 // Use that view to create a ViewHolder.
59 return GameViewHolder(gameCard) 60 return GameViewHolder(binding)
60 } 61 }
61 62
62 override fun onBindViewHolder(holder: GameViewHolder, position: Int) { 63 override fun onBindViewHolder(holder: GameViewHolder, position: Int) {
63 if (isDatasetValid) { 64 if (isDatasetValid) {
64 if (cursor!!.moveToPosition(position)) { 65 if (cursor!!.moveToPosition(position)) {
65 holder.imageIcon.scaleType = ImageView.ScaleType.CENTER_CROP 66 holder.binding.imageGameScreen.scaleType = ImageView.ScaleType.CENTER_CROP
66 activity.lifecycleScope.launch { 67 activity.lifecycleScope.launch {
67 withContext(Dispatchers.IO) { 68 withContext(Dispatchers.IO) {
68 val uri = 69 val uri =
69 Uri.parse(cursor!!.getString(GameDatabase.GAME_COLUMN_PATH)).toString() 70 Uri.parse(cursor!!.getString(GameDatabase.GAME_COLUMN_PATH)).toString()
70 val bitmap = decodeGameIcon(uri) 71 val bitmap = decodeGameIcon(uri)
71 withContext(Dispatchers.Main) { 72 withContext(Dispatchers.Main) {
72 holder.imageIcon.load(bitmap) { 73 holder.binding.imageGameScreen.load(bitmap) {
73 error(R.drawable.no_icon) 74 error(R.drawable.no_icon)
74 crossfade(true) 75 crossfade(true)
75 } 76 }
@@ -77,20 +78,23 @@ class GameAdapter(private val activity: AppCompatActivity) : RecyclerView.Adapte
77 } 78 }
78 } 79 }
79 80
80 holder.textGameTitle.text = 81 holder.binding.textGameTitle.text =
81 cursor!!.getString(GameDatabase.GAME_COLUMN_TITLE) 82 cursor!!.getString(GameDatabase.GAME_COLUMN_TITLE)
82 .replace("[\\t\\n\\r]+".toRegex(), " ") 83 .replace("[\\t\\n\\r]+".toRegex(), " ")
83 holder.textGameCaption.text = cursor!!.getString(GameDatabase.GAME_COLUMN_CAPTION) 84 holder.binding.textGameCaption.text = cursor!!.getString(GameDatabase.GAME_COLUMN_CAPTION)
84 85
85 // TODO These shouldn't be necessary once the move to a DB-based model is complete. 86 // TODO These shouldn't be necessary once the move to a DB-based model is complete.
86 holder.gameId = cursor!!.getString(GameDatabase.GAME_COLUMN_GAME_ID) 87 val game = Game(
87 holder.path = cursor!!.getString(GameDatabase.GAME_COLUMN_PATH) 88 cursor!!.getString(GameDatabase.GAME_COLUMN_TITLE),
88 holder.title = cursor!!.getString(GameDatabase.GAME_COLUMN_TITLE) 89 cursor!!.getString(GameDatabase.GAME_COLUMN_DESCRIPTION),
89 holder.description = cursor!!.getString(GameDatabase.GAME_COLUMN_DESCRIPTION) 90 cursor!!.getString(GameDatabase.GAME_COLUMN_REGIONS),
90 holder.regions = cursor!!.getString(GameDatabase.GAME_COLUMN_REGIONS) 91 cursor!!.getString(GameDatabase.GAME_COLUMN_PATH),
91 holder.company = cursor!!.getString(GameDatabase.GAME_COLUMN_CAPTION) 92 cursor!!.getString(GameDatabase.GAME_COLUMN_GAME_ID),
93 cursor!!.getString(GameDatabase.GAME_COLUMN_CAPTION)
94 )
95 holder.game = game
92 val backgroundColorId = 96 val backgroundColorId =
93 if (isValidGame(holder.path!!)) R.attr.colorSurface else R.attr.colorErrorContainer 97 if (isValidGame(holder.game.path)) R.attr.colorSurface else R.attr.colorErrorContainer
94 val itemView = holder.itemView 98 val itemView = holder.itemView
95 itemView.setBackgroundColor( 99 itemView.setBackgroundColor(
96 MaterialColors.getColor( 100 MaterialColors.getColor(
@@ -177,7 +181,7 @@ class GameAdapter(private val activity: AppCompatActivity) : RecyclerView.Adapte
177 */ 181 */
178 override fun onClick(view: View) { 182 override fun onClick(view: View) {
179 val holder = view.tag as GameViewHolder 183 val holder = view.tag as GameViewHolder
180 launch((view.context as FragmentActivity), holder.path, holder.title) 184 launch((view.context as FragmentActivity), holder.game.path, holder.game.title)
181 } 185 }
182 186
183 private fun isValidGame(path: String): Boolean { 187 private fun isValidGame(path: String): Boolean {
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt
index 1fa7b2e0b..fca2f2155 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt
@@ -9,7 +9,6 @@ import android.content.IntentFilter
9import android.os.Bundle 9import android.os.Bundle
10import android.view.Menu 10import android.view.Menu
11import android.view.View 11import android.view.View
12import android.widget.FrameLayout
13import android.widget.Toast 12import android.widget.Toast
14import androidx.appcompat.app.AlertDialog 13import androidx.appcompat.app.AlertDialog
15import androidx.appcompat.app.AppCompatActivity 14import androidx.appcompat.app.AppCompatActivity
@@ -18,11 +17,11 @@ import androidx.core.view.WindowCompat
18import androidx.core.view.WindowInsetsCompat 17import androidx.core.view.WindowInsetsCompat
19import androidx.core.view.updatePadding 18import androidx.core.view.updatePadding
20import androidx.localbroadcastmanager.content.LocalBroadcastManager 19import androidx.localbroadcastmanager.content.LocalBroadcastManager
21import com.google.android.material.appbar.AppBarLayout
22import com.google.android.material.dialog.MaterialAlertDialogBuilder 20import com.google.android.material.dialog.MaterialAlertDialogBuilder
23import com.google.android.material.progressindicator.LinearProgressIndicator
24import org.yuzu.yuzu_emu.NativeLibrary 21import org.yuzu.yuzu_emu.NativeLibrary
25import org.yuzu.yuzu_emu.R 22import org.yuzu.yuzu_emu.R
23import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding
24import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
26import org.yuzu.yuzu_emu.features.settings.model.Settings 25import org.yuzu.yuzu_emu.features.settings.model.Settings
27import org.yuzu.yuzu_emu.features.settings.ui.SettingsFragment.Companion.newInstance 26import org.yuzu.yuzu_emu.features.settings.ui.SettingsFragment.Companion.newInstance
28import org.yuzu.yuzu_emu.utils.* 27import org.yuzu.yuzu_emu.utils.*
@@ -31,11 +30,15 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
31 private val presenter = SettingsActivityPresenter(this) 30 private val presenter = SettingsActivityPresenter(this)
32 private var dialog: AlertDialog? = null 31 private var dialog: AlertDialog? = null
33 32
33 private lateinit var binding: ActivitySettingsBinding
34
34 override fun onCreate(savedInstanceState: Bundle?) { 35 override fun onCreate(savedInstanceState: Bundle?) {
35 ThemeHelper.setTheme(this) 36 ThemeHelper.setTheme(this)
36 37
37 super.onCreate(savedInstanceState) 38 super.onCreate(savedInstanceState)
38 setContentView(R.layout.activity_settings) 39
40 binding = ActivitySettingsBinding.inflate(layoutInflater)
41 setContentView(binding.root)
39 42
40 WindowCompat.setDecorFitsSystemWindows(window, false) 43 WindowCompat.setDecorFitsSystemWindows(window, false)
41 44
@@ -45,7 +48,7 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
45 presenter.onCreate(savedInstanceState, menuTag!!, gameID!!) 48 presenter.onCreate(savedInstanceState, menuTag!!, gameID!!)
46 49
47 // Show "Back" button in the action bar for navigation 50 // Show "Back" button in the action bar for navigation
48 setSupportActionBar(findViewById(R.id.toolbar_settings)) 51 setSupportActionBar(binding.toolbarSettings)
49 supportActionBar!!.setDisplayHomeAsUpEnabled(true) 52 supportActionBar!!.setDisplayHomeAsUpEnabled(true)
50 53
51 setInsets() 54 setInsets()
@@ -138,13 +141,12 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
138 141
139 override fun showLoading() { 142 override fun showLoading() {
140 if (dialog == null) { 143 if (dialog == null) {
141 val root = layoutInflater.inflate(R.layout.dialog_progress_bar, null) 144 val loadingBinding = DialogProgressBarBinding.inflate(layoutInflater)
142 val progressBar = root.findViewById<LinearProgressIndicator>(R.id.progress_bar) 145 loadingBinding.progressBar.isIndeterminate = true
143 progressBar.isIndeterminate = true
144 146
145 dialog = MaterialAlertDialogBuilder(this) 147 dialog = MaterialAlertDialogBuilder(this)
146 .setTitle(R.string.load_settings) 148 .setTitle(R.string.load_settings)
147 .setView(root) 149 .setView(loadingBinding.root)
148 .setCancelable(false) 150 .setCancelable(false)
149 .create() 151 .create()
150 } 152 }
@@ -195,12 +197,10 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
195 get() = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG) as SettingsFragment? 197 get() = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG) as SettingsFragment?
196 198
197 private fun setInsets() { 199 private fun setInsets() {
198 val appBar = findViewById<AppBarLayout>(R.id.appbar_settings) 200 ViewCompat.setOnApplyWindowInsetsListener(binding.frameContent) { view: View, windowInsets: WindowInsetsCompat ->
199 val frame = findViewById<FrameLayout>(R.id.frame_content)
200 ViewCompat.setOnApplyWindowInsetsListener(frame) { view: View, windowInsets: WindowInsetsCompat ->
201 val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) 201 val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
202 view.updatePadding(left = insets.left, right = insets.right) 202 view.updatePadding(left = insets.left, right = insets.right)
203 InsetsHelper.insetAppBar(insets, appBar) 203 InsetsHelper.insetAppBar(insets, binding.appbarSettings)
204 windowInsets 204 windowInsets
205 } 205 }
206 } 206 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt
index 1b8a0a5ea..1f81f6e62 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt
@@ -9,7 +9,6 @@ import android.icu.util.Calendar
9import android.icu.util.TimeZone 9import android.icu.util.TimeZone
10import android.text.format.DateFormat 10import android.text.format.DateFormat
11import android.view.LayoutInflater 11import android.view.LayoutInflater
12import android.view.View
13import android.view.ViewGroup 12import android.view.ViewGroup
14import android.widget.TextView 13import android.widget.TextView
15import androidx.appcompat.app.AlertDialog 14import androidx.appcompat.app.AlertDialog
@@ -20,6 +19,10 @@ import com.google.android.material.slider.Slider
20import com.google.android.material.timepicker.MaterialTimePicker 19import com.google.android.material.timepicker.MaterialTimePicker
21import com.google.android.material.timepicker.TimeFormat 20import com.google.android.material.timepicker.TimeFormat
22import org.yuzu.yuzu_emu.R 21import org.yuzu.yuzu_emu.R
22import org.yuzu.yuzu_emu.databinding.DialogSliderBinding
23import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
24import org.yuzu.yuzu_emu.databinding.ListItemSettingSwitchBinding
25import org.yuzu.yuzu_emu.databinding.ListItemSettingsHeaderBinding
23import org.yuzu.yuzu_emu.features.settings.model.FloatSetting 26import org.yuzu.yuzu_emu.features.settings.model.FloatSetting
24import org.yuzu.yuzu_emu.features.settings.model.view.* 27import org.yuzu.yuzu_emu.features.settings.model.view.*
25import org.yuzu.yuzu_emu.features.settings.ui.viewholder.* 28import org.yuzu.yuzu_emu.features.settings.ui.viewholder.*
@@ -43,37 +46,29 @@ class SettingsAdapter(
43 } 46 }
44 47
45 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingViewHolder { 48 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingViewHolder {
46 val view: View
47 val inflater = LayoutInflater.from(parent.context) 49 val inflater = LayoutInflater.from(parent.context)
48 return when (viewType) { 50 return when (viewType) {
49 SettingsItem.TYPE_HEADER -> { 51 SettingsItem.TYPE_HEADER -> {
50 view = inflater.inflate(R.layout.list_item_settings_header, parent, false) 52 HeaderViewHolder(ListItemSettingsHeaderBinding.inflate(inflater), this)
51 HeaderViewHolder(view, this)
52 } 53 }
53 SettingsItem.TYPE_CHECKBOX -> { 54 SettingsItem.TYPE_SWITCH -> {
54 view = inflater.inflate(R.layout.list_item_setting_switch, parent, false) 55 SwitchSettingViewHolder(ListItemSettingSwitchBinding.inflate(inflater), this)
55 SwitchSettingViewHolder(view, this)
56 } 56 }
57 SettingsItem.TYPE_SINGLE_CHOICE, SettingsItem.TYPE_STRING_SINGLE_CHOICE -> { 57 SettingsItem.TYPE_SINGLE_CHOICE, SettingsItem.TYPE_STRING_SINGLE_CHOICE -> {
58 view = inflater.inflate(R.layout.list_item_setting, parent, false) 58 SingleChoiceViewHolder(ListItemSettingBinding.inflate(inflater), this)
59 SingleChoiceViewHolder(view, this)
60 } 59 }
61 SettingsItem.TYPE_SLIDER -> { 60 SettingsItem.TYPE_SLIDER -> {
62 view = inflater.inflate(R.layout.list_item_setting, parent, false) 61 SliderViewHolder(ListItemSettingBinding.inflate(inflater), this)
63 SliderViewHolder(view, this)
64 } 62 }
65 SettingsItem.TYPE_SUBMENU -> { 63 SettingsItem.TYPE_SUBMENU -> {
66 view = inflater.inflate(R.layout.list_item_setting, parent, false) 64 SubmenuViewHolder(ListItemSettingBinding.inflate(inflater), this)
67 SubmenuViewHolder(view, this)
68 } 65 }
69 SettingsItem.TYPE_DATETIME_SETTING -> { 66 SettingsItem.TYPE_DATETIME_SETTING -> {
70 view = inflater.inflate(R.layout.list_item_setting, parent, false) 67 DateTimeViewHolder(ListItemSettingBinding.inflate(inflater), this)
71 DateTimeViewHolder(view, this)
72 } 68 }
73 else -> { 69 else -> {
74 // TODO: Create an error view since we can't return null now 70 // TODO: Create an error view since we can't return null now
75 view = inflater.inflate(R.layout.list_item_settings_header, parent, false) 71 HeaderViewHolder(ListItemSettingsHeaderBinding.inflate(inflater), this)
76 HeaderViewHolder(view, this)
77 } 72 }
78 } 73 }
79 } 74 }
@@ -191,15 +186,13 @@ class SettingsAdapter(
191 sliderProgress = item.selectedValue 186 sliderProgress = item.selectedValue
192 187
193 val inflater = LayoutInflater.from(context) 188 val inflater = LayoutInflater.from(context)
194 val sliderLayout = inflater.inflate(R.layout.dialog_slider, null) 189 val sliderBinding = DialogSliderBinding.inflate(inflater)
195 val sliderView = sliderLayout.findViewById<Slider>(R.id.slider)
196 190
197 textSliderValue = sliderLayout.findViewById(R.id.text_value) 191 textSliderValue = sliderBinding.textValue
198 textSliderValue!!.text = sliderProgress.toString() 192 textSliderValue!!.text = sliderProgress.toString()
199 val units = sliderLayout.findViewById<TextView>(R.id.text_units) 193 sliderBinding.textUnits.text = item.units
200 units.text = item.units
201 194
202 sliderView.apply { 195 sliderBinding.slider.apply {
203 valueFrom = item.min.toFloat() 196 valueFrom = item.min.toFloat()
204 valueTo = item.max.toFloat() 197 valueTo = item.max.toFloat()
205 value = sliderProgress.toFloat() 198 value = sliderProgress.toFloat()
@@ -211,11 +204,11 @@ class SettingsAdapter(
211 204
212 dialog = MaterialAlertDialogBuilder(context) 205 dialog = MaterialAlertDialogBuilder(context)
213 .setTitle(item.nameId) 206 .setTitle(item.nameId)
214 .setView(sliderLayout) 207 .setView(sliderBinding.root)
215 .setPositiveButton(android.R.string.ok, this) 208 .setPositiveButton(android.R.string.ok, this)
216 .setNegativeButton(android.R.string.cancel, defaultCancelListener) 209 .setNegativeButton(android.R.string.cancel, defaultCancelListener)
217 .setNeutralButton(R.string.slider_default) { dialog: DialogInterface, which: Int -> 210 .setNeutralButton(R.string.slider_default) { dialog: DialogInterface, which: Int ->
218 sliderView.value = item.defaultValue.toFloat() 211 sliderBinding.slider.value = item.defaultValue.toFloat()
219 onClick(dialog, which) 212 onClick(dialog, which)
220 } 213 }
221 .show() 214 .show()
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
index bef5b9705..e2e07ee8b 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
@@ -14,9 +14,8 @@ import androidx.core.view.updatePadding
14import androidx.fragment.app.Fragment 14import androidx.fragment.app.Fragment
15import androidx.fragment.app.FragmentActivity 15import androidx.fragment.app.FragmentActivity
16import androidx.recyclerview.widget.LinearLayoutManager 16import androidx.recyclerview.widget.LinearLayoutManager
17import androidx.recyclerview.widget.RecyclerView
18import com.google.android.material.divider.MaterialDividerItemDecoration 17import com.google.android.material.divider.MaterialDividerItemDecoration
19import org.yuzu.yuzu_emu.R 18import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding
20import org.yuzu.yuzu_emu.features.settings.model.Setting 19import org.yuzu.yuzu_emu.features.settings.model.Setting
21import org.yuzu.yuzu_emu.features.settings.model.Settings 20import org.yuzu.yuzu_emu.features.settings.model.Settings
22import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 21import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
@@ -26,9 +25,10 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
26 25
27 private val presenter = SettingsFragmentPresenter(this) 26 private val presenter = SettingsFragmentPresenter(this)
28 private var activityView: SettingsActivityView? = null 27 private var activityView: SettingsActivityView? = null
29 private var adapter: SettingsAdapter? = null 28 private var settingsAdapter: SettingsAdapter? = null
30 29
31 private lateinit var recyclerView: RecyclerView 30 private var _binding: FragmentSettingsBinding? = null
31 private val binding get() = _binding!!
32 32
33 override fun onAttach(context: Context) { 33 override fun onAttach(context: Context) {
34 super.onAttach(context) 34 super.onAttach(context)
@@ -41,7 +41,6 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
41 super.onCreate(savedInstanceState) 41 super.onCreate(savedInstanceState)
42 val menuTag = requireArguments().getString(ARGUMENT_MENU_TAG) 42 val menuTag = requireArguments().getString(ARGUMENT_MENU_TAG)
43 val gameId = requireArguments().getString(ARGUMENT_GAME_ID) 43 val gameId = requireArguments().getString(ARGUMENT_GAME_ID)
44 adapter = SettingsAdapter(this, requireActivity())
45 presenter.onCreate(menuTag!!, gameId!!) 44 presenter.onCreate(menuTag!!, gameId!!)
46 } 45 }
47 46
@@ -49,18 +48,20 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
49 inflater: LayoutInflater, 48 inflater: LayoutInflater,
50 container: ViewGroup?, 49 container: ViewGroup?,
51 savedInstanceState: Bundle? 50 savedInstanceState: Bundle?
52 ): View? { 51 ): View {
53 return inflater.inflate(R.layout.fragment_settings, container, false) 52 _binding = FragmentSettingsBinding.inflate(layoutInflater)
53 return binding.root
54 } 54 }
55 55
56 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 56 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
57 val manager = LinearLayoutManager(activity) 57 settingsAdapter = SettingsAdapter(this, requireActivity())
58 recyclerView = view.findViewById(R.id.list_settings)
59 recyclerView.adapter = adapter
60 recyclerView.layoutManager = manager
61 val dividerDecoration = MaterialDividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL) 58 val dividerDecoration = MaterialDividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL)
62 dividerDecoration.isLastItemDecorated = false 59 dividerDecoration.isLastItemDecorated = false
63 recyclerView.addItemDecoration(dividerDecoration) 60 binding.listSettings.apply {
61 adapter = settingsAdapter
62 layoutManager = LinearLayoutManager(activity)
63 addItemDecoration(dividerDecoration)
64 }
64 val activity = activity as SettingsActivityView? 65 val activity = activity as SettingsActivityView?
65 presenter.onViewCreated(activity!!.settings) 66 presenter.onViewCreated(activity!!.settings)
66 67
@@ -70,8 +71,8 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
70 override fun onDetach() { 71 override fun onDetach() {
71 super.onDetach() 72 super.onDetach()
72 activityView = null 73 activityView = null
73 if (adapter != null) { 74 if (settingsAdapter != null) {
74 adapter!!.closeDialog() 75 settingsAdapter!!.closeDialog()
75 } 76 }
76 } 77 }
77 78
@@ -86,7 +87,7 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
86 } 87 }
87 88
88 override fun showSettingsList(settingsList: ArrayList<SettingsItem>) { 89 override fun showSettingsList(settingsList: ArrayList<SettingsItem>) {
89 adapter!!.setSettings(settingsList) 90 settingsAdapter!!.setSettings(settingsList)
90 } 91 }
91 92
92 override fun loadDefaultSettings() { 93 override fun loadDefaultSettings() {
@@ -114,7 +115,7 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
114 } 115 }
115 116
116 private fun setInsets() { 117 private fun setInsets() {
117 ViewCompat.setOnApplyWindowInsetsListener(recyclerView) { view: View, windowInsets: WindowInsetsCompat -> 118 ViewCompat.setOnApplyWindowInsetsListener(binding.listSettings) { view: View, windowInsets: WindowInsetsCompat ->
118 val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) 119 val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
119 view.updatePadding(bottom = insets.bottom) 120 view.updatePadding(bottom = insets.bottom)
120 windowInsets 121 windowInsets
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 ddbeb3487..5702fc0eb 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
@@ -4,31 +4,23 @@
4package org.yuzu.yuzu_emu.features.settings.ui.viewholder 4package org.yuzu.yuzu_emu.features.settings.ui.viewholder
5 5
6import android.view.View 6import android.view.View
7import android.widget.TextView 7import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
8import org.yuzu.yuzu_emu.R
9import org.yuzu.yuzu_emu.features.settings.model.view.DateTimeSetting 8import org.yuzu.yuzu_emu.features.settings.model.view.DateTimeSetting
10import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 10import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
12 11
13class DateTimeViewHolder(itemView: View, adapter: SettingsAdapter) : 12class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
14 SettingViewHolder(itemView, adapter) { 13 SettingViewHolder(binding.root, adapter) {
15 private lateinit var item: DateTimeSetting 14 private lateinit var item: DateTimeSetting
16 private lateinit var textSettingName: TextView
17 private lateinit var textSettingDescription: TextView
18
19 override fun findViews(root: View) {
20 textSettingName = root.findViewById(R.id.text_setting_name)
21 textSettingDescription = root.findViewById(R.id.text_setting_description)
22 }
23 15
24 override fun bind(item: SettingsItem) { 16 override fun bind(item: SettingsItem) {
25 this.item = item as DateTimeSetting 17 this.item = item as DateTimeSetting
26 textSettingName.setText(item.nameId) 18 binding.textSettingName.setText(item.nameId)
27 if (item.descriptionId!! > 0) { 19 if (item.descriptionId!! > 0) {
28 textSettingDescription.setText(item.descriptionId) 20 binding.textSettingDescription.setText(item.descriptionId)
29 textSettingDescription.visibility = View.VISIBLE 21 binding.textSettingDescription.visibility = View.VISIBLE
30 } else { 22 } else {
31 textSettingDescription.visibility = View.GONE 23 binding.textSettingDescription.visibility = View.GONE
32 } 24 }
33 } 25 }
34 26
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt
index dd186552a..1ac00dbfc 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt
@@ -4,25 +4,19 @@
4package org.yuzu.yuzu_emu.features.settings.ui.viewholder 4package org.yuzu.yuzu_emu.features.settings.ui.viewholder
5 5
6import android.view.View 6import android.view.View
7import android.widget.TextView 7import org.yuzu.yuzu_emu.databinding.ListItemSettingsHeaderBinding
8import org.yuzu.yuzu_emu.R
9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 8import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
10import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 9import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
11 10
12class HeaderViewHolder(itemView: View, adapter: SettingsAdapter) : 11class HeaderViewHolder(val binding: ListItemSettingsHeaderBinding, adapter: SettingsAdapter) :
13 SettingViewHolder(itemView, adapter) { 12 SettingViewHolder(binding.root, adapter) {
14 private lateinit var headerName: TextView
15 13
16 init { 14 init {
17 itemView.setOnClickListener(null) 15 itemView.setOnClickListener(null)
18 } 16 }
19 17
20 override fun findViews(root: View) {
21 headerName = root.findViewById(R.id.text_header_name)
22 }
23
24 override fun bind(item: SettingsItem) { 18 override fun bind(item: SettingsItem) {
25 headerName.setText(item.nameId) 19 binding.textHeaderName.setText(item.nameId)
26 } 20 }
27 21
28 override fun onClick(clicked: View) { 22 override fun onClick(clicked: View) {
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SettingViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SettingViewHolder.kt
index 6468af331..73375e757 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SettingViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SettingViewHolder.kt
@@ -13,17 +13,9 @@ abstract class SettingViewHolder(itemView: View, protected val adapter: Settings
13 13
14 init { 14 init {
15 itemView.setOnClickListener(this) 15 itemView.setOnClickListener(this)
16 findViews(itemView)
17 } 16 }
18 17
19 /** 18 /**
20 * Gets handles to all this ViewHolder's child views using their XML-defined identifiers.
21 *
22 * @param root The newly inflated top-level view.
23 */
24 protected abstract fun findViews(root: View)
25
26 /**
27 * Called by the adapter to set this ViewHolder's child views to display the list item 19 * Called by the adapter to set this ViewHolder's child views to display the list item
28 * it must now represent. 20 * it must now represent.
29 * 21 *
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 f6c8e3a7d..a82f49f44 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
@@ -4,40 +4,32 @@
4package org.yuzu.yuzu_emu.features.settings.ui.viewholder 4package org.yuzu.yuzu_emu.features.settings.ui.viewholder
5 5
6import android.view.View 6import android.view.View
7import android.widget.TextView 7import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
8import org.yuzu.yuzu_emu.R
9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 8import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
10import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting 9import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting
11import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting 10import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting
12import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
13 12
14class SingleChoiceViewHolder(itemView: View, adapter: SettingsAdapter) : 13class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
15 SettingViewHolder(itemView, adapter) { 14 SettingViewHolder(binding.root, adapter) {
16 private lateinit var item: SettingsItem 15 private lateinit var item: SettingsItem
17 private lateinit var textSettingName: TextView
18 private lateinit var textSettingDescription: TextView
19
20 override fun findViews(root: View) {
21 textSettingName = root.findViewById(R.id.text_setting_name)
22 textSettingDescription = root.findViewById(R.id.text_setting_description)
23 }
24 16
25 override fun bind(item: SettingsItem) { 17 override fun bind(item: SettingsItem) {
26 this.item = item 18 this.item = item
27 textSettingName.setText(item.nameId) 19 binding.textSettingName.setText(item.nameId)
28 textSettingDescription.visibility = View.VISIBLE 20 binding.textSettingDescription.visibility = View.VISIBLE
29 if (item.descriptionId!! > 0) { 21 if (item.descriptionId!! > 0) {
30 textSettingDescription.setText(item.descriptionId) 22 binding.textSettingDescription.setText(item.descriptionId)
31 } else if (item is SingleChoiceSetting) { 23 } else if (item is SingleChoiceSetting) {
32 val resMgr = textSettingDescription.context.resources 24 val resMgr = binding.textSettingDescription.context.resources
33 val values = resMgr.getIntArray(item.valuesId) 25 val values = resMgr.getIntArray(item.valuesId)
34 for (i in values.indices) { 26 for (i in values.indices) {
35 if (values[i] == item.selectedValue) { 27 if (values[i] == item.selectedValue) {
36 textSettingDescription.text = resMgr.getStringArray(item.choicesId)[i] 28 binding.textSettingDescription.text = resMgr.getStringArray(item.choicesId)[i]
37 } 29 }
38 } 30 }
39 } else { 31 } else {
40 textSettingDescription.visibility = View.GONE 32 binding.textSettingDescription.visibility = View.GONE
41 } 33 }
42 } 34 }
43 35
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 2213f3c16..2d9fd11f9 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
@@ -4,30 +4,23 @@
4package org.yuzu.yuzu_emu.features.settings.ui.viewholder 4package org.yuzu.yuzu_emu.features.settings.ui.viewholder
5 5
6import android.view.View 6import android.view.View
7import android.widget.TextView 7import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
8import org.yuzu.yuzu_emu.R
9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 8import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
10import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting 9import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting
11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 10import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
12 11
13class SliderViewHolder(itemView: View, adapter: SettingsAdapter) : SettingViewHolder(itemView, adapter) { 12class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
13 SettingViewHolder(binding.root, adapter) {
14 private lateinit var item: SliderSetting 14 private lateinit var item: SliderSetting
15 private lateinit var textSettingName: TextView
16 private lateinit var textSettingDescription: TextView
17
18 override fun findViews(root: View) {
19 textSettingName = root.findViewById(R.id.text_setting_name)
20 textSettingDescription = root.findViewById(R.id.text_setting_description)
21 }
22 15
23 override fun bind(item: SettingsItem) { 16 override fun bind(item: SettingsItem) {
24 this.item = item as SliderSetting 17 this.item = item as SliderSetting
25 textSettingName.setText(item.nameId) 18 binding.textSettingName.setText(item.nameId)
26 if (item.descriptionId!! > 0) { 19 if (item.descriptionId!! > 0) {
27 textSettingDescription.setText(item.descriptionId) 20 binding.textSettingDescription.setText(item.descriptionId)
28 textSettingDescription.visibility = View.VISIBLE 21 binding.textSettingDescription.visibility = View.VISIBLE
29 } else { 22 } else {
30 textSettingDescription.visibility = View.GONE 23 binding.textSettingDescription.visibility = View.GONE
31 } 24 }
32 } 25 }
33 26
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 75656215a..8125fd865 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
@@ -4,31 +4,23 @@
4package org.yuzu.yuzu_emu.features.settings.ui.viewholder 4package org.yuzu.yuzu_emu.features.settings.ui.viewholder
5 5
6import android.view.View 6import android.view.View
7import android.widget.TextView 7import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
8import org.yuzu.yuzu_emu.R
9import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 8import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
10import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting 9import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting
11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 10import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
12 11
13class SubmenuViewHolder(itemView: View, adapter: SettingsAdapter) : 12class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
14 SettingViewHolder(itemView, adapter) { 13 SettingViewHolder(binding.root, adapter) {
15 private lateinit var item: SubmenuSetting 14 private lateinit var item: SubmenuSetting
16 private lateinit var textSettingName: TextView
17 private lateinit var textSettingDescription: TextView
18
19 override fun findViews(root: View) {
20 textSettingName = root.findViewById(R.id.text_setting_name)
21 textSettingDescription = root.findViewById(R.id.text_setting_description)
22 }
23 15
24 override fun bind(item: SettingsItem) { 16 override fun bind(item: SettingsItem) {
25 this.item = item as SubmenuSetting 17 this.item = item as SubmenuSetting
26 textSettingName.setText(item.nameId) 18 binding.textSettingName.setText(item.nameId)
27 if (item.descriptionId!! > 0) { 19 if (item.descriptionId!! > 0) {
28 textSettingDescription.setText(item.descriptionId) 20 binding.textSettingDescription.setText(item.descriptionId)
29 textSettingDescription.visibility = View.VISIBLE 21 binding.textSettingDescription.visibility = View.VISIBLE
30 } else { 22 } else {
31 textSettingDescription.visibility = View.GONE 23 binding.textSettingDescription.visibility = View.GONE
32 } 24 }
33 } 25 }
34 26
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 f8b229830..3fedb4969 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
@@ -5,43 +5,31 @@ package org.yuzu.yuzu_emu.features.settings.ui.viewholder
5 5
6import android.view.View 6import android.view.View
7import android.widget.CompoundButton 7import android.widget.CompoundButton
8import android.widget.TextView 8import org.yuzu.yuzu_emu.databinding.ListItemSettingSwitchBinding
9import com.google.android.material.materialswitch.MaterialSwitch
10import org.yuzu.yuzu_emu.R
11import org.yuzu.yuzu_emu.features.settings.model.view.SwitchSetting 9import org.yuzu.yuzu_emu.features.settings.model.view.SwitchSetting
12import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem 10import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
13import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 11import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
14 12
15class SwitchSettingViewHolder(itemView: View, adapter: SettingsAdapter) : 13class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter: SettingsAdapter) :
16 SettingViewHolder(itemView, adapter) { 14 SettingViewHolder(binding.root, adapter) {
17 private lateinit var item: SwitchSetting
18 private lateinit var textSettingName: TextView
19 private lateinit var textSettingDescription: TextView
20 private lateinit var switch: MaterialSwitch
21
22 override fun findViews(root: View) {
23 textSettingName = root.findViewById(R.id.text_setting_name)
24 textSettingDescription = root.findViewById(R.id.text_setting_description)
25 switch = root.findViewById(R.id.switch_widget)
26 }
27 15
28 override fun bind(item: SettingsItem) { 16 override fun bind(item: SettingsItem) {
29 this.item = item as SwitchSetting 17 val setting = item as SwitchSetting
30 textSettingName.setText(item.nameId) 18 binding.textSettingName.setText(item.nameId)
31 if (item.descriptionId!! > 0) { 19 if (item.descriptionId!! > 0) {
32 textSettingDescription.setText(item.descriptionId) 20 binding.textSettingDescription.setText(item.descriptionId)
33 textSettingDescription.visibility = View.VISIBLE 21 binding.textSettingDescription.visibility = View.VISIBLE
34 } else { 22 } else {
35 textSettingDescription.text = "" 23 binding.textSettingDescription.text = ""
36 textSettingDescription.visibility = View.GONE 24 binding.textSettingDescription.visibility = View.GONE
37 } 25 }
38 switch.isChecked = this.item.isChecked 26 binding.switchWidget.isChecked = setting.isChecked
39 switch.setOnCheckedChangeListener { _: CompoundButton, _: Boolean -> 27 binding.switchWidget.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
40 adapter.onBooleanClick(item, bindingAdapterPosition, switch.isChecked) 28 adapter.onBooleanClick(item, bindingAdapterPosition, binding.switchWidget.isChecked)
41 } 29 }
42 } 30 }
43 31
44 override fun onClick(clicked: View) { 32 override fun onClick(clicked: View) {
45 switch.toggle() 33 binding.switchWidget.toggle()
46 } 34 }
47} 35}
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 c75ad580e..37469302d 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
@@ -10,8 +10,6 @@ import android.graphics.Color
10import android.os.Bundle 10import android.os.Bundle
11import android.os.Handler 11import android.os.Handler
12import android.view.* 12import android.view.*
13import android.widget.Button
14import android.widget.TextView
15import android.widget.Toast 13import android.widget.Toast
16import androidx.fragment.app.Fragment 14import androidx.fragment.app.Fragment
17import androidx.localbroadcastmanager.content.LocalBroadcastManager 15import androidx.localbroadcastmanager.content.LocalBroadcastManager
@@ -20,8 +18,8 @@ import org.yuzu.yuzu_emu.NativeLibrary
20import org.yuzu.yuzu_emu.R 18import org.yuzu.yuzu_emu.R
21import org.yuzu.yuzu_emu.YuzuApplication 19import org.yuzu.yuzu_emu.YuzuApplication
22import org.yuzu.yuzu_emu.activities.EmulationActivity 20import org.yuzu.yuzu_emu.activities.EmulationActivity
21import org.yuzu.yuzu_emu.databinding.FragmentEmulationBinding
23import org.yuzu.yuzu_emu.features.settings.model.Settings 22import org.yuzu.yuzu_emu.features.settings.model.Settings
24import org.yuzu.yuzu_emu.overlay.InputOverlay
25import org.yuzu.yuzu_emu.utils.DirectoryInitialization 23import org.yuzu.yuzu_emu.utils.DirectoryInitialization
26import org.yuzu.yuzu_emu.utils.DirectoryInitialization.DirectoryInitializationState 24import org.yuzu.yuzu_emu.utils.DirectoryInitialization.DirectoryInitializationState
27import org.yuzu.yuzu_emu.utils.DirectoryStateReceiver 25import org.yuzu.yuzu_emu.utils.DirectoryStateReceiver
@@ -29,13 +27,14 @@ import org.yuzu.yuzu_emu.utils.Log
29 27
30class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.FrameCallback { 28class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.FrameCallback {
31 private lateinit var preferences: SharedPreferences 29 private lateinit var preferences: SharedPreferences
32 private var inputOverlay: InputOverlay? = null
33 private lateinit var emulationState: EmulationState 30 private lateinit var emulationState: EmulationState
34 private var directoryStateReceiver: DirectoryStateReceiver? = null 31 private var directoryStateReceiver: DirectoryStateReceiver? = null
35 private var emulationActivity: EmulationActivity? = null 32 private var emulationActivity: EmulationActivity? = null
36 private lateinit var perfStats: TextView
37 private var perfStatsUpdater: (() -> Unit)? = null 33 private var perfStatsUpdater: (() -> Unit)? = null
38 34
35 private var _binding: FragmentEmulationBinding? = null
36 private val binding get() = _binding!!
37
39 override fun onAttach(context: Context) { 38 override fun onAttach(context: Context) {
40 super.onAttach(context) 39 super.onAttach(context)
41 if (context is EmulationActivity) { 40 if (context is EmulationActivity) {
@@ -66,22 +65,19 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
66 inflater: LayoutInflater, 65 inflater: LayoutInflater,
67 container: ViewGroup?, 66 container: ViewGroup?,
68 savedInstanceState: Bundle? 67 savedInstanceState: Bundle?
69 ): View? { 68 ): View {
70 val contents = inflater.inflate(R.layout.fragment_emulation, container, false) 69 _binding = FragmentEmulationBinding.inflate(layoutInflater)
71 val surfaceView = contents.findViewById<SurfaceView>(R.id.surface_emulation) 70 return binding.root
72 surfaceView.holder.addCallback(this) 71 }
73 inputOverlay = contents.findViewById(R.id.surface_input_overlay) 72
74 perfStats = contents.findViewById(R.id.show_fps_text) 73 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
75 perfStats.setTextColor(Color.YELLOW) 74 binding.surfaceEmulation.holder.addCallback(this)
76 val doneButton = contents.findViewById<Button>(R.id.done_control_config) 75 binding.showFpsText.setTextColor(Color.YELLOW)
77 doneButton?.setOnClickListener { stopConfiguringControls() } 76 binding.doneControlConfig.setOnClickListener { stopConfiguringControls() }
78 77
79 // Setup overlay. 78 // Setup overlay.
80 resetInputOverlay() 79 resetInputOverlay()
81 updateShowFpsOverlay() 80 updateShowFpsOverlay()
82
83 // The new Surface created here will get passed to the native code via onSurfaceChanged.
84 return contents
85 } 81 }
86 82
87 override fun onResume() { 83 override fun onResume() {
@@ -108,6 +104,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
108 super.onPause() 104 super.onPause()
109 } 105 }
110 106
107 override fun onDestroyView() {
108 super.onDestroyView()
109 _binding = null
110 }
111
111 override fun onDetach() { 112 override fun onDetach() {
112 NativeLibrary.clearEmulationActivity() 113 NativeLibrary.clearEmulationActivity()
113 super.onDetach() 114 super.onDetach()
@@ -144,7 +145,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
144 } 145 }
145 146
146 fun refreshInputOverlay() { 147 fun refreshInputOverlay() {
147 inputOverlay!!.refreshControls() 148 binding.surfaceInputOverlay.refreshControls()
148 } 149 }
149 150
150 fun resetInputOverlay() { 151 fun resetInputOverlay() {
@@ -152,7 +153,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
152 preferences.edit() 153 preferences.edit()
153 .putInt(Settings.PREF_CONTROL_SCALE, 50) 154 .putInt(Settings.PREF_CONTROL_SCALE, 50)
154 .apply() 155 .apply()
155 inputOverlay!!.resetButtonPlacement() 156 binding.surfaceInputOverlay.resetButtonPlacement()
156 } 157 }
157 158
158 private fun updateShowFpsOverlay() { 159 private fun updateShowFpsOverlay() {
@@ -165,17 +166,17 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
165 perfStatsUpdater = { 166 perfStatsUpdater = {
166 val perfStats = NativeLibrary.GetPerfStats() 167 val perfStats = NativeLibrary.GetPerfStats()
167 if (perfStats[FPS] > 0) { 168 if (perfStats[FPS] > 0) {
168 this.perfStats.text = String.format("FPS: %.1f", perfStats[FPS]) 169 binding.showFpsText.text = String.format("FPS: %.1f", perfStats[FPS])
169 } 170 }
170 perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 100) 171 perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 100)
171 } 172 }
172 perfStatsUpdateHandler.post(perfStatsUpdater!!) 173 perfStatsUpdateHandler.post(perfStatsUpdater!!)
173 perfStats.visibility = View.VISIBLE 174 binding.showFpsText.visibility = View.VISIBLE
174 } else { 175 } else {
175 if (perfStatsUpdater != null) { 176 if (perfStatsUpdater != null) {
176 perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!) 177 perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!)
177 } 178 }
178 perfStats.visibility = View.GONE 179 binding.showFpsText.visibility = View.GONE
179 } 180 }
180 } 181 }
181 182
@@ -203,18 +204,17 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
203 } 204 }
204 205
205 fun startConfiguringControls() { 206 fun startConfiguringControls() {
206 requireView().findViewById<View>(R.id.done_control_config).visibility = 207 binding.doneControlConfig.visibility = View.VISIBLE
207 View.VISIBLE 208 binding.surfaceInputOverlay.setIsInEditMode(true)
208 inputOverlay!!.setIsInEditMode(true)
209 } 209 }
210 210
211 fun stopConfiguringControls() { 211 fun stopConfiguringControls() {
212 requireView().findViewById<View>(R.id.done_control_config).visibility = View.GONE 212 binding.doneControlConfig.visibility = View.GONE
213 inputOverlay!!.setIsInEditMode(false) 213 binding.surfaceInputOverlay.setIsInEditMode(false)
214 } 214 }
215 215
216 val isConfiguringControls: Boolean 216 val isConfiguringControls: Boolean
217 get() = inputOverlay!!.isInEditMode 217 get() = binding.surfaceInputOverlay.isInEditMode
218 218
219 private class EmulationState(private val mGamePath: String?) { 219 private class EmulationState(private val mGamePath: String?) {
220 private var state: State 220 private var state: State
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 f87f13463..c5259a13d 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
@@ -10,30 +10,29 @@ import android.os.Bundle
10import android.view.Menu 10import android.view.Menu
11import android.view.MenuItem 11import android.view.MenuItem
12import android.view.View 12import android.view.View
13import android.widget.FrameLayout
14import android.widget.Toast 13import android.widget.Toast
15import androidx.appcompat.app.AppCompatActivity 14import androidx.appcompat.app.AppCompatActivity
16import androidx.appcompat.widget.Toolbar
17import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen 15import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
18import androidx.core.view.ViewCompat 16import androidx.core.view.ViewCompat
19import androidx.core.view.WindowCompat 17import androidx.core.view.WindowCompat
20import androidx.core.view.WindowInsetsCompat 18import androidx.core.view.WindowInsetsCompat
21import androidx.core.view.updatePadding 19import androidx.core.view.updatePadding
22import com.google.android.material.appbar.AppBarLayout
23import com.google.android.material.dialog.MaterialAlertDialogBuilder 20import com.google.android.material.dialog.MaterialAlertDialogBuilder
24import org.yuzu.yuzu_emu.NativeLibrary 21import org.yuzu.yuzu_emu.NativeLibrary
25import org.yuzu.yuzu_emu.R 22import org.yuzu.yuzu_emu.R
26import org.yuzu.yuzu_emu.activities.EmulationActivity 23import org.yuzu.yuzu_emu.activities.EmulationActivity
24import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
27import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity 25import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity
28import org.yuzu.yuzu_emu.model.GameProvider 26import org.yuzu.yuzu_emu.model.GameProvider
29import org.yuzu.yuzu_emu.ui.platform.PlatformGamesFragment 27import org.yuzu.yuzu_emu.ui.platform.PlatformGamesFragment
30import org.yuzu.yuzu_emu.utils.* 28import org.yuzu.yuzu_emu.utils.*
31 29
32class MainActivity : AppCompatActivity(), MainView { 30class MainActivity : AppCompatActivity(), MainView {
33 private lateinit var toolbar: Toolbar
34 private var platformGamesFragment: PlatformGamesFragment? = null 31 private var platformGamesFragment: PlatformGamesFragment? = null
35 private val presenter = MainPresenter(this) 32 private val presenter = MainPresenter(this)
36 33
34 private lateinit var binding: ActivityMainBinding
35
37 override fun onCreate(savedInstanceState: Bundle?) { 36 override fun onCreate(savedInstanceState: Bundle?) {
38 val splashScreen = installSplashScreen() 37 val splashScreen = installSplashScreen()
39 splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady() } 38 splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady() }
@@ -41,12 +40,13 @@ class MainActivity : AppCompatActivity(), MainView {
41 ThemeHelper.setTheme(this) 40 ThemeHelper.setTheme(this)
42 41
43 super.onCreate(savedInstanceState) 42 super.onCreate(savedInstanceState)
44 setContentView(R.layout.activity_main) 43
44 binding = ActivityMainBinding.inflate(layoutInflater)
45 setContentView(binding.root)
45 46
46 WindowCompat.setDecorFitsSystemWindows(window, false) 47 WindowCompat.setDecorFitsSystemWindows(window, false)
47 48
48 findViews() 49 setSupportActionBar(binding.toolbarMain)
49 setSupportActionBar(toolbar)
50 presenter.onCreate() 50 presenter.onCreate()
51 if (savedInstanceState == null) { 51 if (savedInstanceState == null) {
52 StartupHandler.handleInit(this) 52 StartupHandler.handleInit(this)
@@ -81,11 +81,6 @@ class MainActivity : AppCompatActivity(), MainView {
81 presenter.addDirIfNeeded(AddDirectoryHelper(this)) 81 presenter.addDirIfNeeded(AddDirectoryHelper(this))
82 } 82 }
83 83
84 // TODO: Replace with view binding
85 private fun findViews() {
86 toolbar = findViewById(R.id.toolbar_main)
87 }
88
89 override fun onCreateOptionsMenu(menu: Menu): Boolean { 84 override fun onCreateOptionsMenu(menu: Menu): Boolean {
90 menuInflater.inflate(R.menu.menu_game_grid, menu) 85 menuInflater.inflate(R.menu.menu_game_grid, menu)
91 return true 86 return true
@@ -95,7 +90,7 @@ class MainActivity : AppCompatActivity(), MainView {
95 * MainView 90 * MainView
96 */ 91 */
97 override fun setVersionString(version: String) { 92 override fun setVersionString(version: String) {
98 toolbar.subtitle = version 93 binding.toolbarMain.subtitle = version
99 } 94 }
100 95
101 override fun refresh() { 96 override fun refresh() {
@@ -247,12 +242,10 @@ class MainActivity : AppCompatActivity(), MainView {
247 } 242 }
248 243
249 private fun setInsets() { 244 private fun setInsets() {
250 val appBar = findViewById<AppBarLayout>(R.id.appbar_main) 245 ViewCompat.setOnApplyWindowInsetsListener(binding.gamesPlatformFrame) { view: View, windowInsets: WindowInsetsCompat ->
251 val frame = findViewById<FrameLayout>(R.id.games_platform_frame)
252 ViewCompat.setOnApplyWindowInsetsListener(frame) { view: View, windowInsets: WindowInsetsCompat ->
253 val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) 246 val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
254 view.updatePadding(left = insets.left, right = insets.right) 247 view.updatePadding(left = insets.left, right = insets.right)
255 InsetsHelper.insetAppBar(insets, appBar) 248 InsetsHelper.insetAppBar(insets, binding.appbarMain)
256 windowInsets 249 windowInsets
257 } 250 }
258 } 251 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.kt
index 40e902a37..775f4ed9e 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.kt
@@ -9,35 +9,33 @@ import android.view.LayoutInflater
9import android.view.View 9import android.view.View
10import android.view.ViewGroup 10import android.view.ViewGroup
11import android.view.ViewTreeObserver.OnGlobalLayoutListener 11import android.view.ViewTreeObserver.OnGlobalLayoutListener
12import android.widget.TextView
13import androidx.appcompat.app.AppCompatActivity 12import androidx.appcompat.app.AppCompatActivity
14import androidx.core.view.ViewCompat 13import androidx.core.view.ViewCompat
15import androidx.core.view.WindowInsetsCompat 14import androidx.core.view.WindowInsetsCompat
16import androidx.core.view.updatePadding 15import androidx.core.view.updatePadding
17import androidx.fragment.app.Fragment 16import androidx.fragment.app.Fragment
18import androidx.recyclerview.widget.GridLayoutManager 17import androidx.recyclerview.widget.GridLayoutManager
19import androidx.recyclerview.widget.RecyclerView
20import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
21import com.google.android.material.color.MaterialColors 18import com.google.android.material.color.MaterialColors
22import org.yuzu.yuzu_emu.R 19import org.yuzu.yuzu_emu.R
23import org.yuzu.yuzu_emu.YuzuApplication 20import org.yuzu.yuzu_emu.YuzuApplication
24import org.yuzu.yuzu_emu.adapters.GameAdapter 21import org.yuzu.yuzu_emu.adapters.GameAdapter
22import org.yuzu.yuzu_emu.databinding.FragmentGridBinding
25 23
26class PlatformGamesFragment : Fragment(), PlatformGamesView { 24class PlatformGamesFragment : Fragment(), PlatformGamesView {
27 private val presenter = PlatformGamesPresenter(this) 25 private val presenter = PlatformGamesPresenter(this)
28 private var adapter: GameAdapter? = null 26 private var adapter: GameAdapter? = null
29 private lateinit var recyclerView: RecyclerView 27
30 private lateinit var textView: TextView 28 private var _binding: FragmentGridBinding? = null
29 private val binding get() = _binding!!
31 30
32 override fun onCreateView( 31 override fun onCreateView(
33 inflater: LayoutInflater, 32 inflater: LayoutInflater,
34 container: ViewGroup?, 33 container: ViewGroup?,
35 savedInstanceState: Bundle? 34 savedInstanceState: Bundle?
36 ): View? { 35 ): View {
37 val rootView = inflater.inflate(R.layout.fragment_grid, container, false)
38 findViews(rootView)
39 presenter.onCreateView() 36 presenter.onCreateView()
40 return rootView 37 _binding = FragmentGridBinding.inflate(inflater)
38 return binding.root
41 } 39 }
42 40
43 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 41 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -58,30 +56,34 @@ class PlatformGamesFragment : Fragment(), PlatformGamesView {
58 } 56 }
59 view.viewTreeObserver.removeOnGlobalLayoutListener(this) 57 view.viewTreeObserver.removeOnGlobalLayoutListener(this)
60 val layoutManager = GridLayoutManager(activity, columns) 58 val layoutManager = GridLayoutManager(activity, columns)
61 recyclerView.layoutManager = layoutManager 59 binding.gridGames.layoutManager = layoutManager
62 recyclerView.adapter = adapter 60 binding.gridGames.adapter = adapter
63 } 61 }
64 }) 62 })
65 } 63 }
66 64
67 // Add swipe down to refresh gesture 65 // Add swipe down to refresh gesture
68 val pullToRefresh = view.findViewById<SwipeRefreshLayout>(R.id.swipe_refresh) 66 binding.swipeRefresh.setOnRefreshListener {
69 pullToRefresh.setOnRefreshListener {
70 refresh() 67 refresh()
71 pullToRefresh.isRefreshing = false 68 binding.swipeRefresh.isRefreshing = false
72 } 69 }
73 70
74 // Set theme color to the refresh animation's background 71 // Set theme color to the refresh animation's background
75 pullToRefresh.setProgressBackgroundColorSchemeColor( 72 binding.swipeRefresh.setProgressBackgroundColorSchemeColor(
76 MaterialColors.getColor(pullToRefresh, R.attr.colorPrimary) 73 MaterialColors.getColor(binding.swipeRefresh, R.attr.colorPrimary)
77 ) 74 )
78 pullToRefresh.setColorSchemeColors( 75 binding.swipeRefresh.setColorSchemeColors(
79 MaterialColors.getColor(pullToRefresh, R.attr.colorOnPrimary) 76 MaterialColors.getColor(binding.swipeRefresh, R.attr.colorOnPrimary)
80 ) 77 )
81 78
82 setInsets() 79 setInsets()
83 } 80 }
84 81
82 override fun onDestroyView() {
83 super.onDestroyView()
84 _binding = null
85 }
86
85 override fun refresh() { 87 override fun refresh() {
86 val databaseHelper = YuzuApplication.databaseHelper 88 val databaseHelper = YuzuApplication.databaseHelper
87 databaseHelper!!.scanLibrary(databaseHelper.writableDatabase) 89 databaseHelper!!.scanLibrary(databaseHelper.writableDatabase)
@@ -97,17 +99,12 @@ class PlatformGamesFragment : Fragment(), PlatformGamesView {
97 } 99 }
98 100
99 private fun updateTextView() { 101 private fun updateTextView() {
100 textView.visibility = 102 binding.gamelistEmptyText.visibility =
101 if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE 103 if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE
102 } 104 }
103 105
104 private fun findViews(root: View) {
105 recyclerView = root.findViewById(R.id.grid_games)
106 textView = root.findViewById(R.id.gamelist_empty_text)
107 }
108
109 private fun setInsets() { 106 private fun setInsets() {
110 ViewCompat.setOnApplyWindowInsetsListener(recyclerView) { view: View, windowInsets: WindowInsetsCompat -> 107 ViewCompat.setOnApplyWindowInsetsListener(binding.gridGames) { view: View, windowInsets: WindowInsetsCompat ->
111 val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) 108 val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
112 view.updatePadding(bottom = insets.bottom) 109 view.updatePadding(bottom = insets.bottom)
113 windowInsets 110 windowInsets
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholders/GameViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholders/GameViewHolder.kt
index cef4e49d6..51420448f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholders/GameViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholders/GameViewHolder.kt
@@ -3,33 +3,14 @@
3 3
4package org.yuzu.yuzu_emu.viewholders 4package org.yuzu.yuzu_emu.viewholders
5 5
6import android.view.View
7import android.widget.ImageView
8import android.widget.TextView
9import androidx.recyclerview.widget.RecyclerView 6import androidx.recyclerview.widget.RecyclerView
10import org.yuzu.yuzu_emu.R 7import org.yuzu.yuzu_emu.databinding.CardGameBinding
8import org.yuzu.yuzu_emu.model.Game
11 9
12/** 10class GameViewHolder(val binding: CardGameBinding) : RecyclerView.ViewHolder(binding.root) {
13 * A simple class that stores references to views so that the GameAdapter doesn't need to 11 lateinit var game: Game
14 * keep calling findViewById(), which is expensive.
15 */
16class GameViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
17 var imageIcon: ImageView
18 var textGameTitle: TextView
19 var textGameCaption: TextView
20 var gameId: String? = null
21
22 // TODO Not need any of this stuff. Currently only the properties dialog needs it.
23 var path: String? = null
24 var title: String? = null
25 var description: String? = null
26 var regions: String? = null
27 var company: String? = null
28 12
29 init { 13 init {
30 itemView.tag = this 14 itemView.tag = this
31 imageIcon = itemView.findViewById(R.id.image_game_screen)
32 textGameTitle = itemView.findViewById(R.id.text_game_title)
33 textGameCaption = itemView.findViewById(R.id.text_game_caption)
34 } 15 }
35} 16}