// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. #if UNITY_ANDROID && !UNITY_EDITOR using System; using System.Collections.Generic; using System.Threading; using Assets.AppCenter.Plugins.Android.Utility; using Microsoft.AppCenter.Unity.Internal; using Microsoft.AppCenter.Unity.Internal.Utility; using UnityEngine; namespace Microsoft.AppCenter.Unity.Crashes.Internal { class CrashesInternal { private static AndroidJavaClass _crashes = new AndroidJavaClass("com.microsoft.appcenter.crashes.Crashes"); private static AndroidJavaClass _wrapperSdkExceptionManager = new AndroidJavaClass("com.microsoft.appcenter.crashes.WrapperSdkExceptionManager"); public static void AddNativeType(List nativeTypes) { nativeTypes.Add(AndroidJNI.FindClass("com/microsoft/appcenter/crashes/Crashes")); } public static string TrackException(AndroidJavaObject exception, IDictionary properties, ErrorAttachmentLog[] attachments) { var javaProperties = JavaStringMapHelper.ConvertToJava(properties); var javaAttachments = JavaObjectsConverter.ToJavaAttachments(attachments); return _wrapperSdkExceptionManager.CallStatic("trackException", exception, javaProperties, javaAttachments); } public static AppCenterTask HasReceivedMemoryWarningInLastSessionAsync() { var future = _crashes.CallStatic("hasReceivedMemoryWarningInLastSession"); return new AppCenterTask(future); } public static AppCenterTask SetEnabledAsync(bool isEnabled) { var future = _crashes.CallStatic("setEnabled", isEnabled); return new AppCenterTask(future); } public static AppCenterTask IsEnabledAsync() { var future = _crashes.CallStatic("isEnabled"); return new AppCenterTask(future); } public static void GenerateTestCrash() { // The call to the "generateTestCrash" method from native SDK wouldn't work in this // case because it just throws an exception which Unity automatically catches and logs, // without crashing the application // _crashes.CallStatic("generateTestCrash"); if (Debug.isDebugBuild) { new Thread(() => { AndroidJNI.FindClass("Test/crash/generated/by/SDK"); }).Start(); } } public static AppCenterTask HasCrashedInLastSessionAsync() { var future = _crashes.CallStatic("hasCrashedInLastSession"); return new AppCenterTask(future); } public static AppCenterTask GetLastSessionCrashReportAsync() { var future = _crashes.CallStatic("getLastSessionCrashReport"); var javaTask = new AppCenterTask(future); var errorReportTask = new AppCenterTask(); javaTask.ContinueWith(t => { var errorReport = JavaObjectsConverter.ConvertErrorReport(t.Result); errorReportTask.SetResult(errorReport); }); return errorReportTask; } public static void DisableMachExceptionHandler() { } public static void SetUserConfirmationHandler(Crashes.UserConfirmationHandler handler) { CrashesDelegate.SetShouldAwaitUserConfirmationHandler(handler); } public static void NotifyWithUserConfirmation(Crashes.ConfirmationResult answer) { _crashes.CallStatic("notifyUserConfirmation", ToJavaConfirmationResult(answer)); } public static AppCenterTask GetMinidumpDirectoryAsync() { var future = _crashes.CallStatic("getMinidumpDirectory"); return new AppCenterTask(future); } public static void StartCrashes() { AppCenterInternal.Start(AppCenter.Crashes); } public static ErrorReport BuildHandledErrorReport(string errorReportId) { var nativeErrorReport = _wrapperSdkExceptionManager.CallStatic("buildHandledErrorReport", AndroidUtility.GetAndroidContext(), errorReportId); return JavaObjectsConverter.ConvertErrorReport(nativeErrorReport); } public static void SendErrorAttachments(string errorReportId, ErrorAttachmentLog[] attachments) { var nativeAttachments = JavaObjectsConverter.ToJavaAttachments(attachments); _wrapperSdkExceptionManager.CallStatic("sendErrorAttachments", errorReportId, nativeAttachments); } private static int ToJavaConfirmationResult(Crashes.ConfirmationResult answer) { // Java values: SEND=0, DONT_SEND=1, ALWAYS_SEND=2 // Crashes.ConfirmationResult values: SEND=1, DONT_SEND=0, ALWAYS_SEND=2 switch (answer) { case Crashes.ConfirmationResult.Send: return _crashes.GetStatic("SEND"); case Crashes.ConfirmationResult.AlwaysSend: return _crashes.GetStatic("ALWAYS_SEND"); default: return _crashes.GetStatic("DONT_SEND"); } } } } #endif