mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 13:27:45 -07:00
Android: Convert CheatsAdapter to Kotlin
This commit is contained in:
parent
23d9def613
commit
fcfde12c52
@ -1,176 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.cheats.ui;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.dolphinemu.dolphinemu.R;
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemCheatBinding;
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemHeaderBinding;
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemSubmenuBinding;
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.ARCheat;
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel;
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.GeckoCheat;
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.GraphicsMod;
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.PatchCheat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class CheatsAdapter extends RecyclerView.Adapter<CheatItemViewHolder>
|
||||
{
|
||||
private final CheatsActivity mActivity;
|
||||
private final CheatsViewModel mViewModel;
|
||||
|
||||
public CheatsAdapter(CheatsActivity activity, CheatsViewModel viewModel)
|
||||
{
|
||||
mActivity = activity;
|
||||
mViewModel = viewModel;
|
||||
|
||||
mViewModel.getCheatAddedEvent().observe(activity, (position) ->
|
||||
{
|
||||
if (position != null)
|
||||
notifyItemInserted(position);
|
||||
});
|
||||
|
||||
mViewModel.getCheatChangedEvent().observe(activity, (position) ->
|
||||
{
|
||||
if (position != null)
|
||||
notifyItemChanged(position);
|
||||
});
|
||||
|
||||
mViewModel.getCheatDeletedEvent().observe(activity, (position) ->
|
||||
{
|
||||
if (position != null)
|
||||
notifyItemRemoved(position);
|
||||
});
|
||||
|
||||
mViewModel.getGeckoCheatsDownloadedEvent().observe(activity, (cheatsAdded) ->
|
||||
{
|
||||
if (cheatsAdded != null)
|
||||
{
|
||||
int positionEnd = getItemCount() - 2; // Skip "Add Gecko Code" and "Download Gecko Codes"
|
||||
int positionStart = positionEnd - cheatsAdded;
|
||||
notifyItemRangeInserted(positionStart, cheatsAdded);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public CheatItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
|
||||
{
|
||||
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
|
||||
|
||||
switch (viewType)
|
||||
{
|
||||
case CheatItem.TYPE_CHEAT:
|
||||
ListItemCheatBinding listItemCheatBinding = ListItemCheatBinding.inflate(inflater);
|
||||
addViewListeners(listItemCheatBinding.getRoot());
|
||||
return new CheatViewHolder(listItemCheatBinding);
|
||||
case CheatItem.TYPE_HEADER:
|
||||
ListItemHeaderBinding listItemHeaderBinding = ListItemHeaderBinding.inflate(inflater);
|
||||
addViewListeners(listItemHeaderBinding.getRoot());
|
||||
return new HeaderViewHolder(listItemHeaderBinding);
|
||||
case CheatItem.TYPE_ACTION:
|
||||
ListItemSubmenuBinding listItemSubmenuBinding = ListItemSubmenuBinding.inflate(inflater);
|
||||
addViewListeners(listItemSubmenuBinding.getRoot());
|
||||
return new ActionViewHolder(listItemSubmenuBinding);
|
||||
default:
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull CheatItemViewHolder holder, int position)
|
||||
{
|
||||
holder.bind(mActivity, getItemAt(position), position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount()
|
||||
{
|
||||
return mViewModel.getGraphicsMods().size() + mViewModel.getPatchCheats().size() +
|
||||
mViewModel.getARCheats().size() + mViewModel.getGeckoCheats().size() + 8;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position)
|
||||
{
|
||||
return getItemAt(position).getType();
|
||||
}
|
||||
|
||||
private void addViewListeners(View view)
|
||||
{
|
||||
CheatsActivity.setOnFocusChangeListenerRecursively(view,
|
||||
(v, hasFocus) -> mActivity.onListViewFocusChange(hasFocus));
|
||||
}
|
||||
|
||||
private CheatItem getItemAt(int position)
|
||||
{
|
||||
// Graphics mods
|
||||
|
||||
if (position == 0)
|
||||
return new CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_graphics_mod);
|
||||
position -= 1;
|
||||
|
||||
ArrayList<GraphicsMod> graphicsMods = mViewModel.getGraphicsMods();
|
||||
if (position < graphicsMods.size())
|
||||
return new CheatItem(graphicsMods.get(position));
|
||||
position -= graphicsMods.size();
|
||||
|
||||
// Patches
|
||||
|
||||
if (position == 0)
|
||||
return new CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_patch);
|
||||
position -= 1;
|
||||
|
||||
ArrayList<PatchCheat> patchCheats = mViewModel.getPatchCheats();
|
||||
if (position < patchCheats.size())
|
||||
return new CheatItem(patchCheats.get(position));
|
||||
position -= patchCheats.size();
|
||||
|
||||
if (position == 0)
|
||||
return new CheatItem(CheatItem.TYPE_ACTION, R.string.cheats_add_patch);
|
||||
position -= 1;
|
||||
|
||||
// AR codes
|
||||
|
||||
if (position == 0)
|
||||
return new CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_ar);
|
||||
position -= 1;
|
||||
|
||||
ArrayList<ARCheat> arCheats = mViewModel.getARCheats();
|
||||
if (position < arCheats.size())
|
||||
return new CheatItem(arCheats.get(position));
|
||||
position -= arCheats.size();
|
||||
|
||||
if (position == 0)
|
||||
return new CheatItem(CheatItem.TYPE_ACTION, R.string.cheats_add_ar);
|
||||
position -= 1;
|
||||
|
||||
// Gecko codes
|
||||
|
||||
if (position == 0)
|
||||
return new CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_gecko);
|
||||
position -= 1;
|
||||
|
||||
ArrayList<GeckoCheat> geckoCheats = mViewModel.getGeckoCheats();
|
||||
if (position < geckoCheats.size())
|
||||
return new CheatItem(geckoCheats.get(position));
|
||||
position -= geckoCheats.size();
|
||||
|
||||
if (position == 0)
|
||||
return new CheatItem(CheatItem.TYPE_ACTION, R.string.cheats_add_gecko);
|
||||
position -= 1;
|
||||
|
||||
if (position == 0)
|
||||
return new CheatItem(CheatItem.TYPE_ACTION, R.string.cheats_download_gecko);
|
||||
|
||||
throw new IndexOutOfBoundsException();
|
||||
}
|
||||
}
|
@ -0,0 +1,138 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.cheats.ui
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import org.dolphinemu.dolphinemu.R
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemCheatBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemHeaderBinding
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemSubmenuBinding
|
||||
import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel
|
||||
import org.dolphinemu.dolphinemu.features.cheats.ui.CheatsActivity.Companion.setOnFocusChangeListenerRecursively
|
||||
|
||||
class CheatsAdapter(
|
||||
private val activity: CheatsActivity,
|
||||
private val viewModel: CheatsViewModel
|
||||
) : RecyclerView.Adapter<CheatItemViewHolder>() {
|
||||
init {
|
||||
viewModel.cheatAddedEvent.observe(activity) { position: Int? ->
|
||||
position?.let { notifyItemInserted(it) }
|
||||
}
|
||||
|
||||
viewModel.cheatChangedEvent.observe(activity) { position: Int? ->
|
||||
position?.let { notifyItemChanged(it) }
|
||||
}
|
||||
|
||||
viewModel.cheatDeletedEvent.observe(activity) { position: Int? ->
|
||||
position?.let { notifyItemRemoved(it) }
|
||||
}
|
||||
|
||||
viewModel.geckoCheatsDownloadedEvent.observe(activity) { cheatsAdded: Int? ->
|
||||
cheatsAdded?.let {
|
||||
val positionEnd = itemCount - 2 // Skip "Add Gecko Code" and "Download Gecko Codes"
|
||||
val positionStart = positionEnd - it
|
||||
notifyItemRangeInserted(positionStart, it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CheatItemViewHolder {
|
||||
val inflater = LayoutInflater.from(parent.context)
|
||||
return when (viewType) {
|
||||
CheatItem.TYPE_CHEAT -> {
|
||||
val listItemCheatBinding = ListItemCheatBinding.inflate(inflater)
|
||||
addViewListeners(listItemCheatBinding.getRoot())
|
||||
CheatViewHolder(listItemCheatBinding)
|
||||
}
|
||||
CheatItem.TYPE_HEADER -> {
|
||||
val listItemHeaderBinding = ListItemHeaderBinding.inflate(inflater)
|
||||
addViewListeners(listItemHeaderBinding.root)
|
||||
HeaderViewHolder(listItemHeaderBinding)
|
||||
}
|
||||
CheatItem.TYPE_ACTION -> {
|
||||
val listItemSubmenuBinding = ListItemSubmenuBinding.inflate(inflater)
|
||||
addViewListeners(listItemSubmenuBinding.root)
|
||||
ActionViewHolder(listItemSubmenuBinding)
|
||||
}
|
||||
else -> throw UnsupportedOperationException()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: CheatItemViewHolder, position: Int) {
|
||||
holder.bind(activity, getItemAt(position), position)
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return viewModel.graphicsMods.size + viewModel.patchCheats.size + viewModel.aRCheats.size +
|
||||
viewModel.geckoCheats.size + 8
|
||||
}
|
||||
|
||||
override fun getItemViewType(position: Int): Int {
|
||||
return getItemAt(position).type
|
||||
}
|
||||
|
||||
private fun addViewListeners(view: View) {
|
||||
setOnFocusChangeListenerRecursively(view) { _: View?, hasFocus: Boolean ->
|
||||
activity.onListViewFocusChange(
|
||||
hasFocus
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getItemAt(position: Int): CheatItem {
|
||||
// Graphics mods
|
||||
var itemPosition = position
|
||||
if (itemPosition == 0) return CheatItem(
|
||||
CheatItem.TYPE_HEADER,
|
||||
R.string.cheats_header_graphics_mod
|
||||
)
|
||||
itemPosition -= 1
|
||||
|
||||
val graphicsMods = viewModel.graphicsMods
|
||||
if (itemPosition < graphicsMods.size) return CheatItem(graphicsMods[itemPosition])
|
||||
itemPosition -= graphicsMods.size
|
||||
|
||||
// Patches
|
||||
if (itemPosition == 0) return CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_patch)
|
||||
itemPosition -= 1
|
||||
|
||||
val patchCheats = viewModel.patchCheats
|
||||
if (itemPosition < patchCheats.size) return CheatItem(patchCheats[itemPosition])
|
||||
itemPosition -= patchCheats.size
|
||||
|
||||
if (itemPosition == 0) return CheatItem(CheatItem.TYPE_ACTION, R.string.cheats_add_patch)
|
||||
itemPosition -= 1
|
||||
|
||||
// AR codes
|
||||
if (itemPosition == 0) return CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_ar)
|
||||
itemPosition -= 1
|
||||
|
||||
val arCheats = viewModel.aRCheats
|
||||
if (itemPosition < arCheats.size) return CheatItem(arCheats[itemPosition])
|
||||
itemPosition -= arCheats.size
|
||||
|
||||
if (itemPosition == 0) return CheatItem(CheatItem.TYPE_ACTION, R.string.cheats_add_ar)
|
||||
itemPosition -= 1
|
||||
|
||||
// Gecko codes
|
||||
if (itemPosition == 0) return CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_gecko)
|
||||
itemPosition -= 1
|
||||
|
||||
val geckoCheats = viewModel.geckoCheats
|
||||
if (itemPosition < geckoCheats.size) return CheatItem(geckoCheats[itemPosition])
|
||||
itemPosition -= geckoCheats.size
|
||||
|
||||
if (itemPosition == 0) return CheatItem(CheatItem.TYPE_ACTION, R.string.cheats_add_gecko)
|
||||
itemPosition -= 1
|
||||
|
||||
if (itemPosition == 0) return CheatItem(
|
||||
CheatItem.TYPE_ACTION,
|
||||
R.string.cheats_download_gecko
|
||||
)
|
||||
|
||||
throw IndexOutOfBoundsException()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user