Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .cursor/rules/pr-conventions.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
description: Conventions for pull request titles and body content
alwaysApply: true
---

# Pull Request Conventions

## PR Title

Use semantic/conventional commit prefixes in PR titles:

- `fix:` for bug fixes
- `feat:` for new features
- `chore:` for maintenance tasks (deps, CI, tooling)
- `refactor:` for code restructuring without behavior changes
- `docs:` for documentation-only changes
- `test:` for test-only changes

Example: `fix: resolve notification grouping on Android 14`

## PR Body

Follow the repo's PR template at `.github/pull_request_template.md`. Every PR body must include:

1. **One Line Summary** (required)
2. **Motivation** (required) explaining why the change is being made
3. **Scope** (recommended) describing what is and isn't affected
4. **Testing** section with manual and/or unit testing details
5. **Affected code checklist** with relevant items checked
6. **Checklist** sections confirmed

Remove the instructional header block (between `<!-- START -->` and `<!-- END -->`) before submitting.
21 changes: 21 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Run Checks
permissions:
contents: read
on:
pull_request:
branches:
- "**"

jobs:
test:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Install CSharpier
run: dotnet tool install -g csharpier

- name: Check formatting
run: csharpier check .
Comment thread Fixed
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<AssemblyName>OneSignalSDK.DotNet.Android.Core.Binding</AssemblyName>
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''">28.0.3</AndroidSdkBuildToolsVersion>
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''"
>28.0.3</AndroidSdkBuildToolsVersion
>
<AndroidTlsProvider></AndroidTlsProvider>
<AndroidClassParser>class-parse</AndroidClassParser>
</PropertyGroup>
Expand Down Expand Up @@ -57,4 +59,4 @@
<ItemGroup>
<PackageReference Include="Xamarin.Kotlin.StdLib.Jdk8" Version="1.8.0.1" />
</ItemGroup>
</Project>
</Project>
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<enum-field-mappings>
<!--
<!--
This example converts the constants Fragment_id, Fragment_name,
and Fragment_tag from android.support.v4.app.FragmentActivity.FragmentTag
to an enum called Android.Support.V4.App.FragmentTagType with values
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<enum-method-mappings>
<!--
<!--
This example changes the Java method:
android.support.v4.app.Fragment.SavedState.writeToParcel (int flags)
to be:
Expand Down
65 changes: 41 additions & 24 deletions OneSignalSDK.DotNet.Android.Core.Binding/Transforms/Metadata.xml
Original file line number Diff line number Diff line change
@@ -1,27 +1,44 @@
<metadata>
<attr path="/api/package[@name='com.onesignal']" name="managedName">Com.OneSignal.Android</attr>
<attr path="/api/package[@name='com.onesignal.common']" name="managedName">Com.OneSignal.Android.Common</attr>
<attr path="/api/package[@name='com.onesignal.debug']" name="managedName">Com.OneSignal.Android.Debug</attr>
<attr path="/api/package[@name='com.onesignal.inAppMessages']" name="managedName">Com.OneSignal.Android.InAppMessages</attr>
<attr path="/api/package[@name='com.onesignal.location']" name="managedName">Com.OneSignal.Android.Location</attr>
<attr path="/api/package[@name='com.onesignal.notifications']" name="managedName">Com.OneSignal.Android.Notifications</attr>
<attr path="/api/package[@name='com.onesignal.session']" name="managedName">Com.OneSignal.Android.Session</attr>
<attr path="/api/package[@name='com.onesignal.user']" name="managedName">Com.OneSignal.Android.User</attr>
<attr path="/api/package[@name='com.onesignal.user.subscriptions']" name="managedName">Com.OneSignal.Android.User.Subscriptions</attr>
<attr path="/api/package[@name='com.onesignal.user.state']" name="managedName">Com.OneSignal.Android.User.State</attr>
<attr path="/api/package[@name='com.onesignal']" name="managedName">Com.OneSignal.Android</attr>
<attr path="/api/package[@name='com.onesignal.common']" name="managedName"
>Com.OneSignal.Android.Common</attr
>
<attr path="/api/package[@name='com.onesignal.debug']" name="managedName"
>Com.OneSignal.Android.Debug</attr
>
<attr path="/api/package[@name='com.onesignal.inAppMessages']" name="managedName"
>Com.OneSignal.Android.InAppMessages</attr
>
<attr path="/api/package[@name='com.onesignal.location']" name="managedName"
>Com.OneSignal.Android.Location</attr
>
<attr path="/api/package[@name='com.onesignal.notifications']" name="managedName"
>Com.OneSignal.Android.Notifications</attr
>
<attr path="/api/package[@name='com.onesignal.session']" name="managedName"
>Com.OneSignal.Android.Session</attr
>
<attr path="/api/package[@name='com.onesignal.user']" name="managedName"
>Com.OneSignal.Android.User</attr>
<attr path="/api/package[@name='com.onesignal.user.subscriptions']" name="managedName"
>Com.OneSignal.Android.User.Subscriptions</attr
>
<attr path="/api/package[@name='com.onesignal.user.state']" name="managedName"
>Com.OneSignal.Android.User.State</attr
>

<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.events')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.exceptions')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.modeling')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.modules')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.services')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.threading')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.core')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.debug.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.inAppMessages.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.location.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.notifications.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.session.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.user.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.events')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.exceptions')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.modeling')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.modules')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.services')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.common.threading')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.core')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.debug.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.inAppMessages.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.location.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.notifications.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.session.internal')]" />
<remove-node path="/api/package[starts-with(@name, 'com.onesignal.user.internal')]" />
</metadata>
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<AssemblyName>OneSignalSDK.DotNet.Android.InAppMessages.Binding</AssemblyName>
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''">28.0.3</AndroidSdkBuildToolsVersion>
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''"
>28.0.3</AndroidSdkBuildToolsVersion
>
<AndroidTlsProvider></AndroidTlsProvider>
<AndroidClassParser>class-parse</AndroidClassParser>
</PropertyGroup>
Expand Down Expand Up @@ -57,4 +59,4 @@
<ItemGroup>
<PackageReference Include="Xamarin.Kotlin.StdLib.Jdk8" Version="1.8.0.1" />
</ItemGroup>
</Project>
</Project>
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<enum-field-mappings>
<!--
<!--
This example converts the constants Fragment_id, Fragment_name,
and Fragment_tag from android.support.v4.app.FragmentActivity.FragmentTag
to an enum called Android.Support.V4.App.FragmentTagType with values
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<enum-method-mappings>
<!--
<!--
This example changes the Java method:
android.support.v4.app.Fragment.SavedState.writeToParcel (int flags)
to be:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<metadata>
<attr path="/api/package[@name='com.onesignal.inAppMessages']" name="managedName">Com.OneSignal.Android.InAppMessages</attr>
<attr path="/api/package[@name='com.onesignal.inAppMessages']" name="managedName"
>Com.OneSignal.Android.InAppMessages</attr
>
</metadata>
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<AssemblyName>OneSignalSDK.DotNet.Android.Location.Binding</AssemblyName>
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''">28.0.3</AndroidSdkBuildToolsVersion>
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''"
>28.0.3</AndroidSdkBuildToolsVersion
>
<AndroidTlsProvider></AndroidTlsProvider>
<AndroidClassParser>class-parse</AndroidClassParser>
</PropertyGroup>
Expand Down Expand Up @@ -57,4 +59,4 @@
<ItemGroup>
<PackageReference Include="Xamarin.Kotlin.StdLib.Jdk8" Version="1.8.0.1" />
</ItemGroup>
</Project>
</Project>
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<enum-field-mappings>
<!--
<!--
This example converts the constants Fragment_id, Fragment_name,
and Fragment_tag from android.support.v4.app.FragmentActivity.FragmentTag
to an enum called Android.Support.V4.App.FragmentTagType with values
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<enum-method-mappings>
<!--
<!--
This example changes the Java method:
android.support.v4.app.Fragment.SavedState.writeToParcel (int flags)
to be:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<metadata>
<attr path="/api/package[@name='com.onesignal.location']" name="managedName">Com.OneSignal.Android.Location</attr>
<attr path="/api/package[@name='com.onesignal.location']" name="managedName"
>Com.OneSignal.Android.Location</attr
>
</metadata>
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<AssemblyName>OneSignalSDK.DotNet.Android.Notifications.Binding</AssemblyName>
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''">28.0.3</AndroidSdkBuildToolsVersion>
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''"
>28.0.3</AndroidSdkBuildToolsVersion
>
<AndroidTlsProvider></AndroidTlsProvider>
<AndroidClassParser>class-parse</AndroidClassParser>
</PropertyGroup>
Expand Down Expand Up @@ -57,4 +59,4 @@
<ItemGroup>
<PackageReference Include="Xamarin.Kotlin.StdLib.Jdk8" Version="1.8.0.1" />
</ItemGroup>
</Project>
</Project>
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<enum-field-mappings>
<!--
<!--
This example converts the constants Fragment_id, Fragment_name,
and Fragment_tag from android.support.v4.app.FragmentActivity.FragmentTag
to an enum called Android.Support.V4.App.FragmentTagType with values
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<enum-method-mappings>
<!--
<!--
This example changes the Java method:
android.support.v4.app.Fragment.SavedState.writeToParcel (int flags)
to be:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<metadata>
<attr path="/api/package[@name='com.onesignal.notifications']" name="managedName">Com.OneSignal.Android.Notifications</attr>
<attr path="/api/package[@name='com.onesignal.notifications']" name="managedName"
>Com.OneSignal.Android.Notifications</attr
>
</metadata>
15 changes: 12 additions & 3 deletions OneSignalSDK.DotNet.Android/AndroidDebugManager.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
using OneSignalSDK.DotNet.Android.Utilities;
using OneSignalSDK.DotNet.Core;
using OneSignalSDK.DotNet.Core.Debug;

using OneSignalNative = Com.OneSignal.Android.OneSignal;

namespace OneSignalSDK.DotNet.Android;

public class AndroidDebugManager : IDebugManager
{
private OneSignalSDK.DotNet.Core.Debug.LogLevel _logLevel = OneSignalSDK.DotNet.Core.Debug.LogLevel.WARN;
private OneSignalSDK.DotNet.Core.Debug.LogLevel _alertLevel = OneSignalSDK.DotNet.Core.Debug.LogLevel.NONE;
private OneSignalSDK.DotNet.Core.Debug.LogLevel _logLevel = OneSignalSDK
.DotNet
.Core
.Debug
.LogLevel
.WARN;
private OneSignalSDK.DotNet.Core.Debug.LogLevel _alertLevel = OneSignalSDK
.DotNet
.Core
.Debug
.LogLevel
.NONE;

public OneSignalSDK.DotNet.Core.Debug.LogLevel LogLevel
{
Expand Down
50 changes: 35 additions & 15 deletions OneSignalSDK.DotNet.Android/AndroidInAppMessagesManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
using OneSignalSDK.DotNet.Android.Utilities;
using OneSignalSDK.DotNet.Core;
using OneSignalSDK.DotNet.Core.InAppMessages;

using OneSignalNative = Com.OneSignal.Android.OneSignal;

namespace OneSignalSDK.DotNet.Android;

public class AndroidInAppMessagesManager : OneSignalSDK.DotNet.Core.InAppMessages.IInAppMessagesManager
public class AndroidInAppMessagesManager
: OneSignalSDK.DotNet.Core.InAppMessages.IInAppMessagesManager
{
public event EventHandler<InAppMessageWillDisplayEventArgs>? WillDisplay;
public event EventHandler<InAppMessageDidDisplayEventArgs>? DidDisplay;
Expand Down Expand Up @@ -61,23 +61,27 @@ public void RemoveTriggers(params string[] keys)
OneSignalNative.InAppMessages.RemoveTriggers(keys);
}

private class InternalInAppMessageEventsHandler : Java.Lang.Object,
Com.OneSignal.Android.InAppMessages.IInAppMessageClickListener,
Com.OneSignal.Android.InAppMessages.IInAppMessageLifecycleListener
private class InternalInAppMessageEventsHandler
: Java.Lang.Object,
Com.OneSignal.Android.InAppMessages.IInAppMessageClickListener,
Com.OneSignal.Android.InAppMessages.IInAppMessageLifecycleListener
{
private AndroidInAppMessagesManager _manager;

public InternalInAppMessageEventsHandler(AndroidInAppMessagesManager manager)
{
_manager = manager;
}

public void OnClick(IInAppMessageClickEvent clickEvent)
{
var args = new InAppMessageClickedEventArgs(FromNativeConversion.ToInAppMessage(clickEvent.Message), FromNativeConversion.ToInAppMessageClickResult(clickEvent.Result));
var args = new InAppMessageClickedEventArgs(
FromNativeConversion.ToInAppMessage(clickEvent.Message),
FromNativeConversion.ToInAppMessageClickResult(clickEvent.Result)
);
_manager.Clicked?.Invoke(_manager, args);
}


public void OnWillDisplay(IInAppMessageWillDisplayEvent willDisplayEvent)
{
_manager.WillDisplay?.Invoke(_manager, GetWillDisplayEventArgs(willDisplayEvent));
Expand All @@ -98,24 +102,40 @@ public void OnDidDismiss(IInAppMessageDidDismissEvent didDismissEvent)
_manager.DidDismiss?.Invoke(_manager, GetDidDismissEventArgs(didDismissEvent));
}

private InAppMessageWillDisplayEventArgs GetWillDisplayEventArgs(Com.OneSignal.Android.InAppMessages.IInAppMessageWillDisplayEvent willDisplayEvent)
private InAppMessageWillDisplayEventArgs GetWillDisplayEventArgs(
Com.OneSignal.Android.InAppMessages.IInAppMessageWillDisplayEvent willDisplayEvent
)
{
return new InAppMessageWillDisplayEventArgs(FromNativeConversion.ToInAppMessage(willDisplayEvent.Message));
return new InAppMessageWillDisplayEventArgs(
FromNativeConversion.ToInAppMessage(willDisplayEvent.Message)
);
}

private InAppMessageDidDisplayEventArgs GetDidDisplayEventArgs(Com.OneSignal.Android.InAppMessages.IInAppMessageDidDisplayEvent didDisplayEvent)
private InAppMessageDidDisplayEventArgs GetDidDisplayEventArgs(
Com.OneSignal.Android.InAppMessages.IInAppMessageDidDisplayEvent didDisplayEvent
)
{
return new InAppMessageDidDisplayEventArgs(FromNativeConversion.ToInAppMessage(didDisplayEvent.Message));
return new InAppMessageDidDisplayEventArgs(
FromNativeConversion.ToInAppMessage(didDisplayEvent.Message)
);
}

private InAppMessageWillDismissEventArgs GetWillDismissEventArgs(Com.OneSignal.Android.InAppMessages.IInAppMessageWillDismissEvent willDismissEvent)
private InAppMessageWillDismissEventArgs GetWillDismissEventArgs(
Com.OneSignal.Android.InAppMessages.IInAppMessageWillDismissEvent willDismissEvent
)
{
return new InAppMessageWillDismissEventArgs(FromNativeConversion.ToInAppMessage(willDismissEvent.Message));
return new InAppMessageWillDismissEventArgs(
FromNativeConversion.ToInAppMessage(willDismissEvent.Message)
);
}

private InAppMessageDidDismissEventArgs GetDidDismissEventArgs(Com.OneSignal.Android.InAppMessages.IInAppMessageDidDismissEvent didDismissEvent)
private InAppMessageDidDismissEventArgs GetDidDismissEventArgs(
Com.OneSignal.Android.InAppMessages.IInAppMessageDidDismissEvent didDismissEvent
)
{
return new InAppMessageDidDismissEventArgs(FromNativeConversion.ToInAppMessage(didDismissEvent.Message));
return new InAppMessageDidDismissEventArgs(
FromNativeConversion.ToInAppMessage(didDismissEvent.Message)
);
}
}
}
Loading