diff options
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 | |||
| 8 | import android.content.Intent | 8 | import android.content.Intent |
| 9 | import android.graphics.Rect | 9 | import android.graphics.Rect |
| 10 | import android.os.Bundle | 10 | import android.os.Bundle |
| 11 | import android.view.LayoutInflater | ||
| 12 | import android.view.MotionEvent | 11 | import android.view.MotionEvent |
| 13 | import android.view.View | 12 | import android.view.View |
| 14 | import android.view.WindowManager | 13 | import android.view.WindowManager |
| 15 | import android.widget.TextView | ||
| 16 | import androidx.activity.OnBackPressedCallback | 14 | import androidx.activity.OnBackPressedCallback |
| 17 | import androidx.annotation.IntDef | 15 | import androidx.annotation.IntDef |
| 18 | import androidx.appcompat.app.AppCompatActivity | 16 | import androidx.appcompat.app.AppCompatActivity |
| @@ -21,10 +19,10 @@ import androidx.fragment.app.FragmentActivity | |||
| 21 | import androidx.fragment.app.FragmentManager | 19 | import androidx.fragment.app.FragmentManager |
| 22 | import androidx.preference.PreferenceManager | 20 | import androidx.preference.PreferenceManager |
| 23 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 21 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 24 | import com.google.android.material.slider.Slider | ||
| 25 | import com.google.android.material.slider.Slider.OnChangeListener | 22 | import com.google.android.material.slider.Slider.OnChangeListener |
| 26 | import org.yuzu.yuzu_emu.NativeLibrary | 23 | import org.yuzu.yuzu_emu.NativeLibrary |
| 27 | import org.yuzu.yuzu_emu.R | 24 | import org.yuzu.yuzu_emu.R |
| 25 | import org.yuzu.yuzu_emu.databinding.DialogSliderBinding | ||
| 28 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 26 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 29 | import org.yuzu.yuzu_emu.fragments.EmulationFragment | 27 | import org.yuzu.yuzu_emu.fragments.EmulationFragment |
| 30 | import org.yuzu.yuzu_emu.fragments.MenuFragment | 28 | import 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 | |||
| 24 | import org.yuzu.yuzu_emu.NativeLibrary | 24 | import org.yuzu.yuzu_emu.NativeLibrary |
| 25 | import org.yuzu.yuzu_emu.R | 25 | import org.yuzu.yuzu_emu.R |
| 26 | import org.yuzu.yuzu_emu.activities.EmulationActivity.Companion.launch | 26 | import org.yuzu.yuzu_emu.activities.EmulationActivity.Companion.launch |
| 27 | import org.yuzu.yuzu_emu.databinding.CardGameBinding | ||
| 28 | import org.yuzu.yuzu_emu.model.Game | ||
| 27 | import org.yuzu.yuzu_emu.model.GameDatabase | 29 | import org.yuzu.yuzu_emu.model.GameDatabase |
| 28 | import org.yuzu.yuzu_emu.utils.Log | 30 | import org.yuzu.yuzu_emu.utils.Log |
| 29 | import org.yuzu.yuzu_emu.viewholders.GameViewHolder | 31 | import 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 | |||
| 9 | import android.os.Bundle | 9 | import android.os.Bundle |
| 10 | import android.view.Menu | 10 | import android.view.Menu |
| 11 | import android.view.View | 11 | import android.view.View |
| 12 | import android.widget.FrameLayout | ||
| 13 | import android.widget.Toast | 12 | import android.widget.Toast |
| 14 | import androidx.appcompat.app.AlertDialog | 13 | import androidx.appcompat.app.AlertDialog |
| 15 | import androidx.appcompat.app.AppCompatActivity | 14 | import androidx.appcompat.app.AppCompatActivity |
| @@ -18,11 +17,11 @@ import androidx.core.view.WindowCompat | |||
| 18 | import androidx.core.view.WindowInsetsCompat | 17 | import androidx.core.view.WindowInsetsCompat |
| 19 | import androidx.core.view.updatePadding | 18 | import androidx.core.view.updatePadding |
| 20 | import androidx.localbroadcastmanager.content.LocalBroadcastManager | 19 | import androidx.localbroadcastmanager.content.LocalBroadcastManager |
| 21 | import com.google.android.material.appbar.AppBarLayout | ||
| 22 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 20 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 23 | import com.google.android.material.progressindicator.LinearProgressIndicator | ||
| 24 | import org.yuzu.yuzu_emu.NativeLibrary | 21 | import org.yuzu.yuzu_emu.NativeLibrary |
| 25 | import org.yuzu.yuzu_emu.R | 22 | import org.yuzu.yuzu_emu.R |
| 23 | import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding | ||
| 24 | import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding | ||
| 26 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 25 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 27 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsFragment.Companion.newInstance | 26 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsFragment.Companion.newInstance |
| 28 | import org.yuzu.yuzu_emu.utils.* | 27 | import 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 | |||
| 9 | import android.icu.util.TimeZone | 9 | import android.icu.util.TimeZone |
| 10 | import android.text.format.DateFormat | 10 | import android.text.format.DateFormat |
| 11 | import android.view.LayoutInflater | 11 | import android.view.LayoutInflater |
| 12 | import android.view.View | ||
| 13 | import android.view.ViewGroup | 12 | import android.view.ViewGroup |
| 14 | import android.widget.TextView | 13 | import android.widget.TextView |
| 15 | import androidx.appcompat.app.AlertDialog | 14 | import androidx.appcompat.app.AlertDialog |
| @@ -20,6 +19,10 @@ import com.google.android.material.slider.Slider | |||
| 20 | import com.google.android.material.timepicker.MaterialTimePicker | 19 | import com.google.android.material.timepicker.MaterialTimePicker |
| 21 | import com.google.android.material.timepicker.TimeFormat | 20 | import com.google.android.material.timepicker.TimeFormat |
| 22 | import org.yuzu.yuzu_emu.R | 21 | import org.yuzu.yuzu_emu.R |
| 22 | import org.yuzu.yuzu_emu.databinding.DialogSliderBinding | ||
| 23 | import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding | ||
| 24 | import org.yuzu.yuzu_emu.databinding.ListItemSettingSwitchBinding | ||
| 25 | import org.yuzu.yuzu_emu.databinding.ListItemSettingsHeaderBinding | ||
| 23 | import org.yuzu.yuzu_emu.features.settings.model.FloatSetting | 26 | import org.yuzu.yuzu_emu.features.settings.model.FloatSetting |
| 24 | import org.yuzu.yuzu_emu.features.settings.model.view.* | 27 | import org.yuzu.yuzu_emu.features.settings.model.view.* |
| 25 | import org.yuzu.yuzu_emu.features.settings.ui.viewholder.* | 28 | import 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 | |||
| 14 | import androidx.fragment.app.Fragment | 14 | import androidx.fragment.app.Fragment |
| 15 | import androidx.fragment.app.FragmentActivity | 15 | import androidx.fragment.app.FragmentActivity |
| 16 | import androidx.recyclerview.widget.LinearLayoutManager | 16 | import androidx.recyclerview.widget.LinearLayoutManager |
| 17 | import androidx.recyclerview.widget.RecyclerView | ||
| 18 | import com.google.android.material.divider.MaterialDividerItemDecoration | 17 | import com.google.android.material.divider.MaterialDividerItemDecoration |
| 19 | import org.yuzu.yuzu_emu.R | 18 | import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding |
| 20 | import org.yuzu.yuzu_emu.features.settings.model.Setting | 19 | import org.yuzu.yuzu_emu.features.settings.model.Setting |
| 21 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 20 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 22 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 21 | import 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 @@ | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder | 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder |
| 5 | 5 | ||
| 6 | import android.view.View | 6 | import android.view.View |
| 7 | import android.widget.TextView | 7 | import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding |
| 8 | import org.yuzu.yuzu_emu.R | ||
| 9 | import org.yuzu.yuzu_emu.features.settings.model.view.DateTimeSetting | 8 | import org.yuzu.yuzu_emu.features.settings.model.view.DateTimeSetting |
| 10 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 11 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter | 10 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter |
| 12 | 11 | ||
| 13 | class DateTimeViewHolder(itemView: View, adapter: SettingsAdapter) : | 12 | class 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 @@ | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder | 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder |
| 5 | 5 | ||
| 6 | import android.view.View | 6 | import android.view.View |
| 7 | import android.widget.TextView | 7 | import org.yuzu.yuzu_emu.databinding.ListItemSettingsHeaderBinding |
| 8 | import org.yuzu.yuzu_emu.R | ||
| 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 8 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 10 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter | 9 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter |
| 11 | 10 | ||
| 12 | class HeaderViewHolder(itemView: View, adapter: SettingsAdapter) : | 11 | class 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 @@ | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder | 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder |
| 5 | 5 | ||
| 6 | import android.view.View | 6 | import android.view.View |
| 7 | import android.widget.TextView | 7 | import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding |
| 8 | import org.yuzu.yuzu_emu.R | ||
| 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 8 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 10 | import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting | 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting |
| 11 | import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting | 10 | import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting |
| 12 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter | 11 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter |
| 13 | 12 | ||
| 14 | class SingleChoiceViewHolder(itemView: View, adapter: SettingsAdapter) : | 13 | class 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 @@ | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder | 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder |
| 5 | 5 | ||
| 6 | import android.view.View | 6 | import android.view.View |
| 7 | import android.widget.TextView | 7 | import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding |
| 8 | import org.yuzu.yuzu_emu.R | ||
| 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 8 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 10 | import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting | 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting |
| 11 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter | 10 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter |
| 12 | 11 | ||
| 13 | class SliderViewHolder(itemView: View, adapter: SettingsAdapter) : SettingViewHolder(itemView, adapter) { | 12 | class 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 @@ | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder | 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder |
| 5 | 5 | ||
| 6 | import android.view.View | 6 | import android.view.View |
| 7 | import android.widget.TextView | 7 | import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding |
| 8 | import org.yuzu.yuzu_emu.R | ||
| 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 8 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 10 | import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting | 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting |
| 11 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter | 10 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter |
| 12 | 11 | ||
| 13 | class SubmenuViewHolder(itemView: View, adapter: SettingsAdapter) : | 12 | class 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 | ||
| 6 | import android.view.View | 6 | import android.view.View |
| 7 | import android.widget.CompoundButton | 7 | import android.widget.CompoundButton |
| 8 | import android.widget.TextView | 8 | import org.yuzu.yuzu_emu.databinding.ListItemSettingSwitchBinding |
| 9 | import com.google.android.material.materialswitch.MaterialSwitch | ||
| 10 | import org.yuzu.yuzu_emu.R | ||
| 11 | import org.yuzu.yuzu_emu.features.settings.model.view.SwitchSetting | 9 | import org.yuzu.yuzu_emu.features.settings.model.view.SwitchSetting |
| 12 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 10 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 13 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter | 11 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter |
| 14 | 12 | ||
| 15 | class SwitchSettingViewHolder(itemView: View, adapter: SettingsAdapter) : | 13 | class 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 | |||
| 10 | import android.os.Bundle | 10 | import android.os.Bundle |
| 11 | import android.os.Handler | 11 | import android.os.Handler |
| 12 | import android.view.* | 12 | import android.view.* |
| 13 | import android.widget.Button | ||
| 14 | import android.widget.TextView | ||
| 15 | import android.widget.Toast | 13 | import android.widget.Toast |
| 16 | import androidx.fragment.app.Fragment | 14 | import androidx.fragment.app.Fragment |
| 17 | import androidx.localbroadcastmanager.content.LocalBroadcastManager | 15 | import androidx.localbroadcastmanager.content.LocalBroadcastManager |
| @@ -20,8 +18,8 @@ import org.yuzu.yuzu_emu.NativeLibrary | |||
| 20 | import org.yuzu.yuzu_emu.R | 18 | import org.yuzu.yuzu_emu.R |
| 21 | import org.yuzu.yuzu_emu.YuzuApplication | 19 | import org.yuzu.yuzu_emu.YuzuApplication |
| 22 | import org.yuzu.yuzu_emu.activities.EmulationActivity | 20 | import org.yuzu.yuzu_emu.activities.EmulationActivity |
| 21 | import org.yuzu.yuzu_emu.databinding.FragmentEmulationBinding | ||
| 23 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 22 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 24 | import org.yuzu.yuzu_emu.overlay.InputOverlay | ||
| 25 | import org.yuzu.yuzu_emu.utils.DirectoryInitialization | 23 | import org.yuzu.yuzu_emu.utils.DirectoryInitialization |
| 26 | import org.yuzu.yuzu_emu.utils.DirectoryInitialization.DirectoryInitializationState | 24 | import org.yuzu.yuzu_emu.utils.DirectoryInitialization.DirectoryInitializationState |
| 27 | import org.yuzu.yuzu_emu.utils.DirectoryStateReceiver | 25 | import org.yuzu.yuzu_emu.utils.DirectoryStateReceiver |
| @@ -29,13 +27,14 @@ import org.yuzu.yuzu_emu.utils.Log | |||
| 29 | 27 | ||
| 30 | class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.FrameCallback { | 28 | class 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 | |||
| 10 | import android.view.Menu | 10 | import android.view.Menu |
| 11 | import android.view.MenuItem | 11 | import android.view.MenuItem |
| 12 | import android.view.View | 12 | import android.view.View |
| 13 | import android.widget.FrameLayout | ||
| 14 | import android.widget.Toast | 13 | import android.widget.Toast |
| 15 | import androidx.appcompat.app.AppCompatActivity | 14 | import androidx.appcompat.app.AppCompatActivity |
| 16 | import androidx.appcompat.widget.Toolbar | ||
| 17 | import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen | 15 | import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen |
| 18 | import androidx.core.view.ViewCompat | 16 | import androidx.core.view.ViewCompat |
| 19 | import androidx.core.view.WindowCompat | 17 | import androidx.core.view.WindowCompat |
| 20 | import androidx.core.view.WindowInsetsCompat | 18 | import androidx.core.view.WindowInsetsCompat |
| 21 | import androidx.core.view.updatePadding | 19 | import androidx.core.view.updatePadding |
| 22 | import com.google.android.material.appbar.AppBarLayout | ||
| 23 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 20 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 24 | import org.yuzu.yuzu_emu.NativeLibrary | 21 | import org.yuzu.yuzu_emu.NativeLibrary |
| 25 | import org.yuzu.yuzu_emu.R | 22 | import org.yuzu.yuzu_emu.R |
| 26 | import org.yuzu.yuzu_emu.activities.EmulationActivity | 23 | import org.yuzu.yuzu_emu.activities.EmulationActivity |
| 24 | import org.yuzu.yuzu_emu.databinding.ActivityMainBinding | ||
| 27 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity | 25 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity |
| 28 | import org.yuzu.yuzu_emu.model.GameProvider | 26 | import org.yuzu.yuzu_emu.model.GameProvider |
| 29 | import org.yuzu.yuzu_emu.ui.platform.PlatformGamesFragment | 27 | import org.yuzu.yuzu_emu.ui.platform.PlatformGamesFragment |
| 30 | import org.yuzu.yuzu_emu.utils.* | 28 | import org.yuzu.yuzu_emu.utils.* |
| 31 | 29 | ||
| 32 | class MainActivity : AppCompatActivity(), MainView { | 30 | class 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 | |||
| 9 | import android.view.View | 9 | import android.view.View |
| 10 | import android.view.ViewGroup | 10 | import android.view.ViewGroup |
| 11 | import android.view.ViewTreeObserver.OnGlobalLayoutListener | 11 | import android.view.ViewTreeObserver.OnGlobalLayoutListener |
| 12 | import android.widget.TextView | ||
| 13 | import androidx.appcompat.app.AppCompatActivity | 12 | import androidx.appcompat.app.AppCompatActivity |
| 14 | import androidx.core.view.ViewCompat | 13 | import androidx.core.view.ViewCompat |
| 15 | import androidx.core.view.WindowInsetsCompat | 14 | import androidx.core.view.WindowInsetsCompat |
| 16 | import androidx.core.view.updatePadding | 15 | import androidx.core.view.updatePadding |
| 17 | import androidx.fragment.app.Fragment | 16 | import androidx.fragment.app.Fragment |
| 18 | import androidx.recyclerview.widget.GridLayoutManager | 17 | import androidx.recyclerview.widget.GridLayoutManager |
| 19 | import androidx.recyclerview.widget.RecyclerView | ||
| 20 | import androidx.swiperefreshlayout.widget.SwipeRefreshLayout | ||
| 21 | import com.google.android.material.color.MaterialColors | 18 | import com.google.android.material.color.MaterialColors |
| 22 | import org.yuzu.yuzu_emu.R | 19 | import org.yuzu.yuzu_emu.R |
| 23 | import org.yuzu.yuzu_emu.YuzuApplication | 20 | import org.yuzu.yuzu_emu.YuzuApplication |
| 24 | import org.yuzu.yuzu_emu.adapters.GameAdapter | 21 | import org.yuzu.yuzu_emu.adapters.GameAdapter |
| 22 | import org.yuzu.yuzu_emu.databinding.FragmentGridBinding | ||
| 25 | 23 | ||
| 26 | class PlatformGamesFragment : Fragment(), PlatformGamesView { | 24 | class 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 | ||
| 4 | package org.yuzu.yuzu_emu.viewholders | 4 | package org.yuzu.yuzu_emu.viewholders |
| 5 | 5 | ||
| 6 | import android.view.View | ||
| 7 | import android.widget.ImageView | ||
| 8 | import android.widget.TextView | ||
| 9 | import androidx.recyclerview.widget.RecyclerView | 6 | import androidx.recyclerview.widget.RecyclerView |
| 10 | import org.yuzu.yuzu_emu.R | 7 | import org.yuzu.yuzu_emu.databinding.CardGameBinding |
| 8 | import org.yuzu.yuzu_emu.model.Game | ||
| 11 | 9 | ||
| 12 | /** | 10 | class 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 | */ | ||
| 16 | class 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 | } |