From 0077c8f3661343ce139c86bb835384e6fb3a6e8c Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Thu, 23 Apr 2020 17:39:32 -0500 Subject: [PATCH] [Mono.Android] Add NRT annotations. (#4227) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Context: https://github.com/xamarin/java.interop/commit/01d06845499794601c2beedca50e1c5b2fa4caa3 Annotates all API levels of `Mono.Android.dll` with [C#8 Nullable Reference Type][0] (NRT) annotations, pulled directly from the Java `.jar` files. Additionally, our hand written code has been audited and updated to include NRT annotations. ~~ Notes ~~ There are 8 new warnings caused by this change of the form: Android.Runtime/JavaDictionary.cs(655,24): warning CS8714: The type 'K' cannot be used as type parameter 'TKey' in the generic type or method 'IDictionary'. Nullability of type argument 'K' doesn't match 'notnull' constraint. This is due to the BCL being improperly annotated. The change has since been reverted, but it has not made it into various distribution packs: https://github.com/dotnet/runtime/pull/793 There are a considerable number of warnings (~400) caused by mismatched annotations when members are overridden, such as: CS8610: Nullability of reference types in type of parameter 'baz' doesn't match overridden member. While it may be desirable to fix these, it is a non-trivial job that will be prioritized separately. In the mean time, this set of warnings has been disabled: 8609;8610;8614;8617;8613;8764;8765;8766;8767 Finally, when `$(AndroidGenerateJniMarshalMethods)`=True and `jnimarshalmethod-gen.exe` is executed, the resulting app was crashing because `MagicRegistrationMap.CallRegisterMethodByIndex()` had a parameter change from `int` to `int?`. Fix this by calling `Nullable.GetValueOrDefault()` with the `switch`. `MonoDroidMarkStep.UpdateRegistrationSwitch()` now emits IL like: .method private hidebysig static bool CallRegisterMethodByIndex([Java.Interop]Java.Interop.JniNativeMethodRegistrationArguments arguments, [mscorlib]System.Nullable`1 typeIdx) cil managed { // Code size 9285 (0x2445) .maxstack 2 .locals init ([mscorlib]System.Nullable`1 V_0) IL_0000: ldarg.1 IL_0001: stloc.0 IL_0002: ldloca.s V_0 IL_0004: call instance !0 [mscorlib]System.Nullable`1::GetValueOrDefault() IL_0009: switch ( … Co-authored-by: Radek Doulik [0]: https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references --- Documentation/release-notes/4227.md | 18 ++ .../Android.Accounts/AccountManager.cs | 6 +- .../Android.Animation/Animator.cs | 22 +- .../Android.Animation/AnimatorSet.cs | 8 +- .../Android.Animation/FloatArrayEvaluator.cs | 4 +- .../Android.Animation/FloatEvaluator.cs | 2 +- .../Android.Animation/IntArrayEvaluator.cs | 4 +- .../Android.Animation/IntEvaluator.cs | 2 +- .../Android.Animation/PointFEvaluator.cs | 4 +- .../Android.Animation/RectEvaluator.cs | 4 +- .../Android.Animation/ValueAnimator.cs | 8 +- .../Android.App.Admin/DevicePolicyManager.cs | 2 +- src/Mono.Android/Android.App/ActionBar.cs | 22 +- src/Mono.Android/Android.App/Activity.cs | 4 +- .../Android.App/ActivityManager.cs | 2 +- .../Android.App/ActivityTracker.cs | 4 +- src/Mono.Android/Android.App/AlarmManager.cs | 2 +- src/Mono.Android/Android.App/AlertDialog.cs | 61 +++--- src/Mono.Android/Android.App/Application.cs | 6 +- src/Mono.Android/Android.App/Dialog.cs | 2 + .../Android.App/DownloadManager.cs | 4 +- .../Android.App/FragmentManager.cs | 4 + .../Android.App/IntentFilterAttribute.cs | 36 ++-- .../Android.App/MetaDataAttribute.cs | 4 +- src/Mono.Android/Android.App/Notification.cs | 2 +- .../Android.App/NotificationManager.cs | 4 +- .../Android.App/PermissionAttribute.cs | 12 +- .../Android.App/PermissionGroupAttribute.cs | 10 +- .../Android.App/PermissionTreeAttribute.cs | 8 +- .../Android.App/ProgressDialog.cs | 4 +- src/Mono.Android/Android.App/SearchManager.cs | 4 +- src/Mono.Android/Android.App/SyncContext.cs | 5 +- src/Mono.Android/Android.App/UiModeManager.cs | 4 +- .../Android.App/UsesFeatureAttribute.cs | 2 +- .../Android.App/UsesLibraryAttribute.cs | 2 +- .../Android.App/UsesPermissionAttribute.cs | 2 +- .../BluetoothGattServerCallback.cs | 8 +- .../Android.Content.Res/IXmlResourceParser.cs | 2 +- .../Android.Content/CursorLoader.cs | 6 +- .../GrantUriPermissionAttribute.cs | 6 +- src/Mono.Android/Android.Graphics/Color.cs | 3 +- .../TonemapCurve.cs | 2 +- .../Android.Hardware/SensorManager.cs | 4 +- .../KeyboardView.cs | 2 +- .../Android.Locations/LocationManager.cs | 4 +- .../Android.Media/AudioManager.cs | 4 +- .../Android.Media/MediaMetadataRetriever.cs | 4 +- .../Android.Net.Wifi/WifiManager.cs | 4 +- .../Android.Net/ConnectivityManager.cs | 4 +- .../Android.OS.Storage/StorageManager.cs | 4 +- src/Mono.Android/Android.OS/AsyncTask.cs | 31 ++- src/Mono.Android/Android.OS/DropBoxManager.cs | 4 +- src/Mono.Android/Android.OS/Message.cs | 2 +- src/Mono.Android/Android.OS/PowerManager.cs | 4 +- src/Mono.Android/Android.OS/Vibrator.cs | 4 +- .../Android.Preferences/CheckBoxPreference.cs | 6 +- .../Android.Runtime/AndroidEnvironment.cs | 44 ++-- .../Android.Runtime/AndroidRuntime.cs | 98 ++++----- .../Android.Runtime/CPUArchitecture.cs | 2 +- .../Android.Runtime/CharSequence.cs | 19 +- .../Android.Runtime/ConstructorBuilder.cs | 12 +- .../DynamicMethodNameCounter.cs | 2 +- .../Android.Runtime/Extensions.cs | 4 +- .../IJavaObjectValueMarshaler.cs | 11 +- .../Android.Runtime/InputStreamAdapter.cs | 2 +- .../Android.Runtime/InputStreamInvoker.cs | 11 +- .../Android.Runtime/IntDefAttribute.cs | 4 +- .../Android.Runtime/IntDefinitionAttribute.cs | 6 +- src/Mono.Android/Android.Runtime/JNIEnv.cs | 200 +++++++++--------- .../Android.Runtime/JNINativeWrapper.cs | 16 +- src/Mono.Android/Android.Runtime/JavaArray.cs | 12 +- .../Android.Runtime/JavaCollection.cs | 29 +-- .../Android.Runtime/JavaDictionary.cs | 52 +++-- src/Mono.Android/Android.Runtime/JavaList.cs | 84 ++++---- .../Android.Runtime/JavaObject.cs | 17 +- .../Android.Runtime/JavaProxyThrowable.cs | 2 +- src/Mono.Android/Android.Runtime/JavaSet.cs | 33 +-- src/Mono.Android/Android.Runtime/Logger.cs | 2 +- .../NamespaceMappingAttribute.cs | 4 +- .../Android.Runtime/OutputStreamAdapter.cs | 6 +- .../Android.Runtime/OutputStreamInvoker.cs | 9 +- .../Android.Runtime/ResourceIdManager.cs | 2 +- .../Android.Runtime/StringDefAttribute.cs | 4 +- .../Android.Runtime/TimingLogger.cs | 6 +- .../Android.Runtime/TypeManager.cs | 2 +- .../UncaughtExceptionHandler.cs | 71 +++++++ .../Android.Runtime/XAPeerMembers.cs | 7 +- .../Android.Runtime/XmlPullParserReader.cs | 32 +-- .../Android.Runtime/XmlReaderPullParser.cs | 46 ++-- .../Android.Telephony/PhoneNumberUtils.cs | 4 +- .../Android.Telephony/TelephonyManager.cs | 4 +- .../Android.Text.Format/DateUtils.cs | 4 +- .../Android.Text/ClipboardManager.cs | 4 +- src/Mono.Android/Android.Text/ITextWatcher.cs | 26 +-- src/Mono.Android/Android.Util/SparseArray.cs | 6 +- .../AccessibilityEvent.cs | 6 +- .../AccessibilityManager.cs | 4 +- .../InputMethodManager.cs | 4 +- src/Mono.Android/Android.Views/InputDevice.cs | 4 +- .../Android.Views/LayoutInflater.cs | 4 +- src/Mono.Android/Android.Views/MotionEvent.cs | 8 +- src/Mono.Android/Android.Views/View.cs | 2 + src/Mono.Android/Android.Views/Window.cs | 3 +- .../Android.Widget/AbsListView.cs | 12 +- .../Android.Widget/AdapterView.cs | 15 +- .../Android.Widget/AdapterViewAnimator.cs | 6 +- .../Android.Widget/ArrayAdapter.cs | 5 +- .../Android.Widget/AutoCompleteTextView.cs | 11 +- .../Android.Widget/BaseAdapter.cs | 2 +- .../Android.Widget/MediaController.cs | 12 +- src/Mono.Android/Android.Widget/TextView.cs | 26 +-- .../Android/ReferenceFilesAttribute.cs | 12 +- .../Java.Interop/AndroidEventHelper.cs | 18 +- src/Mono.Android/Java.Interop/EventHelper.cs | 12 +- src/Mono.Android/Java.Interop/JavaConvert.cs | 64 +++--- .../Java.Interop/JavaObjectExtensions.cs | 19 +- src/Mono.Android/Java.Interop/Runtime.cs | 2 +- src/Mono.Android/Java.Interop/TypeManager.cs | 69 +++--- .../InvocationTargetException.cs | 2 +- src/Mono.Android/Java.Lang/Boolean.cs | 32 +-- src/Mono.Android/Java.Lang/Byte.cs | 32 +-- src/Mono.Android/Java.Lang/Character.cs | 32 +-- src/Mono.Android/Java.Lang/Class.cs | 2 +- .../Java.Lang/ClassNotFoundException.cs | 2 +- src/Mono.Android/Java.Lang/Double.cs | 32 +-- src/Mono.Android/Java.Lang/Float.cs | 32 +-- .../Java.Lang/IllegalAccessException.cs | 2 +- .../Java.Lang/InstantiationException.cs | 2 +- src/Mono.Android/Java.Lang/Integer.cs | 32 +-- src/Mono.Android/Java.Lang/Long.cs | 32 +-- .../Java.Lang/NoSuchFieldException.cs | 2 +- .../Java.Lang/NoSuchMethodException.cs | 2 +- src/Mono.Android/Java.Lang/Object.cs | 73 ++++--- src/Mono.Android/Java.Lang/String.cs | 2 +- src/Mono.Android/Java.Lang/Thread.cs | 5 +- src/Mono.Android/Java.Lang/Throwable.cs | 20 +- src/Mono.Android/Java.Nio/CharBuffer.cs | 10 +- src/Mono.Android/Java.Nio/FileChannel.cs | 4 +- .../EGLContext.cs | 2 +- src/Mono.Android/Mono.Android.csproj | 3 +- src/Mono.Android/Mono.Android.targets | 3 +- .../DefaultClientConnection.cs | 2 +- .../System.Drawing/PointConverter.cs | 8 +- .../System.Drawing/RectangleConverter.cs | 12 +- .../System.Drawing/SizeConverter.cs | 8 +- .../System.Drawing/SizeFConverter.cs | 8 +- src/Mono.Android/System.Linq/Extensions.cs | 8 +- .../AndroidClientHandler.cs | 116 +++++----- .../AndroidHttpResponseMessage.cs | 6 +- .../AuthDigestHeaderParser.cs | 21 +- .../Xamarin.Android.Net/AuthDigestSession.cs | 30 +-- .../Xamarin.Android.Net/AuthModuleBasic.cs | 14 +- .../Xamarin.Android.Net/AuthModuleDigest.cs | 18 +- .../Xamarin.Android.Net/AuthenticationData.cs | 4 +- .../OldAndroidSSLSocketFactory.cs | 38 ++-- src/Mono.Android/metadata | 10 + .../MonoDroid.Tuner/MonoDroidMarkStep.cs | 17 +- .../Android.App/ActivityAttribute.cs | 30 +-- .../Android.App/ApplicationAttribute.cs | 32 +-- .../Android.App/InstrumentationAttribute.cs | 12 +- .../Android.App/LayoutAttribute.cs | 12 +- .../Android.App/ServiceAttribute.cs | 12 +- .../BroadcastReceiverAttribute.cs | 14 +- .../ContentProviderAttribute.cs | 16 +- .../Android.Runtime/RegisterAttribute.cs | 8 +- .../Java.Interop/ExportAttribute.cs | 8 +- ...marin.Android.Tools.JavadocImporter.csproj | 4 + .../api-compat-exclude-attributes.txt | 5 +- 168 files changed, 1326 insertions(+), 1128 deletions(-) create mode 100644 Documentation/release-notes/4227.md create mode 100644 src/Mono.Android/Android.Runtime/UncaughtExceptionHandler.cs diff --git a/Documentation/release-notes/4227.md b/Documentation/release-notes/4227.md new file mode 100644 index 00000000000..358d2e29fec --- /dev/null +++ b/Documentation/release-notes/4227.md @@ -0,0 +1,18 @@ +#### Mono.Android.dll Nullable Reference Type Annotations + +`Mono.Android.dll` assemblies of all platform levels are now annotated with +C#8's nullable reference types (NRT). Users who opt their applications into +this feature with `enable` will receive warnings if their +code does not properly account for possible `null` values. + +General documentation for the NRT feature is available here: +https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references. + +Note: +The majority of `Mono.Android.dll` is automatically generated from the Android +Java source, including these new annotations. As such, we will not be manually +fixing places where the Android source code is not annotated correctly. + +If there is an error regarding nullability for any of the Mono.Android APIs +that Xamarin adds to the Android source (such as `JavaList` or `InputStreamAdapter`), +please file a bug so we can properly annotate our additions. \ No newline at end of file diff --git a/src/Mono.Android/Android.Accounts/AccountManager.cs b/src/Mono.Android/Android.Accounts/AccountManager.cs index 16f8f80b90d..928f0002cec 100644 --- a/src/Mono.Android/Android.Accounts/AccountManager.cs +++ b/src/Mono.Android/Android.Accounts/AccountManager.cs @@ -10,12 +10,12 @@ namespace Android.Accounts { public partial class AccountManager { - public static AccountManager FromContext (Context context) + public static AccountManager? FromContext (Context context) { return context.GetSystemService (Context.AccountService) as AccountManager; } - WeakReference weak_implementor_AccountsUpdated; + WeakReference? weak_implementor_AccountsUpdated; public event EventHandler AccountsUpdated { add { AndroidEventHelper.AddEventHandler( @@ -33,7 +33,7 @@ public event EventHandler AccountsUpdated { } } - void SetOnAccountsUpdatedListener (IOnAccountsUpdateListener value) + void SetOnAccountsUpdatedListener (IOnAccountsUpdateListener? value) { AddOnAccountsUpdatedListener (value, null, false); } diff --git a/src/Mono.Android/Android.Animation/Animator.cs b/src/Mono.Android/Android.Animation/Animator.cs index f53089239f5..15ac51b11bb 100644 --- a/src/Mono.Android/Android.Animation/Animator.cs +++ b/src/Mono.Android/Android.Animation/Animator.cs @@ -8,14 +8,14 @@ namespace Android.Animation { partial class Animator { - WeakReference dispatcher; + WeakReference? dispatcher; AnimatorEventDispatcher Dispatcher { get { if (dispatcher == null || !dispatcher.IsAlive) { dispatcher = new WeakReference (new AnimatorEventDispatcher ()); - AddListener ((AnimatorEventDispatcher) dispatcher.Target); + AddListener ((AnimatorEventDispatcher) dispatcher.Target!); } - return (AnimatorEventDispatcher) dispatcher.Target; + return (AnimatorEventDispatcher) dispatcher.Target!; } } @@ -67,33 +67,33 @@ public AnimatorEventDispatcher () JNIEnv.FinishCreateInstance (Handle, "()V"); } - public EventHandler AnimationCancel; - public EventHandler AnimationEnd; - public EventHandler AnimationRepeat; - public EventHandler AnimationStart; + public EventHandler? AnimationCancel; + public EventHandler? AnimationEnd; + public EventHandler? AnimationRepeat; + public EventHandler? AnimationStart; - public void OnAnimationCancel (Animator animation) + public void OnAnimationCancel (Animator? animation) { var h = AnimationCancel; if (h != null) h (animation, EventArgs.Empty); } - public void OnAnimationEnd (Animator animation) + public void OnAnimationEnd (Animator? animation) { var h = AnimationEnd; if (h != null) h (animation, EventArgs.Empty); } - public void OnAnimationRepeat (Animator animation) + public void OnAnimationRepeat (Animator? animation) { var h = AnimationRepeat; if (h != null) h (animation, EventArgs.Empty); } - public void OnAnimationStart (Animator animation) + public void OnAnimationStart (Animator? animation) { var h = AnimationStart; if (h != null) diff --git a/src/Mono.Android/Android.Animation/AnimatorSet.cs b/src/Mono.Android/Android.Animation/AnimatorSet.cs index 18f3c84150e..f8628846b20 100644 --- a/src/Mono.Android/Android.Animation/AnimatorSet.cs +++ b/src/Mono.Android/Android.Animation/AnimatorSet.cs @@ -17,7 +17,7 @@ public override Animator SetDuration (long duration) if (base.GetType () == this.ThresholdType) { return Java.Lang.Object.GetObject ( JNIEnv.CallObjectMethod (base.Handle, id_setDuration_J, new JValue (duration)), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } else { return Java.Lang.Object.GetObject ( JNIEnv.CallNonvirtualObjectMethod ( @@ -25,11 +25,11 @@ public override Animator SetDuration (long duration) this.ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "setDuration", "(J)Landroid/animation/Animator;"), new JValue (duration)), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } } - private static Delegate cb_setDuration_J; + private static Delegate? cb_setDuration_J; private static Delegate GetSetDuration_JHandler () { @@ -40,7 +40,7 @@ private static Delegate GetSetDuration_JHandler () private static IntPtr n_SetDuration_J (IntPtr jnienv, IntPtr native__this, long duration) { - AnimatorSet @object = Java.Lang.Object.GetObject (native__this, JniHandleOwnership.DoNotTransfer); + AnimatorSet @object = Java.Lang.Object.GetObject (native__this, JniHandleOwnership.DoNotTransfer)!; return JNIEnv.ToJniHandle (@object.SetDuration (duration)); } } diff --git a/src/Mono.Android/Android.Animation/FloatArrayEvaluator.cs b/src/Mono.Android/Android.Animation/FloatArrayEvaluator.cs index d1a0ccd62dc..a9845595cf3 100644 --- a/src/Mono.Android/Android.Animation/FloatArrayEvaluator.cs +++ b/src/Mono.Android/Android.Animation/FloatArrayEvaluator.cs @@ -7,9 +7,9 @@ namespace Android.Animation { public partial class FloatArrayEvaluator { - Object ITypeEvaluator.Evaluate (float fraction, Object startValue, Object endValue) + Object ITypeEvaluator.Evaluate (float fraction, Object? startValue, Object? endValue) { - return new JavaArray (JNIEnv.NewArray (Evaluate (fraction, (float []) (JavaArray) startValue, (float []) (JavaArray) endValue)), JniHandleOwnership.TransferLocalRef); + return new JavaArray (JNIEnv.NewArray (Evaluate (fraction, (float []?) (JavaArray?) startValue, (float []?) (JavaArray?) endValue)), JniHandleOwnership.TransferLocalRef); } } } diff --git a/src/Mono.Android/Android.Animation/FloatEvaluator.cs b/src/Mono.Android/Android.Animation/FloatEvaluator.cs index ee9d680af28..55d30967a60 100644 --- a/src/Mono.Android/Android.Animation/FloatEvaluator.cs +++ b/src/Mono.Android/Android.Animation/FloatEvaluator.cs @@ -7,7 +7,7 @@ namespace Android.Animation { public partial class FloatEvaluator { - public virtual Object Evaluate (float fraction, Object startValue, Object endValue) + public virtual Object? Evaluate (float fraction, Object? startValue, Object? endValue) { return Evaluate (fraction, startValue.JavaCast (), endValue.JavaCast ()); } diff --git a/src/Mono.Android/Android.Animation/IntArrayEvaluator.cs b/src/Mono.Android/Android.Animation/IntArrayEvaluator.cs index 751b8347695..84d9a6f1757 100644 --- a/src/Mono.Android/Android.Animation/IntArrayEvaluator.cs +++ b/src/Mono.Android/Android.Animation/IntArrayEvaluator.cs @@ -7,9 +7,9 @@ namespace Android.Animation { public partial class IntArrayEvaluator { - Object ITypeEvaluator.Evaluate (float fraction, Object startValue, Object endValue) + Object ITypeEvaluator.Evaluate (float fraction, Object? startValue, Object? endValue) { - return new JavaArray (JNIEnv.NewArray (Evaluate (fraction, (int []) (JavaArray) startValue, (int []) (JavaArray) endValue)), JniHandleOwnership.TransferLocalRef); + return new JavaArray (JNIEnv.NewArray (Evaluate (fraction, (int []?) (JavaArray?) startValue, (int []?) (JavaArray?) endValue)), JniHandleOwnership.TransferLocalRef); } } } diff --git a/src/Mono.Android/Android.Animation/IntEvaluator.cs b/src/Mono.Android/Android.Animation/IntEvaluator.cs index 962924bddbc..dc127d720c8 100644 --- a/src/Mono.Android/Android.Animation/IntEvaluator.cs +++ b/src/Mono.Android/Android.Animation/IntEvaluator.cs @@ -7,7 +7,7 @@ namespace Android.Animation { public partial class IntEvaluator { - public virtual Object Evaluate (float fraction, Object startValue, Object endValue) + public virtual Object? Evaluate (float fraction, Object? startValue, Object? endValue) { return Evaluate (fraction, startValue.JavaCast (), endValue.JavaCast ()); } diff --git a/src/Mono.Android/Android.Animation/PointFEvaluator.cs b/src/Mono.Android/Android.Animation/PointFEvaluator.cs index 136eac5cb6d..7f4fa810e3c 100644 --- a/src/Mono.Android/Android.Animation/PointFEvaluator.cs +++ b/src/Mono.Android/Android.Animation/PointFEvaluator.cs @@ -7,9 +7,9 @@ namespace Android.Animation { public partial class PointFEvaluator { - Object ITypeEvaluator.Evaluate (float fraction, Object startValue, Object endValue) + Object? ITypeEvaluator.Evaluate (float fraction, Object? startValue, Object? endValue) { - return Evaluate (fraction, (PointF) startValue, (PointF) endValue); + return Evaluate (fraction, (PointF?) startValue, (PointF?) endValue); } } } diff --git a/src/Mono.Android/Android.Animation/RectEvaluator.cs b/src/Mono.Android/Android.Animation/RectEvaluator.cs index 1c15549df54..4620b81dc75 100644 --- a/src/Mono.Android/Android.Animation/RectEvaluator.cs +++ b/src/Mono.Android/Android.Animation/RectEvaluator.cs @@ -7,9 +7,9 @@ namespace Android.Animation { public partial class RectEvaluator { - Object ITypeEvaluator.Evaluate (float fraction, Object startValue, Object endValue) + Object? ITypeEvaluator.Evaluate (float fraction, Object? startValue, Object? endValue) { - return Evaluate (fraction, (Rect) startValue, (Rect) endValue); + return Evaluate (fraction, (Rect?) startValue, (Rect?) endValue); } } } diff --git a/src/Mono.Android/Android.Animation/ValueAnimator.cs b/src/Mono.Android/Android.Animation/ValueAnimator.cs index 4fa248db978..e83663abda5 100644 --- a/src/Mono.Android/Android.Animation/ValueAnimator.cs +++ b/src/Mono.Android/Android.Animation/ValueAnimator.cs @@ -18,7 +18,7 @@ public override Animator SetDuration (long duration) if (base.GetType () == this.ThresholdType) { return Java.Lang.Object.GetObject ( JNIEnv.CallObjectMethod (base.Handle, id_setDuration_J, new JValue (duration)), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } else { return Java.Lang.Object.GetObject ( JNIEnv.CallNonvirtualObjectMethod ( @@ -26,11 +26,11 @@ public override Animator SetDuration (long duration) this.ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "setDuration", "(J)Landroid/animation/Animator;"), new JValue (duration)), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } } - private static Delegate cb_setDuration_J; + private static Delegate? cb_setDuration_J; private static Delegate GetSetDuration_JHandler () { @@ -41,7 +41,7 @@ private static Delegate GetSetDuration_JHandler () private static IntPtr n_SetDuration_J (IntPtr jnienv, IntPtr native__this, long duration) { - ValueAnimator @object = Java.Lang.Object.GetObject (native__this, JniHandleOwnership.DoNotTransfer); + ValueAnimator @object = Java.Lang.Object.GetObject (native__this, JniHandleOwnership.DoNotTransfer)!; return JNIEnv.ToJniHandle (@object.SetDuration (duration)); } } diff --git a/src/Mono.Android/Android.App.Admin/DevicePolicyManager.cs b/src/Mono.Android/Android.App.Admin/DevicePolicyManager.cs index b2db4afc14d..1a0e04f7675 100644 --- a/src/Mono.Android/Android.App.Admin/DevicePolicyManager.cs +++ b/src/Mono.Android/Android.App.Admin/DevicePolicyManager.cs @@ -8,7 +8,7 @@ namespace Android.App.Admin { public partial class DevicePolicyManager { - public static DevicePolicyManager FromContext (Context context) + public static DevicePolicyManager? FromContext (Context context) { return context.GetSystemService (Context.DevicePolicyService) as DevicePolicyManager; } diff --git a/src/Mono.Android/Android.App/ActionBar.cs b/src/Mono.Android/Android.App/ActionBar.cs index a90f81eaa33..a6ea60bc442 100644 --- a/src/Mono.Android/Android.App/ActionBar.cs +++ b/src/Mono.Android/Android.App/ActionBar.cs @@ -10,24 +10,24 @@ partial class ActionBar { public class TabEventArgs : EventArgs { - public TabEventArgs (FragmentTransaction fragmentTransaction) + public TabEventArgs (FragmentTransaction? fragmentTransaction) { FragmentTransaction = fragmentTransaction; } - public FragmentTransaction FragmentTransaction {get; private set;} + public FragmentTransaction? FragmentTransaction {get; private set;} } partial class Tab { - WeakReference dispatcher; + WeakReference? dispatcher; TabEventDispatcher Dispatcher { get { if (dispatcher == null || !dispatcher.IsAlive) { dispatcher = new WeakReference (new TabEventDispatcher ()); - SetTabListener ((TabEventDispatcher) dispatcher.Target); + SetTabListener ((TabEventDispatcher) dispatcher.Target!); } - return (TabEventDispatcher) dispatcher.Target; + return (TabEventDispatcher) dispatcher.Target!; } } @@ -71,25 +71,25 @@ public TabEventDispatcher () JNIEnv.FinishCreateInstance (Handle, "()V"); } - public EventHandler TabReselected; - public EventHandler TabSelected; - public EventHandler TabUnselected; + public EventHandler? TabReselected; + public EventHandler? TabSelected; + public EventHandler? TabUnselected; - public void OnTabReselected (ActionBar.Tab tab, FragmentTransaction ft) + public void OnTabReselected (ActionBar.Tab? tab, FragmentTransaction? ft) { var h = TabReselected; if (h != null) h (tab, new ActionBar.TabEventArgs (ft)); } - public void OnTabSelected (ActionBar.Tab tab, FragmentTransaction ft) + public void OnTabSelected (ActionBar.Tab? tab, FragmentTransaction? ft) { var h = TabSelected; if (h != null) h (tab, new ActionBar.TabEventArgs (ft)); } - public void OnTabUnselected (ActionBar.Tab tab, FragmentTransaction ft) + public void OnTabUnselected (ActionBar.Tab? tab, FragmentTransaction? ft) { var h = TabUnselected; if (h != null) diff --git a/src/Mono.Android/Android.App/Activity.cs b/src/Mono.Android/Android.App/Activity.cs index ab82ab018c3..56c97bee8ba 100644 --- a/src/Mono.Android/Android.App/Activity.cs +++ b/src/Mono.Android/Android.App/Activity.cs @@ -6,10 +6,10 @@ namespace Android.App { partial class Activity { - public T FindViewById (int id) + public T? FindViewById (int id) where T : Android.Views.View { - return this.FindViewById (id).JavaCast (); + return this.FindViewById (id)!.JavaCast (); } public void StartActivityForResult (Type activityType, int requestCode) diff --git a/src/Mono.Android/Android.App/ActivityManager.cs b/src/Mono.Android/Android.App/ActivityManager.cs index ff6262ac5c4..35c22f01caa 100644 --- a/src/Mono.Android/Android.App/ActivityManager.cs +++ b/src/Mono.Android/Android.App/ActivityManager.cs @@ -6,7 +6,7 @@ namespace Android.App { public partial class ActivityManager { - public static ActivityManager FromContext (Context context) + public static ActivityManager? FromContext (Context context) { return context.GetSystemService (Context.ActivityService) as ActivityManager; } diff --git a/src/Mono.Android/Android.App/ActivityTracker.cs b/src/Mono.Android/Android.App/ActivityTracker.cs index f38069610b3..259fff3ff4a 100644 --- a/src/Mono.Android/Android.App/ActivityTracker.cs +++ b/src/Mono.Android/Android.App/ActivityTracker.cs @@ -19,7 +19,7 @@ class ActivityTracker : Java.Lang.Object, Application.IActivityLifecycleCallback { readonly List startedActivities = new List (); - public event EventHandler ActivityStarted; + public event EventHandler? ActivityStarted; public IReadOnlyList StartedActivities { get { return startedActivities; } @@ -36,7 +36,7 @@ public void OnActivityStopped (Activity activity) startedActivities.Remove (activity); } - public void OnActivityCreated (Activity activity, Bundle savedInstanceState) + public void OnActivityCreated (Activity activity, Bundle? savedInstanceState) { } diff --git a/src/Mono.Android/Android.App/AlarmManager.cs b/src/Mono.Android/Android.App/AlarmManager.cs index 38b12371d09..6ab5e5a69f9 100644 --- a/src/Mono.Android/Android.App/AlarmManager.cs +++ b/src/Mono.Android/Android.App/AlarmManager.cs @@ -6,7 +6,7 @@ namespace Android.App { public partial class AlarmManager { - public static AlarmManager FromContext (Context context) + public static AlarmManager? FromContext (Context context) { return context.GetSystemService (Context.AlarmService) as AlarmManager; } diff --git a/src/Mono.Android/Android.App/AlertDialog.cs b/src/Mono.Android/Android.App/AlertDialog.cs index faeef59c8e8..7a32287b5d5 100644 --- a/src/Mono.Android/Android.App/AlertDialog.cs +++ b/src/Mono.Android/Android.App/AlertDialog.cs @@ -13,7 +13,7 @@ public partial class AlertDialog { public partial class Builder { - WeakReference weak_implementor_SetOnItemSelectedListener ; + WeakReference? weak_implementor_SetOnItemSelectedListener ; public event EventHandler ItemSelected { add { @@ -49,7 +49,7 @@ public event EventHandler N } } - void __SetOnItemSelectedListener (AdapterView.IOnItemSelectedListener value) + void __SetOnItemSelectedListener (AdapterView.IOnItemSelectedListener? value) { SetOnItemSelectedListener (value); } @@ -60,12 +60,13 @@ AdapterView.IOnItemSelectedListenerImplementor CreateItemSelectedImplementor () } // extra(neous) event - List selection_cleared; + List? selection_cleared; - void OnSelectionCleared (object o, Android.Widget.AdapterView.NothingSelectedEventArgs args) + void OnSelectionCleared (object? o, Android.Widget.AdapterView.NothingSelectedEventArgs args) { - foreach (var h in selection_cleared) - h (o, EventArgs.Empty); + if (selection_cleared != null) + foreach (var h in selection_cleared) + h (o, EventArgs.Empty); } [Obsolete ("Use NothingSelected event instead")] @@ -78,121 +79,121 @@ public event EventHandler ItemSelectionCleared { selection_cleared.Add (value); } remove { - selection_cleared.Remove (value); + selection_cleared?.Remove (value); } } - public Android.App.AlertDialog.Builder SetAdapter (Android.Widget.IListAdapter adapter, EventHandler handler) + public Android.App.AlertDialog.Builder? SetAdapter (Android.Widget.IListAdapter adapter, EventHandler handler) { return SetAdapter (adapter, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetCursor (Android.Database.ICursor cursor, EventHandler handler, string labelColumn) + public Android.App.AlertDialog.Builder? SetCursor (Android.Database.ICursor cursor, EventHandler handler, string labelColumn) { return SetCursor (cursor, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }, labelColumn); } - public Android.App.AlertDialog.Builder SetItems (int itemsId, EventHandler handler) + public Android.App.AlertDialog.Builder? SetItems (int itemsId, EventHandler handler) { return SetItems (itemsId, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetItems (Java.Lang.ICharSequence[] items, EventHandler handler) + public Android.App.AlertDialog.Builder? SetItems (Java.Lang.ICharSequence[] items, EventHandler handler) { return SetItems (items, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetItems (string[] items, EventHandler handler) + public Android.App.AlertDialog.Builder? SetItems (string[] items, EventHandler handler) { return SetItems (items, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetMultiChoiceItems (int itemsId, bool[] checkedItems, EventHandler handler) + public Android.App.AlertDialog.Builder? SetMultiChoiceItems (int itemsId, bool[] checkedItems, EventHandler handler) { return SetMultiChoiceItems (itemsId, checkedItems, new IDialogInterfaceOnMultiChoiceClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetMultiChoiceItems (Java.Lang.ICharSequence[] items, bool[] checkedItems, EventHandler handler) + public Android.App.AlertDialog.Builder? SetMultiChoiceItems (Java.Lang.ICharSequence[] items, bool[] checkedItems, EventHandler handler) { return SetMultiChoiceItems (items, checkedItems, new IDialogInterfaceOnMultiChoiceClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetMultiChoiceItems (string[] items, bool[] checkedItems, EventHandler handler) + public Android.App.AlertDialog.Builder? SetMultiChoiceItems (string[] items, bool[] checkedItems, EventHandler handler) { return SetMultiChoiceItems (items, checkedItems, new IDialogInterfaceOnMultiChoiceClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetMultiChoiceItems (Android.Database.ICursor cursor, string isCheckedColumn, string labelColumn, EventHandler handler) + public Android.App.AlertDialog.Builder? SetMultiChoiceItems (Android.Database.ICursor cursor, string isCheckedColumn, string labelColumn, EventHandler handler) { return SetMultiChoiceItems (cursor, isCheckedColumn, labelColumn, new IDialogInterfaceOnMultiChoiceClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetNegativeButton (int textId, EventHandler handler) + public Android.App.AlertDialog.Builder? SetNegativeButton (int textId, EventHandler handler) { return SetNegativeButton (textId, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetNegativeButton (Java.Lang.ICharSequence text, EventHandler handler) + public Android.App.AlertDialog.Builder? SetNegativeButton (Java.Lang.ICharSequence text, EventHandler handler) { return SetNegativeButton (text, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler } ); } - public Android.App.AlertDialog.Builder SetNegativeButton (string text, EventHandler handler) + public Android.App.AlertDialog.Builder? SetNegativeButton (string text, EventHandler handler) { return SetNegativeButton (text, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetNeutralButton (int textId, EventHandler handler) + public Android.App.AlertDialog.Builder? SetNeutralButton (int textId, EventHandler handler) { return SetNeutralButton (textId, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetNeutralButton (Java.Lang.ICharSequence text, EventHandler handler) + public Android.App.AlertDialog.Builder? SetNeutralButton (Java.Lang.ICharSequence text, EventHandler handler) { return SetNeutralButton (text, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetNeutralButton (string text, EventHandler handler) + public Android.App.AlertDialog.Builder? SetNeutralButton (string text, EventHandler handler) { return SetNeutralButton (text, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetPositiveButton (int textId, EventHandler handler) + public Android.App.AlertDialog.Builder? SetPositiveButton (int textId, EventHandler handler) { return SetPositiveButton (textId, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetPositiveButton (Java.Lang.ICharSequence text, EventHandler handler) + public Android.App.AlertDialog.Builder? SetPositiveButton (Java.Lang.ICharSequence text, EventHandler handler) { return SetPositiveButton (text, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetPositiveButton (string text, EventHandler handler) + public Android.App.AlertDialog.Builder? SetPositiveButton (string text, EventHandler handler) { return SetPositiveButton (text, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetSingleChoiceItems (int itemsId, int checkedItem, EventHandler handler) + public Android.App.AlertDialog.Builder? SetSingleChoiceItems (int itemsId, int checkedItem, EventHandler handler) { return SetSingleChoiceItems (itemsId, checkedItem, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetSingleChoiceItems (Android.Database.ICursor cursor, int checkedItem, string labelColumn, EventHandler handler) + public Android.App.AlertDialog.Builder? SetSingleChoiceItems (Android.Database.ICursor cursor, int checkedItem, string labelColumn, EventHandler handler) { return SetSingleChoiceItems (cursor, checkedItem, labelColumn, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetSingleChoiceItems (Java.Lang.ICharSequence[] items, int checkedItem, EventHandler handler) + public Android.App.AlertDialog.Builder? SetSingleChoiceItems (Java.Lang.ICharSequence[] items, int checkedItem, EventHandler handler) { return SetSingleChoiceItems (items, checkedItem, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetSingleChoiceItems (string[] items, int checkedItem, EventHandler handler) + public Android.App.AlertDialog.Builder? SetSingleChoiceItems (string[] items, int checkedItem, EventHandler handler) { return SetSingleChoiceItems (items, checkedItem, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } - public Android.App.AlertDialog.Builder SetSingleChoiceItems (Android.Widget.IListAdapter adapter, int checkedItem, EventHandler handler) + public Android.App.AlertDialog.Builder? SetSingleChoiceItems (Android.Widget.IListAdapter adapter, int checkedItem, EventHandler handler) { return SetSingleChoiceItems (adapter, checkedItem, new IDialogInterfaceOnClickListenerImplementor () { Handler = handler }); } diff --git a/src/Mono.Android/Android.App/Application.cs b/src/Mono.Android/Android.App/Application.cs index 59665bd44a4..e7fca8d2190 100644 --- a/src/Mono.Android/Android.App/Application.cs +++ b/src/Mono.Android/Android.App/Application.cs @@ -8,7 +8,7 @@ namespace Android.App { partial class Application { - static Context _context; + static Context? _context; public static Context Context { get { if (_context != null) @@ -18,14 +18,14 @@ public static Context Context { try { IntPtr field = JNIEnv.GetStaticFieldID (klass, "Context", "Landroid/content/Context;"); IntPtr lref = JNIEnv.GetStaticObjectField (klass, field); - return _context = Java.Lang.Object.GetObject (lref, JniHandleOwnership.TransferLocalRef); + return _context = Java.Lang.Object.GetObject (lref, JniHandleOwnership.TransferLocalRef)!; } finally { JNIEnv.DeleteGlobalRef (klass); } } } - static SyncContext _sync; + static SyncContext? _sync; public static SynchronizationContext SynchronizationContext { get { if (_sync == null) diff --git a/src/Mono.Android/Android.App/Dialog.cs b/src/Mono.Android/Android.App/Dialog.cs index 4868374bb11..94c40398b18 100644 --- a/src/Mono.Android/Android.App/Dialog.cs +++ b/src/Mono.Android/Android.App/Dialog.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using Android.Runtime; namespace Android.App { @@ -8,6 +9,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) where T : Android.Views.View { diff --git a/src/Mono.Android/Android.App/DownloadManager.cs b/src/Mono.Android/Android.App/DownloadManager.cs index 8811231edd0..f1bde0f384d 100644 --- a/src/Mono.Android/Android.App/DownloadManager.cs +++ b/src/Mono.Android/Android.App/DownloadManager.cs @@ -8,9 +8,9 @@ namespace Android.App { public partial class DownloadManager { - public static DownloadManager FromContext (Context context) + public static DownloadManager? FromContext (Context context) { - return context.GetSystemService (Context.DownloadService) as DownloadManager; + return (context.GetSystemService (Context.DownloadService) as DownloadManager); } } diff --git a/src/Mono.Android/Android.App/FragmentManager.cs b/src/Mono.Android/Android.App/FragmentManager.cs index 5ff7b1d6bce..8b67deecaa7 100644 --- a/src/Mono.Android/Android.App/FragmentManager.cs +++ b/src/Mono.Android/Android.App/FragmentManager.cs @@ -1,17 +1,21 @@ +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 { return FindFragmentById (id).JavaCast (); } + [return: MaybeNull] public T FindFragmentByTag (string tag) where T : Fragment { return FindFragmentByTag (tag).JavaCast (); } + [return: MaybeNull] public T GetFragment (Bundle bundle, string key) where T : Fragment { return GetFragment (bundle, key).JavaCast (); diff --git a/src/Mono.Android/Android.App/IntentFilterAttribute.cs b/src/Mono.Android/Android.App/IntentFilterAttribute.cs index f1d17b39c74..08a849665c3 100644 --- a/src/Mono.Android/Android.App/IntentFilterAttribute.cs +++ b/src/Mono.Android/Android.App/IntentFilterAttribute.cs @@ -17,31 +17,31 @@ public IntentFilterAttribute (string[] actions) Actions = actions; } - public string Icon {get; set;} - public string Label {get; set;} + public string? Icon {get; set;} + public string? Label {get; set;} public int Priority {get; set;} public string[] Actions {get; private set;} - public string[] Categories {get; set;} - public string DataHost {get; set;} - public string DataMimeType {get; set;} - public string DataPath {get; set;} - public string DataPathPattern {get; set;} - public string DataPathPrefix {get; set;} - public string DataPort {get; set;} - public string DataScheme {get; set;} - public string[] DataHosts {get; set;} - public string[] DataMimeTypes {get; set;} - public string[] DataPaths {get; set;} - public string[] DataPathPatterns{get; set;} - public string[] DataPathPrefixes{get; set;} - public string[] DataPorts {get; set;} - public string[] DataSchemes {get; set;} + public string[]? Categories {get; set;} + public string? DataHost {get; set;} + public string? DataMimeType {get; set;} + public string? DataPath {get; set;} + public string? DataPathPattern {get; set;} + public string? DataPathPrefix {get; set;} + public string? DataPort {get; set;} + public string? DataScheme {get; set;} + public string[]? DataHosts {get; set;} + public string[]? DataMimeTypes {get; set;} + public string[]? DataPaths {get; set;} + public string[]? DataPathPatterns{get; set;} + public string[]? DataPathPrefixes{get; set;} + public string[]? DataPorts {get; set;} + public string[]? DataSchemes {get; set;} #if ANDROID_23 // This does not exist on https://developer.android.com/guide/topics/manifest/intent-filter-element.html but on http://developer.android.com/intl/ja/training/app-links/index.html ! (bug #35595) public bool AutoVerify {get; set;} #endif #if ANDROID_25 - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif } } diff --git a/src/Mono.Android/Android.App/MetaDataAttribute.cs b/src/Mono.Android/Android.App/MetaDataAttribute.cs index ef185975cd8..36b7c7448f4 100644 --- a/src/Mono.Android/Android.App/MetaDataAttribute.cs +++ b/src/Mono.Android/Android.App/MetaDataAttribute.cs @@ -14,7 +14,7 @@ public MetaDataAttribute (string name) } public string Name {get; private set;} - public string Resource {get; set;} - public string Value {get; set;} + public string? Resource {get; set;} + public string? Value {get; set;} } } diff --git a/src/Mono.Android/Android.App/Notification.cs b/src/Mono.Android/Android.App/Notification.cs index 83d1b5e3d28..7776c56cdbb 100644 --- a/src/Mono.Android/Android.App/Notification.cs +++ b/src/Mono.Android/Android.App/Notification.cs @@ -17,7 +17,7 @@ public long[] Vibrate { get { if (vibrate_jfieldId == IntPtr.Zero) vibrate_jfieldId = JNIEnv.GetFieldID (class_ref, "vibrate", "[J"); - return (long[]) JNIEnv.GetArray (JNIEnv.GetObjectField (Handle, vibrate_jfieldId), JniHandleOwnership.TransferLocalRef, typeof (long)); + return (long[]) JNIEnv.GetArray (JNIEnv.GetObjectField (Handle, vibrate_jfieldId), JniHandleOwnership.TransferLocalRef, typeof (long))!; } set { if (vibrate_jfieldId == IntPtr.Zero) diff --git a/src/Mono.Android/Android.App/NotificationManager.cs b/src/Mono.Android/Android.App/NotificationManager.cs index 9ece8628c39..3e75bedb571 100644 --- a/src/Mono.Android/Android.App/NotificationManager.cs +++ b/src/Mono.Android/Android.App/NotificationManager.cs @@ -6,9 +6,9 @@ namespace Android.App { public partial class NotificationManager { - public static NotificationManager FromContext (Context context) + public static NotificationManager? FromContext (Context context) { - return context.GetSystemService (Context.NotificationService) as NotificationManager; + return context.GetSystemService (Context.NotificationService!) as NotificationManager; } } } diff --git a/src/Mono.Android/Android.App/PermissionAttribute.cs b/src/Mono.Android/Android.App/PermissionAttribute.cs index 0ddc296277b..747ea1c9a91 100644 --- a/src/Mono.Android/Android.App/PermissionAttribute.cs +++ b/src/Mono.Android/Android.App/PermissionAttribute.cs @@ -15,14 +15,14 @@ public PermissionAttribute () { } - public string Description {get; set;} - public string Icon {get; set;} - public string Label {get; set;} - public string Name {get; set;} - public string PermissionGroup {get; set;} + public string? Description {get; set;} + public string? Icon {get; set;} + public string? Label {get; set;} + public string? Name {get; set;} + public string? PermissionGroup {get; set;} public Protection ProtectionLevel {get; set;} #if ANDROID_25 - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif } } diff --git a/src/Mono.Android/Android.App/PermissionGroupAttribute.cs b/src/Mono.Android/Android.App/PermissionGroupAttribute.cs index a248556788a..3e2bf5fe192 100644 --- a/src/Mono.Android/Android.App/PermissionGroupAttribute.cs +++ b/src/Mono.Android/Android.App/PermissionGroupAttribute.cs @@ -15,12 +15,12 @@ public PermissionGroupAttribute () { } - public string Description {get; set;} - public string Icon {get; set;} - public string Label {get; set;} - public string Name {get; set;} + public string? Description {get; set;} + public string? Icon {get; set;} + public string? Label {get; set;} + public string? Name {get; set;} #if ANDROID_25 - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif } } diff --git a/src/Mono.Android/Android.App/PermissionTreeAttribute.cs b/src/Mono.Android/Android.App/PermissionTreeAttribute.cs index c65dc24d064..b530422a9d6 100644 --- a/src/Mono.Android/Android.App/PermissionTreeAttribute.cs +++ b/src/Mono.Android/Android.App/PermissionTreeAttribute.cs @@ -15,11 +15,11 @@ public PermissionTreeAttribute () { } - public string Icon {get; set;} - public string Label {get; set;} - public string Name {get; set;} + public string? Icon {get; set;} + public string? Label {get; set;} + public string? Name {get; set;} #if ANDROID_25 - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif } } diff --git a/src/Mono.Android/Android.App/ProgressDialog.cs b/src/Mono.Android/Android.App/ProgressDialog.cs index f9e7ee369cc..edf50de8180 100644 --- a/src/Mono.Android/Android.App/ProgressDialog.cs +++ b/src/Mono.Android/Android.App/ProgressDialog.cs @@ -7,12 +7,12 @@ namespace Android.App { public partial class ProgressDialog { - public static ProgressDialog Show (Context context, Java.Lang.ICharSequence title, Java.Lang.ICharSequence message, bool indeterminate, bool cancelable, EventHandler cancelHandler) + public static ProgressDialog? Show (Context context, Java.Lang.ICharSequence title, Java.Lang.ICharSequence message, bool indeterminate, bool cancelable, EventHandler cancelHandler) { return Show (context, title, message, indeterminate, cancelable, new IDialogInterfaceOnCancelListenerImplementor () { Handler = cancelHandler }); } - public static ProgressDialog Show (Context context, string title, string message, bool indeterminate, bool cancelable, EventHandler cancelHandler) + public static ProgressDialog? Show (Context context, string title, string message, bool indeterminate, bool cancelable, EventHandler cancelHandler) { return Show (context, title, message, indeterminate, cancelable, new IDialogInterfaceOnCancelListenerImplementor () { Handler = cancelHandler }); } diff --git a/src/Mono.Android/Android.App/SearchManager.cs b/src/Mono.Android/Android.App/SearchManager.cs index ac73c8eb614..f20297974e7 100644 --- a/src/Mono.Android/Android.App/SearchManager.cs +++ b/src/Mono.Android/Android.App/SearchManager.cs @@ -6,9 +6,9 @@ namespace Android.App { public partial class SearchManager { - public static SearchManager FromContext (Context context) + public static SearchManager? FromContext (Context context) { - return context.GetSystemService (Context.SearchService) as SearchManager; + return (context.GetSystemService (Context.SearchService) as SearchManager); } } } diff --git a/src/Mono.Android/Android.App/SyncContext.cs b/src/Mono.Android/Android.App/SyncContext.cs index 950c389451f..ac0fe30093a 100644 --- a/src/Mono.Android/Android.App/SyncContext.cs +++ b/src/Mono.Android/Android.App/SyncContext.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.Threading; using Android.OS; @@ -13,10 +14,10 @@ public override SynchronizationContext CreateCopy () return new SyncContext (); } - static bool EnsureLooper (Looper looper, SendOrPostCallback d) + static bool EnsureLooper ([NotNullWhen (true)]Looper? looper, SendOrPostCallback d) { if (looper == null) { - var message = $"No Android message loop is available. Skipping invocation of `{d.Method.DeclaringType.FullName}.{d.Method.Name}`!"; + var message = $"No Android message loop is available. Skipping invocation of `{d.Method.DeclaringType?.FullName}.{d.Method.Name}`!"; if (JNIEnv.IsRunningOnDesktop) message += " Using `await` when running on the Android Designer is not currently supported. Please use the `View.IsInEditMode` property."; Logger.Log (LogLevel.Error, "monodroid-synccontext", message); diff --git a/src/Mono.Android/Android.App/UiModeManager.cs b/src/Mono.Android/Android.App/UiModeManager.cs index 4174300dc35..09b544e26cb 100644 --- a/src/Mono.Android/Android.App/UiModeManager.cs +++ b/src/Mono.Android/Android.App/UiModeManager.cs @@ -8,9 +8,9 @@ namespace Android.App { public partial class UiModeManager { - public static UiModeManager FromContext (Context context) + public static UiModeManager? FromContext (Context context) { - return context.GetSystemService (Context.UiModeService) as UiModeManager; + return context.GetSystemService (Context.UiModeService!) as UiModeManager; } } } diff --git a/src/Mono.Android/Android.App/UsesFeatureAttribute.cs b/src/Mono.Android/Android.App/UsesFeatureAttribute.cs index a7febfd7f3e..c8e555e80fb 100644 --- a/src/Mono.Android/Android.App/UsesFeatureAttribute.cs +++ b/src/Mono.Android/Android.App/UsesFeatureAttribute.cs @@ -17,7 +17,7 @@ public UsesFeatureAttribute (string name) Name = name; } - public string Name {get; private set;} + public string? Name {get; private set;} #if ANDROID_7 public bool Required {get; set;} #endif diff --git a/src/Mono.Android/Android.App/UsesLibraryAttribute.cs b/src/Mono.Android/Android.App/UsesLibraryAttribute.cs index bf069baaff8..aab26eeafd1 100644 --- a/src/Mono.Android/Android.App/UsesLibraryAttribute.cs +++ b/src/Mono.Android/Android.App/UsesLibraryAttribute.cs @@ -25,7 +25,7 @@ public UsesLibraryAttribute (string name, bool required) : this (name) Required = required; } - public string Name {get; set;} + public string? Name {get; set;} public bool Required {get; set;} } } diff --git a/src/Mono.Android/Android.App/UsesPermissionAttribute.cs b/src/Mono.Android/Android.App/UsesPermissionAttribute.cs index d6e5b6e32e3..cf2e0fd49ec 100644 --- a/src/Mono.Android/Android.App/UsesPermissionAttribute.cs +++ b/src/Mono.Android/Android.App/UsesPermissionAttribute.cs @@ -20,7 +20,7 @@ public UsesPermissionAttribute (string name) Name = name; } - public string Name {get; set;} + public string? Name {get; set;} #if ANDROID_19 public int MaxSdkVersion {get; set;} #endif diff --git a/src/Mono.Android/Android.Bluetooth/BluetoothGattServerCallback.cs b/src/Mono.Android/Android.Bluetooth/BluetoothGattServerCallback.cs index a900f70d7fe..d133369a481 100644 --- a/src/Mono.Android/Android.Bluetooth/BluetoothGattServerCallback.cs +++ b/src/Mono.Android/Android.Bluetooth/BluetoothGattServerCallback.cs @@ -15,12 +15,12 @@ public virtual void OnServiceAdded (ProfileState status, BluetoothGattService se ActualOnServiceAdded (status, service); } - void ActualOnServiceAdded (ProfileState status, BluetoothGattService service) + void ActualOnServiceAdded (ProfileState status, BluetoothGattService? service) { this.OnServiceAdded ((GattStatus) (int) status, service); } - static Delegate cb_onServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext; + static Delegate? cb_onServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext; #pragma warning disable 0169 static Delegate GetOnServiceAdded_ILandroid_bluetooth_BluetoothGattService_Handler_ext () { @@ -31,9 +31,9 @@ static Delegate GetOnServiceAdded_ILandroid_bluetooth_BluetoothGattService_Handl static void n_OnServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext (IntPtr jnienv, IntPtr native__this, int native_status, IntPtr native_service) { - Android.Bluetooth.BluetoothGattServerCallback __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer); + Android.Bluetooth.BluetoothGattServerCallback __this = global::Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!; Android.Bluetooth.ProfileState status = (Android.Bluetooth.ProfileState) native_status; - Android.Bluetooth.BluetoothGattService service = global::Java.Lang.Object.GetObject (native_service, JniHandleOwnership.DoNotTransfer); + var service = global::Java.Lang.Object.GetObject (native_service, JniHandleOwnership.DoNotTransfer); __this.ActualOnServiceAdded (status, service); } #pragma warning restore 0169 diff --git a/src/Mono.Android/Android.Content.Res/IXmlResourceParser.cs b/src/Mono.Android/Android.Content.Res/IXmlResourceParser.cs index 517cd372d41..d392a793398 100644 --- a/src/Mono.Android/Android.Content.Res/IXmlResourceParser.cs +++ b/src/Mono.Android/Android.Content.Res/IXmlResourceParser.cs @@ -15,7 +15,7 @@ public partial interface IXmlResourceParser : Android.Util.IAttributeSet, IXmlPu string GetAttributeName (int pos); string GetAttributeValue (int pos); - string GetAttributeValue (string ns, string name); + string? GetAttributeValue (string? ns, string? name); #endregion } } diff --git a/src/Mono.Android/Android.Content/CursorLoader.cs b/src/Mono.Android/Android.Content/CursorLoader.cs index 89d643a6e31..0f02f9e817e 100644 --- a/src/Mono.Android/Android.Content/CursorLoader.cs +++ b/src/Mono.Android/Android.Content/CursorLoader.cs @@ -8,15 +8,15 @@ public partial class CursorLoader { static IntPtr id_loadInBackground; [Register ("loadInBackground", "()Landroid/database/Cursor;", "GetLoadInBackgroundHandler")] - public override Java.Lang.Object LoadInBackground () + public override Java.Lang.Object? LoadInBackground () { if (id_loadInBackground == IntPtr.Zero) id_loadInBackground = JNIEnv.GetMethodID (class_ref, "loadInBackground", "()Landroid/database/Cursor;"); if (GetType () == ThresholdType) - return (Java.Lang.Object) Java.Lang.Object.GetObject (JNIEnv.CallObjectMethod (Handle, id_loadInBackground), JniHandleOwnership.TransferLocalRef); + return (Java.Lang.Object?) Java.Lang.Object.GetObject (JNIEnv.CallObjectMethod (Handle, id_loadInBackground), JniHandleOwnership.TransferLocalRef); else - return (Java.Lang.Object) Java.Lang.Object.GetObject ( + return (Java.Lang.Object?) Java.Lang.Object.GetObject ( JNIEnv.CallNonvirtualObjectMethod ( Handle, ThresholdClass, diff --git a/src/Mono.Android/Android.Content/GrantUriPermissionAttribute.cs b/src/Mono.Android/Android.Content/GrantUriPermissionAttribute.cs index 0dd9af04441..f65127f20f4 100644 --- a/src/Mono.Android/Android.Content/GrantUriPermissionAttribute.cs +++ b/src/Mono.Android/Android.Content/GrantUriPermissionAttribute.cs @@ -14,8 +14,8 @@ public GrantUriPermissionAttribute () { } - public string Path {get; set;} - public string PathPattern {get; set;} - public string PathPrefix {get; set;} + public string? Path {get; set;} + public string? PathPattern {get; set;} + public string? PathPrefix {get; set;} } } diff --git a/src/Mono.Android/Android.Graphics/Color.cs b/src/Mono.Android/Android.Graphics/Color.cs index b31b454fd14..20c43e1e7dc 100644 --- a/src/Mono.Android/Android.Graphics/Color.cs +++ b/src/Mono.Android/Android.Graphics/Color.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -404,7 +405,7 @@ public override Color CreateGenericValue (ref JniObjectReference reference, JniO throw new NotImplementedException (); } - public override JniValueMarshalerState CreateGenericObjectReferenceArgumentState (Color value, ParameterAttributes synchronize) + public override JniValueMarshalerState CreateGenericObjectReferenceArgumentState ([MaybeNull]Color value, ParameterAttributes synchronize) { throw new NotImplementedException (); } diff --git a/src/Mono.Android/Android.Hardware.Camera2.Params/TonemapCurve.cs b/src/Mono.Android/Android.Hardware.Camera2.Params/TonemapCurve.cs index 473d1149e66..b4023408753 100644 --- a/src/Mono.Android/Android.Hardware.Camera2.Params/TonemapCurve.cs +++ b/src/Mono.Android/Android.Hardware.Camera2.Params/TonemapCurve.cs @@ -8,7 +8,7 @@ public void CopyColorCurve (int colorChannel, float[] destination, int offset) CopyColorCurve (new Android.Graphics.Color (colorChannel), destination, offset); } - public Android.Graphics.PointF GetPoint (int colorChannel, int index) + public Android.Graphics.PointF? GetPoint (int colorChannel, int index) { return GetPoint (new Android.Graphics.Color (colorChannel), index); } diff --git a/src/Mono.Android/Android.Hardware/SensorManager.cs b/src/Mono.Android/Android.Hardware/SensorManager.cs index 558def12c20..62a123b2689 100644 --- a/src/Mono.Android/Android.Hardware/SensorManager.cs +++ b/src/Mono.Android/Android.Hardware/SensorManager.cs @@ -6,9 +6,9 @@ namespace Android.Hardware { public partial class SensorManager { - public static SensorManager FromContext (Context context) + public static SensorManager? FromContext (Context context) { - return context.GetSystemService (Context.SensorService) as SensorManager; + return context.GetSystemService (Context.SensorService!) as SensorManager; } } } diff --git a/src/Mono.Android/Android.InputMethodServices/KeyboardView.cs b/src/Mono.Android/Android.InputMethodServices/KeyboardView.cs index b94f948d31c..4a529205f68 100644 --- a/src/Mono.Android/Android.InputMethodServices/KeyboardView.cs +++ b/src/Mono.Android/Android.InputMethodServices/KeyboardView.cs @@ -2,7 +2,7 @@ namespace Android.InputMethodServices { public partial class KeyboardView { - protected virtual KeyboardView.IOnKeyboardActionListener GetOnKeyboardActionListener () + protected virtual KeyboardView.IOnKeyboardActionListener? GetOnKeyboardActionListener () { return OnKeyboardActionListener; } diff --git a/src/Mono.Android/Android.Locations/LocationManager.cs b/src/Mono.Android/Android.Locations/LocationManager.cs index 96f0c0c9baa..65d36d67e60 100644 --- a/src/Mono.Android/Android.Locations/LocationManager.cs +++ b/src/Mono.Android/Android.Locations/LocationManager.cs @@ -6,9 +6,9 @@ namespace Android.Locations { public partial class LocationManager { - public static LocationManager FromContext (Context context) + public static LocationManager? FromContext (Context context) { - return context.GetSystemService (Context.LocationService) as LocationManager; + return context.GetSystemService (Context.LocationService!) as LocationManager; } } } diff --git a/src/Mono.Android/Android.Media/AudioManager.cs b/src/Mono.Android/Android.Media/AudioManager.cs index 5e2cda5822b..04ac95def4c 100644 --- a/src/Mono.Android/Android.Media/AudioManager.cs +++ b/src/Mono.Android/Android.Media/AudioManager.cs @@ -6,9 +6,9 @@ namespace Android.Media { public partial class AudioManager { - public static AudioManager FromContext (Context context) + public static AudioManager? FromContext (Context context) { - return context.GetSystemService (Context.AudioService) as AudioManager; + return context.GetSystemService (Context.AudioService!) as AudioManager; } } } diff --git a/src/Mono.Android/Android.Media/MediaMetadataRetriever.cs b/src/Mono.Android/Android.Media/MediaMetadataRetriever.cs index 0aa5eee05f4..1c7d7951c58 100644 --- a/src/Mono.Android/Android.Media/MediaMetadataRetriever.cs +++ b/src/Mono.Android/Android.Media/MediaMetadataRetriever.cs @@ -3,12 +3,12 @@ namespace Android.Media { partial class MediaMetadataRetriever { #if ANDROID_10 - public string ExtractMetadata (int keyCode) + public string? ExtractMetadata (int keyCode) { return ExtractMetadata ((MetadataKey) keyCode); } - public Android.Graphics.Bitmap GetFrameAtTime (long timeUs, int option) + public Android.Graphics.Bitmap? GetFrameAtTime (long timeUs, int option) { return GetFrameAtTime (timeUs, (Option) option); } diff --git a/src/Mono.Android/Android.Net.Wifi/WifiManager.cs b/src/Mono.Android/Android.Net.Wifi/WifiManager.cs index 23206c64768..3c448705282 100644 --- a/src/Mono.Android/Android.Net.Wifi/WifiManager.cs +++ b/src/Mono.Android/Android.Net.Wifi/WifiManager.cs @@ -6,9 +6,9 @@ namespace Android.Net.Wifi { public partial class WifiManager { - public static WifiManager FromContext (Context context) + public static WifiManager? FromContext (Context context) { - return context.GetSystemService (Context.WifiService) as WifiManager; + return context.GetSystemService (Context.WifiService!) as WifiManager; } } } diff --git a/src/Mono.Android/Android.Net/ConnectivityManager.cs b/src/Mono.Android/Android.Net/ConnectivityManager.cs index a37973cd639..8e5e2aba5d0 100644 --- a/src/Mono.Android/Android.Net/ConnectivityManager.cs +++ b/src/Mono.Android/Android.Net/ConnectivityManager.cs @@ -6,9 +6,9 @@ namespace Android.Net { public partial class ConnectivityManager { - public static ConnectivityManager FromContext (Context context) + public static ConnectivityManager? FromContext (Context context) { - return context.GetSystemService (Context.ConnectivityService) as ConnectivityManager; + return context.GetSystemService (Context.ConnectivityService!) as ConnectivityManager; } } } diff --git a/src/Mono.Android/Android.OS.Storage/StorageManager.cs b/src/Mono.Android/Android.OS.Storage/StorageManager.cs index ab558b6c58b..f15a370fb58 100644 --- a/src/Mono.Android/Android.OS.Storage/StorageManager.cs +++ b/src/Mono.Android/Android.OS.Storage/StorageManager.cs @@ -8,9 +8,9 @@ namespace Android.OS.Storage { public partial class StorageManager { - public static StorageManager FromContext (Context context) + public static StorageManager? FromContext (Context context) { - return context.GetSystemService (Context.StorageService) as StorageManager; + return context.GetSystemService (Context.StorageService!) as StorageManager; } } } diff --git a/src/Mono.Android/Android.OS/AsyncTask.cs b/src/Mono.Android/Android.OS/AsyncTask.cs index 86cedcb8284..772e2e69908 100644 --- a/src/Mono.Android/Android.OS/AsyncTask.cs +++ b/src/Mono.Android/Android.OS/AsyncTask.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; - +using System.Diagnostics.CodeAnalysis; using Android.Runtime; using Java.Interop; @@ -55,11 +55,13 @@ public AsyncTask () } [Preserve (Conditional = true)] - protected override Java.Lang.Object DoInBackground (params Java.Lang.Object[] native_parms) + protected override Java.Lang.Object? DoInBackground (params Java.Lang.Object[]? native_parms) { - TParams[] parms = new TParams[native_parms.Length]; + TParams[] parms = new TParams[native_parms?.Length ?? 0]; for (int i = 0; i < parms.Length; i++) - parms [i] = JavaConvert.FromJavaObject(native_parms [i]); +#pragma warning disable CS8601 // Possible null reference assignment. + parms [i] = JavaConvert.FromJavaObject(native_parms? [i]); +#pragma warning restore CS8601 // Possible null reference assignment. return JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (RunInBackground (parms))); } @@ -68,13 +70,13 @@ protected override Java.Lang.Object DoInBackground (params Java.Lang.Object[] na static IntPtr id_execute_arrayLjava_lang_Object_; [Register ("execute", "([Ljava/lang/Object;)Landroid/os/AsyncTask;", "")] - public Android.OS.AsyncTask Execute (params TParams[] @params) + public Android.OS.AsyncTask? Execute (params TParams[] @params) { if (id_execute_arrayLjava_lang_Object_ == IntPtr.Zero) id_execute_arrayLjava_lang_Object_ = JNIEnv.GetMethodID (class_ref, "execute", "([Ljava/lang/Object;)Landroid/os/AsyncTask;"); IntPtr native__params = JNIEnv.NewObjectArray (@params); try { - Android.OS.AsyncTask __ret = Java.Lang.Object.GetObject> (JNIEnv.CallObjectMethod (Handle, id_execute_arrayLjava_lang_Object_, new JValue (native__params)), JniHandleOwnership.TransferLocalRef); + var __ret = Java.Lang.Object.GetObject> (JNIEnv.CallObjectMethod (Handle, id_execute_arrayLjava_lang_Object_, new JValue (native__params)), JniHandleOwnership.TransferLocalRef); if (@params != null) JNIEnv.CopyObjectArray (native__params, @params); return __ret; @@ -86,6 +88,7 @@ public Android.OS.AsyncTask Execute (params TParams } static IntPtr id_get; + [return: MaybeNull] [Register ("get", "()Ljava/lang/Object;", "")] public TResult GetResult () { @@ -94,22 +97,24 @@ public TResult GetResult () return JavaConvert.FromJniHandle(JNIEnv.CallObjectMethod (Handle, id_get), JniHandleOwnership.TransferLocalRef); } - protected override void OnPostExecute (Java.Lang.Object result) + protected override void OnPostExecute (Java.Lang.Object? result) { OnPostExecute (JavaConvert.FromJavaObject (result)); } [Register ("onPostExecute", "(Ljava/lang/Object;)V", "GetOnPostExecute_Ljava_lang_Object_Handler")] - protected virtual void OnPostExecute (TResult result) + protected virtual void OnPostExecute ([AllowNull]TResult result) { base.OnPostExecute (JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (result))); } - protected override void OnProgressUpdate (params Java.Lang.Object[] native_values) + protected override void OnProgressUpdate (params Java.Lang.Object[]? native_values) { - TProgress[] values = new TProgress [native_values.Length]; + TProgress[] values = new TProgress [native_values?.Length ?? 0]; for (int i = 0; i < values.Length; i++) - values [i] = JavaConvert.FromJavaObject(native_values [i]); +#pragma warning disable CS8601 // Possible null reference assignment. + values [i] = JavaConvert.FromJavaObject(native_values? [i]); +#pragma warning restore CS8601 // Possible null reference assignment. OnProgressUpdate (values); } @@ -118,7 +123,9 @@ protected virtual void OnProgressUpdate (params TProgress[] values) { Java.Lang.Object[] native_values = new Java.Lang.Object [values.Length]; for (int i = 0; i < values.Length; i++) +#pragma warning disable CS8601 // Possible null reference assignment. native_values [i] = JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (values [i])); +#pragma warning restore CS8601 // Possible null reference assignment. base.OnProgressUpdate (native_values); } @@ -126,7 +133,9 @@ protected void PublishProgress (params TProgress[] values) { Java.Lang.Object[] native_values = new Java.Lang.Object [values.Length]; for (int i = 0; i < values.Length; i++) +#pragma warning disable CS8601 // Possible null reference assignment. native_values [i] = JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (values [i])); +#pragma warning restore CS8601 // Possible null reference assignment. base.PublishProgress (native_values); } } diff --git a/src/Mono.Android/Android.OS/DropBoxManager.cs b/src/Mono.Android/Android.OS/DropBoxManager.cs index fcad4413f4f..f8d4cef5758 100644 --- a/src/Mono.Android/Android.OS/DropBoxManager.cs +++ b/src/Mono.Android/Android.OS/DropBoxManager.cs @@ -8,9 +8,9 @@ namespace Android.OS { public partial class DropBoxManager { - public static DropBoxManager FromContext (Context context) + public static DropBoxManager? FromContext (Context context) { - return context.GetSystemService (Context.DropboxService) as DropBoxManager; + return context.GetSystemService (Context.DropboxService!) as DropBoxManager; } } diff --git a/src/Mono.Android/Android.OS/Message.cs b/src/Mono.Android/Android.OS/Message.cs index 5fa8441b618..1ebd211ee20 100644 --- a/src/Mono.Android/Android.OS/Message.cs +++ b/src/Mono.Android/Android.OS/Message.cs @@ -5,7 +5,7 @@ namespace Android.OS { public partial class Message { - public static Message Obtain (Handler h, Action @callback) + public static Message? Obtain (Handler h, Action @callback) { return Obtain (h, new Java.Lang.Thread.RunnableImplementor (@callback)); } diff --git a/src/Mono.Android/Android.OS/PowerManager.cs b/src/Mono.Android/Android.OS/PowerManager.cs index 4df6a9262d8..62e1981125c 100644 --- a/src/Mono.Android/Android.OS/PowerManager.cs +++ b/src/Mono.Android/Android.OS/PowerManager.cs @@ -6,9 +6,9 @@ namespace Android.OS { public partial class PowerManager { - public static PowerManager FromContext (Context context) + public static PowerManager? FromContext (Context context) { - return context.GetSystemService (Context.PowerService) as PowerManager; + return context.GetSystemService (Context.PowerService!) as PowerManager; } } } diff --git a/src/Mono.Android/Android.OS/Vibrator.cs b/src/Mono.Android/Android.OS/Vibrator.cs index 6ca8efa37ff..1b63bf38288 100644 --- a/src/Mono.Android/Android.OS/Vibrator.cs +++ b/src/Mono.Android/Android.OS/Vibrator.cs @@ -6,9 +6,9 @@ namespace Android.OS { public partial class Vibrator { - public static Vibrator FromContext (Context context) + public static Vibrator? FromContext (Context context) { - return context.GetSystemService (Context.VibratorService) as Vibrator; + return context.GetSystemService (Context.VibratorService!) as Vibrator; } } } diff --git a/src/Mono.Android/Android.Preferences/CheckBoxPreference.cs b/src/Mono.Android/Android.Preferences/CheckBoxPreference.cs index 31145910b85..bc3dfe7717a 100644 --- a/src/Mono.Android/Android.Preferences/CheckBoxPreference.cs +++ b/src/Mono.Android/Android.Preferences/CheckBoxPreference.cs @@ -3,15 +3,15 @@ namespace Android.Preferences { partial class CheckBoxPreference { #if ANDROID_14 - public new string SummaryOff { + public new string? SummaryOff { get {return base.SummaryOff;} set {base.SummaryOff = value;} } - public new string SummaryOn { + public new string? SummaryOn { get {return base.SummaryOn;} set {base.SummaryOn = value;} } #endif // ANDROID_14 } -} \ No newline at end of file +} diff --git a/src/Mono.Android/Android.Runtime/AndroidEnvironment.cs b/src/Mono.Android/Android.Runtime/AndroidEnvironment.cs index 348ae0bd055..9fbf8941223 100644 --- a/src/Mono.Android/Android.Runtime/AndroidEnvironment.cs +++ b/src/Mono.Android/Android.Runtime/AndroidEnvironment.cs @@ -21,8 +21,8 @@ public static class AndroidEnvironment { public const string AndroidLogAppName = "Mono.Android"; - static IX509TrustManager sslTrustManager; - static KeyStore certStore; + static IX509TrustManager? sslTrustManager; + static KeyStore? certStore; static object lock_ = new object (); static void SetupTrustManager () @@ -31,9 +31,9 @@ static void SetupTrustManager () return; lock (lock_) { - TrustManagerFactory factory = TrustManagerFactory.GetInstance (TrustManagerFactory.DefaultAlgorithm); - factory.Init ((KeyStore) null); - foreach (ITrustManager tm in factory.GetTrustManagers ()) { + TrustManagerFactory factory = TrustManagerFactory.GetInstance (TrustManagerFactory.DefaultAlgorithm)!; + factory.Init ((KeyStore?) null); + foreach (ITrustManager tm in factory.GetTrustManagers ()!) { try { sslTrustManager = tm.JavaCast(); } @@ -53,7 +53,7 @@ static void SetupCertStore () lock (lock_) { try { - certStore = KeyStore.GetInstance ("AndroidCAStore"); + certStore = KeyStore.GetInstance ("AndroidCAStore")!; certStore.Load (null); } catch { // ignore @@ -65,7 +65,7 @@ static void SetupCertStore () [DllImport ("libc")] static extern void exit (int status); - public static void FailFast (string message) + public static void FailFast (string? message) { Logger.Log (LogLevel.Fatal, AndroidLogAppName, message); exit (-1); @@ -95,7 +95,7 @@ static System.Exception HandleToException (IntPtr handle) } #endif // !JAVA_INTEROP - public static event EventHandler UnhandledExceptionRaiser; + public static event EventHandler? UnhandledExceptionRaiser; public static void RaiseThrowable (Java.Lang.Throwable throwable) { @@ -106,7 +106,7 @@ public static void RaiseThrowable (Java.Lang.Throwable throwable) static IEnumerable> GetUnhandledExceptionRaiserInvocationList () { - EventHandler h = UnhandledExceptionRaiser; + EventHandler? h = UnhandledExceptionRaiser; if (h == null) return new EventHandler[0]; return h.GetInvocationList ().Cast> (); @@ -192,7 +192,7 @@ static bool TrustEvaluateSsl (List certsRawData) // System.Mono.Btls.MonoBtlsX509LookupMono.OnGetBySubject(). All exceptions are caught and handled // by the caller. // - static byte[] CertStoreLookup (long hash, bool userStore) + static byte[]? CertStoreLookup (long hash, bool userStore) { SetupCertStore (); @@ -209,13 +209,13 @@ static byte[] CertStoreLookup (long hash, bool userStore) static Java.Security.Cert.CertificateFactory GetX509CertificateFactory () { - return Java.Security.Cert.CertificateFactory.GetInstance ("X.509"); + return Java.Security.Cert.CertificateFactory.GetInstance ("X.509")!; } static Java.Security.Cert.X509Certificate ConvertCertificate (Java.Security.Cert.CertificateFactory factory, byte[] certificateData) { return factory.GenerateCertificate (new System.IO.MemoryStream (certificateData)) - .JavaCast(); + .JavaCast()!; } // This is invoked by libmonodroid.so. @@ -252,7 +252,7 @@ static void GetDisplayDPI (out float x_dpi, out float y_dpi) var wm = Application.Context.GetSystemService (Context.WindowService).JavaCast (); var metrics = new DisplayMetrics (); #if ANDROID_17 - wm.DefaultDisplay.GetRealMetrics (metrics); + wm?.DefaultDisplay?.GetRealMetrics (metrics); #else wm.DefaultDisplay.GetMetrics (metrics); #endif @@ -277,7 +277,7 @@ static string GetDefaultTimeZone () { IntPtr id = _monodroid_timezone_get_default_id (); try { - return Marshal.PtrToStringAnsi (id); + return Marshal.PtrToStringAnsi (id)!; } finally { JNIEnv.monodroid_free (id); } @@ -289,7 +289,7 @@ static string GetDefaultTimeZone () // This is invoked by // mscorlib.dll!System.AndroidPlatform.GetDefaultSyncContext() // DO NOT REMOVE - static SynchronizationContext GetDefaultSyncContext () + static SynchronizationContext? GetDefaultSyncContext () { var looper = Android.OS.Looper.MainLooper; try { @@ -353,10 +353,10 @@ static IWebProxy GetDefaultProxy () // This is invoked by // System.Net.Http.dll!System.Net.Http.HttpClient.cctor // DO NOT REMOVE - static object GetHttpMessageHandler () + static object? GetHttpMessageHandler () { - string envvar = Environment.GetEnvironmentVariable ("XA_HTTP_CLIENT_HANDLER_TYPE")?.Trim (); - Type handlerType = null; + var envvar = Environment.GetEnvironmentVariable ("XA_HTTP_CLIENT_HANDLER_TYPE")?.Trim (); + Type? handlerType = null; if (!String.IsNullOrEmpty (envvar)) handlerType = Type.GetType (envvar, false); else @@ -368,7 +368,7 @@ static object GetHttpMessageHandler () } class _Proxy : IWebProxy { - readonly ProxySelector selector = ProxySelector.Default; + readonly ProxySelector selector = ProxySelector.Default!; // Exception audit: // @@ -391,7 +391,7 @@ public Uri GetProxy (Uri destination) { IList list; using (var uri = CreateJavaUri (destination)) - list = selector.Select (uri); + list = selector.Select (uri)!; if (list.Count < 1) return destination; @@ -414,7 +414,7 @@ public bool IsBypassed (Uri host) { IList list; using (var uri = CreateJavaUri (host)) - list = selector.Select (uri); + list = selector.Select (uri)!; if (list.Count < 1) return true; @@ -422,7 +422,7 @@ public bool IsBypassed (Uri host) return list [0].Equals (Proxy.NoProxy); } - public ICredentials Credentials { + public ICredentials? Credentials { get; set; } diff --git a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs index 2f9c82c9d11..6c3f738c244 100644 --- a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs +++ b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs @@ -9,6 +9,7 @@ using Java.Interop; using Java.Interop.Tools.TypeNameMappings; +using System.Diagnostics.CodeAnalysis; #if JAVA_INTEROP namespace Android.Runtime { @@ -30,14 +31,14 @@ internal AndroidRuntime (IntPtr jnienv, { } - public override void FailFast (string message) + public override void FailFast (string? message) { AndroidEnvironment.FailFast (message); } public override string GetCurrentManagedThreadName () { - return Thread.CurrentThread.Name; + return Thread.CurrentThread.Name!; } public override string GetCurrentManagedThreadStackTrace (int skipFrames, bool fNeedFileInfo) @@ -46,11 +47,11 @@ public override string GetCurrentManagedThreadStackTrace (int skipFrames, bool f .ToString (); } - public override Exception GetExceptionForThrowable (ref JniObjectReference reference, JniObjectReferenceOptions options) + public override Exception? GetExceptionForThrowable (ref JniObjectReference reference, JniObjectReferenceOptions options) { if (!reference.IsValid) return null; - var peeked = JNIEnv.AndroidValueManager.PeekPeer (reference); + var peeked = JNIEnv.AndroidValueManager?.PeekPeer (reference); var peekedExc = peeked as Exception; if (peekedExc == null) { var throwable = Java.Lang.Object.GetObject (reference.Handle, JniHandleOwnership.DoNotTransfer); @@ -58,7 +59,7 @@ public override Exception GetExceptionForThrowable (ref JniObjectReference refer return throwable; } JniObjectReference.Dispose (ref reference, options); - var unwrapped = JNIEnv.AndroidValueManager.UnboxException (peeked); + var unwrapped = JNIEnv.AndroidValueManager?.UnboxException (peeked!); if (unwrapped != null) { return unwrapped; } @@ -158,7 +159,7 @@ public override IntPtr ReleaseLocalReference (ref JniObjectReference value, ref return r; } - public override void WriteGlobalReferenceLine (string format, params object[] args) + public override void WriteGlobalReferenceLine (string format, params object?[] args) { JNIEnv._monodroid_gref_log (string.Format (format, args)); } @@ -250,9 +251,9 @@ protected override IEnumerable GetTypesForSimpleReference (string jniSimpl .Concat (Enumerable.Repeat (t, 1)); } - protected override string GetSimpleReference (Type type) + protected override string? GetSimpleReference (Type type) { - string j = JNIEnv.TypemapManagedToJava (type); + string? j = JNIEnv.TypemapManagedToJava (type); if (j != null) { return j; } @@ -264,7 +265,7 @@ protected override string GetSimpleReference (Type type) protected override IEnumerable GetSimpleReferences (Type type) { - string j = JNIEnv.TypemapManagedToJava (type); + string? j = JNIEnv.TypemapManagedToJava (type); if (j != null) { yield return j; } @@ -275,7 +276,7 @@ protected override IEnumerable GetSimpleReferences (Type type) delegate Delegate GetCallbackHandler (); - static MethodInfo dynamic_callback_gen; + static MethodInfo? dynamic_callback_gen; static Delegate CreateDynamicCallback (MethodInfo method) { @@ -290,12 +291,12 @@ static Delegate CreateDynamicCallback (MethodInfo method) if (dynamic_callback_gen == null) throw new InvalidOperationException ("The referenced Mono.Android.Export.dll does not match the expected version. The required method was not found."); } - return (Delegate)dynamic_callback_gen.Invoke (null, new object [] { method }); + return (Delegate)dynamic_callback_gen.Invoke (null, new object [] { method })!; } static List sharedRegistrations = new List (); - static bool FastRegisterNativeMembers (JniType nativeClass, Type type, string methods) + static bool FastRegisterNativeMembers (JniType nativeClass, Type type, string? methods) { if (!MagicRegistrationMap.Filled) return false; @@ -313,7 +314,7 @@ static bool FastRegisterNativeMembers (JniType nativeClass, Type type, string me registrations = new List (); } JniNativeMethodRegistrationArguments arguments = new JniNativeMethodRegistrationArguments (registrations, methods); - rv = MagicRegistrationMap.CallRegisterMethod (arguments, type.FullName); + rv = MagicRegistrationMap.CallRegisterMethod (arguments, type.FullName!); if (registrations.Count > 0) nativeClass.RegisterNativeMethods (registrations.ToArray ()); @@ -329,7 +330,7 @@ static bool FastRegisterNativeMembers (JniType nativeClass, Type type, string me class MagicRegistrationMap { #pragma warning disable CS0649 // Field is never assigned to; // assigned to in generated IL: https://github.com/xamarin/xamarin-android/blob/cbfa7e20acebd37b52ec4de9d5c1a4a66ddda799/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs#L204 - static Dictionary typesMap; + static Dictionary? typesMap; #pragma warning restore CS0649 static void Prefill () @@ -350,22 +351,22 @@ static public bool Filled { internal static bool CallRegisterMethod (JniNativeMethodRegistrationArguments arguments, string typeName) { - int idx; + int idx = 0; - if (typeName == null || !typesMap.TryGetValue (typeName, out idx)) + if (typeName == null || !(typesMap?.TryGetValue (typeName, out idx) == true)) return false; return CallRegisterMethodByIndex (arguments, idx); } - static bool CallRegisterMethodByIndex (JniNativeMethodRegistrationArguments arguments, int typeIdx) + static bool CallRegisterMethodByIndex (JniNativeMethodRegistrationArguments arguments, int? typeIdx) { // updated by the linker to register known types return false; } } - public override void RegisterNativeMembers (JniType nativeClass, Type type, string methods) + public override void RegisterNativeMembers (JniType nativeClass, Type type, string? methods) { if (FastRegisterNativeMembers (nativeClass, type, methods)) return; @@ -376,7 +377,7 @@ public override void RegisterNativeMembers (JniType nativeClass, Type type, stri return; } - string[] members = methods.Split ('\n'); + string[] members = methods!.Split ('\n'); if (members.Length < 2) { if (jniAddNativeMethodRegistrationAttributePresent) base.RegisterNativeMembers (nativeClass, type, methods); @@ -399,10 +400,10 @@ public override void RegisterNativeMembers (JniType nativeClass, Type type, stri } else { Type callbackDeclaringType = type; if (toks.Length == 4) { - callbackDeclaringType = Type.GetType (toks [3], throwOnError: true); + callbackDeclaringType = Type.GetType (toks [3], throwOnError: true)!; } while (callbackDeclaringType.ContainsGenericParameters) { - callbackDeclaringType = callbackDeclaringType.BaseType; + callbackDeclaringType = callbackDeclaringType.BaseType!; } GetCallbackHandler connector = (GetCallbackHandler) Delegate.CreateDelegate (typeof (GetCallbackHandler), callbackDeclaringType, toks [2]); @@ -424,7 +425,7 @@ public override void WaitForGCBridgeProcessing () JNIEnv.WaitForBridgeProcessing (); } - public override IJavaPeerable CreatePeer (ref JniObjectReference reference, JniObjectReferenceOptions options, Type targetType) + public override IJavaPeerable? CreatePeer (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType) { if (!reference.IsValid) return null; @@ -442,7 +443,7 @@ public override void AddPeer (IJavaPeerable value) throw new ArgumentException ("Must have a valid JNI object reference!", nameof (value)); var reference = value.PeerReference; - var hash = JNIEnv.IdentityHash (reference.Handle); + var hash = JNIEnv.IdentityHash! (reference.Handle); AddPeer (value, reference, hash); } @@ -450,22 +451,21 @@ public override void AddPeer (IJavaPeerable value) internal void AddPeer (IJavaPeerable value, JniObjectReference reference, IntPtr hash) { lock (instances) { - IdentityHashTargets targets; - if (!instances.TryGetValue (hash, out targets)) { + if (!instances.TryGetValue (hash, out var targets)) { targets = new IdentityHashTargets (value); instances.Add (hash, targets); return; } bool found = false; for (int i = 0; i < targets.Count; ++i) { - IJavaPeerable target; + IJavaPeerable? target; var wref = targets [i]; - if (ShouldReplaceMapping (wref, reference, out target)) { + if (ShouldReplaceMapping (wref!, reference, out target)) { found = true; targets [i] = IdentityHashTargets.CreateWeakReference (value); break; } - if (JniEnvironment.Types.IsSameObject (value.PeerReference, target.PeerReference)) { + if (JniEnvironment.Types.IsSameObject (value.PeerReference, target!.PeerReference)) { found = true; if (Logger.LogGlobalRef) { Logger.Log (LogLevel.Info, "monodroid-gref", @@ -506,7 +506,7 @@ internal void AddPeer (IJavaPeerable value, IntPtr handle, JniHandleOwnership tr if (handleField == IntPtr.Zero) throw new InvalidOperationException ("Unable to allocate Global Reference for object '" + value.ToString () + "'!"); - IntPtr hash = JNIEnv.IdentityHash (handleField); + IntPtr hash = JNIEnv.IdentityHash! (handleField); value.SetJniIdentityHashCode ((int) hash); if ((transfer & JniHandleOwnership.DoNotRegister) == 0) { AddPeer (value, new JniObjectReference (handleField, JniObjectReferenceType.Global), hash); @@ -520,7 +520,7 @@ internal void AddPeer (IJavaPeerable value, IntPtr handle, JniHandleOwnership tr } } - bool ShouldReplaceMapping (WeakReference current, JniObjectReference reference, out IJavaPeerable target) + bool ShouldReplaceMapping (WeakReference current, JniObjectReference reference, out IJavaPeerable? target) { target = null; @@ -562,7 +562,7 @@ public override void RemovePeer (IJavaPeerable value) throw new ArgumentException ("Must have a valid JNI object reference!", nameof (value)); var reference = value.PeerReference; - var hash = JNIEnv.IdentityHash (reference.Handle); + var hash = JNIEnv.IdentityHash! (reference.Handle); RemovePeer (value, hash); } @@ -570,13 +570,12 @@ public override void RemovePeer (IJavaPeerable value) internal void RemovePeer (IJavaPeerable value, IntPtr hash) { lock (instances) { - IdentityHashTargets targets; - if (!instances.TryGetValue (hash, out targets)) { + if (!instances.TryGetValue (hash, out var targets)) { return; } for (int i = targets.Count - 1; i >= 0; i--) { var wref = targets [i]; - if (!wref.TryGetTarget (out IJavaPeerable target)) { + if (!wref!.TryGetTarget (out var target)) { // wref is invalidated; remove it. targets.RemoveAt (i); continue; @@ -592,18 +591,17 @@ internal void RemovePeer (IJavaPeerable value, IntPtr hash) } } - public override IJavaPeerable PeekPeer (JniObjectReference reference) + public override IJavaPeerable? PeekPeer (JniObjectReference reference) { if (!reference.IsValid) return null; - var hash = JNIEnv.IdentityHash (reference.Handle); + var hash = JNIEnv.IdentityHash! (reference.Handle); lock (instances) { - IdentityHashTargets targets; - if (instances.TryGetValue (hash, out targets)) { + if (instances.TryGetValue (hash, out var targets)) { for (int i = targets.Count - 1; i >= 0; i--) { var wref = targets [i]; - if (!wref.TryGetTarget (out var result) || !result.PeerReference.IsValid) { + if (!wref!.TryGetTarget (out var result) || !result.PeerReference.IsValid) { targets.RemoveAt (i); continue; } @@ -616,7 +614,7 @@ public override IJavaPeerable PeekPeer (JniObjectReference reference) return null; } - protected override bool TryUnboxPeerObject (IJavaPeerable value, out object result) + protected override bool TryUnboxPeerObject (IJavaPeerable value, [NotNullWhen (true)]out object? result) { var proxy = value as JavaProxyThrowable; if (proxy != null) { @@ -626,9 +624,9 @@ protected override bool TryUnboxPeerObject (IJavaPeerable value, out object resu return base.TryUnboxPeerObject (value, out result); } - internal Exception UnboxException (IJavaPeerable value) + internal Exception? UnboxException (IJavaPeerable value) { - object r; + object? r; if (TryUnboxPeerObject (value, out r) && r is Exception e) { return e; } @@ -669,7 +667,7 @@ public override List GetSurfacedPeers () foreach (var e in instances) { for (int i = 0; i < e.Value.Count; i++) { var value = e.Value [i]; - surfacedPeers.Add (new JniSurfacedPeerInfo (e.Key.ToInt32 (), value)); + surfacedPeers.Add (new JniSurfacedPeerInfo (e.Key.ToInt32 (), value!)); } } return surfacedPeers; @@ -692,8 +690,8 @@ public int GetHashCode (IntPtr value) } class IdentityHashTargets { - WeakReference first; - List> rest; + WeakReference? first; + List?>? rest; public static WeakReference CreateWeakReference (IJavaPeerable value) { @@ -707,7 +705,7 @@ public IdentityHashTargets (IJavaPeerable value) public int Count => (first != null ? 1 : 0) + (rest != null ? rest.Count : 0); - public WeakReference this [int index] { + public WeakReference? this [int index] { get { if (index == 0) return first; @@ -722,7 +720,9 @@ public WeakReference this [int index] { return; } index -= 1; - rest [index] = value; + + if (rest != null) + rest [index] = value; } } @@ -733,7 +733,7 @@ public void Add (IJavaPeerable value) return; } if (rest == null) - rest = new List> (); + rest = new List?> (); rest.Add (CreateWeakReference (value)); } @@ -748,7 +748,7 @@ public void RemoveAt (int index) return; } index -= 1; - rest.RemoveAt (index); + rest?.RemoveAt (index); } } } diff --git a/src/Mono.Android/Android.Runtime/CPUArchitecture.cs b/src/Mono.Android/Android.Runtime/CPUArchitecture.cs index 374ac5fa993..69f744ac65f 100644 --- a/src/Mono.Android/Android.Runtime/CPUArchitecture.cs +++ b/src/Mono.Android/Android.Runtime/CPUArchitecture.cs @@ -9,4 +9,4 @@ enum CPUArchitecture : ushort X86 = 4, X86_64 = 5 } -} \ No newline at end of file +} diff --git a/src/Mono.Android/Android.Runtime/CharSequence.cs b/src/Mono.Android/Android.Runtime/CharSequence.cs index bfcf20cf890..d79c94520a3 100644 --- a/src/Mono.Android/Android.Runtime/CharSequence.cs +++ b/src/Mono.Android/Android.Runtime/CharSequence.cs @@ -1,12 +1,14 @@ using System; using System.Linq; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace Android.Runtime { - public static class CharSequence { + public static class CharSequence { - public static Java.Lang.ICharSequence[] ArrayFromStringArray (string[] val) + [return: NotNullIfNotNull (parameterName: "val")] + public static Java.Lang.ICharSequence[]? ArrayFromStringArray (string[]? val) { if (val == null) return null; @@ -18,7 +20,8 @@ public static Java.Lang.ICharSequence[] ArrayFromStringArray (string[] val) return ret; } - public static string[] ArrayToStringArray (Java.Lang.ICharSequence[] val) + [return: NotNullIfNotNull (parameterName: "val")] + public static string[]? ArrayToStringArray (Java.Lang.ICharSequence[]? val) { if (val == null) return null; @@ -31,24 +34,24 @@ public static string[] ArrayToStringArray (Java.Lang.ICharSequence[] val) } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (string value) + public static IntPtr ToLocalJniHandle (string? value) { return JNIEnv.NewString (value); } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (Java.Lang.ICharSequence value) + public static IntPtr ToLocalJniHandle (Java.Lang.ICharSequence? value) { return value == null ? IntPtr.Zero : JNIEnv.ToLocalJniHandle (value); } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (IEnumerable value) + public static IntPtr ToLocalJniHandle (IEnumerable? value) { if (value == null) { return IntPtr.Zero; - } else if (value is string) { - return JNIEnv.NewString (value as string); + } else if (value is string s) { + return JNIEnv.NewString (s); } else if (value is Java.Lang.ICharSequence) { return JNIEnv.ToLocalJniHandle ((Java.Lang.ICharSequence) value); } else { diff --git a/src/Mono.Android/Android.Runtime/ConstructorBuilder.cs b/src/Mono.Android/Android.Runtime/ConstructorBuilder.cs index 7cbe4700c62..3596695c4b9 100644 --- a/src/Mono.Android/Android.Runtime/ConstructorBuilder.cs +++ b/src/Mono.Android/Android.Runtime/ConstructorBuilder.cs @@ -7,13 +7,13 @@ namespace Android.Runtime { internal class ConstructorBuilder { - static MethodInfo newobject = typeof (System.Runtime.Serialization.FormatterServices).GetMethod ("GetUninitializedObject", BindingFlags.Public | BindingFlags.Static); - static MethodInfo gettype = typeof (System.Type).GetMethod ("GetTypeFromHandle", BindingFlags.Public | BindingFlags.Static); - static FieldInfo handlefld = typeof (Java.Lang.Object).GetField ("handle", BindingFlags.NonPublic | BindingFlags.Instance); - static FieldInfo Throwable_handle = typeof (Java.Lang.Throwable).GetField ("handle", BindingFlags.NonPublic | BindingFlags.Instance); + static MethodInfo newobject = typeof (System.Runtime.Serialization.FormatterServices).GetMethod ("GetUninitializedObject", BindingFlags.Public | BindingFlags.Static)!; + static MethodInfo gettype = typeof (System.Type).GetMethod ("GetTypeFromHandle", BindingFlags.Public | BindingFlags.Static)!; + static FieldInfo handlefld = typeof (Java.Lang.Object).GetField ("handle", BindingFlags.NonPublic | BindingFlags.Instance)!; + static FieldInfo Throwable_handle = typeof (Java.Lang.Throwable).GetField ("handle", BindingFlags.NonPublic | BindingFlags.Instance)!; - internal static Action CreateDelegate (Type type, ConstructorInfo cinfo, Type [] parameter_types) { + internal static Action CreateDelegate (Type type, ConstructorInfo cinfo, Type [] parameter_types) { var handle = handlefld; if (typeof (Java.Lang.Throwable).IsAssignableFrom (type)) { handle = Throwable_handle; @@ -42,7 +42,7 @@ internal class ConstructorBuilder { il.Emit (OpCodes.Ret); - return (Action) method.CreateDelegate (typeof (Action )); + return (Action) method.CreateDelegate (typeof (Action )); } } } diff --git a/src/Mono.Android/Android.Runtime/DynamicMethodNameCounter.cs b/src/Mono.Android/Android.Runtime/DynamicMethodNameCounter.cs index f28176d0525..355cec9c4ca 100644 --- a/src/Mono.Android/Android.Runtime/DynamicMethodNameCounter.cs +++ b/src/Mono.Android/Android.Runtime/DynamicMethodNameCounter.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading; namespace Android.Runtime { diff --git a/src/Mono.Android/Android.Runtime/Extensions.cs b/src/Mono.Android/Android.Runtime/Extensions.cs index b5a0acd159b..0d87b187f13 100644 --- a/src/Mono.Android/Android.Runtime/Extensions.cs +++ b/src/Mono.Android/Android.Runtime/Extensions.cs @@ -1,11 +1,13 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.Reflection; namespace Android.Runtime { public static class Extensions { - public static TResult JavaCast (this IJavaObject instance) + [return: MaybeNull] + public static TResult JavaCast (this IJavaObject? instance) where TResult : class, IJavaObject { return Java.Interop.JavaObjectExtensions.JavaCast(instance); diff --git a/src/Mono.Android/Android.Runtime/IJavaObjectValueMarshaler.cs b/src/Mono.Android/Android.Runtime/IJavaObjectValueMarshaler.cs index bf73dbd05a9..99237aaa223 100644 --- a/src/Mono.Android/Android.Runtime/IJavaObjectValueMarshaler.cs +++ b/src/Mono.Android/Android.Runtime/IJavaObjectValueMarshaler.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -12,17 +13,17 @@ sealed class IJavaObjectValueMarshaler : JniValueMarshaler { internal static IJavaObjectValueMarshaler Instance = new IJavaObjectValueMarshaler (); - public override IJavaObject CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type targetType) + public override IJavaObject CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType) { throw new NotImplementedException (); } - public override JniValueMarshalerState CreateGenericObjectReferenceArgumentState (IJavaObject value, ParameterAttributes synchronize) + public override JniValueMarshalerState CreateGenericObjectReferenceArgumentState ([MaybeNull]IJavaObject value, ParameterAttributes synchronize) { throw new NotImplementedException (); } - public override void DestroyGenericArgumentState (IJavaObject value, ref JniValueMarshalerState state, ParameterAttributes synchronize) + public override void DestroyGenericArgumentState ([AllowNull]IJavaObject value, ref JniValueMarshalerState state, ParameterAttributes synchronize) { throw new NotImplementedException (); } @@ -36,7 +37,7 @@ public override Expression CreateReturnValueFromManagedExpression (JniValueMarsh sourceValue); } - public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize, Type targetType) + public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize, Type? targetType) { var r = Expression.Variable (targetType, sourceValue.Name + "_val"); context.LocalVariables.Add (r); diff --git a/src/Mono.Android/Android.Runtime/InputStreamAdapter.cs b/src/Mono.Android/Android.Runtime/InputStreamAdapter.cs index 2496c1081e0..10a0be84ef7 100644 --- a/src/Mono.Android/Android.Runtime/InputStreamAdapter.cs +++ b/src/Mono.Android/Android.Runtime/InputStreamAdapter.cs @@ -42,7 +42,7 @@ public override int Read (byte[] bytes, int offset, int length) } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (Stream value) + public static IntPtr ToLocalJniHandle (Stream? value) { if (value == null) return IntPtr.Zero; diff --git a/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs b/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs index 34358afd0da..abe6f0dbf8f 100644 --- a/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs +++ b/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; namespace Android.Runtime @@ -7,7 +7,7 @@ public class InputStreamInvoker : Stream { public Java.IO.InputStream BaseInputStream {get; private set;} - protected Java.Nio.Channels.FileChannel BaseFileChannel {get; private set;} + protected Java.Nio.Channels.FileChannel? BaseFileChannel {get; private set;} public InputStreamInvoker (Java.IO.InputStream stream) { @@ -16,7 +16,7 @@ public InputStreamInvoker (Java.IO.InputStream stream) BaseInputStream = stream; - Java.IO.FileInputStream fileStream = stream as Java.IO.FileInputStream; + Java.IO.FileInputStream? fileStream = stream as Java.IO.FileInputStream; if (fileStream != null) BaseFileChannel = fileStream.Channel; } @@ -39,7 +39,6 @@ protected override void Dispose (bool disposing) BaseFileChannel = null; BaseInputStream.Close (); BaseInputStream.Dispose (); - BaseInputStream = null; } catch (Java.IO.IOException ex) when (JNIEnv.ShouldWrapJavaException (ex)) { throw new IOException (ex.Message, ex); } @@ -155,12 +154,12 @@ public override long Position { } [Preserve (Conditional=true)] - public static Stream FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static Stream? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = (IJavaObject) Java.Interop.TypeManager.CreateInstance (handle, transfer); diff --git a/src/Mono.Android/Android.Runtime/IntDefAttribute.cs b/src/Mono.Android/Android.Runtime/IntDefAttribute.cs index 2df2290c942..7aef39aee12 100644 --- a/src/Mono.Android/Android.Runtime/IntDefAttribute.cs +++ b/src/Mono.Android/Android.Runtime/IntDefAttribute.cs @@ -7,8 +7,8 @@ namespace Android.Runtime public class IntDefAttribute : Attribute { public bool Flag { get; set; } - public string Type { get; set; } - public string [] Fields { get; set; } + public string? Type { get; set; } + public string []? Fields { get; set; } } } diff --git a/src/Mono.Android/Android.Runtime/IntDefinitionAttribute.cs b/src/Mono.Android/Android.Runtime/IntDefinitionAttribute.cs index 8249751a3f3..4a3be97c7a4 100644 --- a/src/Mono.Android/Android.Runtime/IntDefinitionAttribute.cs +++ b/src/Mono.Android/Android.Runtime/IntDefinitionAttribute.cs @@ -5,13 +5,13 @@ namespace Android.Runtime [AttributeUsage (AttributeTargets.Field)] public class IntDefinitionAttribute : Attribute { - public IntDefinitionAttribute (string constantMember) + public IntDefinitionAttribute (string? constantMember) { ConstantMember = constantMember; } - public string ConstantMember { get; set; } - public string JniField { get; set; } + public string? ConstantMember { get; set; } + public string? JniField { get; set; } } } diff --git a/src/Mono.Android/Android.Runtime/JNIEnv.cs b/src/Mono.Android/Android.Runtime/JNIEnv.cs index 9d424517717..0e08f2b9324 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnv.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnv.cs @@ -13,6 +13,7 @@ using Java.Interop; using Java.Interop.Tools.TypeNameMappings; +using System.Diagnostics.CodeAnalysis; namespace Android.Runtime { #pragma warning disable 0649 @@ -57,22 +58,22 @@ public static partial class JNIEnv { internal static bool IsRunningOnDesktop; internal static bool LogTypemapMissStackTrace; - static AndroidRuntime androidRuntime; + static AndroidRuntime? androidRuntime; static BoundExceptionType BoundExceptionType; [ThreadStatic] - static byte[] mvid_bytes; + static byte[]? mvid_bytes; - internal static AndroidValueManager AndroidValueManager; + internal static AndroidValueManager? AndroidValueManager; [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] extern static void monodroid_log (LogLevel level, LogCategories category, string message); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] - internal extern static IntPtr monodroid_timing_start (string message); + internal extern static IntPtr monodroid_timing_start (string? message); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] - internal extern static void monodroid_timing_stop (IntPtr sequence, string message); + internal extern static void monodroid_timing_stop (IntPtr sequence, string? message); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] internal extern static void monodroid_free (IntPtr ptr); @@ -96,7 +97,7 @@ internal static bool IsGCUserPeer (IntPtr value) return IsInstanceOf (value, grefIGCUserPeer_class); } - internal static bool ShouldWrapJavaException (Java.Lang.Throwable t, [CallerMemberName] string caller = null) + internal static bool ShouldWrapJavaException (Java.Lang.Throwable? t, [CallerMemberName] string? caller = null) { if (t == null) { monodroid_log (LogLevel.Warn, @@ -121,7 +122,7 @@ internal static bool ShouldWrapJavaException (Java.Lang.Throwable t, [CallerMemb static unsafe void RegisterJniNatives (IntPtr typeName_ptr, int typeName_len, IntPtr jniClass, IntPtr methods_ptr, int methods_len) { string typeName = new string ((char*) typeName_ptr, 0, typeName_len); - Type type = Type.GetType (typeName); + var type = Type.GetType (typeName); if (type == null) { monodroid_log (LogLevel.Error, LogCategories.Default, @@ -132,10 +133,10 @@ static unsafe void RegisterJniNatives (IntPtr typeName_ptr, int typeName_len, In var className = Java.Interop.TypeManager.GetClassName (jniClass); Java.Interop.TypeManager.RegisterType (className, type); - JniType jniType = null; + JniType? jniType = null; JniType.GetCachedJniType (ref jniType, className); - androidRuntime.TypeManager.RegisterNativeMembers (jniType, type, methods_ptr == IntPtr.Zero ? null : new string ((char*) methods_ptr, 0, methods_len)); + androidRuntime!.TypeManager.RegisterNativeMembers (jniType, type, methods_ptr == IntPtr.Zero ? null : new string ((char*) methods_ptr, 0, methods_len)); } internal static unsafe void Initialize (JnienvInitializeArgs* args) @@ -185,7 +186,7 @@ internal static unsafe void Initialize (JnienvInitializeArgs* args) JavaNativeTypeManager.PackageNamingPolicy = (PackageNamingPolicy)args->packageNamingPolicy; if (IsRunningOnDesktop) { - string packageNamingPolicy = Environment.GetEnvironmentVariable ("__XA_PACKAGE_NAMING_POLICY__"); + var packageNamingPolicy = Environment.GetEnvironmentVariable ("__XA_PACKAGE_NAMING_POLICY__"); if (Enum.TryParse (packageNamingPolicy, out PackageNamingPolicy pnp)) { JavaNativeTypeManager.PackageNamingPolicy = pnp; } @@ -236,14 +237,14 @@ static void ManualJavaObjectDispose (Java.Lang.Object obj) GC.SuppressFinalize (obj); } - static Action mono_unhandled_exception; - static Action AppDomain_DoUnhandledException; + static Action mono_unhandled_exception = null!; + static Action AppDomain_DoUnhandledException = null!; static void Initialize () { if (mono_unhandled_exception == null) { var mono_UnhandledException = typeof (System.Diagnostics.Debugger) - .GetMethod ("Mono_UnhandledException", BindingFlags.NonPublic | BindingFlags.Static); + .GetMethod ("Mono_UnhandledException", BindingFlags.NonPublic | BindingFlags.Static)!; mono_unhandled_exception = (Action) Delegate.CreateDelegate (typeof(Action), mono_UnhandledException); } @@ -272,7 +273,7 @@ internal static void PropagateUncaughtException (IntPtr env, IntPtr javaThreadPt Android.Runtime.AndroidEnvironment.FailFast ($"Unable to initialize UncaughtExceptionHandler. Nested exception caught: {e}"); } - var javaException = JavaObject.GetObject (env, javaExceptionPtr, JniHandleOwnership.DoNotTransfer); + var javaException = JavaObject.GetObject (env, javaExceptionPtr, JniHandleOwnership.DoNotTransfer)!; // Disabled until Linker error surfaced in https://github.com/xamarin/xamarin-android/pull/4302#issuecomment-596400025 is resolved //System.Diagnostics.Debugger.Mono_UnhandledException (javaException); @@ -280,7 +281,7 @@ internal static void PropagateUncaughtException (IntPtr env, IntPtr javaThreadPt try { var jltp = javaException as JavaProxyThrowable; - Exception innerException = jltp?.InnerException; + Exception? innerException = jltp?.InnerException; var args = new UnhandledExceptionEventArgs (innerException ?? javaException, isTerminating: true); // Disabled until Linker error surfaced in https://github.com/xamarin/xamarin-android/pull/4302#issuecomment-596400025 is resolved @@ -308,7 +309,7 @@ public static void WaitForBridgeProcessing () [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] extern static IntPtr _monodroid_get_identity_hash_code (IntPtr env, IntPtr value); - internal static Func IdentityHash; + internal static Func? IdentityHash; public static IntPtr AllocObject (string jniClassName) { @@ -477,7 +478,7 @@ public static IntPtr FindClass (System.Type type) if (!((e is Java.Lang.NoClassDefFoundError) || (e is Java.Lang.ClassNotFoundException))) throw; monodroid_log (LogLevel.Warn, LogCategories.Default, $"JNIEnv.FindClass(Type) caught unexpected exception: {e}"); - string jni = Java.Interop.TypeManager.GetJniTypeName (type); + var jni = Java.Interop.TypeManager.GetJniTypeName (type); if (jni != null) { e.Dispose (); return FindClass (JavaNativeTypeManager.ToJniName (jni, rank)); @@ -497,7 +498,7 @@ public static IntPtr FindClass (System.Type type) } static readonly int nameBufferLength = 1024; - [ThreadStatic] static char[] nameBuffer; + [ThreadStatic] static char[]? nameBuffer; static unsafe IntPtr BinaryName (string classname) { @@ -596,22 +597,22 @@ internal static void DeleteRef (IntPtr handle, JniHandleOwnership transfer) internal static extern int _monodroid_gref_log (string message); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] - internal static extern int _monodroid_gref_log_new (IntPtr curHandle, byte curType, IntPtr newHandle, byte newType, string threadName, int threadId, [In] StringBuilder from, int from_writable); + internal static extern int _monodroid_gref_log_new (IntPtr curHandle, byte curType, IntPtr newHandle, byte newType, string? threadName, int threadId, [In] StringBuilder? from, int from_writable); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] - internal static extern void _monodroid_gref_log_delete (IntPtr handle, byte type, string threadName, int threadId, [In] StringBuilder from, int from_writable); + internal static extern void _monodroid_gref_log_delete (IntPtr handle, byte type, string? threadName, int threadId, [In] StringBuilder? from, int from_writable); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] - internal static extern void _monodroid_weak_gref_new (IntPtr curHandle, byte curType, IntPtr newHandle, byte newType, string threadName, int threadId, [In] StringBuilder from, int from_writable); + internal static extern void _monodroid_weak_gref_new (IntPtr curHandle, byte curType, IntPtr newHandle, byte newType, string? threadName, int threadId, [In] StringBuilder? from, int from_writable); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] - internal static extern void _monodroid_weak_gref_delete (IntPtr handle, byte type, string threadName, int threadId, [In] StringBuilder from, int from_writable); + internal static extern void _monodroid_weak_gref_delete (IntPtr handle, byte type, string? threadName, int threadId, [In] StringBuilder? from, int from_writable); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] - internal static extern int _monodroid_lref_log_new (int lrefc, IntPtr handle, byte type, string threadName, int threadId, [In] StringBuilder from, int from_writable); + internal static extern int _monodroid_lref_log_new (int lrefc, IntPtr handle, byte type, string? threadName, int threadId, [In] StringBuilder from, int from_writable); [DllImport ("__Internal", CallingConvention = CallingConvention.Cdecl)] - internal static extern void _monodroid_lref_log_delete (int lrefc, IntPtr handle, byte type, string threadName, int threadId, [In] StringBuilder from, int from_writable); + internal static extern void _monodroid_lref_log_delete (int lrefc, IntPtr handle, byte type, string? threadName, int threadId, [In] StringBuilder from, int from_writable); public static IntPtr NewGlobalRef (IntPtr jobject) { @@ -675,23 +676,23 @@ public static string GetClassNameFromInstance (IntPtr jobject) internal static void LogTypemapTrace (StackTrace st) { - string trace = st.ToString ()?.Trim (); + string? trace = st.ToString ()?.Trim (); if (String.IsNullOrEmpty (trace)) return; monodroid_log (LogLevel.Warn, LogCategories.Assembly, "typemap: called from"); - foreach (string line in trace.Split ('\n')) { + foreach (string line in trace!.Split ('\n')) { monodroid_log (LogLevel.Warn, LogCategories.Assembly, line); } } - internal static unsafe string TypemapManagedToJava (Type type) + internal static unsafe string? TypemapManagedToJava (Type type) { if (mvid_bytes == null) mvid_bytes = new byte[16]; var mvid = new Span(mvid_bytes); - byte[] mvid_data = null; + byte[]? mvid_data = null; if (!type.Module.ModuleVersionId.TryWriteBytes (mvid)) { monodroid_log (LogLevel.Warn, LogCategories.Default, $"Failed to obtain module MVID using the fast method, falling back to the slow one"); mvid_data = type.Module.ModuleVersionId.ToByteArray (); @@ -721,20 +722,20 @@ public static string GetJniName (Type type) if (type == null) throw new ArgumentNullException ("type"); - string java = TypemapManagedToJava (type); + string? java = TypemapManagedToJava (type); return java == null ? JavaNativeTypeManager.ToJniName (type) : java; } - public static IntPtr ToJniHandle (IJavaObject value) + public static IntPtr ToJniHandle (IJavaObject? value) { if (value == null) return IntPtr.Zero; return value.Handle; } - public static IntPtr ToLocalJniHandle (IJavaObject value) + public static IntPtr ToLocalJniHandle (IJavaObject? value) { if (value == null) return IntPtr.Zero; @@ -744,7 +745,7 @@ public static IntPtr ToLocalJniHandle (IJavaObject value) return NewLocalRef (value.Handle); } - public static string GetCharSequence (IntPtr jobject, JniHandleOwnership transfer) + public static string? GetCharSequence (IntPtr jobject, JniHandleOwnership transfer) { if (jobject == IntPtr.Zero) return null; @@ -753,7 +754,7 @@ public static string GetCharSequence (IntPtr jobject, JniHandleOwnership transfe return JniEnvironment.Strings.ToString (ref r, JniObjectReferenceOptions.CopyAndDispose); } - public static unsafe string GetString (IntPtr value, JniHandleOwnership transfer) + public static unsafe string? GetString (IntPtr value, JniHandleOwnership transfer) { if (value == IntPtr.Zero) return null; @@ -763,7 +764,7 @@ public static unsafe string GetString (IntPtr value, JniHandleOwnership transfer return s; } - public static unsafe IntPtr NewString (string text) + public static unsafe IntPtr NewString (string? text) { if (text == null) return IntPtr.Zero; @@ -771,7 +772,7 @@ public static unsafe IntPtr NewString (string text) return JniEnvironment.Strings.NewString (text).Handle; } - public static unsafe IntPtr NewString (char[] text, int length) + public static unsafe IntPtr NewString (char[]? text, int length) { if (text == null) return IntPtr.Zero; @@ -828,11 +829,11 @@ public static void CopyArray (IntPtr src, string[] dest) throw new ArgumentNullException ("dest"); for (int i = 0; i < dest.Length; i++) - dest [i] = GetString (GetObjectArrayElement (src, i), JniHandleOwnership.TransferLocalRef); + dest [i] = GetString (GetObjectArrayElement (src, i), JniHandleOwnership.TransferLocalRef)!; } - static Dictionary> nativeArrayElementToManaged; - static Dictionary> NativeArrayElementToManaged { + static Dictionary>? nativeArrayElementToManaged; + static Dictionary> NativeArrayElementToManaged { get { if (nativeArrayElementToManaged != null) return nativeArrayElementToManaged; @@ -843,9 +844,9 @@ static Dictionary> NativeArrayElementToMan } } - static Dictionary> CreateNativeArrayElementToManaged () + static Dictionary> CreateNativeArrayElementToManaged () { - return new Dictionary> () { + return new Dictionary> () { { typeof (bool), (type, source, index) => { var r = new bool [1]; _GetBooleanArrayRegion (source, index, 1, r); @@ -905,7 +906,7 @@ static Dictionary> CreateNativeArrayElemen }; } - static TValue GetConverter(Dictionary dict, Type elementType, IntPtr array) + static TValue GetConverter(Dictionary dict, Type? elementType, IntPtr array) { TValue converter; @@ -995,7 +996,7 @@ static unsafe void _GetDoubleArrayRegion (IntPtr array, int start, int length, d JniEnvironment.Arrays.GetDoubleArrayRegion (new JniObjectReference (array), start, length, p); } - public static void CopyArray (IntPtr src, Array dest, Type elementType = null) + public static void CopyArray (IntPtr src, Array dest, Type? elementType = null) { if (dest == null) throw new ArgumentNullException ("dest"); @@ -1007,7 +1008,7 @@ public static void CopyArray (IntPtr src, Array dest, Type elementType = null) for (int i = 0; i < dest.Length; ++i) { IntPtr a = GetObjectArrayElement (src, i); try { - Array d = (Array) dest.GetValue (i); + var d = (Array?) dest.GetValue (i); if (d == null) dest.SetValue (GetArray (a, JniHandleOwnership.DoNotTransfer, elementType.GetElementType ()), i); else @@ -1019,13 +1020,13 @@ public static void CopyArray (IntPtr src, Array dest, Type elementType = null) return; } - Func converter = GetConverter (NativeArrayElementToManaged, elementType, src); + var converter = GetConverter (NativeArrayElementToManaged, elementType, src); for (int i = 0; i < dest.Length; i++) dest.SetValue (converter (elementType, src, i), i); } - static void AssertIsJavaObject (Type targetType) + static void AssertIsJavaObject (Type? targetType) { if (targetType != null && !typeof (IJavaObject).IsAssignableFrom (targetType)) throw new NotSupportedException ("Don't know how to convert type '" + targetType.FullName + "' to an Android.Runtime.IJavaObject."); @@ -1044,10 +1045,10 @@ public static void CopyArray (IntPtr src, T[] dest) return; } - Func converter = GetConverter (NativeArrayElementToManaged, typeof (T), src); + var converter = GetConverter (NativeArrayElementToManaged, typeof (T), src); for (int i = 0; i < dest.Length; i++) - dest [i] = (T) converter (typeof (T), src, i); + dest [i] = (T) converter (typeof (T), src, i)!; } public static unsafe void CopyArray (bool[] src, IntPtr dest) @@ -1084,7 +1085,7 @@ public static void CopyArray (IJavaObject[] src, IntPtr dest) } } - static Dictionary> copyManagedToNativeArray; + static Dictionary>? copyManagedToNativeArray; static Dictionary> CopyManagedToNativeArray { get { if (copyManagedToNativeArray != null) @@ -1128,8 +1129,8 @@ static Dictionary> CreateCopyManagedToNativeArray () int len = source.GetLength (0); for (int i = 0; i < len; ++i) { IntPtr _dest = GetObjectArrayElement (dest, i); - Array _source = (Array) source.GetValue (i); - CopyArray (_source, _source.GetType ().GetElementType (), _dest); + Array _source = (Array) source.GetValue (i)!; + CopyArray (_source, _source.GetType ().GetElementType ()!, _dest); JNIEnv.DeleteLocalRef (_dest); } } }, @@ -1159,7 +1160,7 @@ public static void CopyArray (T[] src, IntPtr dest) CopyArray (src, typeof (T), dest); } - public static Array GetArray (IntPtr array_ptr, JniHandleOwnership transfer, Type element_type = null) + public static Array? GetArray (IntPtr array_ptr, JniHandleOwnership transfer, Type? element_type = null) { try { return _GetArray (array_ptr, element_type); @@ -1169,8 +1170,8 @@ public static Array GetArray (IntPtr array_ptr, JniHandleOwnership transfer, Typ } } - static Dictionary> nativeArrayToManaged; - static Dictionary> NativeArrayToManaged { + static Dictionary>? nativeArrayToManaged; + static Dictionary> NativeArrayToManaged { get { if (nativeArrayToManaged != null) return nativeArrayToManaged; @@ -1181,9 +1182,9 @@ static Dictionary> NativeArrayToManaged { } } - static Dictionary> CreateNativeArrayToManaged () + static Dictionary> CreateNativeArrayToManaged () { - return new Dictionary> () { + return new Dictionary> () { { typeof (bool), (type, source, len) => { var r = new bool [len]; CopyArray (source, r); @@ -1251,19 +1252,19 @@ static Dictionary> CreateNativeArrayToManag } } }, { typeof (IJavaObject), (type, source, len) => { - var r = Array.CreateInstance (type, len); + var r = Array.CreateInstance (type!, len); CopyArray (source, r, type); return r; } }, { typeof (Array), (type, source, len) => { - var r = Array.CreateInstance (type, len); + var r = Array.CreateInstance (type!, len); CopyArray (source, r, type); return r; } }, }; } - static Array _GetArray (IntPtr array_ptr, Type element_type) + static Array? _GetArray (IntPtr array_ptr, Type? element_type) { if (array_ptr == IntPtr.Zero) return null; @@ -1273,7 +1274,7 @@ static Array _GetArray (IntPtr array_ptr, Type element_type) int cnt = _GetArrayLength (array_ptr); - Func converter = GetConverter (NativeArrayToManaged, element_type, array_ptr); + var converter = GetConverter (NativeArrayToManaged, element_type, array_ptr); return converter (element_type, array_ptr, cnt); } @@ -1283,20 +1284,20 @@ static int _GetArrayLength (IntPtr array_ptr) return JniEnvironment.Arrays.GetArrayLength (new JniObjectReference (array_ptr)); } - public static object[] GetObjectArray (IntPtr array_ptr, Type[] element_types) + public static object?[]? GetObjectArray (IntPtr array_ptr, Type[] element_types) { if (array_ptr == IntPtr.Zero) return null; int cnt = _GetArrayLength (array_ptr); - Func converter = GetConverter (NativeArrayElementToManaged, null, array_ptr); + var converter = GetConverter (NativeArrayElementToManaged, null, array_ptr); - object[] ret = new object [cnt]; + object?[] ret = new object [cnt]; for (int i = 0; i < cnt; i++) { - Type targetType = (element_types != null && i < element_types.Length) ? element_types [i] : null; - object value = converter ((targetType == null || targetType.IsValueType) ? null : targetType, + Type? targetType = (element_types != null && i < element_types.Length) ? element_types [i] : null; + object? value = converter ((targetType == null || targetType.IsValueType) ? null : targetType, array_ptr, i); ret [i] = value; @@ -1308,7 +1309,7 @@ public static object[] GetObjectArray (IntPtr array_ptr, Type[] element_types) return ret; } - public static T[] GetArray (IntPtr array_ptr) + public static T[]? GetArray (IntPtr array_ptr) { if (array_ptr == IntPtr.Zero) return null; @@ -1322,13 +1323,13 @@ public static T[] GetArray (IntPtr array_ptr) return ret; } - public static T[] GetArray (Java.Lang.Object[] array) + public static T[]? GetArray (Java.Lang.Object[] array) { if (array == null) return null; T[] ret = new T [array.Length]; for (int i = 0; i < array.Length; i++) - ret [i] = JavaConvert.FromJavaObject (array [i]); + ret [i] = JavaConvert.FromJavaObject (array [i])!; return ret; } @@ -1339,9 +1340,9 @@ public static T GetArrayItem (IntPtr array_ptr, int index) if (index < 0 || index >= GetArrayLength (array_ptr)) throw new ArgumentOutOfRangeException ("index"); - Func converter = GetConverter (NativeArrayElementToManaged, typeof (T), array_ptr); + var converter = GetConverter (NativeArrayElementToManaged, typeof (T), array_ptr); - return (T) converter (typeof (T), array_ptr, index); + return (T) converter (typeof (T), array_ptr, index)!; } public static int GetArrayLength (IntPtr array_ptr) @@ -1351,7 +1352,7 @@ public static int GetArrayLength (IntPtr array_ptr) return _GetArrayLength (array_ptr); } - public static unsafe IntPtr NewArray (bool[] array) + public static unsafe IntPtr NewArray (bool[]? array) { if (array == null) return IntPtr.Zero; @@ -1365,7 +1366,7 @@ public static unsafe IntPtr NewArray (bool[] array) return result; } - public static IntPtr NewArray (string[] array) + public static IntPtr NewArray (string[]? array) { if (array == null) return IntPtr.Zero; @@ -1394,7 +1395,7 @@ public static IntPtr NewObjectArray (int length, IntPtr elementClass, IntPtr ini return JniEnvironment.Arrays.NewObjectArray (length, new JniObjectReference (elementClass), new JniObjectReference (initialElement)).Handle; } - public static IntPtr NewObjectArray(params T[] values) + public static IntPtr NewObjectArray(params T[]? values) { if (values == null) return IntPtr.Zero; @@ -1425,7 +1426,7 @@ public static IntPtr NewObjectArray(params T[] values) static IntPtr GetArrayElementClass(T[] values) { Type elementType = typeof (T); - string jniClass = JavaConvert.GetJniClassForType (elementType); + var jniClass = JavaConvert.GetJniClassForType (elementType); if (jniClass != null) { return FindClass (jniClass); } @@ -1446,11 +1447,11 @@ public static void CopyObjectArray(IntPtr source, T[] destination) int len = Math.Min (GetArrayLength (source), destination.Length); for (int i = 0; i < len; ++i) { IntPtr value = GetObjectArrayElement (source, i); - destination [i] = JavaConvert.FromJniHandle(value, JniHandleOwnership.TransferLocalRef); + destination [i] = JavaConvert.FromJniHandle(value, JniHandleOwnership.TransferLocalRef)!; } } - public static void CopyObjectArray(T[] source, IntPtr destination) + public static void CopyObjectArray(T[]? source, IntPtr destination) { if (source == null) return; @@ -1466,13 +1467,13 @@ public static void CopyObjectArray(T[] source, IntPtr destination) } } - public static IntPtr NewArray (IJavaObject[] array) + public static IntPtr NewArray (IJavaObject[]? array) { if (array == null) return IntPtr.Zero; IntPtr result; - IntPtr grefClass = FindClass (array.GetType ().GetElementType ()); + IntPtr grefClass = FindClass (array.GetType ().GetElementType ()!); try { result = NewObjectArray (array.Length, grefClass, IntPtr.Zero); } finally { @@ -1484,7 +1485,7 @@ public static IntPtr NewArray (IJavaObject[] array) return result; } - static Dictionary> createManagedToNativeArray; + static Dictionary>? createManagedToNativeArray; static Dictionary> CreateManagedToNativeArray { get { if (createManagedToNativeArray != null) @@ -1513,12 +1514,12 @@ static Dictionary> CreateCreateManagedToNativeArray () }; } - public static IntPtr NewArray (Array value, Type elementType = null) + public static IntPtr NewArray (Array value, Type? elementType = null) { if (value == null) throw new ArgumentNullException ("value"); - elementType = elementType ?? value.GetType ().GetElementType (); + elementType = elementType ?? value.GetType ().GetElementType ()!; if (elementType.IsArray) { IntPtr array = IntPtr.Zero; @@ -1527,7 +1528,7 @@ public static IntPtr NewArray (Array value, Type elementType = null) array = NewObjectArray (value.Length, grefArrayClass, IntPtr.Zero); for (int i = 0; i < value.Length; ++i) { - IntPtr subarray = NewArray ((Array) value.GetValue (i), elementType.GetElementType ()); + IntPtr subarray = NewArray ((Array) value.GetValue (i)!, elementType.GetElementType ()); SetObjectArrayElement (array, i, subarray); DeleteLocalRef (subarray); } @@ -1546,7 +1547,7 @@ public static IntPtr NewArray (Array value, Type elementType = null) return creator (value); } - public static IntPtr NewArray (T[] array) + public static IntPtr NewArray (T[]? array) { if (array == null) return IntPtr.Zero; @@ -1560,8 +1561,8 @@ public static IntPtr NewArray (T[] array) return creator (array); } - static Dictionary> setNativeArrayElement; - static Dictionary> SetNativeArrayElement { + static Dictionary>? setNativeArrayElement; + static Dictionary> SetNativeArrayElement { get { if (setNativeArrayElement != null) return setNativeArrayElement; @@ -1572,43 +1573,43 @@ static Dictionary> SetNativeArrayElement { } } - static Dictionary> CreateSetNativeArrayElement () + static Dictionary> CreateSetNativeArrayElement () { - return new Dictionary> () { + return new Dictionary> () { { typeof (bool), (dest, index, value) => { - var _value = new[]{(bool) value}; + var _value = new[]{(bool) value!}; _SetBooleanArrayRegion (dest, index, _value.Length, _value); } }, { typeof (byte), (dest, index, value) => { - var _value = new[]{(byte) value}; + var _value = new[]{(byte) value!}; _SetByteArrayRegion (dest, index, _value.Length, _value); } }, { typeof (char), (dest, index, value) => { - var _value = new[]{(char) value}; + var _value = new[]{(char) value!}; _SetCharArrayRegion (dest, index, _value.Length, _value); } }, { typeof (short), (dest, index, value) => { - var _value = new[]{(short) value}; + var _value = new[]{(short) value!}; _SetShortArrayRegion (dest, index, _value.Length, _value); } }, { typeof (int), (dest, index, value) => { - var _value = new[]{(int) value}; + var _value = new[]{(int) value!}; _SetIntArrayRegion (dest, index, _value.Length, _value); } }, { typeof (long), (dest, index, value) => { - var _value = new[]{(long) value}; + var _value = new[]{(long) value!}; _SetLongArrayRegion (dest, index, _value.Length, _value); } }, { typeof (float), (dest, index, value) => { - var _value = new[]{(float) value}; + var _value = new[]{(float) value!}; _SetFloatArrayRegion (dest, index, _value.Length, _value); } }, { typeof (double), (dest, index, value) => { - var _value = new[]{(double) value}; + var _value = new[]{(double) value!}; _SetDoubleArrayRegion (dest, index, _value.Length, _value); } }, { typeof (string), (dest, index, value) => { - IntPtr s = NewString (value.ToString ()); + IntPtr s = NewString (value!.ToString ()); try { SetObjectArrayElement (dest, index, s); } finally { @@ -1619,7 +1620,7 @@ static Dictionary> CreateSetNativeArrayElement SetObjectArrayElement (dest, index, value == null ? IntPtr.Zero : ((IJavaObject) value).Handle); } }, { typeof (Array), (dest, index, value) => { - IntPtr _v = NewArray ((Array) value); + IntPtr _v = NewArray ((Array) value!); SetObjectArrayElement (dest, index, _v); JNIEnv.DeleteLocalRef (_v); } }, @@ -1681,18 +1682,19 @@ public static void SetArrayItem (IntPtr array_ptr, int index, T value) if (index < 0 || index >= GetArrayLength (array_ptr)) throw new ArgumentOutOfRangeException ("index"); - Action setter = GetConverter (SetNativeArrayElement, typeof (T), array_ptr); + var setter = GetConverter (SetNativeArrayElement, typeof (T), array_ptr); setter (array_ptr, index, value); } - public static Java.Lang.Object[] ToObjectArray (T[] array) + [return: NotNullIfNotNull (parameterName: "array")] + public static Java.Lang.Object[]? ToObjectArray (T[]? array) { if (array == null) return null; Java.Lang.Object[] ret = new Java.Lang.Object [array.Length]; for (int i = 0; i < array.Length; i++) - ret [i] = JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (array [i])); + ret [i] = JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (array [i]))!; return ret; } diff --git a/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs b/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs index 49f76e4556a..b366cd8a408 100644 --- a/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs +++ b/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs @@ -7,9 +7,9 @@ namespace Android.Runtime { public static class JNINativeWrapper { - static MethodInfo mono_unhandled_exception_method; - static MethodInfo exception_handler_method; - static MethodInfo wait_for_bridge_processing_method; + static MethodInfo? mono_unhandled_exception_method; + static MethodInfo? exception_handler_method; + static MethodInfo? wait_for_bridge_processing_method; static void get_runtime_types () { @@ -52,11 +52,11 @@ public static Delegate CreateDelegate (Delegate dlg) var dynamic = new DynamicMethod (DynamicMethodNameCounter.GetUniqueName (), ret_type, param_types, typeof (DynamicMethodNameCounter), true); var ig = dynamic.GetILGenerator (); - LocalBuilder retval = null; + LocalBuilder? retval = null; if (ret_type != typeof (void)) retval = ig.DeclareLocal (ret_type); - ig.Emit (OpCodes.Call, wait_for_bridge_processing_method); + ig.Emit (OpCodes.Call, wait_for_bridge_processing_method!); var label = ig.BeginExceptionBlock (); @@ -73,15 +73,15 @@ public static Delegate CreateDelegate (Delegate dlg) if (filter) { ig.BeginExceptFilterBlock (); - ig.Emit (OpCodes.Call, mono_unhandled_exception_method); + ig.Emit (OpCodes.Call, mono_unhandled_exception_method!); ig.Emit (OpCodes.Ldc_I4_1); - ig.BeginCatchBlock (null); + ig.BeginCatchBlock (null!); } else { ig.BeginCatchBlock (typeof (Exception)); } ig.Emit (OpCodes.Dup); - ig.Emit (OpCodes.Call, exception_handler_method); + ig.Emit (OpCodes.Call, exception_handler_method!); if (filter) ig.Emit (OpCodes.Throw); diff --git a/src/Mono.Android/Android.Runtime/JavaArray.cs b/src/Mono.Android/Android.Runtime/JavaArray.cs index 52c5824709a..be953936c3b 100644 --- a/src/Mono.Android/Android.Runtime/JavaArray.cs +++ b/src/Mono.Android/Android.Runtime/JavaArray.cs @@ -48,7 +48,7 @@ public bool Contains (T item) public void CopyTo (T[] array, int array_index) { - T[] items = JNIEnv.GetArray (Handle); + var items = JNIEnv.GetArray (Handle)!; for (int i = 0; i < Count; i++) array [array_index + i] = items [i]; } @@ -60,14 +60,14 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () public IEnumerator GetEnumerator () { - T[] items = JNIEnv.GetArray (Handle); - for (int i = 0; i < items.Length; i++) + var items = JNIEnv.GetArray (Handle); + for (int i = 0; i < items!.Length; i++) yield return items [i]; } public int IndexOf (T item) { - T[] items = JNIEnv.GetArray (Handle); + var items = JNIEnv.GetArray (Handle)!; return Array.IndexOf (items, item); } @@ -87,7 +87,7 @@ public void RemoveAt (int index) } [Preserve (Conditional=true)] - public static JavaArray FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static JavaArray? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; @@ -101,7 +101,7 @@ public static JavaArray FromJniHandle (IntPtr handle, JniHandleOwnership tran } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (IList value) + public static IntPtr ToLocalJniHandle (IList? value) { if (value == null) return IntPtr.Zero; diff --git a/src/Mono.Android/Android.Runtime/JavaCollection.cs b/src/Mono.Android/Android.Runtime/JavaCollection.cs index 7eedb3f4ae5..b3f63ee03ad 100644 --- a/src/Mono.Android/Android.Runtime/JavaCollection.cs +++ b/src/Mono.Android/Android.Runtime/JavaCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Android.Runtime; @@ -10,6 +11,7 @@ namespace Android.Runtime { [Register ("java/util/Collection", DoNotGenerateAcw=true)] + // java.util.Collection allows null values public class JavaCollection : Java.Lang.Object, System.Collections.ICollection { internal static IntPtr collection_class = JNIEnv.FindClass ("java/util/Collection"); @@ -36,8 +38,8 @@ internal JavaCollection (IEnumerable items) throw new ArgumentNullException ("items"); } - foreach (object item in items) - Add (item); + foreach (var item in items) + Add (item!); } // @@ -89,7 +91,7 @@ internal Java.Util.IIterator Iterator () id_iterator = JNIEnv.GetMethodID (collection_class, "iterator", "()Ljava/util/Iterator;"); return Java.Lang.Object.GetObject ( JNIEnv.CallObjectMethod (Handle, id_iterator), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } // @@ -113,7 +115,7 @@ public bool IsSynchronized { get {return false;} } - public object SyncRoot { + public object? SyncRoot { get {return null;} } @@ -132,7 +134,7 @@ internal Java.Lang.Object[] ToArray () id_toArray = JNIEnv.GetMethodID (collection_class, "toArray", "()[Ljava/lang/Object;"); using (var o = new Java.Lang.Object (JNIEnv.CallObjectMethod (Handle, id_toArray), JniHandleOwnership.TransferLocalRef | JniHandleOwnership.DoNotRegister)) - return (Java.Lang.Object[]) o; + return ((Java.Lang.Object[]) o)!; } // @@ -173,12 +175,12 @@ public IEnumerator GetEnumerator () } [Preserve (Conditional=true)] - public static ICollection FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static ICollection? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = new JavaCollection (handle, transfer); else @@ -188,7 +190,7 @@ public static ICollection FromJniHandle (IntPtr handle, JniHandleOwnership trans } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (ICollection items) + public static IntPtr ToLocalJniHandle (ICollection? items) { if (items == null) return IntPtr.Zero; @@ -349,7 +351,7 @@ public void CopyTo (T[] array, int array_index) for (int i = 0; i < Count; i++) array [array_index + i] = JavaConvert.FromJniHandle( JNIEnv.GetObjectArrayElement (lrefArray, i), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; JNIEnv.DeleteLocalRef (lrefArray); } @@ -383,21 +385,22 @@ public bool Remove (T item) System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { - return GetEnumerator (); + return GetEnumerator ()!; } + [return: MaybeNull] public IEnumerator GetEnumerator () { return System.Linq.Extensions.ToEnumerator_Dispose (Iterator()); } [Preserve (Conditional=true)] - public static ICollection FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static ICollection? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = new JavaCollection (handle, transfer); else @@ -407,7 +410,7 @@ public static ICollection FromJniHandle (IntPtr handle, JniHandleOwnership tr } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (ICollection items) + public static IntPtr ToLocalJniHandle (ICollection? items) { if (items == null) return IntPtr.Zero; diff --git a/src/Mono.Android/Android.Runtime/JavaDictionary.cs b/src/Mono.Android/Android.Runtime/JavaDictionary.cs index 4593d334779..b7d12a536b8 100644 --- a/src/Mono.Android/Android.Runtime/JavaDictionary.cs +++ b/src/Mono.Android/Android.Runtime/JavaDictionary.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; - +using System.Diagnostics.CodeAnalysis; using Android.Runtime; using Java.Interop; @@ -9,6 +9,7 @@ namespace Android.Runtime { [Register ("java/util/HashMap", DoNotGenerateAcw=true)] + // java.util.HashMap allows null keys and values public class JavaDictionary : Java.Lang.Object, System.Collections.IDictionary { class DictionaryEnumerator : IDictionaryEnumerator { @@ -20,19 +21,19 @@ public DictionaryEnumerator (JavaDictionary owner) simple_enumerator = (owner as IEnumerable).GetEnumerator (); } - public object Current { + public object? Current { get { return simple_enumerator.Current; } } public DictionaryEntry Entry { - get { return (DictionaryEntry) Current; } + get { return (DictionaryEntry) Current!; } } public object Key { get { return Entry.Key; } } - public object Value { + public object? Value { get { return Entry.Value; } } @@ -69,7 +70,7 @@ public void Reset () // // https://developer.android.com/reference/java/util/Map#get(java.lang.Object) // - internal object Get (object key) + internal object? Get (object key) { if (id_get == IntPtr.Zero) id_get = JNIEnv.GetMethodID (map_class, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); @@ -128,7 +129,7 @@ internal IntPtr GetValues () // // https://developer.android.com/reference/java/util/Map#put(K,%20V) // - internal void Put (object key, object value) + internal void Put (object key, object? value) { if (id_put == IntPtr.Zero) id_put = JNIEnv.GetMethodID (map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); @@ -195,7 +196,9 @@ public JavaDictionary (IDictionary items) : this () throw new ArgumentNullException ("items"); } +#pragma warning disable CS8605 // Unboxing a possibly null value. foreach (DictionaryEntry item in items) +#pragma warning restore CS8605 // Unboxing a possibly null value. Add (item.Key, item.Value); } @@ -232,7 +235,7 @@ public ICollection Keys { get { return new JavaSet (GetKeys (), JniHandleOwnership.TransferLocalRef); } } - public object SyncRoot { + public object? SyncRoot { get { return null; } } @@ -240,12 +243,12 @@ public ICollection Values { get { return new JavaCollection (GetValues (), JniHandleOwnership.TransferLocalRef); } } - public object this [object key] { + public object? this [object key] { get { return Get (key); } set { Put (key, value); } } - public void Add (object key, object value) + public void Add (object key, object? value) { if (Contains (key)) throw new ArgumentException ("The key '" + key + "' already exists.", "key"); @@ -309,14 +312,14 @@ public void CopyTo (Array array, int array_index) else if (array.Length < array_index + Count) throw new ArgumentException ("array"); int i = 0; - foreach (object o in this) + foreach (var o in this) array.SetValue (o, array_index + i++); } IEnumerator IEnumerable.GetEnumerator () { - foreach (object key in Keys) - yield return new DictionaryEntry (key, this [key]); + foreach (var key in Keys) + yield return new DictionaryEntry (key!, this [key!]); } public IDictionaryEnumerator GetEnumerator () @@ -354,12 +357,12 @@ public void Remove (object key) } [Preserve (Conditional=true)] - public static IDictionary FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static IDictionary? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = new JavaDictionary (handle, transfer); else @@ -369,7 +372,7 @@ public static IDictionary FromJniHandle (IntPtr handle, JniHandleOwnership trans } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (IDictionary dictionary) + public static IntPtr ToLocalJniHandle (IDictionary? dictionary) { if (dictionary == null) return IntPtr.Zero; @@ -443,6 +446,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) { if (id_get == IntPtr.Zero) @@ -495,9 +499,15 @@ internal void Put (K key, V value) JNIEnv.DeleteLocalRef (r); } + // C#'s IDictionary is documented as allowing implementations to determine if null is supported or not, + // but is not annotated as MaybeNull. Our implementation allows null. + [MaybeNull] public V this [K key] { + [return: MaybeNull] +#pragma warning disable CS8766 // Nullability of reference types in return type doesn't match implicitly implemented member because of nullability attributes. get { - if (!Contains (key)) +#pragma warning restore CS8766 // Nullability of reference types in return type doesn't match implicitly implemented member because of nullability attributes. + if (!Contains (key!)) throw new KeyNotFoundException (); return Get (key); } @@ -579,7 +589,9 @@ IEnumerator IEnumerable.GetEnumerator () public IEnumerator> GetEnumerator () { foreach (K key in Keys) +#pragma warning disable CS8604 // Possible null reference argument. yield return new KeyValuePair (key, this [key]); +#pragma warning restore CS8604 // Possible null reference argument. } public bool Remove (KeyValuePair pair) @@ -620,17 +632,19 @@ public bool Remove (K key) public bool TryGetValue (K key, out V value) { +#pragma warning disable CS8601 // Possible null reference assignment. value = Get (key); +#pragma warning restore CS8601 // Possible null reference assignment. return ContainsKey (key); } [Preserve (Conditional=true)] - public static IDictionary FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static IDictionary? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = new JavaDictionary (handle, transfer); else @@ -640,7 +654,7 @@ public static IDictionary FromJniHandle (IntPtr handle, JniHandleOwnership } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (IDictionary dictionary) + public static IntPtr ToLocalJniHandle (IDictionary? dictionary) { if (dictionary == null) return IntPtr.Zero; diff --git a/src/Mono.Android/Android.Runtime/JavaList.cs b/src/Mono.Android/Android.Runtime/JavaList.cs index f771ef8f6f0..3456d9e0a58 100644 --- a/src/Mono.Android/Android.Runtime/JavaList.cs +++ b/src/Mono.Android/Android.Runtime/JavaList.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; - +using System.Diagnostics.CodeAnalysis; using Android.Runtime; using Java.Interop; @@ -9,6 +9,7 @@ namespace Android.Runtime { [Register ("java/util/ArrayList", DoNotGenerateAcw=true)] + // java.util.ArrayList allows null values public partial class JavaList : Java.Lang.Object, System.Collections.IList { internal static IntPtr arraylist_class = JNIEnv.FindClass ("java/util/List"); @@ -36,7 +37,7 @@ public partial class JavaList : Java.Lang.Object, System.Collections.IList { // // https://developer.android.com/reference/java/util/List.html?hl=en#get(int) // - internal object InternalGet (int location, Type targetType = null) + internal object? InternalGet (int location, Type? targetType = null) { if (id_get == IntPtr.Zero) id_get = JNIEnv.GetMethodID (arraylist_class, "get", "(I)Ljava/lang/Object;"); @@ -69,7 +70,7 @@ public virtual Java.Util.IIterator Iterator () id_iterator = JNIEnv.GetMethodID (arraylist_class, "iterator", "()Ljava/util/Iterator;"); return Java.Lang.Object.GetObject ( JNIEnv.CallObjectMethod (Handle, id_iterator), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } // @@ -83,7 +84,7 @@ public virtual Java.Util.IIterator Iterator () // // https://developer.android.com/reference/java/util/List.html?hl=en#set(int,%20E) // - internal void InternalSet (int location, object value) + internal void InternalSet (int location, object? value) { if (id_set == IntPtr.Zero) id_set = JNIEnv.GetMethodID (arraylist_class, "set", "(ILjava/lang/Object;)Ljava/lang/Object;"); @@ -145,7 +146,7 @@ public JavaList (IEnumerable items) : this () throw new ArgumentNullException ("items"); } - foreach (object item in items) + foreach (var item in items) Add (item); } @@ -178,11 +179,11 @@ public bool IsSynchronized { get { return false; } } - public object SyncRoot { + public object? SyncRoot { get { return null; } } - public object this [int index] { + public object? this [int index] { get { if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException ("index"); @@ -202,7 +203,7 @@ public object this [int index] { // // https://developer.android.com/reference/java/util/List?hl=en#add(E) // - public int Add (object item) + public int Add (object? item) { if (id_add == IntPtr.Zero) id_add = JNIEnv.GetMethodID (arraylist_class, "add", "(Ljava/lang/Object;)Z"); @@ -255,7 +256,7 @@ public void Clear () // // https://developer.android.com/reference/java/util/List?hl=en#contains(java.lang.Object) // - public bool Contains (object item) + public bool Contains (object? item) { if (id_contains == IntPtr.Zero) id_contains = JNIEnv.GetMethodID (arraylist_class, "contains", "(Ljava/lang/Object;)Z"); @@ -301,7 +302,7 @@ public IEnumerator GetEnumerator () // // https://developer.android.com/reference/java/util/List?hl=en#indexOf(java.lang.Object) // - public virtual int IndexOf (object item) + public virtual int IndexOf (object? item) { if (id_indexOf == IntPtr.Zero) id_indexOf = JNIEnv.GetMethodID (arraylist_class, "indexOf", "(Ljava/lang/Object;)I"); @@ -353,7 +354,7 @@ public virtual int LastIndexOf (object item) // // https://developer.android.com/reference/java/util/List?hl=en#add(int,%20E) // - public void Insert (int index, object item) + public void Insert (int index, object? item) { if (id_insert == IntPtr.Zero) id_insert = JNIEnv.GetMethodID (arraylist_class, "add", "(ILjava/lang/Object;)V"); @@ -377,7 +378,7 @@ public void Insert (int index, object item) }); } - public void Remove (object item) + public void Remove (object? item) { int i = IndexOf (item); if (i < 0 && i >= Count) @@ -421,7 +422,7 @@ public void RemoveAt (int index) // // https://developer.android.com/reference/java/util/List?hl=en#set(int,%20E) // - public virtual Java.Lang.Object Set (int location, Java.Lang.Object item) + public virtual Java.Lang.Object? Set (int location, Java.Lang.Object item) { if (id_set == IntPtr.Zero) id_set = JNIEnv.GetMethodID (arraylist_class, "set", "(ILjava/lang/Object;)Ljava/lang/Object;"); @@ -475,12 +476,12 @@ public virtual JavaList SubList (int start, int end) } [Preserve (Conditional=true)] - public static IList FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static IList? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = new JavaList (handle, transfer); else @@ -490,7 +491,7 @@ public static IList FromJniHandle (IntPtr handle, JniHandleOwnership transfer) } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (IList items) + public static IntPtr ToLocalJniHandle (IList? items) { if (items == null) return IntPtr.Zero; @@ -527,16 +528,16 @@ public static IntPtr ToLocalJniHandle (IList items) // // Java.Util.IList does not exist, so we cannot implement explicitly. // - public virtual bool Add (Java.Lang.Object item) + public virtual bool Add (Java.Lang.Object? item) { return Add (0, item); } - public virtual bool Add (int index, Java.Lang.Object item) + public virtual bool Add (int index, Java.Lang.Object? item) { if (Contains (item)) return false; - Add ((object) item); + Add ((object?) item); return true; } @@ -549,21 +550,21 @@ public virtual bool AddAll (int location, JavaList collection) { int pos = location; bool ret = false; - foreach (Java.Lang.Object item in collection) + foreach (Java.Lang.Object? item in collection) ret |= Add (pos++, item); return ret; } // Clear() exists. - public virtual bool Contains (Java.Lang.Object item) + public virtual bool Contains (Java.Lang.Object? item) { - return Contains ((object) item); + return Contains ((object?) item); } public virtual bool ContainsAll (JavaList collection) { - foreach (Java.Lang.Object item in collection) + foreach (Java.Lang.Object? item in collection) if (!Contains (item)) return false; return true; @@ -576,19 +577,19 @@ public virtual bool Equals (Java.Lang.Object obj) return false; // I'm not sure if this should be valid (i.e. Count doesn't change), hopefully it can be premised... for (int i = 0; i < Count; i++) - if (!this [i].Equals (collection [i])) + if (!(this [i]?.Equals (collection [i]) == true)) return false; return true; } - public virtual Java.Lang.Object Get (int location) + public virtual Java.Lang.Object? Get (int location) { - return (Java.Lang.Object) InternalGet (location); + return (Java.Lang.Object?) InternalGet (location); } - public virtual int IndexOf (Java.Lang.Object item) + public virtual int IndexOf (Java.Lang.Object? item) { - return IndexOf ((object) item); + return IndexOf ((object?) item); } public virtual bool IsEmpty { @@ -601,14 +602,14 @@ public virtual bool IsEmpty { // ListIterator does not exist in MfA, so listIterator() methods cannot be implemented. - public virtual Java.Lang.Object Remove (int location) + public virtual Java.Lang.Object? Remove (int location) { var ret = Get (location); RemoveAt (location); return ret; } - public virtual bool Remove (Java.Lang.Object item) + public virtual bool Remove (Java.Lang.Object? item) { int i = IndexOf (item); if (i < 0 && i >= Count) @@ -620,7 +621,7 @@ public virtual bool Remove (Java.Lang.Object item) public virtual bool RemoveAll (JavaList collection) { bool ret = false; - foreach (Java.Lang.Object item in collection) + foreach (Java.Lang.Object? item in collection) ret |= Remove (item); return ret; } @@ -630,8 +631,8 @@ public virtual bool RetainAll (JavaList collection) bool ret = false; for (int i = 0; i < Count; i++) { var item = Get (i); - if (!collection.Contains (item)) { - Remove (item); + if (!collection.Contains (item!)) { + Remove (item!); ret = true; i--; } @@ -723,6 +724,7 @@ public JavaList (IEnumerable items) : this () // // https://developer.android.com/reference/java/util/List.html?hl=en#get(int) // + [return: MaybeNull] internal T InternalGet (int location) { if (id_get == IntPtr.Zero) @@ -773,8 +775,13 @@ internal void InternalSet (int location, T value) JNIEnv.DeleteLocalRef (r); } + // C#'s IList allows nulls but is not annotated as MaybeNull. + [MaybeNull] public T this [int index] { + [return: MaybeNull] +#pragma warning disable CS8766 // Nullability of reference types in return type doesn't match implicitly implemented member because of nullability attributes. get { +#pragma warning restore CS8766 // Nullability of reference types in return type doesn't match implicitly implemented member because of nullability attributes. if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException ("index"); return InternalGet (index); @@ -848,14 +855,17 @@ public void CopyTo (T[] array, int array_index) throw new ArgumentException ("array"); for (int i = 0; i < Count; i++) +#pragma warning disable CS8601 // Possible null reference assignment. array [array_index + i] = this [i]; +#pragma warning restore CS8601 // Possible null reference assignment. } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { - return GetEnumerator (); + return GetEnumerator ()!; } + [return: MaybeNull] public IEnumerator GetEnumerator () { return System.Linq.Extensions.ToEnumerator_Dispose (Iterator ()); @@ -931,12 +941,12 @@ public bool Remove (T item) } [Preserve (Conditional=true)] - public static IList FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static IList? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle, typeof (IList)); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle, typeof (IList)); if (inst == null) inst = new JavaList (handle, transfer); else @@ -946,7 +956,7 @@ public static IList FromJniHandle (IntPtr handle, JniHandleOwnership transfer } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (IList items) + public static IntPtr ToLocalJniHandle (IList? items) { if (items == null) return IntPtr.Zero; diff --git a/src/Mono.Android/Android.Runtime/JavaObject.cs b/src/Mono.Android/Android.Runtime/JavaObject.cs index 0c4bb35478e..f5645abee94 100644 --- a/src/Mono.Android/Android.Runtime/JavaObject.cs +++ b/src/Mono.Android/Android.Runtime/JavaObject.cs @@ -30,14 +30,14 @@ public static IntPtr GetHandle (object obj) else if (type == typeof (string)) return JNIEnv.NewString ((string)obj); else if (typeof (IJavaObject).IsAssignableFrom (type)) - return (obj as IJavaObject).Handle; + return ((IJavaObject)obj).Handle; else return new JavaObject (obj).Handle; } - public static object GetObject (IntPtr handle, JniHandleOwnership transfer) + public static object? GetObject (IntPtr handle, JniHandleOwnership transfer) { - Java.Lang.Object jlo = Java.Lang.Object.GetObject (handle, transfer) as Java.Lang.Object; + Java.Lang.Object? jlo = Java.Lang.Object.GetObject (handle, transfer) as Java.Lang.Object; if (jlo == null) return null; else if (jlo is Java.Lang.Boolean) @@ -92,16 +92,15 @@ public object Instance { protected override Java.Lang.Object Clone () { - if (inst is ICloneable) - return new JavaObject ((inst as ICloneable).Clone ()); + if (inst is ICloneable c) + return new JavaObject (c.Clone ()); else return new JavaObject (inst); } - public override bool Equals (Java.Lang.Object obj) + public override bool Equals (Java.Lang.Object? obj) { - if (obj is JavaObject) { - JavaObject jobj = obj as JavaObject; + if (obj is JavaObject jobj) { return jobj.inst == inst; } return false; @@ -112,7 +111,7 @@ public override int GetHashCode () return inst.GetHashCode (); } - public override string ToString () + public override string? ToString () { if (inst == null) return ""; diff --git a/src/Mono.Android/Android.Runtime/JavaProxyThrowable.cs b/src/Mono.Android/Android.Runtime/JavaProxyThrowable.cs index c28bc2858da..89f4d01844e 100644 --- a/src/Mono.Android/Android.Runtime/JavaProxyThrowable.cs +++ b/src/Mono.Android/Android.Runtime/JavaProxyThrowable.cs @@ -20,4 +20,4 @@ static string GetDetailMessage (Exception innerException) return innerException.ToString (); } } -} \ No newline at end of file +} diff --git a/src/Mono.Android/Android.Runtime/JavaSet.cs b/src/Mono.Android/Android.Runtime/JavaSet.cs index ccf9a03a985..184615bdbcc 100644 --- a/src/Mono.Android/Android.Runtime/JavaSet.cs +++ b/src/Mono.Android/Android.Runtime/JavaSet.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; - +using System.Diagnostics.CodeAnalysis; using Android.Runtime; using Java.Interop; @@ -9,6 +9,7 @@ namespace Android.Runtime { [Register ("java/util/HashSet", DoNotGenerateAcw=true)] + // java.util.HashSet allows null values public class JavaSet : Java.Lang.Object, ICollection { internal static IntPtr set_class = JNIEnv.FindClass ("java/util/Set"); @@ -24,7 +25,7 @@ internal Java.Util.IIterator Iterator () id_iterator = JNIEnv.GetMethodID (set_class, "iterator", "()Ljava/util/Iterator;"); return Java.Lang.Object.GetObject ( JNIEnv.CallObjectMethod (Handle, id_iterator), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } internal static IntPtr id_ctor; @@ -71,7 +72,7 @@ public JavaSet (IEnumerable items) : this () throw new ArgumentNullException ("items"); } - foreach (object item in items) + foreach (object? item in items) Add (item); } @@ -106,7 +107,7 @@ public bool IsSynchronized { get { return false; } } - public object SyncRoot { + public object? SyncRoot { get { return null; } } @@ -121,7 +122,7 @@ public object SyncRoot { // // https://developer.android.com/reference/java/util/Set?hl=en#add(E) // - public void Add (object item) + public void Add (object? item) { if (id_add == IntPtr.Zero) id_add = JNIEnv.GetMethodID (set_class, "add", "(Ljava/lang/Object;)Z"); @@ -175,7 +176,7 @@ public void Clear () // // https://developer.android.com/reference/java/util/Set?hl=en#contains(java.lang.Object) // - public bool Contains (object item) + public bool Contains (object? item) { if (id_contains == IntPtr.Zero) id_contains = JNIEnv.GetMethodID (set_class, "contains", "(Ljava/lang/Object;)Z"); @@ -200,7 +201,7 @@ public void CopyTo (Array array, int array_index) throw new ArgumentException ("array"); int i = 0; - foreach (object item in this) + foreach (object? item in this) array.SetValue (item, array_index + i++); } @@ -220,7 +221,7 @@ public IEnumerator GetEnumerator () // // https://developer.android.com/reference/java/util/Set?hl=en#remove(java.lang.Object) // - public void Remove (object item) + public void Remove (object? item) { if (id_remove == IntPtr.Zero) id_remove = JNIEnv.GetMethodID (set_class, "remove", "(Ljava/lang/Object;)Z"); @@ -238,12 +239,12 @@ public void Remove (object item) } [Preserve (Conditional=true)] - public static ICollection FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static ICollection? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = new JavaSet (handle, transfer); else @@ -253,7 +254,7 @@ public static ICollection FromJniHandle (IntPtr handle, JniHandleOwnership trans } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (ICollection items) + public static IntPtr ToLocalJniHandle (ICollection? items) { if (items == null) return IntPtr.Zero; @@ -268,6 +269,7 @@ public static IntPtr ToLocalJniHandle (ICollection items) } [Register ("java/util/HashSet", DoNotGenerateAcw=true)] + // java.util.HashSet allows null public class JavaSet : JavaSet, ICollection { // @@ -387,9 +389,10 @@ public void CopyTo (T[] array, int array_index) System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { - return GetEnumerator (); + return GetEnumerator ()!; } + [return: MaybeNull] public IEnumerator GetEnumerator () { return System.Linq.Extensions.ToEnumerator_Dispose (Iterator ()); @@ -424,12 +427,12 @@ public bool Remove (T item) } [Preserve (Conditional=true)] - public static ICollection FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static ICollection? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = new JavaSet (handle, transfer); else @@ -439,7 +442,7 @@ public static ICollection FromJniHandle (IntPtr handle, JniHandleOwnership tr } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (ICollection items) + public static IntPtr ToLocalJniHandle (ICollection? items) { if (items == null) return IntPtr.Zero; diff --git a/src/Mono.Android/Android.Runtime/Logger.cs b/src/Mono.Android/Android.Runtime/Logger.cs index e752f135241..fe3fb4c91dc 100644 --- a/src/Mono.Android/Android.Runtime/Logger.cs +++ b/src/Mono.Android/Android.Runtime/Logger.cs @@ -46,7 +46,7 @@ internal static bool LogNetlink { [DllImport ("liblog")] static extern void __android_log_print (LogLevel level, string appname, string format, string args, IntPtr zero); - public static void Log (LogLevel level, string appname, string log) { + public static void Log (LogLevel level, string appname, string? log) { foreach (var line in (log ?? "").Split (new[]{Environment.NewLine}, StringSplitOptions.None)) { if (!hasNoLibLog) { try { diff --git a/src/Mono.Android/Android.Runtime/NamespaceMappingAttribute.cs b/src/Mono.Android/Android.Runtime/NamespaceMappingAttribute.cs index d652e0d1ebf..e87281ed970 100644 --- a/src/Mono.Android/Android.Runtime/NamespaceMappingAttribute.cs +++ b/src/Mono.Android/Android.Runtime/NamespaceMappingAttribute.cs @@ -9,8 +9,8 @@ public NamespaceMappingAttribute () { } - public string Java { get; set; } - public string Managed { get; set; } + public string? Java { get; set; } + public string? Managed { get; set; } } } diff --git a/src/Mono.Android/Android.Runtime/OutputStreamAdapter.cs b/src/Mono.Android/Android.Runtime/OutputStreamAdapter.cs index 091b0068dce..3e9ac1ef0b2 100644 --- a/src/Mono.Android/Android.Runtime/OutputStreamAdapter.cs +++ b/src/Mono.Android/Android.Runtime/OutputStreamAdapter.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; namespace Android.Runtime @@ -31,7 +31,7 @@ public override void Flush () public override void Write (byte[] buffer) { - BaseStream.Write (buffer, 0, buffer.Length); + BaseStream.Write (buffer, 0, buffer?.Length ?? 0); } public override void Write (byte[] buffer, int offset, int length) @@ -45,7 +45,7 @@ public override void Write (int oneByte) } [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (Stream value) + public static IntPtr ToLocalJniHandle (Stream? value) { if (value == null) return IntPtr.Zero; diff --git a/src/Mono.Android/Android.Runtime/OutputStreamInvoker.cs b/src/Mono.Android/Android.Runtime/OutputStreamInvoker.cs index b192cf607fa..1e57d566697 100644 --- a/src/Mono.Android/Android.Runtime/OutputStreamInvoker.cs +++ b/src/Mono.Android/Android.Runtime/OutputStreamInvoker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; namespace Android.Runtime @@ -52,7 +52,6 @@ protected override void Dispose (bool disposing) try { BaseOutputStream.Close (); BaseOutputStream.Dispose (); - BaseOutputStream = null; } catch (Java.IO.IOException ex) when (JNIEnv.ShouldWrapJavaException (ex)) { throw new IOException (ex.Message, ex); } @@ -126,17 +125,17 @@ public override long Position { } [Preserve (Conditional=true)] - public static Stream FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static Stream? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { return FromNative (handle, transfer); } - internal static Stream FromNative (IntPtr handle, JniHandleOwnership transfer) + internal static Stream? FromNative (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = (IJavaObject) Java.Interop.TypeManager.CreateInstance (handle, transfer); diff --git a/src/Mono.Android/Android.Runtime/ResourceIdManager.cs b/src/Mono.Android/Android.Runtime/ResourceIdManager.cs index d7a3090a2c0..3c524bcab61 100644 --- a/src/Mono.Android/Android.Runtime/ResourceIdManager.cs +++ b/src/Mono.Android/Android.Runtime/ResourceIdManager.cs @@ -30,7 +30,7 @@ public static void UpdateIdValues () } } - static Type GetResourceTypeFromAssembly (Assembly assembly) + static Type? GetResourceTypeFromAssembly (Assembly assembly) { foreach (var customAttribute in assembly.GetCustomAttributes (typeof (ResourceDesignerAttribute), true)) { if (customAttribute is ResourceDesignerAttribute resourceDesignerAttribute && resourceDesignerAttribute.IsApplication) { diff --git a/src/Mono.Android/Android.Runtime/StringDefAttribute.cs b/src/Mono.Android/Android.Runtime/StringDefAttribute.cs index 2e023ecbfcd..6bed1b17e7b 100644 --- a/src/Mono.Android/Android.Runtime/StringDefAttribute.cs +++ b/src/Mono.Android/Android.Runtime/StringDefAttribute.cs @@ -6,8 +6,8 @@ namespace Android.Runtime [AttributeUsage (AttributeTargets.Parameter | AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property, AllowMultiple = true)] public class StringDefAttribute : Attribute { - public string Type { get; set; } - public string [] Fields { get; set; } + public string? Type { get; set; } + public string []? Fields { get; set; } } } diff --git a/src/Mono.Android/Android.Runtime/TimingLogger.cs b/src/Mono.Android/Android.Runtime/TimingLogger.cs index 9b198137f53..9bbbf538c0a 100644 --- a/src/Mono.Android/Android.Runtime/TimingLogger.cs +++ b/src/Mono.Android/Android.Runtime/TimingLogger.cs @@ -13,14 +13,14 @@ public class TimingLogger : IDisposable { bool disposed = false; IntPtr sequence; - string initStartMessage; + string? initStartMessage; /// /// Construct a TimeLogger instance and start measuring time immediately, if the parameter is left out or set to true. If the is not null then the message is logged at the start. /// - public TimingLogger (string startMessage = null, bool startImmediately = true) + public TimingLogger (string? startMessage = null, bool startImmediately = true) { if (startImmediately) Start (startMessage); @@ -40,7 +40,7 @@ public TimingLogger (string startMessage = null, bool startImmediately = true) /// passed a message to use when starting) it will be output to the log, otherwise the measurement /// start is silent. The method does anything only if no measurement is active. /// - public void Start (string startMessage = null) + public void Start (string? startMessage = null) { if (sequence != IntPtr.Zero) return; diff --git a/src/Mono.Android/Android.Runtime/TypeManager.cs b/src/Mono.Android/Android.Runtime/TypeManager.cs index d2f348599c8..7ea0c9afaf0 100644 --- a/src/Mono.Android/Android.Runtime/TypeManager.cs +++ b/src/Mono.Android/Android.Runtime/TypeManager.cs @@ -8,7 +8,7 @@ namespace Android.Runtime { [Obsolete ("Use Java.Interop.TypeManager")] public static partial class TypeManager { - public static string LookupTypeMapping (string[] mappings, string javaType) + public static string? LookupTypeMapping (string[] mappings, string javaType) { return Java.Interop.TypeManager.LookupTypeMapping (mappings, javaType); } diff --git a/src/Mono.Android/Android.Runtime/UncaughtExceptionHandler.cs b/src/Mono.Android/Android.Runtime/UncaughtExceptionHandler.cs new file mode 100644 index 00000000000..a2fbb29a64e --- /dev/null +++ b/src/Mono.Android/Android.Runtime/UncaughtExceptionHandler.cs @@ -0,0 +1,71 @@ +#nullable enable + +using System; +using System.Reflection; + +namespace Android.Runtime { + + sealed class UncaughtExceptionHandler : Java.Lang.Object, Java.Lang.Thread.IUncaughtExceptionHandler { + + Action? mono_unhandled_exception; + + Action? AppDomain_DoUnhandledException; + + Java.Lang.Thread.IUncaughtExceptionHandler defaultHandler; + + public UncaughtExceptionHandler (Java.Lang.Thread.IUncaughtExceptionHandler defaultHandler) + { + this.defaultHandler = defaultHandler; + } + + internal Java.Lang.Thread.IUncaughtExceptionHandler DefaultHandler { + get { return defaultHandler; } + } + + public void UncaughtException (Java.Lang.Thread thread, Java.Lang.Throwable ex) + { + try { + Initialize (); + } catch (Exception e) { + Android.Runtime.AndroidEnvironment.FailFast ($"Unable to initialize UncaughtExceptionHandler. Nested exception caught: {e}"); + } + + mono_unhandled_exception! (ex); + if (AppDomain_DoUnhandledException != null) { + try { + var jltp = ex as JavaProxyThrowable; + Exception? innerException = jltp?.InnerException; + var args = new UnhandledExceptionEventArgs (innerException ?? ex, isTerminating: true); + AppDomain_DoUnhandledException (AppDomain.CurrentDomain, args); + } + catch (Exception e) { + Logger.Log (LogLevel.Error, "monodroid", "Exception thrown while raising AppDomain.UnhandledException event: " + e.ToString ()); + } + } + if (defaultHandler != null) + defaultHandler.UncaughtException (thread, ex); + } + + void Initialize () + { + if (mono_unhandled_exception == null) { + var mono_UnhandledException = typeof (System.Diagnostics.Debugger) + .GetMethod ("Mono_UnhandledException", BindingFlags.NonPublic | BindingFlags.Static); + mono_unhandled_exception = (Action) Delegate.CreateDelegate (typeof(Action), mono_UnhandledException); + } + + if (AppDomain_DoUnhandledException == null) { + var ad_due = typeof (AppDomain) + .GetMethod ("DoUnhandledException", + bindingAttr: BindingFlags.NonPublic | BindingFlags.Instance, + binder: null, + types: new []{typeof (UnhandledExceptionEventArgs)}, + modifiers: null); + if (ad_due != null) { + AppDomain_DoUnhandledException = (Action) Delegate.CreateDelegate ( + typeof (Action), ad_due); + } + } + } + } +} diff --git a/src/Mono.Android/Android.Runtime/XAPeerMembers.cs b/src/Mono.Android/Android.Runtime/XAPeerMembers.cs index 23bc4ebce01..0c25a464472 100644 --- a/src/Mono.Android/Android.Runtime/XAPeerMembers.cs +++ b/src/Mono.Android/Android.Runtime/XAPeerMembers.cs @@ -19,7 +19,7 @@ public XAPeerMembers (string jniPeerTypeName, Type managedPeerType, bool isInter { } - protected override bool UsesVirtualDispatch (IJavaPeerable value, Type declaringType) + protected override bool UsesVirtualDispatch (IJavaPeerable value, Type? declaringType) { var peerType = GetThresholdType (value); if (peerType != null) { @@ -38,8 +38,7 @@ protected override JniPeerMembers GetPeerMembers (IJavaPeerable value) var jniClass = Java.Interop.TypeManager.GetClassName (GetThresholdClass (value)); lock (LegacyPeerMembers) { - JniPeerMembers members; - if (!LegacyPeerMembers.TryGetValue (jniClass, out members)) { + if (!LegacyPeerMembers.TryGetValue (jniClass, out var members)) { members = new XAPeerMembers (jniClass, peerType); LegacyPeerMembers.Add (jniClass, members); } @@ -47,7 +46,7 @@ protected override JniPeerMembers GetPeerMembers (IJavaPeerable value) } } - static Type GetThresholdType (IJavaPeerable value) + static Type? GetThresholdType (IJavaPeerable value) { var o = value as Java.Lang.Object; if (o != null) { diff --git a/src/Mono.Android/Android.Runtime/XmlPullParserReader.cs b/src/Mono.Android/Android.Runtime/XmlPullParserReader.cs index 32a5f525bad..72d18b90a08 100644 --- a/src/Mono.Android/Android.Runtime/XmlPullParserReader.cs +++ b/src/Mono.Android/Android.Runtime/XmlPullParserReader.cs @@ -26,21 +26,21 @@ public override void Close () } [Preserve (Conditional=true)] - public static XmlResourceParserReader FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static XmlResourceParserReader? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { return FromNative (handle, transfer); } - static XmlResourceParserReader FromNative (IntPtr handle, JniHandleOwnership transfer) + static XmlResourceParserReader? FromNative (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = (IJavaObject) Java.Interop.TypeManager.CreateInstance (handle, transfer); else JNIEnv.DeleteRef (handle, transfer); - return new XmlResourceParserReader (inst.JavaCast ()); + return new XmlResourceParserReader (inst.JavaCast ()!); } } @@ -130,7 +130,7 @@ public override bool EOF { get { return source.EventType == XmlPullParserNode.EndDocument; } } - public override string GetAttribute (int i) + public override string? GetAttribute (int i) { if (i < source.AttributeCount) return source.GetAttributeValue (i); @@ -140,12 +140,12 @@ public override string GetAttribute (int i) 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); } - public override string GetAttribute (string name) + public override string? GetAttribute (string name) { var qn = new QName (this, name); return GetAttribute (qn.LocalName, qn.Namespace); @@ -167,7 +167,7 @@ public override bool IsEmptyElement { get { return source.IsEmptyElementTag; } } - public override string LocalName { + public override string? LocalName { get { if (attr_pos < 0) return source.Name; @@ -247,7 +247,7 @@ public override bool MoveToNextAttribute () return true; } - public override string Name { + public override string? Name { get { return String.IsNullOrEmpty (Prefix) ? LocalName : Prefix + ':' + LocalName; } } @@ -255,7 +255,7 @@ public override XmlNameTable NameTable { get { return nsmgr.NameTable; } } - public override string NamespaceURI { + public override string? NamespaceURI { get { if (attr_pos < 0) return source.Namespace; @@ -336,7 +336,7 @@ public override bool Read () 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); + string? ns = source.GetAttributeNamespace (i); if (ns != String.Empty && nsmgr.LookupPrefix (ns) == null) nsmgr.AddNamespace ("p" + i, source.GetAttributeNamespace (i)); } @@ -371,7 +371,7 @@ public override void ResolveEntity () throw new NotSupportedException (); } - public override string Value { + public override string? Value { get { if (attr_pos < 0) return source.Text; @@ -383,21 +383,21 @@ public override string Value { } [Preserve (Conditional=true)] - public static XmlReader FromJniHandle (IntPtr handle, JniHandleOwnership transfer) + public static XmlReader? FromJniHandle (IntPtr handle, JniHandleOwnership transfer) { return FromNative (handle, transfer); } - static XmlReader FromNative (IntPtr handle, JniHandleOwnership transfer) + static XmlReader? FromNative (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return null; - IJavaObject inst = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var inst = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (inst == null) inst = (IJavaObject) Java.Interop.TypeManager.CreateInstance (handle, transfer); else JNIEnv.DeleteRef (handle, transfer); - return new XmlPullParserReader (inst.JavaCast ()); + return new XmlPullParserReader (inst.JavaCast ()!); } } } diff --git a/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs b/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs index b99c3542349..8d723c813cd 100644 --- a/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs +++ b/src/Mono.Android/Android.Runtime/XmlReaderPullParser.cs @@ -10,7 +10,7 @@ namespace Android.Runtime public class XmlReaderResourceParser : XmlReaderPullParser, IXmlResourceParser { [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (XmlReader value) + public static IntPtr ToLocalJniHandle (XmlReader? value) { if (value == null) return IntPtr.Zero; @@ -42,7 +42,7 @@ public bool GetAttributeBooleanValue (int index, bool defaultValue) return index < AttributeCount ? XmlConvert.ToBoolean (GetAttributeValue (index)) : defaultValue; } - public bool GetAttributeBooleanValue (string namespaceURI, string attribute, bool defaultValue) + public bool GetAttributeBooleanValue (string? namespaceURI, string? attribute, bool defaultValue) { var v = GetAttributeValue (namespaceURI, attribute); return v != null ? XmlConvert.ToBoolean (v) : defaultValue; @@ -53,7 +53,7 @@ public float GetAttributeFloatValue (int index, float defaultValue) return index < AttributeCount ? XmlConvert.ToSingle (GetAttributeValue (index)) : defaultValue; } - public float GetAttributeFloatValue (string namespaceURI, string attribute, float defaultValue) + public float GetAttributeFloatValue (string? namespaceURI, string? attribute, float defaultValue) { var v = GetAttributeValue (namespaceURI, attribute); return v != null ? XmlConvert.ToSingle (v) : defaultValue; @@ -64,18 +64,18 @@ public int GetAttributeIntValue (int index, int defaultValue) return index < AttributeCount ? XmlConvert.ToInt32 (GetAttributeValue (index)) : defaultValue; } - public int GetAttributeIntValue (string namespaceURI, string attribute, int defaultValue) + public int GetAttributeIntValue (string? namespaceURI, string? attribute, int defaultValue) { var v = GetAttributeValue (namespaceURI, attribute); return v != null ? XmlConvert.ToInt32 (v) : defaultValue; } - public int GetAttributeListValue (int index, string[] options, int defaultValue) + public int GetAttributeListValue (int index, string[]? options, int defaultValue) { throw new NotSupportedException (); } - public int GetAttributeListValue (string namespaceURI, string attribute, string[] options, int defaultValue) + public int GetAttributeListValue (string? namespaceURI, string? attribute, string[]? options, int defaultValue) { throw new NotSupportedException (); } @@ -90,7 +90,7 @@ public int GetAttributeResourceValue (int index, int defaultValue) throw new NotSupportedException (); } - public int GetAttributeResourceValue (string namespaceURI, string attribute, int defaultValue) + public int GetAttributeResourceValue (string? namespaceURI, string? attribute, int defaultValue) { throw new NotSupportedException (); } @@ -100,7 +100,7 @@ public int GetAttributeUnsignedIntValue (int index, int defaultValue) return index < AttributeCount ? (int) XmlConvert.ToUInt32 (GetAttributeValue (index)) : defaultValue; } - public int GetAttributeUnsignedIntValue (string namespaceURI, string attribute, int defaultValue) + public int GetAttributeUnsignedIntValue (string? namespaceURI, string? attribute, int defaultValue) { var v = GetAttributeValue (namespaceURI, attribute); return v != null ? (int) XmlConvert.ToUInt32 (v) : defaultValue; @@ -128,7 +128,7 @@ public int StyleAttribute { public class XmlReaderPullParser : Java.Lang.Object, IXmlPullParser { [Preserve (Conditional=true)] - public static IntPtr ToLocalJniHandle (XmlReader value) + public static IntPtr ToLocalJniHandle (XmlReader? value) { if (value == null) return IntPtr.Zero; @@ -148,7 +148,7 @@ public XmlReaderPullParser (XmlReader r) } #region IXmlPullParser implementation - public void DefineEntityReplacementText (string entityName, string replacementText) + public void DefineEntityReplacementText (string? entityName, string? replacementText) { throw new NotSupportedException (); } @@ -181,12 +181,12 @@ public string GetAttributeValue (int index) return r.GetAttribute (index); } - public string GetAttributeValue (string namespaceURI, string name) + public string GetAttributeValue (string? namespaceURI, string? name) { return r.GetAttribute (name, namespaceURI); } - public bool GetFeature (string name) + public bool GetFeature (string? name) { switch (name) { case XmlPullParser.FeatureProcessNamespaces: @@ -196,7 +196,7 @@ public bool GetFeature (string name) return false; } - public string GetNamespace (string prefix) + public string GetNamespace (string? prefix) { return r.LookupNamespace (prefix); } @@ -216,7 +216,7 @@ public string GetNamespaceUri (int pos) throw new NotSupportedException (); } - public Java.Lang.Object GetProperty (string name) + public Java.Lang.Object GetProperty (string? name) { throw new NotSupportedException (); } @@ -327,13 +327,13 @@ public XmlPullParserNode NextToken () return XmlPullParserNode.EndDocument; } - public void Require (Org.XmlPull.V1.XmlPullParserNode type, string namespaceURI, string name) + public void Require (Org.XmlPull.V1.XmlPullParserNode type, string? namespaceURI, string? name) { if (type != EventType || namespaceURI != this.Namespace || name != this.Name) throw new XmlPullParserException( "expected " + type + " " + PositionDescription); } - public void SetFeature (string name, bool state) + public void SetFeature (string? name, bool state) { switch (name) { case XmlPullParser.FeatureProcessNamespaces: @@ -345,21 +345,21 @@ public void SetFeature (string name, bool state) throw new NotSupportedException (); } - string input_encoding; + string? input_encoding; - public void SetInput (Stream inputStream, string inputEncoding) + public void SetInput (Stream? inputStream, string? inputEncoding) { - r = XmlReader.Create (new StreamReader (inputStream, Encoding.GetEncoding (inputEncoding))); + r = XmlReader.Create (new StreamReader (inputStream!, Encoding.GetEncoding (inputEncoding!))); r.Read (); input_encoding = inputEncoding; } - public void SetInput (Java.IO.Reader input) + public void SetInput (Java.IO.Reader? input) { throw new System.NotSupportedException (); } - public void SetProperty (string name, Java.Lang.Object value) + public void SetProperty (string? name, Java.Lang.Object? value) { throw new System.NotSupportedException (); } @@ -418,7 +418,7 @@ public Org.XmlPull.V1.XmlPullParserNode EventType { } } - public string InputEncoding { + public string? InputEncoding { get { return input_encoding; } } @@ -459,7 +459,7 @@ public string PositionDescription { get { r.MoveToElement (); var xi = r as IXmlLineInfo; - var loc = xi == null && xi.HasLineInfo () ? + var loc = xi == null || !xi.HasLineInfo () ? "(location N/A)" : String.Format ("({0}, {1})", xi.LineNumber, xi.LinePosition); return String.Format ("Node {0} at {1} {2}", r.NodeType, String.IsNullOrEmpty (r.BaseURI) ? null : r.BaseURI, loc); diff --git a/src/Mono.Android/Android.Telephony/PhoneNumberUtils.cs b/src/Mono.Android/Android.Telephony/PhoneNumberUtils.cs index e568b3148ee..9b371b2db85 100644 --- a/src/Mono.Android/Android.Telephony/PhoneNumberUtils.cs +++ b/src/Mono.Android/Android.Telephony/PhoneNumberUtils.cs @@ -2,9 +2,9 @@ namespace Android.Telephony { partial class PhoneNumberUtils { - public static string StringFromStringAndTOA (string s, int TOA) + public static string? StringFromStringAndTOA (string s, int TOA) { return StringFromStringAndTOA (s, (PhoneNumberToa) TOA); } } -} \ No newline at end of file +} diff --git a/src/Mono.Android/Android.Telephony/TelephonyManager.cs b/src/Mono.Android/Android.Telephony/TelephonyManager.cs index 69a6f401957..2ce43919088 100644 --- a/src/Mono.Android/Android.Telephony/TelephonyManager.cs +++ b/src/Mono.Android/Android.Telephony/TelephonyManager.cs @@ -6,9 +6,9 @@ namespace Android.Telephony { public partial class TelephonyManager { - public static TelephonyManager FromContext (Context context) + public static TelephonyManager? FromContext (Context context) { - return context.GetSystemService (Context.TelephonyService) as TelephonyManager; + return context.GetSystemService (Context.TelephonyService!) as TelephonyManager; } } } diff --git a/src/Mono.Android/Android.Text.Format/DateUtils.cs b/src/Mono.Android/Android.Text.Format/DateUtils.cs index d65b76d2152..109f22a39a0 100644 --- a/src/Mono.Android/Android.Text.Format/DateUtils.cs +++ b/src/Mono.Android/Android.Text.Format/DateUtils.cs @@ -6,13 +6,13 @@ namespace Android.Text.Format { partial class DateUtils { [Obsolete ("This method was improperly bound. Please use FormatSameDayTime(Int64, Int64, Int32, Int32).")] - public static string FormatSameDayTime (long then, long now, AbbreviationLength dateStyle, AbbreviationLength timeStyle) + public static string? FormatSameDayTime (long then, long now, AbbreviationLength dateStyle, AbbreviationLength timeStyle) { return FormatSameDayTime (then, now, (int) dateStyle, (int) timeStyle); } [Obsolete ("This method was improperly bound. Please use FormatSameDayTimeFormatted(Int64, Int64, Int32, Int32).")] - public static Java.Lang.ICharSequence FormatSameDayTimeFormatted (long then, long now, AbbreviationLength dateStyle, AbbreviationLength timeStyle) + public static Java.Lang.ICharSequence? FormatSameDayTimeFormatted (long then, long now, AbbreviationLength dateStyle, AbbreviationLength timeStyle) { return FormatSameDayTimeFormatted (then, now, (int) dateStyle, (int) timeStyle); } diff --git a/src/Mono.Android/Android.Text/ClipboardManager.cs b/src/Mono.Android/Android.Text/ClipboardManager.cs index d0c23b545bb..f05e527d163 100644 --- a/src/Mono.Android/Android.Text/ClipboardManager.cs +++ b/src/Mono.Android/Android.Text/ClipboardManager.cs @@ -6,9 +6,9 @@ namespace Android.Text { public partial class ClipboardManager { - public static ClipboardManager FromContext (Context context) + public static ClipboardManager? FromContext (Context context) { - return context.GetSystemService (Context.ClipboardService) as ClipboardManager; + return context.GetSystemService (Context.ClipboardService!) as ClipboardManager; } } } diff --git a/src/Mono.Android/Android.Text/ITextWatcher.cs b/src/Mono.Android/Android.Text/ITextWatcher.cs index 3063c76006d..557da83a118 100644 --- a/src/Mono.Android/Android.Text/ITextWatcher.cs +++ b/src/Mono.Android/Android.Text/ITextWatcher.cs @@ -6,20 +6,20 @@ namespace Android.Text { public class AfterTextChangedEventArgs : EventArgs { - public AfterTextChangedEventArgs (IEditable editable) + public AfterTextChangedEventArgs (IEditable? editable) { this.editable = editable; } - IEditable editable; - public IEditable Editable { + IEditable? editable; + public IEditable? Editable { get { return editable; } } } public class TextChangedEventArgs : EventArgs { - public TextChangedEventArgs (IEnumerable text, int start, int before, int after) + public TextChangedEventArgs (IEnumerable? text, int start, int before, int after) { this.text = text; this.start = start; @@ -27,8 +27,8 @@ public TextChangedEventArgs (IEnumerable text, int start, int before, int this.after = after; } - IEnumerable text; - public IEnumerable Text { + IEnumerable? text; + public IEnumerable? Text { get { return text; } } @@ -53,11 +53,11 @@ public int Start { internal sealed class TextWatcherImplementor : Java.Lang.Object, ITextWatcher { object inst; - public EventHandler AfterTextChanged; - public EventHandler BeforeTextChanged; - public EventHandler TextChanged; + public EventHandler? AfterTextChanged; + public EventHandler? BeforeTextChanged; + public EventHandler? TextChanged; - public TextWatcherImplementor (object inst, EventHandler changed_handler, EventHandler before_handler, EventHandler after_handler) + public TextWatcherImplementor (object inst, EventHandler? changed_handler, EventHandler? before_handler, EventHandler? after_handler) : base ( JNIEnv.StartCreateInstance ("mono/android/text/TextWatcherImplementor", "()V"), JniHandleOwnership.TransferLocalRef) @@ -70,21 +70,21 @@ public TextWatcherImplementor (object inst, EventHandler c TextChanged = changed_handler; } - void ITextWatcher.AfterTextChanged (Android.Text.IEditable s) + void ITextWatcher.AfterTextChanged (Android.Text.IEditable? s) { var h = AfterTextChanged; if (h != null) h (inst, new AfterTextChangedEventArgs (s)); } - void ITextWatcher.BeforeTextChanged (Java.Lang.ICharSequence s, int start, int before, int after) + void ITextWatcher.BeforeTextChanged (Java.Lang.ICharSequence? s, int start, int before, int after) { var h = BeforeTextChanged; if (h != null) h (inst, new TextChangedEventArgs (s, start, before, after)); } - void ITextWatcher.OnTextChanged (Java.Lang.ICharSequence s, int start, int before, int count) + void ITextWatcher.OnTextChanged (Java.Lang.ICharSequence? s, int start, int before, int count) { var h = TextChanged; if (h != null) diff --git a/src/Mono.Android/Android.Util/SparseArray.cs b/src/Mono.Android/Android.Util/SparseArray.cs index 40eda7c1b72..0fcd05f31f6 100644 --- a/src/Mono.Android/Android.Util/SparseArray.cs +++ b/src/Mono.Android/Android.Util/SparseArray.cs @@ -36,7 +36,7 @@ public virtual E Get (int key) { if (id_get_I == IntPtr.Zero) id_get_I = JNIEnv.GetMethodID (class_ref, "get", "(I)Ljava/lang/Object;"); - return JavaConvert.FromJniHandle(JNIEnv.CallNonvirtualObjectMethod (Handle, class_ref, id_get_I, new JValue (key)), JniHandleOwnership.TransferLocalRef); + return JavaConvert.FromJniHandle(JNIEnv.CallNonvirtualObjectMethod (Handle, class_ref, id_get_I, new JValue (key)), JniHandleOwnership.TransferLocalRef)!; } static IntPtr id_get_ILjava_lang_Object_; @@ -47,7 +47,7 @@ public virtual E Get (int key, E valueIfKeyNotFound) id_get_ILjava_lang_Object_ = JNIEnv.GetMethodID (class_ref, "get", "(ILjava/lang/Object;)Ljava/lang/Object;"); IntPtr value = JavaConvert.WithLocalJniHandle (valueIfKeyNotFound, lref => JNIEnv.CallNonvirtualObjectMethod (Handle, class_ref, id_get_ILjava_lang_Object_, new JValue (key), new JValue (lref))); - return JavaConvert.FromJniHandle (value, JniHandleOwnership.TransferLocalRef); + return JavaConvert.FromJniHandle (value, JniHandleOwnership.TransferLocalRef)!; } static IntPtr id_indexOfValue_Ljava_lang_Object_; @@ -92,7 +92,7 @@ public virtual E ValueAt (int index) id_valueAt_I = JNIEnv.GetMethodID (class_ref, "valueAt", "(I)Ljava/lang/Object;"); return JavaConvert.FromJniHandle ( JNIEnv.CallNonvirtualObjectMethod (Handle, class_ref, id_valueAt_I, new JValue (index)), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } } } diff --git a/src/Mono.Android/Android.Views.Accessibility/AccessibilityEvent.cs b/src/Mono.Android/Android.Views.Accessibility/AccessibilityEvent.cs index 747b04e9bf5..87d70239ba4 100644 --- a/src/Mono.Android/Android.Views.Accessibility/AccessibilityEvent.cs +++ b/src/Mono.Android/Android.Views.Accessibility/AccessibilityEvent.cs @@ -14,17 +14,17 @@ public GlobalAction Action { #endif // ANDROID_16 #if ANDROID_14 - public new string BeforeText { + public new string? BeforeText { get {return base.BeforeText;} set {base.BeforeText = value;} } - public new string ClassName { + public new string? ClassName { get {return base.ClassName;} set {base.ClassName = value;} } - public new string ContentDescription { + public new string? ContentDescription { get {return base.ContentDescription;} set {base.ContentDescription = value;} } diff --git a/src/Mono.Android/Android.Views.Accessibility/AccessibilityManager.cs b/src/Mono.Android/Android.Views.Accessibility/AccessibilityManager.cs index 3ebb4c16cb1..42318ff2e89 100644 --- a/src/Mono.Android/Android.Views.Accessibility/AccessibilityManager.cs +++ b/src/Mono.Android/Android.Views.Accessibility/AccessibilityManager.cs @@ -6,9 +6,9 @@ namespace Android.Views.Accessibility { public partial class AccessibilityManager { - public static AccessibilityManager FromContext (Context context) + public static AccessibilityManager? FromContext (Context context) { - return context.GetSystemService (Context.AccessibilityService) as AccessibilityManager; + return context.GetSystemService (Context.AccessibilityService!) as AccessibilityManager; } } } diff --git a/src/Mono.Android/Android.Views.InputMethods/InputMethodManager.cs b/src/Mono.Android/Android.Views.InputMethods/InputMethodManager.cs index 5cdcb292932..bd451b7f5d8 100644 --- a/src/Mono.Android/Android.Views.InputMethods/InputMethodManager.cs +++ b/src/Mono.Android/Android.Views.InputMethods/InputMethodManager.cs @@ -6,9 +6,9 @@ namespace Android.Views.InputMethods { public partial class InputMethodManager { - public static InputMethodManager FromContext (Context context) + public static InputMethodManager? FromContext (Context context) { - return context.GetSystemService (Context.InputMethodService) as InputMethodManager; + return (context.GetSystemService (Context.InputMethodService) as InputMethodManager); } } } diff --git a/src/Mono.Android/Android.Views/InputDevice.cs b/src/Mono.Android/Android.Views/InputDevice.cs index 4c39330e1f1..d5cd62a38f8 100644 --- a/src/Mono.Android/Android.Views/InputDevice.cs +++ b/src/Mono.Android/Android.Views/InputDevice.cs @@ -19,9 +19,9 @@ public enum Axis { partial class InputDevice { [Obsolete ("Please use GetMotionRange(Android.Views.Axis)")] - public Android.Views.InputDevice.MotionRange GetMotionRange (int rangeType) + public Android.Views.InputDevice.MotionRange? GetMotionRange (int rangeType) { return GetMotionRange ((Axis) rangeType); } } -} \ No newline at end of file +} diff --git a/src/Mono.Android/Android.Views/LayoutInflater.cs b/src/Mono.Android/Android.Views/LayoutInflater.cs index 550e0bf45cd..bbf39484f97 100644 --- a/src/Mono.Android/Android.Views/LayoutInflater.cs +++ b/src/Mono.Android/Android.Views/LayoutInflater.cs @@ -6,9 +6,9 @@ namespace Android.Views { public partial class LayoutInflater { - public static LayoutInflater FromContext (Context context) + public static LayoutInflater? FromContext (Context context) { - return context.GetSystemService (Context.LayoutInflaterService) as LayoutInflater; + return context.GetSystemService (Context.LayoutInflaterService!) as LayoutInflater; } } } diff --git a/src/Mono.Android/Android.Views/MotionEvent.cs b/src/Mono.Android/Android.Views/MotionEvent.cs index 2f7334c6db5..f5ee46ef460 100644 --- a/src/Mono.Android/Android.Views/MotionEvent.cs +++ b/src/Mono.Android/Android.Views/MotionEvent.cs @@ -3,27 +3,27 @@ namespace Android.Views { partial class MotionEvent { #if ANDROID_10 - public static MotionEvent Obtain (long downTime, long eventTime, int action, int pointers, int[] pointerIds, MotionEvent.PointerCoords[] pointerCoords, MetaKeyStates metaState, float xPrecision, float yPrecision, int deviceId, Edge edgeFlags, int source, int flags) + public static MotionEvent? Obtain (long downTime, long eventTime, int action, int pointers, int[] pointerIds, MotionEvent.PointerCoords[] pointerCoords, MetaKeyStates metaState, float xPrecision, float yPrecision, int deviceId, Edge edgeFlags, int source, int flags) { return Obtain (downTime, eventTime, (MotionEventActions) action, pointers, pointerIds, pointerCoords, metaState, xPrecision, yPrecision, deviceId, edgeFlags, (InputSourceType) source, (MotionEventFlags) flags); } #endif #if ANDROID_7 - public static MotionEvent Obtain (long downTime, long eventTime, int action, int pointers, float x, float y, float pressure, float size, MetaKeyStates metaState, float xPrecision, float yPrecision, int deviceId, Edge edgeFlags) + public static MotionEvent? Obtain (long downTime, long eventTime, int action, int pointers, float x, float y, float pressure, float size, MetaKeyStates metaState, float xPrecision, float yPrecision, int deviceId, Edge edgeFlags) { return Obtain (downTime, eventTime, (MotionEventActions) action, pointers, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags); } #endif // API 4 - public static MotionEvent Obtain (long downTime, long eventTime, int action, float x, float y, MetaKeyStates metaState) + public static MotionEvent? Obtain (long downTime, long eventTime, int action, float x, float y, MetaKeyStates metaState) { return Obtain (downTime, eventTime, (MotionEventActions) action, x, y, metaState); } // API 4 - public static MotionEvent Obtain (long downTime, long eventTime, int action, float x, float y, float pressure, float size, MetaKeyStates metaState, float xPrecision, float yPrecision, int deviceId, Edge edgeFlags) + public static MotionEvent? Obtain (long downTime, long eventTime, int action, float x, float y, float pressure, float size, MetaKeyStates metaState, float xPrecision, float yPrecision, int deviceId, Edge edgeFlags) { return Obtain (downTime, eventTime, (MotionEventActions) action, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags); } diff --git a/src/Mono.Android/Android.Views/View.cs b/src/Mono.Android/Android.Views/View.cs index 75263882056..9206be62b09 100644 --- a/src/Mono.Android/Android.Views/View.cs +++ b/src/Mono.Android/Android.Views/View.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using Android.AccessibilityServices; using Android.OS; using Android.Runtime; @@ -21,6 +22,7 @@ public bool PerformAccessibilityAction (GlobalAction action, Bundle arguments) } #endif + [return: MaybeNull] public T FindViewById (int id) where T : Android.Views.View { diff --git a/src/Mono.Android/Android.Views/Window.cs b/src/Mono.Android/Android.Views/Window.cs index 181894d1886..a28ea6c1a07 100644 --- a/src/Mono.Android/Android.Views/Window.cs +++ b/src/Mono.Android/Android.Views/Window.cs @@ -1,11 +1,12 @@ using System; - +using System.Diagnostics.CodeAnalysis; using Java.Interop; namespace Android.Views { partial class Window { + [return: MaybeNull] public T FindViewById (int id) where T : Android.Views.View { diff --git a/src/Mono.Android/Android.Widget/AbsListView.cs b/src/Mono.Android/Android.Widget/AbsListView.cs index d1933d57800..0a4656a51c4 100644 --- a/src/Mono.Android/Android.Widget/AbsListView.cs +++ b/src/Mono.Android/Android.Widget/AbsListView.cs @@ -9,7 +9,7 @@ namespace Android.Widget { partial class AbsListView { - static Delegate cb_getAdapter; + static Delegate? cb_getAdapter; #pragma warning disable 0169 static Delegate GetGetAdapterHandler () { @@ -21,11 +21,11 @@ static Delegate GetGetAdapterHandler () static IntPtr id_getAdapter; static IntPtr n_GetAdapter (IntPtr jnienv, IntPtr native__this) { - var __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.Adapter); } - static Delegate cb_setAdapter_Landroid_widget_Adapter_; + static Delegate? cb_setAdapter_Landroid_widget_Adapter_; #pragma warning disable 0169 static Delegate GetSetAdapter_Landroid_widget_ListAdapter_Handler () { @@ -36,12 +36,12 @@ static Delegate GetSetAdapter_Landroid_widget_ListAdapter_Handler () static void n_SetAdapter_Landroid_widget_ListAdapter_ (IntPtr jnienv, IntPtr native__this, IntPtr native_adapter) { - AbsListView __this = Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer); + var __this = Java.Lang.Object.GetObject (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!; __this.Adapter = Java.Interop.JavaConvert.FromJniHandle (native_adapter, JniHandleOwnership.DoNotTransfer); } #pragma warning restore 0169 - public abstract override IListAdapter Adapter { + public abstract override IListAdapter? Adapter { [Register ("getAdapter", "()Landroid/widget/ListAdapter;", "GetGetAdapterHandler")] get; [Register ("setAdapter", "(Landroid/widget/ListAdapter;)V", "GetSetAdapter_Landroid_widget_ListAdapter_Handler")] @@ -67,7 +67,7 @@ public virtual void SetAdapter (Android.Widget.IListAdapter adapter) internal partial class AbsListViewInvoker { - public unsafe override IListAdapter Adapter { + public unsafe override IListAdapter? Adapter { get { IntPtr value; #if JAVA_INTEROP diff --git a/src/Mono.Android/Android.Widget/AdapterView.cs b/src/Mono.Android/Android.Widget/AdapterView.cs index b64302316ec..5ad2293d8e3 100644 --- a/src/Mono.Android/Android.Widget/AdapterView.cs +++ b/src/Mono.Android/Android.Widget/AdapterView.cs @@ -24,12 +24,13 @@ public ItemEventArgs (Android.Widget.AdapterView parent, Android.Views.View view public abstract partial class AdapterView { - List selection_cleared; + List? selection_cleared; - void OnSelectionCleared (object o, Android.Widget.AdapterView.NothingSelectedEventArgs args) + void OnSelectionCleared (object? o, Android.Widget.AdapterView.NothingSelectedEventArgs args) { - foreach (var h in selection_cleared) - h (o, EventArgs.Empty); + if (selection_cleared != null) + foreach (var h in selection_cleared) + h (o, EventArgs.Empty); } [Obsolete ("Use NothingSelected event instead")] @@ -42,7 +43,7 @@ public event EventHandler ItemSelectionCleared { selection_cleared.Add (value); } remove { - selection_cleared.Remove (value); + selection_cleared?.Remove (value); } } } @@ -125,8 +126,8 @@ public AdapterView (Android.Content.Context context, Android.Util.IAttributeSet } protected override Java.Lang.Object RawAdapter { - get { return JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (Adapter)); } - set { Adapter = JavaConvert.FromJavaObject(value); } + get { return JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (Adapter))!; } + set { Adapter = JavaConvert.FromJavaObject(value)!; } } public abstract T Adapter { diff --git a/src/Mono.Android/Android.Widget/AdapterViewAnimator.cs b/src/Mono.Android/Android.Widget/AdapterViewAnimator.cs index 8a8d2d9e071..3bc26268995 100644 --- a/src/Mono.Android/Android.Widget/AdapterViewAnimator.cs +++ b/src/Mono.Android/Android.Widget/AdapterViewAnimator.cs @@ -74,14 +74,14 @@ public AdapterViewAnimator (Android.Content.Context context, Android.Util.IAttri } */ - protected override Java.Lang.Object RawAdapter { + protected override Java.Lang.Object? RawAdapter { get { return JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (Adapter)); } set { Adapter = JavaConvert.FromJavaObject(value); } } static IntPtr id_getAdapter; static IntPtr id_setAdapter_Landroid_widget_Adapter_; - public Android.Widget.IAdapter Adapter { + public Android.Widget.IAdapter? Adapter { [Register ("getAdapter", "()Landroid/widget/Adapter;", "GetGetAdapterHandler")] get { if (id_getAdapter == IntPtr.Zero) @@ -107,7 +107,7 @@ public Android.Widget.IAdapter Adapter { Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "setAdapter", "(Landroid/widget/Adapter;)V"), - new JValue (JNIEnv.ToJniHandle ((IJavaObject) value))); + new JValue (JNIEnv.ToJniHandle ((IJavaObject?) value))); } } diff --git a/src/Mono.Android/Android.Widget/ArrayAdapter.cs b/src/Mono.Android/Android.Widget/ArrayAdapter.cs index 7a89a5139b1..f27e9caf885 100644 --- a/src/Mono.Android/Android.Widget/ArrayAdapter.cs +++ b/src/Mono.Android/Android.Widget/ArrayAdapter.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; - +using System.Diagnostics.CodeAnalysis; using Android.Runtime; using Java.Interop; @@ -181,10 +181,11 @@ public void Add (T @object) id_createFromResource_Landroid_content_Context_II = JNIEnv.GetStaticMethodID (class_ref, "createFromResource", "(Landroid/content/Context;II)Landroid/widget/ArrayAdapter;"); return JavaConvert.FromJniHandle> ( JNIEnv.CallStaticObjectMethod (class_ref, id_createFromResource_Landroid_content_Context_II, new JValue (context), new JValue (textArrayResId), new JValue (textViewResId)), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } static IntPtr id_getItem_I; + [return: MaybeNull] [Register ("getItem", "(I)Ljava/lang/Object;", "GetGetItem_IHandler")] public T GetItem (int position) { diff --git a/src/Mono.Android/Android.Widget/AutoCompleteTextView.cs b/src/Mono.Android/Android.Widget/AutoCompleteTextView.cs index 34196485764..ef8c0c197e1 100644 --- a/src/Mono.Android/Android.Widget/AutoCompleteTextView.cs +++ b/src/Mono.Android/Android.Widget/AutoCompleteTextView.cs @@ -5,12 +5,13 @@ namespace Android.Widget { public partial class AutoCompleteTextView { - List selection_cleared; + List? selection_cleared; - void OnSelectionCleared (object o, Android.Widget.AdapterView.NothingSelectedEventArgs args) + void OnSelectionCleared (object? o, Android.Widget.AdapterView.NothingSelectedEventArgs args) { - foreach (var h in selection_cleared) - h (o, EventArgs.Empty); + if (selection_cleared != null) + foreach (var h in selection_cleared) + h (o, EventArgs.Empty); } [Obsolete ("Use NothingSelected event instead")] @@ -23,7 +24,7 @@ public event EventHandler ItemSelectionCleared { selection_cleared.Add (value); } remove { - selection_cleared.Remove (value); + selection_cleared?.Remove (value); } } } diff --git a/src/Mono.Android/Android.Widget/BaseAdapter.cs b/src/Mono.Android/Android.Widget/BaseAdapter.cs index 32cbff03ea5..2980233de5e 100644 --- a/src/Mono.Android/Android.Widget/BaseAdapter.cs +++ b/src/Mono.Android/Android.Widget/BaseAdapter.cs @@ -45,7 +45,7 @@ public BaseAdapter () JNIEnv.FinishCreateInstance (Handle, class_ref, id_ctor); } - public override Java.Lang.Object GetItem (int position) + public override Java.Lang.Object? GetItem (int position) { return JavaObjectExtensions.JavaCast(JavaConvert.ToJavaObject (this [position])); } diff --git a/src/Mono.Android/Android.Widget/MediaController.cs b/src/Mono.Android/Android.Widget/MediaController.cs index 5e4597a6334..52e2b0165aa 100644 --- a/src/Mono.Android/Android.Widget/MediaController.cs +++ b/src/Mono.Android/Android.Widget/MediaController.cs @@ -10,7 +10,7 @@ namespace Android.Widget { public partial class MediaController { - WeakReference weak_implementor_NextClick; + WeakReference? weak_implementor_NextClick; public event EventHandler NextClick { add { AndroidEventHelper.AddEventHandler( @@ -28,19 +28,19 @@ public event EventHandler NextClick { } } - void SetNextClickListener (View.IOnClickListener value) + void SetNextClickListener (View.IOnClickListener? value) { SetPrevNextListeners (next:value, prev:GetClickListener (weak_implementor_PrevClick)); } - static View.IOnClickListener GetClickListener (WeakReference value) + static View.IOnClickListener? GetClickListener (WeakReference? value) { return value != null - ? (View.IOnClickListener) value.Target + ? (View.IOnClickListener?) value.Target : null; } - WeakReference weak_implementor_PrevClick; + WeakReference? weak_implementor_PrevClick; public event EventHandler PreviousClick { add { AndroidEventHelper.AddEventHandler( @@ -58,7 +58,7 @@ public event EventHandler PreviousClick { } } - void SetPrevClickListener (View.IOnClickListener value) + void SetPrevClickListener (View.IOnClickListener? value) { SetPrevNextListeners (next:GetClickListener (weak_implementor_NextClick), prev:value); } diff --git a/src/Mono.Android/Android.Widget/TextView.cs b/src/Mono.Android/Android.Widget/TextView.cs index 278b47ed7cf..cef5e050088 100644 --- a/src/Mono.Android/Android.Widget/TextView.cs +++ b/src/Mono.Android/Android.Widget/TextView.cs @@ -15,22 +15,22 @@ void AddTextChangedListener (TextWatcherImplementor watcher) JNIEnv.CallVoidMethod (Handle, id_addTextChangedListener, new JValue (watcher)); } - WeakReference implementor_TextWatcher; + WeakReference? implementor_TextWatcher; public event EventHandler AfterTextChanged { add { if (implementor_TextWatcher == null || !implementor_TextWatcher.IsAlive) { implementor_TextWatcher = new WeakReference (new TextWatcherImplementor (this, null, null, value)); - AddTextChangedListener ((TextWatcherImplementor) implementor_TextWatcher.Target); + AddTextChangedListener ((TextWatcherImplementor) implementor_TextWatcher.Target!); } else { - var impl = (TextWatcherImplementor) implementor_TextWatcher.Target; + var impl = (TextWatcherImplementor) implementor_TextWatcher.Target!; impl.AfterTextChanged = (EventHandler) Delegate.Combine (impl.AfterTextChanged, value); } } remove { - var impl = implementor_TextWatcher != null ? (TextWatcherImplementor) implementor_TextWatcher.Target : null; + var impl = implementor_TextWatcher != null ? (TextWatcherImplementor?) implementor_TextWatcher.Target : null; if (impl != null) - impl.AfterTextChanged = (EventHandler) Delegate.Remove (impl.AfterTextChanged, value); + impl.AfterTextChanged = (EventHandler?) Delegate.Remove (impl.AfterTextChanged, value); } } @@ -38,16 +38,16 @@ public event EventHandler BeforeTextChanged { add { if (implementor_TextWatcher == null || !implementor_TextWatcher.IsAlive) { implementor_TextWatcher = new WeakReference (new TextWatcherImplementor (this, null, value, null)); - AddTextChangedListener ((TextWatcherImplementor) implementor_TextWatcher.Target); + AddTextChangedListener ((TextWatcherImplementor) implementor_TextWatcher.Target!); } else { - var impl = (TextWatcherImplementor) implementor_TextWatcher.Target; + var impl = (TextWatcherImplementor) implementor_TextWatcher.Target!; impl.BeforeTextChanged = (EventHandler) Delegate.Combine (impl.BeforeTextChanged, value); } } remove { - var impl = implementor_TextWatcher != null ? (TextWatcherImplementor) implementor_TextWatcher.Target : null; + var impl = implementor_TextWatcher != null ? (TextWatcherImplementor?) implementor_TextWatcher.Target : null; if (impl != null) - impl.BeforeTextChanged = (EventHandler) Delegate.Remove (impl.BeforeTextChanged, value); + impl.BeforeTextChanged = (EventHandler?) Delegate.Remove (impl.BeforeTextChanged, value); } } @@ -55,16 +55,16 @@ public event EventHandler TextChanged { add { if (implementor_TextWatcher == null || !implementor_TextWatcher.IsAlive) { implementor_TextWatcher = new WeakReference (new TextWatcherImplementor (this, value, null, null)); - AddTextChangedListener ((TextWatcherImplementor) implementor_TextWatcher.Target); + AddTextChangedListener ((TextWatcherImplementor) implementor_TextWatcher.Target!); } else { - var impl = (TextWatcherImplementor) implementor_TextWatcher.Target; + var impl = (TextWatcherImplementor) implementor_TextWatcher.Target!; impl.TextChanged = (EventHandler) Delegate.Combine (impl.TextChanged, value); } } remove { - var impl = implementor_TextWatcher != null ? (TextWatcherImplementor) implementor_TextWatcher.Target : null; + var impl = implementor_TextWatcher != null ? (TextWatcherImplementor?) implementor_TextWatcher.Target : null; if (impl != null) - impl.TextChanged = (EventHandler) Delegate.Remove (impl.TextChanged, value); + impl.TextChanged = (EventHandler?) Delegate.Remove (impl.TextChanged, value); } } } diff --git a/src/Mono.Android/Android/ReferenceFilesAttribute.cs b/src/Mono.Android/Android/ReferenceFilesAttribute.cs index 971375ffef7..3621e9eae5e 100644 --- a/src/Mono.Android/Android/ReferenceFilesAttribute.cs +++ b/src/Mono.Android/Android/ReferenceFilesAttribute.cs @@ -6,11 +6,11 @@ public abstract class ReferenceFilesAttribute : Attribute { internal ReferenceFilesAttribute () {} - public string EmbeddedArchive {get; set;} - public string PackageName {get; set;} - public string InstallInstructions {get; set;} - public string SourceUrl {get; set;} - public string Version {get; set;} - public string Sha1sum {get; set;} + public string? EmbeddedArchive {get; set;} + public string? PackageName {get; set;} + public string? InstallInstructions {get; set;} + public string? SourceUrl {get; set;} + public string? Version {get; set;} + public string? Sha1sum {get; set;} } } diff --git a/src/Mono.Android/Java.Interop/AndroidEventHelper.cs b/src/Mono.Android/Java.Interop/AndroidEventHelper.cs index d39f2f5c9fe..938dde40181 100644 --- a/src/Mono.Android/Java.Interop/AndroidEventHelper.cs +++ b/src/Mono.Android/Java.Interop/AndroidEventHelper.cs @@ -6,14 +6,14 @@ namespace Java.Interop { public static class AndroidEventHelper { public static void AddEventHandler ( - ref WeakReference implementor, + ref WeakReference? implementor, Func creator, Action setListener, Action add) - where TImplementor : Java.Lang.Object, TInterface + where TImplementor : Java.Lang.Object, TInterface where TInterface : class { - TImplementor impl = null; - if (implementor == null || (impl = (TImplementor) implementor.Target) == null) { + TImplementor? impl = null; + if (implementor == null || (impl = (TImplementor?) implementor.Target) == null) { impl = creator (); implementor = new WeakReference (impl, true); setListener (impl); @@ -22,14 +22,14 @@ public static void AddEventHandler ( } public static void RemoveEventHandler ( - ref WeakReference implementor, + ref WeakReference? implementor, Func empty, - Action setListener, + Action setListener, Action remove) - where TImplementor : Java.Lang.Object, TInterface + where TImplementor : Java.Lang.Object, TInterface where TInterface : class { - TImplementor impl = null; - if (implementor == null || (impl = (TImplementor) implementor.Target) == null) + TImplementor? impl = null; + if (implementor == null || (impl = (TImplementor?) implementor.Target) == null) return; remove (impl); if (empty (impl)) { diff --git a/src/Mono.Android/Java.Interop/EventHelper.cs b/src/Mono.Android/Java.Interop/EventHelper.cs index ba1752a3d16..fea862758f4 100644 --- a/src/Mono.Android/Java.Interop/EventHelper.cs +++ b/src/Mono.Android/Java.Interop/EventHelper.cs @@ -5,14 +5,14 @@ namespace Java.Interop { public static class EventHelper { public static void AddEventHandler ( - ref WeakReference implementor, + ref WeakReference? implementor, Func creator, Action setListener, Action add) where TImplementor : Java.Lang.Object, TInterface { - TImplementor impl = null; - if (implementor == null || (impl = (TImplementor) implementor.Target) == null) { + TImplementor? impl = null; + if (implementor == null || (impl = (TImplementor?) implementor.Target) == null) { impl = creator (); implementor = new WeakReference (impl, true); setListener (impl); @@ -21,14 +21,14 @@ public static void AddEventHandler ( } public static void RemoveEventHandler ( - ref WeakReference implementor, + ref WeakReference? implementor, Func empty, Action unsetListener, Action remove) where TImplementor : Java.Lang.Object, TInterface { - TImplementor impl = null; - if (implementor == null || (impl = (TImplementor) implementor.Target) == null) + TImplementor? impl = null; + if (implementor == null || (impl = (TImplementor?) implementor.Target) == null) return; remove (impl); if (empty (impl)) { diff --git a/src/Mono.Android/Java.Interop/JavaConvert.cs b/src/Mono.Android/Java.Interop/JavaConvert.cs index 399a59a18ec..910839f5b3e 100644 --- a/src/Mono.Android/Java.Interop/JavaConvert.cs +++ b/src/Mono.Android/Java.Interop/JavaConvert.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using Android.Runtime; @@ -52,13 +53,12 @@ static class JavaConvert { } }, }; - static Func GetJniHandleConverter (Type target) + static Func? GetJniHandleConverter (Type? target) { if (target == null) return null; - Func converter; - if (JniHandleConverters.TryGetValue (target, out converter)) + if (JniHandleConverters.TryGetValue (target, out var converter)) return converter; if (target.IsArray) return (h, t) => JNIEnv.GetArray (h, t, target.GetElementType ()); @@ -86,17 +86,19 @@ static Func GetJniHandleConverter (Type targ static Func GetJniHandleConverterForType (Type t) { - MethodInfo m = t.GetMethod ("FromJniHandle", BindingFlags.Static | BindingFlags.Public); + MethodInfo m = t.GetMethod ("FromJniHandle", BindingFlags.Static | BindingFlags.Public)!; return (Func) Delegate.CreateDelegate ( typeof (Func), m); } + [return: MaybeNull] 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) { if (handle == IntPtr.Zero) { @@ -104,7 +106,7 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out return default (T); } - IJavaObject interned = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var interned = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (interned != null) { T r = FromJavaObject(interned, out set); if (set) { @@ -118,7 +120,7 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out if (typeof (IJavaObject).IsAssignableFrom (typeof (T))) return (T) Java.Lang.Object._GetObject (handle, transfer); - Func converter = GetJniHandleConverter (typeof (T)) ?? + var converter = GetJniHandleConverter (typeof (T)) ?? GetJniHandleConverter (GetTypeMapping (handle)); if (converter != null) return (T) converter (handle, transfer); @@ -132,13 +134,13 @@ public static T FromJniHandle(IntPtr handle, JniHandleOwnership transfer, out return (T) Convert.ChangeType (v, typeof (T)); } - public static object FromJniHandle (IntPtr handle, JniHandleOwnership transfer, Type targetType = null) + public static object? FromJniHandle (IntPtr handle, JniHandleOwnership transfer, Type? targetType = null) { if (handle == IntPtr.Zero) { return null; } - IJavaObject interned = (IJavaObject) Java.Lang.Object.PeekObject (handle); + var interned = (IJavaObject?) Java.Lang.Object.PeekObject (handle); if (interned != null) { var unwrapped = FromJavaObject (interned, targetType); if (unwrapped != null) { @@ -150,7 +152,7 @@ public static object FromJniHandle (IntPtr handle, JniHandleOwnership transfer, if (targetType != null && typeof (IJavaObject).IsAssignableFrom (targetType)) return Java.Lang.Object.GetObject (handle, transfer, targetType); - Func converter = targetType != null + var converter = targetType != null ? (GetJniHandleConverter (targetType) ?? GetJniHandleConverter (GetTypeMapping (handle))) : GetJniHandleConverter (GetTypeMapping (handle)); if (converter != null) @@ -162,7 +164,7 @@ public static object FromJniHandle (IntPtr handle, JniHandleOwnership transfer, // hail mary pass; perhaps there's a MCW which participates in normal // .NET type conversion? - return Convert.ChangeType (v, targetType); + return Convert.ChangeType (v, targetType!); } static Dictionary TypeMappings = new Dictionary { @@ -177,11 +179,10 @@ public static object FromJniHandle (IntPtr handle, JniHandleOwnership transfer, { "java/lang/String", typeof (string) }, }; - static Type GetTypeMapping (IntPtr handle) + static Type? GetTypeMapping (IntPtr handle) { string className = JNIEnv.GetClassNameFromInstance (handle); - Type match; - if (TypeMappings.TryGetValue (className, out match)) + if (TypeMappings.TryGetValue (className, out var match)) return match; IntPtr lrefClass = JNIEnv.GetObjectClass (handle); try { @@ -197,7 +198,7 @@ static Type GetTypeMapping (IntPtr handle) } } - internal static string GetJniClassForType (Type type) + internal static string? GetJniClassForType (Type type) { foreach (var e in TypeMappings) { if (e.Value == type) @@ -206,13 +207,15 @@ internal static string GetJniClassForType (Type type) return null; } - public static T FromJavaObject(IJavaObject value) + [return: MaybeNull] + public static T FromJavaObject(IJavaObject? value) { bool set; return FromJavaObject(value, out set); } - public static T FromJavaObject(IJavaObject value, out bool set) + [return: MaybeNull] + public static T FromJavaObject(IJavaObject? value, out bool set) { if (value == null) { set = false; @@ -238,14 +241,14 @@ public static T FromJavaObject(IJavaObject value, out bool set) return default (T); } set = true; - Func converter = GetJniHandleConverter (typeof (T)); + var converter = GetJniHandleConverter (typeof (T)); if (converter != null) return (T) converter (lrefValue, JniHandleOwnership.TransferLocalRef); JNIEnv.DeleteLocalRef (lrefValue); return (T) Convert.ChangeType (value, typeof (T)); } - public static object FromJavaObject (IJavaObject value, Type targetType = null) + public static object? FromJavaObject (IJavaObject value, Type? targetType = null) { if (value == null) return null; @@ -267,7 +270,7 @@ public static object FromJavaObject (IJavaObject value, Type targetType = null) if (lrefValue == IntPtr.Zero) { return null; } - Func converter = GetJniHandleConverter (targetType); + var converter = GetJniHandleConverter (targetType); if (converter != null) return converter (lrefValue, JniHandleOwnership.TransferLocalRef); JNIEnv.DeleteLocalRef (lrefValue); @@ -284,24 +287,23 @@ public static object FromJavaObject (IJavaObject value, Type targetType = null) { typeof (long), value => new Java.Lang.Long ((long) value) }, { typeof (float), value => new Java.Lang.Float ((float) value) }, { typeof (double), value => new Java.Lang.Double ((double) value) }, - { typeof (string), value => new Java.Lang.String (value.ToString ()) }, + { typeof (string), value => new Java.Lang.String (value.ToString ()!) }, }; - static Func GetJavaObjectConverter (Type source) + static Func? GetJavaObjectConverter (Type source) { - Func converter; - if (JavaObjectConverters.TryGetValue (source, out converter)) + if (JavaObjectConverters.TryGetValue (source, out var converter)) return converter; return null; } - public static IJavaObject ToJavaObject(T value) + public static IJavaObject? ToJavaObject([AllowNull]T value) { if (value is IJavaObject) return (IJavaObject) value; if (value == null) return null; - Func converter = GetJavaObjectConverter (typeof (T)); + var converter = GetJavaObjectConverter (typeof (T)); if (converter != null) return converter (value); return new Android.Runtime.JavaObject (value); @@ -347,7 +349,7 @@ public static IJavaObject ToJavaObject(T value) { typeof (string), value => { if (value == null) return IntPtr.Zero; - using (var v = new Java.Lang.String (value.ToString ())) + using (var v = new Java.Lang.String (value.ToString ()!)) return JNIEnv.ToLocalJniHandle (v); } }, { typeof (Android.Runtime.JavaObject), value => { @@ -357,7 +359,7 @@ public static IJavaObject ToJavaObject(T value) static Func GetLocalJniHandleConverter (T value, Type sourceType) { - Func converter; + Func? converter; if (LocalJniHandleConverters.TryGetValue (sourceType, out converter)) return converter; if (value != null && LocalJniHandleConverters.TryGetValue (value.GetType (), out converter)) @@ -369,13 +371,13 @@ public static TReturn WithLocalJniHandle(TValue value, Func converter = GetLocalJniHandleConverter (value, typeof (TValue)); - lref = converter (value); + lref = converter (value!); return action (lref); } finally { @@ -383,14 +385,14 @@ public static TReturn WithLocalJniHandle(TValue value, Func(object value, Func action) + public static TReturn WithLocalJniHandle(object? value, Func action) { IntPtr lref = IntPtr.Zero; try { if (value == null) { return action (lref); } - IJavaObject v = value as IJavaObject; + var v = value as IJavaObject; if (v != null) { lref = JNIEnv.ToLocalJniHandle (v); return action (lref); diff --git a/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs b/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs index 90516e0ba0a..c97c9473586 100644 --- a/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs +++ b/src/Mono.Android/Java.Interop/JavaObjectExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using Android.Runtime; @@ -44,13 +45,15 @@ public static JavaDictionary ToInteroperableCollection (this IDictiona return instance is JavaDictionary ? (JavaDictionary) instance : new JavaDictionary (instance); } - public static TResult JavaCast (this IJavaObject instance) + [return: MaybeNull] + public static TResult JavaCast (this IJavaObject? instance) where TResult : class, IJavaObject { return _JavaCast (instance); } - internal static TResult _JavaCast (this IJavaObject instance) + [return: MaybeNull] + internal static TResult _JavaCast (this IJavaObject? instance) { if (instance == null) return default (TResult); @@ -86,7 +89,7 @@ static IJavaObject CastClass (IJavaObject instance, Type resultType) if (resultType.IsAbstract) { // TODO: keep in sync with TypeManager.CreateInstance() algorithm - Type invokerType = GetHelperType (resultType, "Invoker"); + var invokerType = GetHelperType (resultType, "Invoker"); if (invokerType == null) throw new ArgumentException ("Unable to get Invoker for abstract type '" + resultType.FullName + "'.", "TResult"); resultType = invokerType; @@ -94,7 +97,7 @@ static IJavaObject CastClass (IJavaObject instance, Type resultType) return (IJavaObject) TypeManager.CreateProxy (resultType, instance.Handle, JniHandleOwnership.DoNotTransfer); } - internal static IJavaObject JavaCast (IJavaObject instance, Type resultType) + internal static IJavaObject? JavaCast (IJavaObject? instance, Type resultType) { if (resultType == null) throw new ArgumentNullException ("resultType"); @@ -109,7 +112,7 @@ internal static IJavaObject JavaCast (IJavaObject instance, Type resultType) return CastClass (instance, resultType); } else if (resultType.IsInterface) { - return (IJavaObject) Java.Lang.Object.GetObject (instance.Handle, JniHandleOwnership.DoNotTransfer, resultType); + return (IJavaObject?) Java.Lang.Object.GetObject (instance.Handle, JniHandleOwnership.DoNotTransfer, resultType); } else throw new NotSupportedException (string.Format ("Unable to convert type '{0}' to '{1}'.", @@ -118,16 +121,16 @@ internal static IJavaObject JavaCast (IJavaObject instance, Type resultType) // typeof(Foo) -> FooSuffix // typeof(Foo<>) -> FooSuffix`1 - internal static Type GetHelperType (Type type, string suffix) + internal static Type? GetHelperType (Type type, string suffix) { Type[] arguments = type.GetGenericArguments (); if (arguments.Length == 0) return type.Assembly.GetType (type + suffix); Type definition = type.GetGenericTypeDefinition (); - int bt = definition.FullName.IndexOf ("`"); + int bt = definition.FullName!.IndexOf ("`"); if (bt == -1) throw new NotSupportedException ("Generic type doesn't follow generic type naming convention! " + type.FullName); - Type suffixDefinition = definition.Assembly.GetType ( + Type? suffixDefinition = definition.Assembly.GetType ( definition.FullName.Substring (0, bt) + suffix + definition.FullName.Substring (bt)); if (suffixDefinition == null) return null; diff --git a/src/Mono.Android/Java.Interop/Runtime.cs b/src/Mono.Android/Java.Interop/Runtime.cs index 50703a35925..96fc0b65358 100644 --- a/src/Mono.Android/Java.Interop/Runtime.cs +++ b/src/Mono.Android/Java.Interop/Runtime.cs @@ -11,7 +11,7 @@ public static class Runtime { [Obsolete ("Please use Java.Interop.JniEnvironment.Runtime.ValueManager.GetSurfacedPeers()")] public static List GetSurfacedObjects () { - var peers = JNIEnv.AndroidValueManager.GetSurfacedPeers (); + var peers = JNIEnv.AndroidValueManager!.GetSurfacedPeers (); var r = new List (peers.Count); foreach (var p in peers) { if (p.SurfacedPeer.TryGetTarget (out var target)) diff --git a/src/Mono.Android/Java.Interop/TypeManager.cs b/src/Mono.Android/Java.Interop/TypeManager.cs index 555df07677c..8f3d4bef114 100644 --- a/src/Mono.Android/Java.Interop/TypeManager.cs +++ b/src/Mono.Android/Java.Interop/TypeManager.cs @@ -12,8 +12,8 @@ namespace Java.Interop { static class TypeManagerMapDictionaries { - static Dictionary _jniToManaged; - static Dictionary _managedToJni; + static Dictionary? _jniToManaged; + static Dictionary? _managedToJni; public static readonly object AccessLock = new object (); @@ -44,17 +44,16 @@ public static partial class TypeManager { internal static string GetClassName (IntPtr class_ptr) { IntPtr ptr = monodroid_TypeManager_get_java_class_name (class_ptr); - string ret = Marshal.PtrToStringAnsi (ptr); + string ret = Marshal.PtrToStringAnsi (ptr)!; JNIEnv.monodroid_free (ptr); return ret; } - internal static string GetJniTypeName (Type type) + internal static string? GetJniTypeName (Type type) { - string jni; lock (TypeManagerMapDictionaries.AccessLock) { - if (TypeManagerMapDictionaries.ManagedToJni.TryGetValue (type, out jni)) + if (TypeManagerMapDictionaries.ManagedToJni.TryGetValue (type, out var jni)) return jni; } return null; @@ -89,7 +88,7 @@ public int Compare (string x, string y) static readonly TypeNameComparer JavaNameComparer = new TypeNameComparer (); - public static string LookupTypeMapping (string[] mappings, string javaType) + public static string? LookupTypeMapping (string[] mappings, string javaType) { int i = Array.BinarySearch (mappings, javaType, JavaNameComparer); if (i < 0) @@ -98,7 +97,7 @@ public static string LookupTypeMapping (string[] mappings, string javaType) return mappings [i].Substring (c+1); } - static Action cb_activate; + static Action? cb_activate; internal static Delegate GetActivateHandler () { if (cb_activate == null) @@ -121,14 +120,14 @@ internal static bool ActivationEnabled { } #endif // !JAVA_INTEROP - static Type[] GetParameterTypes (string signature) + static Type[] GetParameterTypes (string? signature) { if (String.IsNullOrEmpty (signature)) return new Type[0]; - string[] typenames = signature.Split (':'); + string[] typenames = signature!.Split (':'); Type[] result = new Type [typenames.Length]; for (int i = 0; i < typenames.Length; i++) - result [i] = Type.GetType (typenames [i], throwOnError:true); + result [i] = Type.GetType (typenames [i], throwOnError:true)!; return result; } @@ -146,20 +145,20 @@ static void n_Activate (IntPtr jnienv, IntPtr jclass, IntPtr typename_ptr, IntPt string.Format ("warning: Skipping managed constructor invocation for handle 0x{0} (key_handle 0x{1}). " + "Please use JNIEnv.StartCreateInstance() + JNIEnv.FinishCreateInstance() instead of " + "JNIEnv.NewObject() and/or JNIEnv.CreateInstance().", - jobject.ToString ("x"), JNIEnv.IdentityHash (jobject).ToString ("x"))); + jobject.ToString ("x"), JNIEnv.IdentityHash! (jobject).ToString ("x"))); } return; } - Type type = Type.GetType (JNIEnv.GetString (typename_ptr, JniHandleOwnership.DoNotTransfer), throwOnError:true); + Type type = Type.GetType (JNIEnv.GetString (typename_ptr, JniHandleOwnership.DoNotTransfer)!, throwOnError:true)!; if (type.IsGenericTypeDefinition) { throw new NotSupportedException ( "Constructing instances of generic types from Java is not supported, as the type parameters cannot be determined.", CreateJavaLocationException ()); } Type[] ptypes = GetParameterTypes (JNIEnv.GetString (signature_ptr, JniHandleOwnership.DoNotTransfer)); - object[] parms = JNIEnv.GetObjectArray (parameters_ptr, ptypes); - ConstructorInfo cinfo = type.GetConstructor (ptypes); + var parms = JNIEnv.GetObjectArray (parameters_ptr, ptypes); + var cinfo = type.GetConstructor (ptypes); if (cinfo == null) { throw CreateMissingConstructorException (type, ptypes); } @@ -172,7 +171,7 @@ static void n_Activate (IntPtr jnienv, IntPtr jclass, IntPtr typename_ptr, IntPt activator (jobject, parms); } catch (Exception e) { var m = string.Format ("Could not activate JNI Handle 0x{0} (key_handle 0x{1}) of Java type '{2}' as managed type '{3}'.", - jobject.ToString ("x"), JNIEnv.IdentityHash (jobject).ToString ("x"), JNIEnv.GetClassNameFromInstance (jobject), type.FullName); + jobject.ToString ("x"), JNIEnv.IdentityHash! (jobject).ToString ("x"), JNIEnv.GetClassNameFromInstance (jobject), type.FullName); Logger.Log (LogLevel.Warn, "monodroid", m); Logger.Log (LogLevel.Warn, "monodroid", CreateJavaLocationException ().ToString ()); @@ -207,9 +206,9 @@ static Exception CreateJavaLocationException () [MethodImplAttribute(MethodImplOptions.InternalCall)] static extern Type monodroid_typemap_java_to_managed (string java_type_name); - internal static Type GetJavaToManagedType (string class_name) + internal static Type? GetJavaToManagedType (string class_name) { - Type type = monodroid_typemap_java_to_managed (class_name); + Type? type = monodroid_typemap_java_to_managed (class_name); if (type != null) return type; @@ -225,9 +224,8 @@ internal static Type GetJavaToManagedType (string class_name) type = null; int ls = class_name.LastIndexOf ('/'); var package = ls >= 0 ? class_name.Substring (0, ls) : ""; - List> mappers; - if (packageLookup.TryGetValue (package, out mappers)) { - foreach (Converter c in mappers) { + if (packageLookup.TryGetValue (package, out var mappers)) { + foreach (Converter c in mappers) { type = c (class_name); if (type == null) continue; @@ -245,9 +243,9 @@ internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership return CreateInstance (handle, transfer, null); } - internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership transfer, Type targetType) + internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership transfer, Type? targetType) { - Type type = null; + Type? type = null; IntPtr class_ptr = JNIEnv.GetObjectClass (handle); string class_name = GetClassName (class_ptr); lock (TypeManagerMapDictionaries.AccessLock) { @@ -288,7 +286,7 @@ internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership } - IJavaPeerable result = null; + IJavaPeerable? result = null; try { result = (IJavaPeerable) CreateProxy (type, handle, transfer); @@ -296,7 +294,7 @@ internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership result.SetJniManagedPeerState (JniManagedPeerStates.Replaceable); } } catch (MissingMethodException e) { - var key_handle = JNIEnv.IdentityHash (handle); + var key_handle = JNIEnv.IdentityHash! (handle); JNIEnv.DeleteRef (handle, transfer); throw new NotSupportedException ( string.Format ("Unable to activate instance of type {0} from native handle 0x{1} (key_handle 0x{2}).", @@ -314,7 +312,7 @@ internal static object CreateProxy (Type type, IntPtr handle, JniHandleOwnership // Skip Activator.CreateInstance() as that requires public constructors, // and we want to hide some constructors for sanity reasons. BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; - ConstructorInfo c = type.GetConstructor (flags, null, XAConstructorSignature, null); + var c = type.GetConstructor (flags, null, XAConstructorSignature, null); if (c != null) { return c.Invoke (new object [] { handle, transfer }); } @@ -336,8 +334,7 @@ public static void RegisterType (string java_class, Type t) { string jniFromType = JNIEnv.GetJniName (t); lock (TypeManagerMapDictionaries.AccessLock) { - Type lookup; - if (!TypeManagerMapDictionaries.JniToManaged.TryGetValue (java_class, out lookup)) { + if (!TypeManagerMapDictionaries.JniToManaged.TryGetValue (java_class, out var lookup)) { TypeManagerMapDictionaries.JniToManaged.Add (java_class, t); if (String.Compare (jniFromType, java_class, StringComparison.OrdinalIgnoreCase) != 0) { TypeManagerMapDictionaries.ManagedToJni.Add (t, java_class); @@ -350,19 +347,18 @@ public static void RegisterType (string java_class, Type t) } } - static Dictionary>> packageLookup = new Dictionary>> (); + static Dictionary>> packageLookup = new Dictionary>> (); public static void RegisterPackage (string package, Converter lookup) { lock (packageLookup) { - List> lookups; - if (!packageLookup.TryGetValue (package, out lookups)) - packageLookup.Add (package, lookups = new List> ()); + if (!packageLookup.TryGetValue (package, out var lookups)) + packageLookup.Add (package, lookups = new List> ()); lookups.Add (lookup); } } - public static void RegisterPackages (string[] packages, Converter[] lookups) + public static void RegisterPackages (string[] packages, Converter[] lookups) { if (packages == null) throw new ArgumentNullException ("packages"); @@ -374,11 +370,10 @@ public static void RegisterPackages (string[] packages, Converter[ lock (packageLookup) { for (int i = 0; i < packages.Length; ++i) { string package = packages [i]; - Converter lookup = lookups [i]; + var lookup = lookups [i]; - List> _lookups; - if (!packageLookup.TryGetValue (package, out _lookups)) - packageLookup.Add (package, _lookups = new List> ()); + if (!packageLookup.TryGetValue (package, out var _lookups)) + packageLookup.Add (package, _lookups = new List> ()); _lookups.Add (lookup); } } diff --git a/src/Mono.Android/Java.Lang.Reflect/InvocationTargetException.cs b/src/Mono.Android/Java.Lang.Reflect/InvocationTargetException.cs index e4ef0fea40a..cd91478b871 100644 --- a/src/Mono.Android/Java.Lang.Reflect/InvocationTargetException.cs +++ b/src/Mono.Android/Java.Lang.Reflect/InvocationTargetException.cs @@ -5,7 +5,7 @@ namespace Java.Lang.Reflect { partial class InvocationTargetException { [Obsolete ("Use the Cause property. The Clause property was bound in error, and DOES NOT EXIST.", error:true)] - public virtual Java.Lang.Throwable Clause { + public virtual Java.Lang.Throwable? Clause { get {return Cause;} } } diff --git a/src/Mono.Android/Java.Lang/Boolean.cs b/src/Mono.Android/Java.Lang/Boolean.cs index 186cbb815d0..7103f796d7c 100644 --- a/src/Mono.Android/Java.Lang/Boolean.cs +++ b/src/Mono.Android/Java.Lang/Boolean.cs @@ -18,82 +18,82 @@ TypeCode IConvertible.GetTypeCode () return TypeCode.Boolean; } - bool IConvertible.ToBoolean (IFormatProvider provider) + bool IConvertible.ToBoolean (IFormatProvider? provider) { return BooleanValue (); } - byte IConvertible.ToByte (IFormatProvider provider) + byte IConvertible.ToByte (IFormatProvider? provider) { return Convert.ToByte (BooleanValue ()); } - char IConvertible.ToChar (IFormatProvider provider) + char IConvertible.ToChar (IFormatProvider? provider) { return Convert.ToChar (BooleanValue ()); } - DateTime IConvertible.ToDateTime (IFormatProvider provider) + DateTime IConvertible.ToDateTime (IFormatProvider? provider) { return Convert.ToDateTime (BooleanValue ()); } - decimal IConvertible.ToDecimal (IFormatProvider provider) + decimal IConvertible.ToDecimal (IFormatProvider? provider) { return Convert.ToDecimal (BooleanValue ()); } - double IConvertible.ToDouble (IFormatProvider provider) + double IConvertible.ToDouble (IFormatProvider? provider) { return Convert.ToDouble (BooleanValue ()); } - short IConvertible.ToInt16 (IFormatProvider provider) + short IConvertible.ToInt16 (IFormatProvider? provider) { return Convert.ToInt16 (BooleanValue ()); } - int IConvertible.ToInt32 (IFormatProvider provider) + int IConvertible.ToInt32 (IFormatProvider? provider) { return Convert.ToInt32 (BooleanValue ()); } - long IConvertible.ToInt64 (IFormatProvider provider) + long IConvertible.ToInt64 (IFormatProvider? provider) { return Convert.ToInt64 (BooleanValue ()); } - sbyte IConvertible.ToSByte (IFormatProvider provider) + sbyte IConvertible.ToSByte (IFormatProvider? provider) { return Convert.ToSByte (BooleanValue ()); } - float IConvertible.ToSingle (IFormatProvider provider) + float IConvertible.ToSingle (IFormatProvider? provider) { return Convert.ToSingle (BooleanValue ()); } - string IConvertible.ToString (IFormatProvider provider) + string IConvertible.ToString (IFormatProvider? provider) { return Convert.ToString (BooleanValue ()); } - object IConvertible.ToType (Type conversionType, IFormatProvider provider) + object IConvertible.ToType (Type conversionType, IFormatProvider? provider) { return Convert.ChangeType (BooleanValue (), conversionType, provider); } - ushort IConvertible.ToUInt16 (IFormatProvider provider) + ushort IConvertible.ToUInt16 (IFormatProvider? provider) { return Convert.ToUInt16 (BooleanValue ()); } - uint IConvertible.ToUInt32 (IFormatProvider provider) + uint IConvertible.ToUInt32 (IFormatProvider? provider) { return Convert.ToUInt32 (BooleanValue ()); } - ulong IConvertible.ToUInt64 (IFormatProvider provider) + ulong IConvertible.ToUInt64 (IFormatProvider? provider) { return Convert.ToUInt64 (BooleanValue ()); } diff --git a/src/Mono.Android/Java.Lang/Byte.cs b/src/Mono.Android/Java.Lang/Byte.cs index 65c235a46d9..2c3035d4862 100644 --- a/src/Mono.Android/Java.Lang/Byte.cs +++ b/src/Mono.Android/Java.Lang/Byte.cs @@ -18,82 +18,82 @@ TypeCode IConvertible.GetTypeCode () return TypeCode.SByte; } - bool IConvertible.ToBoolean (IFormatProvider provider) + bool IConvertible.ToBoolean (IFormatProvider? provider) { return Convert.ToBoolean (IntValue ()); } - byte IConvertible.ToByte (IFormatProvider provider) + byte IConvertible.ToByte (IFormatProvider? provider) { return Convert.ToByte (IntValue ()); } - char IConvertible.ToChar (IFormatProvider provider) + char IConvertible.ToChar (IFormatProvider? provider) { return Convert.ToChar (IntValue ()); } - DateTime IConvertible.ToDateTime (IFormatProvider provider) + DateTime IConvertible.ToDateTime (IFormatProvider? provider) { return Convert.ToDateTime (IntValue ()); } - decimal IConvertible.ToDecimal (IFormatProvider provider) + decimal IConvertible.ToDecimal (IFormatProvider? provider) { return Convert.ToDecimal (IntValue ()); } - double IConvertible.ToDouble (IFormatProvider provider) + double IConvertible.ToDouble (IFormatProvider? provider) { return Convert.ToDouble (IntValue ()); } - short IConvertible.ToInt16 (IFormatProvider provider) + short IConvertible.ToInt16 (IFormatProvider? provider) { return Convert.ToInt16 (IntValue ()); } - int IConvertible.ToInt32 (IFormatProvider provider) + int IConvertible.ToInt32 (IFormatProvider? provider) { return IntValue (); } - long IConvertible.ToInt64 (IFormatProvider provider) + long IConvertible.ToInt64 (IFormatProvider? provider) { return Convert.ToInt64 (IntValue ()); } - sbyte IConvertible.ToSByte (IFormatProvider provider) + sbyte IConvertible.ToSByte (IFormatProvider? provider) { return Convert.ToSByte (IntValue ()); } - float IConvertible.ToSingle (IFormatProvider provider) + float IConvertible.ToSingle (IFormatProvider? provider) { return Convert.ToSingle (IntValue ()); } - string IConvertible.ToString (IFormatProvider provider) + string IConvertible.ToString (IFormatProvider? provider) { return Convert.ToString (IntValue ()); } - object IConvertible.ToType (Type conversionType, IFormatProvider provider) + object IConvertible.ToType (Type conversionType, IFormatProvider? provider) { return Convert.ChangeType (IntValue (), conversionType, provider); } - ushort IConvertible.ToUInt16 (IFormatProvider provider) + ushort IConvertible.ToUInt16 (IFormatProvider? provider) { return Convert.ToUInt16 (IntValue ()); } - uint IConvertible.ToUInt32 (IFormatProvider provider) + uint IConvertible.ToUInt32 (IFormatProvider? provider) { return Convert.ToUInt32 (IntValue ()); } - ulong IConvertible.ToUInt64 (IFormatProvider provider) + ulong IConvertible.ToUInt64 (IFormatProvider? provider) { return Convert.ToUInt64 (IntValue ()); } diff --git a/src/Mono.Android/Java.Lang/Character.cs b/src/Mono.Android/Java.Lang/Character.cs index 56dab0aa891..70dc42a6b2e 100644 --- a/src/Mono.Android/Java.Lang/Character.cs +++ b/src/Mono.Android/Java.Lang/Character.cs @@ -18,82 +18,82 @@ TypeCode IConvertible.GetTypeCode () return TypeCode.Char; } - bool IConvertible.ToBoolean (IFormatProvider provider) + bool IConvertible.ToBoolean (IFormatProvider? provider) { return Convert.ToBoolean (CharValue ()); } - byte IConvertible.ToByte (IFormatProvider provider) + byte IConvertible.ToByte (IFormatProvider? provider) { return Convert.ToByte (CharValue ()); } - char IConvertible.ToChar (IFormatProvider provider) + char IConvertible.ToChar (IFormatProvider? provider) { return Convert.ToChar (CharValue ()); } - DateTime IConvertible.ToDateTime (IFormatProvider provider) + DateTime IConvertible.ToDateTime (IFormatProvider? provider) { return Convert.ToDateTime (CharValue ()); } - decimal IConvertible.ToDecimal (IFormatProvider provider) + decimal IConvertible.ToDecimal (IFormatProvider? provider) { return Convert.ToDecimal (CharValue ()); } - double IConvertible.ToDouble (IFormatProvider provider) + double IConvertible.ToDouble (IFormatProvider? provider) { return Convert.ToDouble (CharValue ()); } - short IConvertible.ToInt16 (IFormatProvider provider) + short IConvertible.ToInt16 (IFormatProvider? provider) { return Convert.ToInt16 (CharValue ()); } - int IConvertible.ToInt32 (IFormatProvider provider) + int IConvertible.ToInt32 (IFormatProvider? provider) { return Convert.ToInt32 (CharValue ()); } - long IConvertible.ToInt64 (IFormatProvider provider) + long IConvertible.ToInt64 (IFormatProvider? provider) { return Convert.ToInt64 (CharValue ()); } - sbyte IConvertible.ToSByte (IFormatProvider provider) + sbyte IConvertible.ToSByte (IFormatProvider? provider) { return Convert.ToSByte (CharValue ()); } - float IConvertible.ToSingle (IFormatProvider provider) + float IConvertible.ToSingle (IFormatProvider? provider) { return Convert.ToSingle (CharValue ()); } - string IConvertible.ToString (IFormatProvider provider) + string IConvertible.ToString (IFormatProvider? provider) { return Convert.ToString (CharValue ()); } - object IConvertible.ToType (Type conversionType, IFormatProvider provider) + object IConvertible.ToType (Type conversionType, IFormatProvider? provider) { return System.Convert.ChangeType (CharValue (), conversionType, provider); } - ushort IConvertible.ToUInt16 (IFormatProvider provider) + ushort IConvertible.ToUInt16 (IFormatProvider? provider) { return Convert.ToUInt16 (CharValue ()); } - uint IConvertible.ToUInt32 (IFormatProvider provider) + uint IConvertible.ToUInt32 (IFormatProvider? provider) { return Convert.ToUInt32 (CharValue ()); } - ulong IConvertible.ToUInt64 (IFormatProvider provider) + ulong IConvertible.ToUInt64 (IFormatProvider? provider) { return Convert.ToUInt64 (CharValue ()); } diff --git a/src/Mono.Android/Java.Lang/Class.cs b/src/Mono.Android/Java.Lang/Class.cs index 746f71a91ef..de17a2f9e17 100644 --- a/src/Mono.Android/Java.Lang/Class.cs +++ b/src/Mono.Android/Java.Lang/Class.cs @@ -27,7 +27,7 @@ public static Class FromType (System.Type type) if (!(typeof (IJavaObject).IsAssignableFrom (type))) throw new ArgumentException ("type", "Type is not derived from a java type."); - return Java.Lang.Object.GetObject (JNIEnv.FindClass (type), JniHandleOwnership.TransferGlobalRef); + return Java.Lang.Object.GetObject (JNIEnv.FindClass (type), JniHandleOwnership.TransferGlobalRef)!; } } } diff --git a/src/Mono.Android/Java.Lang/ClassNotFoundException.cs b/src/Mono.Android/Java.Lang/ClassNotFoundException.cs index 189d2f41061..a70063e2271 100644 --- a/src/Mono.Android/Java.Lang/ClassNotFoundException.cs +++ b/src/Mono.Android/Java.Lang/ClassNotFoundException.cs @@ -5,7 +5,7 @@ namespace Java.Lang { partial class ClassNotFoundException { [Obsolete ("Use the Cause property. The Clause property was bound in error, and DOES NOT EXIST.", error:true)] - public virtual Java.Lang.Throwable Clause { + public virtual Java.Lang.Throwable? Clause { get {return Cause;} } } diff --git a/src/Mono.Android/Java.Lang/Double.cs b/src/Mono.Android/Java.Lang/Double.cs index 518ed38102f..7ec9ef7833f 100644 --- a/src/Mono.Android/Java.Lang/Double.cs +++ b/src/Mono.Android/Java.Lang/Double.cs @@ -18,82 +18,82 @@ TypeCode IConvertible.GetTypeCode () return TypeCode.Double; } - bool IConvertible.ToBoolean (IFormatProvider provider) + bool IConvertible.ToBoolean (IFormatProvider? provider) { return Convert.ToBoolean (DoubleValue ()); } - byte IConvertible.ToByte (IFormatProvider provider) + byte IConvertible.ToByte (IFormatProvider? provider) { return Convert.ToByte (DoubleValue ()); } - char IConvertible.ToChar (IFormatProvider provider) + char IConvertible.ToChar (IFormatProvider? provider) { return Convert.ToChar (DoubleValue ()); } - DateTime IConvertible.ToDateTime (IFormatProvider provider) + DateTime IConvertible.ToDateTime (IFormatProvider? provider) { return Convert.ToDateTime (DoubleValue ()); } - decimal IConvertible.ToDecimal (IFormatProvider provider) + decimal IConvertible.ToDecimal (IFormatProvider? provider) { return Convert.ToDecimal (DoubleValue ()); } - double IConvertible.ToDouble (IFormatProvider provider) + double IConvertible.ToDouble (IFormatProvider? provider) { return Convert.ToDouble (DoubleValue ()); } - short IConvertible.ToInt16 (IFormatProvider provider) + short IConvertible.ToInt16 (IFormatProvider? provider) { return Convert.ToInt16 (DoubleValue ()); } - int IConvertible.ToInt32 (IFormatProvider provider) + int IConvertible.ToInt32 (IFormatProvider? provider) { return Convert.ToInt32 (DoubleValue ()); } - long IConvertible.ToInt64 (IFormatProvider provider) + long IConvertible.ToInt64 (IFormatProvider? provider) { return Convert.ToInt64 (DoubleValue ()); } - sbyte IConvertible.ToSByte (IFormatProvider provider) + sbyte IConvertible.ToSByte (IFormatProvider? provider) { return Convert.ToSByte (DoubleValue ()); } - float IConvertible.ToSingle (IFormatProvider provider) + float IConvertible.ToSingle (IFormatProvider? provider) { return Convert.ToSingle (DoubleValue ()); } - string IConvertible.ToString (IFormatProvider provider) + string IConvertible.ToString (IFormatProvider? provider) { return Convert.ToString (DoubleValue ()); } - object IConvertible.ToType (Type conversionType, IFormatProvider provider) + object IConvertible.ToType (Type conversionType, IFormatProvider? provider) { return System.Convert.ChangeType (DoubleValue (), conversionType, provider); } - ushort IConvertible.ToUInt16 (IFormatProvider provider) + ushort IConvertible.ToUInt16 (IFormatProvider? provider) { return Convert.ToUInt16 (DoubleValue ()); } - uint IConvertible.ToUInt32 (IFormatProvider provider) + uint IConvertible.ToUInt32 (IFormatProvider? provider) { return Convert.ToUInt32 (DoubleValue ()); } - ulong IConvertible.ToUInt64 (IFormatProvider provider) + ulong IConvertible.ToUInt64 (IFormatProvider? provider) { return Convert.ToUInt64 (DoubleValue ()); } diff --git a/src/Mono.Android/Java.Lang/Float.cs b/src/Mono.Android/Java.Lang/Float.cs index 79a95105e60..01703df017a 100644 --- a/src/Mono.Android/Java.Lang/Float.cs +++ b/src/Mono.Android/Java.Lang/Float.cs @@ -18,82 +18,82 @@ TypeCode IConvertible.GetTypeCode () return TypeCode.Single; } - bool IConvertible.ToBoolean (IFormatProvider provider) + bool IConvertible.ToBoolean (IFormatProvider? provider) { return Convert.ToBoolean (FloatValue ()); } - byte IConvertible.ToByte (IFormatProvider provider) + byte IConvertible.ToByte (IFormatProvider? provider) { return Convert.ToByte (FloatValue ()); } - char IConvertible.ToChar (IFormatProvider provider) + char IConvertible.ToChar (IFormatProvider? provider) { return Convert.ToChar (FloatValue ()); } - DateTime IConvertible.ToDateTime (IFormatProvider provider) + DateTime IConvertible.ToDateTime (IFormatProvider? provider) { return Convert.ToDateTime (FloatValue ()); } - decimal IConvertible.ToDecimal (IFormatProvider provider) + decimal IConvertible.ToDecimal (IFormatProvider? provider) { return Convert.ToDecimal (FloatValue ()); } - double IConvertible.ToDouble (IFormatProvider provider) + double IConvertible.ToDouble (IFormatProvider? provider) { return Convert.ToDouble (FloatValue ()); } - short IConvertible.ToInt16 (IFormatProvider provider) + short IConvertible.ToInt16 (IFormatProvider? provider) { return Convert.ToInt16 (FloatValue ()); } - int IConvertible.ToInt32 (IFormatProvider provider) + int IConvertible.ToInt32 (IFormatProvider? provider) { return Convert.ToInt32 (FloatValue ()); } - long IConvertible.ToInt64 (IFormatProvider provider) + long IConvertible.ToInt64 (IFormatProvider? provider) { return Convert.ToInt64 (FloatValue ()); } - sbyte IConvertible.ToSByte (IFormatProvider provider) + sbyte IConvertible.ToSByte (IFormatProvider? provider) { return Convert.ToSByte (FloatValue ()); } - float IConvertible.ToSingle (IFormatProvider provider) + float IConvertible.ToSingle (IFormatProvider? provider) { return Convert.ToSingle (FloatValue ()); } - string IConvertible.ToString (IFormatProvider provider) + string IConvertible.ToString (IFormatProvider? provider) { return Convert.ToString (FloatValue ()); } - object IConvertible.ToType (Type conversionType, IFormatProvider provider) + object IConvertible.ToType (Type conversionType, IFormatProvider? provider) { return System.Convert.ChangeType (FloatValue (), conversionType, provider); } - ushort IConvertible.ToUInt16 (IFormatProvider provider) + ushort IConvertible.ToUInt16 (IFormatProvider? provider) { return Convert.ToUInt16 (FloatValue ()); } - uint IConvertible.ToUInt32 (IFormatProvider provider) + uint IConvertible.ToUInt32 (IFormatProvider? provider) { return Convert.ToUInt32 (FloatValue ()); } - ulong IConvertible.ToUInt64 (IFormatProvider provider) + ulong IConvertible.ToUInt64 (IFormatProvider? provider) { return Convert.ToUInt64 (FloatValue ()); } diff --git a/src/Mono.Android/Java.Lang/IllegalAccessException.cs b/src/Mono.Android/Java.Lang/IllegalAccessException.cs index 60cecc73036..f8809c3fb48 100644 --- a/src/Mono.Android/Java.Lang/IllegalAccessException.cs +++ b/src/Mono.Android/Java.Lang/IllegalAccessException.cs @@ -5,7 +5,7 @@ namespace Java.Lang { partial class IllegalAccessException { [Obsolete ("Use the Cause property. The Clause property was bound in error, and DOES NOT EXIST.", error:true)] - public virtual Java.Lang.Throwable Clause { + public virtual Java.Lang.Throwable? Clause { get {return Cause;} } } diff --git a/src/Mono.Android/Java.Lang/InstantiationException.cs b/src/Mono.Android/Java.Lang/InstantiationException.cs index f57c870d0e6..f73c9027cf9 100644 --- a/src/Mono.Android/Java.Lang/InstantiationException.cs +++ b/src/Mono.Android/Java.Lang/InstantiationException.cs @@ -5,7 +5,7 @@ namespace Java.Lang { partial class InstantiationException { [Obsolete ("Use the Cause property. The Clause property was bound in error, and DOES NOT EXIST.", error:true)] - public virtual Java.Lang.Throwable Clause { + public virtual Java.Lang.Throwable? Clause { get {return Cause;} } } diff --git a/src/Mono.Android/Java.Lang/Integer.cs b/src/Mono.Android/Java.Lang/Integer.cs index 052dd93d98e..659a0d6feaa 100644 --- a/src/Mono.Android/Java.Lang/Integer.cs +++ b/src/Mono.Android/Java.Lang/Integer.cs @@ -18,82 +18,82 @@ TypeCode IConvertible.GetTypeCode () return TypeCode.Int32; } - bool IConvertible.ToBoolean (IFormatProvider provider) + bool IConvertible.ToBoolean (IFormatProvider? provider) { return Convert.ToBoolean (IntValue ()); } - byte IConvertible.ToByte (IFormatProvider provider) + byte IConvertible.ToByte (IFormatProvider? provider) { return Convert.ToByte (IntValue ()); } - char IConvertible.ToChar (IFormatProvider provider) + char IConvertible.ToChar (IFormatProvider? provider) { return Convert.ToChar (IntValue ()); } - DateTime IConvertible.ToDateTime (IFormatProvider provider) + DateTime IConvertible.ToDateTime (IFormatProvider? provider) { return Convert.ToDateTime (IntValue ()); } - decimal IConvertible.ToDecimal (IFormatProvider provider) + decimal IConvertible.ToDecimal (IFormatProvider? provider) { return Convert.ToDecimal (IntValue ()); } - double IConvertible.ToDouble (IFormatProvider provider) + double IConvertible.ToDouble (IFormatProvider? provider) { return Convert.ToDouble (IntValue ()); } - short IConvertible.ToInt16 (IFormatProvider provider) + short IConvertible.ToInt16 (IFormatProvider? provider) { return Convert.ToInt16 (IntValue ()); } - int IConvertible.ToInt32 (IFormatProvider provider) + int IConvertible.ToInt32 (IFormatProvider? provider) { return Convert.ToInt32 (IntValue ()); } - long IConvertible.ToInt64 (IFormatProvider provider) + long IConvertible.ToInt64 (IFormatProvider? provider) { return Convert.ToInt64 (IntValue ()); } - sbyte IConvertible.ToSByte (IFormatProvider provider) + sbyte IConvertible.ToSByte (IFormatProvider? provider) { return Convert.ToSByte (IntValue ()); } - float IConvertible.ToSingle (IFormatProvider provider) + float IConvertible.ToSingle (IFormatProvider? provider) { return Convert.ToSingle (IntValue ()); } - string IConvertible.ToString (IFormatProvider provider) + string IConvertible.ToString (IFormatProvider? provider) { return Convert.ToString (IntValue ()); } - object IConvertible.ToType (Type conversionType, IFormatProvider provider) + object IConvertible.ToType (Type conversionType, IFormatProvider? provider) { return System.Convert.ChangeType (IntValue (), conversionType, provider); } - ushort IConvertible.ToUInt16 (IFormatProvider provider) + ushort IConvertible.ToUInt16 (IFormatProvider? provider) { return Convert.ToUInt16 (IntValue ()); } - uint IConvertible.ToUInt32 (IFormatProvider provider) + uint IConvertible.ToUInt32 (IFormatProvider? provider) { return Convert.ToUInt32 (IntValue ()); } - ulong IConvertible.ToUInt64 (IFormatProvider provider) + ulong IConvertible.ToUInt64 (IFormatProvider? provider) { return Convert.ToUInt64 (IntValue ()); } diff --git a/src/Mono.Android/Java.Lang/Long.cs b/src/Mono.Android/Java.Lang/Long.cs index f20ff26f9f6..aa355948570 100644 --- a/src/Mono.Android/Java.Lang/Long.cs +++ b/src/Mono.Android/Java.Lang/Long.cs @@ -18,82 +18,82 @@ TypeCode IConvertible.GetTypeCode () return TypeCode.Int64; } - bool IConvertible.ToBoolean (IFormatProvider provider) + bool IConvertible.ToBoolean (IFormatProvider? provider) { return Convert.ToBoolean (LongValue ()); } - byte IConvertible.ToByte (IFormatProvider provider) + byte IConvertible.ToByte (IFormatProvider? provider) { return Convert.ToByte (LongValue ()); } - char IConvertible.ToChar (IFormatProvider provider) + char IConvertible.ToChar (IFormatProvider? provider) { return Convert.ToChar (LongValue ()); } - DateTime IConvertible.ToDateTime (IFormatProvider provider) + DateTime IConvertible.ToDateTime (IFormatProvider? provider) { return Convert.ToDateTime (LongValue ()); } - decimal IConvertible.ToDecimal (IFormatProvider provider) + decimal IConvertible.ToDecimal (IFormatProvider? provider) { return Convert.ToDecimal (LongValue ()); } - double IConvertible.ToDouble (IFormatProvider provider) + double IConvertible.ToDouble (IFormatProvider? provider) { return Convert.ToDouble (LongValue ()); } - short IConvertible.ToInt16 (IFormatProvider provider) + short IConvertible.ToInt16 (IFormatProvider? provider) { return Convert.ToInt16 (LongValue ()); } - int IConvertible.ToInt32 (IFormatProvider provider) + int IConvertible.ToInt32 (IFormatProvider? provider) { return Convert.ToInt32 (LongValue ()); } - long IConvertible.ToInt64 (IFormatProvider provider) + long IConvertible.ToInt64 (IFormatProvider? provider) { return Convert.ToInt64 (LongValue ()); } - sbyte IConvertible.ToSByte (IFormatProvider provider) + sbyte IConvertible.ToSByte (IFormatProvider? provider) { return Convert.ToSByte (LongValue ()); } - float IConvertible.ToSingle (IFormatProvider provider) + float IConvertible.ToSingle (IFormatProvider? provider) { return Convert.ToSingle (LongValue ()); } - string IConvertible.ToString (IFormatProvider provider) + string IConvertible.ToString (IFormatProvider? provider) { return Convert.ToString (LongValue ()); } - object IConvertible.ToType (Type conversionType, IFormatProvider provider) + object IConvertible.ToType (Type conversionType, IFormatProvider? provider) { return System.Convert.ChangeType (LongValue (), conversionType, provider); } - ushort IConvertible.ToUInt16 (IFormatProvider provider) + ushort IConvertible.ToUInt16 (IFormatProvider? provider) { return Convert.ToUInt16 (LongValue ()); } - uint IConvertible.ToUInt32 (IFormatProvider provider) + uint IConvertible.ToUInt32 (IFormatProvider? provider) { return Convert.ToUInt32 (LongValue ()); } - ulong IConvertible.ToUInt64 (IFormatProvider provider) + ulong IConvertible.ToUInt64 (IFormatProvider? provider) { return Convert.ToUInt64 (LongValue ()); } diff --git a/src/Mono.Android/Java.Lang/NoSuchFieldException.cs b/src/Mono.Android/Java.Lang/NoSuchFieldException.cs index f75278d2ac0..83e5b52affe 100644 --- a/src/Mono.Android/Java.Lang/NoSuchFieldException.cs +++ b/src/Mono.Android/Java.Lang/NoSuchFieldException.cs @@ -5,7 +5,7 @@ namespace Java.Lang { partial class NoSuchFieldException { [Obsolete ("Use the Cause property. The Clause property was bound in error, and DOES NOT EXIST.", error:true)] - public virtual Java.Lang.Throwable Clause { + public virtual Java.Lang.Throwable? Clause { get {return Cause;} } } diff --git a/src/Mono.Android/Java.Lang/NoSuchMethodException.cs b/src/Mono.Android/Java.Lang/NoSuchMethodException.cs index abfe9b0ab93..91392e49007 100644 --- a/src/Mono.Android/Java.Lang/NoSuchMethodException.cs +++ b/src/Mono.Android/Java.Lang/NoSuchMethodException.cs @@ -5,7 +5,7 @@ namespace Java.Lang { partial class NoSuchMethodException { [Obsolete ("Use the Cause property. The Clause property was bound in error, and DOES NOT EXIST.", error:true)] - public virtual Java.Lang.Throwable Clause { + public virtual Java.Lang.Throwable? Clause { get {return Cause;} } } diff --git a/src/Mono.Android/Java.Lang/Object.cs b/src/Mono.Android/Java.Lang/Object.cs index e50289e7db3..68db056acb6 100644 --- a/src/Mono.Android/Java.Lang/Object.cs +++ b/src/Mono.Android/Java.Lang/Object.cs @@ -8,6 +8,7 @@ using Android.Runtime; using System.ComponentModel; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; namespace Java.Lang { @@ -169,7 +170,7 @@ void IJavaPeerable.DisposeUnlessReferenced () [EditorBrowsable (EditorBrowsableState.Never)] public void UnregisterFromRuntime () { - JNIEnv.AndroidValueManager.RemovePeer (this, key_handle); + JNIEnv.AndroidValueManager?.RemovePeer (this, key_handle); } void IJavaPeerable.Disposed () @@ -206,7 +207,7 @@ void IJavaPeerable.SetPeerReference (JniObjectReference reference) public void Dispose () { - JNIEnv.AndroidValueManager.DisposePeer (this); + JNIEnv.AndroidValueManager?.DisposePeer (this); } protected virtual void Dispose (bool disposing) @@ -223,7 +224,7 @@ internal static void Dispose (IJavaPeerable instance, ref IntPtr handle, IntPtr string.Format ("Disposing handle 0x{0}\n", handle.ToString ("x"))); } - JNIEnv.AndroidValueManager.RemovePeer (instance, key_handle); + JNIEnv.AndroidValueManager?.RemovePeer (instance, key_handle); switch (handle_type) { case JObjectRefType.Global: @@ -247,13 +248,13 @@ internal static void Dispose (IJavaPeerable instance, ref IntPtr handle, IntPtr [EditorBrowsable (EditorBrowsableState.Never)] protected void SetHandle (IntPtr value, JniHandleOwnership transfer) { - JNIEnv.AndroidValueManager.AddPeer (this, value, transfer, out handle); + JNIEnv.AndroidValueManager?.AddPeer (this, value, transfer, out handle); handle_type = JObjectRefType.Global; } - internal static IJavaPeerable PeekObject (IntPtr handle, Type requiredType = null) + internal static IJavaPeerable? PeekObject (IntPtr handle, Type? requiredType = null) { - var peeked = JNIEnv.AndroidValueManager.PeekPeer (new JniObjectReference (handle)); + var peeked = JNIEnv.AndroidValueManager?.PeekPeer (new JniObjectReference (handle)); if (peeked == null) return null; if (requiredType != null && !requiredType.IsAssignableFrom (peeked.GetType ())) @@ -261,24 +262,26 @@ internal static IJavaPeerable PeekObject (IntPtr handle, Type requiredType = nul return peeked; } + [return: MaybeNull] internal static T PeekObject (IntPtr handle) { return (T)PeekObject (handle, typeof (T)); } - public static T GetObject (IntPtr jnienv, IntPtr handle, JniHandleOwnership transfer) + public static T? GetObject (IntPtr jnienv, IntPtr handle, JniHandleOwnership transfer) where T : class, IJavaObject { JNIEnv.CheckHandle (jnienv); return GetObject (handle, transfer); } - public static T GetObject (IntPtr handle, JniHandleOwnership transfer) + public static T? GetObject (IntPtr handle, JniHandleOwnership transfer) where T : class, IJavaObject { return _GetObject(handle, transfer); } + [return: MaybeNull] internal static T _GetObject (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) @@ -287,7 +290,7 @@ internal static T _GetObject (IntPtr handle, JniHandleOwnership transfer) return (T) GetObject (handle, transfer, typeof (T)); } - internal static IJavaPeerable GetObject (IntPtr handle, JniHandleOwnership transfer, Type type = null) + internal static IJavaPeerable? GetObject (IntPtr handle, JniHandleOwnership transfer, Type? type = null) { if (handle == IntPtr.Zero) return null; @@ -302,12 +305,13 @@ internal static IJavaPeerable GetObject (IntPtr handle, JniHandleOwnership trans } [EditorBrowsable (EditorBrowsableState.Never)] + [return: MaybeNull] public T[] ToArray() { return JNIEnv.GetArray(Handle); } - public static Java.Lang.Object FromArray(T[] value) + public static Java.Lang.Object? FromArray(T[] value) { if (value == null) return null; @@ -367,7 +371,7 @@ public static implicit operator Java.Lang.Object (double value) return new Java.Lang.Double (value); } - public static implicit operator Java.Lang.Object (string value) + public static implicit operator Java.Lang.Object? (string? value) { if (value == null) return null; @@ -427,133 +431,142 @@ public static explicit operator double (Java.Lang.Object value) return Convert.ToDouble (value); } - public static explicit operator string (Java.Lang.Object value) + public static explicit operator string? (Java.Lang.Object? value) { if (value == null) return null; return Convert.ToString (value); } - public static implicit operator Java.Lang.Object (Java.Lang.Object[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (Java.Lang.Object[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static implicit operator Java.Lang.Object (bool[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (bool[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static implicit operator Java.Lang.Object (byte[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (byte[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static implicit operator Java.Lang.Object (char[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (char[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static implicit operator Java.Lang.Object (int[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (int[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static implicit operator Java.Lang.Object (long[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (long[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static implicit operator Java.Lang.Object (float[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (float[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static implicit operator Java.Lang.Object (double[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (double[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static implicit operator Java.Lang.Object (string[] value) + [return: NotNullIfNotNull ("value")] + public static implicit operator Java.Lang.Object? (string[]? value) { if (value == null) return null; return new Java.Lang.Object (JNIEnv.NewArray (value), JniHandleOwnership.TransferLocalRef); } - public static explicit operator Java.Lang.Object[] (Java.Lang.Object value) + public static explicit operator Java.Lang.Object[]? (Java.Lang.Object? value) { if (value == null) return null; return value.ToArray(); } - public static explicit operator bool[] (Java.Lang.Object value) + public static explicit operator bool[]? (Java.Lang.Object? value) { if (value == null) return null; return value.ToArray(); } - public static explicit operator byte[] (Java.Lang.Object value) + public static explicit operator byte[]? (Java.Lang.Object? value) { if (value == null) return null; return value.ToArray(); } - public static explicit operator char[] (Java.Lang.Object value) + public static explicit operator char[]? (Java.Lang.Object? value) { if (value == null) return null; return value.ToArray(); } - public static explicit operator int[] (Java.Lang.Object value) + public static explicit operator int[]? (Java.Lang.Object? value) { if (value == null) return null; return value.ToArray(); } - public static explicit operator long[] (Java.Lang.Object value) + public static explicit operator long[]? (Java.Lang.Object? value) { if (value == null) return null; return value.ToArray(); } - public static explicit operator float[] (Java.Lang.Object value) + public static explicit operator float[]? (Java.Lang.Object? value) { if (value == null) return null; return value.ToArray(); } - public static explicit operator double[] (Java.Lang.Object value) + public static explicit operator double[]? (Java.Lang.Object? value) { if (value == null) return null; return value.ToArray(); } - public static explicit operator string[] (Java.Lang.Object value) + public static explicit operator string[]? (Java.Lang.Object? value) { if (value == null) return null; diff --git a/src/Mono.Android/Java.Lang/String.cs b/src/Mono.Android/Java.Lang/String.cs index e7734a1c26a..7c2383764b1 100644 --- a/src/Mono.Android/Java.Lang/String.cs +++ b/src/Mono.Android/Java.Lang/String.cs @@ -45,7 +45,7 @@ public unsafe String (string toCopy) public override string ToString () { - return JNIEnv.GetCharSequence (Handle, JniHandleOwnership.DoNotTransfer); + return JNIEnv.GetCharSequence (Handle, JniHandleOwnership.DoNotTransfer)!; } } } diff --git a/src/Mono.Android/Java.Lang/Thread.cs b/src/Mono.Android/Java.Lang/Thread.cs index 3076b3eeabd..8c6155f41d3 100644 --- a/src/Mono.Android/Java.Lang/Thread.cs +++ b/src/Mono.Android/Java.Lang/Thread.cs @@ -36,7 +36,8 @@ public void Run () Handler (); if (removable) lock (instances) - instances.Remove (Handler); + if (Handler != null) + instances.Remove (Handler); Dispose (); } @@ -46,7 +47,7 @@ public static RunnableImplementor Remove (Action handler) { RunnableImplementor result; lock (instances) { - instances.TryGetValue (handler, out result); + instances.TryGetValue (handler, out result!); instances.Remove (handler); } return result; diff --git a/src/Mono.Android/Java.Lang/Throwable.cs b/src/Mono.Android/Java.Lang/Throwable.cs index 76654f0b6a2..c1a537e9a33 100644 --- a/src/Mono.Android/Java.Lang/Throwable.cs +++ b/src/Mono.Android/Java.Lang/Throwable.cs @@ -28,7 +28,7 @@ public partial class Throwable : global::System.Exception, IJavaObject, IDisposa bool isProxy; bool needsActivation; - string nativeStack; + string? nativeStack; public Throwable (IntPtr handle, JniHandleOwnership transfer) : base (_GetMessage (handle), _GetInnerException (handle)) @@ -49,10 +49,10 @@ public Throwable (IntPtr handle, JniHandleOwnership transfer) } #if JAVA_INTEROP - static JniMethodInfo Throwable_getMessage; + static JniMethodInfo? Throwable_getMessage; #endif - static string _GetMessage (IntPtr handle) + static string? _GetMessage (IntPtr handle) { if (handle == IntPtr.Zero) return null; @@ -74,10 +74,10 @@ static string _GetMessage (IntPtr handle) } #if JAVA_INTEROP - static JniMethodInfo Throwable_getCause; + static JniMethodInfo? Throwable_getCause; #endif - static global::System.Exception _GetInnerException (IntPtr handle) + static global::System.Exception? _GetInnerException (IntPtr handle) { if (handle == IntPtr.Zero) return null; @@ -150,7 +150,7 @@ string ManagedStackTraceAddendum { } } - string JavaStackTrace { + string? JavaStackTrace { get { if (!string.IsNullOrEmpty (nativeStack)) return nativeStack; @@ -222,7 +222,7 @@ internal System.Type GetThresholdType () static IntPtr id_getClass; #endif // !JAVA_INTEROP - public unsafe Java.Lang.Class Class { + public unsafe Java.Lang.Class? Class { [Register ("getClass", "()Ljava/lang/Class;", "GetGetClassHandler")] get { IntPtr value; @@ -241,7 +241,7 @@ public unsafe Java.Lang.Class Class { [EditorBrowsable (EditorBrowsableState.Never)] protected void SetHandle (IntPtr value, JniHandleOwnership transfer) { - JNIEnv.AndroidValueManager.AddPeer (this, value, transfer, out handle); + JNIEnv.AndroidValueManager?.AddPeer (this, value, transfer, out handle); handle_type = JObjectRefType.Global; } @@ -296,7 +296,7 @@ void IJavaPeerable.DisposeUnlessReferenced () public void UnregisterFromRuntime () { - JNIEnv.AndroidValueManager.RemovePeer (this, key_handle); + JNIEnv.AndroidValueManager?.RemovePeer (this, key_handle); } void IJavaPeerable.Disposed () @@ -332,7 +332,7 @@ void IJavaPeerable.SetPeerReference (JniObjectReference reference) public void Dispose () { - JNIEnv.AndroidValueManager.DisposePeer (this); + JNIEnv.AndroidValueManager?.DisposePeer (this); } protected virtual void Dispose (bool disposing) diff --git a/src/Mono.Android/Java.Nio/CharBuffer.cs b/src/Mono.Android/Java.Nio/CharBuffer.cs index 0503110ca8c..34adc5814f6 100644 --- a/src/Mono.Android/Java.Nio/CharBuffer.cs +++ b/src/Mono.Android/Java.Nio/CharBuffer.cs @@ -6,17 +6,17 @@ public partial class CharBuffer // to generate explicit interface implementation for these methods. Java.Lang.IAppendable Java.Lang.IAppendable.Append(char ch) { - return Append (ch); + return Append (ch)!; } - Java.Lang.IAppendable Java.Lang.IAppendable.Append(Java.Lang.ICharSequence csq) + Java.Lang.IAppendable Java.Lang.IAppendable.Append(Java.Lang.ICharSequence? csq) { - return Append (csq); + return Append (csq)!; } - Java.Lang.IAppendable Java.Lang.IAppendable.Append(Java.Lang.ICharSequence csq, int start, int end) + Java.Lang.IAppendable Java.Lang.IAppendable.Append(Java.Lang.ICharSequence? csq, int start, int end) { - return Append (csq, start, end); + return Append (csq, start, end)!; } } } diff --git a/src/Mono.Android/Java.Nio/FileChannel.cs b/src/Mono.Android/Java.Nio/FileChannel.cs index 9a44c30bf4c..504e562ffc3 100644 --- a/src/Mono.Android/Java.Nio/FileChannel.cs +++ b/src/Mono.Android/Java.Nio/FileChannel.cs @@ -18,12 +18,12 @@ FileChannel whereas FileChannel is ISeekableByteChannel. in the API breakage. Therefore, I'm reverting the changes in metadata and adding explicit interface methods here instead. */ - ISeekableByteChannel ISeekableByteChannel.Position (long newPosition) + ISeekableByteChannel? ISeekableByteChannel.Position (long newPosition) { return Position (newPosition); } - ISeekableByteChannel ISeekableByteChannel.Truncate (long size) + ISeekableByteChannel? ISeekableByteChannel.Truncate (long size) { return Truncate (size); } diff --git a/src/Mono.Android/Javax.Microedition.Khronos.Egl/EGLContext.cs b/src/Mono.Android/Javax.Microedition.Khronos.Egl/EGLContext.cs index 0cbb27d6b49..c5653f5a3bb 100644 --- a/src/Mono.Android/Javax.Microedition.Khronos.Egl/EGLContext.cs +++ b/src/Mono.Android/Javax.Microedition.Khronos.Egl/EGLContext.cs @@ -8,7 +8,7 @@ partial class EGLContext { public static IEGL11 EGL11 { get { - return EGL.JavaCast (); + return EGL.JavaCast ()!; } } } diff --git a/src/Mono.Android/Mono.Android.csproj b/src/Mono.Android/Mono.Android.csproj index b552d62cd05..a47eb5529e2 100644 --- a/src/Mono.Android/Mono.Android.csproj +++ b/src/Mono.Android/Mono.Android.csproj @@ -9,7 +9,7 @@ Android true ..\..\product.snk - 0618;0809;0108;0114;0465 + 0618;0809;0108;0114;0465;8609;8610;8614;8617;8613;8764;8765;8766;8767 latest true $(DefineConstants);JAVA_INTEROP @@ -20,6 +20,7 @@ false false + enable diff --git a/src/Mono.Android/Mono.Android.targets b/src/Mono.Android/Mono.Android.targets index f302ab3b1bb..9992212b49a 100644 --- a/src/Mono.Android/Mono.Android.targets +++ b/src/Mono.Android/Mono.Android.targets @@ -107,7 +107,8 @@ <_Api>$(IntermediateOutputPath)mcw\api.xml <_Dirs>--enumdir=$(IntermediateOutputPath)mcw <_FullIntermediateOutputPath>$([System.IO.Path]::GetFullPath('$(IntermediateOutputPath)')) - <_LangFeatures Condition="$(AndroidApiLevel) >= 30">--lang-features=default-interface-methods,nested-interface-types,interface-constants + <_LangFeatures>--lang-features=nullable-reference-types + <_LangFeatures Condition="$(AndroidApiLevel) >= 30">$(_LangFeatures),default-interface-methods,nested-interface-types,interface-constants ToEnumerable (this Java.Lang.IIterable source) { if (source == null) @@ -48,17 +49,18 @@ public static IEnumerable ToEnumerable (this Java.Lang.IIterable source) while (iterator.HasNext) { yield return JavaConvert.FromJniHandle( JNIEnv.CallObjectMethod (iterator.Handle, id_next), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } } + [return: MaybeNull] internal static IEnumerator ToEnumerator_Dispose (this Java.Util.IIterator source) { using (source) while (source.HasNext) { yield return JavaConvert.FromJniHandle( JNIEnv.CallObjectMethod (source.Handle, id_next), - JniHandleOwnership.TransferLocalRef); + JniHandleOwnership.TransferLocalRef)!; } } } diff --git a/src/Mono.Android/Xamarin.Android.Net/AndroidClientHandler.cs b/src/Mono.Android/Xamarin.Android.Net/AndroidClientHandler.cs index a82786b9b12..f9695481cd2 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AndroidClientHandler.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AndroidClientHandler.cs @@ -60,9 +60,9 @@ public class AndroidClientHandler : HttpClientHandler { sealed class RequestRedirectionState { - public Uri NewUrl; + public Uri? NewUrl; public int RedirectCounter; - public HttpMethod Method; + public HttpMethod? Method; public bool MethodChanged; } @@ -116,7 +116,7 @@ sealed class RequestRedirectionState /// /// /// The pre authentication data. - public AuthenticationData PreAuthenticationData { get; set; } + public AuthenticationData? PreAuthenticationData { get; set; } /// /// If the website requires authentication, this property will contain data about each scheme supported @@ -129,7 +129,7 @@ sealed class RequestRedirectionState /// instance of which handles this kind of authorization scheme /// ( /// - public IList RequestedAuthentication { get; private set; } + public IList ? RequestedAuthentication { get; private set; } /// /// Server authentication response indicates that the request to authorize comes from a proxy if this property is true. @@ -159,7 +159,7 @@ public bool RequestNeedsAuthorization { /// instead /// /// The trusted certs. - public IList TrustedCerts { get; set; } + public IList ? TrustedCerts { get; set; } /// /// @@ -232,7 +232,7 @@ string EncodeUrl (Uri url) /// /// Instance of IHostnameVerifier to be used for this HTTPS connection /// HTTPS connection object. - protected virtual IHostnameVerifier GetSSLHostnameVerifier (HttpsURLConnection connection) + protected virtual IHostnameVerifier? GetSSLHostnameVerifier (HttpsURLConnection connection) { return null; } @@ -259,7 +259,7 @@ protected virtual IHostnameVerifier GetSSLHostnameVerifier (HttpsURLConnection c }; while (true) { URL java_url = new URL (EncodeUrl (redirectState.NewUrl)); - URLConnection java_connection; + URLConnection? java_connection; if (UseProxy) { var javaProxy = await GetJavaProxy (redirectState.NewUrl, cancellationToken).ConfigureAwait (continueOnCapturedContext: false); // When you use the parameter Java.Net.Proxy.NoProxy the system proxy is overriden. Leave the parameter out to respect the default settings. @@ -271,19 +271,19 @@ protected virtual IHostnameVerifier GetSSLHostnameVerifier (HttpsURLConnection c var httpsConnection = java_connection as HttpsURLConnection; if (httpsConnection != null) { - IHostnameVerifier hnv = GetSSLHostnameVerifier (httpsConnection); + IHostnameVerifier? hnv = GetSSLHostnameVerifier (httpsConnection); if (hnv != null) httpsConnection.HostnameVerifier = hnv; } if (ConnectTimeout != TimeSpan.Zero) - java_connection.ConnectTimeout = checked ((int)ConnectTimeout.TotalMilliseconds); + java_connection!.ConnectTimeout = checked ((int)ConnectTimeout.TotalMilliseconds); if (ReadTimeout != TimeSpan.Zero) - java_connection.ReadTimeout = checked ((int)ReadTimeout.TotalMilliseconds); + java_connection!.ReadTimeout = checked ((int)ReadTimeout.TotalMilliseconds); - HttpURLConnection httpConnection = await SetupRequestInternal (request, java_connection).ConfigureAwait (continueOnCapturedContext: false);; - HttpResponseMessage response = await ProcessRequest (request, java_url, httpConnection, cancellationToken, redirectState).ConfigureAwait (continueOnCapturedContext: false);; + HttpURLConnection httpConnection = await SetupRequestInternal (request, java_connection!).ConfigureAwait (continueOnCapturedContext: false);; + var response = await ProcessRequest (request, java_url, httpConnection, cancellationToken, redirectState).ConfigureAwait (continueOnCapturedContext: false);; if (response != null) return response; @@ -293,9 +293,9 @@ protected virtual IHostnameVerifier GetSSLHostnameVerifier (HttpsURLConnection c } } - protected virtual async Task GetJavaProxy (Uri destination, CancellationToken cancellationToken) + protected virtual async Task GetJavaProxy (Uri destination, CancellationToken cancellationToken) { - Java.Net.Proxy proxy = Java.Net.Proxy.NoProxy; + var proxy = Java.Net.Proxy.NoProxy; if (destination == null || Proxy == null) { goto done; @@ -316,7 +316,7 @@ protected virtual IHostnameVerifier GetSSLHostnameVerifier (HttpsURLConnection c return proxy; } - Task ProcessRequest (HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) + Task ProcessRequest (HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) { cancellationToken.ThrowIfCancellationRequested (); httpConnection.InstanceFollowRedirects = false; // We handle it ourselves @@ -349,7 +349,7 @@ Task ConnectAsync (HttpURLConnection httpConnection, CancellationToken ct) protected virtual async Task WriteRequestContentToOutput (HttpRequestMessage request, HttpURLConnection httpConnection, CancellationToken cancellationToken) { using (var stream = await request.Content.ReadAsStreamAsync ().ConfigureAwait (false)) { - await stream.CopyToAsync(httpConnection.OutputStream, 4096, cancellationToken).ConfigureAwait(false); + await stream.CopyToAsync(httpConnection.OutputStream!, 4096, cancellationToken).ConfigureAwait(false); // // Rewind the stream to beginning in case the HttpContent implementation @@ -374,7 +374,7 @@ protected virtual async Task WriteRequestContentToOutput (HttpRequestMessage req } } - async Task DoProcessRequest (HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) + async Task DoProcessRequest (HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) { if (Logger.LogNet) Logger.Log (LogLevel.Info, LOG_APP, $"{this}.DoProcessRequest ()"); @@ -410,7 +410,7 @@ protected virtual async Task WriteRequestContentToOutput (HttpRequestMessage req CancellationTokenRegistration cancelRegistration = default (CancellationTokenRegistration); HttpStatusCode statusCode = HttpStatusCode.OK; - Uri connectionUri = null; + Uri? connectionUri = null; try { cancelRegistration = cancellationToken.Register (() => { @@ -424,7 +424,7 @@ protected virtual async Task WriteRequestContentToOutput (HttpRequestMessage req await WriteRequestContentToOutput (request, httpConnection, cancellationToken); statusCode = await Task.Run (() => (HttpStatusCode)httpConnection.ResponseCode).ConfigureAwait (false); - connectionUri = new Uri (httpConnection.URL.ToString ()); + connectionUri = new Uri (httpConnection.URL?.ToString ()!); } finally { cancelRegistration.Dispose (); } @@ -448,7 +448,7 @@ protected virtual async Task WriteRequestContentToOutput (HttpRequestMessage req if (!IsErrorStatusCode (statusCode)) { if (Logger.LogNet) Logger.Log (LogLevel.Info, LOG_APP, $"Reading..."); - ret.Content = GetContent (httpConnection, httpConnection.InputStream); + ret.Content = GetContent (httpConnection, httpConnection.InputStream!); } else { if (Logger.LogNet) @@ -476,7 +476,7 @@ protected virtual async Task WriteRequestContentToOutput (HttpRequestMessage req if (disposeRet) { ret.Dispose (); - ret = null; + ret = null!; } else { CopyHeaders (httpConnection, ret); ParseCookies (ret, connectionUri); @@ -540,7 +540,7 @@ HttpContent GetContent (URLConnection httpConnection, Stream contentStream) { Stream inputStream = new BufferedStream (contentStream); if (decompress_here) { - string[] encodings = httpConnection.ContentEncoding?.Split (','); + var encodings = httpConnection.ContentEncoding?.Split (','); if (encodings != null) { if (encodings.Contains (GZIP_ENCODING, StringComparer.OrdinalIgnoreCase)) inputStream = new GZipStream (inputStream, CompressionMode.Decompress); @@ -586,11 +586,11 @@ bool HandleRedirect (HttpStatusCode redirectCode, HttpURLConnection httpConnecti return false; } - IDictionary > headers = httpConnection.HeaderFields; - IList locationHeader; - string location = null; + var headers = httpConnection.HeaderFields; + IList ? locationHeader = null; + string? location = null; - if (headers.TryGetValue ("Location", out locationHeader) && locationHeader != null && locationHeader.Count > 0) { + if (headers?.TryGetValue ("Location", out locationHeader) == true && locationHeader != null && locationHeader.Count > 0) { if (locationHeader.Count == 1) { location = locationHeader [0]?.Trim (); } else { @@ -624,8 +624,8 @@ bool HandleRedirect (HttpStatusCode redirectCode, HttpURLConnection httpConnecti if (Logger.LogNet) Logger.Log (LogLevel.Debug, LOG_APP, $"Raw redirect location: {location}"); - var baseUrl = new Uri (httpConnection.URL.ToString ()); - if (location [0] == '/') { + var baseUrl = new Uri (httpConnection.URL?.ToString ()!); + if (location? [0] == '/') { // Shortcut for the '/' and '//' cases, simplifies logic since URI won't treat // such URLs as relative and we'd have to work around it in the `else` block // below. @@ -640,7 +640,7 @@ bool HandleRedirect (HttpStatusCode redirectCode, HttpURLConnection httpConnecti // that would NOT be the right thing to do since it is not what the redirecting server // meant. The fix doesn't belong here, but rather in the Uri class. So we'll throw... - redirectUrl = new Uri (location, UriKind.RelativeOrAbsolute); + redirectUrl = new Uri (location!, UriKind.RelativeOrAbsolute); if (!redirectUrl.IsAbsoluteUri) redirectUrl = new Uri (baseUrl, location); } @@ -651,13 +651,13 @@ bool HandleRedirect (HttpStatusCode redirectCode, HttpURLConnection httpConnecti throw new WebException ($"Invalid redirect URI received: {location}", ex); } - UriBuilder builder = null; - if (!String.IsNullOrEmpty (httpConnection.URL.Ref) && String.IsNullOrEmpty (redirectUrl.Fragment)) { + UriBuilder? builder = null; + if (!String.IsNullOrEmpty (httpConnection.URL?.Ref) && String.IsNullOrEmpty (redirectUrl.Fragment)) { if (Logger.LogNet) - Logger.Log (LogLevel.Debug, LOG_APP, $"Appending fragment '{httpConnection.URL.Ref}' to redirect URL '{redirectUrl}'"); + Logger.Log (LogLevel.Debug, LOG_APP, $"Appending fragment '{httpConnection.URL?.Ref}' to redirect URL '{redirectUrl}'"); builder = new UriBuilder (redirectUrl) { - Fragment = httpConnection.URL.Ref + Fragment = httpConnection.URL?.Ref }; } @@ -724,8 +724,8 @@ void ParseCookies (AndroidHttpResponseMessage ret, Uri connectionUri) void CopyHeaders (HttpURLConnection httpConnection, HttpResponseMessage response) { - IDictionary > headers = httpConnection.HeaderFields; - foreach (string key in headers.Keys) { + var headers = httpConnection.HeaderFields; + foreach (var key in headers!.Keys) { if (key == null) // First header entry has null key, it corresponds to the response message continue; @@ -761,7 +761,7 @@ protected virtual Task SetupRequest (HttpRequestMessage request, HttpURLConnecti /// /// The key store. /// Key store to configure. - protected virtual KeyStore ConfigureKeyStore (KeyStore keyStore) + protected virtual KeyStore? ConfigureKeyStore (KeyStore? keyStore) { AssertSelf (); @@ -777,7 +777,7 @@ protected virtual KeyStore ConfigureKeyStore (KeyStore keyStore) /// /// The key manager factory or null. /// Key store. - protected virtual KeyManagerFactory ConfigureKeyManagerFactory (KeyStore keyStore) + protected virtual KeyManagerFactory? ConfigureKeyManagerFactory (KeyStore? keyStore) { AssertSelf (); @@ -794,14 +794,14 @@ protected virtual KeyManagerFactory ConfigureKeyManagerFactory (KeyStore keyStor /// /// The trust manager factory. /// Key store. - protected virtual TrustManagerFactory ConfigureTrustManagerFactory (KeyStore keyStore) + protected virtual TrustManagerFactory? ConfigureTrustManagerFactory (KeyStore? keyStore) { AssertSelf (); return null; } - void AppendEncoding (string encoding, ref List list) + void AppendEncoding (string encoding, ref List ? list) { if (list == null) list = new List (); @@ -816,7 +816,7 @@ void AppendEncoding (string encoding, ref List list) throw new ArgumentNullException (nameof (conn)); var httpConnection = conn.JavaCast (); if (httpConnection == null) - throw new InvalidOperationException ($"Unsupported URL scheme {conn.URL.Protocol}"); + throw new InvalidOperationException ($"Unsupported URL scheme {conn.URL?.Protocol}"); httpConnection.RequestMethod = request.Method.ToString (); @@ -827,7 +827,7 @@ void AppendEncoding (string encoding, ref List list) AddHeaders (httpConnection, request.Content.Headers); AddHeaders (httpConnection, request.Headers); - List accept_encoding = null; + List ? accept_encoding = null; decompress_here = false; if ((AutomaticDecompression & DecompressionMethods.GZip) != 0) { @@ -872,17 +872,17 @@ void AppendEncoding (string encoding, ref List list) /// /// Instance of SSLSocketFactory ready to use with the HTTPS connection. /// HTTPS connection to return socket factory for - protected virtual SSLSocketFactory ConfigureCustomSSLSocketFactory (HttpsURLConnection connection) + protected virtual SSLSocketFactory? ConfigureCustomSSLSocketFactory (HttpsURLConnection connection) { return null; } - void SetupSSL (HttpsURLConnection httpsConnection) + void SetupSSL (HttpsURLConnection? httpsConnection) { if (httpsConnection == null) return; - SSLSocketFactory socketFactory = ConfigureCustomSSLSocketFactory (httpsConnection); + var socketFactory = ConfigureCustomSSLSocketFactory (httpsConnection); if (socketFactory != null) { httpsConnection.SSLSocketFactory = socketFactory; return; @@ -895,20 +895,20 @@ void SetupSSL (HttpsURLConnection httpsConnection) return; } - KeyStore keyStore = KeyStore.GetInstance (KeyStore.DefaultType); - keyStore.Load (null, null); + var keyStore = KeyStore.GetInstance (KeyStore.DefaultType); + keyStore?.Load (null, null); bool gotCerts = TrustedCerts?.Count > 0; if (gotCerts) { - for (int i = 0; i < TrustedCerts.Count; i++) { + for (int i = 0; i < TrustedCerts!.Count; i++) { Certificate cert = TrustedCerts [i]; if (cert == null) continue; - keyStore.SetCertificateEntry ($"ca{i}", cert); + keyStore?.SetCertificateEntry ($"ca{i}", cert); } } keyStore = ConfigureKeyStore (keyStore); - KeyManagerFactory kmf = ConfigureKeyManagerFactory (keyStore); - TrustManagerFactory tmf = ConfigureTrustManagerFactory (keyStore); + var kmf = ConfigureKeyManagerFactory (keyStore); + var tmf = ConfigureTrustManagerFactory (keyStore); if (tmf == null) { // If there are no certs and no trust manager factory, we can't use a custom manager @@ -918,35 +918,35 @@ void SetupSSL (HttpsURLConnection httpsConnection) return; tmf = TrustManagerFactory.GetInstance (TrustManagerFactory.DefaultAlgorithm); - tmf.Init (keyStore); + tmf?.Init (keyStore); } - SSLContext context = SSLContext.GetInstance ("TLS"); - context.Init (kmf?.GetKeyManagers (), tmf.GetTrustManagers (), null); - httpsConnection.SSLSocketFactory = context.SocketFactory; + var context = SSLContext.GetInstance ("TLS"); + context?.Init (kmf?.GetKeyManagers (), tmf?.GetTrustManagers (), null); + httpsConnection.SSLSocketFactory = context?.SocketFactory; } void HandlePreAuthentication (HttpURLConnection httpConnection) { - AuthenticationData data = PreAuthenticationData; + var data = PreAuthenticationData; if (!PreAuthenticate || data == null) return; - ICredentials creds = data.UseProxyAuthentication ? Proxy?.Credentials : Credentials; + var creds = data.UseProxyAuthentication ? Proxy?.Credentials : Credentials; if (creds == null) { if (Logger.LogNet) Logger.Log (LogLevel.Info, LOG_APP, $"Authentication using scheme {data.Scheme} requested but no credentials found. No authentication will be performed"); return; } - IAndroidAuthenticationModule auth = data.Scheme == AuthenticationScheme.Unsupported ? data.AuthModule : authModules.Find (m => m?.Scheme == data.Scheme); + var auth = data.Scheme == AuthenticationScheme.Unsupported ? data.AuthModule : authModules.Find (m => m?.Scheme == data.Scheme); if (auth == null) { if (Logger.LogNet) Logger.Log (LogLevel.Info, LOG_APP, $"Authentication module for scheme '{data.Scheme}' not found. No authentication will be performed"); return; } - Authorization authorization = auth.Authenticate (data.Challenge, httpConnection, creds); + Authorization authorization = auth.Authenticate (data.Challenge!, httpConnection, creds); if (authorization == null) { if (Logger.LogNet) Logger.Log (LogLevel.Info, LOG_APP, $"Authorization module {auth.GetType ()} for scheme {data.Scheme} returned no authorization"); diff --git a/src/Mono.Android/Xamarin.Android.Net/AndroidHttpResponseMessage.cs b/src/Mono.Android/Xamarin.Android.Net/AndroidHttpResponseMessage.cs index 7d78e841c44..504ab19bebc 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AndroidHttpResponseMessage.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AndroidHttpResponseMessage.cs @@ -11,14 +11,14 @@ namespace Xamarin.Android.Net /// public class AndroidHttpResponseMessage : HttpResponseMessage { - URL javaUrl; - HttpURLConnection httpConnection; + URL? javaUrl; + HttpURLConnection? httpConnection; /// /// Set to the same value as . /// /// The requested authentication. - public IList RequestedAuthentication { get; internal set; } + public IList ? RequestedAuthentication { get; internal set; } /// /// Set to the same value as diff --git a/src/Mono.Android/Xamarin.Android.Net/AuthDigestHeaderParser.cs b/src/Mono.Android/Xamarin.Android.Net/AuthDigestHeaderParser.cs index 22c7d0ddde2..bff96f837fd 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AuthDigestHeaderParser.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AuthDigestHeaderParser.cs @@ -29,7 +29,7 @@ sealed class AuthDigestHeaderParser const string ALGORITHM = "algorithm"; const string QOP_ = "qop"; - static readonly Dictionary keywords = new Dictionary (StringComparer.OrdinalIgnoreCase) { + static readonly Dictionary keywords = new Dictionary (StringComparer.OrdinalIgnoreCase) { [REALM] = null, [OPAQUE] = null, [NONCE] = null, @@ -41,29 +41,29 @@ sealed class AuthDigestHeaderParser int length; int pos; - public string Realm { + public string? Realm { get { return keywords [REALM]; } } - public string Opaque { + public string? Opaque { get { return keywords [OPAQUE]; } } - public string Nonce { + public string? Nonce { get { return keywords [NONCE]; } } - public string Algorithm { + public string? Algorithm { get { return keywords [ALGORITHM]; } } - public string QOP { + public string? QOP { get { return keywords [QOP_]; } } - public AuthDigestHeaderParser (string header) + public AuthDigestHeaderParser (string? header) { - this.header = header?.Trim (); + this.header = header?.Trim () ?? string.Empty; } public bool Parse () @@ -74,7 +74,7 @@ public bool Parse () pos = "digest".Length; length = header.Length; while (pos < length) { - string key, value; + string? key, value; if (!GetKeywordAndValue (out key, out value)) return false; @@ -117,9 +117,8 @@ string GetKey () return header.Substring (begin, pos - begin).Trim ().ToLowerInvariant (); } - bool GetKeywordAndValue (out string key, out string value) + bool GetKeywordAndValue (out string key, out string? value) { - key = null; value = null; key = GetKey (); if (pos >= length) diff --git a/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs b/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs index d21c4d8aebb..455d7fc831e 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AuthDigestSession.cs @@ -30,27 +30,27 @@ sealed class AuthDigestSession DateTime lastUse = DateTime.UtcNow; int _nc = 1; - HashAlgorithm hash; - AuthDigestHeaderParser parser; - string _cnonce; + HashAlgorithm? hash; + AuthDigestHeaderParser? parser; + string? _cnonce; - public string Algorithm { + public string? Algorithm { get { return parser?.Algorithm; } } - public string Realm { + public string? Realm { get { return parser?.Realm; } } - public string Nonce { + public string? Nonce { get { return parser?.Nonce; } } - public string Opaque { + public string? Opaque { get { return parser?.Opaque; } } - public string QOP { + public string? QOP { get { return parser?.QOP; } } @@ -85,7 +85,7 @@ public bool Parse (string challenge) return true; } - string HashToHexString (string toBeHashed) + string? HashToHexString (string toBeHashed) { if (hash == null) return null; @@ -99,7 +99,7 @@ string HashToHexString (string toBeHashed) return sb.ToString (); } - string HA1 (string username, string password) + string? HA1 (string username, string password) { string ha1 = $"{username}:{Realm}:{password}"; if (String.Compare (Algorithm, "md5-sess", StringComparison.OrdinalIgnoreCase) == 0) @@ -107,9 +107,9 @@ string HA1 (string username, string password) return HashToHexString (ha1); } - string HA2 (HttpURLConnection webRequest) + string? HA2 (HttpURLConnection webRequest) { - var uri = new Uri (webRequest.URL.ToString ()); + var uri = new Uri (webRequest.URL?.ToString ()!); string ha2 = $"{webRequest.RequestMethod}:{uri.PathAndQuery}"; if (QOP == "auth-int") { // TODO @@ -118,7 +118,7 @@ string HA2 (HttpURLConnection webRequest) return HashToHexString (ha2); } - string Response (string username, string password, HttpURLConnection webRequest) + string? Response (string username, string password, HttpURLConnection webRequest) { string response = $"{HA1 (username, password)}:{Nonce}:"; if (QOP != null) @@ -127,7 +127,7 @@ string Response (string username, string password, HttpURLConnection webRequest) return HashToHexString (response); } - public Authorization Authenticate (HttpURLConnection request, ICredentials credentials) + public Authorization? Authenticate (HttpURLConnection request, ICredentials credentials) { if (parser == null) throw new InvalidOperationException (); @@ -135,7 +135,7 @@ public Authorization Authenticate (HttpURLConnection request, ICredentials crede return null; lastUse = DateTime.Now; - var uri = new Uri (request.URL.ToString ()); + var uri = new Uri (request.URL?.ToString ()!); 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 6a82c3281f6..92052d41eb9 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AuthModuleBasic.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AuthModuleBasic.cs @@ -12,36 +12,36 @@ sealed class AuthModuleBasic : IAndroidAuthenticationModule public string AuthenticationType { get; } = "Basic"; public bool CanPreAuthenticate { get; } = true; - public Authorization Authenticate (string challenge, HttpURLConnection request, ICredentials credentials) + public Authorization? Authenticate (string challenge, HttpURLConnection request, ICredentials credentials) { - string header = challenge?.Trim (); + var header = challenge?.Trim (); if (credentials == null || String.IsNullOrEmpty (header)) return null; - if (header.IndexOf ("basic", StringComparison.OrdinalIgnoreCase) == -1) + if (header?.IndexOf ("basic", StringComparison.OrdinalIgnoreCase) == -1) return null; return InternalAuthenticate (request, credentials); } - public Authorization PreAuthenticate (HttpURLConnection request, ICredentials credentials) + public Authorization? PreAuthenticate (HttpURLConnection request, ICredentials credentials) { return InternalAuthenticate (request, credentials); } - Authorization InternalAuthenticate (HttpURLConnection request, ICredentials credentials) + Authorization? InternalAuthenticate (HttpURLConnection request, ICredentials credentials) { 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; if (String.IsNullOrEmpty (cred.UserName)) return null; - string domain = cred.Domain?.Trim (); + var domain = cred.Domain?.Trim (); string response = String.Empty; // If domain is set, MS sends "domain\user:password". diff --git a/src/Mono.Android/Xamarin.Android.Net/AuthModuleDigest.cs b/src/Mono.Android/Xamarin.Android.Net/AuthModuleDigest.cs index c51f5945ce7..765f83d6d05 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AuthModuleDigest.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AuthModuleDigest.cs @@ -37,7 +37,7 @@ static void CheckExpired (int count) DateTime t = DateTime.MaxValue; DateTime now = DateTime.Now; - List list = null; + List ? list = null; foreach (KeyValuePair kvp in cache) { AuthDigestSession elem = kvp.Value; if (elem.LastUse < t && (elem.LastUse - now).Ticks > TimeSpan.TicksPerMinute * 10) { @@ -55,7 +55,7 @@ static void CheckExpired (int count) } } - public Authorization Authenticate (string challenge, HttpURLConnection request, ICredentials credentials) + public Authorization? Authenticate (string challenge, HttpURLConnection request, ICredentials credentials) { if (credentials == null || challenge == null) { Logger.Log (LogLevel.Info, LOG_APP, "No credentials or no challenge"); @@ -74,16 +74,16 @@ public Authorization Authenticate (string challenge, HttpURLConnection request, return null; } - var uri = new Uri (request.URL.ToString ()); - int hashcode = uri.GetHashCode () ^ credentials.GetHashCode () ^ currDS.Nonce.GetHashCode (); - AuthDigestSession ds = null; + var uri = new Uri (request.URL?.ToString ()!); + int hashcode = uri.GetHashCode () ^ credentials.GetHashCode () ^ (currDS.Nonce?.GetHashCode () ?? 1); + AuthDigestSession? ds = null; bool addDS = false; if (!Cache.TryGetValue (hashcode, out ds) || ds == null) addDS = true; if (addDS) ds = currDS; - else if (!ds.Parse (challenge)) { + else if (!ds!.Parse (challenge)) { Logger.Log (LogLevel.Info, LOG_APP, "Current DS failed to parse the challenge"); return null; } @@ -94,16 +94,16 @@ public Authorization Authenticate (string challenge, HttpURLConnection request, return ds.Authenticate (request, credentials); } - public Authorization PreAuthenticate (HttpURLConnection request, ICredentials credentials) + public Authorization? PreAuthenticate (HttpURLConnection request, ICredentials credentials) { if (request == null || credentials == null) { Logger.Log (LogLevel.Info, LOG_APP, "No credentials or no challenge"); return null; } - var uri = new Uri (request.URL.ToString ()); + var uri = new Uri (request.URL?.ToString ()!); int hashcode = uri.GetHashCode () ^ credentials.GetHashCode (); - AuthDigestSession ds = null; + AuthDigestSession? ds = null; if (!Cache.TryGetValue (hashcode, out ds) || ds == null) return null; diff --git a/src/Mono.Android/Xamarin.Android.Net/AuthenticationData.cs b/src/Mono.Android/Xamarin.Android.Net/AuthenticationData.cs index 3bbcae5fdae..d631fefb09e 100644 --- a/src/Mono.Android/Xamarin.Android.Net/AuthenticationData.cs +++ b/src/Mono.Android/Xamarin.Android.Net/AuthenticationData.cs @@ -18,7 +18,7 @@ public class AuthenticationData /// authentication module () /// /// The challenge. - public string Challenge { get; internal set; } + public string? Challenge { get; internal set; } /// /// Indicates whether authentication performed using data in this instance should be done for the end server or a proxy. If instance of @@ -34,6 +34,6 @@ public class AuthenticationData /// in the property. /// /// The auth module. - public IAndroidAuthenticationModule AuthModule { get; set; } + public IAndroidAuthenticationModule? AuthModule { get; set; } } } diff --git a/src/Mono.Android/Xamarin.Android.Net/OldAndroidSSLSocketFactory.cs b/src/Mono.Android/Xamarin.Android.Net/OldAndroidSSLSocketFactory.cs index 14bc7ad850c..3b03cc42860 100644 --- a/src/Mono.Android/Xamarin.Android.Net/OldAndroidSSLSocketFactory.cs +++ b/src/Mono.Android/Xamarin.Android.Net/OldAndroidSSLSocketFactory.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using Java.Net; using Javax.Net.Ssl; @@ -9,48 +10,49 @@ namespace Xamarin.Android.Net // class OldAndroidSSLSocketFactory : SSLSocketFactory { - readonly SSLSocketFactory factory = (SSLSocketFactory)Default; + readonly SSLSocketFactory? factory = (SSLSocketFactory?)Default; - public override string[] GetDefaultCipherSuites () + public override string[]? GetDefaultCipherSuites () { - return factory.GetDefaultCipherSuites (); + return factory?.GetDefaultCipherSuites (); } - public override string[] GetSupportedCipherSuites () + public override string[]? GetSupportedCipherSuites () { - return factory.GetSupportedCipherSuites (); + return factory?.GetSupportedCipherSuites (); } - public override Socket CreateSocket (InetAddress address, int port, InetAddress localAddress, int localPort) + public override Socket? CreateSocket (InetAddress? address, int port, InetAddress? localAddress, int localPort) { - return EnableTlsOnSocket (factory.CreateSocket (address, port, localAddress, localPort)); + return EnableTlsOnSocket (factory?.CreateSocket (address, port, localAddress, localPort)); } - public override Socket CreateSocket (InetAddress host, int port) + public override Socket? CreateSocket (InetAddress? host, int port) { - return EnableTlsOnSocket (factory.CreateSocket (host, port)); + return EnableTlsOnSocket (factory?.CreateSocket (host, port)); } - public override Socket CreateSocket (string host, int port, InetAddress localHost, int localPort) + public override Socket? CreateSocket (string? host, int port, InetAddress? localHost, int localPort) { - return EnableTlsOnSocket (factory.CreateSocket (host, port, localHost, localPort)); + return EnableTlsOnSocket (factory?.CreateSocket (host, port, localHost, localPort)); } - public override Socket CreateSocket (string host, int port) + public override Socket? CreateSocket (string? host, int port) { - return EnableTlsOnSocket (factory.CreateSocket (host, port)); + return EnableTlsOnSocket (factory?.CreateSocket (host, port)); } - public override Socket CreateSocket (Socket s, string host, int port, bool autoClose) + public override Socket? CreateSocket (Socket? s, string? host, int port, bool autoClose) { - return EnableTlsOnSocket (factory.CreateSocket (s, host, port, autoClose)); + return EnableTlsOnSocket (factory?.CreateSocket (s, host, port, autoClose)); } - public override Socket CreateSocket () + public override Socket? CreateSocket () { - return EnableTlsOnSocket (factory.CreateSocket ()); + return EnableTlsOnSocket (factory?.CreateSocket ()); } - private Socket EnableTlsOnSocket (Socket socket) + [return: NotNullIfNotNull ("socket")] + private Socket? EnableTlsOnSocket (Socket? socket) { if (socket is SSLSocket sslSocket) { sslSocket.SetEnabledProtocols (sslSocket.GetSupportedProtocols ()); diff --git a/src/Mono.Android/metadata b/src/Mono.Android/metadata index 4b0060e47fd..111d4ef06fb 100644 --- a/src/Mono.Android/metadata +++ b/src/Mono.Android/metadata @@ -1618,4 +1618,14 @@ Use the AndroidX Preference Library for consistent behavior across all devices. Use the AndroidX Preference Library for consistent behavior across all devices. + + false + false + false + + + true + true + true + true diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs index 5bac5a484a3..02df8a915e3 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs @@ -146,6 +146,22 @@ void UpdateRegistrationSwitch (MethodDefinition method, MethodReference[] switch instructions.Clear (); + var typeNullable = GetType ("mscorlib", "System.Nullable`1"); + var methodGetValueOrDefault = GetMethod (typeNullable, "GetValueOrDefault"); + var genericTypeNullable = new GenericInstanceType (typeNullable); + genericTypeNullable.GenericArguments.Add (GetType ("mscorlib", "System.Int32")); + + var typeIdxVariable = new VariableDefinition (module.ImportReference (genericTypeNullable)); + method.Body.Variables.Clear (); + method.Body.Variables.Add (typeIdxVariable); + + instructions.Add (Instruction.Create (OpCodes.Ldarg_1)); + instructions.Add (Instruction.Create (OpCodes.Stloc_0)); + instructions.Add (Instruction.Create (OpCodes.Ldloca_S, typeIdxVariable)); + + var genericMethodGetValueOrDefault = CreateGenericMethodReference (methodGetValueOrDefault, genericTypeNullable); + instructions.Add (Instruction.Create (OpCodes.Call, module.ImportReference (genericMethodGetValueOrDefault))); + for (var i = 0; i < switchMethods.Length; i++) switchInstructions [i] = Instruction.Create (OpCodes.Ldtoken, switchMethods [i].DeclaringType); @@ -153,7 +169,6 @@ void UpdateRegistrationSwitch (MethodDefinition method, MethodReference[] switch var methodGetTypeFromHandle = GetMethod ("mscorlib", "System.Type", "GetTypeFromHandle", new string[] { "System.RuntimeTypeHandle" }); var callDelegateStart = Instruction.Create (OpCodes.Call, module.ImportReference (methodGetTypeFromHandle)); - instructions.Add (Instruction.Create (OpCodes.Ldarg_1)); instructions.Add (Instruction.Create (OpCodes.Switch, switchInstructions)); for (var i = 0; i < switchMethods.Length; i++) { diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ActivityAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ActivityAttribute.cs index 29039602135..93bb74a7529 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ActivityAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ActivityAttribute.cs @@ -17,7 +17,7 @@ public ActivityAttribute () { } - public string Name {get; set;} + public string? Name {get; set;} #if ANDROID_20 public bool AllowEmbedded {get; set;} @@ -28,14 +28,14 @@ public ActivityAttribute () public bool AutoRemoveFromRecents {get; set;} #endif #if ANDROID_20 - public string Banner {get; set;} + public string? Banner {get; set;} #endif public bool ClearTaskOnLaunch {get; set;} #if ANDROID_26 - public string ColorMode {get; set;} + public string? ColorMode {get; set;} #endif public ConfigChanges ConfigurationChanges {get; set;} - public string Description {get; set;} + public string? Description {get; set;} #if ANDROID_24 public bool DirectBootAware {get; set;} #endif @@ -43,7 +43,7 @@ public ActivityAttribute () public DocumentLaunchMode DocumentLaunchMode {get; set;} #endif #if ANDROID_24 - public string EnableVrMode {get; set;} + public string? EnableVrMode {get; set;} #endif public bool Enabled {get; set;} public bool ExcludeFromRecents {get; set;} @@ -54,15 +54,15 @@ public ActivityAttribute () public bool HardwareAccelerated {get; set;} #endif [Category ("@drawable;@mipmap")] - public string Icon {get; set;} + public string? Icon {get; set;} [Category ("@string")] - public string Label {get; set;} + public string? Label {get; set;} public LaunchMode LaunchMode {get; set;} #if ANDROID_23 - public string LockTaskMode {get; set;} + public string? LockTaskMode {get; set;} #endif #if ANDROID_11 - public string Logo {get; set;} + public string? Logo {get; set;} #endif #if ANDROID_17 [Obsolete ("There is no //activity/@android:layoutDirection attribute. This was a mistake. " + @@ -79,13 +79,13 @@ public ActivityAttribute () public bool MultiProcess {get; set;} public bool NoHistory {get; set;} #if ANDROID_16 - public Type ParentActivity {get; set;} + public Type? ParentActivity {get; set;} #endif - public string Permission {get; set;} + public string? Permission {get; set;} #if ANDROID_21 public ActivityPersistableMode PersistableMode {get; set;} #endif - public string Process {get; set;} + public string? Process {get; set;} #if ANDROID_26 public ConfigChanges RecreateOnConfigChanges {get; set;} #endif @@ -103,7 +103,7 @@ public ActivityAttribute () #endif #if ANDROID_25 [Category ("@drawable;@mipmap")] - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif #if ANDROID_23 public bool ShowForAllUsers {get; set;} @@ -123,9 +123,9 @@ public ActivityAttribute () public bool SingleUser {get; set;} #endif public bool StateNotNeeded {get; set;} - public string TaskAffinity {get; set;} + public string? TaskAffinity {get; set;} [Category ("@style")] - public string Theme {get; set;} + public string? Theme {get; set;} #if ANDROID_27 public bool TurnScreenOn {get; set;} #endif diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ApplicationAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ApplicationAttribute.cs index b24fd04e82d..0b85f04ffbf 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ApplicationAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ApplicationAttribute.cs @@ -16,23 +16,23 @@ public ApplicationAttribute () { } - public string Name {get; set;} + public string? Name {get; set;} public bool AllowBackup {get; set;} public bool AllowClearUserData {get; set;} public bool AllowTaskReparenting {get; set;} #if ANDROID_8 - public Type BackupAgent {get; set;} + public Type? BackupAgent {get; set;} #endif #if ANDROID_24 public bool BackupInForeground {get; set;} #endif #if ANDROID_21 - public string Banner {get; set;} + public string? Banner {get; set;} #endif public bool Debuggable {get; set;} [Category ("@string")] - public string Description {get; set;} + public string? Description {get; set;} #if ANDROID_24 public bool DirectBootAware {get; set;} #endif @@ -49,41 +49,41 @@ public ApplicationAttribute () #endif public bool HasCode {get; set;} [Category ("@drawable;@mipmap")] - public string Icon {get; set;} + public string? Icon {get; set;} public bool KillAfterRestore {get; set;} #if ANDROID_11 public bool LargeHeap {get; set;} #endif [Category ("@string")] - public string Label {get; set;} + public string? Label {get; set;} #if ANDROID_11 [Category ("@drawable;@mipmap")] - public string Logo {get; set;} + public string? Logo {get; set;} #endif - public Type ManageSpaceActivity {get; set;} + public Type? ManageSpaceActivity {get; set;} #if ANDROID_26 - public string NetworkSecurityConfig {get; set;} + public string? NetworkSecurityConfig {get; set;} #endif - public string Permission {get; set;} + public string? Permission {get; set;} public bool Persistent {get; set;} - public string Process {get; set;} + public string? Process {get; set;} #if ANDROID_18 - public string RequiredAccountType {get; set;} + public string? RequiredAccountType {get; set;} #endif public bool RestoreAnyVersion {get; set;} #if ANDROID_18 - public string RestrictedAccountType {get; set;} + public string? RestrictedAccountType {get; set;} #endif #if ANDROID_25 [Category ("@drawable;@mipmap")] - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif #if ANDROID_17 public bool SupportsRtl {get; set;} #endif - public string TaskAffinity {get; set;} + public string? TaskAffinity {get; set;} [Category ("@style")] - public string Theme {get; set;} + public string? Theme {get; set;} #if ANDROID_14 public UiOptions UiOptions {get; set;} #endif diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.App/InstrumentationAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.App/InstrumentationAttribute.cs index fe64232419e..c90af4a5660 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.App/InstrumentationAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.App/InstrumentationAttribute.cs @@ -16,17 +16,17 @@ public InstrumentationAttribute () public bool FunctionalTest {get; set;} public bool HandleProfiling {get; set;} [Category ("@drawable;@mipmap")] - public string Icon {get; set;} + public string? Icon {get; set;} [Category ("@string")] - public string Label {get; set;} - public string Name {get; set;} + public string? Label {get; set;} + public string? Name {get; set;} #if ANDROID_25 [Category ("@drawable;@mipmap")] - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif - public string TargetPackage {get; set;} + public string? TargetPackage {get; set;} #if ANDROID_26 - public string TargetProcesses {get; set;} + public string? TargetProcesses {get; set;} #endif } } diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.App/LayoutAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.App/LayoutAttribute.cs index bf7a7983d37..98394bb0912 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.App/LayoutAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.App/LayoutAttribute.cs @@ -1,4 +1,4 @@ -#if ANDROID_24 +#if ANDROID_24 using System; using Android.Content.PM; @@ -13,11 +13,11 @@ namespace Android.App Inherited = false)] public sealed partial class LayoutAttribute : Attribute { - public string DefaultWidth { get; set; } - public string DefaultHeight { get; set; } - public string Gravity { get; set; } - public string MinHeight { get; set; } - public string MinWidth { get; set; } + public string? DefaultWidth { get; set; } + public string? DefaultHeight { get; set; } + public string? Gravity { get; set; } + public string? MinHeight { get; set; } + public string? MinWidth { get; set; } } } #endif diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ServiceAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ServiceAttribute.cs index 88bbd404a4e..d6356650351 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.App/ServiceAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.App/ServiceAttribute.cs @@ -16,7 +16,7 @@ public ServiceAttribute () { } - public string Name {get; set;} + public string? Name {get; set;} #if ANDROID_24 public bool DirectBootAware {get; set;} @@ -27,17 +27,17 @@ public ServiceAttribute () public ForegroundService ForegroundServiceType {get; set;} #endif [Category ("@drawable;@mipmap")] - public string Icon {get; set;} + public string? Icon {get; set;} #if ANDROID_16 public bool IsolatedProcess {get; set;} #endif [Category ("@string")] - public string Label {get; set;} - public string Permission {get; set;} - public string Process {get; set;} + public string? Label {get; set;} + public string? Permission {get; set;} + public string? Process {get; set;} #if ANDROID_25 [Category ("@drawable;@mipmap")] - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif } } diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.Content/BroadcastReceiverAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.Content/BroadcastReceiverAttribute.cs index f11e59b5e40..aa134b6e593 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.Content/BroadcastReceiverAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.Content/BroadcastReceiverAttribute.cs @@ -17,17 +17,17 @@ public BroadcastReceiverAttribute () public bool Enabled {get; set;} public bool Exported {get; set;} [Category ("@string")] - public string Description {get; set;} + public string? Description {get; set;} [Category ("@drawable;@mipmap")] - public string Icon {get; set;} + public string? Icon {get; set;} [Category ("@string")] - public string Label {get; set;} - public string Name {get; set;} - public string Permission {get; set;} - public string Process {get; set;} + public string? Label {get; set;} + public string? Name {get; set;} + public string? Permission {get; set;} + public string? Process {get; set;} #if ANDROID_25 [Category ("@drawable;@mipmap")] - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif } } diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.Content/ContentProviderAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.Content/ContentProviderAttribute.cs index d10da9e9c0f..30c30bdfdcd 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.Content/ContentProviderAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.Content/ContentProviderAttribute.cs @@ -26,20 +26,20 @@ public ContentProviderAttribute (string[] authorities) public bool Exported {get; set;} public bool GrantUriPermissions {get; set;} [Category ("@drawable;@mipmap")] - public string Icon {get; set;} + public string? Icon {get; set;} public int InitOrder {get; set;} [Category ("@string")] - public string Label {get; set;} + public string? Label {get; set;} public bool MultiProcess {get; set;} - public string Name {get; set;} - public string Permission {get; set;} - public string Process {get; set;} - public string ReadPermission {get; set;} + public string? Name {get; set;} + public string? Permission {get; set;} + public string? Process {get; set;} + public string? ReadPermission {get; set;} #if ANDROID_25 [Category ("@drawable;@mipmap")] - public string RoundIcon {get; set;} + public string? RoundIcon {get; set;} #endif public bool Syncable {get; set;} - public string WritePermission {get; set;} + public string? WritePermission {get; set;} } } diff --git a/src/Xamarin.Android.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs index ec1ea955ed4..819fb1c4a0e 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs @@ -8,9 +8,9 @@ namespace Android.Runtime { #endif // !JCW_ONLY_TYPE_NAMES sealed class RegisterAttribute : Attribute, Java.Interop.IJniNameProviderAttribute { - string connector; + string? connector; string name; - string signature; + string? signature; public RegisterAttribute (string name) { @@ -24,7 +24,7 @@ public RegisterAttribute (string name, string signature, string connector) this.signature = signature; } - public string Connector { + public string? Connector { get { return connector; } set { connector = value; } } @@ -34,7 +34,7 @@ public string Name { set { name = value; } } - public string Signature { + public string? Signature { get { return signature; } set { signature = value; } } diff --git a/src/Xamarin.Android.NamingCustomAttributes/Java.Interop/ExportAttribute.cs b/src/Xamarin.Android.NamingCustomAttributes/Java.Interop/ExportAttribute.cs index 1c11925041d..8c5efd9cf32 100644 --- a/src/Xamarin.Android.NamingCustomAttributes/Java.Interop/ExportAttribute.cs +++ b/src/Xamarin.Android.NamingCustomAttributes/Java.Interop/ExportAttribute.cs @@ -20,10 +20,10 @@ public ExportAttribute (string name) Name = name; } - public string Name {get; private set;} - public string SuperArgumentsString {get; set;} - public Type [] Throws {get; set;} - internal string [] ThrownNames {get; set;} // msbuild internal use + public string? Name {get; private set;} + public string? SuperArgumentsString {get; set;} + public Type []? Throws {get; set;} + internal string []? ThrownNames {get; set;} // msbuild internal use } } diff --git a/src/Xamarin.Android.Tools.JavadocImporter/Xamarin.Android.Tools.JavadocImporter.csproj b/src/Xamarin.Android.Tools.JavadocImporter/Xamarin.Android.Tools.JavadocImporter.csproj index a703e0b4db9..4af28f01ba8 100644 --- a/src/Xamarin.Android.Tools.JavadocImporter/Xamarin.Android.Tools.JavadocImporter.csproj +++ b/src/Xamarin.Android.Tools.JavadocImporter/Xamarin.Android.Tools.JavadocImporter.csproj @@ -5,6 +5,7 @@ true false true + 8.0 @@ -28,6 +29,9 @@ Crc64.Table.cs + + NullableAttributes.cs + diff --git a/tests/api-compatibility/api-compat-exclude-attributes.txt b/tests/api-compatibility/api-compat-exclude-attributes.txt index 070aa5d7953..6680918dbbf 100644 --- a/tests/api-compatibility/api-compat-exclude-attributes.txt +++ b/tests/api-compatibility/api-compat-exclude-attributes.txt @@ -4,4 +4,7 @@ T:Java.Interop.JavaTypeParametersAttribute T:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute T:System.Runtime.CompilerServices.AsyncStateMachineAttribute -T:System.Runtime.CompilerServices.IteratorStateMachineAttribute \ No newline at end of file +T:System.Runtime.CompilerServices.IteratorStateMachineAttribute + +T:System.Runtime.CompilerServices.NullableAttribute +T:System.Runtime.CompilerServices.NullableContextAttribute