diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches.java deleted file mode 100644 index 6d2ff51b6b..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches.java +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.features.riivolution.model; - -import androidx.annotation.Keep; - -public class RiivolutionPatches -{ - private String mGameId; - private int mRevision; - private int mDiscNumber; - - private boolean mUnsavedChanges = false; - - @Keep - private long mPointer; - - public RiivolutionPatches(String gameId, int revision, int discNumber) - { - mGameId = gameId; - mRevision = revision; - mDiscNumber = discNumber; - - mPointer = initialize(); - } - - @Override - public native void finalize(); - - private static native long initialize(); - - public native int getDiscCount(); - - public native String getDiscName(int discIndex); - - public native int getSectionCount(int discIndex); - - public native String getSectionName(int discIndex, int sectionIndex); - - public native int getOptionCount(int discIndex, int sectionIndex); - - public native String getOptionName(int discIndex, int sectionIndex, int optionIndex); - - public native int getChoiceCount(int discIndex, int sectionIndex, int optionIndex); - - public native String getChoiceName(int discIndex, int sectionIndex, int optionIndex, - int choiceIndex); - - /** - * @return 0 if no choice is selected, otherwise the index of the selected choice plus one. - */ - public native int getSelectedChoice(int discIndex, int sectionIndex, int optionIndex); - - /** - * @param choiceIndex 0 to select no choice, otherwise the choice index plus one. - */ - public void setSelectedChoice(int discIndex, int sectionIndex, int optionIndex, int choiceIndex) - { - mUnsavedChanges = true; - setSelectedChoiceImpl(discIndex, sectionIndex, optionIndex, choiceIndex); - } - - /** - * @param choiceIndex 0 to select no choice, otherwise the choice index plus one. - */ - private native void setSelectedChoiceImpl(int discIndex, int sectionIndex, int optionIndex, - int choiceIndex); - - public void loadConfig() - { - loadConfigImpl(mGameId, mRevision, mDiscNumber); - } - - private native void loadConfigImpl(String gameId, int revision, int discNumber); - - public void saveConfig() - { - if (mUnsavedChanges) - { - mUnsavedChanges = false; - saveConfigImpl(mGameId); - } - } - - private native void saveConfigImpl(String gameId); -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches.kt new file mode 100644 index 0000000000..ba3fd41d64 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches.kt @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.riivolution.model + +import androidx.annotation.Keep + +class RiivolutionPatches( + private val gameId: String, + private val revision: Int, + private val discNumber: Int +) { + private var unsavedChanges = false + + @Keep + private val pointer: Long = initialize() + + external fun finalize() + + external fun getDiscCount(): Int + + external fun getDiscName(discIndex: Int): String + + external fun getSectionCount(discIndex: Int): Int + + external fun getSectionName(discIndex: Int, sectionIndex: Int): String + + external fun getOptionCount(discIndex: Int, sectionIndex: Int): Int + + external fun getOptionName(discIndex: Int, sectionIndex: Int, optionIndex: Int): String + + external fun getChoiceCount(discIndex: Int, sectionIndex: Int, optionIndex: Int): Int + + external fun getChoiceName( + discIndex: Int, + sectionIndex: Int, + optionIndex: Int, + choiceIndex: Int + ): String + + /** + * @return 0 if no choice is selected, otherwise the index of the selected choice plus one. + */ + external fun getSelectedChoice(discIndex: Int, sectionIndex: Int, optionIndex: Int): Int + + /** + * @param choiceIndex 0 to select no choice, otherwise the choice index plus one. + */ + fun setSelectedChoice(discIndex: Int, sectionIndex: Int, optionIndex: Int, choiceIndex: Int) { + unsavedChanges = true + setSelectedChoiceImpl(discIndex, sectionIndex, optionIndex, choiceIndex) + } + + /** + * @param choiceIndex 0 to select no choice, otherwise the choice index plus one. + */ + private external fun setSelectedChoiceImpl( + discIndex: Int, sectionIndex: Int, optionIndex: Int, + choiceIndex: Int + ) + + fun loadConfig() { + loadConfigImpl(gameId, revision, discNumber) + } + + private external fun loadConfigImpl(gameId: String, revision: Int, discNumber: Int) + + fun saveConfig() { + if (unsavedChanges) { + unsavedChanges = false + saveConfigImpl(gameId) + } + } + + private external fun saveConfigImpl(gameId: String) + + companion object { + @JvmStatic + private external fun initialize(): Long + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionAdapter.java deleted file mode 100644 index 68c209cc0c..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionAdapter.java +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.features.riivolution.ui; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import org.dolphinemu.dolphinemu.databinding.ListItemRiivolutionBinding; -import org.dolphinemu.dolphinemu.features.riivolution.model.RiivolutionPatches; - -import java.util.ArrayList; - -public class RiivolutionAdapter extends RecyclerView.Adapter -{ - private final Context mContext; - private final RiivolutionPatches mPatches; - private final ArrayList mItems = new ArrayList<>(); - - public RiivolutionAdapter(Context context, RiivolutionPatches patches) - { - mContext = context; - mPatches = patches; - - int discCount = mPatches.getDiscCount(); - for (int i = 0; i < discCount; i++) - { - mItems.add(new RiivolutionItem(i)); - - int sectionCount = mPatches.getSectionCount(i); - for (int j = 0; j < sectionCount; j++) - { - mItems.add(new RiivolutionItem(i, j)); - - int optionCount = mPatches.getOptionCount(i, j); - for (int k = 0; k < optionCount; k++) - { - mItems.add(new RiivolutionItem(i, j, k)); - } - } - } - } - - @NonNull @Override - public RiivolutionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) - { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - ListItemRiivolutionBinding binding = ListItemRiivolutionBinding.inflate(inflater); - return new RiivolutionViewHolder(binding.getRoot(), binding); - } - - @Override - public void onBindViewHolder(@NonNull RiivolutionViewHolder holder, int position) - { - holder.bind(mContext, mPatches, mItems.get(position)); - } - - @Override - public int getItemCount() - { - return mItems.size(); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionAdapter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionAdapter.kt new file mode 100644 index 0000000000..9cae2f0bae --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionAdapter.kt @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.riivolution.ui + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.dolphinemu.dolphinemu.databinding.ListItemRiivolutionBinding +import org.dolphinemu.dolphinemu.features.riivolution.model.RiivolutionPatches + +class RiivolutionAdapter(private val context: Context, private val patches: RiivolutionPatches) : + RecyclerView.Adapter() { + private val items = ArrayList() + + init { + val discCount = patches.getDiscCount() + for (i in 0 until discCount) { + items.add(RiivolutionItem(i)) + + val sectionCount = patches.getSectionCount(i) + for (j in 0 until sectionCount) { + items.add(RiivolutionItem(i, j)) + + val optionCount = patches.getOptionCount(i, j) + for (k in 0 until optionCount) { + items.add(RiivolutionItem(i, j, k)) + } + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RiivolutionViewHolder { + val inflater = LayoutInflater.from(parent.context) + val binding = ListItemRiivolutionBinding.inflate(inflater) + return RiivolutionViewHolder(binding.root, binding) + } + + override fun onBindViewHolder(holder: RiivolutionViewHolder, position: Int) { + holder.bind(context, patches, items[position]) + } + + override fun getItemCount(): Int { + return items.size + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionBootActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionBootActivity.java deleted file mode 100644 index ffcfa8e2f1..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionBootActivity.java +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.features.riivolution.ui; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowCompat; -import androidx.core.view.WindowInsetsCompat; -import androidx.recyclerview.widget.LinearLayoutManager; - -import com.google.android.material.color.MaterialColors; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.activities.EmulationActivity; -import org.dolphinemu.dolphinemu.databinding.ActivityRiivolutionBootBinding; -import org.dolphinemu.dolphinemu.features.riivolution.model.RiivolutionPatches; -import org.dolphinemu.dolphinemu.features.settings.model.StringSetting; -import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; -import org.dolphinemu.dolphinemu.utils.InsetsHelper; -import org.dolphinemu.dolphinemu.utils.ThemeHelper; - -public class RiivolutionBootActivity extends AppCompatActivity -{ - private static final String ARG_GAME_PATH = "game_path"; - private static final String ARG_GAME_ID = "game_id"; - private static final String ARG_REVISION = "revision"; - private static final String ARG_DISC_NUMBER = "disc_number"; - - private RiivolutionPatches mPatches; - - private ActivityRiivolutionBootBinding mBinding; - - public static void launch(Context context, String gamePath, String gameId, int revision, - int discNumber) - { - Intent launcher = new Intent(context, RiivolutionBootActivity.class); - launcher.putExtra(ARG_GAME_PATH, gamePath); - launcher.putExtra(ARG_GAME_ID, gameId); - launcher.putExtra(ARG_REVISION, revision); - launcher.putExtra(ARG_DISC_NUMBER, discNumber); - context.startActivity(launcher); - } - - @Override - protected void onCreate(Bundle savedInstanceState) - { - ThemeHelper.setTheme(this); - - super.onCreate(savedInstanceState); - - mBinding = ActivityRiivolutionBootBinding.inflate(getLayoutInflater()); - setContentView(mBinding.getRoot()); - - WindowCompat.setDecorFitsSystemWindows(getWindow(), false); - - Intent intent = getIntent(); - - String path = getIntent().getStringExtra(ARG_GAME_PATH); - String gameId = intent.getStringExtra(ARG_GAME_ID); - int revision = intent.getIntExtra(ARG_REVISION, -1); - int discNumber = intent.getIntExtra(ARG_DISC_NUMBER, -1); - - String loadPath = StringSetting.MAIN_LOAD_PATH.getStringGlobal(); - if (loadPath.isEmpty()) - loadPath = DirectoryInitialization.getUserDirectory() + "/Load"; - - mBinding.textSdRoot.setText(getString(R.string.riivolution_sd_root, loadPath + "/Riivolution")); - - mBinding.buttonStart.setOnClickListener((v) -> - { - if (mPatches != null) - mPatches.saveConfig(); - - EmulationActivity.launch(this, path, true); - }); - - new Thread(() -> - { - RiivolutionPatches patches = new RiivolutionPatches(gameId, revision, discNumber); - patches.loadConfig(); - runOnUiThread(() -> populateList(patches)); - }).start(); - - mBinding.toolbarRiivolution.setTitle(getString(R.string.riivolution_riivolution)); - setSupportActionBar(mBinding.toolbarRiivolution); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - setInsets(); - ThemeHelper.enableScrollTint(this, mBinding.toolbarRiivolution, mBinding.appbarRiivolution); - } - - @Override - protected void onStop() - { - super.onStop(); - - if (mPatches != null) - mPatches.saveConfig(); - } - - @Override - public boolean onSupportNavigateUp() - { - onBackPressed(); - return true; - } - - private void populateList(RiivolutionPatches patches) - { - mPatches = patches; - - mBinding.recyclerView.setAdapter(new RiivolutionAdapter(this, patches)); - mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this)); - } - - private void setInsets() - { - ViewCompat.setOnApplyWindowInsetsListener(mBinding.appbarRiivolution, (v, windowInsets) -> - { - Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - - InsetsHelper.insetAppBar(insets, mBinding.appbarRiivolution); - - mBinding.scrollViewRiivolution.setPadding(insets.left, 0, insets.right, insets.bottom); - - InsetsHelper.applyNavbarWorkaround(insets.bottom, mBinding.workaroundView); - ThemeHelper.setNavigationBarColor(this, - MaterialColors.getColor(mBinding.appbarRiivolution, R.attr.colorSurface)); - - return windowInsets; - }); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionBootActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionBootActivity.kt new file mode 100644 index 0000000000..a4d33badab --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionBootActivity.kt @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.riivolution.ui + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.color.MaterialColors +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.dolphinemu.dolphinemu.R +import org.dolphinemu.dolphinemu.activities.EmulationActivity +import org.dolphinemu.dolphinemu.databinding.ActivityRiivolutionBootBinding +import org.dolphinemu.dolphinemu.features.riivolution.model.RiivolutionPatches +import org.dolphinemu.dolphinemu.features.settings.model.StringSetting +import org.dolphinemu.dolphinemu.utils.DirectoryInitialization +import org.dolphinemu.dolphinemu.utils.InsetsHelper +import org.dolphinemu.dolphinemu.utils.ThemeHelper + +class RiivolutionBootActivity : AppCompatActivity() { + private var patches: RiivolutionPatches? = null + private lateinit var binding: ActivityRiivolutionBootBinding + + override fun onCreate(savedInstanceState: Bundle?) { + ThemeHelper.setTheme(this) + + super.onCreate(savedInstanceState) + + binding = ActivityRiivolutionBootBinding.inflate(layoutInflater) + setContentView(binding.root) + + WindowCompat.setDecorFitsSystemWindows(window, false) + + val path = intent.getStringExtra(ARG_GAME_PATH) + val gameId = intent.getStringExtra(ARG_GAME_ID) + val revision = intent.getIntExtra(ARG_REVISION, -1) + val discNumber = intent.getIntExtra(ARG_DISC_NUMBER, -1) + + var loadPath = StringSetting.MAIN_LOAD_PATH.stringGlobal + if (loadPath.isEmpty()) loadPath = DirectoryInitialization.getUserDirectory() + "/Load" + + binding.textSdRoot.text = getString(R.string.riivolution_sd_root, "$loadPath/Riivolution") + binding.buttonStart.setOnClickListener { + if (patches != null) patches!!.saveConfig() + EmulationActivity.launch(this, path, true) + } + + lifecycleScope.launch { + withContext(Dispatchers.IO) { + val patches = RiivolutionPatches(gameId!!, revision, discNumber) + patches.loadConfig() + withContext(Dispatchers.Main) { + populateList(patches) + } + } + } + + binding.toolbarRiivolution.title = getString(R.string.riivolution_riivolution) + setSupportActionBar(binding.toolbarRiivolution) + supportActionBar!!.setDisplayHomeAsUpEnabled(true) + + setInsets() + ThemeHelper.enableScrollTint(this, binding.toolbarRiivolution, binding.appbarRiivolution) + } + + override fun onStop() { + super.onStop() + if (patches != null) patches!!.saveConfig() + } + + override fun onSupportNavigateUp(): Boolean { + onBackPressed() + return true + } + + private fun populateList(patches: RiivolutionPatches) { + this.patches = patches + binding.recyclerView.adapter = RiivolutionAdapter(this, patches) + binding.recyclerView.layoutManager = LinearLayoutManager(this) + } + + private fun setInsets() { + ViewCompat.setOnApplyWindowInsetsListener(binding.appbarRiivolution) { v: View?, windowInsets: WindowInsetsCompat -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + InsetsHelper.insetAppBar(insets, binding.appbarRiivolution) + + binding.scrollViewRiivolution.setPadding(insets.left, 0, insets.right, insets.bottom) + + InsetsHelper.applyNavbarWorkaround(insets.bottom, binding.workaroundView) + ThemeHelper.setNavigationBarColor( + this, + MaterialColors.getColor(binding.appbarRiivolution, R.attr.colorSurface) + ) + + windowInsets + } + } + + companion object { + private const val ARG_GAME_PATH = "game_path" + private const val ARG_GAME_ID = "game_id" + private const val ARG_REVISION = "revision" + private const val ARG_DISC_NUMBER = "disc_number" + + @JvmStatic + fun launch( + context: Context, + gamePath: String?, + gameId: String?, + revision: Int, + discNumber: Int + ) { + val launcher = Intent(context, RiivolutionBootActivity::class.java) + launcher.putExtra(ARG_GAME_PATH, gamePath) + launcher.putExtra(ARG_GAME_ID, gameId) + launcher.putExtra(ARG_REVISION, revision) + launcher.putExtra(ARG_DISC_NUMBER, discNumber) + context.startActivity(launcher) + } + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionItem.java deleted file mode 100644 index 8d2ef17e5b..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionItem.java +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.features.riivolution.ui; - -public class RiivolutionItem -{ - public final int mDiscIndex; - public final int mSectionIndex; - public final int mOptionIndex; - - /** - * Constructor for a disc. - */ - public RiivolutionItem(int discIndex) - { - mDiscIndex = discIndex; - mSectionIndex = -1; - mOptionIndex = -1; - } - - /** - * Constructor for a section. - */ - public RiivolutionItem(int discIndex, int sectionIndex) - { - mDiscIndex = discIndex; - mSectionIndex = sectionIndex; - mOptionIndex = -1; - } - - /** - * Constructor for an option. - */ - public RiivolutionItem(int discIndex, int sectionIndex, int optionIndex) - { - mDiscIndex = discIndex; - mSectionIndex = sectionIndex; - mOptionIndex = optionIndex; - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionItem.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionItem.kt new file mode 100644 index 0000000000..61e5c30f35 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionItem.kt @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.riivolution.ui + +class RiivolutionItem { + val mDiscIndex: Int + val mSectionIndex: Int + val mOptionIndex: Int + + /** + * Constructor for a disc. + */ + constructor(discIndex: Int) { + mDiscIndex = discIndex + mSectionIndex = -1 + mOptionIndex = -1 + } + + /** + * Constructor for a section. + */ + constructor(discIndex: Int, sectionIndex: Int) { + mDiscIndex = discIndex + mSectionIndex = sectionIndex + mOptionIndex = -1 + } + + /** + * Constructor for an option. + */ + constructor(discIndex: Int, sectionIndex: Int, optionIndex: Int) { + mDiscIndex = discIndex + mSectionIndex = sectionIndex + mOptionIndex = optionIndex + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionViewHolder.java deleted file mode 100644 index 4a8c4f383f..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionViewHolder.java +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.features.riivolution.ui; - -import android.content.Context; -import android.view.View; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.databinding.ListItemRiivolutionBinding; -import org.dolphinemu.dolphinemu.features.riivolution.model.RiivolutionPatches; - -public class RiivolutionViewHolder extends RecyclerView.ViewHolder - implements AdapterView.OnItemClickListener -{ - private final ListItemRiivolutionBinding mBinding; - - private RiivolutionPatches mPatches; - private RiivolutionItem mItem; - - public RiivolutionViewHolder(@NonNull View itemView, ListItemRiivolutionBinding binding) - { - super(itemView); - mBinding = binding; - } - - public void bind(Context context, RiivolutionPatches patches, RiivolutionItem item) - { - // TODO: Remove workaround for text filtering issue in material components when fixed - // https://github.com/material-components/material-components-android/issues/1464 - mBinding.dropdownChoice.setSaveEnabled(false); - - String text; - if (item.mOptionIndex != -1) - { - mBinding.textName.setVisibility(View.GONE); - text = patches.getOptionName(item.mDiscIndex, item.mSectionIndex, item.mOptionIndex); - mBinding.layoutChoice.setHint(text); - } - else if (item.mSectionIndex != -1) - { - mBinding.textName.setTextAppearance(context, R.style.TextAppearance_AppCompat_Medium); - mBinding.layoutChoice.setVisibility(View.GONE); - text = patches.getSectionName(item.mDiscIndex, item.mSectionIndex); - } - else - { - mBinding.layoutChoice.setVisibility(View.GONE); - text = patches.getDiscName(item.mDiscIndex); - } - mBinding.textName.setText(text); - - if (item.mOptionIndex != -1) - { - mPatches = patches; - mItem = item; - - ArrayAdapter adapter = new ArrayAdapter<>(context, - R.layout.support_simple_spinner_dropdown_item); - - int choiceCount = - patches.getChoiceCount(mItem.mDiscIndex, mItem.mSectionIndex, mItem.mOptionIndex); - adapter.add(context.getString(R.string.riivolution_disabled)); - for (int i = 0; i < choiceCount; i++) - { - adapter.add(patches.getChoiceName(mItem.mDiscIndex, mItem.mSectionIndex, mItem.mOptionIndex, - i)); - } - - mBinding.dropdownChoice.setAdapter(adapter); - mBinding.dropdownChoice.setText(adapter.getItem( - patches.getSelectedChoice(mItem.mDiscIndex, mItem.mSectionIndex, mItem.mOptionIndex)), - false); - mBinding.dropdownChoice.setOnItemClickListener(this); - } - } - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) - { - mPatches.setSelectedChoice(mItem.mDiscIndex, mItem.mSectionIndex, mItem.mOptionIndex, position); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionViewHolder.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionViewHolder.kt new file mode 100644 index 0000000000..8406fac346 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/riivolution/ui/RiivolutionViewHolder.kt @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.riivolution.ui + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import android.widget.AdapterView.OnItemClickListener +import android.widget.ArrayAdapter +import androidx.recyclerview.widget.RecyclerView +import org.dolphinemu.dolphinemu.R +import org.dolphinemu.dolphinemu.databinding.ListItemRiivolutionBinding +import org.dolphinemu.dolphinemu.features.riivolution.model.RiivolutionPatches + +class RiivolutionViewHolder(itemView: View, private val binding: ListItemRiivolutionBinding) : + RecyclerView.ViewHolder(itemView), OnItemClickListener { + private lateinit var patches: RiivolutionPatches + private lateinit var item: RiivolutionItem + + fun bind(context: Context, patches: RiivolutionPatches, item: RiivolutionItem) { + // TODO: Remove workaround for text filtering issue in material components when fixed + // https://github.com/material-components/material-components-android/issues/1464 + binding.dropdownChoice.isSaveEnabled = false + + val text: String + if (item.mOptionIndex != -1) { + binding.textName.visibility = View.GONE + text = patches.getOptionName(item.mDiscIndex, item.mSectionIndex, item.mOptionIndex) + binding.layoutChoice.hint = text + } else if (item.mSectionIndex != -1) { + // TODO: Use supported version of setTextAppearance when min requirement is API 23 + binding.textName.setTextAppearance(context, R.style.TextAppearance_AppCompat_Medium) + binding.layoutChoice.visibility = View.GONE + text = patches.getSectionName(item.mDiscIndex, item.mSectionIndex) + } else { + binding.layoutChoice.visibility = View.GONE + text = patches.getDiscName(item.mDiscIndex) + } + binding.textName.text = text + + if (item.mOptionIndex != -1) { + this.patches = patches + this.item = item + val adapter = ArrayAdapter( + context, + R.layout.support_simple_spinner_dropdown_item + ) + val choiceCount = patches.getChoiceCount( + item.mDiscIndex, + item.mSectionIndex, + item.mOptionIndex + ) + adapter.add(context.getString(R.string.riivolution_disabled)) + for (i in 0 until choiceCount) { + adapter.add( + patches.getChoiceName( + item.mDiscIndex, + item.mSectionIndex, + item.mOptionIndex, + i + ) + ) + } + + binding.dropdownChoice.setAdapter(adapter) + binding.dropdownChoice.setText( + adapter.getItem( + patches.getSelectedChoice( + item.mDiscIndex, + item.mSectionIndex, + item.mOptionIndex + ) + ), false + ) + binding.dropdownChoice.onItemClickListener = this + } + } + + override fun onItemClick(parent: AdapterView<*>?, view: View, position: Int, id: Long) { + patches.setSelectedChoice( + item.mDiscIndex, + item.mSectionIndex, + item.mOptionIndex, + position + ) + } +} diff --git a/Source/Android/jni/AndroidCommon/IDCache.cpp b/Source/Android/jni/AndroidCommon/IDCache.cpp index 31511b485c..6d23727953 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.cpp +++ b/Source/Android/jni/AndroidCommon/IDCache.cpp @@ -539,7 +539,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) env->FindClass("org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches"); s_riivolution_patches_class = reinterpret_cast(env->NewGlobalRef(riivolution_patches_class)); - s_riivolution_patches_pointer = env->GetFieldID(riivolution_patches_class, "mPointer", "J"); + s_riivolution_patches_pointer = env->GetFieldID(riivolution_patches_class, "pointer", "J"); env->DeleteLocalRef(riivolution_patches_class); const jclass wii_update_cb_class =