dotnet / dotnet/android-libraries

Nullability on returned types from Builders does not match Android API docs and @NotNull annotations

Open
#1,136 5 comments 1 reaction 0 assignees View on GitHub
Dominant language
C#
Stars
317
Forks
73
Avg merge
1d 8h
Merged PRs (30d)
17

Description

### Android framework version

net9.0-android

### Affected platform version

N/A

### Description

When using some types from the AndroidX packages, I started noticing a lot of method are returning nullable types, while the Android API docs state that they should not be and are annotated with `@NonNull`.

I noticed in after updating `Xamarin.AndroidX.AppCompat` to version `1.7.0.6` that all the methods in `NotificationCompat.Builder` return nullable types.

So building now looks like this:

```diff
var builder = new NotificationCompat.Builder(this, ChannelName);
-builder.SetContentTitle("Title")
+builder.SetContentTitle("Title")?
- .SetSmallIcon(Resource.Drawable.ic_bar_chart_24)
+ .SetSmallIcon(Resource.Drawable.ic_bar_chart_24)?
- .SetPriority(NotificationCompat.PriorityLow)
+ .SetPriority(NotificationCompat.PriorityLow)?
- .SetWhen(0)
+ .SetWhen(0)?
- .SetOnlyAlertOnce(true)
+ .SetOnlyAlertOnce(true)?
- .SetContentIntent(pendingIntent)
+ .SetContentIntent(pendingIntent)?
- .SetOngoing(true)
+ .SetOngoing(true)?
- .SetColor(ResourcesCompat.GetColor(Resources, Resource.Color.tm_orange, Theme));
return builder.Build();
```

Looking at for instance `SetContentTitle` this one is explicitly annotated with `@NonNull` for its return type. This can be seen here: https://developer.android.com/reference/androidx/core/app/NotificationCompat.Builder#setContentText(java.lang.CharSequence)

Image

The exposed C# API looks like this for the same method, where nullability on return type does not match:

```csharp
// Metadata.xml XPath method reference: path="/api/package[@name='androidx.core.app']/class[@name='NotificationCompat.Builder']/method[@name='setContentTitle' and count(parameter)=1 and parameter[1][@type='java.lang.CharSequence']]"
[Register ("setContentTitle", "(Ljava/lang/CharSequence;)Landroidx/core/app/NotificationCompat$Builder;", "GetSetContentTitle_Ljava_lang_CharSequence_Handler")]
public virtual unsafe global::AndroidX.Core.App.NotificationCompat.Builder? SetContentTitle (global::Java.Lang.ICharSequence? title)
```

### Steps to Reproduce

1. Install Xamarin.AndroidX.AppCompat
2. Use builder APIs as described above

### Did you find any workaround?

Add nullability checks all over the place :'(
Or downgrade to previous version of AppCompat package

### Relevant log output

```shell

```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.