diff --git a/eng/devices/android.cake b/eng/devices/android.cake
index 3659b1d1e817..0343de11a055 100644
--- a/eng/devices/android.cake
+++ b/eng/devices/android.cake
@@ -11,7 +11,7 @@ const string dotnetVersion = "net8.0";
// required
FilePath PROJECT = Argument("project", EnvironmentVariable("ANDROID_TEST_PROJECT") ?? "");
-string TEST_DEVICE = Argument("device", EnvironmentVariable("ANDROID_TEST_DEVICE") ?? $"android-emulator-32_{defaultVersion}");
+string TEST_DEVICE = Argument("device", EnvironmentVariable("ANDROID_TEST_DEVICE") ?? $"android-emulator-64_{defaultVersion}");
string DEVICE_NAME = Argument("skin", EnvironmentVariable("ANDROID_TEST_SKIN") ?? "Nexus 5X");
// optional
@@ -83,25 +83,33 @@ Setup(context =>
if (parts[0] != "android")
throw new Exception("Unexpected platform (expected: android) in device: " + TEST_DEVICE);
// device/emulator
+ Information("Create for: {0}", parts[1]);
if (parts[1] == "device")
emulator = false;
else if (parts[1] != "emulator" && parts[1] != "simulator")
throw new Exception("Unexpected device type (expected: device|emulator) in device: " + TEST_DEVICE);
// arch/bits
+ Information("Host OS System Arch: {0}", System.Runtime.InteropServices.RuntimeInformation.OSArchitecture);
+ Information("Host Processor System Arch: {0}", System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture);
if (parts[2] == "32") {
if (emulator)
DEVICE_ARCH = "x86";
else
DEVICE_ARCH = "armeabi-v7a";
} else if (parts[2] == "64") {
- if (emulator)
+ if (System.Runtime.InteropServices.RuntimeInformation.OSArchitecture == System.Runtime.InteropServices.Architecture.Arm64)
+ DEVICE_ARCH = "arm64-v8a";
+ else if (emulator)
DEVICE_ARCH = "x86_64";
else
DEVICE_ARCH = "arm64-v8a";
}
- var sdk = api >= 24 ? "google_apis_playstore" : "google_apis";
+ var sdk = api >= 28 ? "google_apis_playstore" : "google_apis";
+ if (api == 27 && DEVICE_ARCH == "x86_64")
+ sdk = "default";
DEVICE_ID = $"system-images;android-{api};{sdk};{DEVICE_ARCH}";
+ Information("Going to run image: {0}", DEVICE_ID);
// we are not using a virtual device, so quit
if (!emulator)
return;
diff --git a/eng/pipelines/common/device-tests.yml b/eng/pipelines/common/device-tests.yml
index eccdd14e8a4a..9c4aa4fa5bce 100644
--- a/eng/pipelines/common/device-tests.yml
+++ b/eng/pipelines/common/device-tests.yml
@@ -2,6 +2,7 @@ parameters:
androidPool: { }
iosPool: { }
catalystPool: { }
+ windowsPool: { }
androidApiLevels: [ 33 ]
iosVersions: [ 'latest' ]
catalystVersions: [ 'latest' ]
@@ -36,13 +37,9 @@ stages:
${{ each api in parameters.androidApiLevels }}:
${{ if not(containsValue(project.androidApiLevelsExclude, api)) }}:
${{ replace(coalesce(project.desc, project.name), ' ', '_') }}_API_${{ api }}:
- ${{ if ge(api, 24) }}:
- ANDROID_EMULATORS: "system-images;android-${{ api }};google_apis_playstore;x86"
- ${{ else }}:
- ANDROID_EMULATORS: "system-images;android-${{ api }};google_apis;x86"
REQUIRED_XCODE: $(DEVICETESTS_REQUIRED_XCODE)
PROJECT_PATH: ${{ project.android }}
- DEVICE: android-emulator-32_${{ api }}
+ DEVICE: android-emulator-64_${{ api }}
steps:
- template: device-tests-steps.yml
parameters:
@@ -139,8 +136,7 @@ stages:
workspace:
clean: all
displayName: "Windows device tests"
- pool:
- vmImage: windows-latest
+ pool: ${{ parameters.windowsPool }}
strategy:
matrix:
# create all the variables used for the matrix
diff --git a/eng/pipelines/common/insertion.yml b/eng/pipelines/common/insertion.yml
index 3d3d94b25951..b7e0f59b5e19 100644
--- a/eng/pipelines/common/insertion.yml
+++ b/eng/pipelines/common/insertion.yml
@@ -3,21 +3,6 @@ parameters:
vmImage: windows-latest
stages:
- - template: vs-insertion/stage/v1.yml@yaml-templates
- parameters:
- dependsOn: nuget_signing
- approvalTimeoutInMinutes: 1
- symbolArtifactName: nuget
- symbolArtifactPatterns: |
- **/signed/*.nupkg
- **/*.snupkg
- **/additional-assets.zip
- pushToShippingFeed: true
- nupkgArtifactName: nuget
- nupkgArtifactPatterns: |
- **/signed/*.nupkg
- msiNupkgArtifactName: vs-msi-nugets
-
- stage: sdk_insertion
displayName: 'SDK Insertion'
dependsOn: nuget_signing
diff --git a/eng/pipelines/common/provision.yml b/eng/pipelines/common/provision.yml
index e3c15eb35faa..ea00dbd8c88b 100644
--- a/eng/pipelines/common/provision.yml
+++ b/eng/pipelines/common/provision.yml
@@ -59,8 +59,9 @@ steps:
echo "##vso[task.setvariable variable=JI_JAVA_HOME]$(JAVA_HOME_11_X64)"
echo "##vso[task.setvariable variable=JAVA_HOME]$(JAVA_HOME_11_X64)"
displayName: 'Setup JDK Paths'
- condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
+ condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
# Configure VS Mac for Xcode
+ # This seems to be needed or else it will pick other xcode for example on xharness
- bash: |
set -x
mkdir -p ~/Library/Preferences/Xamarin
@@ -69,32 +70,6 @@ steps:
cat ~/Library/Preferences/Xamarin/Settings.plist || true
displayName: 'Configure Visual Studio'
condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
- # Install Certificates and Provisioning Profiles
- # - task: InstallAppleProvisioningProfile@1
- # displayName: 'Install the iOS provisioning profile'
- # condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
- # inputs:
- # provProfileSecureFile: 'Components iOS Provisioning.mobileprovision'
- # - task: InstallAppleProvisioningProfile@1
- # displayName: 'Install the macOS provisioning profile'
- # condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
- # inputs:
- # provProfileSecureFile: 'Components Mac Provisioning.mobileprovision'
- # - task: InstallAppleProvisioningProfile@1
- # displayName: 'Install the tvOS provisioning profile'
- # condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
- # inputs:
- # provProfileSecureFile: 'Components tvOS Provisioning.mobileprovision'
- # - task: InstallAppleCertificate@2
- # displayName: 'Install the iOS certificate'
- # condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
- # inputs:
- # certSecureFile: 'Components iOS Certificate.p12'
- # - task: InstallAppleCertificate@2
- # condition: eq(variables['System.JobName'], 'macos')
- # displayName: 'Install the macOS certificate'
- # inputs:
- # certSecureFile: 'Components Mac Certificate.p12'
# Prepare Windows
- powershell: |
@@ -183,18 +158,6 @@ steps:
dotnet --list-sdks
displayName: 'Show .NET SDK info'
- - pwsh: ./build.ps1 --target provision
- displayName: 'Cake Provision'
- condition: eq(variables['provisioningCake'], 'true')
-
- - task: PowerShell@2
- condition: eq(variables['PrivateBuild'], 'true')
- displayName: Setup Private Feeds Credentials
- inputs:
- filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1
- arguments: -ConfigFile $(System.DefaultWorkingDirectory)/NuGet.config -Password $Env:Token
- env:
- Token: $(dn-bot-dnceng-artifact-feeds-rw)
- pwsh: dotnet nuget locals all --clear
displayName: 'Clear all NuGet caches'
@@ -210,3 +173,11 @@ steps:
# $xml.configuration.RemoveChild($xml.configuration.disabledPackageSources)
# $xml.Save($path)
# displayName: 'Add "wasdk-internal" to NuGet.config'
+ # - task: PowerShell@2
+ # condition: eq(variables['PrivateBuild'], 'true')
+ # displayName: Setup Private Feeds Credentials
+ # inputs:
+ # filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1
+ # arguments: -ConfigFile $(System.DefaultWorkingDirectory)/NuGet.config -Password $Env:Token
+ # env:
+ # Token: $(dn-bot-dnceng-artifact-feeds-rw)
diff --git a/eng/pipelines/common/ui-tests-steps.yml b/eng/pipelines/common/ui-tests-steps.yml
index 5283e978a2b0..186647546c16 100644
--- a/eng/pipelines/common/ui-tests-steps.yml
+++ b/eng/pipelines/common/ui-tests-steps.yml
@@ -33,7 +33,7 @@ steps:
- task: NodeTool@0
inputs:
- versionSpec: "18.13.0"
+ versionSpec: "20.3.1"
displayName: "Install node"
- pwsh: ./eng/scripts/appium-install.ps1
@@ -43,7 +43,7 @@ steps:
- pwsh: ./build.ps1 --target=dotnet --configuration="${{ parameters.configuration }}" --verbosity=diagnostic
displayName: 'Install .NET'
- retryCountOnTaskFailure: 3
+ retryCountOnTaskFailure: 2
env:
DOTNET_TOKEN: $(dotnetbuilds-internal-container-read-token)
PRIVATE_BUILD: $(PrivateBuild)
diff --git a/eng/pipelines/common/ui-tests.yml b/eng/pipelines/common/ui-tests.yml
index 0a206145abd0..69b366535db1 100644
--- a/eng/pipelines/common/ui-tests.yml
+++ b/eng/pipelines/common/ui-tests.yml
@@ -40,10 +40,6 @@ stages:
displayName: ${{ coalesce(project.desc, project.name) }} (API ${{ api }})
pool: ${{ parameters.androidPool }}
variables:
- ${{ if ge(api, 24) }}:
- ANDROID_EMULATORS: "system-images;android-${{ api }};google_apis_playstore;x86"
- ${{ if lt(api, 24) }}:
- ANDROID_EMULATORS: "system-images;android-${{ api }};google_apis;x86"
REQUIRED_XCODE: $(DEVICETESTS_REQUIRED_XCODE)
steps:
- template: ui-tests-steps.yml
@@ -52,7 +48,7 @@ stages:
version: ${{ api }}
path: ${{ project.android }}
app: ${{ project.app }}
- device: android-emulator-32_${{ api }}
+ device: android-emulator-64_${{ api }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
@@ -153,10 +149,6 @@ stages:
displayName: ${{ coalesce(project.desc, project.name) }} (API ${{ api }})
pool: ${{ parameters.androidCompatibilityPool }}
variables:
- ${{ if ge(api, 24) }}:
- ANDROID_EMULATORS: "system-images;android-${{ api }};google_apis_playstore;x86"
- ${{ if lt(api, 24) }}:
- ANDROID_EMULATORS: "system-images;android-${{ api }};google_apis;x86"
REQUIRED_XCODE: $(DEVICETESTS_REQUIRED_XCODE)
steps:
- template: ui-tests-compatibility-steps.yml
@@ -168,7 +160,7 @@ stages:
path: ${{ project.compatibilityAndroidTestProject }}
app: ${{ project.compatibilityAndroidApp }}
targetSample: "dotnet-legacy-controlgallery-android"
- device: android-emulator-32_${{ api }}
+ device: android-emulator-64_${{ api }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
diff --git a/eng/pipelines/device-tests.yml b/eng/pipelines/device-tests.yml
index fc319ec92fd6..606a4913ad3d 100644
--- a/eng/pipelines/device-tests.yml
+++ b/eng/pipelines/device-tests.yml
@@ -56,6 +56,7 @@ parameters:
- name: BuildEverything
type: boolean
default: false
+
- name: androidPool
type: object
default:
@@ -64,17 +65,25 @@ parameters:
demands:
- macOS.Name -equals Ventura
- macOS.Architecture -equals x64
+
- name: iosPool
type: object
default:
name: $(iosTestsVmPool)
vmImage: $(iosTestsVmImage)
+
- name: catalystPool
type: object
default:
name: $(iosTestsVmPool)
vmImage: $(iosTestsVmImage)
+ - name: windowsPool
+ type: object
+ default:
+ name: $(windowsTestsVmPool)
+ vmImage: $(windowsTestsVmImage)
+
resources:
repositories:
- repository: yaml-templates
@@ -90,6 +99,7 @@ stages:
androidPool: ${{ parameters.androidPool }}
iosPool: ${{ parameters.iosPool }}
catalystPool: ${{ parameters.catalystPool }}
+ windowsPool: ${{ parameters.windowsPool }}
agentPoolAccessToken: $(AgentPoolAccessToken)
${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}:
androidApiLevels: [ 30, 29, 28, 27, 26, 25, 24, 23 ]
diff --git a/eng/pipelines/maui-release.yml b/eng/pipelines/maui-release.yml
index ae44b708c26f..2eb14103a67e 100644
--- a/eng/pipelines/maui-release.yml
+++ b/eng/pipelines/maui-release.yml
@@ -37,8 +37,6 @@ parameters:
- name: Windows
poolName: $(windowsNet6VmPool)
vmImage: $(windowsNet6VmImage)
- bootsAndroid: $(Android.Msi)
- bootsiOS: $(iOS.Msi)
artifact: nuget
resources:
diff --git a/eng/provisioning/provisioning.csx b/eng/provisioning/provisioning.csx
index e3428faef44c..2281973e44de 100644
--- a/eng/provisioning/provisioning.csx
+++ b/eng/provisioning/provisioning.csx
@@ -25,74 +25,38 @@ if(String.IsNullOrWhiteSpace(ANDROID_API_SDKS))
.ApiLevel((AndroidApiLevel)31)
.ApiLevel((AndroidApiLevel)32)
.ApiLevel((AndroidApiLevel)33)
- .ApiLevel((AndroidApiLevel)34)
- .VirtualDevice(
- "Android_API23",
- (AndroidApiLevel)23,
- AndroidSystemImageApi.Google,
- AndroidSystemImageAbi.x86,
- AndroidVirtualDevice.NEXUS_5X)
- .VirtualDevice(
- "Android_API24",
- AndroidApiLevel.Nougat,
- AndroidSystemImageApi.GooglePlayStore,
- AndroidSystemImageAbi.x86,
- AndroidVirtualDevice.NEXUS_5X)
- .VirtualDevice(
- "Android_API25",
- AndroidApiLevel.Nougat_7_1,
- AndroidSystemImageApi.GooglePlayStore,
- AndroidSystemImageAbi.x86,
- AndroidVirtualDevice.NEXUS_5X)
- .VirtualDevice(
- "Android_API26",
- AndroidApiLevel.Oreo,
- AndroidSystemImageApi.GooglePlayStore,
- AndroidSystemImageAbi.x86,
- AndroidVirtualDevice.NEXUS_5X)
- .VirtualDevice(
- "Android_API27",
- AndroidApiLevel.Oreo_8_1 ,
- AndroidSystemImageApi.GooglePlayStore,
- AndroidSystemImageAbi.x86,
- AndroidVirtualDevice.NEXUS_5X)
- .VirtualDevice(
- "Android_API28",
- AndroidApiLevel.P,
- AndroidSystemImageApi.GooglePlayStore,
- AndroidSystemImageAbi.x86,
- AndroidVirtualDevice.NEXUS_5X)
- .VirtualDevice(
- "Android_API29",
- AndroidApiLevel.Q,
- AndroidSystemImageApi.GooglePlayStore,
- AndroidSystemImageAbi.x86,
- AndroidVirtualDevice.NEXUS_5X)
- .VirtualDevice(
- "Android_API30",
- AndroidApiLevel.R,
- AndroidSystemImageApi.GooglePlayStore,
- AndroidSystemImageAbi.x86,
- AndroidVirtualDevice.NEXUS_5X)
- // .VirtualDevice(
- // "Android_API31",
- // AndroidApiLevel.Android_12,
- // AndroidSystemImageApi.GooglePlayStore,
- // AndroidSystemImageAbi.x86,
- // AndroidVirtualDevice.NEXUS_5X)
- // .VirtualDevice(
- // "Android_API32",
- // AndroidApiLevel.Android_12sv2,
- // AndroidSystemImageApi.GooglePlayStore,
- // AndroidSystemImageAbi.x86,
- // AndroidVirtualDevice.NEXUS_5X)
- // .VirtualDevice(
- // "Android_API33",
- // AndroidApiLevel.Android_13,
- // AndroidSystemImageApi.GooglePlayStore,
- // AndroidSystemImageAbi.x86,
- // AndroidVirtualDevice.NEXUS_5X)
- .SdkManagerPackage ("build-tools;33.0.0");
+ .VirtualDevice("Android_x64_API23", (AndroidApiLevel)23, AndroidSystemImageApi.Google, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API24", (AndroidApiLevel)24, AndroidSystemImageApi.Google, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API25", (AndroidApiLevel)25, AndroidSystemImageApi.Google, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API26", (AndroidApiLevel)26, AndroidSystemImageApi.Google, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API27", (AndroidApiLevel)27, AndroidSystemImageApi.Default, /*!!*/ AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API28", (AndroidApiLevel)28, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API29", (AndroidApiLevel)29, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API30", (AndroidApiLevel)30, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API31", (AndroidApiLevel)31, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API32", (AndroidApiLevel)32, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API33", (AndroidApiLevel)33, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_x64_API34", (AndroidApiLevel)34, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.x86_64, AndroidVirtualDevice.NEXUS_5X);
+
+
+ if (IsArm64)
+ {
+ AndroidSdk()
+ .VirtualDevice("Android_arm64_API23", (AndroidApiLevel)23, AndroidSystemImageApi.Google, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API24", (AndroidApiLevel)24, AndroidSystemImageApi.Google, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API25", (AndroidApiLevel)25, AndroidSystemImageApi.Google, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API26", (AndroidApiLevel)26, AndroidSystemImageApi.Google, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API27", (AndroidApiLevel)27, AndroidSystemImageApi.Google, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API28", (AndroidApiLevel)28, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API29", (AndroidApiLevel)29, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API30", (AndroidApiLevel)30, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API31", (AndroidApiLevel)31, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API32", (AndroidApiLevel)32, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API33", (AndroidApiLevel)33, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X)
+ .VirtualDevice("Android_arm64_API34", (AndroidApiLevel)34, AndroidSystemImageApi.GooglePlayStore, AndroidSystemImageAbi.ARM64_v8a, AndroidVirtualDevice.NEXUS_5X);
+ }
+
+ AndroidSdk().SdkManagerPackage ("build-tools;33.0.0");
}
else
{
diff --git a/eng/scripts/appium-install.ps1 b/eng/scripts/appium-install.ps1
index 7e88ec5552c9..89c4902f27ef 100644
--- a/eng/scripts/appium-install.ps1
+++ b/eng/scripts/appium-install.ps1
@@ -45,49 +45,87 @@ param
[string] $macDriverVersion = '1.6.3'
)
+Write-Output "Welcome to the Appium installer"
node -v
+
+Write-Output "Updating npm"
npm install -g npm
+
+Write-Output "Node version"
node -v
+
+Write-Output "Check if appium is installed"
+npm list -g | grep appium
+
+$modulesFolder = "/Users/builder/azdo/_work/_tool/node/20.3.1/x64/lib/node_modules/appium"
+if (Test-Path -Path $modulesFolder ) {
+ Write-Output "appium exists!"
+
+ $existingDrivers = appium driver list --installed --json | ConvertFrom-Json
+ Write-Output "List of installed drivers $x"
+ if($existingDrivers.windows)
+ {
+ Write-Output "Uninstalling appium driver windows"
+ appium driver uninstall windows
+ Write-Output "Unistalled appium driver windows"
+ }
+
+ if($existingDrivers.uiautomator2)
+ {
+ Write-Output "Uninstalling appium driver uiautomator2"
+ appium driver uninstall uiautomator2
+ Write-Output "Unistalled appium driver uiautomator2"
+ }
+
+ if($existingDrivers.xcuitest)
+ {
+ Write-Output "Uninstalling appium driver xcuitest"
+ appium driver uninstall xcuitest
+ Write-Output "Unistalled appium driver xcuitest"
+ }
+
+ if($existingDrivers.mac2)
+ {
+ Write-Output "Uninstalling appium driver mac2"
+ appium driver uninstall mac2
+ Write-Output "Unistalled appium driver mac2"
+ }
+
+ Write-Output "Uninstalling appium"
+ npm uninstall -g appium
+ Write-Output "Unistalled appium"
+ #rm -rf $modulesFolder
+} else {
+ Write-Output "node_modules doesn't exist."
+}
+
+Write-Output "Check if appium is installed after uninstall"
+npm list -g | grep appium
+
+Write-Output "Installing appium $appiumVersion"
npm install -g appium@$appiumVersion
+write-Output "Installed appium"
appium -v
-$x = appium driver list --installed --json | ConvertFrom-Json
-if(!$x.windows)
-{
- appium driver install --source=npm appium-windows-driver@$windowsDriverVersion
-}
-else
-{
- appium driver uninstall windows
- appium driver install --source=npm appium-windows-driver@$windowsDriverVersion
-}
+$drivers = appium driver list --installed --json | ConvertFrom-Json
+Write-Output "List of installed drivers $drivers"
-if(!$x.uiautomator2)
-{
- appium driver install uiautomator2@$androidDriverVersion
-}
-else
-{
- appium driver uninstall uiautomator2
- appium driver install uiautomator2@$androidDriverVersion
-}
+Write-Output "Going to install appium drivers windows $windowsDriverVersion, uiautomator2 $androidDriverVersion, xcuitest $iOSDriverVersion and mac2 $macDriverVersio"
-if(!$x.xcuitest)
-{
- appium driver install xcuitest@$iOSDriverVersion
-}
-else
-{
- appium driver uninstall xcuitest
- appium driver install xcuitest@$iOSDriverVersion
-}
+Write-Output "Installing appium driver windows $windowsDriverVersion"
+appium driver install --source=npm appium-windows-driver@$windowsDriverVersion
+Write-Output "Installed appium driver windows"
-if(!$x.mac2)
-{
- appium driver install mac2@$macDriverVersion
-}
-else
-{
- appium driver uninstall mac2
- appium driver install mac2@$macDriverVersion
-}
\ No newline at end of file
+Write-Output "Installing appium driver uiautomator2 $androidDriverVersion"
+appium driver install uiautomator2@$androidDriverVersion
+Write-Output "Installed appium driver uiautomator2"
+
+Write-Output "Installing appium driver xcuitest $iOSDriverVersion"
+appium driver install xcuitest@$iOSDriverVersion
+Write-Output "Installed appium driver xcuitest"
+
+Write-Output "Installing appium driver mac2 $macDriverVersion"
+appium driver install mac2@$macDriverVersion
+Write-Output "Installed appium driver mac2"
+
+Write-Output "Done, thanks!"
\ No newline at end of file
diff --git a/src/Compatibility/ControlGallery/src/Issues.Shared/ShellInsets.cs b/src/Compatibility/ControlGallery/src/Issues.Shared/ShellInsets.cs
index 3dfeff4b5d97..e1d9e279c49b 100644
--- a/src/Compatibility/ControlGallery/src/Issues.Shared/ShellInsets.cs
+++ b/src/Compatibility/ControlGallery/src/Issues.Shared/ShellInsets.cs
@@ -318,6 +318,7 @@ View CreateEntryInsetView()
#if UITEST && __IOS__
[Test]
+ [Compatibility.UITests.FailsOnMauiIOS]
public void EntryScrollTest()
{
RunningApp.Tap(EntryTest);
diff --git a/src/Compatibility/Core/src/Android/Cells/EntryCellRenderer.cs b/src/Compatibility/Core/src/Android/Cells/EntryCellRenderer.cs
index 429e9c9a4585..5ef699044f44 100644
--- a/src/Compatibility/Core/src/Android/Cells/EntryCellRenderer.cs
+++ b/src/Compatibility/Core/src/Android/Cells/EntryCellRenderer.cs
@@ -92,7 +92,8 @@ void OnEditingCompleted()
void OnTextChanged(string text)
{
var entryCell = (EntryCell)Cell;
- entryCell.Text = text;
+ entryCell
+ .SetValue(EntryCell.TextProperty, text, specificity: SetterSpecificity.FromHandler);
}
void UpdateHeight()
diff --git a/src/Compatibility/Core/src/iOS/Cells/EntryCellRenderer.cs b/src/Compatibility/Core/src/iOS/Cells/EntryCellRenderer.cs
index eb6a6dd65a7b..7602045a5deb 100644
--- a/src/Compatibility/Core/src/iOS/Cells/EntryCellRenderer.cs
+++ b/src/Compatibility/Core/src/iOS/Cells/EntryCellRenderer.cs
@@ -90,7 +90,8 @@ static void OnTextFieldTextChanged(object sender, EventArgs eventArgs)
var cell = (EntryCellTableViewCell)sender;
var model = (EntryCell)cell.Cell;
- model.Text = cell.TextField.Text;
+ model
+ .SetValue(EntryCell.TextProperty, cell.TextField.Text, specificity: SetterSpecificity.FromHandler);
}
static void UpdateHorizontalTextAlignment(EntryCellTableViewCell cell, EntryCell entryCell)
diff --git a/src/Controls/samples/Controls.Sample.UITests/Issues/Issue14257.cs b/src/Controls/samples/Controls.Sample.UITests/Issues/Issue14257.cs
index 3dde0da98647..d4b04c2248fd 100644
--- a/src/Controls/samples/Controls.Sample.UITests/Issues/Issue14257.cs
+++ b/src/Controls/samples/Controls.Sample.UITests/Issues/Issue14257.cs
@@ -26,10 +26,11 @@ protected override void Init()
scrollView.Content = layout;
Content = scrollView;
- resizeButton.Clicked += (sender, args) => {
+ resizeButton.Clicked += (sender, args) =>
+ {
// Resize the ScrollView content so the test button will be off the screen
// If the bug is present, this will make the button untappable
- layoutContent.HeightRequest = 1000;
+ layoutContent.HeightRequest = 1000;
};
// Show the Success label if the button is tapped, so we can verify the bug is not present
diff --git a/src/Controls/samples/Controls.Sample/Pages/Controls/EditorPage.xaml b/src/Controls/samples/Controls.Sample/Pages/Controls/EditorPage.xaml
index 1a9a97560863..1431528b4999 100644
--- a/src/Controls/samples/Controls.Sample/Pages/Controls/EditorPage.xaml
+++ b/src/Controls/samples/Controls.Sample/Pages/Controls/EditorPage.xaml
@@ -39,6 +39,20 @@
Style="{StaticResource Headline}" />
+
+
+
+
diff --git a/src/Controls/samples/Controls.Sample/Pages/Core/BorderGalleries/BorderClipPlayground.xaml b/src/Controls/samples/Controls.Sample/Pages/Core/BorderGalleries/BorderClipPlayground.xaml
index f5ea28b6079b..1fa74b102257 100644
--- a/src/Controls/samples/Controls.Sample/Pages/Core/BorderGalleries/BorderClipPlayground.xaml
+++ b/src/Controls/samples/Controls.Sample/Pages/Core/BorderGalleries/BorderClipPlayground.xaml
@@ -17,13 +17,14 @@
-
+
-
+
diff --git a/src/Controls/src/Core/Border/Border.cs b/src/Controls/src/Core/Border/Border.cs
index 1411fe4c4636..9086bd938089 100644
--- a/src/Controls/src/Core/Border/Border.cs
+++ b/src/Controls/src/Core/Border/Border.cs
@@ -314,7 +314,7 @@ void OnStrokeDashArrayChanged(object? sender, NotifyCollectionChangedEventArgs e
void UpdateStrokeShape()
{
- if (StrokeShape is Shape strokeShape)
+ if (StrokeShape is Shape strokeShape && StrokeThickness == 0)
{
strokeShape.StrokeThickness = StrokeThickness;
}
diff --git a/src/Controls/src/Core/Compatibility/Handlers/Android/FrameRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/Android/FrameRenderer.cs
index 17773469b0bf..6cab4f0a2e94 100644
--- a/src/Controls/src/Core/Compatibility/Handlers/Android/FrameRenderer.cs
+++ b/src/Controls/src/Core/Compatibility/Handlers/Android/FrameRenderer.cs
@@ -158,11 +158,11 @@ protected virtual void OnElementChanged(ElementChangedEventArgs e)
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
if (Element?.Handler is IPlatformViewHandler pvh &&
- Element is IContentView cv &&
+ Element is ICrossPlatformLayout cpl &&
VirtualView is not null &&
Context is not null)
{
- var measure = pvh.MeasureVirtualView(widthMeasureSpec, heightMeasureSpec, cv.CrossPlatformMeasure);
+ var measure = pvh.MeasureVirtualView(widthMeasureSpec, heightMeasureSpec, cpl.CrossPlatformMeasure);
SetMeasuredDimension((int)measure.Width, (int)measure.Height);
}
else
diff --git a/src/Controls/src/Core/Compatibility/Handlers/ListView/Android/EntryCellRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/ListView/Android/EntryCellRenderer.cs
index 0eb67b36efc6..e624f4bdba3a 100644
--- a/src/Controls/src/Core/Compatibility/Handlers/ListView/Android/EntryCellRenderer.cs
+++ b/src/Controls/src/Core/Compatibility/Handlers/ListView/Android/EntryCellRenderer.cs
@@ -90,7 +90,9 @@ void OnEditingCompleted()
void OnTextChanged(string text)
{
var entryCell = (EntryCell)Cell;
- entryCell.Text = text;
+
+ entryCell
+ .SetValue(EntryCell.TextProperty, text, specificity: SetterSpecificity.FromHandler);
}
void UpdateHeight()
diff --git a/src/Controls/src/Core/Compatibility/Handlers/ListView/iOS/EntryCellRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/ListView/iOS/EntryCellRenderer.cs
index 4ec82b41fa40..0a6ff189c91d 100644
--- a/src/Controls/src/Core/Compatibility/Handlers/ListView/iOS/EntryCellRenderer.cs
+++ b/src/Controls/src/Core/Compatibility/Handlers/ListView/iOS/EntryCellRenderer.cs
@@ -95,7 +95,8 @@ static void OnTextFieldTextChanged(object sender, EventArgs eventArgs)
var cell = (EntryCellTableViewCell)sender;
var model = (EntryCell)cell.Cell;
- model.Text = cell.TextField.Text;
+ model
+ .SetValue(EntryCell.TextProperty, cell.TextField.Text, specificity: SetterSpecificity.FromHandler);
}
static void UpdateHorizontalTextAlignment(EntryCellTableViewCell cell, EntryCell entryCell)
diff --git a/src/Controls/src/Core/ContentPage/ContentPage.cs b/src/Controls/src/Core/ContentPage/ContentPage.cs
index 9619d6228bfb..659810aa2ed2 100644
--- a/src/Controls/src/Core/ContentPage/ContentPage.cs
+++ b/src/Controls/src/Core/ContentPage/ContentPage.cs
@@ -108,6 +108,17 @@ void HotReload.IHotReloadableView.Reload()
//TODO: if reload handler is null, Do a manual reload?
});
}
+
#endregion
+
+ Size IContentView.CrossPlatformArrange(Rect bounds)
+ {
+ return (this as ICrossPlatformLayout).CrossPlatformArrange(bounds);
+ }
+
+ Size IContentView.CrossPlatformMeasure(double widthConstraint, double heightConstraint)
+ {
+ return (this as ICrossPlatformLayout).CrossPlatformMeasure(widthConstraint, heightConstraint);
+ }
}
}
\ No newline at end of file
diff --git a/src/Controls/tests/DeviceTests/Elements/Border/BorderTests.Windows.cs b/src/Controls/tests/DeviceTests/Elements/Border/BorderTests.Windows.cs
new file mode 100644
index 000000000000..cabcf59c4f83
--- /dev/null
+++ b/src/Controls/tests/DeviceTests/Elements/Border/BorderTests.Windows.cs
@@ -0,0 +1,58 @@
+using System.Threading.Tasks;
+using Microsoft.Maui.Controls;
+using Microsoft.Maui.Controls.Shapes;
+using Microsoft.Maui.Graphics;
+using Microsoft.Maui.Handlers;
+using Microsoft.Maui.Platform;
+using Microsoft.UI.Composition;
+using Microsoft.UI.Xaml.Hosting;
+using Xunit;
+
+namespace Microsoft.Maui.DeviceTests
+{
+ public partial class BorderTests : ControlsHandlerTestBase
+ {
+ [Theory(DisplayName = "Inner CornerRadius Initializes Correctly")]
+ [InlineData(0)]
+ [InlineData(12)]
+ [InlineData(24)]
+ public async Task InnerCornerRadiusInitializesCorrectly(int cornerRadius)
+ {
+ SetupBuilder();
+
+ var expected = Colors.Red;
+
+ var border = new Border()
+ {
+ Content = new Label { Text = "Background", TextColor = Colors.White },
+ StrokeShape = new RoundRectangle { CornerRadius = cornerRadius },
+ Background = new SolidPaint(expected),
+ StrokeThickness = 0,
+ HeightRequest = 100,
+ WidthRequest = 300
+ };
+
+ await AttachAndRun(border, (handler) =>
+ {
+ var contentPanel = GetNativeBorder(handler as BorderHandler);
+ var content = contentPanel.Content;
+ var visual = ElementCompositionPreview.GetElementVisual(content);
+
+ var clip = visual.Clip as CompositionGeometricClip;
+ Assert.NotNull(clip);
+
+ var geometry = clip.Geometry as CompositionPathGeometry;
+ var path = geometry.Path;
+ Assert.NotNull(path);
+
+ Assert.True(contentPanel.IsInnerPath);
+ });
+
+ await AssertColorAtPoint(border, expected, typeof(BorderHandler), cornerRadius, cornerRadius);
+ }
+
+ ContentPanel GetNativeBorder(BorderHandler borderHandler) =>
+ borderHandler.PlatformView;
+
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/DeviceTests/Elements/Border/BorderTests.cs b/src/Controls/tests/DeviceTests/Elements/Border/BorderTests.cs
index f58d58046ebc..3b3f9a4f5b57 100644
--- a/src/Controls/tests/DeviceTests/Elements/Border/BorderTests.cs
+++ b/src/Controls/tests/DeviceTests/Elements/Border/BorderTests.cs
@@ -18,8 +18,9 @@ void SetupBuilder()
{
builder.ConfigureMauiHandlers(handlers =>
{
- handlers.AddHandler