├── .gitignore ├── README.md ├── TermsAndConditions.md ├── WinnerList.md ├── doc ├── deploy │ └── azuredeploy.json └── solution.md └── src ├── XamarinAzureChallenge.Android ├── Assets │ ├── AboutAssets.txt │ └── roboto.regular.ttf ├── MainActivity.cs ├── Properties │ ├── AndroidManifest.xml │ └── AssemblyInfo.cs ├── Resources │ ├── AboutResources.txt │ ├── drawable-hdpi │ │ ├── azureIcon.png │ │ ├── back_arrow.png │ │ ├── backgroundimage.png │ │ ├── resultFailed.png │ │ ├── resultOk.png │ │ ├── xamIcon.png │ │ └── xamarinazure.png │ ├── drawable-mdpi │ │ ├── azureIcon.png │ │ ├── back_arrow.png │ │ ├── backgroundimage.png │ │ ├── resultFailed.png │ │ ├── resultOk.png │ │ ├── xamIcon.png │ │ └── xamarinazure.png │ ├── drawable-nodpi │ │ └── Hexagon.png │ ├── drawable-xhdpi │ │ ├── azureIcon.png │ │ ├── back_arrow.png │ │ ├── backgroundImage.png │ │ ├── resultFailed.png │ │ ├── resultOk.png │ │ ├── xamIcon.png │ │ └── xamarinazure.png │ ├── drawable-xxhdpi │ │ ├── azureIcon.png │ │ ├── back_arrow.png │ │ ├── backgroundimage.png │ │ ├── resultFailed.png │ │ ├── resultOk.png │ │ ├── xamIcon.png │ │ └── xamarinazure.png │ ├── drawable-xxxhdpi │ │ ├── azureIcon.png │ │ ├── backgroundimage.png │ │ ├── resultFailed.png │ │ ├── resultOk.png │ │ ├── xamIcon.png │ │ └── xamarinazure.png │ ├── layout │ │ ├── Tabbar.axml │ │ └── Toolbar.axml │ ├── mipmap-anydpi-v26 │ │ ├── icon.xml │ │ └── icon_round.xml │ ├── mipmap-hdpi │ │ ├── icon.png │ │ └── launcher_foreground.png │ ├── mipmap-mdpi │ │ ├── icon.png │ │ └── launcher_foreground.png │ ├── mipmap-xhdpi │ │ ├── icon.png │ │ └── launcher_foreground.png │ ├── mipmap-xxhdpi │ │ ├── icon.png │ │ └── launcher_foreground.png │ ├── mipmap-xxxhdpi │ │ ├── icon.png │ │ └── launcher_foreground.png │ └── values │ │ ├── colors.xml │ │ └── styles.xml └── XamarinAzureChallenge.Android.csproj ├── XamarinAzureChallenge.Functions ├── .gitignore ├── Functions │ └── SubmitChallengeFunction.cs ├── Services │ └── ApiService.cs ├── XamarinAzureChallenge.Functions.csproj ├── host.json └── local.settings.json ├── XamarinAzureChallenge.Shared ├── Models │ └── User.cs └── XamarinAzureChallenge.Shared.csproj ├── XamarinAzureChallenge.iOS ├── AppDelegate.cs ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon1024.png │ │ ├── Icon120.png │ │ ├── Icon152.png │ │ ├── Icon167.png │ │ ├── Icon180.png │ │ ├── Icon20.png │ │ ├── Icon29.png │ │ ├── Icon40.png │ │ ├── Icon58.png │ │ ├── Icon60.png │ │ ├── Icon76.png │ │ ├── Icon80.png │ │ └── Icon87.png ├── Entitlements.plist ├── Info.plist ├── Main.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Default-568h@2x.png │ ├── Default-Portrait.png │ ├── Default-Portrait@2x.png │ ├── Default.png │ ├── Default@2x.png │ ├── Hexagon.png │ ├── LaunchScreen.storyboard │ ├── SF-Pro-Display-Regular.otf │ ├── SFProText-Medium.ttf │ ├── azureIcon.png │ ├── azureIcon@2x.png │ ├── azureIcon@3x.png │ ├── back_arrow.png │ ├── back_arrow@2x.png │ ├── back_arrow@3x.png │ ├── backgroundImage.png │ ├── backgroundimage@2x.png │ ├── backgroundimage@3x.png │ ├── resultFailed.png │ ├── resultFailed@2x.png │ ├── resultFailed@3x.png │ ├── resultOk.png │ ├── resultOk@2x.png │ ├── resultOk@3x.png │ ├── roboto.regular.ttf │ ├── xamIcon.png │ ├── xamIcon@2x.png │ ├── xamIcon@3x.png │ ├── xamarinazure.png │ ├── xamarinazure@2x.png │ └── xamarinazure@3x.png └── XamarinAzureChallenge.iOS.csproj ├── XamarinAzureChallenge.sln └── XamarinAzureChallenge ├── App.xaml ├── App.xaml.cs ├── Pages ├── HomePage.xaml ├── HomePage.xaml.cs ├── ResultPage.xaml ├── ResultPage.xaml.cs ├── UserDataPage.xaml └── UserDataPage.xaml.cs ├── ViewModels ├── BaseViewModel.cs ├── HomeViewModel.cs ├── ResultViewModel.cs └── UserDataViewModel.cs └── XamarinAzureChallenge.csproj /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/xamarinstudio,visualstudio,visualstudiocode,xcode,android,macos,csharp,f#,fastlane,java,jetbrains,linux,monodevelop,objective-c,swift,sublimetext,unity 3 | 4 | ### fastlane ### 5 | # fastlane - A streamlined workflow tool for Cocoa deployment 6 | 7 | # fastlane specific 8 | fastlane/report.xml 9 | 10 | # deliver temporary files 11 | fastlane/Preview.html 12 | 13 | # snapshot generated screenshots 14 | fastlane/screenshots/**/*.png 15 | fastlane/screenshots/screenshots.html 16 | 17 | # scan temporary files 18 | fastlane/test_output 19 | 20 | 21 | ### XamarinStudio ### 22 | bin/ 23 | obj/ 24 | *.userprefs 25 | 26 | 27 | ### VisualStudioCode ### 28 | .vscode/* 29 | !.vscode/settings.json 30 | !.vscode/tasks.json 31 | !.vscode/launch.json 32 | !.vscode/extensions.json 33 | 34 | 35 | ### Xcode ### 36 | # Xcode 37 | # 38 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 39 | 40 | ## Build generated 41 | build/ 42 | DerivedData/ 43 | 44 | ## Various settings 45 | *.pbxuser 46 | !default.pbxuser 47 | *.mode1v3 48 | !default.mode1v3 49 | *.mode2v3 50 | !default.mode2v3 51 | *.perspectivev3 52 | !default.perspectivev3 53 | xcuserdata/ 54 | 55 | ## Other 56 | *.moved-aside 57 | *.xccheckout 58 | *.xcscmblueprint 59 | 60 | 61 | ### Android ### 62 | # Built application files 63 | *.apk 64 | *.ap_ 65 | 66 | # Files for the ART/Dalvik VM 67 | *.dex 68 | 69 | # Java class files 70 | *.class 71 | 72 | # Generated files 73 | gen/ 74 | out/ 75 | Resource.designer.cs 76 | 77 | # Gradle files 78 | .gradle/ 79 | 80 | # Local configuration file (sdk path, etc) 81 | local.properties 82 | 83 | # Proguard folder generated by Eclipse 84 | proguard/ 85 | 86 | # Log Files 87 | *.log 88 | 89 | # Android Studio Navigation editor temp files 90 | .navigation/ 91 | 92 | # Android Studio captures folder 93 | captures/ 94 | 95 | # Intellij 96 | *.iml 97 | .idea/workspace.xml 98 | .idea/tasks.xml 99 | .idea/libraries 100 | 101 | # Keystore files 102 | *.jks 103 | 104 | # External native build folder generated in Android Studio 2.2 and later 105 | .externalNativeBuild 106 | 107 | ### Android Patch ### 108 | gen-external-apklibs 109 | 110 | 111 | ### macOS ### 112 | *.DS_Store 113 | .AppleDouble 114 | .LSOverride 115 | 116 | # Icon must end with two \r 117 | Icon 118 | # Thumbnails 119 | ._* 120 | # Files that might appear in the root of a volume 121 | .DocumentRevisions-V100 122 | .fseventsd 123 | .Spotlight-V100 124 | .TemporaryItems 125 | .Trashes 126 | .VolumeIcon.icns 127 | .com.apple.timemachine.donotpresent 128 | # Directories potentially created on remote AFP share 129 | .AppleDB 130 | .AppleDesktop 131 | Network Trash Folder 132 | Temporary Items 133 | .apdisk 134 | 135 | 136 | ### Csharp ### 137 | ## Ignore Visual Studio temporary files, build results, and 138 | ## files generated by popular Visual Studio add-ons. 139 | ## 140 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 141 | 142 | # User-specific files 143 | *.suo 144 | *.user 145 | *.userosscache 146 | *.sln.docstates 147 | *.vcxproj.filters 148 | 149 | # User-specific files (MonoDevelop/Xamarin Studio) 150 | 151 | # Build results 152 | [Dd]ebug/ 153 | [Dd]ebugPublic/ 154 | [Rr]elease/ 155 | [Rr]eleases/ 156 | x64/ 157 | x86/ 158 | bld/ 159 | [Bb]in/ 160 | [Oo]bj/ 161 | [Ll]og/ 162 | 163 | # Visual Studio 2015 cache/options directory 164 | .vs/ 165 | # Uncomment if you have tasks that create the project's static files in wwwroot 166 | #wwwroot/ 167 | 168 | # MSTest test Results 169 | [Tt]est[Rr]esult*/ 170 | [Bb]uild[Ll]og.* 171 | 172 | # NUNIT 173 | *.VisualState.xml 174 | TestResult.xml 175 | 176 | # Build Results of an ATL Project 177 | [Dd]ebugPS/ 178 | [Rr]eleasePS/ 179 | dlldata.c 180 | 181 | # .NET Core 182 | project.lock.json 183 | project.fragment.lock.json 184 | artifacts/ 185 | **/Properties/launchSettings.json 186 | 187 | *_i.c 188 | *_p.c 189 | *_i.h 190 | *.ilk 191 | *.meta 192 | *.obj 193 | *.pch 194 | *.pdb 195 | *.pgc 196 | *.pgd 197 | *.rsp 198 | *.sbr 199 | *.tlb 200 | *.tli 201 | *.tlh 202 | *.tmp 203 | *.tmp_proj 204 | *.vspscc 205 | *.vssscc 206 | .builds 207 | *.pidb 208 | *.svclog 209 | *.scc 210 | 211 | # Chutzpah Test files 212 | _Chutzpah* 213 | 214 | # Visual C++ cache files 215 | ipch/ 216 | *.aps 217 | *.ncb 218 | *.opendb 219 | *.opensdf 220 | *.sdf 221 | *.cachefile 222 | *.VC.db 223 | *.VC.VC.opendb 224 | 225 | # Visual Studio profiler 226 | *.psess 227 | *.vsp 228 | *.vspx 229 | *.sap 230 | 231 | # TFS 2012 Local Workspace 232 | $tf/ 233 | 234 | # Guidance Automation Toolkit 235 | *.gpState 236 | 237 | # ReSharper is a .NET coding add-in 238 | _ReSharper*/ 239 | *.[Rr]e[Ss]harper 240 | *.DotSettings.user 241 | 242 | # JustCode is a .NET coding add-in 243 | .JustCode 244 | 245 | # TeamCity is a build add-in 246 | _TeamCity* 247 | 248 | # DotCover is a Code Coverage Tool 249 | *.dotCover 250 | 251 | # Visual Studio code coverage results 252 | *.coverage 253 | *.coveragexml 254 | 255 | # NCrunch 256 | _NCrunch_* 257 | .*crunch*.local.xml 258 | nCrunchTemp_* 259 | 260 | # MightyMoose 261 | *.mm.* 262 | AutoTest.Net/ 263 | 264 | # Web workbench (sass) 265 | .sass-cache/ 266 | 267 | # Installshield output folder 268 | [Ee]xpress/ 269 | 270 | # DocProject is a documentation generator add-in 271 | DocProject/buildhelp/ 272 | DocProject/Help/*.HxT 273 | DocProject/Help/*.HxC 274 | DocProject/Help/*.hhc 275 | DocProject/Help/*.hhk 276 | DocProject/Help/*.hhp 277 | DocProject/Help/Html2 278 | DocProject/Help/html 279 | 280 | # Click-Once directory 281 | publish/ 282 | 283 | # Publish Web Output 284 | *.[Pp]ublish.xml 285 | *.azurePubxml 286 | # TODO: Comment the next line if you want to checkin your web deploy settings 287 | # but database connection strings (with potential passwords) will be unencrypted 288 | *.pubxml 289 | *.publishproj 290 | 291 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 292 | # checkin your Azure Web App publish settings, but sensitive information contained 293 | # in these scripts will be unencrypted 294 | PublishScripts/ 295 | 296 | # NuGet Packages 297 | *.nupkg 298 | # The packages folder can be ignored because of Package Restore 299 | **/packages/* 300 | # except build/, which is used as an MSBuild target. 301 | !**/packages/build/ 302 | # Uncomment if necessary however generally it will be regenerated when needed 303 | #!**/packages/repositories.config 304 | # NuGet v3's project.json files produces more ignoreable files 305 | *.nuget.props 306 | *.nuget.targets 307 | 308 | # Microsoft Azure Build Output 309 | csx/ 310 | *.build.csdef 311 | 312 | # Microsoft Azure Emulator 313 | ecf/ 314 | rcf/ 315 | 316 | # Windows Store app package directories and files 317 | AppPackages/ 318 | BundleArtifacts/ 319 | _pkginfo.txt 320 | 321 | # Visual Studio cache files 322 | # files ending in .cache can be ignored 323 | *.[Cc]ache 324 | # but keep track of directories ending in .cache 325 | !*.[Cc]ache/ 326 | 327 | # Others 328 | ClientBin/ 329 | ~$* 330 | *~ 331 | *.dbmdl 332 | *.dbproj.schemaview 333 | *.jfm 334 | *.pfx 335 | *.publishsettings 336 | node_modules/ 337 | orleans.codegen.cs 338 | 339 | # Since there are multiple workflows, uncomment next line to ignore bower_components 340 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 341 | #bower_components/ 342 | 343 | # RIA/Silverlight projects 344 | Generated_Code/ 345 | 346 | # Backup & report files from converting an old project file 347 | # to a newer Visual Studio version. Backup files are not needed, 348 | # because we have git ;-) 349 | _UpgradeReport_Files/ 350 | Backup*/ 351 | UpgradeLog*.XML 352 | UpgradeLog*.htm 353 | 354 | # SQL Server files 355 | *.mdf 356 | *.ldf 357 | 358 | # Business Intelligence projects 359 | *.rdl.data 360 | *.bim.layout 361 | *.bim_*.settings 362 | 363 | # Microsoft Fakes 364 | FakesAssemblies/ 365 | 366 | # GhostDoc plugin setting file 367 | *.GhostDoc.xml 368 | 369 | # Node.js Tools for Visual Studio 370 | .ntvs_analysis.dat 371 | 372 | # Visual Studio 6 build log 373 | *.plg 374 | 375 | # Visual Studio 6 workspace options file 376 | *.opt 377 | 378 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 379 | *.vbw 380 | 381 | # Visual Studio LightSwitch build output 382 | **/*.HTMLClient/GeneratedArtifacts 383 | **/*.DesktopClient/GeneratedArtifacts 384 | **/*.DesktopClient/ModelManifest.xml 385 | **/*.Server/GeneratedArtifacts 386 | **/*.Server/ModelManifest.xml 387 | _Pvt_Extensions 388 | 389 | # Paket dependency manager 390 | .paket/paket.exe 391 | paket-files/ 392 | 393 | # FAKE - F# Make 394 | .fake/ 395 | 396 | # JetBrains Rider 397 | .idea/ 398 | *.sln.iml 399 | 400 | # CodeRush 401 | .cr/ 402 | 403 | # Python Tools for Visual Studio (PTVS) 404 | __pycache__/ 405 | *.pyc 406 | 407 | # Cake - Uncomment if you are using it 408 | # tools/ 409 | 410 | 411 | ### F# ### 412 | lib/debug 413 | lib/release 414 | Debug 415 | obj 416 | bin 417 | *.exe 418 | !.paket/paket.bootstrapper.exe 419 | 420 | 421 | ### SublimeText ### 422 | # cache files for sublime text 423 | *.tmlanguage.cache 424 | *.tmPreferences.cache 425 | *.stTheme.cache 426 | 427 | # workspace files are user-specific 428 | *.sublime-workspace 429 | 430 | # project files should be checked into the repository, unless a significant 431 | # proportion of contributors will probably not be using SublimeText 432 | # *.sublime-project 433 | 434 | # sftp configuration file 435 | sftp-config.json 436 | 437 | # Package control specific files 438 | Package Control.last-run 439 | Package Control.ca-list 440 | Package Control.ca-bundle 441 | Package Control.system-ca-bundle 442 | Package Control.cache/ 443 | Package Control.ca-certs/ 444 | bh_unicode_properties.cache 445 | 446 | # Sublime-github package stores a github token in this file 447 | # https://packagecontrol.io/packages/sublime-github 448 | GitHub.sublime-settings 449 | 450 | 451 | ### Swift ### 452 | # Xcode 453 | # 454 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 455 | 456 | ## Build generated 457 | 458 | ## Various settings 459 | 460 | ## Other 461 | *.xcuserstate 462 | 463 | ## Obj-C/Swift specific 464 | *.hmap 465 | *.ipa 466 | *.dSYM.zip 467 | *.dSYM 468 | 469 | ## Playgrounds 470 | timeline.xctimeline 471 | playground.xcworkspace 472 | 473 | # Swift Package Manager 474 | # 475 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 476 | # Packages/ 477 | .build/ 478 | 479 | # CocoaPods 480 | # 481 | # We recommend against adding the Pods directory to your .gitignore. However 482 | # you should judge for yourself, the pros and cons are mentioned at: 483 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 484 | # 485 | # Pods/ 486 | 487 | # Carthage 488 | # 489 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 490 | # Carthage/Checkouts 491 | 492 | Carthage/Build 493 | 494 | # fastlane 495 | # 496 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 497 | # screenshots whenever they are needed. 498 | # For more information about the recommended setup visit: 499 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 500 | 501 | fastlane/screenshots 502 | 503 | 504 | ### JetBrains ### 505 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 506 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 507 | 508 | # User-specific stuff: 509 | 510 | # Sensitive or high-churn files: 511 | .idea/dataSources/ 512 | .idea/dataSources.ids 513 | .idea/dataSources.xml 514 | .idea/dataSources.local.xml 515 | .idea/sqlDataSources.xml 516 | .idea/dynamic.xml 517 | .idea/uiDesigner.xml 518 | 519 | # Gradle: 520 | .idea/gradle.xml 521 | 522 | # Mongo Explorer plugin: 523 | .idea/mongoSettings.xml 524 | 525 | ## File-based project format: 526 | *.iws 527 | 528 | ## Plugin-specific files: 529 | 530 | # IntelliJ 531 | /out/ 532 | 533 | # mpeltonen/sbt-idea plugin 534 | .idea_modules/ 535 | 536 | # JIRA plugin 537 | atlassian-ide-plugin.xml 538 | 539 | # Crashlytics plugin (for Android Studio and IntelliJ) 540 | com_crashlytics_export_strings.xml 541 | crashlytics.properties 542 | crashlytics-build.properties 543 | fabric.properties 544 | 545 | ### JetBrains Patch ### 546 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 547 | 548 | # *.iml 549 | # modules.xml 550 | # .idea/misc.xml 551 | # *.ipr 552 | 553 | 554 | ### Linux ### 555 | 556 | # temporary files which can be created if a process still has a handle open of a deleted file 557 | .fuse_hidden* 558 | 559 | # KDE directory preferences 560 | .directory 561 | 562 | # Linux trash folder which might appear on any partition or disk 563 | .Trash-* 564 | 565 | # .nfs files are created when an open file is removed but is still being accessed 566 | .nfs* 567 | 568 | 569 | ### MonoDevelop ### 570 | #User Specific 571 | *.usertasks 572 | 573 | #Mono Project Files 574 | *.resources 575 | test-results/ 576 | 577 | 578 | ### Objective-C ### 579 | # Xcode 580 | # 581 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 582 | 583 | ## Build generated 584 | 585 | ## Various settings 586 | 587 | ## Other 588 | 589 | ## Obj-C/Swift specific 590 | 591 | # CocoaPods 592 | # 593 | # We recommend against adding the Pods directory to your .gitignore. However 594 | # you should judge for yourself, the pros and cons are mentioned at: 595 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 596 | # 597 | # Pods/ 598 | 599 | # Carthage 600 | # 601 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 602 | # Carthage/Checkouts 603 | 604 | 605 | # fastlane 606 | # 607 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 608 | # screenshots whenever they are needed. 609 | # For more information about the recommended setup visit: 610 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 611 | 612 | 613 | # Code Injection 614 | # 615 | # After new code Injection tools there's a generated folder /iOSInjectionProject 616 | # https://github.com/johnno1962/injectionforxcode 617 | 618 | iOSInjectionProject/ 619 | 620 | ### Objective-C Patch ### 621 | 622 | 623 | ### Unity ### 624 | /[Ll]ibrary/ 625 | /[Tt]emp/ 626 | /[Oo]bj/ 627 | /[Bb]uild/ 628 | /[Bb]uilds/ 629 | /Assets/AssetStoreTools* 630 | 631 | # Autogenerated VS/MD/Consulo solution and project files 632 | ExportedObj/ 633 | .consulo/*.csproj 634 | .consulo/*.unityproj 635 | .consulo/*.sln 636 | .consulo/*.booproj 637 | .consulo/*.svd 638 | 639 | 640 | # Unity3D generated meta files 641 | *.pidb.meta 642 | 643 | # Unity3D Generated File On Crash Reports 644 | sysinfo.txt 645 | 646 | # Builds 647 | *.unitypackage 648 | 649 | 650 | ### Java ### 651 | 652 | # BlueJ files 653 | *.ctxt 654 | 655 | # Mobile Tools for Java (J2ME) 656 | .mtj.tmp/ 657 | 658 | # Package Files # 659 | *.jar 660 | *.war 661 | *.ear 662 | 663 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 664 | hs_err_pid* 665 | 666 | 667 | ### VisualStudio ### 668 | ## Ignore Visual Studio temporary files, build results, and 669 | ## files generated by popular Visual Studio add-ons. 670 | ## 671 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 672 | 673 | # User-specific files 674 | 675 | # User-specific files (MonoDevelop/Xamarin Studio) 676 | 677 | # Build results 678 | 679 | # Visual Studio 2015 cache/options directory 680 | # Uncomment if you have tasks that create the project's static files in wwwroot 681 | #wwwroot/ 682 | 683 | # MSTest test Results 684 | 685 | # NUNIT 686 | 687 | # Build Results of an ATL Project 688 | 689 | # .NET Core 690 | 691 | 692 | # Chutzpah Test files 693 | 694 | # Visual C++ cache files 695 | 696 | # Visual Studio profiler 697 | 698 | # TFS 2012 Local Workspace 699 | 700 | # Guidance Automation Toolkit 701 | 702 | # ReSharper is a .NET coding add-in 703 | 704 | # JustCode is a .NET coding add-in 705 | 706 | # TeamCity is a build add-in 707 | 708 | # DotCover is a Code Coverage Tool 709 | 710 | # Visual Studio code coverage results 711 | 712 | # NCrunch 713 | 714 | # MightyMoose 715 | 716 | # Web workbench (sass) 717 | 718 | # Installshield output folder 719 | 720 | # DocProject is a documentation generator add-in 721 | 722 | # Click-Once directory 723 | 724 | # Publish Web Output 725 | # TODO: Comment the next line if you want to checkin your web deploy settings 726 | # but database connection strings (with potential passwords) will be unencrypted 727 | 728 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 729 | # checkin your Azure Web App publish settings, but sensitive information contained 730 | # in these scripts will be unencrypted 731 | 732 | # NuGet Packages 733 | # The packages folder can be ignored because of Package Restore 734 | # except build/, which is used as an MSBuild target. 735 | # Uncomment if necessary however generally it will be regenerated when needed 736 | #!**/packages/repositories.config 737 | # NuGet v3's project.json files produces more ignoreable files 738 | 739 | # Microsoft Azure Build Output 740 | 741 | # Microsoft Azure Emulator 742 | 743 | # Windows Store app package directories and files 744 | 745 | # Visual Studio cache files 746 | # files ending in .cache can be ignored 747 | # but keep track of directories ending in .cache 748 | 749 | # Others 750 | 751 | # Since there are multiple workflows, uncomment next line to ignore bower_components 752 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 753 | #bower_components/ 754 | 755 | # RIA/Silverlight projects 756 | 757 | # Backup & report files from converting an old project file 758 | # to a newer Visual Studio version. Backup files are not needed, 759 | # because we have git ;-) 760 | 761 | # SQL Server files 762 | 763 | # Business Intelligence projects 764 | 765 | # Microsoft Fakes 766 | 767 | # GhostDoc plugin setting file 768 | 769 | # Node.js Tools for Visual Studio 770 | 771 | # Visual Studio 6 build log 772 | 773 | # Visual Studio 6 workspace options file 774 | 775 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 776 | 777 | # Visual Studio LightSwitch build output 778 | 779 | # Paket dependency manager 780 | 781 | # FAKE - F# Make 782 | 783 | # JetBrains Rider 784 | 785 | # CodeRush 786 | 787 | # Python Tools for Visual Studio (PTVS) 788 | 789 | # Cake - Uncomment if you are using it 790 | # tools/ 791 | 792 | ### VisualStudio Patch ### 793 | 794 | # End of https://www.gitignore.io/api/xamarinstudio,visualstudio,visualstudiocode,xcode,android,macos,csharp,f#,fastlane,java,jetbrains,linux,monodevelop,objective-c,swift,sublimetext,unity 795 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Xamarin Azure Challenge 2 | 3 | Welcome to the Xamarin Azure Challenge! 4 | 5 | The goal is to create a serverless [Azure Function](https://azure.microsoft.com/services/functions?WT.mc_id=xamarinazurechallenge-github-bramin) and connect it to a [Xamarin](https://dotnet.microsoft.com/apps/xamarin?WT.mc_id=xamarinazurechallenge-github-bramin) mobile app. 6 | 7 | ### Winners 8 | The winner list has been announced here: https://github.com/xamarin/XamarinAzureChallenge/blob/master/WinnerList.md. 9 | 10 | If you are among the winners, congratulations! If not, rest assured that we have a little something for you too as a thank you token for your participation. 11 | 12 | Emails with instructions on how to proceed will follow soon. 13 | 14 | ### Challenge Info 15 | 16 | The challenge begins 23 September 2019, and ends at 2359 PT on 23 October 2019. 17 | 18 | - Ten (10) Grand Prizes: 19 | - Each winner will receive Microsoft Surface Headphones 20 | 21 | - One Thousand (1,000) Prizes: 22 | - Each winner will receive a 3-month Xbox Game Pass 23 | 24 | Learn more about the challenge: https://github.com/xamarin/XamarinAzureChallenge/blob/master/TermsAndConditions.md 25 | 26 | 27 | ### Challenge Objectives 28 | 29 | 1. Create and publish a serverless [Azure Function](https://azure.microsoft.com/services/functions?WT.mc_id=xamarinazurechallenge-github-bramin) 30 | 2. Add the Azure Function url to the [Xamarin.Forms](https://docs.microsoft.com/xamarin/xamarin-forms?WT.mc_id=xamarinazurechallenge-github-bramin) application 31 | 3. Submit your entry from the Xamarin.Forms application to your Azure Function 32 | 33 | ## Task 0: Prerequisites 34 | 35 | 1. Create Azure Subscription 36 | * If you do not currently have an Azure subscription, sign up for a [free Azure account](https://azure.microsoft.com/free?WT.mc_id=xamarinazurechallenge-github-bramin) that includes a $200 Azure Credit 37 | 2. Install Visual Studio + Xamarin Tools 38 | * On PC, [follow these steps to install Visual Studio with Xamarin](https://docs.microsoft.com/xamarin/get-started/installation/windows?WT.mc_id=xamarinazurechallenge-github-bramin) 39 | * On Mac, [follow these steps to install Visual Studio for Mac with Xamarin](https://docs.microsoft.com/visualstudio/mac/installation?view=vsmac-2019&WT.mc_id=xamarinazurechallenge-github-bramin) 40 | 41 | 42 | ## Task 1: Create an Azure Function resource in Azure 43 | 44 | ### 1. Retrieve Source Code 45 | 46 | We have two options to retrieve the code for the Xamarin Azure Challenge: 47 | * [Clone the repository](#1a-clone-the-repository) 48 | * [Download the source code](#1b-download-source-code) 49 | 50 | #### 1a. Clone the repository 51 | 52 | To [clone](https://git-scm.com/docs/git-clone) this repository, run this command in your favorite terminal: 53 | 54 | ``` bash 55 | git clone https://github.com/xamarin/XamarinAzureChallenge.git 56 | ``` 57 | 58 | #### 1b. Download Source Code 59 | 60 | To download the source code, click this link: https://github.com/xamarin/XamarinAzureChallenge/archive/master.zip 61 | 62 | > **Note:** On a PC, save the source code in a folder close to your root directory, e.g. `C:\XamarinAzureChallenge\`. If the folder path is too many characters long, you may get errors while publishing the code to the Azure Functions. 63 | 64 | ### 2. (Windows) Move Code to `C:\XamarinAzureChallenge` Folder 65 | 66 | 1. (Windows) After retrieving the source code, move the `XamarinAzureChallenge` folder to `C:\XamarinAzureChallenge` 67 | - (macOS) *Skip this step* 68 | 69 | > **Note:** Moving the code to `C:\XamarinAzureChallenge` ensures that the [`MAX_PATH` limit](https://docs.microsoft.com/windows/win32/fileio/naming-a-file?WT.mc_id=xamarinazurechallenge-github-bramin#enable-long-paths-in-windows-10-version-1607-and-later) will not be hit. On Windows 10, it is possible to remove the `MAX_PATH` limit following these instructions: https://www.ryadel.com/en/enable-ntfs-win32-long-paths-policy-remove-255-260-characters-limit-windows-10/ 70 | 71 | ### 3. Publish Azure Function 72 | 73 | After cloning the repository, we have 3 options to create our Azure Function: 74 | 75 | 1. Use [Visual Studio on PC](#3a-use-visual-studio-on-pc) 76 | - [Learn More](https://blogs.msdn.microsoft.com/benjaminperkins/2018/04/05/deploy-an-azure-function-created-from-visual-studio?WT.mc_id=xamarinazurechallenge-github-bramin) 77 | 2. Use [Visual Studio for Mac](#3b-use-visual-studio-for-mac) 78 | - [Learn More](https://docs.microsoft.com/visualstudio/mac/publish-app-svc?WT.mc_id=xamarinazurechallenge-github-bramin) 79 | 3. Use [Azure CLI](#3c-use-azure-cli) 80 | - [Learn More](https://docs.microsoft.com/azure/azure-functions/functions-create-first-azure-function-azure-cli?WT.mc_id=xamarinazurechallenge-github-bramin) 81 | 82 | #### 3a. Use Visual Studio on PC 83 | 84 | 1. In Visual Studio on PC, open `XamarinAzureChallenge.sln` 85 | 86 | 2. In Visual Studio, in the top toolbar, select **File** > **Account Settings...** 87 | 88 | ![Account Settings...](https://user-images.githubusercontent.com/13558917/65535259-eab9c200-deb5-11e9-823c-17d4f49769bc.png) 89 | 90 | 3. In the **Account Settings** window, select **Add an account...** 91 | 92 | > **Note:** If your Azure account is already visible, you may skip this step 93 | 94 | ![Add an account](https://user-images.githubusercontent.com/13558917/65535258-ea212b80-deb5-11e9-84a8-c2c722f6b64a.png) 95 | 96 | 4. In the **Sign in to your account** pop-up, log in to your Azure account 97 | 98 | > **Note:** If your Azure account was already visible, you may skip this step 99 | 100 | ![Sign in to your account](https://user-images.githubusercontent.com/13558917/65535257-ea212b80-deb5-11e9-9ad6-a33bfea6b534.png) 101 | 102 | 5. In the **Account Settings** window, select **Close** 103 | 104 | ![Close](https://user-images.githubusercontent.com/13558917/65535255-ea212b80-deb5-11e9-9748-6e646c032028.png) 105 | 106 | 6. In Visual Studio, in the **Solution Explorer**, right-click on **Backend** > **XamarinAzureChallenge.Functions** 107 | 108 | 7. In the right-click menu, select in **Publish** 109 | 110 | ![publish](https://user-images.githubusercontent.com/13558917/65265720-82e33000-dadf-11e9-9a23-d910ac159790.png) 111 | 112 | 8. In the **Pick a publish target** window, select the following: 113 | 114 | - **Azure Functions Consumption Plan** 115 | - [x] **Create New** 116 | 117 | > **Note:** If publish targets don't appear, [install Azure development workload](https://docs.microsoft.com/azure/azure-functions/functions-create-your-first-function-visual-studio?WT.mc_id=xamarinazurechallenge-github-bramin#prerequisites). 118 | 119 | 9. In the **Pick a publish target** window, select **Publish** 120 | 121 | ![Pick a publish target](https://user-images.githubusercontent.com/13558917/65265726-84145d00-dadf-11e9-9c14-716aaf2e3f18.png) 122 | 123 | 10. In the **Create New** window, enter the following information: 124 | - **Name:** XamarinAzureChallenge-[Your Name] 125 | - **Note:** Replace `[Your Name]` with your name to ensure the Azure Function name is unique 126 | - In this example, I'm using `XamarinAzureChallenge-Brandon` 127 | - **Subscription:** [Select your Azure Subscription] 128 | - **Resource Group** 129 | - **New** 130 | - **New resource group name**: XamarinAzureChallenge 131 | - **OK** 132 | - **Location:** [Select the Azure Data Center Closest To You] 133 | - **Azure Storage** 134 | - **New** 135 | - **Account Name:** xamarinazure[Your Name] 136 | - **Note:** Replace `[Your Name]` with your name to ensure the Azure Storage name is unique 137 | - In this example, I'm using "xamarinazurebrandon" 138 | - **Location:** [Select the Azure Data Center Closest To You] 139 | - **Account type:** Standard - Locally Redundant Storage 140 | - **OK** 141 | 142 | 11. In the **Create New** window, click **Create** 143 | 144 | ![Create New App Service](https://user-images.githubusercontent.com/13558917/65271517-52a18e80-daeb-11e9-8854-972bce47134e.png) 145 | 146 | 12. Standby while Visual Studio creates our Azure Function resources 147 | 148 | ![Deploying](https://user-images.githubusercontent.com/13558917/65271519-533a2500-daeb-11e9-9a54-3a4b6afad613.png) 149 | 150 | 13. In the **Publish** window, to push our code to the newly created Azure Function, select **Publish** 151 | 152 | ![Publish](https://user-images.githubusercontent.com/13558917/65555679-24082700-dee2-11e9-9bcb-746b9f03470b.png) 153 | 154 | 14. In the **Visual Studio Toolbar**, select **View** > **Output** 155 | 156 | ![Output](https://user-images.githubusercontent.com/13558917/65556074-3afb4900-dee3-11e9-8b64-e41bf4e2a8f2.png) 157 | 158 | 15. In the **Output** window, ensure it says `Publish: 1 succeeded` 159 | 160 | ![Publish Succeeded](https://user-images.githubusercontent.com/13558917/65556072-3a62b280-dee3-11e9-982a-9e313b2ac34d.png) 161 | 162 | #### 3b. Use Visual Studio for Mac 163 | 164 | 1. In Visual Studio for Mac, open `XamarinAzureChallenge.sln` 165 | 166 | 2. In the **Apple Menu Bar**, select **Visual Studio** > **Account...** 167 | 168 | ![Visual Studio Accounts](https://user-images.githubusercontent.com/13558917/65533492-94974f80-deb2-11e9-9ea1-045ec4b2aa0a.png) 169 | 170 | 3. In the **Account** window, click **Add...** 171 | 172 | > **Note:** If your Azure account is already visible, you may skip this step 173 | 174 | ![Add Account](https://user-images.githubusercontent.com/13558917/65533509-9e20b780-deb2-11e9-888c-cffb8ef6c48b.png) 175 | 176 | 4. In the **Sign in to your account** pop-up, sign into your Azure account 177 | 178 | > **Note:** If your Azure account was already visible, you may skip this step 179 | 180 | ![Sign in to your account](https://user-images.githubusercontent.com/13558917/65533966-7b42d300-deb3-11e9-87bc-d0820f879ec5.png) 181 | 182 | 183 | 5. After logging into your Azure Account, in the **Account** window, select the red close button, **X** 184 | 185 | ![Close Accounts](https://user-images.githubusercontent.com/13558917/65534155-c1983200-deb3-11e9-99de-b9e0b5049f75.png) 186 | 187 | 6. In Visual Studio for Mac, in the **Solution Explorer**, right-click on **Backend** > **XamarinAzureChallenge.Functions** 188 | 189 | 7. In the right-click menu, select **Publish** > **Publish to Azure...** 190 | 191 | ![Publish to Azure](https://user-images.githubusercontent.com/13558917/65273393-1112e280-daef-11e9-9555-c3d47582ab18.png) 192 | 193 | 8. In the **Publish to Azure App Service** window, select your Azure Account 194 | 195 | 9. In the **Publish to Azure App Service** window, select **New** 196 | 197 | ![Create New App Service](https://user-images.githubusercontent.com/13558917/65275675-276f6d00-daf4-11e9-9dac-3b23c50964cc.png) 198 | 199 | 10. In the **Create New App Service on Azure** window, enter the following information: 200 | 201 | - **App Service Name:** XamarinAzureChallenge-[Your Name] 202 | - **Note:** Replace `[Your Name]` with your name to ensure the App Service Name is unique 203 | - In this example, I'm using `XamarinAzureChallenge-Brandon` 204 | - **Subscription:** [Select your Azure Subscription] 205 | - **Resource Group** 206 | - Click the **+** symbol 207 | - XamarinAzureChallenge 208 | - **Service Plan:** 209 | - [x] Custom 210 | - **Plan Name:** XamarinAzureChallenge 211 | - **Region:** [Select the Azure Data Center Closest to you] 212 | - **Pricing:** Consumption 213 | 214 | 11. In the **Create New App Service on Azure** window, select **Next** 215 | 216 | ![Create New App Service](https://user-images.githubusercontent.com/13558917/65282499-09f5cf80-db03-11e9-9cd5-0fe898ceb173.png) 217 | 218 | 12. In the **Configure Storage Account** window, enter the following information: 219 | 220 | - **Storage Account:** 221 | - [x] Custom 222 | - **Account Name:** xamarinazure[Your Name] 223 | - **Note:** Replace `[Your Name]` with your name to ensure the Storage Account Name is unique 224 | - In this example, I'm using "xamarinazurebrandon" 225 | - **Account Type:** Standard - Locally Redundant Storage 226 | 227 | 13. In the **Configure Storage Account** window, select **Create** 228 | 229 | ![Configure Storage Account](https://user-images.githubusercontent.com/13558917/65274742-0c9bf900-daf2-11e9-90af-da04b5539d75.png) 230 | 231 | 14. In the **Create Azure App Service** pop up, select **OK** 232 | 233 | ![OK](https://user-images.githubusercontent.com/13558917/65279318-f135eb80-dafb-11e9-97d3-351a247348ee.png) 234 | 235 | 15. In Visual Studio, in the menu bar, select **View** > **Pads** > **Azure** 236 | 237 | ![Azure Pad](https://user-images.githubusercontent.com/13558917/65274737-0b6acc00-daf2-11e9-85bd-552ff9b01049.png) 238 | 239 | 16. In Visual Studio, in the **Azure** pad, ensure the code is **Deploying...** 240 | 241 | ![Deploying](https://user-images.githubusercontent.com/13558917/65274736-0ad23580-daf2-11e9-94e6-531d22f2e0d1.png) 242 | 243 | 17. Stand by while Visual Studio for Mac publishes our code to our Azure Function 244 | 245 | #### 3c. Use Azure CLI 246 | 247 | > As a prerequisite, you must install [Azure Core Tools version 2.x](https://docs.microsoft.com/azure/azure-functions/functions-run-local?WT.mc_id=xamarinazurechallenge-github-bramin#v2) and [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli?WT.mc_id=xamarinazurechallenge-github-bramin). 248 | > 249 | > Alternatively, if you do not wish to install these tools locally, you can use these CLI tools pre-installed in a browser via the [Azure Cloud Shell](https://shell.azure.com/bash?WT.mc_id=xamarinazurechallenge-github-bramin). 250 | 251 | 1. Open the terminal 252 | - [How to open the macOS Terminal](https://macpaw.com/how-to/use-terminal-on-mac) 253 | - [How to open the Windows Terminal](https://www.quora.com/How-do-I-open-terminal-in-windows) 254 | 255 | 2. In the terminal, enter the following command to login into Azure CLI: 256 | 257 | ```bash 258 | az login 259 | ``` 260 | > **Note:** Stand by until the Azure CLI opens your browser to the Azure Login page 261 | 262 | 3. In the automatically-opened browser window, on the Azure Login page, log into your Azure Account 263 | 264 | 4. In the terminal, enter the following command to create a new Azure Resource Group: 265 | 266 | ```bash 267 | az group create --name XamarinAzureChallenge --location westeurope 268 | ``` 269 | 270 | > **Note:** If you have more than one subscription you will need to especify the subscription in which the resource group will be created using `--subscription [your Azure Subscription ID]` 271 | > 272 | > [How to find your Azure Subscription ID ](https://blogs.msdn.microsoft.com/mschray/2016/03/18/getting-your-azure-subscription-guid-new-portal?WT.mc_id=xamarinazurechallenge-github-bramin) 273 | 274 | 5. In the terminal, enter the following command to create a new Azure Storage Account: 275 | 276 | ```bash 277 | az storage account create --name xamarinazure[Your Name] --location westeurope --resource-group XamarinAzureChallenge --sku Standard_LRS 278 | ``` 279 | > **Note:** Replace `[Your Name]` with your name to ensure the storage name is unique 280 | > 281 | > **Note:** If you have more than one subscription you will need to especify the subscription in which the resource group will be created using `--subscription [your Azure Subscription ID]` 282 | > 283 | > [How to find your Azure Subscription ID ](https://blogs.msdn.microsoft.com/mschray/2016/03/18/getting-your-azure-subscription-guid-new-portal?WT.mc_id=xamarinazurechallenge-github-bramin) 284 | 285 | 6. In the terminal, enter the following command to create a function app: 286 | 287 | ```bash 288 | az functionapp create --resource-group XamarinAzureChallenge --consumption-plan-location westeurope --name XamarinAzureChallenge-[Your Name] --storage-account xamarinazure[Your Name] --runtime dotnet 289 | ``` 290 | > **Note:** Replace `[Your Name]` with your name to ensure the functionapp name is unique 291 | > 292 | > **Note:** For `--storage-account`, use the storage account created in the previous step 293 | > 294 | > **Note:** If you have more than one subscription you will need to especify the subscription in which the resource group will be created using `--subscription [your Azure Subscription ID]` 295 | > 296 | > [How to find your Azure Subscription ID ](https://blogs.msdn.microsoft.com/mschray/2016/03/18/getting-your-azure-subscription-guid-new-portal?WT.mc_id=xamarinazurechallenge-github-bramin) 297 | 298 | > **Note:** The Azure Function name must be unique, which is why we append our name 299 | 300 | 7. In the terminal, enter the following command to navigate to the project folder `XamarinAzureChallenge.Functions` project folder. 301 | 302 | - Windows 303 | - `cd [Your Path to XamarinAzureChallengeSource Code]\src\XamarinAzureChallenge.Functions` 304 | - macOS 305 | - `cd [Your Path to XamarinAzureChallengeSource Code]/src/XamarinAzureChallenge.Functions` 306 | 307 | 8. In the terminal, enter the following command to publish our code to our Azure Function: 308 | 309 | ```bash 310 | func azure functionapp publish XamarinAzureChallenge-[Your Name] 311 | ``` 312 | > **Note:** Replace `[Your Name]` with your name, using the same account name [created earlier](#2b-use-azure-cli) 313 | 314 | 315 | ## Task 2: Configure Azure Function 316 | 317 | Before our Azure Function can submit our entry for the XamarinAzureChallenge, we'll need to configure a few items. 318 | 319 | ### 1. Add Submission Url to Environment Variables 320 | 321 | Azure Functions allow us to store Environment Variables in the cloud that our Functions app can retrieve at runtime. In this step, we'll add the submission url as an Environment Variable. 322 | 323 | 1. In your browser, navigate to the [Azure Portal](http://portal.azure.com?WT.mc_id=xamarinazurechallenge-github-bramin) 324 | 325 | 2. In the Azure Portal, on the left-hand menu, select the cube-shaped **Resource Groups** icon 326 | 327 | ![Resource Groups Icon](https://user-images.githubusercontent.com/13558917/65279226-bb910280-dafb-11e9-8691-68c08204a84e.png) 328 | 329 | 3. In the **Resource Groups** window, in the filter box, enter `XamarinAzureChallenge` 330 | 331 | 4. In the **Resource Groups** window, select the **XamarinAzureChallenge** Resource Group 332 | 333 | ![XamarinAzureChallenge Resource Group](https://user-images.githubusercontent.com/13558917/65279225-baf86c00-dafb-11e9-9536-549e24b4ae24.png) 334 | 335 | 5. In the **XamarinAzureChallenge Resource Group**, select the function app **XamarinAzureChallenge-[Your Name]** 336 | 337 | ![Open Function App](https://user-images.githubusercontent.com/13558917/65279223-ba5fd580-dafb-11e9-8144-431d8cfad5f0.png) 338 | 339 | 6. In the XamarinAzureChallenge Function, in the **Configured features** frame, select **Configuration** 340 | 341 | ![Configuration](https://user-images.githubusercontent.com/13558917/65397032-a3beb600-dd69-11e9-9204-13e4f4cbd9c2.png) 342 | 343 | 7. In the **Application Settings** window, select **+ New application setting** 344 | 345 | ![New Application Setting](https://user-images.githubusercontent.com/13558917/65397028-a3261f80-dd69-11e9-8ab0-347c39e6f612.png) 346 | 347 | 8. In the **Add/Edit application setting** window, enter the following data: 348 | - **Name:** END_POINT 349 | - **Value:** https://xamarinazurechallenge-backend.azurewebsites.net/api/SubmitChallengeResult 350 | 351 | 9. In the **Add/Edit application setting** window, select **OK** 352 | 353 | ![Add/Edit Application Setting](https://user-images.githubusercontent.com/13558917/65477931-c241b180-de3c-11e9-9111-2fe516ef4a5a.png) 354 | 355 | 10. In the **Add/Edit application setting** window, select the **Save** 356 | 357 | ![Save Application Settings](https://user-images.githubusercontent.com/13558917/65440738-0c477a80-ddde-11e9-81b2-9c1f5f4bb4cb.png) 358 | 359 | 11. Stand by while the settings are saved 360 | 361 | ![Updating App Settings](https://user-images.githubusercontent.com/13558917/65441097-aefff900-ddde-11e9-9456-e638a77efc5c.png) 362 | 363 | 12. In the **Add/Edit application setting** window, select the close button, **X** 364 | 365 | ![Close Application Settings](https://user-images.githubusercontent.com/13558917/65399076-f3a47980-dd77-11e9-9e21-e1d3abda31ad.jpg) 366 | 367 | 368 | ### 2. Enable Access Control (IAM) 369 | 370 | To ensure a valid submission, the Function App will verify the Azure Subscription ID using [Managed Identity](https://docs.microsoft.com/azure/app-service/overview-managed-identity#adding-a-system-assigned-identity) & [Access Control](https://docs.microsoft.com/azure/role-based-access-control/role-assignments-portal#overview-of-access-control-iam?WT.mc_id=xamarinazurechallenge-github-bramin). Let's enable both. 371 | 372 | > **Note:** Azure Functions using Linux Consumption Plans don't support IAM. Be sure you've followed the instructions in [Step 2](#2-publish-azure-function) which create an Azure Function using the Windows Consumption Plan. 373 | 374 | 1. In the **XamarinAzureChallenge** window, select **Platform features** 375 | 376 | ![Platform Features](https://user-images.githubusercontent.com/13558917/65397766-ff8c3d80-dd6f-11e9-98d4-c8640da32e37.png) 377 | 378 | 2. In the **Platform features** window, select **Identity** 379 | 380 | ![Identity](https://user-images.githubusercontent.com/13558917/65397882-db7d2c00-dd70-11e9-82a7-d1dfe8351574.png) 381 | 382 | 3. In the **Identity** window, in the **System assigned** tab, set the **Status** to **On** 383 | 384 | 4. In the **Identity** window, select **Save** 385 | 386 | ![System assigned identity](https://user-images.githubusercontent.com/13558917/65441645-9b08c700-dddf-11e9-9e30-6f23f171eac8.png) 387 | 388 | 5. In the confirmation popup, select **Yes** 389 | 390 | ![Confirmation Popup](https://user-images.githubusercontent.com/13558917/65478063-22d0ee80-de3d-11e9-9f8e-467e8d1e2113.png) 391 | 392 | 6. Stand by while System Assigned Identity is enabled 393 | 394 | ![Enable Identity](https://user-images.githubusercontent.com/13558917/65441491-541ad180-dddf-11e9-9646-ced9576f9178.png) 395 | 396 | 7. In the **Identity** window, click the close button, **X** 397 | 398 | ![Close Identity](https://user-images.githubusercontent.com/13558917/65397024-a28d8900-dd69-11e9-8080-a83a78429035.png) 399 | 400 | 8. In the **Platform features** tab, select **Access control (IAM)** 401 | 402 | ![IAM](https://user-images.githubusercontent.com/13558917/65398031-eedcc700-dd71-11e9-9610-ec28e148b58d.png) 403 | 404 | 9. In the **Access Control** window, select **+Add** > **Add role assignment** 405 | 406 | ![Add role assignment](https://user-images.githubusercontent.com/13558917/65397022-a1f4f280-dd69-11e9-93a3-7b9172cddff3.png) 407 | 408 | 10. In the right-hand fly-out menu **Add role assignment**, make the following selections: 409 | - **Role:** Owner 410 | - **Assign Access to:** Azure AD user, group or service principal 411 | - **Select:** xamarinazurechallenge 412 | 413 | 11. In the right-hand fly-out menu **Add role assignment**, select **XamarinAzureChallenge-[Your Name]** 414 | 415 | ![Add role assignment, 1](https://user-images.githubusercontent.com/13558917/65398164-f486dc80-dd72-11e9-9e5c-8ce2b3672ccb.png) 416 | 417 | 12. In the right-hand fly-out menu **Add role assignment**, select **Save** 418 | 419 | ![Save role assignment](https://user-images.githubusercontent.com/13558917/65398260-6eb76100-dd73-11e9-894a-8bb75e93a406.png) 420 | 421 | ## Task 3: Configure the Xamarin App 422 | 423 | ### 1. Retrieve Azure Function URL 424 | 425 | After publishing our Azure Function, we are ready to configure our Xamarin app with our Azure Function's URL. 426 | 427 | 1. In your browser, navigate to the [Azure Portal](http://portal.azure.com?WT.mc_id=xamarinazurechallenge-github-bramin) 428 | 429 | 2. In the Azure Portal, on the left-hand menu, select the cube-shaped **Resource Groups** icon 430 | 431 | ![Resource Groups Icon](https://user-images.githubusercontent.com/13558917/65279226-bb910280-dafb-11e9-8691-68c08204a84e.png) 432 | 433 | 3. In the **Resource Groups** window, in the filter box, enter `XamarinAzureChallenge` 434 | 435 | 4. In the **Resource Groups** window, select the **XamarinAzureChallenge** Resource Group 436 | 437 | ![XamarinAzureChallenge Resource Group](https://user-images.githubusercontent.com/13558917/65279225-baf86c00-dafb-11e9-9536-549e24b4ae24.png) 438 | 439 | 5. In the **XamarinAzureChallenge Resource Group**, select the function app **XamarinAzureChallenge-[Your Name]** 440 | 441 | ![Open Function App](https://user-images.githubusercontent.com/13558917/65279223-ba5fd580-dafb-11e9-8144-431d8cfad5f0.png) 442 | 443 | 6. In the **Function Apps** window, select **XamarinAzureChallenge** > **Functions** > **SubmitChallengeFunction** 444 | 445 | ![Submit Challenge Function](https://user-images.githubusercontent.com/13558917/65282159-3a893980-db02-11e9-8331-57a34cfab44a.png) 446 | 447 | 7. In the **SubmitChallengeFunction** window, select **Get function url** 448 | 449 | ![Get function url](https://user-images.githubusercontent.com/13558917/65279218-b8961200-dafb-11e9-8634-f33db35197e7.png) 450 | 451 | 8. In the **Get function url** window, select **Copy** 452 | 453 | ![Copy](https://user-images.githubusercontent.com/13558917/65279215-b7fd7b80-dafb-11e9-9e2a-badb0f869cb2.png) 454 | 455 | ### 2. Add the Azure Function URL to Xamarin App 456 | 457 | 1. In Visual Studio, open `XamarinAzureChallenge.sln` 458 | 459 | 2. In Visual Studio, in the Solution Explorer, open **Mobile** > **XamarinAzureChallenge** > **ViewModels** > **UserDataViewModel.cs** 460 | 461 | 3. In the **UserDataViewModel** editor, comment out the `#error` compiler directive by prepending `//`: 462 | 463 | ```csharp 464 | //#error Missing Azure Function Endpoint Url. Replace "Enter Your Function API Url Here" with your Azure Function Endpoint Url 465 | ``` 466 | 467 | 4. In the **UserDataViewModel** editor, paste your Azure Function Url to `private const string endpoint`: 468 | 469 | ```csharp 470 | private const string endpoint = "[Enter your Azure Function URL]"; 471 | ``` 472 | > **Note:** Replace `[Enter your Azure Function URL]` with the [URL retrieved in the previous step](#1-retrieve-azure-function-url) 473 | 474 | ## Task 4: Run the Xamarin App 475 | 476 | 1. In Visual Studio, in the Solution Explorer, right-click on `XamarinAzureChallenge.Android` 477 | 478 | > **Note:** To run the iOS app, right-click on `XamarinAzureChallenge.iOS` 479 | 480 | 2. In the right-click menu, select **Set As Startup Project** 481 | 482 | ![Set Startup Project](https://user-images.githubusercontent.com/13558917/65280449-5f7bad80-dafe-11e9-9333-687fbb827d32.png) 483 | 484 | 3. In Visual Studio, at the top, select the arrow icon to build/deploy the app 485 | 486 | ![Build/Deploy](https://user-images.githubusercontent.com/13558917/65280451-60acda80-dafe-11e9-96fa-64abd26309d5.png) 487 | 488 | 4. Ensure the app launches on your mobile device 489 | 490 | ![Xamarin Azure Challenge App](https://user-images.githubusercontent.com/13558917/65280918-5d661e80-daff-11e9-87e6-006f7428175f.png) 491 | 492 | 5. Follow the instructions on the mobile app to complete the Xamarin Azure Challenge 493 | 494 | 6. Upon completing the challenge, ensure the success screen is displayed 495 | 496 | ![Success](https://user-images.githubusercontent.com/13558917/65402551-543db180-dd8c-11e9-973c-fd42486fde82.png) 497 | 498 | ## Congratulations! 499 | 500 | You've successfully completed the Xamarin Azure Challenge. Keep an eye out for an email shortly! 501 | 502 | ## Report an issue 503 | 504 | If you found an issue with this challenge, please open an issue in this GitHub repo 505 | 506 | ## Additional Resources 507 | 508 | If you are interested in learning more about this topic, you can refer to the following resources: 509 | 510 | * [Azure Function Documentation](https://docs.microsoft.com/azure/azure-functions?WT.mc_id=xamarinazurechallenge-github-bramin) 511 | * [Xamarin Documentation](https://docs.microsoft.com/xamarin?WT.mc_id=xamarinazurechallenge-github-bramin) 512 | * [Azure Samples + Xamarin](https://github.com/Azure-Samples?utf8=%E2%9C%93&q=Xamarin&type=&language=&WT.mc_id=xamarinazurechallenge-github-bramin) 513 | -------------------------------------------------------------------------------- /TermsAndConditions.md: -------------------------------------------------------------------------------- 1 | MICROSOFT .NET DEVELOPER SWEEPSTAKES 2 | OFFICIAL RULES 3 | 4 | 5 | 1. SPONSOR 6 | 7 | These Official Rules (“Rules”) govern the operation of the Microsoft .Net developer Sweepstakes (“Sweepstakes”). Microsoft Corporation, One Microsoft Way, Redmond, WA, 98052, USA, is the Sweepstakes sponsor (“Sponsor”). 8 | 9 | 2. DEFINITIONS 10 | 11 | In these Rules, "Microsoft", "we", "our", and "us" refer to Sponsor and “you” and "yourself" refers to a Sweepstakes participant, which may be an individual person or an authorized representative entering on behalf of a business. By entering you (your parent/legal guardian if you are a minor) agree to be bound by these rules. 12 | 13 | 3. ENTRY PERIOD 14 | 15 | The Sweepstakes starts at 12:01 a.m. Pacific Time (PT) on September 23, 2019, and ends at 11:59 p.m. PT on October 23, 2019 (“Entry Period”). 16 | 17 | 18 | 4. ELIGIBILITY 19 | 20 | This is a trade Sweepstakes open only to persons skilled as a .NET developer, who are 18 years of age or older to be eligible. If you have not reached the age of majority in your country / region of residence you must have consent of a parent or legal guardian. Void in Cuba, Iran, North Korea, Sudan, Syria, Region of Crimea, and where prohibited. 21 | 22 | Employees and directors of Microsoft Corporation and its subsidiaries, affiliates, advertising agencies, and Sweepstakes Parties are not eligible, nor are persons involved in the execution or administration of this promotion, or the family members of each above (parents, children, siblings, spouse/domestic partners, or individuals residing in the same household). 23 | 24 | If you are participating in your capacity as an employee, it is your sole responsibility to comply with your employer’s gift policies. Microsoft will not be party to any disputes or actions related to this matter. Microsoft is committed to complying with government gift and ethics rules and therefore government and public sector employees are not eligible to enter. 25 | 26 | 27 | 5. HOW TO ENTER 28 | 29 | No Purchase Necessary. You will receive one entry by following these instructions successfully during the Entry Period. 30 | 31 | 1. Visit the official challenge site on [GitHub](https://github.com/xamarin/XamarinAzureChallenge) site at https://github.com/xamarin/XamarinAzureChallenge 32 | 2. Follow the instructions on the homepage to download (clone) the Sweepstakes code from the [GitHub repo](https://github.com/xamarin/XamarinAzureChallenge) 33 | 3. Follow instructions to open and deploy the Azure Function code and apply the necessary configuration changes 34 | 4. Follow instructions to build and run the Xamarin application on a mobile phone or a local emulator 35 | 5. Once you're able to launch the application successfully, you will be presented with a registration form 36 | 6. Follow instructions to complete and submit the registration form, including your contact details. 37 | 38 | Once you’ve successfully completed the steps above you will receive an email confirmation that your entry has been received. The entry limit is one per person overall. 39 | 40 | Any attempt by any you to obtain more than the stated number of entries by using multiple/different accounts, identities, registrations, logins, or any other methods will void your entries and you may be disqualified. Use of any automated system to participate is prohibited. 41 | 42 | We are not responsible for excess, lost, late, or incomplete entries. If disputed, entries will be deemed submitted by the “authorized account holder” of the eFwmail address, social media account, or other method used to enter. The “authorized account holder” is the natural person assigned to an email address by an internet or online service provider, or other organization responsible for assigning email addresses. 43 | 44 | 6. WINNER SELECTION AND NOTIFICATION 45 | 46 | Pending confirmation of eligibility, potential prize winners will be selected by Microsoft or their Agent in a random drawing from among all eligible entries received within 7 days following the Entry Period. 47 | 48 | Winners will be notified via the contact information provided during entry no more than 7 days following the drawing with prize claim instructions, including submission deadlines. If a selected winner cannot be contacted, is ineligible, fails to claim a prize or fails to return any Forms, the selected winner will forfeit their prize and an alternate winner will be selected time allowing. If you are a potential winner and you are 18 or older, but are considered a minor in your place of legal residence, we may require your parent or legal guardian to sign all required forms on your behalf. Only three alternate winners will be selected, after which unclaimed prizes will remain unawarded. 49 | 50 | 7. PRIZES 51 | 52 | The following prizes will be awarded: 53 | 54 | **Ten (10) Grand Prize (s)**. Each winner will receive: 55 | Microsoft Surface Headphones*. Approximate Retail Value (ARV) $360.00. 56 | 57 | **One Thousand (1,000) Grand Prize (s)**. Each winner will receive: 58 | A 3-month XBox Game Pass. Approximate Retail Value (ARV) $25.00. 59 | 60 | The ARV of electronic prizes is subject to price fluctuations in the consumer marketplace based on, among other things, any gap in time between the date the ARV is estimated for purposes of these Official Rules and the date the prize is awarded or redeemed. We will determine the value of the prize to be the fair market value at the time of prize award. 61 | 62 | The total Approximate Retail Value (ARV) of all prizes: $28,000 63 | 64 | We will only award one (1) prize(s) per person during the Entry Period. No more than the stated number of prizes will be awarded. No substitution, transfer, or assignment of prize permitted, except that Microsoft reserves the right to substitute a prize of equal or greater value in the event the offered prize is unavailable. Prizes are awarded “AS IS” with no warranty of any kind, either express or implied, including but not limited to, the implied warranties or merchantability, fitness for a particular purpose, or non-infringement. Prizes will be sent no later than 28 days after winner selection. Prize winners may be required to complete and return prize claim and / or tax forms (“Forms”) within the deadline stated in the winner notification. Taxes on the prize, if any, are the sole responsibility of the winner, who is advised to seek independent counsel regarding the tax implications of accepting a prize. By accepting a prize, you agree that Microsoft may use your entry, name, image and hometown online and in print, or in any other media, in connection with this Sweepstakes without payment or compensation to you, except where prohibited by law. 65 | 66 | 8. ODDS 67 | 68 | The odds of winning are based on the number of eligible entries received. 69 | 70 | 9. GENERAL CONDITIONS AND RELEASE OF LIABILITY 71 | 72 | To the extent allowed by law, by entering you agree to release and hold harmless Microsoft and its respective parents, partners, subsidiaries, affiliates, employees, and agents from any and all liability or any injury, loss, or damage of any kind arising in connection with this Sweepstakes or any prize won. 73 | 74 | All local laws apply. The decisions of Microsoft are final and binding. 75 | 76 | We reserve the right to cancel, change, or suspend this Sweepstakes for any reason, including cheating, technology failure, catastrophe, war, or any other unforeseen or unexpected event that affects the integrity of this Sweepstakes, whether human or mechanical. If the integrity of the Sweepstakes cannot be restored, we may select winners from among all eligible entries received before we had to cancel, change or suspend the Sweepstakes. 77 | 78 | If you attempt or we have strong reason to believe that you have compromised the integrity or the legitimate operation of this Sweepstakes by cheating, hacking, creating a bot or other automated program, or by committing fraud in any way, we may seek damages from you to the full extent of the law and you may be banned from participation in future Microsoft promotions. 79 | 80 | 10. GOVERNING LAW 81 | 82 | This Sweepstakes will be governed by the laws of the State of Washington, and you consent to the exclusive jurisdiction and venue of the courts of the State of Washington for any disputes arising out of this Sweepstakes. 83 | 84 | 11. USE OF YOUR ENTRY 85 | 86 | Personal data you provide while entering this Sweepstakes will be used by Microsoft and/or its agents and prize fulfillers acting on Microsoft’s behalf only for the administration and operation of this Sweepstakes and in accordance with the Microsoft Privacy Statement. 87 | 88 | 12. WINNERS LIST 89 | 90 | Send email to xamarin@microsoft.com with the subject line “.Net developer winners” within 30 days of October 23, 2019 to receive a list of winners that received a prize worth $25.00 or more. 91 | 92 | -------------------------------------------------------------------------------- /WinnerList.md: -------------------------------------------------------------------------------- 1 | ### Competition Winners 2 | 3 | If you are among the winners, congratulations! If not, rest assured that we have a little something for you as a thank you token for your participation. 4 | 5 | Emails with instructions on how to proceed will follow soon. 6 | 7 | ## Xbox GamePass winners 8 | The following entries were randomly selected for the GamePass credit prize 9 | 10 | - Mikolaj Kieres 11 | - Robert Ros 12 | - Rafael Alfredo Perez Gonzalez 13 | - Jake Porter 14 | - Fnu Jimmy 15 | - Sajeetharan sinnathurai 16 | - Tony Henrique Silva Melo 17 | - Dhruv Kanojia 18 | - Marco Del Frari 19 | - Andrejs Kravcenko 20 | - Lee McPherson 21 | - Daniel Martin 22 | - Ryan D Weaver 23 | - William Rodriguez 24 | - Hiteksha Govindbhai Kathiriya 25 | - Alexandre Nedelec 26 | - Iliyan Emilov Popov 27 | - Redas Pališkevičius 28 | - Charles Wong 29 | - Matt Goldman 30 | - Martin Zikmund 31 | - Ivan Chesa Moreno 32 | - Adam Barath 33 | 34 | 35 | ## Surface Headphones winners 36 | The following entries were randomly selected for the Surface Headphones prize 37 | 38 | - Zaw Htut 39 | - Alexandre Hogler 40 | - Alex Dunn 41 | - David Payne 42 | - Can Canbek 43 | - Marco Silva 44 | - Philipp Löwer 45 | - Jens Schadron 46 | - Gabriele Pannacci 47 | - Chris Ayers 48 | 49 | Thanks to everyone who participated in this challenge and we can't wait to see what you build with Xamarin, NET and Azure Functions 50 | -------------------------------------------------------------------------------- /doc/deploy/azuredeploy.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 3 | "contentVersion": "1.0.0.0", 4 | "parameters": { 5 | "storageAccounts_xamarinazurechallenge1_name": { 6 | "defaultValue": "xamarinazurechallenge1", 7 | "type": "String" 8 | }, 9 | "serverfarms_XamarinAzureChallengeFunctions1_name": { 10 | "defaultValue": "XamarinAzureChallengeFunctions1", 11 | "type": "String" 12 | } 13 | }, 14 | "variables": {}, 15 | "resources": [ 16 | { 17 | "type": "Microsoft.Storage/storageAccounts", 18 | "apiVersion": "2018-07-01", 19 | "name": "[parameters('storageAccounts_xamarinazurechallenge1_name')]", 20 | "location": "centralus", 21 | "tags": { 22 | "hidden-related:/providers/Microsoft.Web/sites/XamarinAzureChallengeFunctions1": "empty" 23 | }, 24 | "sku": { 25 | "name": "Standard_LRS", 26 | "tier": "Standard" 27 | }, 28 | "kind": "Storage", 29 | "properties": { 30 | "networkAcls": { 31 | "bypass": "AzureServices", 32 | "virtualNetworkRules": [], 33 | "ipRules": [], 34 | "defaultAction": "Allow" 35 | }, 36 | "supportsHttpsTrafficOnly": false, 37 | "encryption": { 38 | "services": { 39 | "file": { 40 | "enabled": true 41 | }, 42 | "blob": { 43 | "enabled": true 44 | } 45 | }, 46 | "keySource": "Microsoft.Storage" 47 | } 48 | } 49 | }, 50 | { 51 | "type": "Microsoft.Web/serverfarms", 52 | "apiVersion": "2016-09-01", 53 | "name": "[parameters('serverfarms_XamarinAzureChallengeFunctions1_name')]", 54 | "location": "Central US", 55 | "sku": { 56 | "name": "Y1", 57 | "tier": "Dynamic", 58 | "size": "Y1", 59 | "family": "Y", 60 | "capacity": 0 61 | }, 62 | "kind": "functionapp", 63 | "properties": { 64 | "name": "[parameters('serverfarms_XamarinAzureChallengeFunctions1_name')]", 65 | "perSiteScaling": false, 66 | "reserved": false, 67 | "targetWorkerCount": 0, 68 | "targetWorkerSizeId": 0 69 | } 70 | } 71 | ] 72 | } -------------------------------------------------------------------------------- /doc/solution.md: -------------------------------------------------------------------------------- 1 | # Solution 2 | 3 | We hope you tried to complete this challenge with all your effort and enthusiasm. 4 | 5 | If you did, and are still unable to complete the challenge, here you have the solution. We assume you have followed and completed the task 1 and task 2. 6 | 7 | ## Fixing the errors 8 | 9 | 1. By POST not by GET 10 | 11 | When you were trying make a POST request from Xamarin App to your Azure Function, it answered you with a **404 not found**. 12 | 13 | This error is allocated in the signature of the function. This Azure Function will only be triggered by a POST request, but in this code, we specified that the function only accepts GET requests. 14 | 15 | Change it to this: 16 | 17 | ```c# 18 | public static async Task Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req) 19 | ``` 20 | 21 | 22 | 2. Encoding.UTF8 not Encoding.UTF7 23 | 24 | At this point, it seems that all your code is correct. However, when you try to make a request you get a 500 error, even if the JSON data is correct. 25 | 26 | `SendToApi` is throwing 500, simply because the String Encoding is wrong. 27 | 28 | Change it to this: 29 | 30 | 31 | ```c# 32 | return await client.PostAsync(_uri, new StringContent(body, Encoding.UTF8, "application/json")); 33 | ``` 34 | 35 | 3. Fix Binding on *UserDataPage.xaml.cs* 36 | 37 | The BindingContext of the page is not configure so the bindings and commands that are invoked from the xaml code do not work. To solve this add as the last line of the *UserDataPage* constructor: 38 | 39 | ```c# 40 | BindingContext = new UserDataViewModel(); 41 | ``` 42 | 43 | 4. Fix serialization issue 44 | 45 | The model used to send the data to the Azure Function do not serialize the *Email* to Json. In User.cs class, locate the property *Email* and replace the 46 | 47 | ```c# 48 | [JsonIgnore] 49 | ``` 50 | 51 | with 52 | 53 | ```c# 54 | [JsonProperty(PropertyName="email")] 55 | ``` 56 | 57 | > Remember to deploy your Azure Function with the fixes! -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Assets/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories) and given a Build Action of "AndroidAsset". 3 | 4 | These files will be deployed with you package and will be accessible using Android's 5 | AssetManager, like this: 6 | 7 | public class ReadAsset : Activity 8 | { 9 | protected override void OnCreate (Bundle bundle) 10 | { 11 | base.OnCreate (bundle); 12 | 13 | InputStream input = Assets.Open ("my_asset.txt"); 14 | } 15 | } 16 | 17 | Additionally, some Android functions will automatically load asset files: 18 | 19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); 20 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Assets/roboto.regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Assets/roboto.regular.ttf -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/MainActivity.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Content.PM; 3 | using Android.OS; 4 | using Android.Runtime; 5 | 6 | namespace XamarinAzureChallenge.Droid 7 | { 8 | [Activity(Label = "XamarinAzureChallenge", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 9 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 10 | { 11 | public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults) 12 | { 13 | Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); 14 | base.OnRequestPermissionsResult(requestCode, permissions, grantResults); 15 | } 16 | 17 | protected override void OnCreate(Bundle savedInstanceState) 18 | { 19 | TabLayoutResource = Resource.Layout.Tabbar; 20 | ToolbarResource = Resource.Layout.Toolbar; 21 | 22 | base.OnCreate(savedInstanceState); 23 | 24 | global::Xamarin.Essentials.Platform.Init(this, savedInstanceState); 25 | global::Xamarin.Forms.Forms.Init(this, savedInstanceState); 26 | global::Xamarin.Forms.FormsMaterial.Init(this, savedInstanceState); 27 | 28 | LoadApplication(new App()); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Properties/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | using Android.App; 5 | 6 | // General Information about an assembly is controlled through the following 7 | // set of attributes. Change these attribute values to modify the information 8 | // associated with an assembly. 9 | [assembly: AssemblyTitle("XamarinAzureChallenge.Android")] 10 | [assembly: AssemblyDescription("")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("XamarinAzureChallenge.Android")] 14 | [assembly: AssemblyCopyright("Copyright © 2014")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | [assembly: ComVisible(false)] 18 | 19 | // Version information for an assembly consists of the following four values: 20 | // 21 | // Major Version 22 | // Minor Version 23 | // Build Number 24 | // Revision 25 | // 26 | // You can specify all the values or you can default the Build and Revision Numbers 27 | // by using the '*' as shown below: 28 | // [assembly: AssemblyVersion("1.0.*")] 29 | [assembly: AssemblyVersion("1.0.0.0")] 30 | [assembly: AssemblyFileVersion("1.0.0.0")] 31 | 32 | // Add some common permissions, these can be removed if not needed 33 | [assembly: UsesPermission(Android.Manifest.Permission.Internet)] 34 | [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)] 35 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/AboutResources.txt: -------------------------------------------------------------------------------- 1 | Images, layout descriptions, binary blobs and string dictionaries can be included 2 | in your application as resource files. Various Android APIs are designed to 3 | operate on the resource IDs instead of dealing with images, strings or binary blobs 4 | directly. 5 | 6 | For example, a sample Android app that contains a user interface layout (main.xml), 7 | an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 8 | would keep its resources in the "Resources" directory of the application: 9 | 10 | Resources/ 11 | drawable-hdpi/ 12 | icon.png 13 | 14 | drawable-ldpi/ 15 | icon.png 16 | 17 | drawable-mdpi/ 18 | icon.png 19 | 20 | layout/ 21 | main.xml 22 | 23 | values/ 24 | strings.xml 25 | 26 | In order to get the build system to recognize Android resources, set the build action to 27 | "AndroidResource". The native Android APIs do not operate directly with filenames, but 28 | instead operate on resource IDs. When you compile an Android application that uses resources, 29 | the build system will package the resources for distribution and generate a class called 30 | "Resource" that contains the tokens for each one of the resources included. For example, 31 | for the above Resources layout, this is what the Resource class would expose: 32 | 33 | public class Resource { 34 | public class drawable { 35 | public const int icon = 0x123; 36 | } 37 | 38 | public class layout { 39 | public const int main = 0x456; 40 | } 41 | 42 | public class strings { 43 | public const int first_string = 0xabc; 44 | public const int second_string = 0xbcd; 45 | } 46 | } 47 | 48 | You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main 49 | to reference the layout/main.xml file, or Resource.strings.first_string to reference the first 50 | string in the dictionary file values/strings.xml. 51 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/azureIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/azureIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/back_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/back_arrow.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/backgroundimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/backgroundimage.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/resultFailed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/resultFailed.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/resultOk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/resultOk.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/xamIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/xamIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/xamarinazure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-hdpi/xamarinazure.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/azureIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/azureIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/back_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/back_arrow.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/backgroundimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/backgroundimage.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/resultFailed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/resultFailed.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/resultOk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/resultOk.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/xamIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/xamIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/xamarinazure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-mdpi/xamarinazure.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-nodpi/Hexagon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-nodpi/Hexagon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/azureIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/azureIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/back_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/back_arrow.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/backgroundImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/backgroundImage.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/resultFailed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/resultFailed.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/resultOk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/resultOk.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/xamIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/xamIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/xamarinazure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xhdpi/xamarinazure.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/azureIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/azureIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/back_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/back_arrow.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/backgroundimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/backgroundimage.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/resultFailed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/resultFailed.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/resultOk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/resultOk.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/xamIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/xamIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/xamarinazure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxhdpi/xamarinazure.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/azureIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/azureIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/backgroundimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/backgroundimage.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/resultFailed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/resultFailed.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/resultOk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/resultOk.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/xamIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/xamIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/xamarinazure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/drawable-xxxhdpi/xamarinazure.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/layout/Tabbar.axml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/layout/Toolbar.axml: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-anydpi-v26/icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-anydpi-v26/icon_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-hdpi/icon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-hdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-hdpi/launcher_foreground.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-mdpi/icon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-mdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-mdpi/launcher_foreground.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-xhdpi/icon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-xhdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-xhdpi/launcher_foreground.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-xxhdpi/icon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-xxhdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-xxhdpi/launcher_foreground.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-xxxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-xxxhdpi/icon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | #3F51B5 5 | #303F9F 6 | #FF4081 7 | 8 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/Resources/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 26 | 27 | 30 | 31 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Android/XamarinAzureChallenge.Android.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | AnyCPU 6 | {B27527E8-5248-4A42-B958-35080C060C00} 7 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 8 | {c9e5eea5-ca05-42a1-839b-61506e0a37df} 9 | Library 10 | XamarinAzureChallenge.Droid 11 | XamarinAzureChallenge.Android 12 | True 13 | Resources\Resource.designer.cs 14 | Resource 15 | Properties\AndroidManifest.xml 16 | Resources 17 | Assets 18 | v9.0 19 | Xamarin.Android.Net.AndroidClientHandler 20 | 21 | 22 | Xamarin.Android.Net.AndroidClientHandler 23 | 24 | 25 | true 26 | portable 27 | false 28 | bin\Debug 29 | DEBUG; 30 | prompt 31 | 4 32 | None 33 | btls 34 | 35 | 36 | true 37 | pdbonly 38 | true 39 | bin\Release 40 | prompt 41 | 4 42 | true 43 | false 44 | true 45 | true 46 | btls 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 4.3.0.851321-pre3 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | {906E148B-01D5-4106-9C5B-404A8B655069} 96 | XamarinAzureChallenge 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Functions/.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | project.fragment.lock.json 46 | artifacts/ 47 | 48 | *_i.c 49 | *_p.c 50 | *_i.h 51 | *.ilk 52 | *.meta 53 | *.obj 54 | *.pch 55 | *.pdb 56 | *.pgc 57 | *.pgd 58 | *.rsp 59 | *.sbr 60 | *.tlb 61 | *.tli 62 | *.tlh 63 | *.tmp 64 | *.tmp_proj 65 | *.log 66 | *.vspscc 67 | *.vssscc 68 | .builds 69 | *.pidb 70 | *.svclog 71 | *.scc 72 | 73 | # Chutzpah Test files 74 | _Chutzpah* 75 | 76 | # Visual C++ cache files 77 | ipch/ 78 | *.aps 79 | *.ncb 80 | *.opendb 81 | *.opensdf 82 | *.sdf 83 | *.cachefile 84 | *.VC.db 85 | *.VC.VC.opendb 86 | 87 | # Visual Studio profiler 88 | *.psess 89 | *.vsp 90 | *.vspx 91 | *.sap 92 | 93 | # TFS 2012 Local Workspace 94 | $tf/ 95 | 96 | # Guidance Automation Toolkit 97 | *.gpState 98 | 99 | # ReSharper is a .NET coding add-in 100 | _ReSharper*/ 101 | *.[Rr]e[Ss]harper 102 | *.DotSettings.user 103 | 104 | # JustCode is a .NET coding add-in 105 | .JustCode 106 | 107 | # TeamCity is a build add-in 108 | _TeamCity* 109 | 110 | # DotCover is a Code Coverage Tool 111 | *.dotCover 112 | 113 | # NCrunch 114 | _NCrunch_* 115 | .*crunch*.local.xml 116 | nCrunchTemp_* 117 | 118 | # MightyMoose 119 | *.mm.* 120 | AutoTest.Net/ 121 | 122 | # Web workbench (sass) 123 | .sass-cache/ 124 | 125 | # Installshield output folder 126 | [Ee]xpress/ 127 | 128 | # DocProject is a documentation generator add-in 129 | DocProject/buildhelp/ 130 | DocProject/Help/*.HxT 131 | DocProject/Help/*.HxC 132 | DocProject/Help/*.hhc 133 | DocProject/Help/*.hhk 134 | DocProject/Help/*.hhp 135 | DocProject/Help/Html2 136 | DocProject/Help/html 137 | 138 | # Click-Once directory 139 | publish/ 140 | 141 | # Publish Web Output 142 | *.[Pp]ublish.xml 143 | *.azurePubxml 144 | # TODO: Comment the next line if you want to checkin your web deploy settings 145 | # but database connection strings (with potential passwords) will be unencrypted 146 | #*.pubxml 147 | *.publishproj 148 | 149 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 150 | # checkin your Azure Web App publish settings, but sensitive information contained 151 | # in these scripts will be unencrypted 152 | PublishScripts/ 153 | 154 | # NuGet Packages 155 | *.nupkg 156 | # The packages folder can be ignored because of Package Restore 157 | **/packages/* 158 | # except build/, which is used as an MSBuild target. 159 | !**/packages/build/ 160 | # Uncomment if necessary however generally it will be regenerated when needed 161 | #!**/packages/repositories.config 162 | # NuGet v3's project.json files produces more ignoreable files 163 | *.nuget.props 164 | *.nuget.targets 165 | 166 | # Microsoft Azure Build Output 167 | csx/ 168 | *.build.csdef 169 | 170 | # Microsoft Azure Emulator 171 | ecf/ 172 | rcf/ 173 | 174 | # Windows Store app package directories and files 175 | AppPackages/ 176 | BundleArtifacts/ 177 | Package.StoreAssociation.xml 178 | _pkginfo.txt 179 | 180 | # Visual Studio cache files 181 | # files ending in .cache can be ignored 182 | *.[Cc]ache 183 | # but keep track of directories ending in .cache 184 | !*.[Cc]ache/ 185 | 186 | # Others 187 | ClientBin/ 188 | ~$* 189 | *~ 190 | *.dbmdl 191 | *.dbproj.schemaview 192 | *.jfm 193 | *.pfx 194 | *.publishsettings 195 | node_modules/ 196 | orleans.codegen.cs 197 | 198 | # Since there are multiple workflows, uncomment next line to ignore bower_components 199 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 200 | #bower_components/ 201 | 202 | # RIA/Silverlight projects 203 | Generated_Code/ 204 | 205 | # Backup & report files from converting an old project file 206 | # to a newer Visual Studio version. Backup files are not needed, 207 | # because we have git ;-) 208 | _UpgradeReport_Files/ 209 | Backup*/ 210 | UpgradeLog*.XML 211 | UpgradeLog*.htm 212 | 213 | # SQL Server files 214 | *.mdf 215 | *.ldf 216 | 217 | # Business Intelligence projects 218 | *.rdl.data 219 | *.bim.layout 220 | *.bim_*.settings 221 | 222 | # Microsoft Fakes 223 | FakesAssemblies/ 224 | 225 | # GhostDoc plugin setting file 226 | *.GhostDoc.xml 227 | 228 | # Node.js Tools for Visual Studio 229 | .ntvs_analysis.dat 230 | 231 | # Visual Studio 6 build log 232 | *.plg 233 | 234 | # Visual Studio 6 workspace options file 235 | *.opt 236 | 237 | # Visual Studio LightSwitch build output 238 | **/*.HTMLClient/GeneratedArtifacts 239 | **/*.DesktopClient/GeneratedArtifacts 240 | **/*.DesktopClient/ModelManifest.xml 241 | **/*.Server/GeneratedArtifacts 242 | **/*.Server/ModelManifest.xml 243 | _Pvt_Extensions 244 | 245 | # Paket dependency manager 246 | .paket/paket.exe 247 | paket-files/ 248 | 249 | # FAKE - F# Make 250 | .fake/ 251 | 252 | # JetBrains Rider 253 | .idea/ 254 | *.sln.iml 255 | 256 | # CodeRush 257 | .cr/ 258 | 259 | # Python Tools for Visual Studio (PTVS) 260 | __pycache__/ 261 | *.pyc -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Functions/Functions/SubmitChallengeFunction.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net; 3 | using System.Net.Http; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using System.Web.Http; 7 | using Microsoft.AspNetCore.Http; 8 | using Microsoft.AspNetCore.Mvc; 9 | using Microsoft.Azure.WebJobs; 10 | using Microsoft.Azure.WebJobs.Extensions.Http; 11 | using Microsoft.Extensions.Logging; 12 | using XamarinAzureChallenge.Functions; 13 | using XamarinAzureChallenge.Shared.Models; 14 | 15 | namespace Microsoft.XamarinAzureChallenge.Functions 16 | { 17 | public static class SubmitChallengeFunction 18 | { 19 | [FunctionName(nameof(SubmitChallengeFunction))] 20 | public static async Task Run([HttpTrigger(AuthorizationLevel.Function, "post")][FromBody] User user, ILogger log, ExecutionContext context) 21 | { 22 | log.LogInformation("HTTP Function Triggered"); 23 | 24 | var (isDataValid, errorMessage) = IsDataValid(user); 25 | 26 | if (!isDataValid) 27 | { 28 | log.LogInformation($"Invalid Data: {errorMessage}"); 29 | return new BadRequestErrorMessageResult(errorMessage); 30 | } 31 | 32 | HttpResponseMessage response; 33 | 34 | try 35 | { 36 | var azureSubscription = await ApiService.GetAzureSubscriptionGuid().ConfigureAwait(false); 37 | response = await ApiService.SendChallengeSubmission(user, azureSubscription, context).ConfigureAwait(false); 38 | } 39 | catch(Exception e) 40 | { 41 | return new ObjectResult(e.Message) { StatusCode = StatusCodes.Status500InternalServerError }; 42 | } 43 | 44 | var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 45 | 46 | switch (response.StatusCode) 47 | { 48 | case HttpStatusCode.BadRequest: 49 | log.LogInformation($"Bad request: {response.ReasonPhrase}"); 50 | return new BadRequestErrorMessageResult(responseContent); 51 | 52 | case HttpStatusCode.Conflict: 53 | log.LogInformation("Error: Entrant Already Submitted"); 54 | return new ConflictObjectResult(responseContent); 55 | 56 | case HttpStatusCode.Created: 57 | log.LogInformation("Success"); 58 | return new ObjectResult(responseContent) { StatusCode = StatusCodes.Status201Created }; 59 | 60 | default: 61 | log.LogInformation("Unknown Error Ocurred"); 62 | return new ObjectResult(responseContent) { StatusCode = StatusCodes.Status500InternalServerError }; 63 | } 64 | } 65 | 66 | private static (bool isDataValid, string errorMessage) IsDataValid(User user) 67 | { 68 | if (user is null) 69 | return (false, "User Object Null"); 70 | 71 | var stringBuilder = new StringBuilder(); 72 | 73 | if (string.IsNullOrWhiteSpace(user.Phone)) 74 | stringBuilder.AppendLine("Phone Number Null or Empty"); 75 | if (string.IsNullOrWhiteSpace(user.Name)) 76 | stringBuilder.AppendLine("Name Null or Empty"); 77 | if (string.IsNullOrWhiteSpace(user.Email)) 78 | stringBuilder.AppendLine("Email Null or Empty"); 79 | 80 | if (stringBuilder.Length > 1) 81 | { 82 | //Remove the carriage return from AppdendLine 83 | stringBuilder = stringBuilder.Remove(stringBuilder.Length - 1, 1); 84 | 85 | return (false, stringBuilder.ToString()); 86 | } 87 | 88 | return (true, ""); 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Functions/Services/ApiService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | using System.Net.Http; 6 | using System.Threading.Tasks; 7 | using Microsoft.Azure.WebJobs; 8 | using Microsoft.Extensions.Logging; 9 | using Newtonsoft.Json; 10 | using XamarinAzureChallenge.Shared.Models; 11 | using Microsoft.Azure.Services.AppAuthentication; 12 | 13 | namespace XamarinAzureChallenge.Functions 14 | { 15 | public static class ApiService 16 | { 17 | private static readonly string submissionEndpoint = Environment.GetEnvironmentVariable("END_POINT"); 18 | private static readonly string instanceId = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID"); 19 | 20 | private static readonly Lazy serializerHolder = new Lazy(); 21 | private static readonly Lazy clientHolder = new Lazy(() => new HttpClient(new HttpClientHandler { AutomaticDecompression = System.Net.DecompressionMethods.GZip })); 22 | 23 | private static HttpClient Client => clientHolder.Value; 24 | private static JsonSerializer JsonSerializer => serializerHolder.Value; 25 | 26 | public static Task SendChallengeSubmission(User user, Guid azureSubscription, ExecutionContext context) 27 | { 28 | var serializedUser = JsonConvert.SerializeObject(user); 29 | 30 | var httpContent = new StringContent(serializedUser); 31 | 32 | return Client.PostAsync($"{submissionEndpoint}/{context.InvocationId}/{instanceId}/{azureSubscription}", httpContent); 33 | } 34 | 35 | public static async Task GetAzureSubscriptionGuid() 36 | { 37 | await AddAuthTokenToHeaders().ConfigureAwait(false); 38 | 39 | var azureSubscriptionResponse = await GetObjectFromApi("https://management.azure.com/subscriptions?api-version=2016-06-01").ConfigureAwait(false); 40 | 41 | if (azureSubscriptionResponse?.Subscriptions?.Any() != true) 42 | throw new Exception("No Azure Subscription Found. Ensure the Azure Function has been granted access to its Resource Group: https://docs.microsoft.com/azure/role-based-access-control/role-assignments-portal#overview-of-access-control-iam"); 43 | 44 | return azureSubscriptionResponse.Subscriptions.First().SubscriptionId; 45 | } 46 | 47 | private static async Task AddAuthTokenToHeaders() 48 | { 49 | try 50 | { 51 | var azureServiceTokenProvider = new AzureServiceTokenProvider(); 52 | var authenticationResult = await azureServiceTokenProvider.GetAuthenticationResultAsync("https://management.azure.com/").ConfigureAwait(false); 53 | 54 | if (string.IsNullOrWhiteSpace(authenticationResult?.AccessToken)) 55 | throw new Exception("Invalid Access Token. Ensure the Azure Function has a system-assigned Identity: https://docs.microsoft.com/azure/app-service/overview-managed-identity#adding-a-system-assigned-identity"); 56 | 57 | Client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(authenticationResult.TokenType, authenticationResult.AccessToken); 58 | } 59 | catch (AzureServiceTokenProviderException) 60 | { 61 | throw new Exception("Error: Function must be running on Azure"); 62 | } 63 | } 64 | 65 | private static async Task GetObjectFromApi(string url) 66 | { 67 | using (var stream = await Client.GetStreamAsync(url).ConfigureAwait(false)) 68 | using (var streamReader = new StreamReader(stream)) 69 | using (var jsonReader = new JsonTextReader(streamReader)) 70 | { 71 | return JsonSerializer.Deserialize(jsonReader); 72 | } 73 | } 74 | 75 | class AzureSubscriptionResponse 76 | { 77 | [JsonProperty("value")] 78 | public List Subscriptions { get; set; } 79 | } 80 | 81 | class AzureSubscription 82 | { 83 | [JsonProperty("id")] 84 | public string Id { get; set; } 85 | 86 | [JsonProperty("subscriptionId")] 87 | public Guid SubscriptionId { get; set; } 88 | 89 | [JsonProperty("displayName")] 90 | public string DisplayName { get; set; } 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Functions/XamarinAzureChallenge.Functions.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netstandard2.0 5 | v2 6 | latest 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Always 16 | 17 | 18 | PreserveNewest 19 | 20 | 21 | PreserveNewest 22 | Never 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Functions/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0" 3 | } -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Functions/local.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "IsEncrypted": false, 3 | "Values": { 4 | "API_HOST": "https://azurexamarinchallengepro.azurewebsites.net", 5 | "END_POINT": "registers", 6 | "FUNCTIONS_WORKER_RUNTIME": "dotnet" 7 | } 8 | } -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Shared/Models/User.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace XamarinAzureChallenge.Shared.Models 4 | { 5 | public class User 6 | { 7 | [JsonProperty("name")] 8 | public string Name { get; set; } = string.Empty; 9 | 10 | [JsonProperty("email")] 11 | public string Email { get; set; } = string.Empty; 12 | 13 | [JsonProperty("phone")] 14 | public string Phone { get; set; } = string.Empty; 15 | 16 | [JsonProperty("isTermsOfServiceAccepted")] 17 | public bool IsTermsOfServiceAccepted { get; set; } = false; 18 | 19 | [JsonProperty("isComercialCommunicationsAccepted")] 20 | public bool IsComercialCommunicationsAccepted { get; set; } = false; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.Shared/XamarinAzureChallenge.Shared.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | netstandard2.0 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using Foundation; 2 | using UIKit; 3 | 4 | namespace XamarinAzureChallenge.iOS 5 | { 6 | [Register(nameof(AppDelegate))] 7 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 8 | { 9 | public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary launchOptions) 10 | { 11 | global::Xamarin.Forms.Forms.Init(); 12 | global::Xamarin.Forms.FormsMaterial.Init(); 13 | LoadApplication(new App()); 14 | 15 | return base.FinishedLaunching(uiApplication, launchOptions); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "scale": "2x", 5 | "size": "20x20", 6 | "idiom": "iphone", 7 | "filename": "Icon40.png" 8 | }, 9 | { 10 | "scale": "3x", 11 | "size": "20x20", 12 | "idiom": "iphone", 13 | "filename": "Icon60.png" 14 | }, 15 | { 16 | "scale": "2x", 17 | "size": "29x29", 18 | "idiom": "iphone", 19 | "filename": "Icon58.png" 20 | }, 21 | { 22 | "scale": "3x", 23 | "size": "29x29", 24 | "idiom": "iphone", 25 | "filename": "Icon87.png" 26 | }, 27 | { 28 | "scale": "2x", 29 | "size": "40x40", 30 | "idiom": "iphone", 31 | "filename": "Icon80.png" 32 | }, 33 | { 34 | "scale": "3x", 35 | "size": "40x40", 36 | "idiom": "iphone", 37 | "filename": "Icon120.png" 38 | }, 39 | { 40 | "scale": "2x", 41 | "size": "60x60", 42 | "idiom": "iphone", 43 | "filename": "Icon120.png" 44 | }, 45 | { 46 | "scale": "3x", 47 | "size": "60x60", 48 | "idiom": "iphone", 49 | "filename": "Icon180.png" 50 | }, 51 | { 52 | "scale": "1x", 53 | "size": "20x20", 54 | "idiom": "ipad", 55 | "filename": "Icon20.png" 56 | }, 57 | { 58 | "scale": "2x", 59 | "size": "20x20", 60 | "idiom": "ipad", 61 | "filename": "Icon40.png" 62 | }, 63 | { 64 | "scale": "1x", 65 | "size": "29x29", 66 | "idiom": "ipad", 67 | "filename": "Icon29.png" 68 | }, 69 | { 70 | "scale": "2x", 71 | "size": "29x29", 72 | "idiom": "ipad", 73 | "filename": "Icon58.png" 74 | }, 75 | { 76 | "scale": "1x", 77 | "size": "40x40", 78 | "idiom": "ipad", 79 | "filename": "Icon40.png" 80 | }, 81 | { 82 | "scale": "2x", 83 | "size": "40x40", 84 | "idiom": "ipad", 85 | "filename": "Icon80.png" 86 | }, 87 | { 88 | "scale": "1x", 89 | "size": "76x76", 90 | "idiom": "ipad", 91 | "filename": "Icon76.png" 92 | }, 93 | { 94 | "scale": "2x", 95 | "size": "76x76", 96 | "idiom": "ipad", 97 | "filename": "Icon152.png" 98 | }, 99 | { 100 | "scale": "2x", 101 | "size": "83.5x83.5", 102 | "idiom": "ipad", 103 | "filename": "Icon167.png" 104 | }, 105 | { 106 | "scale": "1x", 107 | "size": "1024x1024", 108 | "idiom": "ios-marketing", 109 | "filename": "Icon1024.png" 110 | } 111 | ], 112 | "properties": {}, 113 | "info": { 114 | "version": 1, 115 | "author": "xcode" 116 | } 117 | } -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIDeviceFamily 6 | 7 | 1 8 | 2 9 | 10 | UISupportedInterfaceOrientations 11 | 12 | UIInterfaceOrientationPortrait 13 | UIInterfaceOrientationLandscapeLeft 14 | UIInterfaceOrientationLandscapeRight 15 | 16 | UISupportedInterfaceOrientations~ipad 17 | 18 | UIInterfaceOrientationPortrait 19 | UIInterfaceOrientationPortraitUpsideDown 20 | UIInterfaceOrientationLandscapeLeft 21 | UIInterfaceOrientationLandscapeRight 22 | 23 | MinimumOSVersion 24 | 8.0 25 | CFBundleDisplayName 26 | XamarinAzureChallenge 27 | CFBundleIdentifier 28 | com.companyname.XamarinAzureChallenge 29 | CFBundleVersion 30 | 1.0 31 | UILaunchStoryboardName 32 | LaunchScreen 33 | CFBundleName 34 | XamarinAzureChallenge 35 | XSAppIconAssets 36 | Assets.xcassets/AppIcon.appiconset 37 | UIAppFonts 38 | 39 | roboto.regular.ttf 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Main.cs: -------------------------------------------------------------------------------- 1 | using UIKit; 2 | 3 | namespace XamarinAzureChallenge.iOS 4 | { 5 | public class Application 6 | { 7 | static void Main(string[] args) => UIApplication.Main(args, null, nameof(AppDelegate)); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("XamarinAzureChallenge.iOS")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("XamarinAzureChallenge.iOS")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/Default-568h@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/Default-Portrait.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/Default-Portrait@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/Default.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/Default@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/Hexagon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/Hexagon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/SF-Pro-Display-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/SF-Pro-Display-Regular.otf -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/SFProText-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/SFProText-Medium.ttf -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/azureIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/azureIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/azureIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/azureIcon@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/azureIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/azureIcon@3x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/back_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/back_arrow.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/back_arrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/back_arrow@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/back_arrow@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/back_arrow@3x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/backgroundImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/backgroundImage.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/backgroundimage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/backgroundimage@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/backgroundimage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/backgroundimage@3x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/resultFailed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/resultFailed.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/resultFailed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/resultFailed@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/resultFailed@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/resultFailed@3x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/resultOk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/resultOk.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/resultOk@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/resultOk@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/resultOk@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/resultOk@3x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/roboto.regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/roboto.regular.ttf -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/xamIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/xamIcon.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/xamIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/xamIcon@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/xamIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/xamIcon@3x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/xamarinazure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/xamarinazure.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/xamarinazure@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/xamarinazure@2x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/Resources/xamarinazure@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xamarin/XamarinAzureChallenge/40a7c0825e98a751af31193f43b5907f5fec027d/src/XamarinAzureChallenge.iOS/Resources/xamarinazure@3x.png -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.iOS/XamarinAzureChallenge.iOS.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | iPhoneSimulator 6 | 8.0.30703 7 | 2.0 8 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3} 9 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10 | {6143fdea-f3c2-4a09-aafa-6e230626515e} 11 | Exe 12 | XamarinAzureChallenge.iOS 13 | Resources 14 | XamarinAzureChallenge.iOS 15 | NSUrlSessionHandler 16 | 17 | 18 | 19 | 20 | true 21 | full 22 | false 23 | bin\iPhoneSimulator\Debug 24 | DEBUG 25 | prompt 26 | 4 27 | false 28 | x86_64 29 | None 30 | true 31 | true 32 | true 33 | --linkskip=System.Net.Http.NSUrlSessionHandler 34 | 35 | 36 | none 37 | true 38 | bin\iPhoneSimulator\Release 39 | prompt 40 | 4 41 | None 42 | x86_64 43 | false 44 | true 45 | true 46 | --linkskip=System.Net.Http.NSUrlSessionHandler 47 | 48 | 49 | true 50 | full 51 | false 52 | bin\iPhone\Debug 53 | DEBUG 54 | prompt 55 | 4 56 | false 57 | ARM64 58 | iPhone Developer 59 | true 60 | Entitlements.plist 61 | --linkskip=System.Net.Http.NSUrlSessionHandler 62 | 63 | 64 | none 65 | true 66 | bin\iPhone\Release 67 | prompt 68 | 4 69 | ARM64 70 | false 71 | iPhone Developer 72 | Entitlements.plist 73 | true 74 | true 75 | --linkskip=System.Net.Http.NSUrlSessionHandler 76 | 77 | 78 | none 79 | True 80 | bin\iPhone\Ad-Hoc 81 | prompt 82 | 4 83 | False 84 | ARM64 85 | True 86 | Automatic:AdHoc 87 | iPhone Distribution 88 | Entitlements.plist 89 | true 90 | true 91 | --linkskip=System.Net.Http.NSUrlSessionHandler 92 | 93 | 94 | none 95 | True 96 | bin\iPhone\AppStore 97 | prompt 98 | 4 99 | False 100 | ARM64 101 | Automatic:AppStore 102 | iPhone Distribution 103 | Entitlements.plist 104 | true 105 | true 106 | --linkskip=System.Net.Http.NSUrlSessionHandler 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | false 120 | 121 | 122 | false 123 | 124 | 125 | false 126 | 127 | 128 | false 129 | 130 | 131 | false 132 | 133 | 134 | false 135 | 136 | 137 | false 138 | 139 | 140 | false 141 | 142 | 143 | false 144 | 145 | 146 | false 147 | 148 | 149 | false 150 | 151 | 152 | false 153 | 154 | 155 | false 156 | 157 | 158 | false 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 4.3.0.851321-pre3 173 | 174 | 175 | 176 | 177 | 178 | {906E148B-01D5-4106-9C5B-404A8B655069} 179 | XamarinAzureChallenge 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29324.140 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinAzureChallenge.Android", "XamarinAzureChallenge.Android\XamarinAzureChallenge.Android.csproj", "{B27527E8-5248-4A42-B958-35080C060C00}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinAzureChallenge.iOS", "XamarinAzureChallenge.iOS\XamarinAzureChallenge.iOS.csproj", "{2C81F630-FC66-4BEC-A800-56A0C743F3D3}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XamarinAzureChallenge", "XamarinAzureChallenge\XamarinAzureChallenge.csproj", "{906E148B-01D5-4106-9C5B-404A8B655069}" 11 | EndProject 12 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XamarinAzureChallenge.Functions", "XamarinAzureChallenge.Functions\XamarinAzureChallenge.Functions.csproj", "{2A44CE99-0A65-4AE7-897F-D2EA679A42B7}" 13 | EndProject 14 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile", "Mobile", "{3369F7AA-8AEF-403A-98A4-592B27E34AFF}" 15 | EndProject 16 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backend", "Backend", "{0E4408D8-8D4A-4E05-AA0E-A71CE6A2A54D}" 17 | EndProject 18 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XamarinAzureChallenge.Shared", "XamarinAzureChallenge.Shared\XamarinAzureChallenge.Shared.csproj", "{09753CDE-BC8F-49A1-836E-3FF270F45CF5}" 19 | EndProject 20 | Global 21 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 22 | Ad-Hoc|Any CPU = Ad-Hoc|Any CPU 23 | Ad-Hoc|iPhone = Ad-Hoc|iPhone 24 | Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator 25 | AppStore|Any CPU = AppStore|Any CPU 26 | AppStore|iPhone = AppStore|iPhone 27 | AppStore|iPhoneSimulator = AppStore|iPhoneSimulator 28 | Debug|Any CPU = Debug|Any CPU 29 | Debug|iPhone = Debug|iPhone 30 | Debug|iPhoneSimulator = Debug|iPhoneSimulator 31 | Release|Any CPU = Release|Any CPU 32 | Release|iPhone = Release|iPhone 33 | Release|iPhoneSimulator = Release|iPhoneSimulator 34 | EndGlobalSection 35 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 36 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 37 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 38 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU 39 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 40 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU 41 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU 42 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 43 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU 44 | {B27527E8-5248-4A42-B958-35080C060C00}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU 45 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 46 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|Any CPU.Build.0 = Release|Any CPU 47 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|Any CPU.Deploy.0 = Release|Any CPU 48 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|iPhone.ActiveCfg = Release|Any CPU 49 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|iPhone.Build.0 = Release|Any CPU 50 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|iPhone.Deploy.0 = Release|Any CPU 51 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 52 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU 53 | {B27527E8-5248-4A42-B958-35080C060C00}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU 54 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 55 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|Any CPU.Build.0 = Debug|Any CPU 56 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 57 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|iPhone.ActiveCfg = Debug|Any CPU 58 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|iPhone.Build.0 = Debug|Any CPU 59 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|iPhone.Deploy.0 = Debug|Any CPU 60 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 61 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 62 | {B27527E8-5248-4A42-B958-35080C060C00}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU 63 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|Any CPU.ActiveCfg = Release|Any CPU 64 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|Any CPU.Build.0 = Release|Any CPU 65 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|Any CPU.Deploy.0 = Release|Any CPU 66 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|iPhone.ActiveCfg = Release|Any CPU 67 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|iPhone.Build.0 = Release|Any CPU 68 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|iPhone.Deploy.0 = Release|Any CPU 69 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 70 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 71 | {B27527E8-5248-4A42-B958-35080C060C00}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU 72 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone 73 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|iPhone 74 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|Any CPU.Deploy.0 = Ad-Hoc|iPhone 75 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone 76 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone 77 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|iPhone.Deploy.0 = Ad-Hoc|iPhone 78 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator 79 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator 80 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Ad-Hoc|iPhoneSimulator 81 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone 82 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|Any CPU.Build.0 = AppStore|iPhone 83 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|Any CPU.Deploy.0 = AppStore|iPhone 84 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|iPhone.ActiveCfg = AppStore|iPhone 85 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|iPhone.Build.0 = AppStore|iPhone 86 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|iPhone.Deploy.0 = AppStore|iPhone 87 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator 88 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator 89 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.AppStore|iPhoneSimulator.Deploy.0 = AppStore|iPhoneSimulator 90 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator 91 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator 92 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|Any CPU.Deploy.0 = Debug|iPhoneSimulator 93 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|iPhone.ActiveCfg = Debug|iPhone 94 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|iPhone.Build.0 = Debug|iPhone 95 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|iPhone.Deploy.0 = Debug|iPhone 96 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator 97 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator 98 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Debug|iPhoneSimulator.Deploy.0 = Debug|iPhoneSimulator 99 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|Any CPU.ActiveCfg = Release|iPhone 100 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|Any CPU.Build.0 = Release|iPhone 101 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|Any CPU.Deploy.0 = Release|iPhone 102 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|iPhone.ActiveCfg = Release|iPhone 103 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|iPhone.Build.0 = Release|iPhone 104 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|iPhone.Deploy.0 = Release|iPhone 105 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator 106 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator 107 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3}.Release|iPhoneSimulator.Deploy.0 = Release|iPhoneSimulator 108 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU 109 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU 110 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|Any CPU.Deploy.0 = Debug|Any CPU 111 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU 112 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU 113 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|iPhone.Deploy.0 = Debug|Any CPU 114 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU 115 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU 116 | {906E148B-01D5-4106-9C5B-404A8B655069}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Debug|Any CPU 117 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU 118 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|Any CPU.Build.0 = Debug|Any CPU 119 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|Any CPU.Deploy.0 = Debug|Any CPU 120 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|iPhone.ActiveCfg = Debug|Any CPU 121 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|iPhone.Build.0 = Debug|Any CPU 122 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|iPhone.Deploy.0 = Debug|Any CPU 123 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU 124 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU 125 | {906E148B-01D5-4106-9C5B-404A8B655069}.AppStore|iPhoneSimulator.Deploy.0 = Debug|Any CPU 126 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 127 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|Any CPU.Build.0 = Debug|Any CPU 128 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 129 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|iPhone.ActiveCfg = Debug|Any CPU 130 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|iPhone.Build.0 = Debug|Any CPU 131 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|iPhone.Deploy.0 = Debug|Any CPU 132 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 133 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 134 | {906E148B-01D5-4106-9C5B-404A8B655069}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU 135 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|Any CPU.ActiveCfg = Release|Any CPU 136 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|Any CPU.Build.0 = Release|Any CPU 137 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|Any CPU.Deploy.0 = Release|Any CPU 138 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|iPhone.ActiveCfg = Release|Any CPU 139 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|iPhone.Build.0 = Release|Any CPU 140 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|iPhone.Deploy.0 = Release|Any CPU 141 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 142 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 143 | {906E148B-01D5-4106-9C5B-404A8B655069}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU 144 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 145 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 146 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 147 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU 148 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 149 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU 150 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 151 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.AppStore|Any CPU.Build.0 = Release|Any CPU 152 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.AppStore|iPhone.ActiveCfg = Release|Any CPU 153 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.AppStore|iPhone.Build.0 = Release|Any CPU 154 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 155 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU 156 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 157 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Debug|Any CPU.Build.0 = Debug|Any CPU 158 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Debug|iPhone.ActiveCfg = Debug|Any CPU 159 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Debug|iPhone.Build.0 = Debug|Any CPU 160 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 161 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 162 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Release|Any CPU.ActiveCfg = Release|Any CPU 163 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Release|Any CPU.Build.0 = Release|Any CPU 164 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Release|iPhone.ActiveCfg = Release|Any CPU 165 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Release|iPhone.Build.0 = Release|Any CPU 166 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 167 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 168 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU 169 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU 170 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU 171 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU 172 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU 173 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU 174 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU 175 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.AppStore|Any CPU.Build.0 = Debug|Any CPU 176 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.AppStore|iPhone.ActiveCfg = Debug|Any CPU 177 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.AppStore|iPhone.Build.0 = Debug|Any CPU 178 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU 179 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU 180 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 181 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Debug|Any CPU.Build.0 = Debug|Any CPU 182 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Debug|iPhone.ActiveCfg = Debug|Any CPU 183 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Debug|iPhone.Build.0 = Debug|Any CPU 184 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 185 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 186 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Release|Any CPU.ActiveCfg = Release|Any CPU 187 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Release|Any CPU.Build.0 = Release|Any CPU 188 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Release|iPhone.ActiveCfg = Release|Any CPU 189 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Release|iPhone.Build.0 = Release|Any CPU 190 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 191 | {09753CDE-BC8F-49A1-836E-3FF270F45CF5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 192 | EndGlobalSection 193 | GlobalSection(SolutionProperties) = preSolution 194 | HideSolutionNode = FALSE 195 | EndGlobalSection 196 | GlobalSection(NestedProjects) = preSolution 197 | {B27527E8-5248-4A42-B958-35080C060C00} = {3369F7AA-8AEF-403A-98A4-592B27E34AFF} 198 | {2C81F630-FC66-4BEC-A800-56A0C743F3D3} = {3369F7AA-8AEF-403A-98A4-592B27E34AFF} 199 | {906E148B-01D5-4106-9C5B-404A8B655069} = {3369F7AA-8AEF-403A-98A4-592B27E34AFF} 200 | {2A44CE99-0A65-4AE7-897F-D2EA679A42B7} = {0E4408D8-8D4A-4E05-AA0E-A71CE6A2A54D} 201 | EndGlobalSection 202 | GlobalSection(ExtensibilityGlobals) = postSolution 203 | SolutionGuid = {1060B621-72EF-4F2E-A7E5-475F275A0EEE} 204 | EndGlobalSection 205 | EndGlobal 206 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge/App.xaml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 14 | 15 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using Xamarin.Forms; 2 | using Xamarin.Forms.Xaml; 3 | using XamarinAzureChallenge.Pages; 4 | 5 | [assembly: XamlCompilation(XamlCompilationOptions.Compile)] 6 | namespace XamarinAzureChallenge 7 | { 8 | public partial class App : Application 9 | { 10 | public App() 11 | { 12 | InitializeComponent(); 13 | MainPage = new NavigationPage(new HomePage()) 14 | { 15 | BarBackgroundColor = Color.FromHex("#3498db"), 16 | BarTextColor = Color.White 17 | }; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/XamarinAzureChallenge/Pages/HomePage.xaml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 56 |