From 80e1cc56b344a69aca0db07ebb2d9483d2b3d523 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Thu, 5 Oct 2017 10:11:08 -0700 Subject: [PATCH] Use weak references for the static Activity in NativeLibrary. Add in null checks as well. --- .../dolphinemu/dolphinemu/NativeLibrary.java | 39 ++++++++++---- .../dolphinemu/utils/Java_GCAdapter.java | 52 +++++++++++++------ .../dolphinemu/utils/Java_WiimoteAdapter.java | 31 +++++++---- 3 files changed, 84 insertions(+), 38 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index 6df525e4bc..7d55a89e2d 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -12,13 +12,15 @@ import android.widget.Toast; import org.dolphinemu.dolphinemu.activities.EmulationActivity; import org.dolphinemu.dolphinemu.utils.Log; +import java.lang.ref.WeakReference; + /** * Class which contains methods that interact * with the native side of the Dolphin code. */ public final class NativeLibrary { - public static EmulationActivity sEmulationActivity; + public static WeakReference sEmulationActivity = new WeakReference<>(null); /** * Button type for use in onTouchEvent @@ -379,31 +381,48 @@ public final class NativeLibrary public static void displayAlertMsg(final String alert) { Log.error("[NativeLibrary] Alert: " + alert); - sEmulationActivity.runOnUiThread(new Runnable() + final EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity != null) { - @Override - public void run() + emulationActivity.runOnUiThread(new Runnable() { - Toast.makeText(sEmulationActivity, "Panic Alert: " + alert, Toast.LENGTH_LONG).show(); - } - }); + @Override + public void run() + { + Toast.makeText(emulationActivity, "Panic Alert: " + alert, Toast.LENGTH_LONG).show(); + } + }); + } + else + { + Log.warning("[NativeLibrary] EmulationActivity is null, can't do panic toast."); + } } public static void endEmulationActivity() { Log.verbose("[NativeLibrary] Ending EmulationActivity."); - sEmulationActivity.exitWithAnimation(); + EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity != null) + { + emulationActivity.exitWithAnimation(); + } + else + { + Log.warning("[NativeLibrary] EmulationActivity is null, can't end."); + } } public static void setEmulationActivity(EmulationActivity emulationActivity) { Log.verbose("[NativeLibrary] Registering EmulationActivity."); - sEmulationActivity = emulationActivity; + sEmulationActivity = new WeakReference<>(emulationActivity); } public static void clearEmulationActivity() { Log.verbose("[NativeLibrary] Unregistering EmulationActivity."); - sEmulationActivity = null; + + sEmulationActivity.clear(); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Java_GCAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Java_GCAdapter.java index d7731b6040..91e2a9ca46 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Java_GCAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Java_GCAdapter.java @@ -1,6 +1,8 @@ package org.dolphinemu.dolphinemu.utils; +import android.app.Activity; import android.app.PendingIntent; +import android.content.Context; import android.content.Intent; import android.hardware.usb.UsbConfiguration; import android.hardware.usb.UsbConstants; @@ -15,7 +17,6 @@ import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.services.USBPermService; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; public class Java_GCAdapter { @@ -29,22 +30,31 @@ public class Java_GCAdapter { private static void RequestPermission() { - HashMap devices = manager.getDeviceList(); - for (Map.Entry pair : devices.entrySet()) + Context context = NativeLibrary.sEmulationActivity.get(); + if (context != null) { - UsbDevice dev = pair.getValue(); - if (dev.getProductId() == 0x0337 && dev.getVendorId() == 0x057e) + HashMap devices = manager.getDeviceList(); + for (Map.Entry pair : devices.entrySet()) { - if (!manager.hasPermission(dev)) + UsbDevice dev = pair.getValue(); + if (dev.getProductId() == 0x0337 && dev.getVendorId() == 0x057e) { - Intent intent = new Intent(); - PendingIntent pend_intent; - intent.setClass(NativeLibrary.sEmulationActivity, USBPermService.class); - pend_intent = PendingIntent.getService(NativeLibrary.sEmulationActivity, 0, intent, 0); - manager.requestPermission(dev, pend_intent); + if (!manager.hasPermission(dev)) + { + Intent intent = new Intent(); + PendingIntent pend_intent; + intent.setClass(context, USBPermService.class); + pend_intent = PendingIntent.getService(context, 0, intent, 0); + manager.requestPermission(dev, pend_intent); + } } } } + else + { + Log.warning("Cannot request GameCube Adapter permission as EmulationActivity is null."); + } + } public static void Shutdown() @@ -124,14 +134,22 @@ public class Java_GCAdapter { } } - NativeLibrary.sEmulationActivity.runOnUiThread(new Runnable() + final Activity emulationActivity = NativeLibrary.sEmulationActivity.get(); + if (emulationActivity != null) { - @Override - public void run() + emulationActivity.runOnUiThread(new Runnable() { - Toast.makeText(NativeLibrary.sEmulationActivity, "GameCube Adapter couldn't be opened. Please re-plug the device.", Toast.LENGTH_LONG).show(); - } - }); + @Override + public void run() + { + Toast.makeText(emulationActivity, "GameCube Adapter couldn't be opened. Please re-plug the device.", Toast.LENGTH_LONG).show(); + } + }); + } + else + { + Log.warning("Cannot show toast for GameCube Adapter failure."); + } usb_con.close(); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Java_WiimoteAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Java_WiimoteAdapter.java index 5fdc49b021..a38f7ecd4b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Java_WiimoteAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Java_WiimoteAdapter.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.utils; import android.app.PendingIntent; +import android.content.Context; import android.content.Intent; import android.hardware.usb.UsbConfiguration; import android.hardware.usb.UsbDevice; @@ -33,23 +34,31 @@ public class Java_WiimoteAdapter private static void RequestPermission() { - HashMap devices = manager.getDeviceList(); - for (Map.Entry pair : devices.entrySet()) + Context context = NativeLibrary.sEmulationActivity.get(); + if (context != null) { - UsbDevice dev = pair.getValue(); - if (dev.getProductId() == NINTENDO_WIIMOTE_PRODUCT_ID && dev.getVendorId() == NINTENDO_VENDOR_ID) + HashMap devices = manager.getDeviceList(); + for (Map.Entry pair : devices.entrySet()) { - if (!manager.hasPermission(dev)) + UsbDevice dev = pair.getValue(); + if (dev.getProductId() == NINTENDO_WIIMOTE_PRODUCT_ID && dev.getVendorId() == NINTENDO_VENDOR_ID) { - Log.warning("Requesting permission for Wii Remote adapter"); - Intent intent = new Intent(); - PendingIntent pend_intent; - intent.setClass(NativeLibrary.sEmulationActivity, USBPermService.class); - pend_intent = PendingIntent.getService(NativeLibrary.sEmulationActivity, 0, intent, 0); - manager.requestPermission(dev, pend_intent); + if (!manager.hasPermission(dev)) + { + Log.warning("Requesting permission for Wii Remote adapter"); + Intent intent = new Intent(); + PendingIntent pend_intent; + intent.setClass(context, USBPermService.class); + pend_intent = PendingIntent.getService(context, 0, intent, 0); + manager.requestPermission(dev, pend_intent); + } } } } + else + { + Log.warning("Cannot request Wiimote adapter permission as EmulationActivity is null."); + } } public static boolean QueryAdapter()