maui icon indicating copy to clipboard operation
maui copied to clipboard

Compiler warning when using deprecated API on old version of Android

Open pekspro opened this issue 2 years ago • 1 comments

Description

In Android, I want to call PackageManager.GetPackageInfo. From Android 33 this is deprecated and replaced with an overload. So, I check which version to use:

PackageManager manager = PackageManager!;
PackageInfo info;

if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
    info = manager.GetPackageInfo(PackageName!, PackageManager.PackageInfoFlags.Of((int)PackageInfoFlags.MetaData));
}
else
{
    info = manager.GetPackageInfo(PackageName!, PackageInfoFlags.MetaData)!;
}

But the compiler says the second call is deprecated, despite it is only used in older version:

warning CS0618: 'PackageManager.GetPackageInfo(string, PackageInfoFlags)' is obsolete: 'deprecated'

I guess this is a bug :-)

Steps to Reproduce

  1. Create a new MAUI app.
  2. In MainActivity.cs, add this code:
protected override void OnResume()
{
    base.OnResume();

    PackageManager manager = PackageManager!;
    PackageInfo info;
    
    if (OperatingSystem.IsAndroidVersionAtLeast(33))
    {
        info = manager.GetPackageInfo(PackageName!, PackageManager.PackageInfoFlags.Of((int)PackageInfoFlags.MetaData));
    }
    else
    {
        info = manager.GetPackageInfo(PackageName!, PackageInfoFlags.MetaData)!;
    }

    string version = info.VersionName!;
}

Link to public reproduction project repository

https://github.com/pekspro/MauiIssues/tree/11319_Compiler_warning_when_using_deprecated_API

Version with bug

7.0 (current)

Last version that worked well

Unknown/Other

Affected platforms

Android

Affected platform versions

Windows 10.0.17763.0, Android 11

Did you find any workaround?

Suppress the warning like this:

if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
    info = manager.GetPackageInfo(PackageName!, PackageManager.PackageInfoFlags.Of((int)PackageInfoFlags.MetaData));
}
else
{
#pragma warning disable 618
    info = manager.GetPackageInfo(PackageName!, PackageInfoFlags.MetaData)!;
#pragma warning restore 618
}

Relevant log output

I found these defintions:

[System.Obsolete("deprecated")]
[Register("getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;", "GetGetPackageInfo_Ljava_lang_String_IHandler")]
public abstract PackageInfo? GetPackageInfo(string packageName, [GeneratedEnum] PM.PackageInfoFlags flags);

[Register("getPackageInfo", "(Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo;", "GetGetPackageInfo_Ljava_lang_String_Landroid_content_pm_PackageManager_PackageInfoFlags_Handler", ApiSince = 33)]
[SupportedOSPlatform("android33.0")]
public virtual PackageInfo GetPackageInfo(string packageName, PackageInfoFlags flags);

[ObsoletedOSPlatform("android33.0")]
[Register("getPackageInfo", "(Landroid/content/pm/VersionedPackage;I)Landroid/content/pm/PackageInfo;", "GetGetPackageInfo_Landroid_content_pm_VersionedPackage_IHandler", ApiSince = 26)]
[SupportedOSPlatform("android26.0")]
public abstract PackageInfo? GetPackageInfo(VersionedPackage versionedPackage, [GeneratedEnum] PM.PackageInfoFlags flags);

[Register("getPackageInfo", "(Landroid/content/pm/VersionedPackage;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo;", "GetGetPackageInfo_Landroid_content_pm_VersionedPackage_Landroid_content_pm_PackageManager_PackageInfoFlags_Handler", ApiSince = 33)]
[SupportedOSPlatform("android33.0")]
public virtual PackageInfo GetPackageInfo(VersionedPackage versionedPackage, PackageInfoFlags flags);

pekspro avatar Nov 13 '22 07:11 pekspro

We've moved this issue to the Backlog milestone. This means that it is not going to be worked on for the coming release. We will reassess the backlog following the current release and consider this item at that time. To learn more about our issue management process and to have better expectation regarding different types of issues you can read our Triage Process.

ghost avatar Nov 14 '22 15:11 ghost

I got a similar warning: CA1416: Validate platform compatibility

Solution:

internal static class AndroidGuard
{
    /// <summary>Guard: Android 11 R (API 30) or greater</summary>
    [SupportedOSPlatformGuard("android30.0")]
    public static bool IsApi30OrGreater { get; } = OperatingSystem.IsAndroidVersionAtLeast(30);
}
if (AndroidGuard.IsApi30OrGreater)
{
    // The analyzer also respects System.Diagnostics.Debug.Assert as a means for 
    // preventing the code from being reached on unsupported platforms.
    System.Diagnostics.Debug.Assert(AndroidGuard.IsApi30OrGreater);

    // Call Android API that requires API 30 or greater...
}

omghb avatar Feb 21 '23 14:02 omghb

Verified this on Visual Studio Enterprise 17.7.0 Preview 1.0. Repro on Android 13.0-API33 with below Project: 11319.zip

image

XamlTest avatar Jun 05 '23 06:06 XamlTest