Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #11490 from deReeperJosh/skylandersportalandroid
Android: Skylanders Portal UI
  • Loading branch information
t895 committed Feb 2, 2023
2 parents 6cb8df7 + 680db55 commit 6437261
Show file tree
Hide file tree
Showing 22 changed files with 1,299 additions and 505 deletions.
Expand Up @@ -9,6 +9,7 @@
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.util.Pair;
import android.util.SparseIntArray;
import android.view.InputDevice;
import android.view.KeyEvent;
Expand All @@ -33,19 +34,25 @@
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.LinearLayoutManager;

import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.databinding.ActivityEmulationBinding;
import org.dolphinemu.dolphinemu.databinding.DialogInputAdjustBinding;
import org.dolphinemu.dolphinemu.databinding.DialogIrSensitivityBinding;
import org.dolphinemu.dolphinemu.databinding.DialogSkylandersManagerBinding;
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting;
import org.dolphinemu.dolphinemu.features.settings.model.IntSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.model.StringSetting;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
import org.dolphinemu.dolphinemu.features.skylanders.SkylanderConfig;
import org.dolphinemu.dolphinemu.features.skylanders.model.Skylander;
import org.dolphinemu.dolphinemu.features.skylanders.ui.SkylanderSlot;
import org.dolphinemu.dolphinemu.features.skylanders.ui.SkylanderSlotAdapter;
import org.dolphinemu.dolphinemu.fragments.EmulationFragment;
import org.dolphinemu.dolphinemu.fragments.MenuFragment;
import org.dolphinemu.dolphinemu.fragments.SaveLoadStateFragment;
Expand All @@ -63,6 +70,7 @@

import java.io.File;
import java.lang.annotation.Retention;
import java.util.ArrayList;
import java.util.List;

import static java.lang.annotation.RetentionPolicy.SOURCE;
Expand All @@ -75,6 +83,8 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
private static final String BACKSTACK_NAME_MENU = "menu";
private static final String BACKSTACK_NAME_SUBMENU = "submenu";
public static final int REQUEST_CHANGE_DISC = 1;
public static final int REQUEST_SKYLANDER_FILE = 2;
public static final int REQUEST_CREATE_SKYLANDER = 3;

private EmulationFragment mEmulationFragment;

Expand All @@ -101,6 +111,10 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
public static final String EXTRA_SYSTEM_MENU = "SystemMenu";
public static final String EXTRA_USER_PAUSED_EMULATION = "sUserPausedEmulation";
public static final String EXTRA_MENU_TOAST_SHOWN = "MenuToastShown";
public static final String EXTRA_SKYLANDER_SLOT = "SkylanderSlot";
public static final String EXTRA_SKYLANDER_ID = "SkylanderId";
public static final String EXTRA_SKYLANDER_VAR = "SkylanderVar";
public static final String EXTRA_SKYLANDER_NAME = "SkylanderName";

@Retention(SOURCE)
@IntDef(
Expand All @@ -115,7 +129,7 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
MENU_ACTION_RESET_OVERLAY, MENU_SET_IR_RECENTER, MENU_SET_IR_MODE,
MENU_SET_IR_SENSITIVITY, MENU_ACTION_CHOOSE_DOUBLETAP, MENU_ACTION_MOTION_CONTROLS,
MENU_ACTION_PAUSE_EMULATION, MENU_ACTION_UNPAUSE_EMULATION, MENU_ACTION_OVERLAY_CONTROLS,
MENU_ACTION_SETTINGS})
MENU_ACTION_SETTINGS, MENU_ACTION_SKYLANDERS})
public @interface MenuAction
{
}
Expand Down Expand Up @@ -156,6 +170,15 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
public static final int MENU_ACTION_UNPAUSE_EMULATION = 33;
public static final int MENU_ACTION_OVERLAY_CONTROLS = 34;
public static final int MENU_ACTION_SETTINGS = 35;
public static final int MENU_ACTION_SKYLANDERS = 36;

private Skylander mSkylanderData = new Skylander(-1, -1, "Slot");

private int mSkylanderSlot = -1;

private DialogSkylandersManagerBinding mSkylandersBinding;

private static List<SkylanderSlot> sSkylanderSlots = new ArrayList<>();

private static final SparseIntArray buttonsActionsMap = new SparseIntArray();

Expand Down Expand Up @@ -361,6 +384,14 @@ protected void onCreate(Bundle savedInstanceState)

if (NativeLibrary.IsGameMetadataValid())
setTitle(NativeLibrary.GetCurrentTitleDescription());

if (sSkylanderSlots.isEmpty())
{
for (int i = 0; i < 8; i++)
{
sSkylanderSlots.add(new SkylanderSlot(getString(R.string.skylander_slot, i + 1), i));
}
}
}

@Override
Expand All @@ -373,6 +404,10 @@ protected void onSaveInstanceState(@NonNull Bundle outState)
outState.putStringArray(EXTRA_SELECTED_GAMES, mPaths);
outState.putBoolean(EXTRA_USER_PAUSED_EMULATION, sUserPausedEmulation);
outState.putBoolean(EXTRA_MENU_TOAST_SHOWN, mMenuToastShown);
outState.putInt(EXTRA_SKYLANDER_SLOT, mSkylanderSlot);
outState.putInt(EXTRA_SKYLANDER_ID, mSkylanderData.getId());
outState.putInt(EXTRA_SKYLANDER_VAR, mSkylanderData.getVar());
outState.putString(EXTRA_SKYLANDER_NAME, mSkylanderData.getName());
super.onSaveInstanceState(outState);
}

Expand All @@ -381,6 +416,10 @@ protected void restoreState(Bundle savedInstanceState)
mPaths = savedInstanceState.getStringArray(EXTRA_SELECTED_GAMES);
sUserPausedEmulation = savedInstanceState.getBoolean(EXTRA_USER_PAUSED_EMULATION);
mMenuToastShown = savedInstanceState.getBoolean(EXTRA_MENU_TOAST_SHOWN);
mSkylanderSlot = savedInstanceState.getInt(EXTRA_SKYLANDER_SLOT);
mSkylanderData = new Skylander(savedInstanceState.getInt(EXTRA_SKYLANDER_ID),
savedInstanceState.getInt(EXTRA_SKYLANDER_VAR),
savedInstanceState.getString(EXTRA_SKYLANDER_NAME));
}

@Override
Expand Down Expand Up @@ -486,13 +525,40 @@ public boolean onKeyLongPress(int keyCode, @NonNull KeyEvent event)
protected void onActivityResult(int requestCode, int resultCode, Intent result)
{
super.onActivityResult(requestCode, resultCode, result);
if (requestCode == REQUEST_CHANGE_DISC)
// If the user picked a file, as opposed to just backing out.
if (resultCode == RESULT_OK)
{
// If the user picked a file, as opposed to just backing out.
if (resultCode == RESULT_OK)
if (requestCode == REQUEST_CHANGE_DISC)
{
NativeLibrary.ChangeDisc(result.getData().toString());
}
else if (requestCode == REQUEST_SKYLANDER_FILE)
{
Pair<Integer, String> slot =
SkylanderConfig.loadSkylander(sSkylanderSlots.get(mSkylanderSlot).getPortalSlot(),
result.getData().toString());
clearSkylander(mSkylanderSlot);
sSkylanderSlots.get(mSkylanderSlot).setPortalSlot(slot.first);
sSkylanderSlots.get(mSkylanderSlot).setLabel(slot.second);
mSkylandersBinding.skylandersManager.getAdapter().notifyItemChanged(mSkylanderSlot);
mSkylanderSlot = -1;
mSkylanderData = Skylander.BLANK_SKYLANDER;
}
else if (requestCode == REQUEST_CREATE_SKYLANDER)
{
if (!(mSkylanderData.getId() == -1) && !(mSkylanderData.getVar() == -1))
{
Pair<Integer, String> slot = SkylanderConfig.createSkylander(mSkylanderData.getId(),
mSkylanderData.getVar(),
result.getData().toString(), sSkylanderSlots.get(mSkylanderSlot).getPortalSlot());
clearSkylander(mSkylanderSlot);
sSkylanderSlots.get(mSkylanderSlot).setPortalSlot(slot.first);
sSkylanderSlots.get(mSkylanderSlot).setLabel(slot.second);
mSkylandersBinding.skylandersManager.getAdapter().notifyItemChanged(mSkylanderSlot);
mSkylanderSlot = -1;
mSkylanderData = Skylander.BLANK_SKYLANDER;
}
}
}
}

Expand Down Expand Up @@ -773,6 +839,10 @@ public void handleMenuAction(@MenuAction int menuAction)
SettingsActivity.launch(this, MenuTag.SETTINGS);
break;

case MENU_ACTION_SKYLANDERS:
showSkylanderPortalSettings();
break;

case MENU_ACTION_EXIT:
mEmulationFragment.stopEmulation();
break;
Expand Down Expand Up @@ -1110,6 +1180,33 @@ private void setIRSensitivity()
.show();
}

private void showSkylanderPortalSettings()
{
mSkylandersBinding =
DialogSkylandersManagerBinding.inflate(getLayoutInflater());
mSkylandersBinding.skylandersManager.setLayoutManager(new LinearLayoutManager(this));

mSkylandersBinding.skylandersManager.setAdapter(
new SkylanderSlotAdapter(sSkylanderSlots, this));

new MaterialAlertDialogBuilder(this)
.setTitle(R.string.skylanders_manager)
.setView(mSkylandersBinding.getRoot())
.show();
}

public void setSkylanderData(int id, int var, String name, int slot)
{
mSkylanderData = new Skylander(id, var, name);
mSkylanderSlot = slot;
}

public void clearSkylander(int slot)
{
sSkylanderSlots.get(slot).setLabel(getString(R.string.skylander_slot, slot + 1));
mSkylandersBinding.skylandersManager.getAdapter().notifyItemChanged(slot);
}

private void resetOverlay()
{
new MaterialAlertDialogBuilder(this)
Expand Down
Expand Up @@ -89,6 +89,9 @@ public enum BooleanSetting implements AbstractBooleanSetting
MAIN_DEBUG_JIT_REGISTER_CACHE_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG,
"JitRegisterCacheOff", false),

MAIN_EMULATE_SKYLANDER_PORTAL(Settings.FILE_DOLPHIN, Settings.SECTION_EMULATED_USB_DEVICES,
"EmulateSkylanderPortal", false),

MAIN_SHOW_GAME_TITLES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID,
"ShowGameTitles", true),
MAIN_USE_BLACK_BACKGROUNDS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID,
Expand Down Expand Up @@ -273,6 +276,7 @@ public enum BooleanSetting implements AbstractBooleanSetting
MAIN_RAM_OVERRIDE_ENABLE,
MAIN_CUSTOM_RTC_ENABLE,
MAIN_DSP_JIT,
MAIN_EMULATE_SKYLANDER_PORTAL,
};

private static final Set<BooleanSetting> NOT_RUNTIME_EDITABLE =
Expand Down
Expand Up @@ -42,6 +42,7 @@ public class Settings implements Closeable
public static final String SECTION_GFX_HACKS = "Hacks";

public static final String SECTION_DEBUG = "Debug";
public static final String SECTION_EMULATED_USB_DEVICES = "EmulatedUSBDevices";

public static final String SECTION_STEREOSCOPY = "Stereoscopy";

Expand Down
Expand Up @@ -263,7 +263,9 @@ private void addTopLevelSettings(ArrayList<SettingsItem> sl)
{
sl.add(new SubmenuSetting(mContext, R.string.gcpad_settings, MenuTag.GCPAD_TYPE));
if (mSettings.isWii())
{
sl.add(new SubmenuSetting(mContext, R.string.wiimote_settings, MenuTag.WIIMOTE));
}
}

sl.add(new HeaderSetting(mContext, R.string.setting_clear_info, 0));
Expand Down Expand Up @@ -633,6 +635,10 @@ private void addWiiSettings(ArrayList<SettingsItem> sl)
R.string.wiimote_scanning, R.string.wiimote_scanning_description));
sl.add(new SwitchSetting(mContext, BooleanSetting.MAIN_WIIMOTE_ENABLE_SPEAKER,
R.string.wiimote_speaker, R.string.wiimote_speaker_description));

sl.add(new HeaderSetting(mContext, R.string.emulated_usb_devices, 0));
sl.add(new SwitchSetting(mContext, BooleanSetting.MAIN_EMULATE_SKYLANDER_PORTAL,
R.string.emulate_skylander_portal, 0));
}

private void addAdvancedSettings(ArrayList<SettingsItem> sl)
Expand Down
@@ -0,0 +1,32 @@
// SPDX-License-Identifier: GPL-2.0-or-later

package org.dolphinemu.dolphinemu.features.skylanders;

import android.util.Pair;

import org.dolphinemu.dolphinemu.features.skylanders.model.SkylanderPair;

import java.util.Map;

public class SkylanderConfig
{
public static final Map<SkylanderPair, String> LIST_SKYLANDERS;
public static final Map<String, SkylanderPair> REVERSE_LIST_SKYLANDERS;

static
{
LIST_SKYLANDERS = getSkylanderMap();
REVERSE_LIST_SKYLANDERS = getInverseSkylanderMap();
}

public static native Map<SkylanderPair, String> getSkylanderMap();

public static native Map<String, SkylanderPair> getInverseSkylanderMap();

public static native boolean removeSkylander(int slot);

public static native Pair<Integer, String> loadSkylander(int slot, String fileName);

public static native Pair<Integer, String> createSkylander(int id, int var, String fileName,
int slot);
}
@@ -0,0 +1,37 @@
// SPDX-License-Identifier: GPL-2.0-or-later

package org.dolphinemu.dolphinemu.features.skylanders.model;

public class Skylander
{
private SkylanderPair mPair;
private String mName;

public final static Skylander BLANK_SKYLANDER = new Skylander(-1, -1, "Blank");

public Skylander(int id, int var, String name)
{
mPair = new SkylanderPair(id, var);
mName = name;
}

public String getName()
{
return mName;
}

public void setName(String name)
{
this.mName = name;
}

public int getId()
{
return mPair.getId();
}

public int getVar()
{
return mPair.getVar();
}
}
@@ -0,0 +1,54 @@
// SPDX-License-Identifier: GPL-2.0-or-later

package org.dolphinemu.dolphinemu.features.skylanders.model;

import androidx.annotation.Nullable;

public class SkylanderPair
{
private int mId;
private int mVar;

public SkylanderPair(int id, int var)
{
mId = id;
mVar = var;
}

public int getId()
{
return mId;
}

public void setId(int mId)
{
this.mId = mId;
}

public int getVar()
{
return mVar;
}

public void setVar(int mVar)
{
this.mVar = mVar;
}

@Override public int hashCode()
{
return (mId << 16) + mVar;
}

@Override public boolean equals(@Nullable Object obj)
{
if (!(obj instanceof SkylanderPair))
return false;
SkylanderPair pairObj = (SkylanderPair) obj;
if (pairObj.getId() != mId)
return false;
if (pairObj.getVar() != mVar)
return false;
return true;
}
}

0 comments on commit 6437261

Please sign in to comment.