From 3eba9ae6ad57e804ca29b65dbaa56b50633fe4a7 Mon Sep 17 00:00:00 2001 From: Ender's Games Date: Tue, 28 Aug 2018 15:10:18 -0400 Subject: [PATCH] Android: Improved null checking, Optimize --- .../java/com/reicast/emulator/Emulator.java | 2 +- .../java/com/reicast/emulator/XMLParser.java | 88 ++++++++++--------- .../emulator/config/OptionsFragment.java | 19 ++-- .../emulator/config/PGConfigFragment.java | 11 +-- .../reicast/emulator/emu/OnScreenMenu.java | 2 +- .../reicast/src/main/jni/src/Android.cpp | 68 +++++++------- 6 files changed, 95 insertions(+), 95 deletions(-) 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 7e9355b48..addb8de7e 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 @@ -111,7 +111,7 @@ public class Emulator extends Application { JNIdc.pvrrender(mPrefs.getBoolean(pref_pvrrender, pvrrender) ? 1 : 0); JNIdc.syncedrender(mPrefs.getBoolean(pref_syncedrender, syncedrender) ? 1 : 0); JNIdc.modvols(mPrefs.getBoolean(pref_modvols, modvols) ? 1 : 0); - JNIdc.bootdisk(mPrefs.getString(pref_bootdisk, null)); + JNIdc.bootdisk(mPrefs.getString(pref_bootdisk, bootdisk)); } static { 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 1b4ee7944..b6e1f6024 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 @@ -2,7 +2,6 @@ package com.reicast.emulator; import android.app.AlertDialog; import android.content.Context; -import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -10,10 +9,8 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.net.Uri; import android.os.AsyncTask; import android.os.Build; -import android.os.Vibrator; import android.view.View; import android.view.View.OnLongClickListener; import android.widget.ImageView; @@ -136,43 +133,13 @@ public class XMLParser extends AsyncTask { xmlParser.setViewParent(mContext.get(), childview.get(), mCallback); xmlParser.setGameID(getValue(root, "id")); xmlParser.execute(game_name); - } else { - game_name = getValue(root, "GameTitle") + " [" - + FilenameUtils.getExtension(game.getName()) - .toUpperCase(Locale.getDefault()) + "]"; + } else if (root != null) { + String name = getValue(root, "GameTitle"); + if (!name.equals("")) + game_name = name + " [" + FilenameUtils.getExtension( + game.getName()).toUpperCase(Locale.getDefault()) + "]"; game_details = getValue(root, "Overview"); - Element images = (Element) root.getElementsByTagName("Images").item(0); - Element boxart = null; - if (images.getElementsByTagName("boxart").getLength() > 1) { - boxart = (Element) images.getElementsByTagName("boxart").item(1); - } else if (images.getElementsByTagName("boxart").getLength() == 1) { - boxart = (Element) images.getElementsByTagName("boxart").item(0); - } - if (boxart != null) { - decodeBitmapIcon icon = new decodeBitmapIcon(mContext.get()); - icon.setListener(new decodeBitmapIcon.decodeBitmapIconListener() { - @Override - public void onDecodeBitmapIconFinished(Bitmap gameImage) { - if (childview.get() != null && gameImage != null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - ((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.get().getResources(), gameImage); - } else { - game_icon = new BitmapDrawable(gameImage); - } - ((ImageView) childview.get().findViewById( - R.id.item_icon)).setImageDrawable(game_icon); - } - } - }); - icon.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, - "https://cdn.thegamesdb.net/images/thumb/" - + getElementValue(boxart).replace("original/", "")); - } + getBoxart((Element) root.getElementsByTagName("Images").item(0)); } } } catch (Exception e) { @@ -199,6 +166,41 @@ public class XMLParser extends AsyncTask { } } + private void getBoxart(Element images) { + Element boxart = null; + if (images.getElementsByTagName("boxart").getLength() > 1) { + boxart = (Element) images.getElementsByTagName("boxart").item(1); + } else if (images.getElementsByTagName("boxart").getLength() == 1) { + boxart = (Element) images.getElementsByTagName("boxart").item(0); + } + if (boxart != null) { + decodeBitmapIcon icon = new decodeBitmapIcon(mContext.get()); + icon.setListener(new decodeBitmapIcon.decodeBitmapIconListener() { + @Override + public void onDecodeBitmapIconFinished(Bitmap gameImage) { + if (childview.get() != null && gameImage != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ((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.get().getResources(), gameImage); + } else { + game_icon = new BitmapDrawable(gameImage); + } + ((ImageView) childview.get().findViewById( + R.id.item_icon)).setImageDrawable(game_icon); + } + } + }); + icon.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, + "https://cdn.thegamesdb.net/images/thumb/" + + getElementValue(boxart) + .replace("original/", "")); + } + } + private void initializeDefaults() { game_details = mContext.get().getString(R.string.info_unavailable); final String nameLower = game.getName().toLowerCase(Locale.getDefault()); @@ -271,8 +273,12 @@ public class XMLParser extends AsyncTask { } private String getValue(Element item, String str) { - NodeList n = item.getElementsByTagName(str); - return this.getElementValue(n.item(0)); + if (item != null) { + NodeList n = item.getElementsByTagName(str); + return this.getElementValue(n.item(0)); + } else { + return ""; + } } private String getElementValue(Node elem) { diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/OptionsFragment.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/OptionsFragment.java index a88fdbb61..9b64c14cf 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/OptionsFragment.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/config/OptionsFragment.java @@ -461,23 +461,24 @@ public class OptionsFragment extends Fragment { || (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) { if (event == null || !event.isShiftPressed()) { - if (v.getText() != "null") { - String disk = v.getText().toString(); - if (disk.substring(disk.lastIndexOf("/") + 1).length() == 0) { + String disk = null; + if (v.getText() != null) { + disk = v.getText().toString(); + if (disk.equals("") || disk.substring( + disk.lastIndexOf("/") + 1).length() == 0) { disk = null; - mPrefs.edit().remove(Emulator.pref_bootdisk).apply(); } else { if (!disk.contains("/")) disk = game_directory + "/" + disk; - if (new File(disk).exists()) { - mPrefs.edit().putString(Emulator.pref_bootdisk, disk).apply(); - } else { + if (!new File(disk).exists()) disk = null; - mPrefs.edit().remove(Emulator.pref_bootdisk).apply(); - } } v.setText(disk); } + if (disk == null) + mPrefs.edit().remove(Emulator.pref_bootdisk).apply(); + else + mPrefs.edit().putString(Emulator.pref_bootdisk, disk).apply(); hideSoftKeyBoard(); return true; } 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 91a9ff123..8f3bb47b7 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 @@ -203,18 +203,19 @@ public class PGConfigFragment extends Fragment { || (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) { if (event == null || !event.isShiftPressed()) { - if (v.getText() != "null") { - String disk = v.getText().toString(); - if (disk.substring(disk.lastIndexOf("/") + 1).length() == 0) { + String disk; + if (v.getText() != null) { + disk = v.getText().toString(); + if (disk.equals("") || disk.substring( + disk.lastIndexOf("/") + 1).length() == 0) { disk = null; } else { if (!disk.contains("/")) disk = mPrefs.getString(Config.pref_games, Environment.getExternalStorageDirectory() .getAbsolutePath()) + "/" + disk; - if (!new File(disk).exists()) { + if (!new File(disk).exists()) disk = null; - } } v.setText(disk); } 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 ed5bb027f..d738866ec 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 @@ -496,7 +496,7 @@ public class OnScreenMenu { OnClickListener clickDisk = new OnClickListener() { public void onClick(View v) { - if (Emulator.bootdisk == null) + if (Emulator.bootdisk != null) JNIdc.diskSwap(null); dismiss(); } 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 2f74a577a..fdccd5f87 100644 --- a/shell/android-studio/reicast/src/main/jni/src/Android.cpp +++ b/shell/android-studio/reicast/src/main/jni/src/Android.cpp @@ -188,6 +188,7 @@ extern int screen_width,screen_height; static u64 tvs_base; static char gamedisk[256]; +static char bootdisk[256]; // Additonal controllers 2, 3 and 4 connected ? static bool add_controllers[3] = { false, false, false }; @@ -309,16 +310,14 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_config(JNIEnv *env,jo JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_bootdisk(JNIEnv *env,jobject obj, jstring disk) { if (disk != NULL) { - settings.imgread.LoadDefaultImage = 1; - const char *P = disk ? env->GetStringUTFChars(disk, 0) : 0; + settings.imgread.LoadDefaultImage = true; + const char *P = env->GetStringUTFChars(disk, 0); if (!P) settings.imgread.DefaultImage[0] = '\0'; else { - printf("Got URI: '%s'\n", P); - strncpy(settings.imgread.DefaultImage, - (strlen(P) >= 7) && !memcmp(P, "file://", 7) ? P + 7 : P, - sizeof(settings.imgread.DefaultImage)); + printf("Boot Disk URI: '%s'\n", P); + strncpy(settings.imgread.DefaultImage,(strlen(P)>=7)&&!memcmp( + P,"file://",7)? P+7:P,sizeof(settings.imgread.DefaultImage)); settings.imgread.DefaultImage[sizeof(settings.imgread.DefaultImage) - 1] = '\0'; - env->ReleaseStringUTFChars(disk, P); } } } @@ -326,18 +325,16 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_bootdisk(JNIEnv *env, JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_init(JNIEnv *env,jobject obj,jstring fileName) { // Get filename string from Java - const char* P = fileName? env->GetStringUTFChars(fileName,0):0; - if(!P) gamedisk[0] = '\0'; + const char* P = fileName ? env->GetStringUTFChars(fileName,0) : 0; + if (!P) gamedisk[0] = '\0'; else { - printf("Got URI: '%s'\n",P); + printf("Game Disk URI: '%s'\n",P); strncpy(gamedisk,(strlen(P)>=7)&&!memcmp(P,"file://",7)? P+7:P,sizeof(gamedisk)); gamedisk[sizeof(gamedisk)-1] = '\0'; env->ReleaseStringUTFChars(fileName,P); } - printf("Opening file: '%s'\n",gamedisk); - // Initialize platform-specific stuff common_linux_setup(); @@ -356,6 +353,27 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_init(JNIEnv *env,jobj ThreadHandler(gamedisk); } +JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_diskSwap(JNIEnv *env,jobject obj,jstring disk) +{ + if (settings.imgread.LoadDefaultImage) { + strncpy(settings.imgread.DefaultImage, gamedisk, sizeof(settings.imgread.DefaultImage)); + settings.imgread.DefaultImage[sizeof(settings.imgread.DefaultImage) - 1] = '\0'; + DiscSwap(); + } else if (disk != NULL) { + settings.imgread.LoadDefaultImage = true; + const char *P = env->GetStringUTFChars(disk, 0); + if (!P) settings.imgread.DefaultImage[0] = '\0'; + else { + printf("Swap Disk URI: '%s'\n", P); + strncpy(settings.imgread.DefaultImage,(strlen(P)>=7)&&!memcmp( + P,"file://",7)? P+7:P,sizeof(settings.imgread.DefaultImage)); + settings.imgread.DefaultImage[sizeof(settings.imgread.DefaultImage) - 1] = '\0'; + env->ReleaseStringUTFChars(disk, P); + } + DiscSwap(); + } +} + #define SAMPLE_COUNT 512 JNIEnv* jenv; //we are abusing the f*** out of this poor guy @@ -445,32 +463,6 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_destroy(JNIEnv *env,j dc_term(); } -JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_diskSwap(JNIEnv *env,jobject obj,jstring disk) -{ - if (settings.imgread.LoadDefaultImage == 1) { - if (!gamedisk) settings.imgread.DefaultImage[0] = '\0'; - else { - printf("Got URI: '%s'\n", gamedisk); - strncpy(settings.imgread.DefaultImage, gamedisk, sizeof(settings.imgread.DefaultImage)); - settings.imgread.DefaultImage[sizeof(settings.imgread.DefaultImage) - 1] = '\0'; - } - DiscSwap(); - } else if (disk != NULL) { - settings.imgread.LoadDefaultImage = 1; - const char *P = disk ? env->GetStringUTFChars(disk, 0) : 0; - if (!P) settings.imgread.DefaultImage[0] = '\0'; - else { - printf("Got URI: '%s'\n", P); - strncpy(settings.imgread.DefaultImage, - (strlen(P) >= 7) && !memcmp(P, "file://", 7) ? P + 7 : P, - sizeof(settings.imgread.DefaultImage)); - settings.imgread.DefaultImage[sizeof(settings.imgread.DefaultImage) - 1] = '\0'; - env->ReleaseStringUTFChars(disk, P); - } - DiscSwap(); - } -} - JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_vmuSwap(JNIEnv *env,jobject obj) { maple_device* olda = MapleDevices[0][0];