diff --git a/CHANGELOG.md b/CHANGELOG.md index c72b60356..6cae42763 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Features + +- Add runtime API to query user consent requirement ([#1139](https://github.com/getsentry/sentry-unreal/pull/1139)) + ### Fixes - No more warnings in UE 5.7 caused by deprecated API usage ([#1152](https://github.com/getsentry/sentry-unreal/pull/1152)) diff --git a/plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.cpp b/plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.cpp index 144cb2b5e..55d935b86 100644 --- a/plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.cpp +++ b/plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.cpp @@ -376,6 +376,12 @@ EUserConsent FAndroidSentrySubsystem::GetUserConsent() const return EUserConsent::Unknown; } +bool FAndroidSentrySubsystem::IsUserConsentRequired() const +{ + UE_LOG(LogSentrySdk, Log, TEXT("IsUserConsentRequired is not supported on Android. Returning default `false` value.")); + return false; +} + TSharedPtr FAndroidSentrySubsystem::StartTransaction(const FString& name, const FString& operation, bool bindToScope) { TSharedPtr transactionOptionsAndroid = MakeShareable(new FAndroidSentryTransactionOptions()); diff --git a/plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.h b/plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.h index 39d70f755..ca9c3f037 100644 --- a/plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.h +++ b/plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.h @@ -38,6 +38,7 @@ class FAndroidSentrySubsystem : public ISentrySubsystem virtual void GiveUserConsent() override; virtual void RevokeUserConsent() override; virtual EUserConsent GetUserConsent() const override; + virtual bool IsUserConsentRequired() const override; virtual TSharedPtr StartTransaction(const FString& name, const FString& operation, bool bindToScope) override; virtual TSharedPtr StartTransactionWithContext(TSharedPtr context, bool bindToScope) override; virtual TSharedPtr StartTransactionWithContextAndTimestamp(TSharedPtr context, int64 timestamp, bool bindToScope) override; diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp index 1cabebd1f..9cab5a5be 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp @@ -415,6 +415,12 @@ EUserConsent FAppleSentrySubsystem::GetUserConsent() const return EUserConsent::Unknown; } +bool FAppleSentrySubsystem::IsUserConsentRequired() const +{ + UE_LOG(LogSentrySdk, Log, TEXT("IsUserConsentRequired is not supported on Mac/iOS. Returning default `false` value.")); + return false; +} + TSharedPtr FAppleSentrySubsystem::StartTransaction(const FString& name, const FString& operation, bool bindToScope) { id transaction = [SENTRY_APPLE_CLASS(SentrySDK) startTransactionWithName:name.GetNSString() operation:operation.GetNSString() bindToScope:bindToScope]; diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.h index 502d6a915..37d4115ee 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.h @@ -35,6 +35,7 @@ class FAppleSentrySubsystem : public ISentrySubsystem virtual void GiveUserConsent() override; virtual void RevokeUserConsent() override; virtual EUserConsent GetUserConsent() const override; + virtual bool IsUserConsentRequired() const override; virtual TSharedPtr StartTransaction(const FString& name, const FString& operation, bool bindToScope) override; virtual TSharedPtr StartTransactionWithContext(TSharedPtr context, bool bindToScope) override; virtual TSharedPtr StartTransactionWithContextAndTimestamp(TSharedPtr context, int64 timestamp, bool bindToScope) override; @@ -54,7 +55,7 @@ class FAppleSentrySubsystem : public ISentrySubsystem virtual FString GetScreenshotPath() const; virtual FString GetLatestScreenshot() const; virtual FString GetGameLogPath() const { return FString(); }; - virtual FString GetLatestGameLog() const { return FString(); }; + virtual FString GetLatestGameLog() const { return FString(); } protected: bool isScreenshotAttachmentEnabled = false; diff --git a/plugin-dev/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp b/plugin-dev/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp index 4efc57485..0d8a3ca79 100644 --- a/plugin-dev/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp +++ b/plugin-dev/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp @@ -749,6 +749,11 @@ EUserConsent FGenericPlatformSentrySubsystem::GetUserConsent() const } } +bool FGenericPlatformSentrySubsystem::IsUserConsentRequired() const +{ + return sentry_user_consent_is_required() == 1; +} + TSharedPtr FGenericPlatformSentrySubsystem::StartTransaction(const FString& name, const FString& operation, bool bindToScope) { TSharedPtr transactionContext = MakeShareable(new FGenericPlatformSentryTransactionContext(name, operation)); diff --git a/plugin-dev/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.h b/plugin-dev/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.h index 892f02002..72a65c6d7 100644 --- a/plugin-dev/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.h +++ b/plugin-dev/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.h @@ -47,6 +47,7 @@ class FGenericPlatformSentrySubsystem : public ISentrySubsystem virtual void GiveUserConsent() override; virtual void RevokeUserConsent() override; virtual EUserConsent GetUserConsent() const override; + virtual bool IsUserConsentRequired() const override; virtual TSharedPtr StartTransaction(const FString& name, const FString& operation, bool bindToScope) override; virtual TSharedPtr StartTransactionWithContext(TSharedPtr context, bool bindToScope) override; virtual TSharedPtr StartTransactionWithContextAndTimestamp(TSharedPtr context, int64 timestamp, bool bindToScope) override; diff --git a/plugin-dev/Source/Sentry/Private/Interface/SentrySubsystemInterface.h b/plugin-dev/Source/Sentry/Private/Interface/SentrySubsystemInterface.h index f08d1577d..147443e13 100644 --- a/plugin-dev/Source/Sentry/Private/Interface/SentrySubsystemInterface.h +++ b/plugin-dev/Source/Sentry/Private/Interface/SentrySubsystemInterface.h @@ -60,6 +60,7 @@ class ISentrySubsystem virtual void GiveUserConsent() = 0; virtual void RevokeUserConsent() = 0; virtual EUserConsent GetUserConsent() const = 0; + virtual bool IsUserConsentRequired() const = 0; virtual TSharedPtr StartTransaction(const FString& name, const FString& operation, bool bindToScope) = 0; virtual TSharedPtr StartTransactionWithContext(TSharedPtr context, bool bindToScope) = 0; virtual TSharedPtr StartTransactionWithContextAndTimestamp(TSharedPtr context, int64 timestamp, bool bindToScope) = 0; diff --git a/plugin-dev/Source/Sentry/Private/SentrySubsystem.cpp b/plugin-dev/Source/Sentry/Private/SentrySubsystem.cpp index 88a0b0169..697eb8358 100644 --- a/plugin-dev/Source/Sentry/Private/SentrySubsystem.cpp +++ b/plugin-dev/Source/Sentry/Private/SentrySubsystem.cpp @@ -624,6 +624,18 @@ EUserConsent USentrySubsystem::GetUserConsent() const return SubsystemNativeImpl->GetUserConsent(); } +bool USentrySubsystem::IsUserConsentRequired() const +{ + check(SubsystemNativeImpl); + + if (!SubsystemNativeImpl || !SubsystemNativeImpl->IsEnabled()) + { + return false; + } + + return SubsystemNativeImpl->IsUserConsentRequired(); +} + USentryTransaction* USentrySubsystem::StartTransaction(const FString& Name, const FString& Operation, bool BindToScope) { check(SubsystemNativeImpl); diff --git a/plugin-dev/Source/Sentry/Public/SentrySubsystem.h b/plugin-dev/Source/Sentry/Public/SentrySubsystem.h index 9333c0793..3c4776f49 100644 --- a/plugin-dev/Source/Sentry/Public/SentrySubsystem.h +++ b/plugin-dev/Source/Sentry/Public/SentrySubsystem.h @@ -319,6 +319,16 @@ class SENTRY_API USentrySubsystem : public UEngineSubsystem UFUNCTION(BlueprintCallable, Category = "Sentry") EUserConsent GetUserConsent() const; + /** + * Returns if user consent is required for crash upload. + * + * @return True if user consent is required; otherwise false. + * + * @note This method is currently only relevant on Windows and Linux; other platforms will default to `false`. + */ + UFUNCTION(BlueprintCallable, Category = "Sentry") + bool IsUserConsentRequired() const; + /** * Starts a new transaction. *