diff --git a/src/Mono.Android/Android.App/Dialog.cs b/src/Mono.Android/Android.App/Dialog.cs index 94c40398b18..14f32f00bc1 100644 --- a/src/Mono.Android/Android.App/Dialog.cs +++ b/src/Mono.Android/Android.App/Dialog.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics.CodeAnalysis; using Android.Runtime; namespace Android.App { @@ -9,8 +8,7 @@ public partial class Dialog { protected Dialog (Android.Content.Context context, bool cancelable, EventHandler cancelHandler) : this (context, cancelable, new Android.Content.IDialogInterfaceOnCancelListenerImplementor () { Handler = cancelHandler }) {} - [return: MaybeNull] - public T FindViewById (int id) + public T? FindViewById (int id) where T : Android.Views.View { return this.FindViewById (id).JavaCast (); diff --git a/src/Mono.Android/Android.App/FragmentManager.cs b/src/Mono.Android/Android.App/FragmentManager.cs index 8b67deecaa7..5d32da4a247 100644 --- a/src/Mono.Android/Android.App/FragmentManager.cs +++ b/src/Mono.Android/Android.App/FragmentManager.cs @@ -1,22 +1,18 @@ -using System.Diagnostics.CodeAnalysis; using Android.OS; using Android.Runtime; #if ANDROID_11 namespace Android.App { public partial class FragmentManager { - [return: MaybeNull] - public T FindFragmentById (int id) where T : Fragment + public T? FindFragmentById (int id) where T : Fragment { return FindFragmentById (id).JavaCast (); } - [return: MaybeNull] - public T FindFragmentByTag (string tag) where T : Fragment + public T? FindFragmentByTag (string tag) where T : Fragment { return FindFragmentByTag (tag).JavaCast (); } - [return: MaybeNull] - public T GetFragment (Bundle bundle, string key) where T : Fragment + public T? GetFragment (Bundle bundle, string key) where T : Fragment { return GetFragment (bundle, key).JavaCast (); } diff --git a/src/Mono.Android/Android.Graphics/Color.cs b/src/Mono.Android/Android.Graphics/Color.cs index 6b866cb4735..bf57968663c 100644 --- a/src/Mono.Android/Android.Graphics/Color.cs +++ b/src/Mono.Android/Android.Graphics/Color.cs @@ -416,7 +416,7 @@ public override void DestroyGenericArgumentState (Color value, ref JniValueMarsh public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize, Type targetType) { - var c = typeof (Color).GetConstructor (new[]{typeof (int)}); + var c = typeof (Color).GetConstructor (new[]{typeof (int)})!; var v = Expression.Variable (typeof (Color), sourceValue.Name + "_val"); context.LocalVariables.Add (v); context.CreationStatements.Add (Expression.Assign (v, Expression.New (c, sourceValue))); diff --git a/src/Mono.Android/Android.OS/AsyncTask.cs b/src/Mono.Android/Android.OS/AsyncTask.cs index 772e2e69908..fe58a59c43b 100644 --- a/src/Mono.Android/Android.OS/AsyncTask.cs +++ b/src/Mono.Android/Android.OS/AsyncTask.cs @@ -88,9 +88,8 @@ public AsyncTask () } static IntPtr id_get; - [return: MaybeNull] [Register ("get", "()Ljava/lang/Object;", "")] - public TResult GetResult () + public TResult? GetResult () { if (id_get == IntPtr.Zero) id_get = JNIEnv.GetMethodID (class_ref, "get", "()Ljava/lang/Object;"); diff --git a/src/Mono.Android/Android.Runtime/JNIEnv.cs b/src/Mono.Android/Android.Runtime/JNIEnv.cs index 1b4c2430344..92ff8fe3a70 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnv.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnv.cs @@ -747,7 +747,7 @@ public static void CopyArray (IntPtr src, string[] dest) static TValue GetConverter(Dictionary dict, Type? elementType, IntPtr array) { - TValue converter; + TValue? converter; if (elementType != null) { if (elementType.IsEnum) diff --git a/src/Mono.Android/Android.Runtime/JavaCollection.cs b/src/Mono.Android/Android.Runtime/JavaCollection.cs index de61c1c2dd7..70660bc24a3 100644 --- a/src/Mono.Android/Android.Runtime/JavaCollection.cs +++ b/src/Mono.Android/Android.Runtime/JavaCollection.cs @@ -386,8 +386,7 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () return GetEnumerator ()!; } - [return: MaybeNull] - public IEnumerator GetEnumerator () + public IEnumerator GetEnumerator () { return System.Linq.Extensions.ToEnumerator_Dispose (Iterator()); } diff --git a/src/Mono.Android/Android.Runtime/JavaDictionary.cs b/src/Mono.Android/Android.Runtime/JavaDictionary.cs index 773bd217530..80656dfc58c 100644 --- a/src/Mono.Android/Android.Runtime/JavaDictionary.cs +++ b/src/Mono.Android/Android.Runtime/JavaDictionary.cs @@ -444,8 +444,7 @@ public JavaDictionary (IDictionary items) : this () // // https://developer.android.com/reference/java/util/Map#get(java.lang.Object) // - [return: MaybeNull] - internal V Get (K key) + internal V? Get (K key) { if (id_get == IntPtr.Zero) id_get = JNIEnv.GetMethodID (map_class, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); diff --git a/src/Mono.Android/Android.Runtime/JavaList.cs b/src/Mono.Android/Android.Runtime/JavaList.cs index 6fb441fdba1..980b01f386e 100644 --- a/src/Mono.Android/Android.Runtime/JavaList.cs +++ b/src/Mono.Android/Android.Runtime/JavaList.cs @@ -727,8 +727,7 @@ public JavaList (IEnumerable items) : this () // // https://developer.android.com/reference/java/util/List.html?hl=en#get(int) // - [return: MaybeNull] - internal unsafe T InternalGet (int location) + internal unsafe T? InternalGet (int location) { const string id = "get.(I)Ljava/lang/Object;"; JniObjectReference obj; @@ -880,8 +879,7 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () return GetEnumerator ()!; } - [return: MaybeNull] - public IEnumerator GetEnumerator () + public IEnumerator GetEnumerator () { return System.Linq.Extensions.ToEnumerator_Dispose (Iterator ()); } diff --git a/src/Mono.Android/Android.Runtime/JavaSet.cs b/src/Mono.Android/Android.Runtime/JavaSet.cs index 381877c44a0..c141e1058a4 100644 --- a/src/Mono.Android/Android.Runtime/JavaSet.cs +++ b/src/Mono.Android/Android.Runtime/JavaSet.cs @@ -390,7 +390,6 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () return GetEnumerator ()!; } - [return: MaybeNull] public IEnumerator GetEnumerator () { return System.Linq.Extensions.ToEnumerator_Dispose (Iterator ()); diff --git a/src/Mono.Android/Android.Runtime/XmlPullParserReader.cs b/src/Mono.Android/Android.Runtime/XmlPullParserReader.cs index 72d18b90a08..5bda50595b2 100644 --- a/src/Mono.Android/Android.Runtime/XmlPullParserReader.cs +++ b/src/Mono.Android/Android.Runtime/XmlPullParserReader.cs @@ -72,7 +72,7 @@ public QName (XmlPullParserReader r, string name) } public string LocalName; - public string Namespace; + public string? Namespace; } public XmlPullParserReader (IJavaObject source) @@ -140,7 +140,7 @@ public override bool EOF { throw new ArgumentOutOfRangeException (); } - public override string? GetAttribute (string localName, string namespaceName) + public override string? GetAttribute (string localName, string? namespaceName) { return namespaceName == xmlns_uri ? source.GetNamespace (localName) : source.GetAttributeValue (namespaceName, localName); } @@ -179,7 +179,7 @@ public override string? LocalName { } } - public override string LookupNamespace (string prefix) + public override string? LookupNamespace (string prefix) { return nsmgr.LookupNamespace (prefix); } @@ -192,7 +192,7 @@ public override void MoveToAttribute (int i) attr_value = false; } - public override bool MoveToAttribute (string localName, string namespaceName) + public override bool MoveToAttribute (string localName, string? namespaceName) { if (namespaceName == xmlns_uri) { for (int i = 0; i < ns_count; i++) @@ -251,7 +251,7 @@ public override string? Name { get { return String.IsNullOrEmpty (Prefix) ? LocalName : Prefix + ':' + LocalName; } } - public override XmlNameTable NameTable { + public override XmlNameTable? NameTable { get { return nsmgr.NameTable; } } @@ -297,9 +297,14 @@ public override XmlNodeType NodeType { } } - public override string Prefix { + public override string? Prefix { // getPrefix(), getAttributePrefix(), getNamespacePrefix() are not supported!!! - get { return nsmgr.LookupPrefix (NamespaceURI); } + get { + if (NamespaceURI is null) + return null; + + return nsmgr.LookupPrefix (NamespaceURI); + } } public override bool Read () @@ -331,14 +336,14 @@ public override bool Read () if (wasEmptyElement || NodeType == XmlNodeType.EndElement) nsmgr.PopScope (); if (NodeType == XmlNodeType.Element) { - if (NamespaceURI != String.Empty && nsmgr.LookupPrefix (NamespaceURI) != String.Empty) + if (!string.IsNullOrEmpty (NamespaceURI) && nsmgr.LookupPrefix (NamespaceURI) != String.Empty) nsmgr.AddNamespace (String.Empty, NamespaceURI); else if (NamespaceURI == String.Empty && nsmgr.DefaultNamespace != String.Empty) nsmgr.AddNamespace (String.Empty, String.Empty); for (int i = 0; i < source.AttributeCount; i++) { string? ns = source.GetAttributeNamespace (i); - if (ns != String.Empty && nsmgr.LookupPrefix (ns) == null) - nsmgr.AddNamespace ("p" + i, source.GetAttributeNamespace (i)); + if (!string.IsNullOrEmpty (ns) && nsmgr.LookupPrefix (ns) == null) + nsmgr.AddNamespace ("p" + i, ns); } nsmgr.PushScope (); } diff --git a/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs b/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs index ad19ae407da..4fcf755ce3f 100644 --- a/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs +++ b/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs @@ -111,11 +111,11 @@ public int GetIdAttributeResourceValue (int defaultValue) return GetAttributeResourceValue (null, "id", defaultValue); } - public string ClassAttribute { + public string? ClassAttribute { get { return GetAttributeValue (null, "class"); } } - public string IdAttribute { + public string? IdAttribute { get { return GetAttributeValue (null, "id"); } } @@ -181,8 +181,11 @@ public string GetAttributeValue (int index) return r.GetAttribute (index); } - public string GetAttributeValue (string? namespaceURI, string? name) + public string? GetAttributeValue (string? namespaceURI, string? name) { + if (name is null) + return null; + return r.GetAttribute (name, namespaceURI); } @@ -196,7 +199,7 @@ public bool GetFeature (string? name) return false; } - public string GetNamespace (string? prefix) + public string? GetNamespace (string prefix) { return r.LookupNamespace (prefix); } diff --git a/src/Mono.Android/Android.Telephony/CellInfo.cs b/src/Mono.Android/Android.Telephony/CellInfo.cs index 66526a38dbb..c8b5d91ffda 100644 --- a/src/Mono.Android/Android.Telephony/CellInfo.cs +++ b/src/Mono.Android/Android.Telephony/CellInfo.cs @@ -9,7 +9,7 @@ namespace Android.Telephony { public partial class CellInfo { - static Delegate cb_getCellIdentity; + static Delegate? cb_getCellIdentity; #pragma warning disable 0169 static Delegate GetGetCellIdentityHandler () { @@ -20,7 +20,7 @@ static Delegate GetGetCellIdentityHandler () static IntPtr n_GetCellIdentity (IntPtr jnienv, IntPtr native__this) { - Android.Telephony.CellInfo __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer); + var __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!; return JNIEnv.ToLocalJniHandle (__this.CellIdentity); } #pragma warning restore 0169 @@ -32,7 +32,7 @@ public unsafe virtual Android.Telephony.CellIdentity CellIdentity { const string __id = "getCellIdentity.()Landroid/telephony/CellIdentity;"; try { var __rm = _members.InstanceMethods.InvokeVirtualObjectMethod (__id, this, null); - return global::Java.Lang.Object.GetObject (__rm.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Lang.Object.GetObject (__rm.Handle, JniHandleOwnership.TransferLocalRef)!; } catch (Java.Lang.NoSuchMethodError) { throw new Java.Lang.AbstractMethodError (__id); @@ -40,7 +40,7 @@ public unsafe virtual Android.Telephony.CellIdentity CellIdentity { } } - static Delegate cb_getCellSignalStrength; + static Delegate? cb_getCellSignalStrength; #pragma warning disable 0169 static Delegate GetGetCellSignalStrengthHandler () { @@ -51,7 +51,7 @@ static Delegate GetGetCellSignalStrengthHandler () static IntPtr n_GetCellSignalStrength (IntPtr jnienv, IntPtr native__this) { - Android.Telephony.CellInfo __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer); + var __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!; return JNIEnv.ToLocalJniHandle (__this.CellSignalStrength); } #pragma warning restore 0169 @@ -63,7 +63,7 @@ public unsafe virtual Android.Telephony.CellSignalStrength CellSignalStrength { const string __id = "getCellSignalStrength.()Landroid/telephony/CellSignalStrength;"; try { var __rm = _members.InstanceMethods.InvokeVirtualObjectMethod (__id, this, null); - return global::Java.Lang.Object.GetObject (__rm.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Lang.Object.GetObject (__rm.Handle, JniHandleOwnership.TransferLocalRef)!; } catch (Java.Lang.NoSuchMethodError) { throw new Java.Lang.AbstractMethodError (__id); diff --git a/src/Mono.Android/Android.Views/View.cs b/src/Mono.Android/Android.Views/View.cs index 41ed43e6982..fdf7647cd03 100644 --- a/src/Mono.Android/Android.Views/View.cs +++ b/src/Mono.Android/Android.Views/View.cs @@ -22,8 +22,7 @@ public bool PerformAccessibilityAction (GlobalAction action, Bundle arguments) } #endif - [return: MaybeNull] - public T FindViewById (int id) + public T? FindViewById (int id) where T : Android.Views.View { return this.FindViewById (id).JavaCast (); diff --git a/src/Mono.Android/Android.Views/Window.cs b/src/Mono.Android/Android.Views/Window.cs index a28ea6c1a07..6164a970d6a 100644 --- a/src/Mono.Android/Android.Views/Window.cs +++ b/src/Mono.Android/Android.Views/Window.cs @@ -6,8 +6,7 @@ namespace Android.Views { partial class Window { - [return: MaybeNull] - public T FindViewById (int id) + public T? FindViewById (int id) where T : Android.Views.View { return this.FindViewById (id).JavaCast (); diff --git a/src/Mono.Android/Android.Widget/ArrayAdapter.cs b/src/Mono.Android/Android.Widget/ArrayAdapter.cs index f27e9caf885..cf35e67fc07 100644 --- a/src/Mono.Android/Android.Widget/ArrayAdapter.cs +++ b/src/Mono.Android/Android.Widget/ArrayAdapter.cs @@ -185,9 +185,8 @@ public void Add (T @object) } static IntPtr id_getItem_I; - [return: MaybeNull] [Register ("getItem", "(I)Ljava/lang/Object;", "GetGetItem_IHandler")] - public T GetItem (int position) + public T? GetItem (int position) { if (id_getItem_I == IntPtr.Zero) id_getItem_I = JNIEnv.GetMethodID (class_ref, "getItem", "(I)Ljava/lang/Object;"); diff --git a/src/Mono.Android/Java.Interop/JavaConvert.cs b/src/Mono.Android/Java.Interop/JavaConvert.cs index 6f132b95bf3..678ead478b9 100644 --- a/src/Mono.Android/Java.Interop/JavaConvert.cs +++ b/src/Mono.Android/Java.Interop/JavaConvert.cs @@ -92,15 +92,13 @@ static Func GetJniHandleConverterForType ([D typeof (Func), m); } - [return: MaybeNull] - public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer) + public static T? FromJniHandle(IntPtr handle, JniHandleOwnership transfer) { bool set; return FromJniHandle(handle, transfer, out set); } - [return: MaybeNull] - public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out bool set) + public static T? FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out bool set) { if (handle == IntPtr.Zero) { set = false; @@ -109,7 +107,7 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out var interned = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (interned != null) { - T r = FromJavaObject(interned, out set); + T? r = FromJavaObject(interned, out set); if (set) { JNIEnv.DeleteRef (handle, transfer); return r; @@ -119,12 +117,12 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out set = true; if (typeof (IJavaObject).IsAssignableFrom (typeof (T))) - return (T) Java.Lang.Object._GetObject (handle, transfer); + return (T?) Java.Lang.Object._GetObject (handle, transfer); var converter = GetJniHandleConverter (typeof (T)) ?? GetJniHandleConverter (GetTypeMapping (handle)); if (converter != null) - return (T) converter (handle, transfer); + return (T?) converter (handle, transfer); var v = Java.Lang.Object.GetObject (handle, transfer); if (v is T) @@ -132,7 +130,7 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out // hail mary pass; perhaps there's a MCW which participates in normal // .NET type conversion? - return (T) Convert.ChangeType (v, typeof (T), CultureInfo.InvariantCulture); + return (T?) Convert.ChangeType (v, typeof (T), CultureInfo.InvariantCulture); } public static object? FromJniHandle (IntPtr handle, JniHandleOwnership transfer, Type? targetType = null) @@ -208,15 +206,13 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out return null; } - [return: MaybeNull] - public static T FromJavaObject(IJavaObject? value) + public static T? FromJavaObject(IJavaObject? value) { bool set; return FromJavaObject(value, out set); } - [return: MaybeNull] - public static T FromJavaObject(IJavaObject? value, out bool set) + public static T? FromJavaObject(IJavaObject? value, out bool set) { if (value == null) { set = false; @@ -244,7 +240,7 @@ public static T FromJavaObject(IJavaObject? value, out bool set) set = true; var converter = GetJniHandleConverter (typeof (T)); if (converter != null) - return (T) converter (lrefValue, JniHandleOwnership.TransferLocalRef); + return (T?) converter (lrefValue, JniHandleOwnership.TransferLocalRef); JNIEnv.DeleteLocalRef (lrefValue); return (T) Convert.ChangeType (value, typeof (T), CultureInfo.InvariantCulture); } diff --git a/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs b/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs index 0110165e1be..145633b7e55 100644 --- a/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs +++ b/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs @@ -52,8 +52,7 @@ public static JavaDictionary ToInteroperableCollection (this IDictiona return _JavaCast (instance); } - [return: MaybeNull] - internal static TResult _JavaCast (this IJavaObject? instance) + internal static TResult? _JavaCast (this IJavaObject? instance) { if (instance == null) return default (TResult); @@ -69,7 +68,7 @@ internal static TResult _JavaCast (this IJavaObject? instance) return (TResult) CastClass (instance, resultType); } else if (resultType.IsInterface) { - return (TResult) Java.Lang.Object.GetObject (instance.Handle, JniHandleOwnership.DoNotTransfer, resultType); + return (TResult?) Java.Lang.Object.GetObject (instance.Handle, JniHandleOwnership.DoNotTransfer, resultType); } else throw new NotSupportedException (FormattableString.Invariant ($"Unable to convert type '{instance.GetType ().FullName}' to '{resultType.FullName}'.")); diff --git a/src/Mono.Android/Java.Interop/TypeManager.cs b/src/Mono.Android/Java.Interop/TypeManager.cs index 6d4556bf7a4..269eda87a48 100644 --- a/src/Mono.Android/Java.Interop/TypeManager.cs +++ b/src/Mono.Android/Java.Interop/TypeManager.cs @@ -7,6 +7,7 @@ using Java.Interop.Tools.TypeNameMappings; using Android.Runtime; +using System.Diagnostics.CodeAnalysis; namespace Java.Interop { @@ -166,7 +167,7 @@ static void n_Activate (IntPtr jnienv, IntPtr jclass, IntPtr typename_ptr, IntPt internal static void Activate (IntPtr jobject, ConstructorInfo cinfo, object? []? parms) { try { - var newobj = RuntimeHelpers.GetUninitializedObject (cinfo.DeclaringType); + var newobj = RuntimeHelpers.GetUninitializedObject (cinfo.DeclaringType!); if (newobj is Java.Lang.Object o) { o.handle = jobject; } else if (newobj is Java.Lang.Throwable throwable) { @@ -177,7 +178,7 @@ internal static void Activate (IntPtr jobject, ConstructorInfo cinfo, object? [] cinfo.Invoke (newobj, parms); } catch (Exception e) { var m = FormattableString.Invariant ( - $"Could not activate JNI Handle 0x{jobject:x} (key_handle 0x{JNIEnv.IdentityHash (jobject):x}) of Java type '{JNIEnv.GetClassNameFromInstance (jobject)}' as managed type '{cinfo.DeclaringType.FullName}'."); + $"Could not activate JNI Handle 0x{jobject:x} (key_handle 0x{JNIEnv.IdentityHash (jobject):x}) of Java type '{JNIEnv.GetClassNameFromInstance (jobject)}' as managed type '{cinfo?.DeclaringType?.FullName}'."); Logger.Log (LogLevel.Warn, "monodroid", m); Logger.Log (LogLevel.Warn, "monodroid", CreateJavaLocationException ().ToString ()); @@ -238,7 +239,7 @@ static Exception CreateJavaLocationException () Type? type = null; int ls = class_name.LastIndexOf ('/'); var package = ls >= 0 ? class_name.Substring (0, ls) : ""; - if (packageLookup.TryGetValue (package, out var mappers)) { + if (packageLookup!.TryGetValue (package, out var mappers)) { foreach (Converter c in mappers) { type = c (class_name); if (type == null) @@ -360,6 +361,7 @@ public static void RegisterType (string java_class, Type t) static Dictionary>>? packageLookup; + [MemberNotNull (nameof (packageLookup))] static void LazyInitPackageLookup () { if (packageLookup == null) diff --git a/src/Mono.Android/Java.Lang/Object.cs b/src/Mono.Android/Java.Lang/Object.cs index 01dde260fc5..1c9ffe12260 100644 --- a/src/Mono.Android/Java.Lang/Object.cs +++ b/src/Mono.Android/Java.Lang/Object.cs @@ -263,10 +263,9 @@ protected void SetHandle (IntPtr value, JniHandleOwnership transfer) return peeked; } - [return: MaybeNull] - internal static T PeekObject (IntPtr handle) + internal static T? PeekObject (IntPtr handle) { - return (T)PeekObject (handle, typeof (T)); + return (T?)PeekObject (handle, typeof (T)); } public static T? GetObject (IntPtr jnienv, IntPtr handle, JniHandleOwnership transfer) @@ -282,13 +281,12 @@ protected void SetHandle (IntPtr value, JniHandleOwnership transfer) return _GetObject(handle, transfer); } - [return: MaybeNull] - internal static T _GetObject (IntPtr handle, JniHandleOwnership transfer) + internal static T? _GetObject (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return default (T); - return (T) GetObject (handle, transfer, typeof (T)); + return (T?) GetObject (handle, transfer, typeof (T)); } internal static IJavaPeerable? GetObject (IntPtr handle, JniHandleOwnership transfer, Type? type = null) @@ -306,8 +304,7 @@ internal static T _GetObject (IntPtr handle, JniHandleOwnership transfer) } [EditorBrowsable (EditorBrowsableState.Never)] - [return: MaybeNull] - public T[] ToArray() + public T[]? ToArray() { return JNIEnv.GetArray(Handle); } diff --git a/src/Mono.Android/System.Drawing/PointConverter.cs b/src/Mono.Android/System.Drawing/PointConverter.cs index 3c9d6c2acb6..0255e55c87e 100644 --- a/src/Mono.Android/System.Drawing/PointConverter.cs +++ b/src/Mono.Android/System.Drawing/PointConverter.cs @@ -62,7 +62,7 @@ public override bool CanConvertTo (ITypeDescriptorContext context, return base.CanConvertTo (context, destinationType); } - public override object ConvertFrom (ITypeDescriptorContext context, + public override object? ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value) { @@ -77,7 +77,10 @@ public override object ConvertFrom (ITypeDescriptorContext context, Int32Converter converter = new Int32Converter (); int[] numSubs = new int[subs.Length]; for (int i = 0; i < numSubs.Length; i++) { - numSubs[i] = (int) converter.ConvertFromString (context, culture, subs[i]); + if (converter.ConvertFromString (context, culture, subs[i]) is int num) + numSubs[i] = num; + else + throw new ArgumentException ($"Could not parse string '{subs[i]}' as integer"); } if (subs.Length != 2) @@ -86,7 +89,7 @@ public override object ConvertFrom (ITypeDescriptorContext context, return new Point (numSubs[0], numSubs[1]); } - public override object ConvertTo (ITypeDescriptorContext context, + public override object? ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) @@ -130,7 +133,7 @@ public override bool GetCreateInstanceSupported (ITypeDescriptorContext context) return true; } - public override PropertyDescriptorCollection GetProperties ( + public override PropertyDescriptorCollection? GetProperties ( ITypeDescriptorContext context, object value, Attribute[] attributes) { diff --git a/src/Mono.Android/System.Drawing/RectangleConverter.cs b/src/Mono.Android/System.Drawing/RectangleConverter.cs index dae83bded0d..364784f495f 100644 --- a/src/Mono.Android/System.Drawing/RectangleConverter.cs +++ b/src/Mono.Android/System.Drawing/RectangleConverter.cs @@ -66,7 +66,7 @@ public override bool CanConvertTo (ITypeDescriptorContext context, return base.CanConvertTo (context, destinationType); } - public override object ConvertFrom (ITypeDescriptorContext context, + public override object? ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value) { @@ -79,7 +79,10 @@ public override object ConvertFrom (ITypeDescriptorContext context, Int32Converter converter = new Int32Converter (); int[] numSubs = new int[subs.Length]; for (int i = 0; i < numSubs.Length; i++) { - numSubs[i] = (int) converter.ConvertFromString (context, culture, subs[i]); + if (converter.ConvertFromString (context, culture, subs[i]) is int num) + numSubs[i] = num; + else + throw new ArgumentException ($"Could not parse string '{subs[i]}' as integer"); } if (subs.Length != 4) @@ -88,7 +91,7 @@ public override object ConvertFrom (ITypeDescriptorContext context, return new Rectangle (numSubs[0], numSubs[1], numSubs[2], numSubs[3]); } - public override object ConvertTo (ITypeDescriptorContext context, + public override object? ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) @@ -144,7 +147,7 @@ public override bool GetCreateInstanceSupported (ITypeDescriptorContext context) return true; } - public override PropertyDescriptorCollection GetProperties ( + public override PropertyDescriptorCollection? GetProperties ( ITypeDescriptorContext context, object value, Attribute[] attributes) { diff --git a/src/Mono.Android/System.Drawing/SizeConverter.cs b/src/Mono.Android/System.Drawing/SizeConverter.cs index b3ae44fe2b8..53fe055733c 100644 --- a/src/Mono.Android/System.Drawing/SizeConverter.cs +++ b/src/Mono.Android/System.Drawing/SizeConverter.cs @@ -65,7 +65,7 @@ public override bool CanConvertTo (ITypeDescriptorContext context, return base.CanConvertTo (context, destinationType); } - public override object ConvertFrom (ITypeDescriptorContext context, + public override object? ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value) { @@ -80,7 +80,10 @@ public override object ConvertFrom (ITypeDescriptorContext context, Int32Converter converter = new Int32Converter (); int[] numSubs = new int[subs.Length]; for (int i = 0; i < numSubs.Length; i++) { - numSubs[i] = (int) converter.ConvertFromString (context, culture, subs[i]); + if (converter.ConvertFromString (context, culture, subs[i]) is int num) + numSubs[i] = num; + else + throw new ArgumentException ($"Could not parse string '{subs[i]}' as integer"); } if (subs.Length != 2) @@ -89,7 +92,7 @@ public override object ConvertFrom (ITypeDescriptorContext context, return new Size (numSubs[0], numSubs[1]); } - public override object ConvertTo (ITypeDescriptorContext context, + public override object? ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) @@ -132,7 +135,7 @@ public override bool GetCreateInstanceSupported (ITypeDescriptorContext context) return true; } - public override PropertyDescriptorCollection GetProperties ( + public override PropertyDescriptorCollection? GetProperties ( ITypeDescriptorContext context, object value, Attribute[] attributes) { diff --git a/src/Mono.Android/System.Drawing/SizeFConverter.cs b/src/Mono.Android/System.Drawing/SizeFConverter.cs index 7f0164cbd4c..8933839fba2 100644 --- a/src/Mono.Android/System.Drawing/SizeFConverter.cs +++ b/src/Mono.Android/System.Drawing/SizeFConverter.cs @@ -66,7 +66,7 @@ public override bool CanConvertTo (ITypeDescriptorContext context, Type destinat return base.CanConvertTo (context, destinationType); } - public override object ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value) + public override object? ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value) { var s = value as string; if (s == null) @@ -77,7 +77,10 @@ public override object ConvertFrom (ITypeDescriptorContext context, CultureInfo SingleConverter converter = new SingleConverter (); float[] numSubs = new float[subs.Length]; for (int i = 0; i < numSubs.Length; i++) { - numSubs[i] = (float) converter.ConvertFromString (context, culture, subs[i]); + if (converter.ConvertFromString (context, culture, subs[i]) is float num) + numSubs[i] = num; + else + throw new ArgumentException ($"Could not parse string '{subs[i]}' as float"); } if (subs.Length != 2) @@ -87,7 +90,7 @@ public override object ConvertFrom (ITypeDescriptorContext context, CultureInfo } - public override object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + public override object? ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (value is SizeF) { SizeF size = (SizeF) value; @@ -115,7 +118,7 @@ public override bool GetCreateInstanceSupported (ITypeDescriptorContext context) return true; } - public override PropertyDescriptorCollection GetProperties (ITypeDescriptorContext context, object value, Attribute[] attributes) + public override PropertyDescriptorCollection? GetProperties (ITypeDescriptorContext context, object value, Attribute[] attributes) { if (value is SizeF) return TypeDescriptor.GetProperties (value, attributes); diff --git a/src/Mono.Android/System.Linq/Extensions.cs b/src/Mono.Android/System.Linq/Extensions.cs index bdb36cb09e1..ac555e17949 100644 --- a/src/Mono.Android/System.Linq/Extensions.cs +++ b/src/Mono.Android/System.Linq/Extensions.cs @@ -40,8 +40,7 @@ internal static IEnumerator ToEnumerator_Dispose (this Java.Util.IIterator sourc } } - [return: MaybeNull] - public static IEnumerable ToEnumerable (this Java.Lang.IIterable source) + public static IEnumerable ToEnumerable (this Java.Lang.IIterable source) { if (source == null) throw new ArgumentNullException ("source"); @@ -53,7 +52,6 @@ public static IEnumerable ToEnumerable (this Java.Lang.IIterable source) } } - [return: MaybeNull] internal static IEnumerator ToEnumerator_Dispose (this Java.Util.IIterator source) { using (source) diff --git a/src/Mono.Android/Xamarin.Android.Net/AndroidClientHandler.cs b/src/Mono.Android/Xamarin.Android.Net/AndroidClientHandler.cs index a641d1cdc8b..83e858e1a62 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AndroidClientHandler.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AndroidClientHandler.cs @@ -310,7 +310,7 @@ protected virtual Task SetupRequest (HttpRequestMessage request, HttpURLConnecti } [DynamicDependency (DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof (AndroidMessageHandler))] - object GetUnderlyingHandler () + object? GetUnderlyingHandler () { var fieldName = "_nativeHandler"; FieldInfo? field = null; diff --git a/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs b/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs index 7d42441c66e..6804db9ced1 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs @@ -133,7 +133,7 @@ public void Reset () new AuthModuleDigest () }; - CookieContainer _cookieContainer; + CookieContainer? _cookieContainer; DecompressionMethods _decompressionMethods; bool disposed; @@ -183,9 +183,9 @@ public CookieContainer CookieContainer public ClientCertificateOption ClientCertificateOptions { get; set; } - public X509CertificateCollection ClientCertificates { get; set; } + public X509CertificateCollection? ClientCertificates { get; set; } - public ICredentials DefaultProxyCredentials { get; set; } + public ICredentials? DefaultProxyCredentials { get; set; } public int MaxConnectionsPerServer { get; set; } = int.MaxValue; @@ -214,7 +214,7 @@ public CookieContainer CookieContainer (int)Build.VERSION.SdkInt >= 29 ? SslProtocols.Tls13 | SslProtocols.Tls12 : SslProtocols.Tls12; - public IDictionary Properties { get; set; } + public IDictionary? Properties { get; set; } int maxAutomaticRedirections = 50; @@ -398,7 +398,7 @@ string EncodeUrl (Uri url) } #if !MONOANDROID1_0 - async Task SendWithNegotiateAuthenticationAsync (HttpRequestMessage request, CancellationToken cancellationToken) + async Task SendWithNegotiateAuthenticationAsync (HttpRequestMessage request, CancellationToken cancellationToken) { var response = await DoSendAsync (request, cancellationToken).ConfigureAwait (false); @@ -418,7 +418,7 @@ string EncodeUrl (Uri url) if (request == null) throw new ArgumentNullException (nameof (request)); - if (!request.RequestUri.IsAbsoluteUri) + if (request.RequestUri is null || !request.RequestUri.IsAbsoluteUri) throw new ArgumentException ("Must represent an absolute URI", "request"); var redirectState = new RequestRedirectionState { @@ -484,7 +484,7 @@ string EncodeUrl (Uri url) return proxy; } - Uri puri = Proxy.GetProxy (destination); + Uri? puri = Proxy.GetProxy (destination); if (puri == null) { return proxy; } @@ -540,6 +540,9 @@ Task ConnectAsync (HttpURLConnection httpConnection, CancellationToken ct) protected virtual async Task WriteRequestContentToOutput (HttpRequestMessage request, HttpURLConnection httpConnection, CancellationToken cancellationToken) { + if (request.Content is null) + return; + using (var stream = await request.Content.ReadAsStreamAsync ().ConfigureAwait (false)) { await stream.CopyToAsync(httpConnection.OutputStream!, 4096, cancellationToken).ConfigureAwait(false); @@ -738,7 +741,7 @@ Stream GetDecompressionWrapper (URLConnection httpConnection, Stream inputStream return inputStream; } - var encodings = new HashSet (httpConnection.ContentEncoding?.Split (','), StringComparer.OrdinalIgnoreCase); + var encodings = new HashSet (httpConnection.ContentEncoding.Split (','), StringComparer.OrdinalIgnoreCase); Stream? ret = null; string? supportedEncoding = null; if (encodings.Contains (GZIP_ENCODING)) { @@ -924,8 +927,7 @@ AuthenticationScheme GetAuthScheme (string scheme) void ParseCookies (AndroidHttpResponseMessage ret, Uri connectionUri) { - IEnumerable cookieHeaderValue; - if (!UseCookies || CookieContainer == null || !ret.Headers.TryGetValues ("Set-Cookie", out cookieHeaderValue) || cookieHeaderValue == null) { + if (!UseCookies || CookieContainer == null || !ret.Headers.TryGetValues ("Set-Cookie", out var cookieHeaderValue) || cookieHeaderValue == null) { if (Logger.LogNet) Logger.Log (LogLevel.Info, LOG_APP, $"No cookies"); return; @@ -1114,7 +1116,7 @@ void AppendEncoding (string encoding, ref List ? list) if (accept_encoding?.Count > 0) httpConnection.SetRequestProperty ("Accept-Encoding", String.Join (",", accept_encoding)); - if (UseCookies && CookieContainer != null) { + if (UseCookies && CookieContainer != null && request.RequestUri is not null) { string cookieHeaderValue = CookieContainer.GetCookieHeader (request.RequestUri); if (!String.IsNullOrEmpty (cookieHeaderValue)) httpConnection.SetRequestProperty ("Cookie", cookieHeaderValue); diff --git a/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs b/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs index 4fb5f1ff3cc..e099c98095f 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs @@ -138,7 +138,7 @@ public bool Parse (string challenge) lastUse = DateTime.Now; var uri = new Uri (request.URL?.ToString ()!); - NetworkCredential cred = credentials.GetCredential (uri, "digest"); + NetworkCredential? cred = credentials.GetCredential (uri, "digest"); if (cred == null) return null; diff --git a/src/Mono.Android/Xamarin.Android.Net/AuthModuleBasic.cs b/src/Mono.Android/Xamarin.Android.Net/AuthModuleBasic.cs index 92052d41eb9..ec8813a1d40 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AuthModuleBasic.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AuthModuleBasic.cs @@ -34,7 +34,7 @@ sealed class AuthModuleBasic : IAndroidAuthenticationModule if (request == null || credentials == null) return null; - NetworkCredential cred = credentials.GetCredential (new Uri (request.URL?.ToString ()!), AuthenticationType.ToLowerInvariant ()); + NetworkCredential? cred = credentials.GetCredential (new Uri (request.URL?.ToString ()!), AuthenticationType.ToLowerInvariant ()); if (cred == null) return null; diff --git a/src/Mono.Android/Xamarin.Android.Net/NegotiateAuthenticationHelper.cs b/src/Mono.Android/Xamarin.Android.Net/NegotiateAuthenticationHelper.cs index de025c7b4fd..55641a649de 100644 --- a/src/Mono.Android/Xamarin.Android.Net/NegotiateAuthenticationHelper.cs +++ b/src/Mono.Android/Xamarin.Android.Net/NegotiateAuthenticationHelper.cs @@ -18,9 +18,9 @@ internal static class NegotiateAuthenticationHelper internal class RequestedNegotiateAuthenticationData { - public string AuthType { get; init; } + public required string AuthType { get; init; } public bool IsProxyAuth { get; init; } - public NetworkCredential Credential { get; init; } + public required NetworkCredential Credential { get; init; } } internal static bool RequestNeedsNegotiateAuthentication ( diff --git a/src/Mono.Android/Xamarin.Android.Net/ServerCertificateCustomValidator.cs b/src/Mono.Android/Xamarin.Android.Net/ServerCertificateCustomValidator.cs index e9201280b3a..ac6cb91d599 100644 --- a/src/Mono.Android/Xamarin.Android.Net/ServerCertificateCustomValidator.cs +++ b/src/Mono.Android/Xamarin.Android.Net/ServerCertificateCustomValidator.cs @@ -74,10 +74,10 @@ public void CheckServerTrusted (JavaX509Certificate[] javaChain, string authType } public void CheckClientTrusted (JavaX509Certificate[] chain, string authType) - => _internalTrustManager.CheckClientTrusted (chain, authType); + => _internalTrustManager?.CheckClientTrusted (chain, authType); public JavaX509Certificate[] GetAcceptedIssuers () - => _internalTrustManager.GetAcceptedIssuers () ?? Array.Empty (); + => _internalTrustManager?.GetAcceptedIssuers () ?? Array.Empty (); private bool VerifyHostname (JavaX509Certificate[] javaChain) { @@ -158,8 +158,11 @@ private sealed class AlwaysAcceptingHostnameVerifier : Java.Lang.Object, IHostna public bool Verify (string? hostname, ISSLSession? session) => true; } - private static IX509TrustManager? FindX509TrustManager(ITrustManager[] trustManagers) + private static IX509TrustManager? FindX509TrustManager(ITrustManager[]? trustManagers) { + if (trustManagers is null) + return null; + foreach (var trustManager in trustManagers) { if (trustManager is IX509TrustManager tm) return tm;