├── .github
└── workflows
│ └── codeql-analysis.yml
├── .gitignore
├── Documents
└── Images
│ ├── Cart.png
│ ├── Home.png
│ ├── Login.png
│ ├── Menu.png
│ ├── Mobile.png
│ ├── Product.png
│ ├── ProductList.png
│ └── Splash.png
├── LICENSE
├── README.md
├── SECURITY.md
└── Source
├── TailwindTraders.Mobile
├── CodeAnalysis
│ ├── CodeAnalysis.ruleset
│ ├── Menees.Analyzers.Settings.xml
│ ├── Menees.Analyzers.Settings.xsd
│ └── XamlStylerSettings.json
├── Directory.Build.props
├── Directory.Build.targets
├── Resources
│ ├── AR
│ │ ├── guide
│ │ │ ├── .gitignore
│ │ │ ├── generate_tfrecord.py
│ │ │ ├── guide.txt
│ │ │ └── xml_to_csv.py
│ │ └── hardhat
│ │ │ ├── detect.tflite
│ │ │ └── labels_list.txt
│ ├── Fonts
│ │ ├── BrandonGrotesque-Light.otf
│ │ ├── BrandonGrotesque-Medium.otf
│ │ └── Gin-Regular.otf
│ └── Images
│ │ ├── header.jpg
│ │ ├── recommended_bathrooms.jpg
│ │ ├── recommended_lighting.jpg
│ │ ├── recommended_plants.jpg
│ │ └── recommended_powertools.jpg
├── TailwindTraders.Mobile.Android
│ ├── Assets
│ │ └── AboutAssets.txt
│ ├── Features
│ │ └── Scanning
│ │ │ ├── CameraPreviewRenderer.cs
│ │ │ └── Photo
│ │ │ ├── GalleryService.cs
│ │ │ └── PlatformService.cs
│ ├── Helpers
│ │ └── PathHelper.cs
│ ├── Libs
│ │ └── EmguTF
│ │ │ ├── .gitignore
│ │ │ ├── arm64-v8a
│ │ │ └── libtfliteextern.so
│ │ │ ├── armeabi-v7a
│ │ │ └── libtfliteextern.so
│ │ │ ├── build_tf_lite_android.sh
│ │ │ ├── readme.txt
│ │ │ ├── x86
│ │ │ └── libtfliteextern.so
│ │ │ └── x86_64
│ │ │ └── libtfliteextern.so
│ ├── MainActivity.cs
│ ├── MainApplication.cs
│ ├── Properties
│ │ ├── AndroidManifest.xml
│ │ └── AssemblyInfo.cs
│ ├── Resources
│ │ ├── AboutResources.txt
│ │ ├── Resource.designer.cs
│ │ ├── drawable-hdpi
│ │ │ ├── capture.png
│ │ │ ├── cart.png
│ │ │ ├── close.png
│ │ │ ├── filters.png
│ │ │ ├── free_shipping.png
│ │ │ ├── ia.png
│ │ │ ├── logo_header_b.png
│ │ │ ├── logo_horizontal_b.png
│ │ │ ├── logo_vertical_w.png
│ │ │ ├── photo.png
│ │ │ ├── search.png
│ │ │ ├── splash_screen.jpg
│ │ │ └── star.png
│ │ ├── drawable-mdpi
│ │ │ ├── capture.png
│ │ │ ├── cart.png
│ │ │ ├── close.png
│ │ │ ├── filters.png
│ │ │ ├── free_shipping.png
│ │ │ ├── ia.png
│ │ │ ├── logo_header_b.png
│ │ │ ├── logo_horizontal_b.png
│ │ │ ├── logo_vertical_w.png
│ │ │ ├── photo.png
│ │ │ ├── search.png
│ │ │ ├── splash_background.xml
│ │ │ ├── splash_screen.jpg
│ │ │ └── star.png
│ │ ├── drawable-xhdpi
│ │ │ ├── capture.png
│ │ │ ├── cart.png
│ │ │ ├── close.png
│ │ │ ├── filters.png
│ │ │ ├── free_shipping.png
│ │ │ ├── ia.png
│ │ │ ├── logo_header_b.png
│ │ │ ├── logo_horizontal_b.png
│ │ │ ├── logo_vertical_w.png
│ │ │ ├── photo.png
│ │ │ ├── search.png
│ │ │ ├── splash_screen.jpg
│ │ │ └── star.png
│ │ ├── drawable-xxhdpi
│ │ │ ├── capture.png
│ │ │ ├── cart.png
│ │ │ ├── close.png
│ │ │ ├── filters.png
│ │ │ ├── free_shipping.png
│ │ │ ├── ia.png
│ │ │ ├── logo_header_b.png
│ │ │ ├── logo_horizontal_b.png
│ │ │ ├── logo_vertical_w.png
│ │ │ ├── photo.png
│ │ │ ├── search.png
│ │ │ ├── splash_screen.jpg
│ │ │ └── star.png
│ │ ├── drawable-xxxhdpi
│ │ │ └── INTENTIONALLY_EMPTY.txt
│ │ ├── layout
│ │ │ ├── Tabbar.axml
│ │ │ └── Toolbar.axml
│ │ ├── mipmap-hdpi
│ │ │ └── Icon.png
│ │ ├── mipmap-mdpi
│ │ │ └── icon.png
│ │ ├── mipmap-xhdpi
│ │ │ └── Icon.png
│ │ ├── mipmap-xxhdpi
│ │ │ └── Icon.png
│ │ ├── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ ├── styles.xml
│ │ │ └── themes.xml
│ │ └── xml
│ │ │ └── file_paths.xml
│ ├── SplashActivity.cs
│ ├── TailwindTraders.Mobile.Android.csproj
│ ├── ThirdParties
│ │ ├── Camera
│ │ │ ├── AutoFitTextureView.cs
│ │ │ ├── CameraState.cs
│ │ │ ├── ColorUnion.cs
│ │ │ ├── CompareSizesByArea.cs
│ │ │ ├── ICamera.cs
│ │ │ ├── Listeners
│ │ │ │ ├── CameraCaptureSessionCallback.cs
│ │ │ │ ├── CameraStateListener.cs
│ │ │ │ ├── CameraSurfaceTextureListener.cs
│ │ │ │ └── ImageAvailableListener.cs
│ │ │ └── readme.txt
│ │ └── Touch
│ │ │ └── TouchEffect.cs
│ ├── appcenter-post-build.sh
│ ├── appcenter-post-clone.sh
│ ├── appcenter-pre-build.sh
│ └── environment.txt
├── TailwindTraders.Mobile.iOS
│ ├── AppDelegate.cs
│ ├── Application.cs
│ ├── Assets.xcassets
│ │ ├── 3bar.imageset
│ │ │ ├── 3bar.png
│ │ │ ├── 3bar@2x.png
│ │ │ └── Contents.json
│ │ ├── app_icon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon1024.png
│ │ │ ├── Icon120.png
│ │ │ └── Icon180.png
│ │ ├── capture.imageset
│ │ │ ├── Contents.json
│ │ │ ├── capture.png
│ │ │ ├── capture@2x.png
│ │ │ └── capture@3x.png
│ │ ├── cart.imageset
│ │ │ ├── Contents.json
│ │ │ ├── cart.png
│ │ │ ├── cart@2x.png
│ │ │ └── cart@3x.png
│ │ ├── close.imageset
│ │ │ ├── Contents.json
│ │ │ ├── close.png
│ │ │ ├── close@2x.png
│ │ │ └── close@3x.png
│ │ ├── filters.imageset
│ │ │ ├── Contents.json
│ │ │ ├── filters.png
│ │ │ ├── filters@2x.png
│ │ │ └── filters@3x.png
│ │ ├── free_shipping.imageset
│ │ │ ├── Contents.json
│ │ │ ├── free_shipping.png
│ │ │ ├── free_shipping@2x.png
│ │ │ └── free_shipping@3x.png
│ │ ├── ia.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ia.png
│ │ │ ├── ia@2x.png
│ │ │ └── ia@3x.png
│ │ ├── logo_header_b.imageset
│ │ │ ├── Contents.json
│ │ │ ├── logo_header_b.png
│ │ │ ├── logo_header_b@2x.png
│ │ │ └── logo_header_b@3x.png
│ │ ├── logo_horizontal_b.imageset
│ │ │ ├── Contents.json
│ │ │ ├── logo_horizontal-b.png
│ │ │ ├── logo_horizontal-b@2x.png
│ │ │ └── logo_horizontal-b@3x.png
│ │ ├── logo_vertical_w.imageset
│ │ │ ├── Contents.json
│ │ │ ├── logo_vertical_w.png
│ │ │ ├── logo_vertical_w@2x.png
│ │ │ └── logo_vertical_w@3x.png
│ │ ├── photo.imageset
│ │ │ ├── Contents.json
│ │ │ ├── photo.png
│ │ │ ├── photo@2x.png
│ │ │ └── photo@3x.png
│ │ ├── search.imageset
│ │ │ ├── Contents.json
│ │ │ ├── search.png
│ │ │ ├── search@2x.png
│ │ │ └── search@3x.png
│ │ ├── splash_screen.imageset
│ │ │ ├── Contents.json
│ │ │ ├── Splash_screen.jpg
│ │ │ ├── Splash_screen@2x.jpg
│ │ │ └── Splash_screen@3x.jpg
│ │ └── star.imageset
│ │ │ ├── Contents.json
│ │ │ ├── star.png
│ │ │ ├── star@2x.png
│ │ │ └── star@3x.png
│ ├── Effects
│ │ └── MultilineButtonEffect.cs
│ ├── Entitlements.plist
│ ├── Features
│ │ ├── LogIn
│ │ │ └── BorderlessEntryEffect.cs
│ │ └── Scanning
│ │ │ ├── CameraPreviewRenderer.cs
│ │ │ └── Photo
│ │ │ ├── GalleryService.cs
│ │ │ └── PlatformService.cs
│ ├── Info.plist
│ ├── Libs
│ │ └── EmguTF
│ │ │ ├── .gitignore
│ │ │ ├── build_tf_lite_ios.sh
│ │ │ ├── libtfliteextern.a
│ │ │ └── readme.txt
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── Resources
│ │ └── LaunchScreen.storyboard
│ ├── TailwindTraders.Mobile.iOS.csproj
│ ├── ThirdParties
│ │ ├── Camera
│ │ │ ├── CameraManager.cs
│ │ │ ├── VideoCaptureDelegate.cs
│ │ │ └── readme.txt
│ │ └── Touch
│ │ │ ├── TouchEffect.cs
│ │ │ └── TouchRecognizer.cs
│ ├── appcenter-post-build.sh
│ ├── appcenter-post-clone.sh
│ └── appcenter-pre-build.sh
├── TailwindTraders.Mobile.sln
├── TailwindTraders.Mobile
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── Colors.xaml
│ ├── Colors.xaml.cs
│ ├── ControlTemplates.xaml
│ ├── ControlTemplates.xaml.cs
│ ├── Controls
│ │ └── FixedRatioCarouselViewControl.cs
│ ├── Converters.xaml
│ ├── Converters.xaml.cs
│ ├── Effects
│ │ ├── BorderlessEntryEffect.cs
│ │ └── MultilineButtonEffect.cs
│ ├── Features
│ │ ├── Common
│ │ │ ├── FakeRestPoolService.cs
│ │ │ ├── IRestPoolService.cs
│ │ │ └── RestPoolService.cs
│ │ ├── Home
│ │ │ ├── FakeHomeAPI.cs
│ │ │ ├── FreeShippingBanner.xaml
│ │ │ ├── FreeShippingBanner.xaml.cs
│ │ │ ├── HomePage.xaml
│ │ │ ├── HomePage.xaml.cs
│ │ │ ├── HomeViewModel.cs
│ │ │ ├── IHomeAPI.cs
│ │ │ ├── LandingDTO.cs
│ │ │ ├── RecommendedItemTemplate.xaml
│ │ │ ├── RecommendedItemTemplate.xaml.cs
│ │ │ └── UppercaseConverter.cs
│ │ ├── Localization
│ │ │ ├── Resources.Designer.cs
│ │ │ └── Resources.resx
│ │ ├── LogIn
│ │ │ ├── AuthenticationService.cs
│ │ │ ├── FakeAuthenticationService.cs
│ │ │ ├── FakeLoginAPI.cs
│ │ │ ├── FakeProfilesAPI.cs
│ │ │ ├── IAuthenticationService.cs
│ │ │ ├── ILoginAPI.cs
│ │ │ ├── IProfilesAPI.cs
│ │ │ ├── LogInPage.xaml
│ │ │ ├── LogInPage.xaml.cs
│ │ │ ├── LoginRequestDTO.cs
│ │ │ ├── LoginResponseDTO.cs
│ │ │ ├── LoginViewModel.cs
│ │ │ └── ProfileDTO.cs
│ │ ├── Logging
│ │ │ ├── AppCenterLoggingService.cs
│ │ │ ├── DebugLoggingService.cs
│ │ │ └── ILoggingService.cs
│ │ ├── Product
│ │ │ ├── BrandDTO.cs
│ │ │ ├── Cart
│ │ │ │ ├── FakeProductCartAPI.cs
│ │ │ │ ├── IProductCartAPI.cs
│ │ │ │ ├── ProductCartLineDTO.cs
│ │ │ │ ├── ProductCartLineItemTemplate.xaml
│ │ │ │ ├── ProductCartLineItemTemplate.xaml.cs
│ │ │ │ ├── ProductCartPage.xaml
│ │ │ │ ├── ProductCartPage.xaml.cs
│ │ │ │ └── ProductCartViewModel.cs
│ │ │ ├── Category
│ │ │ │ ├── ProductCategoryPage.xaml
│ │ │ │ ├── ProductCategoryPage.xaml.cs
│ │ │ │ ├── ProductCategoryViewModel.cs
│ │ │ │ ├── ProductView.xaml
│ │ │ │ ├── ProductView.xaml.cs
│ │ │ │ ├── TwoProductsItemTemplate.xaml
│ │ │ │ └── TwoProductsItemTemplate.xaml.cs
│ │ │ ├── Detail
│ │ │ │ ├── FeatureItemTemplate.xaml
│ │ │ │ ├── FeatureItemTemplate.xaml.cs
│ │ │ │ ├── PictureItemTemplate.xaml
│ │ │ │ ├── PictureItemTemplate.xaml.cs
│ │ │ │ ├── ProductDetailPage.xaml
│ │ │ │ ├── ProductDetailPage.xaml.cs
│ │ │ │ └── ProductDetailViewModel.cs
│ │ │ ├── FakeProducts.cs
│ │ │ ├── FakeProducts.json
│ │ │ ├── FakeProductsAPI.cs
│ │ │ ├── FakeSimilarProductsAPI.cs
│ │ │ ├── FeatureDTO.cs
│ │ │ ├── IProductsAPI.cs
│ │ │ ├── ISimilarProductsAPI.cs
│ │ │ ├── PopularItemTemplate.xaml
│ │ │ ├── PopularItemTemplate.xaml.cs
│ │ │ ├── PreviouslySeenItemTemplate.xaml
│ │ │ ├── PreviouslySeenItemTemplate.xaml.cs
│ │ │ ├── ProductDTO.cs
│ │ │ ├── ProductViewModel.cs
│ │ │ ├── ProductsPerTypeDTO.cs
│ │ │ └── TypeDTO.cs
│ │ ├── Scanning
│ │ │ ├── AR
│ │ │ │ ├── CameraPreviewPage.xaml
│ │ │ │ ├── CameraPreviewPage.xaml.cs
│ │ │ │ ├── CameraPreviewViewModel.cs
│ │ │ │ ├── DetectionMessage.cs
│ │ │ │ ├── DrawingHelper.cs
│ │ │ │ ├── InputTensorMessage.cs
│ │ │ │ └── MathHelper.cs
│ │ │ ├── CameraPreview.cs
│ │ │ ├── Photo
│ │ │ │ ├── CameraPage.xaml
│ │ │ │ ├── CameraPage.xaml.cs
│ │ │ │ ├── CameraPreviewTakePhotoPage.xaml
│ │ │ │ ├── CameraPreviewTakePhotoPage.xaml.cs
│ │ │ │ ├── CameraPreviewTakePhotoViewModel.cs
│ │ │ │ ├── CameraViewModel.cs
│ │ │ │ ├── ExtendedLabel.cs
│ │ │ │ ├── GalleryImageTemplate.xaml
│ │ │ │ ├── GalleryImageTemplate.xaml.cs
│ │ │ │ ├── GalleryImageViewModel.cs
│ │ │ │ ├── IGalleryService.cs
│ │ │ │ ├── IPlatformService.cs
│ │ │ │ ├── IVisionService.cs
│ │ │ │ ├── PhotoSize.cs
│ │ │ │ └── VisionService.cs
│ │ │ ├── PhotoService.cs
│ │ │ ├── RecommendedItem.xaml
│ │ │ ├── RecommendedItem.xaml.cs
│ │ │ └── TensorflowLiteService.cs
│ │ ├── Settings
│ │ │ ├── DefaultSettings.cs
│ │ │ ├── SettingsPage.xaml
│ │ │ ├── SettingsPage.xaml.cs
│ │ │ └── SettingsViewModel.cs
│ │ └── Shell
│ │ │ ├── FlyoutHeader.xaml
│ │ │ ├── FlyoutHeader.xaml.cs
│ │ │ ├── TheShell.xaml
│ │ │ ├── TheShell.xaml.cs
│ │ │ └── TheShellViewModel.cs
│ ├── FontStyles.xaml
│ ├── FontStyles.xaml.cs
│ ├── Framework
│ │ ├── AsyncCommand.cs
│ │ ├── BaseContentPage.cs
│ │ ├── BaseStateAwareContentPage.cs
│ │ ├── BaseStateAwareViewModel.cs
│ │ ├── BaseViewModel.cs
│ │ ├── ConnectivityService.cs
│ │ ├── IConnectivityService.cs
│ │ └── TaskHelper.cs
│ ├── GlobalStyles.xaml
│ ├── GlobalStyles.xaml.cs
│ ├── Helpers
│ │ ├── EmbeddedResourceHelper.cs
│ │ ├── EventArgsT.cs
│ │ ├── FakeNetwork.cs
│ │ ├── HttpClientFactory.cs
│ │ └── IEnumerableExtensions.cs
│ ├── Sizes.xaml
│ ├── Sizes.xaml.cs
│ ├── Styles.xaml
│ ├── Styles.xaml.cs
│ ├── TailwindTraders.Mobile.csproj
│ ├── TheConverters
│ │ ├── DebugConverter.cs
│ │ ├── DoubleToHalfFloatConverter.cs
│ │ ├── IsNotNullConverter.cs
│ │ └── NotConverter.cs
│ └── ThirdParties
│ │ ├── BindableStackLayout.cs
│ │ └── Touch
│ │ ├── TouchActionEventArgs.cs
│ │ ├── TouchActionType.cs
│ │ ├── TouchEffect.cs
│ │ └── readme.txt
├── TailwindTraders.UITests
│ ├── AppManager.cs
│ ├── BasePage.cs
│ ├── BaseTestFixture.cs
│ ├── Pages
│ │ ├── ApplianceDetailPage.cs
│ │ ├── HomeAppliancesListPage.cs
│ │ ├── HomePage.cs
│ │ ├── LoginPage.cs
│ │ └── SettingsPage.cs
│ ├── PlatformQuery.cs
│ ├── TailwindTraders.UITests.csproj
│ ├── Tests
│ │ └── Tests.cs
│ └── TestsSettings.cs
├── ThirdParties
│ ├── Emgu.TF.Lite
│ │ ├── Emgu.TF.Lite.csproj
│ │ ├── EmguTF
│ │ │ ├── BuildinOpResolver.cs
│ │ │ ├── Constants.cs
│ │ │ ├── DisposableObject.cs
│ │ │ ├── FlatBufferModel.cs
│ │ │ ├── IOpResolver.cs
│ │ │ ├── Interpreter.cs
│ │ │ ├── MonoPInvokeCallbackAttribute.cs
│ │ │ ├── Status.cs
│ │ │ ├── Tensor.cs
│ │ │ ├── TfLiteDllImport.cs
│ │ │ ├── TfLiteDllImportXamarinIOS.cs
│ │ │ ├── TfLiteInvoke.cs
│ │ │ └── UnmanagedObject.cs
│ │ └── readme.txt
│ └── Sharpnado.Forms.HorizontalListView
│ │ ├── Sharpnado.Infrastructure.dll
│ │ ├── Sharpnado.Infrastructure.pdb
│ │ ├── Sharpnado.Presentation.Forms.Droid.dll
│ │ ├── Sharpnado.Presentation.Forms.Droid.pdb
│ │ ├── Sharpnado.Presentation.Forms.dll
│ │ ├── Sharpnado.Presentation.Forms.iOS.dll
│ │ ├── Sharpnado.Presentation.Forms.iOS.pdb
│ │ ├── Sharpnado.Presentation.Forms.pdb
│ │ └── readme.txt
└── UnitTests
│ ├── Assets
│ └── Vision
│ │ ├── Test
│ │ ├── Multitool
│ │ │ └── Multitool1.jpg
│ │ ├── RechargeableScrewdriver
│ │ │ └── RechargeableScrewdriver1.jpg
│ │ └── YellowHardHat
│ │ │ └── YellowHardHat1.jpg
│ │ └── Train
│ │ ├── Multitool
│ │ ├── 10066255_m.jpg
│ │ └── 9320441_m.jpg
│ │ ├── RechargeableScrewdriver
│ │ ├── 6760844_m.jpg
│ │ └── 6909989_m.jpg
│ │ └── YellowHardHat
│ │ ├── 11080373_m.jpg
│ │ └── 5486059_m.jpg
│ ├── Constants.cs
│ ├── Features
│ ├── Common
│ │ └── RestPoolServiceTests.cs
│ ├── Home
│ │ └── HomeAPITests.cs
│ ├── LogIn
│ │ ├── LoginAPITests.cs
│ │ └── ProfilesAPITests.cs
│ └── Product
│ │ └── ProductsAPITests.cs
│ ├── Framework
│ ├── BaseAPITest.cs
│ └── BaseContentPageTests.cs
│ └── UnitTests.csproj
└── Tools
└── XamlStyler
├── XamlStyler.Console
├── CommandLine.dll
├── Irony.dll
├── Newtonsoft.Json.dll
├── Options
│ └── DefaultSettings.json
├── XamlStyler.Core.dll
├── xstyler.exe
└── xstyler.exe.config
├── readme.txt
└── run.sh
/Documents/Images/Cart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Documents/Images/Cart.png
--------------------------------------------------------------------------------
/Documents/Images/Home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Documents/Images/Home.png
--------------------------------------------------------------------------------
/Documents/Images/Login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Documents/Images/Login.png
--------------------------------------------------------------------------------
/Documents/Images/Menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Documents/Images/Menu.png
--------------------------------------------------------------------------------
/Documents/Images/Mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Documents/Images/Mobile.png
--------------------------------------------------------------------------------
/Documents/Images/Product.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Documents/Images/Product.png
--------------------------------------------------------------------------------
/Documents/Images/ProductList.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Documents/Images/ProductList.png
--------------------------------------------------------------------------------
/Documents/Images/Splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Documents/Images/Splash.png
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) Microsoft Corporation. All rights reserved.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE
22 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/CodeAnalysis/Menees.Analyzers.Settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 120
5 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Directory.Build.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | true
5 | false
6 |
7 |
8 |
9 | $(MSBuildThisFileDirectory)\CodeAnalysis\CodeAnalysis.ruleset
10 |
11 |
12 |
13 | 7.1
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Directory.Build.targets:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | all
6 | runtime; build; native; contentfiles; analyzers
7 |
8 |
9 |
10 | all
11 | runtime; build; native; contentfiles; analyzers
12 |
13 |
14 |
15 | all
16 | runtime; build; native; contentfiles; analyzers
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/AR/guide/.gitignore:
--------------------------------------------------------------------------------
1 | csv/
2 | images/
3 | records/
4 | train/
5 | inference_graph/
6 | net/
7 | guide_training.txt
8 | pipeline.config
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/AR/guide/guide.txt:
--------------------------------------------------------------------------------
1 | In Windows 10:
2 |
3 | labelImg -> https://github.com/tzutalin/labelImg/files/2638199/windows_v1.8.1.zip
4 | Python -> https://www.python.org/ftp/python/3.7.2/python-3.7.2-amd64.exe
5 |
6 | pip install tensorflow
7 | pip install pandas
8 | pip install Pillow
9 |
10 | Create csv/label_map.csv with the following content:
11 | class_text,class_label
12 | hardhat,1
13 |
14 | python xml_to_csv.py
15 | python generate_tfrecord.py
16 |
17 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/AR/guide/xml_to_csv.py:
--------------------------------------------------------------------------------
1 | import os
2 | import glob
3 | import pandas as pd
4 | import xml.etree.ElementTree as ET
5 |
6 |
7 | def xml_to_csv(path):
8 | xml_list = []
9 | for xml_file in glob.glob(path + '/*.xml'):
10 | tree = ET.parse(xml_file)
11 | root = tree.getroot()
12 | for member in root.findall('object'):
13 | value = (root.find('filename').text,
14 | member[0].text,
15 | int(member[4][0].text),
16 | int(member[4][1].text),
17 | int(member[4][2].text),
18 | int(member[4][3].text)
19 | )
20 | xml_list.append(value)
21 | column_name = ['filename', 'class_text', 'xmin', 'ymin', 'xmax', 'ymax']
22 | xml_df = pd.DataFrame(xml_list, columns=column_name)
23 | return xml_df
24 |
25 |
26 | def main():
27 | if not os.path.exists('csv'):
28 | os.makedirs('csv')
29 |
30 | for directory in ['train','test']:
31 | image_path = os.path.join(os.getcwd(), 'images/{}'.format(directory))
32 | xml_df = xml_to_csv(image_path)
33 | xml_df.to_csv('csv/{}.csv'.format(directory), index=None)
34 | print('Successfully converted xml to {}.csv'.format(directory))
35 |
36 | main()
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/AR/hardhat/detect.tflite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/AR/hardhat/detect.tflite
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/AR/hardhat/labels_list.txt:
--------------------------------------------------------------------------------
1 | ???
2 | hardhat
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/Fonts/BrandonGrotesque-Light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/Fonts/BrandonGrotesque-Light.otf
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/Fonts/BrandonGrotesque-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/Fonts/BrandonGrotesque-Medium.otf
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/Fonts/Gin-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/Fonts/Gin-Regular.otf
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/Images/header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/Images/header.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/Images/recommended_bathrooms.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/Images/recommended_bathrooms.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/Images/recommended_lighting.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/Images/recommended_lighting.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/Images/recommended_plants.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/Images/recommended_plants.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/Resources/Images/recommended_powertools.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/Resources/Images/recommended_powertools.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.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 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Features/Scanning/Photo/GalleryService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Android.Provider;
4 | using Plugin.CurrentActivity;
5 | using TailwindTraders.Mobile.Droid.Features.Scanning.Photo;
6 | using TailwindTraders.Mobile.Features.Scanning.Photo;
7 | using Xamarin.Forms;
8 |
9 | [assembly: Dependency(typeof(GalleryService))]
10 |
11 | namespace TailwindTraders.Mobile.Droid.Features.Scanning.Photo
12 | {
13 | public class GalleryService : IGalleryService
14 | {
15 | public Task> GetGalleryPhotosAsync(int photoCount)
16 | {
17 | var galleryList = new List();
18 |
19 | var projection = new[] { MediaStore.Images.Media.InterfaceConsts.Data };
20 | var orderBy = MediaStore.Images.Media.InterfaceConsts.DateModified + " DESC";
21 |
22 | var cursor = CrossCurrentActivity.Current.Activity.ContentResolver.Query(
23 | MediaStore.Images.Media.ExternalContentUri,
24 | projection,
25 | null,
26 | null,
27 | orderBy);
28 | if (cursor == null || !cursor.MoveToFirst())
29 | {
30 | return Task.FromResult(new List());
31 | }
32 |
33 | var photoIndex = 0;
34 | do
35 | {
36 | var path = cursor.GetString(cursor.GetColumnIndex(MediaStore.Images.Media.InterfaceConsts.Data));
37 | if (!string.IsNullOrEmpty(path))
38 | {
39 | galleryList.Add(path);
40 | }
41 |
42 | photoIndex++;
43 | }
44 | while (cursor.MoveToNext() && photoIndex < photoCount);
45 |
46 | return Task.FromResult(galleryList);
47 | }
48 | }
49 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Helpers/PathHelper.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 |
3 | namespace TailwindTraders.Mobile.Droid.Helpers
4 | {
5 | public static class PathHelper
6 | {
7 | public static string CopyToFilesDirAndGetPath(string path)
8 | {
9 | var cleanPath = path.Replace("/", "_");
10 |
11 | // https://kimsereyblog.blogspot.com/2016/11/differences-between-internal-and.html
12 | var absoluteFilePath = System.IO.Path.Combine(
13 | Android.App.Application.Context.FilesDir.AbsolutePath,
14 | cleanPath);
15 |
16 | var assets = Android.App.Application.Context.Assets;
17 | using (var f = assets.Open(path))
18 | {
19 | using (var dest = new FileStream(absoluteFilePath, FileMode.OpenOrCreate))
20 | {
21 | f.CopyTo(dest);
22 | }
23 | }
24 |
25 | return absoluteFilePath;
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/.gitignore:
--------------------------------------------------------------------------------
1 | tensorflow/
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/arm64-v8a/libtfliteextern.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/arm64-v8a/libtfliteextern.so
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/armeabi-v7a/libtfliteextern.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/armeabi-v7a/libtfliteextern.so
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/build_tf_lite_android.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | pushd tensorflow/tensorflow
4 |
5 | bazel build -c opt \
6 | --cpu=$1\
7 | --cxxopt='--std=c++11' \
8 | --crosstool_top=external:android/crosstool \
9 | --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
10 | //tensorflow/tfliteextern:libtfliteextern.so
11 | popd
12 |
13 | cp tensorflow/bazel-bin/tensorflow/tfliteextern/*.so $1
14 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/readme.txt:
--------------------------------------------------------------------------------
1 | Instructions to build libtfliteextern for Android in Ubuntu:
2 |
3 | Prerequisites:
4 | android-ndk-r12b
5 | Bazel
6 |
7 | -From current dir execute the following commands:
8 |
9 | git clone https://github.com/emgucv/tensorflow.git
10 | pushd tensorflow
11 | git checkout v1.12.0-emgu
12 | popd
13 |
14 | chmod +x build_tf_lite_android.sh
15 |
16 | ./build_tf_lite_android.sh x86
17 | ./build_tf_lite_android.sh x86_64
18 | ./build_tf_lite_android.sh armeabi-v7a
19 |
20 | In "tensorflow/tensorflow/contrib/lite/kernels/internal/BUILD" remove "//tensorflow:android_arm64": ["-mfloat-abi=softfp"], from the HARD_FP_FLAGS_IF_APPLICABLE flags
21 |
22 | ./build_tf_lite_android.sh arm64-v8a
23 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/x86/libtfliteextern.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/x86/libtfliteextern.so
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/x86_64/libtfliteextern.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Libs/EmguTF/x86_64/libtfliteextern.so
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/MainApplication.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Android.App;
3 | using Android.Runtime;
4 | using Plugin.CurrentActivity;
5 | using TailwindTraders.Mobile.Features.Settings;
6 |
7 | [assembly: Xamarin.Forms.ResolutionGroupName(nameof(TailwindTraders))]
8 |
9 | namespace TailwindTraders.Mobile.Droid
10 | {
11 | [Application(Debuggable = DefaultSettings.AndroidDebuggable)]
12 | public class MainApplication : Application
13 | {
14 | public MainApplication(IntPtr handle, JniHandleOwnership transer)
15 | : base(handle, transer)
16 | {
17 | }
18 |
19 | public override void OnCreate()
20 | {
21 | base.OnCreate();
22 |
23 | CrossCurrentActivity.Current.Init(this);
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Properties/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.InteropServices;
3 | using Android.App;
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("TailwindTraders.Mobile.Android")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("TailwindTraders.Mobile.Android")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 | [assembly: ComVisible(false)]
17 |
18 | // Version information for an assembly consists of the following four values:
19 | //
20 | // Major Version
21 | // Minor Version
22 | // Build Number
23 | // Revision
24 | //
25 | // You can specify all the values or you can default the Build and Revision Numbers
26 | // by using the '*' as shown below:
27 | // [assembly: AssemblyVersion("1.0.*")]
28 | [assembly: AssemblyVersion("1.0.0.0")]
29 | [assembly: AssemblyFileVersion("1.0.0.0")]
30 |
31 | // Add some common permissions, these can be removed if not needed
32 | [assembly: UsesPermission(Android.Manifest.Permission.Internet)]
33 | [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
34 | [assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)]
35 |
36 | [assembly: UsesFeature("android.hardware.camera", Required = false)]
37 | [assembly: UsesFeature("android.hardware.camera.autofocus", Required = false)]
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/capture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/capture.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/cart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/cart.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/close.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/filters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/filters.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/free_shipping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/free_shipping.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/ia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/ia.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/logo_header_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/logo_header_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/logo_horizontal_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/logo_horizontal_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/logo_vertical_w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/logo_vertical_w.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/photo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/photo.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/search.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/splash_screen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/splash_screen.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-hdpi/star.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/capture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/capture.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/cart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/cart.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/close.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/filters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/filters.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/free_shipping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/free_shipping.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/ia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/ia.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/logo_header_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/logo_header_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/logo_horizontal_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/logo_horizontal_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/logo_vertical_w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/logo_vertical_w.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/photo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/photo.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/search.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/splash_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | -
7 |
10 |
11 |
12 | -
13 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/splash_screen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/splash_screen.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-mdpi/star.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/capture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/capture.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/cart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/cart.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/close.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/filters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/filters.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/free_shipping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/free_shipping.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/ia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/ia.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/logo_header_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/logo_header_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/logo_horizontal_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/logo_horizontal_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/logo_vertical_w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/logo_vertical_w.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/photo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/photo.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/search.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/splash_screen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/splash_screen.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xhdpi/star.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/capture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/capture.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/cart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/cart.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/close.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/filters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/filters.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/free_shipping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/free_shipping.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/ia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/ia.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/logo_header_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/logo_header_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/logo_horizontal_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/logo_horizontal_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/logo_vertical_w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/logo_vertical_w.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/photo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/photo.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/search.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/splash_screen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/splash_screen.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxhdpi/star.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/drawable-xxxhdpi/INTENTIONALLY_EMPTY.txt:
--------------------------------------------------------------------------------
1 | Dear Developer,
2 |
3 | Since some resources are available in xxxhdpi but some others not, we won't use such —having into account too our
4 | target's a technical demo.
5 |
6 | Thanks,
7 |
8 | —A Developer
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/layout/Tabbar.axml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/layout/Toolbar.axml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/mipmap-hdpi/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/mipmap-hdpi/Icon.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/mipmap-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/mipmap-mdpi/icon.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/mipmap-xhdpi/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/mipmap-xhdpi/Icon.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/mipmap-xxhdpi/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/mipmap-xxhdpi/Icon.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #2F4B66
4 | @android:color/white
5 | @android:color/white
6 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Tailwind Traders
4 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
19 |
20 |
25 |
26 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/Resources/xml/file_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/SplashActivity.cs:
--------------------------------------------------------------------------------
1 | using Android.App;
2 | using Android.Content;
3 | using Android.Content.PM;
4 | using Android.OS;
5 |
6 | namespace TailwindTraders.Mobile.Droid
7 | {
8 | [Activity(
9 | Label = "@string/appName",
10 | Icon = "@mipmap/icon",
11 | Theme = "@style/SplashTheme",
12 | MainLauncher = true,
13 | NoHistory = true,
14 | ScreenOrientation = ScreenOrientation.Portrait)]
15 | public class SplashActivity : Activity
16 | {
17 | protected override void OnCreate(Bundle savedInstanceState)
18 | {
19 | base.OnCreate(savedInstanceState);
20 |
21 | var intent = new Intent(this, typeof(MainActivity));
22 | StartActivity(intent);
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/ThirdParties/Camera/CameraState.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Droid.ThirdParties.Camera
2 | {
3 | public enum CameraState : int
4 | {
5 | // Camera state: Showing camera preview.
6 | STATE_PREVIEW = 0,
7 |
8 | // Camera state: Waiting for the focus to be locked.
9 | STATE_WAITING_LOCK = 1,
10 |
11 | // Camera state: Waiting for the exposure to be precapture state.
12 | STATE_WAITING_PRECAPTURE = 2,
13 |
14 | // Camera state: Waiting for the exposure state to be something other than precapture.
15 | STATE_WAITING_NON_PRECAPTURE = 3,
16 |
17 | // Camera state: Picture was taken.
18 | STATE_PICTURE_TAKEN = 4,
19 | }
20 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/ThirdParties/Camera/CompareSizesByArea.cs:
--------------------------------------------------------------------------------
1 | using Android.Util;
2 | using Java.Lang;
3 | using Java.Util;
4 |
5 | namespace TailwindTraders.Mobile.Droid.ThirdParties.Camera
6 | {
7 | public class CompareSizesByArea : Java.Lang.Object, IComparator
8 | {
9 | public int Compare(Object lhs, Object rhs)
10 | {
11 | var lhsSize = (Size)lhs;
12 | var rhsSize = (Size)rhs;
13 |
14 | // We cast here to ensure the multiplications won't overflow
15 | return Long.Signum(((long)lhsSize.Width * lhsSize.Height) - ((long)rhsSize.Width * rhsSize.Height));
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/ThirdParties/Camera/ICamera.cs:
--------------------------------------------------------------------------------
1 | using Android.App;
2 | using Android.Hardware.Camera2;
3 | using Android.OS;
4 | using Java.Util.Concurrent;
5 |
6 | namespace TailwindTraders.Mobile.Droid.ThirdParties.Camera
7 | {
8 | public interface ICamera
9 | {
10 | Semaphore mCameraOpenCloseLock { get; set; }
11 |
12 | CameraDevice mCameraDevice { get; set; }
13 |
14 | Activity Activity { get; set; }
15 |
16 | Handler mBackgroundHandler { get; set; }
17 |
18 | CameraCaptureSession mCaptureSession { get; set; }
19 |
20 | CaptureRequest.Builder mPreviewRequestBuilder { get; set; }
21 |
22 | CaptureRequest mPreviewRequest { get; set; }
23 |
24 | void CreateCameraPreviewSession();
25 |
26 | void OpenCamera(int width, int height);
27 |
28 | void OnCaptureComplete(string path);
29 |
30 | int GetOrientation();
31 | }
32 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/ThirdParties/Camera/Listeners/CameraStateListener.cs:
--------------------------------------------------------------------------------
1 | using Android.App;
2 | using Android.Hardware.Camera2;
3 |
4 | namespace TailwindTraders.Mobile.Droid.ThirdParties.Camera.Listeners
5 | {
6 | public class CameraStateListener : CameraDevice.StateCallback
7 | {
8 | private readonly ICamera owner;
9 |
10 | public CameraStateListener(ICamera owner)
11 | {
12 | if (owner == null)
13 | {
14 | throw new System.ArgumentNullException("owner");
15 | }
16 |
17 | this.owner = owner;
18 | }
19 |
20 | public override void OnOpened(CameraDevice cameraDevice)
21 | {
22 | // This method is called when the camera is opened. We start camera preview here.
23 | owner.mCameraOpenCloseLock.Release();
24 | owner.mCameraDevice = cameraDevice;
25 | owner.CreateCameraPreviewSession();
26 | }
27 |
28 | public override void OnDisconnected(CameraDevice cameraDevice)
29 | {
30 | owner.mCameraOpenCloseLock.Release();
31 | cameraDevice.Close();
32 | owner.mCameraDevice = null;
33 | }
34 |
35 | public override void OnError(CameraDevice cameraDevice, CameraError error)
36 | {
37 | owner.mCameraOpenCloseLock.Release();
38 | cameraDevice.Close();
39 | owner.mCameraDevice = null;
40 | if (owner == null)
41 | {
42 | return;
43 | }
44 |
45 | Activity activity = owner.Activity;
46 | if (activity != null)
47 | {
48 | activity.Finish();
49 | }
50 | }
51 | }
52 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/ThirdParties/Camera/Listeners/CameraSurfaceTextureListener.cs:
--------------------------------------------------------------------------------
1 | using Android.Views;
2 |
3 | namespace TailwindTraders.Mobile.Droid.ThirdParties.Camera.Listeners
4 | {
5 | public class CameraSurfaceTextureListener : Java.Lang.Object, TextureView.ISurfaceTextureListener
6 | {
7 | private readonly ICamera owner;
8 |
9 | public CameraSurfaceTextureListener(ICamera owner)
10 | {
11 | if (owner == null)
12 | {
13 | throw new System.ArgumentNullException("owner");
14 | }
15 |
16 | this.owner = owner;
17 | }
18 |
19 | public void OnSurfaceTextureAvailable(Android.Graphics.SurfaceTexture surface, int width, int height)
20 | {
21 | owner.OpenCamera(width, height);
22 | }
23 |
24 | public bool OnSurfaceTextureDestroyed(Android.Graphics.SurfaceTexture surface)
25 | {
26 | return true;
27 | }
28 |
29 | public void OnSurfaceTextureSizeChanged(Android.Graphics.SurfaceTexture surface, int width, int height)
30 | {
31 | }
32 |
33 | public void OnSurfaceTextureUpdated(Android.Graphics.SurfaceTexture surface)
34 | {
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/ThirdParties/Camera/readme.txt:
--------------------------------------------------------------------------------
1 | Modified version of Camera2Basic sample from here:
2 |
3 | https://github.com/Microsoft/ConferenceVision/tree/master/ConferenceVision/ConferenceVision.Android/Camera2Basic
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/appcenter-post-clone.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ########################################################################################################################
4 | # XAML policies
5 | ########################################################################################################################
6 |
7 | PROJECTPATH="$APPCENTER_SOURCE_DIRECTORY/Source/TailwindTraders.Mobile"
8 |
9 | echo "Verifying XAML policies:"
10 |
11 | pushd $PROJECTPATH
12 | mono ../Tools/XamlStyler/XamlStyler.Console/xstyler.exe -c ./CodeAnalysis/XamlStylerSettings.json -d . -r true -v
13 |
14 | if [[ $? -eq 0 ]]
15 | then
16 | echo
17 | echo "Every XAML follows defined policies :-)"
18 | else
19 | echo
20 | echo "Not every XAML follows defined policies :-("
21 | exit 1
22 | fi
23 |
24 | popd
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.Android/environment.txt:
--------------------------------------------------------------------------------
1 | # Decrease Mono logging - https://www.mono-project.com/docs/advanced/runtime/logging-runtime-events/
2 | MONO_LOG_LEVEL=error
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Application.cs:
--------------------------------------------------------------------------------
1 | using UIKit;
2 |
3 | namespace TailwindTraders.Mobile.IOS
4 | {
5 | public class Application
6 | {
7 | // This is the main entry point of the application.
8 | public static void Main(string[] args)
9 | {
10 | // if you want to use a different Application Delegate class from "AppDelegate"
11 | // you can specify it here.
12 | UIApplication.Main(args, null, "AppDelegate");
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/3bar.imageset/3bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/3bar.imageset/3bar.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/3bar.imageset/3bar@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/3bar.imageset/3bar@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/3bar.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "3bar.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "3bar@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "scale": "3x",
15 | "idiom": "universal"
16 | }
17 | ],
18 | "info": {
19 | "version": 1,
20 | "author": "xcode"
21 | }
22 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/app_icon.appiconset/Icon1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/app_icon.appiconset/Icon1024.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/app_icon.appiconset/Icon120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/app_icon.appiconset/Icon120.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/app_icon.appiconset/Icon180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/app_icon.appiconset/Icon180.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/capture.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "scale": "1x",
5 | "idiom": "iphone",
6 | "filename": "capture.png"
7 | },
8 | {
9 | "scale": "2x",
10 | "idiom": "iphone",
11 | "filename": "capture@2x.png"
12 | },
13 | {
14 | "scale": "3x",
15 | "idiom": "iphone",
16 | "filename": "capture@3x.png"
17 | }
18 | ],
19 | "properties": {},
20 | "info": {
21 | "version": 1,
22 | "author": ""
23 | }
24 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/capture.imageset/capture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/capture.imageset/capture.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/capture.imageset/capture@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/capture.imageset/capture@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/capture.imageset/capture@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/capture.imageset/capture@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/cart.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "cart.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "cart@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "cart@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/cart.imageset/cart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/cart.imageset/cart.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/cart.imageset/cart@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/cart.imageset/cart@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/cart.imageset/cart@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/cart.imageset/cart@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/close.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "scale": "1x",
5 | "idiom": "iphone",
6 | "filename": "close.png"
7 | },
8 | {
9 | "scale": "2x",
10 | "idiom": "iphone",
11 | "filename": "close@2x.png"
12 | },
13 | {
14 | "scale": "3x",
15 | "idiom": "iphone",
16 | "filename": "close@3x.png"
17 | }
18 | ],
19 | "properties": {},
20 | "info": {
21 | "version": 1,
22 | "author": ""
23 | }
24 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/close.imageset/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/close.imageset/close.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/close.imageset/close@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/close.imageset/close@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/close.imageset/close@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/close.imageset/close@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/filters.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "filters.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "filters@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "filters@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/filters.imageset/filters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/filters.imageset/filters.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/filters.imageset/filters@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/filters.imageset/filters@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/filters.imageset/filters@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/filters.imageset/filters@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/free_shipping.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "free_shipping.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "free_shipping@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "free_shipping@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/free_shipping.imageset/free_shipping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/free_shipping.imageset/free_shipping.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/free_shipping.imageset/free_shipping@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/free_shipping.imageset/free_shipping@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/free_shipping.imageset/free_shipping@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/free_shipping.imageset/free_shipping@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/ia.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "ia.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "ia@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "ia@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/ia.imageset/ia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/ia.imageset/ia.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/ia.imageset/ia@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/ia.imageset/ia@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/ia.imageset/ia@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/ia.imageset/ia@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_header_b.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "logo_header_b.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "logo_header_b@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "logo_header_b@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_header_b.imageset/logo_header_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_header_b.imageset/logo_header_b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_header_b.imageset/logo_header_b@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_header_b.imageset/logo_header_b@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_header_b.imageset/logo_header_b@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_header_b.imageset/logo_header_b@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_horizontal_b.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "logo_horizontal-b.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "logo_horizontal-b@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "logo_horizontal-b@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_horizontal_b.imageset/logo_horizontal-b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_horizontal_b.imageset/logo_horizontal-b.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_horizontal_b.imageset/logo_horizontal-b@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_horizontal_b.imageset/logo_horizontal-b@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_horizontal_b.imageset/logo_horizontal-b@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_horizontal_b.imageset/logo_horizontal-b@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_vertical_w.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "logo_vertical_w.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "logo_vertical_w@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "logo_vertical_w@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_vertical_w.imageset/logo_vertical_w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_vertical_w.imageset/logo_vertical_w.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_vertical_w.imageset/logo_vertical_w@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_vertical_w.imageset/logo_vertical_w@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_vertical_w.imageset/logo_vertical_w@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/logo_vertical_w.imageset/logo_vertical_w@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/photo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "photo.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "photo@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "photo@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/photo.imageset/photo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/photo.imageset/photo.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/photo.imageset/photo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/photo.imageset/photo@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/photo.imageset/photo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/photo.imageset/photo@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/search.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "search.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "search@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "search@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/search.imageset/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/search.imageset/search.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/search.imageset/search@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/search.imageset/search@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/search.imageset/search@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/search.imageset/search@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/splash_screen.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "Splash_screen.jpg",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "Splash_screen@2x.jpg",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "Splash_screen@3x.jpg",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/splash_screen.imageset/Splash_screen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/splash_screen.imageset/Splash_screen.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/splash_screen.imageset/Splash_screen@2x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/splash_screen.imageset/Splash_screen@2x.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/splash_screen.imageset/Splash_screen@3x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/splash_screen.imageset/Splash_screen@3x.jpg
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/star.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "star.png",
5 | "scale": "1x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "star@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "star@3x.png",
15 | "scale": "3x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/star.imageset/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/star.imageset/star.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/star.imageset/star@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/star.imageset/star@2x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/star.imageset/star@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Assets.xcassets/star.imageset/star@3x.png
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Effects/MultilineButtonEffect.cs:
--------------------------------------------------------------------------------
1 | using TailwindTraders.Mobile.Effects;
2 | using UIKit;
3 | using Xamarin.Forms;
4 | using Xamarin.Forms.Platform.iOS;
5 |
6 | [assembly: ExportEffect(
7 | typeof(TailwindTraders.Mobile.IOS.Effects.MultilineButtonEffect), nameof(MultilineButtonEffect))]
8 |
9 | namespace TailwindTraders.Mobile.IOS.Effects
10 | {
11 | public class MultilineButtonEffect : PlatformEffect
12 | {
13 | protected override void OnAttached()
14 | {
15 | var button = Control as UIButton;
16 | button.TitleLabel.LineBreakMode = UILineBreakMode.WordWrap;
17 | }
18 |
19 | protected override void OnDetached()
20 | {
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | keychain-access-groups
6 |
7 | $(AppIdentifierPrefix)com.microsoft.tailwindtraders
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Features/LogIn/BorderlessEntryEffect.cs:
--------------------------------------------------------------------------------
1 | using CoreGraphics;
2 | using TailwindTraders.Mobile.Effects;
3 | using UIKit;
4 | using Xamarin.Forms;
5 | using Xamarin.Forms.Platform.iOS;
6 |
7 | [assembly: ExportEffect(
8 | typeof(TailwindTraders.Mobile.IOS.Features.LogIn.BorderlessEntryEffect), nameof(BorderlessEntryEffect))]
9 |
10 | namespace TailwindTraders.Mobile.IOS.Features.LogIn
11 | {
12 | public class BorderlessEntryEffect : PlatformEffect
13 | {
14 | protected override void OnAttached()
15 | {
16 | var textField = Control as UITextField;
17 | textField.BorderStyle = UITextBorderStyle.None;
18 |
19 | var layer = textField.Layer;
20 | var primaryColor = (Color)App.Current.Resources["PrimaryColor"];
21 | layer.BackgroundColor = primaryColor.ToCGColor();
22 | var accentColor = (Color)App.Current.Resources["AccentColor"];
23 | layer.ShadowColor = accentColor.ToCGColor();
24 | layer.ShadowOffset = new CGSize(0, 2);
25 | layer.ShadowOpacity = 1;
26 | layer.ShadowRadius = 0;
27 | }
28 |
29 | protected override void OnDetached()
30 | {
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Libs/EmguTF/.gitignore:
--------------------------------------------------------------------------------
1 | tensorflow/
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Libs/EmguTF/build_tf_lite_ios.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | pushd tensorflow/tensorflow/contrib/lite/tools/make
4 | ./download_dependencies.sh
5 | popd
6 |
7 | ./tensorflow/tensorflow/contrib/lite/tools/make/build_ios_universal_lib.sh
8 |
9 | cp tensorflow/tensorflow/contrib/lite/tools/make/gen/lib/libtensorflow-lite.a libtfliteextern.a
10 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Libs/EmguTF/libtfliteextern.a:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoft/TailwindTraders-Mobile/ce79771ddc326caeb907239185e2810af752ff86/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Libs/EmguTF/libtfliteextern.a
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Libs/EmguTF/readme.txt:
--------------------------------------------------------------------------------
1 | Instructions to build libtfliteextern for iOS in OSX:
2 |
3 | Prerequisites:
4 | xcode
5 |
6 | -From current dir execute the following commands:
7 |
8 | git clone https://github.com/emgucv/tensorflow.git
9 | pushd tensorflow
10 | git checkout v1.12.0-emgu
11 | popd
12 | chmod +x build_tf_lite_ios.sh
13 | ./build_tf_lite_ios.sh
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.InteropServices;
3 |
4 | // General Information about an assembly is controlled through the following
5 | // set of attributes. Change these attribute values to modify the information
6 | // associated with an assembly.
7 | [assembly: AssemblyTitle("TailwindTraders.Mobile.IOS")]
8 | [assembly: AssemblyDescription("")]
9 | [assembly: AssemblyConfiguration("")]
10 | [assembly: AssemblyCompany("")]
11 | [assembly: AssemblyProduct("TailwindTraders.Mobile.IOS")]
12 | [assembly: AssemblyCopyright("Copyright © 2014")]
13 | [assembly: AssemblyTrademark("")]
14 | [assembly: AssemblyCulture("")]
15 |
16 | // Setting ComVisible to false makes the types in this assembly not visible
17 | // to COM components. If you need to access a type in this assembly from
18 | // COM, set the ComVisible attribute to true on that type.
19 | [assembly: ComVisible(false)]
20 |
21 | // The following GUID is for the ID of the typelib if this project is exposed to COM
22 | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
23 |
24 | // Version information for an assembly consists of the following four values:
25 | //
26 | // Major Version
27 | // Minor Version
28 | // Build Number
29 | // Revision
30 | //
31 | // You can specify all the values or you can default the Build and Revision Numbers
32 | // by using the '*' as shown below:
33 | // [assembly: AssemblyVersion("1.0.*")]
34 | [assembly: AssemblyVersion("1.0.0.0")]
35 | [assembly: AssemblyFileVersion("1.0.0.0")]
36 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/ThirdParties/Camera/readme.txt:
--------------------------------------------------------------------------------
1 | Modified version of CameraManager.cs from here:
2 |
3 | https://github.com/Microsoft/ConferenceVision/blob/master/ConferenceVision/ConferenceVision.iOS/Utils/CameraManager.cs
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile.iOS/appcenter-post-clone.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ########################################################################################################################
4 | # XAML policies
5 | ########################################################################################################################
6 |
7 | PROJECTPATH="$APPCENTER_SOURCE_DIRECTORY/Source/TailwindTraders.Mobile"
8 |
9 | echo "Verifying XAML policies:"
10 |
11 | pushd $PROJECTPATH
12 | mono ../Tools/XamlStyler/XamlStyler.Console/xstyler.exe -c ./CodeAnalysis/XamlStylerSettings.json -d . -r true -v
13 |
14 | if [[ $? -eq 0 ]]
15 | then
16 | echo
17 | echo "Every XAML follows defined policies :-)"
18 | else
19 | echo
20 | echo "Not every XAML follows defined policies :-("
21 | exit 1
22 | fi
23 |
24 | popd
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/App.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Colors.xaml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
17 |
18 | #2F4B66
19 |
20 | #673C4F
21 |
22 | White
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Colors.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile
2 | {
3 | public partial class Colors
4 | {
5 | public Colors()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/ControlTemplates.xaml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
13 |
14 |
19 |
20 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/ControlTemplates.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile
2 | {
3 | public partial class ControlTemplates
4 | {
5 | public ControlTemplates()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Controls/FixedRatioCarouselViewControl.cs:
--------------------------------------------------------------------------------
1 | using CarouselView.FormsPlugin.Abstractions;
2 | using Xamarin.Forms;
3 |
4 | namespace TailwindTraders.Mobile.Controls
5 | {
6 | public class FixedRatioCarouselViewControl : CarouselViewControl
7 | {
8 | protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint) =>
9 | new SizeRequest(new Size(widthConstraint, widthConstraint * 1.27f));
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Converters.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Converters.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile
2 | {
3 | public partial class Converters
4 | {
5 | public Converters()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Effects/BorderlessEntryEffect.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace TailwindTraders.Mobile.Effects
4 | {
5 | public class BorderlessEntryEffect : RoutingEffect
6 | {
7 | public BorderlessEntryEffect()
8 | : base($"{nameof(TailwindTraders)}.{nameof(BorderlessEntryEffect)}")
9 | {
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Effects/MultilineButtonEffect.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace TailwindTraders.Mobile.Effects
4 | {
5 | public class MultilineButtonEffect : RoutingEffect
6 | {
7 | public MultilineButtonEffect()
8 | : base($"{nameof(TailwindTraders)}.{nameof(MultilineButtonEffect)}")
9 | {
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Common/FakeRestPoolService.cs:
--------------------------------------------------------------------------------
1 | using TailwindTraders.Mobile.Features.Home;
2 | using TailwindTraders.Mobile.Features.LogIn;
3 | using TailwindTraders.Mobile.Features.Product;
4 | using TailwindTraders.Mobile.Features.Product.Cart;
5 |
6 | namespace TailwindTraders.Mobile.Features.Common
7 | {
8 | public class FakeRestPoolService : IRestPoolService
9 | {
10 | public IProfilesAPI ProfilesAPI { get; } = new FakeProfilesAPI();
11 |
12 | public IHomeAPI HomeAPI { get; } = new FakeHomeAPI();
13 |
14 | public IProductsAPI ProductsAPI { get; } = new FakeProductsAPI();
15 |
16 | public ILoginAPI LoginAPI { get; } = new FakeLoginAPI();
17 |
18 | public ISimilarProductsAPI SimilarProductsAPI { get; } = new FakeSimilarProductsAPI();
19 |
20 | public IProductCartAPI ProductCartAPI { get; } = new FakeProductCartAPI();
21 |
22 | public void UpdateApiUrl(string newApiUrl)
23 | {
24 | // Intentionally blank
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Common/IRestPoolService.cs:
--------------------------------------------------------------------------------
1 | using TailwindTraders.Mobile.Features.Home;
2 | using TailwindTraders.Mobile.Features.LogIn;
3 | using TailwindTraders.Mobile.Features.Product;
4 | using TailwindTraders.Mobile.Features.Product.Cart;
5 |
6 | namespace TailwindTraders.Mobile.Features.Common
7 | {
8 | public interface IRestPoolService
9 | {
10 | IProfilesAPI ProfilesAPI { get; }
11 |
12 | IHomeAPI HomeAPI { get; }
13 |
14 | IProductsAPI ProductsAPI { get; }
15 |
16 | ILoginAPI LoginAPI { get; }
17 |
18 | ISimilarProductsAPI SimilarProductsAPI { get; }
19 |
20 | IProductCartAPI ProductCartAPI { get; }
21 |
22 | void UpdateApiUrl(string newApiUrl);
23 | }
24 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Common/RestPoolService.cs:
--------------------------------------------------------------------------------
1 | using Refit;
2 | using TailwindTraders.Mobile.Features.Home;
3 | using TailwindTraders.Mobile.Features.LogIn;
4 | using TailwindTraders.Mobile.Features.Product;
5 | using TailwindTraders.Mobile.Features.Product.Cart;
6 | using TailwindTraders.Mobile.Features.Settings;
7 | using TailwindTraders.Mobile.Helpers;
8 |
9 | namespace TailwindTraders.Mobile.Features.Common
10 | {
11 | public class RestPoolService : IRestPoolService
12 | {
13 | public IProfilesAPI ProfilesAPI { get; private set; }
14 |
15 | public IHomeAPI HomeAPI { get; private set; }
16 |
17 | public IProductsAPI ProductsAPI { get; private set; }
18 |
19 | public ILoginAPI LoginAPI { get; private set; }
20 |
21 | public ISimilarProductsAPI SimilarProductsAPI { get; private set; }
22 |
23 | // There is no real API for products cart, meanwhile must use a faked one
24 | public IProductCartAPI ProductCartAPI => new FakeProductCartAPI();
25 |
26 | public RestPoolService()
27 | {
28 | UpdateApiUrl(DefaultSettings.RootApiUrl);
29 | }
30 |
31 | public void UpdateApiUrl(string newApiUrl)
32 | {
33 | LoginAPI = RestService.For(
34 | HttpClientFactory.Create(newApiUrl));
35 | ProfilesAPI = RestService.For(
36 | HttpClientFactory.Create(DefaultSettings.RootWebApiUrl));
37 | HomeAPI = RestService.For(
38 | HttpClientFactory.Create(newApiUrl));
39 | ProductsAPI = RestService.For(
40 | HttpClientFactory.Create(newApiUrl));
41 | SimilarProductsAPI = RestService.For(
42 | HttpClientFactory.Create(newApiUrl));
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/FakeHomeAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using Refit;
3 | using TailwindTraders.Mobile.Features.Product;
4 | using TailwindTraders.Mobile.Features.Settings;
5 | using TailwindTraders.Mobile.Helpers;
6 |
7 | namespace TailwindTraders.Mobile.Features.Home
8 | {
9 | public class FakeHomeAPI : IHomeAPI
10 | {
11 | public Task GetAsync([Header(DefaultSettings.ApiAuthorizationHeader)] string authorizationHeader)
12 | => FakeNetwork.ReturnAsync(new LandingDTO { PopularProducts = FakeProducts.Fakes, });
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/FreeShippingBanner.xaml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
19 |
20 |
21 |
24 |
25 |
30 |
31 |
38 |
39 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/FreeShippingBanner.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Home
2 | {
3 | public partial class FreeShippingBanner
4 | {
5 | public FreeShippingBanner()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/HomePage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Xamarin.Forms;
3 |
4 | namespace TailwindTraders.Mobile.Features.Home
5 | {
6 | public partial class HomePage
7 | {
8 | public HomePage()
9 | {
10 | InitializeComponent();
11 |
12 | BindingContext = new HomeViewModel();
13 | }
14 |
15 | internal override IEnumerable GetStateAwareVisualElements() => new VisualElement[]
16 | {
17 | refreshButton,
18 | stateAwareStackLayout,
19 | };
20 | }
21 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/IHomeAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using Refit;
3 | using TailwindTraders.Mobile.Features.Settings;
4 |
5 | namespace TailwindTraders.Mobile.Features.Home
6 | {
7 | public interface IHomeAPI
8 | {
9 | [Get("/products/landing")]
10 | Task GetAsync([Header(DefaultSettings.ApiAuthorizationHeader)] string authorizationHeader);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/LandingDTO.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using TailwindTraders.Mobile.Features.Product;
3 |
4 | namespace TailwindTraders.Mobile.Features.Home
5 | {
6 | public class LandingDTO
7 | {
8 | public IEnumerable PopularProducts { get; set; }
9 | }
10 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/RecommendedItemTemplate.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
28 |
29 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/RecommendedItemTemplate.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Home
2 | {
3 | public partial class RecommendedItemTemplate
4 | {
5 | public RecommendedItemTemplate()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Home/UppercaseConverter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Globalization;
3 | using Xamarin.Forms;
4 |
5 | namespace TailwindTraders.Mobile.Features.Home
6 | {
7 | internal class UppercaseConverter : IValueConverter
8 | {
9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
10 | {
11 | string output;
12 |
13 | if (value is string input)
14 | {
15 | output = input?.ToUpperInvariant();
16 | }
17 | else
18 | {
19 | throw new ArgumentException("Value must be string.", nameof(value));
20 | }
21 |
22 | return output;
23 | }
24 |
25 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
26 | {
27 | throw new NotImplementedException();
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/AuthenticationService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using System.Threading.Tasks;
4 | using TailwindTraders.Mobile.Features.Common;
5 | using TailwindTraders.Mobile.Features.Settings;
6 | using Xamarin.Forms;
7 |
8 | namespace TailwindTraders.Mobile.Features.LogIn
9 | {
10 | public class AuthenticationService : IAuthenticationService
11 | {
12 | private readonly IRestPoolService restPoolService;
13 |
14 | private string authenticatedUser;
15 |
16 | public AuthenticationService()
17 | {
18 | restPoolService = DependencyService.Get();
19 | }
20 |
21 | public string AuthorizationHeader => $"Bearer {DefaultSettings.AccessToken}";
22 |
23 | public bool IsAnyOneLoggedIn => authenticatedUser != null;
24 |
25 | public async Task LogInAsync(string email, string password)
26 | {
27 | DefaultSettings.AccessToken = await GetTokenAsync(email, password);
28 |
29 | var profiles = await restPoolService.ProfilesAPI.GetAsync(AuthorizationHeader);
30 |
31 | if (!profiles.Any())
32 | {
33 | throw new InvalidOperationException("No profile could be retrieved.");
34 | }
35 |
36 | authenticatedUser = profiles.First().Email;
37 | }
38 |
39 | private async Task GetTokenAsync(string email, string password)
40 | {
41 | var request = new LoginRequestDTO()
42 | {
43 | Username = email,
44 | Password = password,
45 | };
46 |
47 | var response = await restPoolService.LoginAPI.LoginAsync(request);
48 |
49 | return response.AccessToken.Token;
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/FakeAuthenticationService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 |
4 | namespace TailwindTraders.Mobile.Features.LogIn
5 | {
6 | public class FakeAuthenticationService : IAuthenticationService
7 | {
8 | public string AuthorizationHeader => string.Empty;
9 |
10 | public bool IsAnyOneLoggedIn { get; private set; } = false;
11 |
12 | public async Task LogInAsync(string email, string password)
13 | {
14 | await Task.Delay(TimeSpan.FromSeconds(2));
15 |
16 | IsAnyOneLoggedIn = true;
17 | }
18 |
19 | public async Task LogInWithMicrosoftAsync()
20 | {
21 | await Task.Delay(TimeSpan.FromSeconds(2));
22 |
23 | IsAnyOneLoggedIn = true;
24 | }
25 |
26 | public void LogOut()
27 | {
28 | }
29 |
30 | public async Task RefreshSessionAsync()
31 | {
32 | await Task.Delay(TimeSpan.FromSeconds(2));
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/FakeLoginAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace TailwindTraders.Mobile.Features.LogIn
4 | {
5 | public class FakeLoginAPI : ILoginAPI
6 | {
7 | public Task LoginAsync(LoginRequestDTO request)
8 | {
9 | return Task.FromResult(
10 | new LoginResponseDTO
11 | {
12 | AccessToken = new LoginResponseDTO.AccessTokenDTO
13 | {
14 | Token = "faketoken",
15 | TokenType = "faketokentype",
16 | ExpiresIn = 1000,
17 | },
18 | });
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/FakeProfilesAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Refit;
4 |
5 | namespace TailwindTraders.Mobile.Features.LogIn
6 | {
7 | public class FakeProfilesAPI : IProfilesAPI
8 | {
9 | public Task> GetAsync([Header("Authorization")] string authorizationHeader) =>
10 | Task.FromResult>(new List
11 | {
12 | new ProfileDTO { Email = "fake@fake.com" },
13 | });
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/IAuthenticationService.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace TailwindTraders.Mobile.Features.LogIn
4 | {
5 | public interface IAuthenticationService
6 | {
7 | string AuthorizationHeader { get; }
8 |
9 | bool IsAnyOneLoggedIn { get; }
10 |
11 | Task LogInAsync(string email, string password);
12 | }
13 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/ILoginAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using Refit;
3 |
4 | namespace TailwindTraders.Mobile.Features.LogIn
5 | {
6 | public interface ILoginAPI
7 | {
8 | [Post("/login")]
9 | Task LoginAsync(LoginRequestDTO request);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/IProfilesAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Refit;
4 | using TailwindTraders.Mobile.Features.Settings;
5 |
6 | namespace TailwindTraders.Mobile.Features.LogIn
7 | {
8 | public interface IProfilesAPI
9 | {
10 | [Get("/profiles")]
11 | Task> GetAsync(
12 | [Header(DefaultSettings.ApiAuthorizationHeader)] string authorizationHeader);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/LogInPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace TailwindTraders.Mobile.Features.LogIn
4 | {
5 | public partial class LogInPage
6 | {
7 | public LogInPage()
8 | {
9 | NavigationPage.SetHasNavigationBar(this, false);
10 |
11 | InitializeComponent();
12 |
13 | BindingContext = new LoginViewModel();
14 | }
15 |
16 | protected override bool OnBackButtonPressed()
17 | {
18 | return true;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/LoginRequestDTO.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json;
2 |
3 | namespace TailwindTraders.Mobile.Features.LogIn
4 | {
5 | public class LoginRequestDTO
6 | {
7 | public string Username { get; set; }
8 |
9 | public string Password { get; set; }
10 |
11 | [JsonProperty(PropertyName = "grant_type")]
12 | public string GrantType { get; set; } = "password";
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/LoginResponseDTO.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json;
2 |
3 | namespace TailwindTraders.Mobile.Features.LogIn
4 | {
5 | public class LoginResponseDTO
6 | {
7 | [JsonProperty(PropertyName = "access_token")]
8 | public AccessTokenDTO AccessToken { get; set; }
9 |
10 | public class AccessTokenDTO
11 | {
12 | public string Token { get; set; }
13 |
14 | [JsonProperty(PropertyName = "token_type")]
15 | public string TokenType { get; set; }
16 |
17 | [JsonProperty(PropertyName = "expires_in")]
18 | public int ExpiresIn { get; set; }
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/LogIn/ProfileDTO.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.LogIn
2 | {
3 | public class ProfileDTO
4 | {
5 | public int Id { get; set; }
6 |
7 | public string Name { get; set; }
8 |
9 | public string Address { get; set; }
10 |
11 | public string PhoneNumber { get; set; }
12 |
13 | public string Email { get; set; }
14 | }
15 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Logging/AppCenterLoggingService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Microsoft.AppCenter;
4 | using Microsoft.AppCenter.Analytics;
5 | using Microsoft.AppCenter.Crashes;
6 | using Microsoft.AppCenter.Distribute;
7 | using TailwindTraders.Mobile.Features.Settings;
8 |
9 | namespace TailwindTraders.Mobile.Features.Logging
10 | {
11 | public class AppCenterLoggingService : ILoggingService
12 | {
13 | public AppCenterLoggingService()
14 | {
15 | AppCenter.LogLevel = LogLevel.Verbose;
16 | AppCenter.Start(
17 | $"ios={DefaultSettings.AppCenteriOSSecret};android={DefaultSettings.AppCenterAndroidSecret}",
18 | typeof(Analytics),
19 | typeof(Crashes),
20 | typeof(Distribute));
21 | }
22 |
23 | public void Debug(string message)
24 | {
25 | Analytics.TrackEvent(nameof(Debug), new Dictionary { { nameof(message), message } });
26 | }
27 |
28 | public void Warning(string message)
29 | {
30 | Analytics.TrackEvent(nameof(Warning), new Dictionary { { nameof(message), message } });
31 | }
32 |
33 | public void Error(Exception exception)
34 | {
35 | Crashes.TrackError(exception);
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Logging/DebugLoggingService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace TailwindTraders.Mobile.Features.Logging
4 | {
5 | public class DebugLoggingService : ILoggingService
6 | {
7 | public void Debug(string message)
8 | {
9 | System.Diagnostics.Debug.WriteLine(message);
10 | }
11 |
12 | public void Warning(string message)
13 | {
14 | Debug($"# {nameof(Warning)}");
15 | Debug(message);
16 | }
17 |
18 | public void Error(Exception exception)
19 | {
20 | Debug($"# {nameof(Error)}");
21 | Debug(exception.ToString());
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Logging/ILoggingService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace TailwindTraders.Mobile.Features.Logging
4 | {
5 | public interface ILoggingService
6 | {
7 | void Debug(string message);
8 |
9 | void Warning(string message);
10 |
11 | void Error(Exception exception);
12 | }
13 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/BrandDTO.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product
2 | {
3 | public class BrandDTO
4 | {
5 | public int Id { get; set; }
6 |
7 | public string Name { get; set; }
8 | }
9 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Cart/FakeProductCartAPI.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 |
6 | namespace TailwindTraders.Mobile.Features.Product.Cart
7 | {
8 | public class FakeProductCartAPI : IProductCartAPI
9 | {
10 | private readonly List lines;
11 |
12 | public FakeProductCartAPI()
13 | {
14 | lines = new List();
15 | }
16 |
17 | public async Task AddProductAsync(ProductDTO product)
18 | {
19 | // Simulate delay
20 | await Task.Delay(TimeSpan.FromSeconds(1));
21 |
22 | if (lines.Where(line => line.Product.Id == product.Id).Any())
23 | {
24 | var existingLine = lines.Where(line => line.Product.Id == product.Id).FirstOrDefault();
25 | existingLine.Quantity++;
26 |
27 | return await Task.FromResult(existingLine);
28 | }
29 | else
30 | {
31 | var newLine = new ProductCartLineDTO
32 | {
33 | Quantity = 1,
34 | Product = product,
35 | };
36 |
37 | lines.Add(newLine);
38 | return await Task.FromResult(newLine);
39 | }
40 | }
41 |
42 | public async Task> GetCartLinesAsync()
43 | {
44 | // Simulate delay
45 | await Task.Delay(TimeSpan.FromSeconds(1));
46 |
47 | return await Task.FromResult(lines);
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Cart/IProductCartAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 |
4 | namespace TailwindTraders.Mobile.Features.Product.Cart
5 | {
6 | public interface IProductCartAPI
7 | {
8 | Task> GetCartLinesAsync();
9 |
10 | Task AddProductAsync(ProductDTO product);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Cart/ProductCartLineDTO.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace TailwindTraders.Mobile.Features.Product.Cart
6 | {
7 | public class ProductCartLineDTO
8 | {
9 | public int Quantity { get; set; }
10 |
11 | public ProductDTO Product { get; set; }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Cart/ProductCartLineItemTemplate.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product.Cart
2 | {
3 | public partial class ProductCartLineItemTemplate
4 | {
5 | public ProductCartLineItemTemplate()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Cart/ProductCartPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Xamarin.Forms;
3 |
4 | namespace TailwindTraders.Mobile.Features.Product.Cart
5 | {
6 | public partial class ProductCartPage
7 | {
8 | public ProductCartPage()
9 | {
10 | InitializeComponent();
11 |
12 | BindingContext = new ProductCartViewModel();
13 | }
14 |
15 | internal override IEnumerable GetStateAwareVisualElements() => new VisualElement[]
16 | {
17 | stateAwareStackLayout,
18 | emptyLabel,
19 | errorLabel,
20 | };
21 | }
22 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Category/ProductView.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product.Category
2 | {
3 | public partial class ProductView
4 | {
5 | public ProductView()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Category/TwoProductsItemTemplate.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
13 |
17 |
18 |
19 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Category/TwoProductsItemTemplate.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product.Category
2 | {
3 | public partial class TwoProductsItemTemplate
4 | {
5 | public TwoProductsItemTemplate()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Detail/FeatureItemTemplate.xaml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Detail/FeatureItemTemplate.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product.Detail
2 | {
3 | public partial class FeatureItemTemplate
4 | {
5 | public FeatureItemTemplate()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Detail/PictureItemTemplate.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
16 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Detail/PictureItemTemplate.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product.Detail
2 | {
3 | public partial class PictureItemTemplate
4 | {
5 | public PictureItemTemplate()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/Detail/ProductDetailPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Xamarin.Forms;
3 |
4 | namespace TailwindTraders.Mobile.Features.Product.Detail
5 | {
6 | public partial class ProductDetailPage
7 | {
8 | public ProductDetailPage(int productId)
9 | {
10 | InitializeComponent();
11 |
12 | BindingContext = new ProductDetailViewModel(productId);
13 | }
14 |
15 | internal override IEnumerable GetStateAwareVisualElements() => new VisualElement[]
16 | {
17 | refreshButton,
18 | stateAwareStackLayout,
19 | };
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/FakeProducts.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Newtonsoft.Json;
3 | using TailwindTraders.Mobile.Helpers;
4 |
5 | namespace TailwindTraders.Mobile.Features.Product
6 | {
7 | public static class FakeProducts
8 | {
9 | public static IEnumerable Fakes =>
10 | JsonConvert.DeserializeObject>(
11 | EmbeddedResourceHelper.Load("TailwindTraders.Mobile.Features.Product.FakeProducts.json"));
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/FakeProductsAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 | using System.Threading.Tasks;
4 | using Refit;
5 | using TailwindTraders.Mobile.Helpers;
6 |
7 | namespace TailwindTraders.Mobile.Features.Product
8 | {
9 | public class FakeProductsAPI : IProductsAPI
10 | {
11 | public async Task GetDetailAsync([Header("Authorization")] string authorizationHeader, string id) =>
12 | await FakeNetwork.ReturnAsync(FakeProducts.Fakes.FirstOrDefault(product => product.Id.ToString() == id));
13 |
14 | public async Task GetProductsAsync(
15 | [Header("Authorization")] string authorizationHeader,
16 | string type) =>
17 | await FakeNetwork.ReturnAsync(new ProductsPerTypeDTO { Products = FakeProducts.Fakes, });
18 |
19 | public async Task> GetSimilarProductsAsync(
20 | [Header("Authorization")] string authorizationHeader,
21 | [AliasAs("file")] StreamPart stream) => await FakeNetwork.ReturnAsync(FakeProducts.Fakes);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/FakeSimilarProductsAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Refit;
4 |
5 | namespace TailwindTraders.Mobile.Features.Product
6 | {
7 | public class FakeSimilarProductsAPI : ISimilarProductsAPI
8 | {
9 | public Task> GetSimilarProductsAsync(
10 | [Header("Authorization")] string authorizationHeader,
11 | [AliasAs("file")] StreamPart stream)
12 | {
13 | var result = new List();
14 | result.Add(new ProductDTO());
15 |
16 | return Task.FromResult>(result);
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/FeatureDTO.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product
2 | {
3 | public class FeatureDTO
4 | {
5 | public int Id { get; set; }
6 |
7 | public string Title { get; set; }
8 |
9 | public string Description { get; set; }
10 | }
11 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/IProductsAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Refit;
4 | using TailwindTraders.Mobile.Features.Settings;
5 |
6 | namespace TailwindTraders.Mobile.Features.Product
7 | {
8 | public interface IProductsAPI
9 | {
10 | [Get("/products/{id}")]
11 | Task GetDetailAsync(
12 | [Header(DefaultSettings.ApiAuthorizationHeader)] string authorizationHeader, string id);
13 |
14 | [Get("/products")]
15 | Task GetProductsAsync(
16 | [Header(DefaultSettings.ApiAuthorizationHeader)] string authorizationHeader, string type);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/ISimilarProductsAPI.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Refit;
4 | using TailwindTraders.Mobile.Features.Settings;
5 |
6 | namespace TailwindTraders.Mobile.Features.Product
7 | {
8 | public interface ISimilarProductsAPI
9 | {
10 | [Multipart]
11 | [Post("/products/imageclassifier")]
12 | Task> GetSimilarProductsAsync(
13 | [Header(DefaultSettings.ApiAuthorizationHeader)] string authorizationHeader,
14 | [AliasAs("file")] StreamPart stream);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/PopularItemTemplate.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product
2 | {
3 | public partial class PopularItemTemplate
4 | {
5 | public PopularItemTemplate()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/PreviouslySeenItemTemplate.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product
2 | {
3 | public partial class PreviouslySeenItemTemplate
4 | {
5 | public PreviouslySeenItemTemplate()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/ProductDTO.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace TailwindTraders.Mobile.Features.Product
4 | {
5 | public class ProductDTO
6 | {
7 | public int Id { get; set; }
8 |
9 | public string Name { get; set; }
10 |
11 | public float Price { get; set; }
12 |
13 | public string ImageUrl { get; set; }
14 |
15 | public BrandDTO Brand { get; set; }
16 |
17 | public TypeDTO Type { get; set; }
18 |
19 | public IEnumerable Features { get; set; }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/ProductViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Input;
2 |
3 | namespace TailwindTraders.Mobile.Features.Product
4 | {
5 | public class ProductViewModel
6 | {
7 | public ProductViewModel(ProductDTO product, ICommand command)
8 | {
9 | Product = product;
10 | Command = command;
11 | }
12 |
13 | public ProductDTO Product { get; }
14 |
15 | public ICommand Command { get; }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/ProductsPerTypeDTO.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace TailwindTraders.Mobile.Features.Product
4 | {
5 | public class ProductsPerTypeDTO
6 | {
7 | public IEnumerable Products { get; set; }
8 |
9 | public IEnumerable Brands { get; set; }
10 |
11 | public IEnumerable Types { get; set; }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Product/TypeDTO.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Product
2 | {
3 | public class TypeDTO
4 | {
5 | public int Id { get; set; }
6 |
7 | public string Name { get; set; }
8 | }
9 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/AR/DetectionMessage.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Scanning.AR
2 | {
3 | public class DetectionMessage
4 | {
5 | public static DetectionMessage FullScreen { get; } = new DetectionMessage
6 | {
7 | Xmin = 0,
8 | Ymin = 0,
9 | Xmax = 1,
10 | Ymax = 1,
11 | };
12 |
13 | public float Xmin { get; set; }
14 |
15 | public float Ymin { get; set; }
16 |
17 | public float Xmax { get; set; }
18 |
19 | public float Ymax { get; set; }
20 |
21 | public float Score { get; set; }
22 |
23 | public string Label { get; set; }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/AR/InputTensorMessage.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Scanning.AR
2 | {
3 | public class InputTensorMessage
4 | {
5 | public int[] Colors;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/AR/MathHelper.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace TailwindTraders.Mobile.Features.Scanning.AR
4 | {
5 | public static class MathHelper
6 | {
7 | public static T Clamp(this T val, T min, T max)
8 | where T : IComparable
9 | {
10 | if (val.CompareTo(min) < 0)
11 | {
12 | return min;
13 | }
14 | else if (val.CompareTo(max) > 0)
15 | {
16 | return max;
17 | }
18 | else
19 | {
20 | return val;
21 | }
22 | }
23 |
24 | public static bool Between(this T actual, T lower, T upper)
25 | where T : IComparable
26 | {
27 | return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) <= 0;
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/CameraPreview.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using Xamarin.Forms;
4 |
5 | namespace TailwindTraders.Mobile.Features.Scanning
6 | {
7 | public class CameraPreview : View
8 | {
9 | public static readonly BindableProperty EnableTensorflowAnalysisProperty = BindableProperty.Create(
10 | propertyName: nameof(EnableTensorflowAnalysis),
11 | returnType: typeof(bool),
12 | declaringType: typeof(CameraPreview),
13 | defaultValue: false);
14 |
15 | public bool EnableTensorflowAnalysis
16 | {
17 | get => (bool)GetValue(EnableTensorflowAnalysisProperty);
18 | set => SetValue(EnableTensorflowAnalysisProperty, value);
19 | }
20 |
21 | public Func> TakePicture;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/CameraPage.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
2 | {
3 | public partial class CameraPage
4 | {
5 | public CameraPage(string mediaPath)
6 | {
7 | InitializeComponent();
8 |
9 | BindingContext = new CameraViewModel(mediaPath);
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/ExtendedLabel.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
4 | {
5 | public class ExtendedLabel : Label
6 | {
7 | public static readonly BindableProperty ExtendedLineHeightProperty = BindableProperty.Create(
8 | nameof(ExtendedLineHeight),
9 | typeof(double),
10 | typeof(ExtendedLabel),
11 | -1.0d);
12 |
13 | public double ExtendedLineHeight
14 | {
15 | get { return (double)GetValue(ExtendedLineHeightProperty); }
16 | set { SetValue(ExtendedLineHeightProperty, value); }
17 | }
18 |
19 | public static readonly BindableProperty ExtendedMaxLinesProperty = BindableProperty.Create(
20 | nameof(ExtendedMaxLines),
21 | typeof(int),
22 | typeof(ExtendedLabel),
23 | -1);
24 |
25 | public int ExtendedMaxLines
26 | {
27 | get { return (int)GetValue(ExtendedMaxLinesProperty); }
28 | set { SetValue(ExtendedMaxLinesProperty, value); }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/GalleryImageTemplate.xaml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/GalleryImageTemplate.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
2 | {
3 | public partial class GalleryImageTemplate
4 | {
5 | public GalleryImageTemplate()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/GalleryImageViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Input;
2 | using Xamarin.Forms;
3 |
4 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
5 | {
6 | public class GalleryImageViewModel
7 | {
8 | public GalleryImageViewModel(string imageUrl, Command tappedCommand)
9 | {
10 | ImageUrl = imageUrl;
11 | TappedCommand = tappedCommand;
12 | }
13 |
14 | public string ImageUrl { get; }
15 |
16 | public ICommand TappedCommand { get; }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/IGalleryService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 |
4 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
5 | {
6 | public interface IGalleryService
7 | {
8 | Task> GetGalleryPhotosAsync(int photoCount = 10);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/IPlatformService.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
2 | {
3 | public interface IPlatformService
4 | {
5 | void KeyboardClick();
6 |
7 | bool ResizeImage(string filePath, PhotoSize photoSize, int quality);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/IVisionService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using TailwindTraders.Mobile.Features.Product;
4 |
5 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
6 | {
7 | public interface IVisionService
8 | {
9 | Task> GetRecommendedProductsFromPhotoAsync(string photoPath);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/PhotoSize.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
2 | {
3 | public enum PhotoSize
4 | {
5 | Small = 0,
6 | Medium = 1,
7 | Large = 2,
8 | Full = 3,
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/Photo/VisionService.cs:
--------------------------------------------------------------------------------
1 | using Refit;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Threading.Tasks;
5 | using TailwindTraders.Mobile.Features.Common;
6 | using TailwindTraders.Mobile.Features.LogIn;
7 | using TailwindTraders.Mobile.Features.Product;
8 | using TailwindTraders.Mobile.Features.Scanning.Photo;
9 | using Xamarin.Forms;
10 |
11 | [assembly: Dependency(typeof(VisionService))]
12 |
13 | namespace TailwindTraders.Mobile.Features.Scanning.Photo
14 | {
15 | public class VisionService : IVisionService
16 | {
17 | private readonly IAuthenticationService authenticationService;
18 | private readonly IRestPoolService restPoolService;
19 |
20 | public VisionService()
21 | {
22 | authenticationService = DependencyService.Get();
23 | restPoolService = DependencyService.Get();
24 | }
25 |
26 | public async Task> GetRecommendedProductsFromPhotoAsync(string photoPath)
27 | {
28 | using (var photoStream = File.Open(photoPath, FileMode.Open))
29 | {
30 | var streamPart = new StreamPart(photoStream, "photo.jpg", "image/jpeg");
31 |
32 | return await restPoolService.SimilarProductsAPI.GetSimilarProductsAsync(
33 | authenticationService.AuthorizationHeader, streamPart);
34 | }
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Scanning/RecommendedItem.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Scanning
2 | {
3 | public partial class RecommendedItem
4 | {
5 | public RecommendedItem()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Settings/DefaultSettings.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Settings
2 | {
3 | public static class DefaultSettings
4 | {
5 | public const string ApiAuthorizationHeader = "Authorization";
6 |
7 | public static string AccessToken = string.Empty;
8 |
9 | public const string AppCenterAndroidSecret = "__ENTER_YOUR_ANDROID_APPCENTER_SECRET_HERE__";
10 |
11 | public const string AppCenteriOSSecret = "__ENTER_YOUR_IOS_APPCENTER_SECRET_HERE__";
12 |
13 | public const bool UseFakeAPIs = UITestMode || DebugMode;
14 |
15 | public const bool UseFakeAuthentication = UITestMode || DebugMode;
16 |
17 | public const bool ForceAutomaticLogin = !UITestMode && DebugMode;
18 |
19 | public const bool BreakNetworkRandomly = !UITestMode && DebugMode;
20 |
21 | public const bool AndroidDebuggable = DebugMode;
22 |
23 | public const bool UseDebugLogging = UITestMode || DebugMode;
24 |
25 | public const bool EnableARDiagnostics = DebugMode;
26 |
27 | public const bool DebugMode =
28 | #if DEBUG
29 | true;
30 | #else
31 | false;
32 | #endif
33 |
34 | public const bool UITestMode =
35 | #if IS_UI_TEST
36 | true;
37 | #else
38 | false;
39 | #endif
40 |
41 | public static string RootApiUrl { get; set; } = "__ENTER_YOUR_HTTPS_ROOT_API_URL_HERE__";
42 |
43 | public static string RootWebApiUrl
44 | { get; set; } = "__ENTER_YOUR_HTTPS_WEBBFF_ROOT_API_URL_HERE__";
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Settings/SettingsPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Settings/SettingsPage.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Settings
2 | {
3 | public partial class SettingsPage
4 | {
5 | public SettingsPage()
6 | {
7 | InitializeComponent();
8 |
9 | BindingContext = new SettingsViewModel();
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Settings/SettingsViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using TailwindTraders.Mobile.Features.Localization;
3 | using TailwindTraders.Mobile.Framework;
4 | using Xamarin.Forms;
5 |
6 | namespace TailwindTraders.Mobile.Features.Settings
7 | {
8 | public class SettingsViewModel : BaseViewModel
9 | {
10 | private string rootApiUrl;
11 |
12 | public string RootApiUrl
13 | {
14 | get => rootApiUrl;
15 | set => SetAndRaisePropertyChangedIfDifferentValues(ref rootApiUrl, value);
16 | }
17 |
18 | public Command SaveCommand { get; }
19 |
20 | public SettingsViewModel()
21 | {
22 | rootApiUrl = DefaultSettings.RootApiUrl;
23 |
24 | SaveCommand = new Command(Save);
25 | }
26 |
27 | private void Save()
28 | {
29 | if (!Uri.IsWellFormedUriString(RootApiUrl, UriKind.Absolute))
30 | {
31 | XSnackService.ShowMessage(Resources.Snack_Message_InvalidAbsoluteURL);
32 | return;
33 | }
34 |
35 | DefaultSettings.RootApiUrl = rootApiUrl;
36 |
37 | RestPoolService.UpdateApiUrl(rootApiUrl);
38 |
39 | XSnackService.ShowMessage(Resources.Snack_Message_SettingsSaved);
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Shell/FlyoutHeader.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile.Features.Shell
2 | {
3 | public partial class FlyoutHeader
4 | {
5 | public FlyoutHeader()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Shell/TheShell.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using TailwindTraders.Mobile.Features.Product.Category;
4 | using Xamarin.Forms;
5 |
6 | namespace TailwindTraders.Mobile.Features.Shell
7 | {
8 | public partial class TheShell
9 | {
10 | internal static string ProductCategoryRoute = nameof(ProductCategoryRoute);
11 |
12 | public static readonly TimeSpan TimeFlyoutCloses = TimeSpan.FromSeconds(0.5f);
13 |
14 | public TheShell()
15 | {
16 | InitializeComponent();
17 |
18 | BindingContext = new TheShellViewModel();
19 |
20 | Routing.RegisterRoute(ProductCategoryRoute, typeof(ProductCategoryPage));
21 | }
22 |
23 | internal async Task CloseFlyoutAsync()
24 | {
25 | FlyoutIsPresented = false;
26 | await Task.Delay(TimeFlyoutCloses);
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Features/Shell/TheShellViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Input;
2 | using TailwindTraders.Mobile.Features.LogIn;
3 | using TailwindTraders.Mobile.Features.Product.Category;
4 | using TailwindTraders.Mobile.Features.Scanning.AR;
5 | using TailwindTraders.Mobile.Features.Scanning.Photo;
6 | using TailwindTraders.Mobile.Features.Settings;
7 | using TailwindTraders.Mobile.Framework;
8 |
9 | namespace TailwindTraders.Mobile.Features.Shell
10 | {
11 | internal class TheShellViewModel : BaseViewModel
12 | {
13 | public ICommand PhotoCommand => new AsyncCommand(
14 | _ => App.NavigateModallyToAsync(new CameraPreviewTakePhotoPage(), animated: false));
15 |
16 | public ICommand ARCommand => new AsyncCommand(
17 | _ => App.NavigateToAsync(new CameraPreviewPage(), closeFlyout: true));
18 |
19 | public ICommand LogOutCommand => new AsyncCommand(_ => App.NavigateModallyToAsync(new LogInPage()));
20 |
21 | public ICommand ProductTypeCommand => new AsyncCommand(
22 | typeId => App.GoToProductCategoryAsync(typeId as string));
23 |
24 | public ICommand ProfileCommand => FeatureNotAvailableCommand;
25 |
26 | public ICommand SettingsCommand => new AsyncCommand(
27 | _ => App.NavigateToAsync(new SettingsPage(), closeFlyout: true));
28 | }
29 | }
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/FontStyles.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace TailwindTraders.Mobile
2 | {
3 | public partial class FontStyles
4 | {
5 | public FontStyles()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/TailwindTraders.Mobile/TailwindTraders.Mobile/Framework/AsyncCommand.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using Xamarin.Forms;
4 |
5 | namespace TailwindTraders.Mobile.Framework
6 | {
7 | public class AsyncCommand : Command
8 | {
9 | public AsyncCommand(Func