From 71e15e112ff20e42074ab2cf691d83b54caae9ce Mon Sep 17 00:00:00 2001 From: Vaidas Budrys Date: Mon, 7 Sep 2020 18:21:57 +0300 Subject: [PATCH 1/3] Fix Android crash when many notifications are scheduled at once (case 1172850) --- .../Runtime/Android/AndroidNotificationCenter.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs b/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs index f8d1809b..eb082815 100644 --- a/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs +++ b/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs @@ -43,7 +43,9 @@ public class AndroidNotificationCenter /// public static event NotificationReceivedCallback OnNotificationReceived = delegate {}; + private static AndroidJavaClass s_NotificationManagerClass; private static AndroidJavaObject s_NotificationManager; + private static AndroidJavaObject s_NotificationManagerContext; private static bool s_Initialized; public static bool Initialize() @@ -60,15 +62,17 @@ public static bool Initialize() #if UNITY_EDITOR || !UNITY_ANDROID s_NotificationManager = null; s_Initialized = false; + s_NotificationManagerClass = null; + s_NotificationManagerContext = null; #elif UNITY_ANDROID AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity"); AndroidJavaObject context = activity.Call("getApplicationContext"); - AndroidJavaClass managerClass = new AndroidJavaClass("com.unity.androidnotifications.UnityNotificationManager"); - - s_NotificationManager = managerClass.CallStatic("getNotificationManagerImpl", context, activity); + s_NotificationManagerClass = new AndroidJavaClass("com.unity.androidnotifications.UnityNotificationManager"); + s_NotificationManager = s_NotificationManagerClass.CallStatic("getNotificationManagerImpl", context, activity); s_NotificationManager.Call("setNotificationCallback", new NotificationCallback()); + s_NotificationManagerContext = s_NotificationManager.Get("mContext"); s_Initialized = true; #endif @@ -311,11 +315,7 @@ internal static void SendNotification(int id, AndroidNotification notification, Debug.LogError("Failed to schedule notification, it did not contain a valid FireTime"); } - AndroidJavaClass managerClass = - new AndroidJavaClass("com.unity.androidnotifications.UnityNotificationManager"); - AndroidJavaObject context = s_NotificationManager.Get("mContext"); - - AndroidJavaObject notificationIntent = new AndroidJavaObject("android.content.Intent", context, managerClass); + var notificationIntent = new AndroidJavaObject("android.content.Intent", s_NotificationManagerContext, s_NotificationManagerClass); notificationIntent.Call("putExtra", "id", id); notificationIntent.Call("putExtra", "channelID", channelId); From 3f633f6c52fbafcca3cf0a87cc31f7b056923adc Mon Sep 17 00:00:00 2001 From: Vaidas Budrys Date: Wed, 9 Sep 2020 22:05:05 +0300 Subject: [PATCH 2/3] Expose UnityPlayer and CurrentActivity references as static members of AndroidNotificationCenter --- .../Android/AndroidNotificationCenter.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs b/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs index eb082815..dec965e5 100644 --- a/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs +++ b/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs @@ -46,6 +46,8 @@ public class AndroidNotificationCenter private static AndroidJavaClass s_NotificationManagerClass; private static AndroidJavaObject s_NotificationManager; private static AndroidJavaObject s_NotificationManagerContext; + private static AndroidJavaClass s_UnityPlayer; + private static AndroidJavaObject s_CurrentActivity; private static bool s_Initialized; public static bool Initialize() @@ -64,13 +66,15 @@ public static bool Initialize() s_Initialized = false; s_NotificationManagerClass = null; s_NotificationManagerContext = null; + s_UnityPlayer = null; + s_CurrentActivity = null; #elif UNITY_ANDROID - AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity"); - AndroidJavaObject context = activity.Call("getApplicationContext"); + s_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); + s_CurrentActivity = s_UnityPlayer.GetStatic("currentActivity"); + var context = s_CurrentActivity.Call("getApplicationContext"); s_NotificationManagerClass = new AndroidJavaClass("com.unity.androidnotifications.UnityNotificationManager"); - s_NotificationManager = s_NotificationManagerClass.CallStatic("getNotificationManagerImpl", context, activity); + s_NotificationManager = s_NotificationManagerClass.CallStatic("getNotificationManagerImpl", context, s_CurrentActivity); s_NotificationManager.Call("setNotificationCallback", new NotificationCallback()); s_NotificationManagerContext = s_NotificationManager.Get("mContext"); @@ -299,11 +303,7 @@ public static AndroidNotificationIntentData GetLastNotificationIntent() if (!Initialize()) return null; - AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - AndroidJavaObject currentActivity = unityPlayer.GetStatic("currentActivity"); - - AndroidJavaObject intent = currentActivity.Call("getIntent"); - + var intent = s_CurrentActivity.Call("getIntent"); return ParseNotificationIntentData(intent); } From 6fe230b9c5681089870216cfcb64d458af87bf0b Mon Sep 17 00:00:00 2001 From: Vaidas Budrys Date: Thu, 10 Sep 2020 11:22:47 +0300 Subject: [PATCH 3/3] Update changelog --- com.unity.mobile.notifications/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.mobile.notifications/CHANGELOG.md b/com.unity.mobile.notifications/CHANGELOG.md index 56b1f7d9..09d93fe0 100644 --- a/com.unity.mobile.notifications/CHANGELOG.md +++ b/com.unity.mobile.notifications/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this package will be documented in this file. - [iOS] [[1259811](https://issuetracker.unity3d.com/product/unity/issues/guid/1259811)] Fixed UNITY_USES_REMOTE_NOTIFICATIONS being falsely set to 1 when Mobile Notifications isn't used. - [Android] [[1271866](https://issuetracker.unity3d.com/product/unity/issues/guid/1271866)] Fixed AndroidReceivedNotificationMainThreadDispatcher allocating a new list on every frame. - [Editor] [[1254618](https://issuetracker.unity3d.com/product/unity/issues/guid/1254618)] Fixed "SerializedObject target has been destroyed" errors when navigating Mobile Notifications settings. +- [Android] [[1172850](https://issuetracker.unity3d.com/product/unity/issues/guid/1172850)] Fix Android crash when many notifications are scheduled at once. ## [1.3.0] - 2020-06-02