From 31fb5751659d1a7ab67b4d1e1abb45306476bd4b Mon Sep 17 00:00:00 2001 From: Ender's Games Date: Sun, 26 Aug 2018 07:39:32 -0400 Subject: [PATCH 1/7] Core: Support retrieving disk info before full init --- core/nullDC.cpp | 54 ++++++++++++++++--- .../main/java/com/android/util/FileUtils.java | 1 - .../com/reicast/emulator/MainActivity.java | 2 +- .../java/com/reicast/emulator/XMLParser.java | 1 - .../reicast/emulator/debug/GenerateLogs.java | 3 +- .../com/reicast/emulator/emu/GL2JNIView.java | 1 - .../reicast/emulator/emu/OnScreenMenu.java | 2 - .../com/reicast/emulator/periph/Gamepad.java | 1 - .../reicast/src/main/jni/src/Android.cpp | 8 +-- 9 files changed, 53 insertions(+), 20 deletions(-) diff --git a/core/nullDC.cpp b/core/nullDC.cpp index 3a77b7720..7e4e21c3d 100755 --- a/core/nullDC.cpp +++ b/core/nullDC.cpp @@ -129,7 +129,13 @@ void* webui_th(void* p) cThread webui_thd(&webui_th,0); #endif +#if defined(_ANDROID) +int reios_init_value; + +void reios_init(int argc,wchar* argv[]) +#else int dc_init(int argc,wchar* argv[]) +#endif { setbuf(stdin,0); setbuf(stdout,0); @@ -137,7 +143,12 @@ int dc_init(int argc,wchar* argv[]) if (!_vmem_reserve()) { printf("Failed to alloc mem\n"); +#if defined(_ANDROID) + reios_init_value = -1; + return; +#else return -1; +#endif } #if !defined(TARGET_NO_WEBUI) @@ -146,19 +157,29 @@ int dc_init(int argc,wchar* argv[]) if(ParseCommandLine(argc,argv)) { - return 69; +#if defined(_ANDROID) + reios_init_value = 69; + return; +#else + return 69; +#endif } if(!cfgOpen()) { msgboxf("Unable to open config file",MBX_ICONERROR); +#if defined(_ANDROID) + reios_init_value = -4; + return; +#else return -4; +#endif } LoadSettings(); #ifndef _ANDROID os_CreateWindow(); #endif - int rv= 0; + int rv = 0; #if HOST_OS != OS_DARWIN #define DATA_PATH "/data/" @@ -169,11 +190,34 @@ int dc_init(int argc,wchar* argv[]) if (settings.bios.UseReios || !LoadRomFiles(get_readonly_data_path(DATA_PATH))) { if (!LoadHle(get_readonly_data_path(DATA_PATH))) + { +#if defined(_ANDROID) + reios_init_value = -4; + return; +#else return -3; +#endif + } else + { printf("Did not load bios, using reios\n"); + } } + plugins_Init(); + +#if defined(_ANDROID) +} + +int dc_init() +{ + int rv = 0; + if (reios_init_value != 0) + return reios_init_value; +#else + LoadCustom(); +#endif + #if FEAT_SHREC != DYNAREC_NONE if(settings.dynarec.Enable) { @@ -192,8 +236,6 @@ int dc_init(int argc,wchar* argv[]) sh4_cpu.Init(); mem_Init(); - plugins_Init(); - mem_map_default(); #if DC_PLATFORM == DC_PLATFORM_DREAMCAST @@ -206,10 +248,6 @@ int dc_init(int argc,wchar* argv[]) mem_Reset(false); sh4_cpu.Reset(false); - -#ifndef _ANDROID - LoadCustom(); -#endif return rv; } diff --git a/shell/android-studio/reicast/src/main/java/com/android/util/FileUtils.java b/shell/android-studio/reicast/src/main/java/com/android/util/FileUtils.java index 110f06b87..a394cc767 100644 --- a/shell/android-studio/reicast/src/main/java/com/android/util/FileUtils.java +++ b/shell/android-studio/reicast/src/main/java/com/android/util/FileUtils.java @@ -9,7 +9,6 @@ import android.net.Uri; import android.os.Environment; import android.preference.PreferenceManager; -import com.reicast.emulator.MainActivity; import com.reicast.emulator.config.Config; import java.io.File; diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java index 5206a9211..477dafd57 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/MainActivity.java @@ -33,9 +33,9 @@ import android.view.WindowManager; import android.widget.TextView; import com.reicast.emulator.config.Config; -import com.reicast.emulator.config.PGConfigFragment; import com.reicast.emulator.config.InputFragment; import com.reicast.emulator.config.OptionsFragment; +import com.reicast.emulator.config.PGConfigFragment; import com.reicast.emulator.debug.GenerateLogs; import com.reicast.emulator.emu.JNIdc; import com.reicast.emulator.periph.Gamepad; diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java index d54254d2e..e282d903d 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java @@ -6,7 +6,6 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.PorterDuff; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java index f42dd473d..e40a2ff42 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java @@ -3,8 +3,8 @@ package com.reicast.emulator.debug; import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.net.Uri; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.support.constraint.ConstraintLayout; @@ -13,7 +13,6 @@ import android.support.graphics.drawable.VectorDrawableCompat; import android.view.Gravity; import android.view.View; import android.widget.TextView; -import android.widget.Toast; import com.reicast.emulator.R; import com.reicast.emulator.config.Config; diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java index 4c75e13df..6d89f201d 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java @@ -156,7 +156,6 @@ public class GL2JNIView extends GLSurfaceView if (GL2JNIActivity.syms != null) JNIdc.data(1, GL2JNIActivity.syms); } - JNIdc.init(fileName); JNIdc.query(ethd); diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/OnScreenMenu.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/OnScreenMenu.java index 88d4824b9..5cdc35593 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/OnScreenMenu.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/OnScreenMenu.java @@ -6,7 +6,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.os.Environment; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; @@ -25,7 +24,6 @@ import com.reicast.emulator.R; import com.reicast.emulator.config.Config; import com.reicast.emulator.periph.VmuLcd; -import java.io.File; import java.util.Vector; public class OnScreenMenu { diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/periph/Gamepad.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/periph/Gamepad.java index 1f17d2ef4..92d96df52 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/periph/Gamepad.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/periph/Gamepad.java @@ -5,7 +5,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.os.Build; import android.util.SparseArray; import android.util.SparseIntArray; import android.view.KeyEvent; diff --git a/shell/android-studio/reicast/src/main/jni/src/Android.cpp b/shell/android-studio/reicast/src/main/jni/src/Android.cpp index 0d5cf3751..743931f1b 100644 --- a/shell/android-studio/reicast/src/main/jni/src/Android.cpp +++ b/shell/android-studio/reicast/src/main/jni/src/Android.cpp @@ -10,7 +10,6 @@ #include #include -#include "types.h" #include "hw/maple/maple_cfg.h" #include "profiler/profiler.h" #include "rend/TexCache.h" @@ -182,7 +181,8 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_dreamtime(JNIEnv *env void egl_stealcntx(); void SetApplicationPath(wchar *path); -int dc_init(int argc,wchar* argv[]); +void reios_init(int argc,wchar* argv[]); +int dc_init(); void dc_run(); void dc_pause(); void dc_term(); @@ -239,7 +239,7 @@ static void *ThreadHandler(void *UserData) } // Run nullDC emulator - dc_init(Args[2]? 3:1,Args); + reios_init(Args[2]? 3:1,Args); return 0; } @@ -380,6 +380,8 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_query(JNIEnv *env,job jstring reios_name = env->NewStringUTF(name); env->CallVoidMethod(emu_thread, reiosInfoMid, reios_id, reios_name); + + dc_init(); } JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_run(JNIEnv *env,jobject obj,jobject emu_thread) From 2c66bf3b3aa18cd5675f3cf1c3f230a168e6db16 Mon Sep 17 00:00:00 2001 From: Ender's Games Date: Sun, 26 Aug 2018 07:55:24 -0400 Subject: [PATCH 2/7] Core / Android: Add dynarec to per-game config --- core/nullDC.cpp | 39 ++++----- .../java/com/reicast/emulator/Emulator.java | 1 + .../emulator/config/PGConfigFragment.java | 7 +- .../res/layout-v14/configure_fragment.xml | 56 ++++++------- .../main/res/layout-v14/pgconfig_fragment.xml | 84 ++++++++++++------- .../main/res/layout/configure_fragment.xml | 56 ++++++------- .../src/main/res/layout/pgconfig_fragment.xml | 84 ++++++++++++------- 7 files changed, 195 insertions(+), 132 deletions(-) diff --git a/core/nullDC.cpp b/core/nullDC.cpp index 7e4e21c3d..db05e160d 100755 --- a/core/nullDC.cpp +++ b/core/nullDC.cpp @@ -286,28 +286,28 @@ void dc_stop() void LoadSettings() { #ifndef _ANDROID - settings.dynarec.Enable = cfgLoadInt("config","Dynarec.Enabled", 1)!=0; - settings.dynarec.idleskip = cfgLoadInt("config","Dynarec.idleskip",1)!=0; - settings.dynarec.unstable_opt = cfgLoadInt("config","Dynarec.unstable-opt",0); - settings.dynarec.safemode = cfgLoadInt("config","Dynarec.safemode",0); + settings.dynarec.Enable = cfgLoadInt("config", "Dynarec.Enabled", 1) != 0; + settings.dynarec.idleskip = cfgLoadInt("config", "Dynarec.idleskip", 1) != 0; + settings.dynarec.unstable_opt = cfgLoadInt("config", "Dynarec.unstable-opt", 0); + settings.dynarec.safemode = cfgLoadInt("config", "Dynarec.safemode", 0); //disable_nvmem can't be loaded, because nvmem init is before cfg load - settings.dreamcast.cable = cfgLoadInt("config","Dreamcast.Cable",3); - settings.dreamcast.RTC = cfgLoadInt("config","Dreamcast.RTC",GetRTC_now()); - settings.dreamcast.region = cfgLoadInt("config","Dreamcast.Region",3); - settings.dreamcast.broadcast = cfgLoadInt("config","Dreamcast.Broadcast",4); - settings.aica.LimitFPS = cfgLoadInt("config","aica.LimitFPS",1); - settings.aica.NoBatch = cfgLoadInt("config","aica.NoBatch",0); - settings.aica.NoSound = cfgLoadInt("config","aica.NoSound",0); - settings.aica.InterruptHack = cfgLoadInt("config","aica.InterruptHack",0); - settings.rend.UseMipmaps = cfgLoadInt("config","rend.UseMipmaps",1); - settings.rend.WideScreen = cfgLoadInt("config","rend.WideScreen",0); - settings.rend.ModifierVolumes = cfgLoadInt("config","rend.ModifierVolumes",1); - settings.rend.Clipping = cfgLoadInt("config","rend.Clipping",1); + settings.dreamcast.cable = cfgLoadInt("config", "Dreamcast.Cable", 3); + settings.dreamcast.RTC = cfgLoadInt("config", "Dreamcast.RTC", GetRTC_now()); + settings.dreamcast.region = cfgLoadInt("config", "Dreamcast.Region", 3); + settings.dreamcast.broadcast = cfgLoadInt("config", "Dreamcast.Broadcast", 4); + settings.aica.LimitFPS = cfgLoadInt("config", "aica.LimitFPS", 1); + settings.aica.NoBatch = cfgLoadInt("config", "aica.NoBatch", 0); + settings.aica.NoSound = cfgLoadInt("config", "aica.NoSound", 0); + settings.aica.InterruptHack = cfgLoadInt("config", "aica.InterruptHack", 0); + settings.rend.UseMipmaps = cfgLoadInt("config", "rend.UseMipmaps", 1); + settings.rend.WideScreen = cfgLoadInt("config", "rend.WideScreen", 0); + settings.rend.ModifierVolumes = cfgLoadInt("config", "rend.ModifierVolumes", 1); + settings.rend.Clipping = cfgLoadInt("config", "rend.Clipping", 1); - settings.pvr.subdivide_transp = cfgLoadInt("config","pvr.Subdivide",0); + settings.pvr.subdivide_transp = cfgLoadInt("config", "pvr.Subdivide", 0); - settings.pvr.ta_skip = cfgLoadInt("config","ta.skip",0); - settings.pvr.rend = cfgLoadInt("config","pvr.rend",0); + settings.pvr.ta_skip = cfgLoadInt("config", "ta.skip", 0); + settings.pvr.rend = cfgLoadInt("config", "pvr.rend", 0); settings.pvr.MaxThreads = cfgLoadInt("config", "pvr.MaxThreads", 3); settings.pvr.SynchronousRender = cfgLoadInt("config", "pvr.SynchronousRendering", 0); @@ -354,6 +354,7 @@ void LoadCustom() char *reios_id = reios_disk_id(); cfgSaveStr(reios_id, "software.name", reios_software_name); + settings.dynarec.Enable = cfgLoadInt(reios_id,"Dynarec.Enabled", settings.dynarec.Enable ? 1 : 0) != 0; settings.dynarec.idleskip = cfgGameInt(reios_id,"Dynarec.idleskip", settings.dynarec.idleskip ? 1 : 0) != 0; settings.dynarec.unstable_opt = cfgGameInt(reios_id,"Dynarec.unstable-opt", settings.dynarec.unstable_opt); settings.dynarec.safemode = cfgGameInt(reios_id,"Dynarec.safemode", settings.dynarec.safemode); diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/Emulator.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/Emulator.java index 35b24f75b..e72146144 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/Emulator.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/Emulator.java @@ -110,6 +110,7 @@ public class Emulator extends Application { public void loadGameConfiguration(String gameId) { SharedPreferences mPrefs = getSharedPreferences(gameId, Activity.MODE_PRIVATE); + JNIdc.dynarec(mPrefs.getBoolean(pref_dynarecopt, dynarecopt) ? 1 : 0); JNIdc.unstable(mPrefs.getBoolean(pref_unstable, unstableopt) ? 1 : 0); JNIdc.safemode(mPrefs.getBoolean(pref_dynsafemode, dynsafemode) ? 1 : 0); JNIdc.interrupthack(mPrefs.getBoolean(pref_interrupt, interrupt) ? 1 : 0); diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java index 562b00788..1d328a6d6 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java @@ -45,6 +45,7 @@ public class PGConfigFragment extends Fragment { private Spinner mSpnrConfigs; + private CompoundButton dynarec_opt; private CompoundButton unstable_opt; private CompoundButton safemode_opt; private EditText mainFrames; @@ -82,6 +83,7 @@ public class PGConfigFragment extends Fragment { new LocateConfigs(PGConfigFragment.this).execute("/data/data/" + getActivity().getPackageName() + "/shared_prefs/"); + dynarec_opt = (CompoundButton) getView().findViewById(R.id.dynarec_option); unstable_opt = (CompoundButton) getView().findViewById(R.id.unstable_option); safemode_opt = (CompoundButton) getView().findViewById(R.id.dynarec_safemode); mainFrames = (EditText) getView().findViewById(R.id.current_frames); @@ -94,7 +96,9 @@ public class PGConfigFragment extends Fragment { } private void saveSettings(SharedPreferences mPrefs) { - mPrefs.edit().putBoolean(Emulator.pref_unstable, unstable_opt.isChecked()) + mPrefs.edit() + .putBoolean(Emulator.pref_dynarecopt, dynarec_opt.isChecked()) + .putBoolean(Emulator.pref_unstable, unstable_opt.isChecked()) .putBoolean(Emulator.pref_dynsafemode, safemode_opt.isChecked()) .putInt(Emulator.pref_frameskip, frameSeek.getProgress()) .putBoolean(Emulator.pref_pvrrender, pvr_render.isChecked()) @@ -109,6 +113,7 @@ public class PGConfigFragment extends Fragment { private void configureViewByGame(String gameId) { final SharedPreferences mPrefs = getActivity() .getSharedPreferences(gameId, Activity.MODE_PRIVATE); + dynarec_opt.setChecked(mPrefs.getBoolean(Emulator.pref_dynarecopt, Emulator.dynarecopt)); unstable_opt.setChecked(mPrefs.getBoolean(Emulator.pref_unstable, Emulator.unstableopt)); safemode_opt.setChecked(mPrefs.getBoolean(Emulator.pref_dynsafemode, Emulator.dynsafemode)); diff --git a/shell/android-studio/reicast/src/main/res/layout-v14/configure_fragment.xml b/shell/android-studio/reicast/src/main/res/layout-v14/configure_fragment.xml index 8578f825a..6ec1364fa 100644 --- a/shell/android-studio/reicast/src/main/res/layout-v14/configure_fragment.xml +++ b/shell/android-studio/reicast/src/main/res/layout-v14/configure_fragment.xml @@ -273,34 +273,6 @@ - - - - - - - - - - @@ -575,6 +547,34 @@ android:focusable="true" /> + + + + + + + + + + - - - - - - - - - - @@ -170,6 +142,62 @@ android:layout_height="2dp" android:background="@drawable/list_item_border" /> + + + + + + + + + + + + + + + + + + + + diff --git a/shell/android-studio/reicast/src/main/res/layout/configure_fragment.xml b/shell/android-studio/reicast/src/main/res/layout/configure_fragment.xml index 3aff86e6c..13f57ccb6 100644 --- a/shell/android-studio/reicast/src/main/res/layout/configure_fragment.xml +++ b/shell/android-studio/reicast/src/main/res/layout/configure_fragment.xml @@ -273,34 +273,6 @@ - - - - - - - - - - @@ -575,6 +547,34 @@ android:focusable="true" /> + + + + + + + + + + - - - - - - - - - - @@ -170,6 +142,62 @@ android:layout_height="2dp" android:background="@drawable/list_item_border" /> + + + + + + + + + + + + + + + + + + + + From 96d06cb4a24e549fe1dd7816cbe15cb45dd671ca Mon Sep 17 00:00:00 2001 From: Ender's Games Date: Sun, 26 Aug 2018 10:35:34 -0400 Subject: [PATCH 3/7] Android: Improve game detail view, Fix leaks --- .../java/com/reicast/emulator/XMLParser.java | 84 ++++++++++--------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java index e282d903d..f41e26ccd 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java @@ -22,6 +22,7 @@ import android.widget.TextView; import com.reicast.emulator.FileBrowser.OnItemSelectedListener; import com.reicast.emulator.config.Config; +import org.apache.commons.io.FilenameUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -39,6 +40,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.StringReader; import java.io.UnsupportedEncodingException; +import java.lang.ref.WeakReference; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; @@ -54,26 +56,24 @@ public class XMLParser extends AsyncTask { private SharedPreferences mPrefs; private File game; private int index; - private View childview; private OnItemSelectedListener mCallback; - private Context mContext; private String game_name; private Drawable game_icon; private String gameId; private String game_details; - private String game_index = "http://legacy.thegamesdb.net/api/GetGamesList.php?platform=sega+dreamcast&name="; - private String game_id = "http://legacy.thegamesdb.net/api/GetGame.php?platform=sega+dreamcast&id="; + private WeakReference mContext; + private WeakReference childview; - public XMLParser(File game, int index, SharedPreferences mPrefs) { + XMLParser(File game, int index, SharedPreferences mPrefs) { this.mPrefs = mPrefs; this.game = game; this.index = index; } - public void setViewParent(Context mContext, View childview, OnItemSelectedListener mCallback) { - this.mContext = mContext; - this.childview = childview; + public void setViewParent(Context reference, View childview, OnItemSelectedListener mCallback) { + this.mContext = new WeakReference<>(reference); + this.childview = new WeakReference<>(childview); this.mCallback = mCallback; initializeDefaults(); } @@ -88,7 +88,7 @@ public class XMLParser extends AsyncTask { if (isNetworkAvailable() && mPrefs.getBoolean(Config.pref_gamedetails, false)) { String xmlUrl = ""; if (gameId != null) { - xmlUrl = game_id + gameId; + xmlUrl = "http://legacy.thegamesdb.net/api/GetGame.php?platform=sega+dreamcast&id=" + gameId; } else { filename = filename.substring(0, filename.lastIndexOf(".")); try { @@ -96,7 +96,7 @@ public class XMLParser extends AsyncTask { } catch (UnsupportedEncodingException e) { filename = filename.replace(" ", "+"); } - xmlUrl = game_index + filename; + xmlUrl = "http://legacy.thegamesdb.net/api/GetGamesList.php?platform=sega+dreamcast&name=" + filename; } try { @@ -116,9 +116,9 @@ public class XMLParser extends AsyncTask { in.close(); return responseStrBuilder.toString(); } catch (UnsupportedEncodingException e) { - + e.printStackTrace(); } catch (IOException e) { - + e.printStackTrace(); } } return null; @@ -133,11 +133,13 @@ public class XMLParser extends AsyncTask { Element root = (Element) doc.getElementsByTagName("Game").item(0); if (gameId == null) { XMLParser xmlParser = new XMLParser(game, index, mPrefs); - xmlParser.setViewParent(mContext, childview, mCallback); + xmlParser.setViewParent(mContext.get(), childview.get(), mCallback); xmlParser.setGameID(getValue(root, "id")); xmlParser.execute(game_name); } else { - game_name = getValue(root, "GameTitle"); + game_name = getValue(root, "GameTitle") + " [" + + FilenameUtils.getExtension(game.getName()) + .toUpperCase(Locale.getDefault()) + "]"; game_details = getValue(root, "Overview"); Element images = (Element) root.getElementsByTagName("Images").item(0); Element boxart = null; @@ -154,35 +156,39 @@ public class XMLParser extends AsyncTask { } } } catch (Exception e) { - + e.printStackTrace(); } } - ((TextView) childview.findViewById(R.id.item_name)).setText(game_name); + ((TextView) childview.get().findViewById(R.id.item_name)).setText(game_name); if (mPrefs.getBoolean(Config.pref_gamedetails, false)) { - childview.findViewById(R.id.childview).setOnLongClickListener( + childview.get().findViewById(R.id.childview).setOnLongClickListener( new OnLongClickListener() { public boolean onLongClick(View view) { - final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); + final AlertDialog.Builder builder = new AlertDialog.Builder(mContext.get()); builder.setCancelable(true); - builder.setTitle(mContext.getString(R.string.game_details, game_name)); + builder.setTitle(mContext.get().getString(R.string.game_details, game_name)); builder.setMessage(game_details); builder.setIcon(game_icon); builder.setNegativeButton("Close", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - return; } }); builder.setPositiveButton("Launch", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - mCallback.onGameSelected(game != null ? Uri.fromFile(game) : Uri.EMPTY); - ((Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(250); - return; + mCallback.onGameSelected(game != null + ? Uri.fromFile(game) : Uri.EMPTY); + try { + ((Vibrator) mContext.get().getSystemService( + Context.VIBRATOR_SERVICE)).vibrate(250); + } catch (Exception e) { + // Vibration unavailable + } } }); builder.create().show(); @@ -191,32 +197,32 @@ public class XMLParser extends AsyncTask { }); } - childview.setTag(game_name); + childview.get().setTag(game_name); } private void initializeDefaults() { - game_details = mContext.getString(R.string.info_unavailable); + game_details = mContext.get().getString(R.string.info_unavailable); final String nameLower = game.getName().toLowerCase(Locale.getDefault()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - game_icon = mContext.getResources().getDrawable( + game_icon = mContext.get().getResources().getDrawable( game.isDirectory() ? R.drawable.open_folder : nameLower.endsWith(".gdi") ? R.mipmap.disk_gdi : nameLower.endsWith(".chd") ? R.mipmap.disk_chd : nameLower.endsWith(".cdi") ? R.mipmap.disk_cdi : R.mipmap.disk_unknown); } else { - game_icon = mContext.getResources().getDrawable( + game_icon = mContext.get().getResources().getDrawable( game.isDirectory() ? R.drawable.open_folder : nameLower.endsWith(".gdi") ? R.drawable.gdi : nameLower.endsWith(".chd") ? R.drawable.chd : nameLower.endsWith(".cdi") ? R.drawable.cdi : R.drawable.disk_unknown); } - ((ImageView) childview.findViewById(R.id.item_icon)).setImageDrawable(game_icon); + ((ImageView) childview.get().findViewById(R.id.item_icon)).setImageDrawable(game_icon); } - public boolean isNetworkAvailable() { - ConnectivityManager connectivityManager = (ConnectivityManager) mContext + private boolean isNetworkAvailable() { + ConnectivityManager connectivityManager = (ConnectivityManager) mContext.get() .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo mMobile = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); @@ -240,7 +246,7 @@ public class XMLParser extends AsyncTask { return game_details; } - public Document getDomElement(String xml) { + private Document getDomElement(String xml) { Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { @@ -265,12 +271,12 @@ public class XMLParser extends AsyncTask { return doc; } - public String getValue(Element item, String str) { + private String getValue(Element item, String str) { NodeList n = item.getElementsByTagName(str); return this.getElementValue(n.item(0)); } - public final String getElementValue(Node elem) { + private String getElementValue(Node elem) { Node child; if (elem != null) { if (elem.hasChildNodes()) { @@ -289,8 +295,10 @@ public class XMLParser extends AsyncTask { @Override protected Bitmap doInBackground(String... params) { try { - String index = params[0].substring(params[0].lastIndexOf("/") + 1, params[0].lastIndexOf(".")); - File file = new File(mContext.getExternalFilesDir(null) + "/images", index + ".png"); + String index = params[0].substring(params[0].lastIndexOf( + "/") + 1, params[0].lastIndexOf(".")); + File file = new File(mContext.get().getExternalFilesDir( + null) + "/images", index + ".png"); if (file.exists()) { return BitmapFactory.decodeFile(file.getAbsolutePath()); } else { @@ -345,14 +353,14 @@ public class XMLParser extends AsyncTask { protected void onPostExecute(Bitmap gameImage) { if (gameImage != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - ((ImageView) childview.findViewById(R.id.item_icon)).setImageTintList(null); + ((ImageView) childview.get().findViewById(R.id.item_icon)).setImageTintList(null); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - game_icon = new BitmapDrawable(mContext.getResources(), gameImage); + game_icon = new BitmapDrawable(mContext.get().getResources(), gameImage); } else { game_icon = new BitmapDrawable(gameImage); } - ((ImageView) childview.findViewById(R.id.item_icon)).setImageDrawable(game_icon); + ((ImageView) childview.get().findViewById(R.id.item_icon)).setImageDrawable(game_icon); } } } From ff816325780432a36a54d6a79f6b48395c7a2df8 Mon Sep 17 00:00:00 2001 From: Ender's Games Date: Sun, 26 Aug 2018 11:01:25 -0400 Subject: [PATCH 4/7] Android: Support per-game joystick as Dpad This resolves and issue with Psychic Force 2012 where the joystick is not supported, but should not force toggling this setting for a single game. Currently only supports player 1 Android: Realign new options with existing --- .../com/reicast/emulator/GL2JNIActivity.java | 4 +++ .../com/reicast/emulator/GL2JNINative.java | 4 +++ .../java/com/reicast/emulator/XMLParser.java | 3 ++- .../emulator/config/PGConfigFragment.java | 7 +++++ .../com/reicast/emulator/emu/GL2JNIView.java | 7 +++++ .../main/res/layout-v14/pgconfig_fragment.xml | 27 +++++++++++++++++++ .../src/main/res/layout/pgconfig_fragment.xml | 27 +++++++++++++++++++ 7 files changed, 78 insertions(+), 1 deletion(-) diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java index d80c43910..144dcda8e 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNIActivity.java @@ -238,6 +238,10 @@ public class GL2JNIActivity extends Activity { } } + public Gamepad getPad() { + return pad; + } + public void displayFPS() { fpsPop.showAtLocation(mView, Gravity.TOP | Gravity.LEFT, 20, 20); fpsPop.update(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNINative.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNINative.java index dfd7bd085..9b66741d2 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNINative.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/GL2JNINative.java @@ -238,6 +238,10 @@ public class GL2JNINative extends NativeActivity { } } + public Gamepad getPad() { + return pad; + } + public void displayFPS() { fpsPop.showAtLocation(mView, Gravity.TOP | Gravity.LEFT, 20, 20); fpsPop.update(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java index f41e26ccd..1e1dbcc11 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/XMLParser.java @@ -160,7 +160,8 @@ public class XMLParser extends AsyncTask { } } - ((TextView) childview.get().findViewById(R.id.item_name)).setText(game_name); + if (childview.get() != null) + ((TextView) childview.get().findViewById(R.id.item_name)).setText(game_name); if (mPrefs.getBoolean(Config.pref_gamedetails, false)) { childview.get().findViewById(R.id.childview).setOnLongClickListener( diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java index 1d328a6d6..eeadaec87 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java @@ -32,6 +32,7 @@ import android.widget.TextView; import com.android.util.FileUtils; import com.reicast.emulator.Emulator; import com.reicast.emulator.R; +import com.reicast.emulator.periph.Gamepad; import java.io.File; import java.io.FilenameFilter; @@ -45,6 +46,7 @@ public class PGConfigFragment extends Fragment { private Spinner mSpnrConfigs; + private CompoundButton switchJoystickDpadEnabled; private CompoundButton dynarec_opt; private CompoundButton unstable_opt; private CompoundButton safemode_opt; @@ -83,6 +85,8 @@ public class PGConfigFragment extends Fragment { new LocateConfigs(PGConfigFragment.this).execute("/data/data/" + getActivity().getPackageName() + "/shared_prefs/"); + switchJoystickDpadEnabled = (CompoundButton) getView().findViewById( + R.id.switchJoystickDpadEnabled); dynarec_opt = (CompoundButton) getView().findViewById(R.id.dynarec_option); unstable_opt = (CompoundButton) getView().findViewById(R.id.unstable_option); safemode_opt = (CompoundButton) getView().findViewById(R.id.dynarec_safemode); @@ -97,6 +101,7 @@ public class PGConfigFragment extends Fragment { private void saveSettings(SharedPreferences mPrefs) { mPrefs.edit() + .putBoolean(Gamepad.pref_js_merged + "_A", switchJoystickDpadEnabled.isChecked()) .putBoolean(Emulator.pref_dynarecopt, dynarec_opt.isChecked()) .putBoolean(Emulator.pref_unstable, unstable_opt.isChecked()) .putBoolean(Emulator.pref_dynsafemode, safemode_opt.isChecked()) @@ -113,6 +118,8 @@ public class PGConfigFragment extends Fragment { private void configureViewByGame(String gameId) { final SharedPreferences mPrefs = getActivity() .getSharedPreferences(gameId, Activity.MODE_PRIVATE); + switchJoystickDpadEnabled.setChecked(mPrefs.getBoolean( + Gamepad.pref_js_merged + "_A", false)); dynarec_opt.setChecked(mPrefs.getBoolean(Emulator.pref_dynarecopt, Emulator.dynarecopt)); unstable_opt.setChecked(mPrefs.getBoolean(Emulator.pref_unstable, Emulator.unstableopt)); safemode_opt.setChecked(mPrefs.getBoolean(Emulator.pref_dynsafemode, Emulator.dynsafemode)); diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java index 6d89f201d..7528c199a 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/emu/GL2JNIView.java @@ -30,6 +30,7 @@ import com.reicast.emulator.GL2JNIActivity; import com.reicast.emulator.GL2JNINative; import com.reicast.emulator.config.Config; import com.reicast.emulator.emu.OnScreenMenu.FpsPopup; +import com.reicast.emulator.periph.Gamepad; import com.reicast.emulator.periph.VJoy; import java.io.UnsupportedEncodingException; @@ -674,6 +675,12 @@ public class GL2JNIView extends GLSurfaceView SharedPreferences mPrefs = context.getSharedPreferences(gameId, Activity.MODE_PRIVATE); Emulator app = (Emulator) context.getApplicationContext(); app.loadGameConfiguration(gameId); + if (context instanceof GL2JNIActivity) + ((GL2JNIActivity) context).getPad().joystick[0] = mPrefs.getBoolean( + Gamepad.pref_js_merged + "_A", ((GL2JNIActivity) context).getPad().joystick[0]); + if (context instanceof GL2JNINative) + ((GL2JNINative) context).getPad().joystick[0] = mPrefs.getBoolean( + Gamepad.pref_js_merged + "_A", ((GL2JNINative) context).getPad().joystick[0]); mPrefs.edit().putString(Config.game_title, reiosSoftware.trim()).apply(); } diff --git a/shell/android-studio/reicast/src/main/res/layout-v14/pgconfig_fragment.xml b/shell/android-studio/reicast/src/main/res/layout-v14/pgconfig_fragment.xml index 28eed6b05..e1e57c9e9 100644 --- a/shell/android-studio/reicast/src/main/res/layout-v14/pgconfig_fragment.xml +++ b/shell/android-studio/reicast/src/main/res/layout-v14/pgconfig_fragment.xml @@ -55,6 +55,33 @@ android:layout_marginLeft="6dp" android:stretchColumns="*" > + + + + + + + + + + diff --git a/shell/android-studio/reicast/src/main/res/layout/pgconfig_fragment.xml b/shell/android-studio/reicast/src/main/res/layout/pgconfig_fragment.xml index eafc0859f..387efe9e6 100644 --- a/shell/android-studio/reicast/src/main/res/layout/pgconfig_fragment.xml +++ b/shell/android-studio/reicast/src/main/res/layout/pgconfig_fragment.xml @@ -55,6 +55,33 @@ android:layout_marginLeft="6dp" android:stretchColumns="*" > + + + + + + + + + + From 41cf6e957eefed1db542a9d6efb0bb70d13ef6a5 Mon Sep 17 00:00:00 2001 From: Ender's Games Date: Sun, 26 Aug 2018 11:21:56 -0400 Subject: [PATCH 5/7] Android: Add option to clear per-game config --- .../emulator/config/PGConfigFragment.java | 28 +++++++++++++++-- .../main/res/layout-v14/pgconfig_fragment.xml | 30 +++++++++++++++++-- .../src/main/res/layout/pgconfig_fragment.xml | 30 +++++++++++++++++-- .../reicast/src/main/res/values/strings.xml | 5 +++- 4 files changed, 85 insertions(+), 8 deletions(-) diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java index eeadaec87..8d244c1d4 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/PGConfigFragment.java @@ -111,11 +111,26 @@ public class PGConfigFragment extends Fragment { .putBoolean(Emulator.pref_queuerender, queue_render.isChecked()) .putBoolean(Emulator.pref_modvols, modifier_volumes.isChecked()) .putBoolean(Emulator.pref_interrupt, interrupt_opt.isChecked()).apply(); - showToastMessage(getActivity().getString(R.string.pgconfig_saved), - Snackbar.LENGTH_SHORT); + showToastMessage(getActivity().getString(R.string.pgconfig_saved), Snackbar.LENGTH_SHORT); } - private void configureViewByGame(String gameId) { + private void clearSettings(SharedPreferences mPrefs, String gameId) { + mPrefs.edit() // Prevent clear() removing title + .remove(Gamepad.pref_js_merged + "_A") + .remove(Emulator.pref_dynarecopt) + .remove(Emulator.pref_unstable) + .remove(Emulator.pref_dynsafemode) + .remove(Emulator.pref_frameskip) + .remove(Emulator.pref_pvrrender) + .remove(Emulator.pref_syncedrender) + .remove(Emulator.pref_queuerender) + .remove(Emulator.pref_modvols) + .remove(Emulator.pref_interrupt).apply(); + showToastMessage(getActivity().getString(R.string.pgconfig_cleared), Snackbar.LENGTH_SHORT); + configureViewByGame(gameId); + } + + private void configureViewByGame(final String gameId) { final SharedPreferences mPrefs = getActivity() .getSharedPreferences(gameId, Activity.MODE_PRIVATE); switchJoystickDpadEnabled.setChecked(mPrefs.getBoolean( @@ -170,6 +185,13 @@ public class PGConfigFragment extends Fragment { saveSettings(mPrefs); } }); + + Button clearPGC = (Button) getView().findViewById(R.id.clear_pg_btn); + clearPGC.setOnClickListener(new View.OnClickListener() { + public void onClick(View view) { + clearSettings(mPrefs, gameId); + } + }); } private static class LocateConfigs extends AsyncTask> { diff --git a/shell/android-studio/reicast/src/main/res/layout-v14/pgconfig_fragment.xml b/shell/android-studio/reicast/src/main/res/layout-v14/pgconfig_fragment.xml index e1e57c9e9..15e4e7c82 100644 --- a/shell/android-studio/reicast/src/main/res/layout-v14/pgconfig_fragment.xml +++ b/shell/android-studio/reicast/src/main/res/layout-v14/pgconfig_fragment.xml @@ -370,7 +370,6 @@ android:gravity="center_vertical" > + android:text="@string/save_pgc" /> + + + + + + + + + +