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