diff --git a/DeviceTests/DeviceTests.Android/Properties/AndroidManifest.xml b/DeviceTests/DeviceTests.Android/Properties/AndroidManifest.xml index 7d1546089..04e3c1b54 100644 --- a/DeviceTests/DeviceTests.Android/Properties/AndroidManifest.xml +++ b/DeviceTests/DeviceTests.Android/Properties/AndroidManifest.xml @@ -6,11 +6,9 @@ - - + - diff --git a/Samples/Sample.Server.WebAuthenticator/Sample.Server.WebAuthenticator.csproj b/Samples/Sample.Server.WebAuthenticator/Sample.Server.WebAuthenticator.csproj index 1615b2910..9775b3661 100644 --- a/Samples/Sample.Server.WebAuthenticator/Sample.Server.WebAuthenticator.csproj +++ b/Samples/Sample.Server.WebAuthenticator/Sample.Server.WebAuthenticator.csproj @@ -10,7 +10,7 @@ - + diff --git a/Samples/Samples.Android/Properties/AndroidManifest.xml b/Samples/Samples.Android/Properties/AndroidManifest.xml index 2e52e0fbb..0666d3f0b 100644 --- a/Samples/Samples.Android/Properties/AndroidManifest.xml +++ b/Samples/Samples.Android/Properties/AndroidManifest.xml @@ -8,8 +8,6 @@ - - diff --git a/Xamarin.Essentials/AppActions/AppActions.android.cs b/Xamarin.Essentials/AppActions/AppActions.android.cs index 1c4c78361..68b599993 100644 --- a/Xamarin.Essentials/AppActions/AppActions.android.cs +++ b/Xamarin.Essentials/AppActions/AppActions.android.cs @@ -42,6 +42,7 @@ static AppAction ToAppAction(this ShortcutInfo shortcutInfo) => const string extraAppActionTitle = "EXTRA_XE_APP_ACTION_TITLE"; const string extraAppActionSubtitle = "EXTRA_XE_APP_ACTION_SUBTITLE"; const string extraAppActionIcon = "EXTRA_XE_APP_ACTION_ICON"; + internal const string extraAppActionHandled = "EXTRA_XE_APP_ACTION_HANDLED"; internal static AppAction ToAppAction(this Intent intent) => new AppAction( diff --git a/Xamarin.Essentials/FilePicker/FilePicker.android.cs b/Xamarin.Essentials/FilePicker/FilePicker.android.cs index b6a576fd8..2d32912e9 100644 --- a/Xamarin.Essentials/FilePicker/FilePicker.android.cs +++ b/Xamarin.Essentials/FilePicker/FilePicker.android.cs @@ -11,10 +11,6 @@ public static partial class FilePicker { static async Task> PlatformPickAsync(PickOptions options, bool allowMultiple = false) { - // we only need the permission when accessing the file, but it's more natural - // to ask the user first, then show the picker. - await Permissions.EnsureGrantedAsync(); - // Essentials supports >= API 19 where this action is available var action = Intent.ActionOpenDocument; diff --git a/Xamarin.Essentials/MediaPicker/MediaPicker.android.cs b/Xamarin.Essentials/MediaPicker/MediaPicker.android.cs index 2c4a22dfd..261aa9880 100644 --- a/Xamarin.Essentials/MediaPicker/MediaPicker.android.cs +++ b/Xamarin.Essentials/MediaPicker/MediaPicker.android.cs @@ -20,10 +20,6 @@ static Task PlatformPickVideoAsync(MediaPickerOptions options) static async Task PlatformPickAsync(MediaPickerOptions options, bool photo) { - // We only need the permission when accessing the file, but it's more natural - // to ask the user first, then show the picker. - await Permissions.EnsureGrantedAsync(); - var intent = new Intent(Intent.ActionGetContent); intent.SetType(photo ? FileSystem.MimeTypes.ImageAll : FileSystem.MimeTypes.VideoAll); diff --git a/Xamarin.Essentials/Platform/Platform.android.cs b/Xamarin.Essentials/Platform/Platform.android.cs index dd47f40ec..6bbd80d2e 100644 --- a/Xamarin.Essentials/Platform/Platform.android.cs +++ b/Xamarin.Essentials/Platform/Platform.android.cs @@ -110,8 +110,11 @@ public static void OnResume(Activity activity = null) static void CheckAppActions(AndroidIntent intent) { - if (intent?.Action == Intent.ActionAppAction) + if (intent?.Action == Intent.ActionAppAction && !intent.GetBooleanExtra(AppActions.extraAppActionHandled, false)) { + // prevent launch intent getting handled on activity resume + intent.PutExtra(AppActions.extraAppActionHandled, true); + var appAction = intent.ToAppAction(); if (!string.IsNullOrEmpty(appAction?.Id)) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d8b126a75..171fbb91a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -25,35 +25,45 @@ resources: - repository: components type: github name: xamarin/XamarinComponents + ref: refs/heads/main endpoint: xamarin stages: - stage: build displayName: Build Library jobs: - - template: .ci/build.yml@components - parameters: - areaPath: 'DevDiv\Xamarin SDK' - masterBranchName: 'main' - preBuildSteps: - - pwsh: | - $pr = "pr." + $env:SYSTEM_PULLREQUEST_PULLREQUESTNUMBER - $nuget = $env:BASE_VERSION + "-" + $pr + "." + $env:BUILD_NUMBER - Write-Host "Preview label: $pr" - Write-Host "NuGet version: $nuget" - Write-Host "##vso[task.setvariable variable=PREVIEW_LABEL]$pr" - Write-Host "##vso[task.setvariable variable=NUGET_VERSION]$nuget" - displayName: Use a special preview label for PRs - condition: eq(variables['Build.Reason'], 'PullRequest') - - pwsh: | - $tagVersion = $env:BUILD_SOURCEBRANCHNAME - Write-Host "Tag version: $tagVersion" - Write-Host "##vso[task.setvariable variable=NUGET_VERSION]$tagVersion" - displayName: Override version for tags - condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/') - - pwsh: | - Write-Host "##vso[build.updatebuildnumber]$env:NUGET_VERSION" - displayName: Update the build number with a more readable one + - template: .ci/build.v1.yml@components + parameters: + ${{ if eq(variables['System.TeamProject'], 'devdiv') }}: # The AzurePipelines-EO pool is only available in DevDiv + windowsAgentPoolName: AzurePipelines-EO + windowsImage: '' # Override the 'windows-latest' default settings + windowsImageOverride: AzurePipelinesWindows2019compliant + ${{ if ne(variables['System.TeamProject'], 'devdiv') }}: + windowsImage: windows-2019 + areaPath: 'DevDiv\Xamarin SDK' + masterBranchName: 'main' + ${{ if startsWith(variables['Build.SourceBranch'], 'refs/tags/') }}: #we are shipping our product + cakeTarget: ci-release # We just want to build the library and nuget + macosImage: '' # We don't need the macOS build + preBuildSteps: + - pwsh: | + $pr = "pr." + $env:SYSTEM_PULLREQUEST_PULLREQUESTNUMBER + $nuget = $env:BASE_VERSION + "-" + $pr + "." + $env:BUILD_NUMBER + Write-Host "Preview label: $pr" + Write-Host "NuGet version: $nuget" + Write-Host "##vso[task.setvariable variable=PREVIEW_LABEL]$pr" + Write-Host "##vso[task.setvariable variable=NUGET_VERSION]$nuget" + displayName: Use a special preview label for PRs + condition: eq(variables['Build.Reason'], 'PullRequest') + - pwsh: | + $tagVersion = $env:BUILD_SOURCEBRANCHNAME + Write-Host "Tag version: $tagVersion" + Write-Host "##vso[task.setvariable variable=NUGET_VERSION]$tagVersion" + displayName: Override version for tags + condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/') + - pwsh: | + Write-Host "##vso[build.updatebuildnumber]$env:NUGET_VERSION" + displayName: Update the build number with a more readable one - ${{ if eq(variables['System.TeamProject'], 'devdiv') }}: - stage: signing @@ -64,152 +74,172 @@ stages: parameters: condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/') - - stage: devicetests - displayName: Device Tests - dependsOn: [] - jobs: - - job: devicetests_uwp - displayName: UWP - # skip for now - condition: false - pool: - vmImage: windows-2019 - steps: - - script: 'certutil -importpfx $(Build.SourcesDirectory)\DeviceTests\DeviceTests.UWP\DeviceTests.UWP_TemporaryKey.pfx' - displayName: 'Run certutil' - - powershell: | - cd DeviceTests - .\build.ps1 --target=test-uwp-emu --settings_skipverification=true --verbosity=diagnostic - displayName: 'Run Device Tests - UWP' - - task: PublishTestResults@2 - displayName: 'Publish Test Results' - inputs: - testResultsFormat: XUnit - testResultsFiles: '**/xunit-*.xml' - testRunTitle: 'Device Tests - UWP' - - - template: .ci/build.yml@components - parameters: - name: devicetests_ios - runChecks: false - displayName: iOS - publishOutputSuffix: '-ios' - windowsImage: '' - areaPath: $(AREA_PATH) - verbosity: diagnostic - cakeFile: DeviceTests/build.cake - cakeTarget: test-ios-emu - xharness: '1.0.0-prerelease.21620.1' - - - template: .ci/build.yml@components - parameters: - name: devicetests_android_api_21 - runChecks: false - displayName: Android API 21 - publishOutputSuffix: '-android21' - windowsImage: '' - areaPath: $(AREA_PATH) - verbosity: diagnostic - cakeFile: DeviceTests/build.cake - cakeTarget: test-android-emu - cakeExtraArgs: --avd-target="`"system-images;android-21;google_apis;x86`"" - preBuildSteps: - - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-21;google_apis;x86\"" - displayName: Install the Android emulators - - - template: .ci/build.yml@components - parameters: - name: devicetests_android_api_22 - runChecks: false - displayName: Android API 22 - publishOutputSuffix: '-android22' - windowsImage: '' - areaPath: $(AREA_PATH) - verbosity: diagnostic - cakeFile: DeviceTests/build.cake - cakeTarget: test-android-emu - cakeExtraArgs: --avd-target="`"system-images;android-22;google_apis;x86`"" - preBuildSteps: - - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-22;google_apis;x86\"" - displayName: Install the Android emulators - -# - template: .ci/build.yml@components -# parameters: -# name: devicetests_android_api_23 -# runChecks: false -# continueOnError: true -# displayName: Android API 23 -# publishOutputSuffix: '-android23' -# windowsImage: '' -# areaPath: $(AREA_PATH) -# verbosity: diagnostic -# cakeFile: DeviceTests/build.cake -# cakeTarget: test-android-emu -# cakeExtraArgs: --avd-target="`"system-images;android-23;google_apis;x86`"" -# preBuildSteps: -# - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-23;google_apis;x86\"" -# displayName: Install the Android emulators - - - template: .ci/build.yml@components - parameters: - name: devicetests_android_api_24 - runChecks: false - displayName: Android API 24 - publishOutputSuffix: '-android24' - windowsImage: '' - areaPath: $(AREA_PATH) - verbosity: diagnostic - cakeFile: DeviceTests/build.cake - cakeTarget: test-android-emu - cakeExtraArgs: --avd-target="`"system-images;android-24;google_apis;x86`"" - preBuildSteps: - - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-24;google_apis;x86\"" - displayName: Install the Android emulators - - - template: .ci/build.yml@components - parameters: - name: devicetests_android_api_26 - runChecks: false - displayName: Android API 26 - publishOutputSuffix: '-android26' - windowsImage: '' - areaPath: $(AREA_PATH) - verbosity: diagnostic - cakeFile: DeviceTests/build.cake - cakeTarget: test-android-emu - cakeExtraArgs: --avd-target="`"system-images;android-26;google_apis;x86`"" - preBuildSteps: - - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-26;google_apis;x86\"" - displayName: Install the Android emulators - - - template: .ci/build.yml@components + - stage: sbom + displayName: 'Software Bill of Materials' + ${{ if not(startsWith(variables['Build.SourceBranch'], 'refs/tags/')) }}: + dependsOn: [ 'build' ] + ${{ if startsWith(variables['Build.SourceBranch'], 'refs/tags/') }}: + dependsOn: [ 'signing' ] + jobs: + - template: compliance/sbom/job.v1.yml@internal-templates # Software Bill of Materials (SBOM): https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/secure-supply-chain/ado-sbom-generator parameters: - name: devicetests_android_api_29 - runChecks: false - displayName: Android API 29 - publishOutputSuffix: '-android29' - windowsImage: '' - areaPath: $(AREA_PATH) - verbosity: diagnostic - cakeFile: DeviceTests/build.cake - cakeTarget: test-android-emu - cakeExtraArgs: --avd-target="`"system-images;android-29;google_apis;x86`"" - preBuildSteps: - - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-29;google_apis;x86\"" - displayName: Install the Android emulators + artifactNames: ['nuget'] + packageName: 'Xamarin Essentials' + packageFilter: '*.nupkg' + packageVersionRegex: '(?i)^Xamarin.Essentials\.(?\d+\.\d+\.\d+)(.*).nupkg$' - # - template: .ci/build.yml@components - # parameters: - # name: devicetests_android_api_30 - # runChecks: false - # displayName: Android API 30 - # publishOutputSuffix: '-android30' - # windowsImage: '' - # areaPath: $(AREA_PATH) - # verbosity: diagnostic - # cakeFile: DeviceTests/build.cake - # cakeTarget: test-android-emu - # cakeExtraArgs: --avd-target="`"system-images;android-30;google_apis;x86`"" - # preBuildSteps: - # - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-30;google_apis;x86\"" - # displayName: Install the Android emulators + - ${{ if not(startsWith(variables['Build.SourceBranch'], 'refs/tags/')) }}: + - stage: devicetests + displayName: Device Tests + dependsOn: [] + jobs: + - job: devicetests_uwp + displayName: UWP + # skip for now + condition: false + pool: + ${{ if eq(variables['System.TeamProject'], 'devdiv') }}: # The AzurePipelines-EO pool is only available in DevDiv + name: AzurePipelines-EO + demands: + - ImageOverride -equals AzurePipelinesWindows2019compliant + ${{ if ne(variables['System.TeamProject'], 'devdiv') }}: + vmImage: windows-2019 + steps: + - script: 'certutil -importpfx $(Build.SourcesDirectory)\DeviceTests\DeviceTests.UWP\DeviceTests.UWP_TemporaryKey.pfx' + displayName: 'Run certutil' + - powershell: | + cd DeviceTests + .\build.ps1 --target=test-uwp-emu --settings_skipverification=true --verbosity=diagnostic + displayName: 'Run Device Tests - UWP' + - task: PublishTestResults@2 + displayName: 'Publish Test Results' + inputs: + testResultsFormat: XUnit + testResultsFiles: '**/xunit-*.xml' + testRunTitle: 'Device Tests - UWP' + + - template: .ci/build.v1.yml@components + parameters: + name: devicetests_ios + runChecks: false + displayName: iOS + publishOutputSuffix: '-ios' + windowsImage: '' + areaPath: $(AREA_PATH) + verbosity: diagnostic + cakeFile: DeviceTests/build.cake + cakeTarget: test-ios-emu + xharness: '1.0.0-prerelease.21620.1' + + - template: .ci/build.v1.yml@components + parameters: + name: devicetests_android_api_21 + runChecks: false + displayName: Android API 21 + publishOutputSuffix: '-android21' + windowsImage: '' # Mac only + areaPath: $(AREA_PATH) + verbosity: diagnostic + cakeFile: DeviceTests/build.cake + cakeTarget: test-android-emu + cakeExtraArgs: --avd-target="`"system-images;android-21;google_apis;x86`"" + preBuildSteps: + - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-21;google_apis;x86\"" + displayName: Install the Android emulators + + - template: .ci/build.v1.yml@components + parameters: + name: devicetests_android_api_22 + runChecks: false + displayName: Android API 22 + publishOutputSuffix: '-android22' + windowsImage: '' # Mac only + areaPath: $(AREA_PATH) + verbosity: diagnostic + cakeFile: DeviceTests/build.cake + cakeTarget: test-android-emu + cakeExtraArgs: --avd-target="`"system-images;android-22;google_apis;x86`"" + preBuildSteps: + - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-22;google_apis;x86\"" + displayName: Install the Android emulators + +# - template: .ci/build.v1.yml@components +# parameters: +# name: devicetests_android_api_23 +# runChecks: false +# continueOnError: true +# displayName: Android API 23 +# publishOutputSuffix: '-android23' +# windowsImage: '' # Mac only +# areaPath: $(AREA_PATH) +# verbosity: diagnostic +# cakeFile: DeviceTests/build.cake +# cakeTarget: test-android-emu +# cakeExtraArgs: --avd-target="`"system-images;android-23;google_apis;x86`"" +# preBuildSteps: +# - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-23;google_apis;x86\"" +# displayName: Install the Android emulators + + - template: .ci/build.v1.yml@components + parameters: + name: devicetests_android_api_24 + runChecks: false + displayName: Android API 24 + publishOutputSuffix: '-android24' + windowsImage: '' # Mac only + areaPath: $(AREA_PATH) + verbosity: diagnostic + cakeFile: DeviceTests/build.cake + cakeTarget: test-android-emu + cakeExtraArgs: --avd-target="`"system-images;android-24;google_apis;x86`"" + preBuildSteps: + - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-24;google_apis;x86\"" + displayName: Install the Android emulators + + - template: .ci/build.v1.yml@components + parameters: + name: devicetests_android_api_26 + runChecks: false + displayName: Android API 26 + publishOutputSuffix: '-android26' + windowsImage: '' # Mac only + areaPath: $(AREA_PATH) + verbosity: diagnostic + cakeFile: DeviceTests/build.cake + cakeTarget: test-android-emu + cakeExtraArgs: --avd-target="`"system-images;android-26;google_apis;x86`"" + preBuildSteps: + - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-26;google_apis;x86\"" + displayName: Install the Android emulators + + - template: .ci/build.v1.yml@components + parameters: + name: devicetests_android_api_29 + runChecks: false + displayName: Android API 29 + publishOutputSuffix: '-android29' + windowsImage: '' # Mac only + areaPath: $(AREA_PATH) + verbosity: diagnostic + cakeFile: DeviceTests/build.cake + cakeTarget: test-android-emu + cakeExtraArgs: --avd-target="`"system-images;android-29;google_apis;x86`"" + preBuildSteps: + - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-29;google_apis;x86\"" + displayName: Install the Android emulators + + # - template: .ci/build.v1.yml@components + # parameters: + # name: devicetests_android_api_30 + # runChecks: false + # displayName: Android API 30 + # publishOutputSuffix: '-android30' + # windowsImage: '' # Mac only + # areaPath: $(AREA_PATH) + # verbosity: diagnostic + # cakeFile: DeviceTests/build.cake + # cakeTarget: test-android-emu + # cakeExtraArgs: --avd-target="`"system-images;android-30;google_apis;x86`"" + # preBuildSteps: + # - bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-30;google_apis;x86\"" + # displayName: Install the Android emulators diff --git a/build.cake b/build.cake index a5f25f82a..e4d2d4a09 100644 --- a/build.cake +++ b/build.cake @@ -97,4 +97,8 @@ Task("ci") .IsDependentOn("tests") .IsDependentOn("samples"); +Task("ci-release") + .IsDependentOn("libs") + .IsDependentOn("nugets"); + RunTarget(TARGET); diff --git a/docs/en/Xamarin.Essentials/Location.xml b/docs/en/Xamarin.Essentials/Location.xml index 1c88db366..bd5ade22f 100644 --- a/docs/en/Xamarin.Essentials/Location.xml +++ b/docs/en/Xamarin.Essentials/Location.xml @@ -292,7 +292,7 @@ Degrees relative to true north. - 0..360 in degrees relative to true north. null if unavailable. + 0..360 in degrees relative to true north where 0 or 360 degrees are true north, increasing clockwise. null if unavailable. Requires a high accuracy query of location and may not be returned by Geolocation.GetLastKnownLocationAsync