From 227d27f34a2512fb8a87e1fa4006c5bdc37ca6aa Mon Sep 17 00:00:00 2001 From: Ender's Games Date: Mon, 27 Aug 2018 10:40:37 -0400 Subject: [PATCH 1/2] Android: Update XMLParser for API 26 standards --- .../java/com/reicast/emulator/XMLParser.java | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 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 1e1dbcc11..d31fa2fb9 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 @@ -126,7 +126,7 @@ public class XMLParser extends AsyncTask { @Override protected void onPostExecute(String gameData) { - if (gameData != null) { + if (childview.get() != null && gameData != null) { try { Document doc = getDomElement(gameData); if (doc.getElementsByTagName("Game") != null) { @@ -138,7 +138,7 @@ public class XMLParser extends AsyncTask { xmlParser.execute(game_name); } else { game_name = getValue(root, "GameTitle") + " [" - + FilenameUtils.getExtension(game.getName()) + + FilenameUtils.getExtension(game.getName()) .toUpperCase(Locale.getDefault()) + "]"; game_details = getValue(root, "Overview"); Element images = (Element) root.getElementsByTagName("Images").item(0); @@ -149,9 +149,29 @@ public class XMLParser extends AsyncTask { boxart = (Element) images.getElementsByTagName("boxart").item(0); } if (boxart != null) { - (new decodeBitmapIcon()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, - "https://cdn.thegamesdb.net/images/thumb/" + getElementValue( - boxart).replace("original/", "")); + decodeBitmapIcon icon = new decodeBitmapIcon(mContext.get()); + icon.setListener(new decodeBitmapIcon.decodeBitmapIconListener() { + @Override + public void onDecodeBitmapIconFinished(Bitmap gameImage) { + if (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/", "")); } } } @@ -160,8 +180,7 @@ public class XMLParser extends AsyncTask { } } - if (childview.get() != null) - ((TextView) childview.get().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.get().findViewById(R.id.childview).setOnLongClickListener( @@ -292,7 +311,14 @@ public class XMLParser extends AsyncTask { return ""; } - private class decodeBitmapIcon extends AsyncTask { + private static class decodeBitmapIcon extends AsyncTask { + private WeakReference mContext; + private decodeBitmapIconListener listener; + + decodeBitmapIcon(Context reference) { + this.mContext = new WeakReference<>(reference); + } + @Override protected Bitmap doInBackground(String... params) { try { @@ -352,17 +378,18 @@ public class XMLParser extends AsyncTask { @Override protected void onPostExecute(Bitmap gameImage) { - if (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); + super.onPostExecute(gameImage); + if (listener != null) { + listener.onDecodeBitmapIconFinished(gameImage); } } + + void setListener(decodeBitmapIconListener listener) { + this.listener = listener; + } + + public interface decodeBitmapIconListener { + void onDecodeBitmapIconFinished(Bitmap gameImage); + } } } From 124273e48e14992db2815b088cb61ed3b1aba1b6 Mon Sep 17 00:00:00 2001 From: Ender's Games Date: Mon, 27 Aug 2018 10:48:17 -0400 Subject: [PATCH 2/2] Android: Null check views, remove redundant --- .../java/com/reicast/emulator/XMLParser.java | 55 ++++++------------- 1 file changed, 17 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 d31fa2fb9..1b4ee7944 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 @@ -126,7 +126,7 @@ public class XMLParser extends AsyncTask { @Override protected void onPostExecute(String gameData) { - if (childview.get() != null && gameData != null) { + if (gameData != null) { try { Document doc = getDomElement(gameData); if (doc.getElementsByTagName("Game") != null) { @@ -153,7 +153,7 @@ public class XMLParser extends AsyncTask { icon.setListener(new decodeBitmapIcon.decodeBitmapIconListener() { @Override public void onDecodeBitmapIconFinished(Bitmap gameImage) { - if (gameImage != null) { + 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); @@ -180,44 +180,23 @@ 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( - new OnLongClickListener() { - public boolean onLongClick(View view) { - final AlertDialog.Builder builder = new AlertDialog.Builder(mContext.get()); - builder.setCancelable(true); - 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(); - } - }); - builder.setPositiveButton("Launch", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - 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(); - return true; - } - }); + if (mPrefs.getBoolean(Config.pref_gamedetails, false)) { + childview.get().findViewById(R.id.childview).setOnLongClickListener( + new OnLongClickListener() { + public boolean onLongClick(View view) { + new AlertDialog.Builder(mContext.get()).setCancelable(true).setIcon(game_icon) + .setTitle(mContext.get().getString(R.string.game_details, game_name)) + .setMessage(game_details).create().show(); + return true; + } + }); + } + + childview.get().setTag(game_name); } - - childview.get().setTag(game_name); } private void initializeDefaults() {