├── .editorconfig ├── .gitattributes ├── .gitconfig ├── .gitignore ├── .gitmodules ├── Avalonia.Essentials.sln ├── CODE_OF_CONDUCT.md ├── Directory.Build.props ├── LICENSE.txt ├── README.md ├── THIRD-PARTY-NOTICES.TXT ├── global.json ├── samples ├── Directory.Build.props ├── Directory.Build.targets ├── Essentials.Sample.Android │ ├── Essentials.Sample.Android.csproj │ ├── Icon.png │ ├── MainActivity.cs │ ├── Properties │ │ └── AndroidManifest.xml │ ├── Resources │ │ ├── drawable │ │ │ └── splash_screen.xml │ │ ├── values-night │ │ │ └── colors.xml │ │ └── values │ │ │ ├── colors.xml │ │ │ └── styles.xml │ └── SplashActivity.cs ├── Essentials.Sample.Desktop │ ├── Essentials.Sample.Desktop.csproj │ ├── Program.cs │ └── app.manifest ├── Essentials.Sample.iOS │ ├── AppDelegate.cs │ ├── Entitlements.plist │ ├── Essentials.Sample.iOS.csproj │ ├── Info.plist │ ├── Main.cs │ └── Resources │ │ └── LaunchScreen.xib ├── Essentials.Sample │ ├── App.xaml │ ├── App.xaml.cs │ ├── Converters │ │ └── NegativeConverter.cs │ ├── Essentials.Sample.csproj │ ├── Helpers │ │ ├── CommonConstants.cs │ │ └── ViewHelpers.cs │ ├── Model │ │ ├── PermissionItem.cs │ │ └── SampleItem.cs │ ├── Resources │ │ ├── AppIcons │ │ │ ├── appicon.svg │ │ │ └── appiconfg.svg │ │ ├── Images │ │ │ ├── app_info_action_icon.png │ │ │ └── battery_action_icon.png │ │ └── Raw │ │ │ └── FileSystemTemplate.txt │ ├── View │ │ ├── AccelerometerPage.xaml │ │ ├── AccelerometerPage.xaml.cs │ │ ├── AllSensorsPage.xaml │ │ ├── AllSensorsPage.xaml.cs │ │ ├── AppInfoPage.xaml │ │ ├── AppInfoPage.xaml.cs │ │ ├── BarometerPage.xaml │ │ ├── BarometerPage.xaml.cs │ │ ├── BasePage.cs │ │ ├── BatteryPage.xaml │ │ ├── BatteryPage.xaml.cs │ │ ├── BrowserPage.xaml │ │ ├── BrowserPage.xaml.cs │ │ ├── ClipboardPage.xaml │ │ ├── ClipboardPage.xaml.cs │ │ ├── ColorConvertersPage.xaml │ │ ├── ColorConvertersPage.xaml.cs │ │ ├── CompassPage.xaml │ │ ├── CompassPage.xaml.cs │ │ ├── ConnectivityPage.xaml │ │ ├── ConnectivityPage.xaml.cs │ │ ├── ContactDetailsPage.xaml │ │ ├── ContactDetailsPage.xaml.cs │ │ ├── ContactsPage.xaml │ │ ├── ContactsPage.xaml.cs │ │ ├── DeviceInfoPage.xaml │ │ ├── DeviceInfoPage.xaml.cs │ │ ├── EmailPage.xaml │ │ ├── EmailPage.xaml.cs │ │ ├── FilePickerPage.xaml │ │ ├── FilePickerPage.xaml.cs │ │ ├── FileSystemPage.xaml │ │ ├── FileSystemPage.xaml.cs │ │ ├── FlashlightPage.xaml │ │ ├── FlashlightPage.xaml.cs │ │ ├── GeocodingPage.xaml │ │ ├── GeocodingPage.xaml.cs │ │ ├── GeolocationPage.xaml │ │ ├── GeolocationPage.xaml.cs │ │ ├── GyroscopePage.xaml │ │ ├── GyroscopePage.xaml.cs │ │ ├── HapticFeedbackPage.xaml │ │ ├── HapticFeedbackPage.xaml.cs │ │ ├── HomePage.xaml │ │ ├── HomePage.xaml.cs │ │ ├── KeepScreenOnPage.xaml │ │ ├── KeepScreenOnPage.xaml.cs │ │ ├── LauncherPage.xaml │ │ ├── LauncherPage.xaml.cs │ │ ├── MagnetometerPage.xaml │ │ ├── MagnetometerPage.xaml.cs │ │ ├── MainWindow.xaml │ │ ├── MainWindow.xaml.cs │ │ ├── MapsPage.xaml │ │ ├── MapsPage.xaml.cs │ │ ├── MediaPickerPage.xaml │ │ ├── MediaPickerPage.xaml.cs │ │ ├── OrientationSensorPage.xaml │ │ ├── OrientationSensorPage.xaml.cs │ │ ├── PermissionsPage.xaml │ │ ├── PermissionsPage.xaml.cs │ │ ├── PhoneDialerPage.xaml │ │ ├── PhoneDialerPage.xaml.cs │ │ ├── PreferencesPage.xaml │ │ ├── PreferencesPage.xaml.cs │ │ ├── SMSPage.xaml │ │ ├── SMSPage.xaml.cs │ │ ├── ScreenshotPage.xaml │ │ ├── ScreenshotPage.xaml.cs │ │ ├── SecureStoragePage.xaml │ │ ├── SecureStoragePage.xaml.cs │ │ ├── SemanticScreenReaderPage.xaml │ │ ├── SemanticScreenReaderPage.xaml.cs │ │ ├── SharePage.xaml │ │ ├── SharePage.xaml.cs │ │ ├── TextToSpeechPage.xaml │ │ ├── TextToSpeechPage.xaml.cs │ │ ├── UnitConvertersPage.xaml │ │ ├── UnitConvertersPage.xaml.cs │ │ ├── VibrationPage.xaml │ │ ├── VibrationPage.xaml.cs │ │ ├── WebAuthenticatorPage.xaml │ │ └── WebAuthenticatorPage.xaml.cs │ └── ViewModel │ │ ├── AccelerometerViewModel.cs │ │ ├── AppInfoViewModel.cs │ │ ├── BarometerViewModel.cs │ │ ├── BaseViewModel.cs │ │ ├── BatteryViewModel.cs │ │ ├── BrowserViewModel.cs │ │ ├── ClipboardViewModel.cs │ │ ├── ColorConvertersViewModel.cs │ │ ├── CompassViewModel.cs │ │ ├── ConnectivityViewModel.cs │ │ ├── ContactDetailsViewModel.cs │ │ ├── ContactsViewModel.cs │ │ ├── DeviceInfoViewModel.cs │ │ ├── EmailViewModel.cs │ │ ├── FilePickerViewModel.cs │ │ ├── FileSystemViewModel.cs │ │ ├── FlashlightViewModel.cs │ │ ├── GeocodingViewModel.cs │ │ ├── GeolocationViewModel.cs │ │ ├── GyroscopeViewModel.cs │ │ ├── HapticFeedbackViewModel.cs │ │ ├── HomeViewModel.cs │ │ ├── KeepScreenOnViewModel.cs │ │ ├── LauncherViewModel.cs │ │ ├── MagnetometerViewModel.cs │ │ ├── MapsViewModel.cs │ │ ├── MediaPickerViewModel.cs │ │ ├── ObservableObject.cs │ │ ├── OrientationSensorViewModel.cs │ │ ├── PermissionsViewModel.cs │ │ ├── PhoneDialerViewModel.cs │ │ ├── PreferencesViewModel.cs │ │ ├── ScreenshotViewModel.cs │ │ ├── SecureStorageViewModel.cs │ │ ├── ShareViewModel.cs │ │ ├── SmsViewModel.cs │ │ ├── TextToSpeechViewModel.cs │ │ ├── UnitConvertersViewModel.cs │ │ ├── VibrationViewModel.cs │ │ └── WebAuthenticatorViewModel.cs └── Sample.Server.WebAuthenticator │ ├── Controllers │ └── MobileAuthController.cs │ ├── Essentials.Sample.Server.WebAuthenticator.csproj │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Startup.cs │ └── appsettings.json ├── src ├── Accelerometer │ ├── Accelerometer.android.cs │ ├── Accelerometer.ios.watchos.cs │ ├── Accelerometer.netstandard.tvos.macos.cs │ ├── Accelerometer.shared.cs │ ├── Accelerometer.tizen.cs │ ├── Accelerometer.uwp.cs │ └── AccelerometerQueue.shared.cs ├── AppActions │ ├── AppActions.android.cs │ ├── AppActions.ios.cs │ ├── AppActions.netstandard.tvos.watchos.macos.tizen.cs │ ├── AppActions.shared.cs │ └── AppActions.uwp.cs ├── AppInfo │ ├── AppInfo.android.cs │ ├── AppInfo.ios.tvos.watchos.macos.cs │ ├── AppInfo.netstandard.cs │ ├── AppInfo.shared.cs │ ├── AppInfo.tizen.cs │ ├── AppInfo.uwp.cs │ ├── AppTheme.shared.cs │ └── LayoutDirection.shared.cs ├── AssemblyInfo │ └── AssemblyInfo.shared.cs ├── Barometer │ ├── Barometer.android.cs │ ├── Barometer.ios.watchos.cs │ ├── Barometer.netstandard.tvos.macos.cs │ ├── Barometer.shared.cs │ ├── Barometer.tizen.cs │ └── Barometer.uwp.cs ├── Battery │ ├── Battery.android.cs │ ├── Battery.ios.watchos.cs │ ├── Battery.macos.cs │ ├── Battery.netstandard.tvos.cs │ ├── Battery.shared.cs │ ├── Battery.tizen.cs │ └── Battery.uwp.cs ├── Browser │ ├── Browser.android.cs │ ├── Browser.ios.cs │ ├── Browser.macos.cs │ ├── Browser.netstandard.tvos.watchos.cs │ ├── Browser.shared.cs │ ├── Browser.tizen.cs │ ├── Browser.uwp.cs │ ├── BrowserLaunchMode.shared.cs │ ├── BrowserLaunchOptions.shared.cs │ └── BrowserTitleMode.shared.cs ├── Clipboard │ ├── Clipboard.android.cs │ ├── Clipboard.ios.cs │ ├── Clipboard.macos.cs │ ├── Clipboard.netstandard.tvos.watchos.tizen.cs │ ├── Clipboard.shared.cs │ └── Clipboard.uwp.cs ├── Compass │ ├── Compass.android.cs │ ├── Compass.ios.cs │ ├── Compass.netstandard.tvos.watchos.macos.cs │ ├── Compass.shared.cs │ ├── Compass.tizen.cs │ ├── Compass.uwp.cs │ └── LowPassFilter.shared.cs ├── Connectivity │ ├── Connectivity.android.cs │ ├── Connectivity.ios.tvos.macos.cs │ ├── Connectivity.ios.tvos.macos.reachability.cs │ ├── Connectivity.netstandard.watchos.cs │ ├── Connectivity.shared.cs │ ├── Connectivity.shared.enums.cs │ ├── Connectivity.tizen.cs │ └── Connectivity.uwp.cs ├── Contacts │ ├── Contacts.android.cs │ ├── Contacts.ios.macos.cs │ ├── Contacts.netstandard.tvos.watchos.cs │ ├── Contacts.shared.cs │ ├── Contacts.tizen.cs │ └── Contacts.uwp.cs ├── DeviceDisplay │ ├── DeviceDisplay.android.cs │ ├── DeviceDisplay.ios.cs │ ├── DeviceDisplay.macos.cs │ ├── DeviceDisplay.netstandard.tvos.watchos.cs │ ├── DeviceDisplay.shared.cs │ ├── DeviceDisplay.tizen.cs │ └── DeviceDisplay.uwp.cs ├── DeviceInfo │ ├── DeviceInfo.android.cs │ ├── DeviceInfo.ios.tvos.watchos.cs │ ├── DeviceInfo.macos.cs │ ├── DeviceInfo.netstandard.cs │ ├── DeviceInfo.shared.cs │ ├── DeviceInfo.tizen.cs │ └── DeviceInfo.uwp.cs ├── Email │ ├── Email.android.cs │ ├── Email.ios.cs │ ├── Email.macos.cs │ ├── Email.netstandard.tvos.watchos.cs │ ├── Email.shared.cs │ ├── Email.tizen.cs │ ├── Email.uwp.cs │ └── EmailHelper.uwp.cs ├── Essentials.csproj ├── FilePicker │ ├── FilePicker.android.cs │ ├── FilePicker.ios.cs │ ├── FilePicker.macos.cs │ ├── FilePicker.netstandard.watchos.tvos.cs │ ├── FilePicker.shared.cs │ ├── FilePicker.tizen.cs │ └── FilePicker.uwp.cs ├── FileSystem │ ├── FileSystem.android.cs │ ├── FileSystem.ios.cs │ ├── FileSystem.ios.tvos.watchos.macos.cs │ ├── FileSystem.netstandard.cs │ ├── FileSystem.shared.cs │ ├── FileSystem.tizen.cs │ ├── FileSystem.uwp.cs │ ├── FileSystemUtils.android.cs │ ├── FileSystemUtils.shared.cs │ └── FileSystemUtils.uwp.cs ├── Flashlight │ ├── Flashlight.android.cs │ ├── Flashlight.ios.cs │ ├── Flashlight.netstandard.tvos.watchos.macos.cs │ ├── Flashlight.shared.cs │ ├── Flashlight.tizen.cs │ └── Flashlight.uwp.cs ├── Geocoding │ ├── Geocoding.android.cs │ ├── Geocoding.ios.tvos.watchos.macos.cs │ ├── Geocoding.netstandard.cs │ ├── Geocoding.shared.cs │ ├── Geocoding.tizen.cs │ └── Geocoding.uwp.cs ├── Geolocation │ ├── Geolocation.android.cs │ ├── Geolocation.ios.macos.cs │ ├── Geolocation.netstandard.tvos.watchos.cs │ ├── Geolocation.shared.cs │ ├── Geolocation.tizen.cs │ ├── Geolocation.uwp.cs │ ├── GeolocationAccuracyExtensionMethods.ios.macos.cs │ ├── GeolocationAccuracyExtensionMethods.uwp.cs │ ├── GeolocationError.shared.cs │ ├── GeolocationListeningFailedEventArgs.shared.cs │ ├── GeolocationListeningRequest.ios.macos.cs │ ├── GeolocationListeningRequest.shared.cs │ ├── GeolocationListeningRequest.uwp.cs │ ├── GeolocationLocationChangedEventArgs.shared.cs │ ├── GeolocationRequest.ios.macos.cs │ ├── GeolocationRequest.shared.cs │ └── GeolocationRequest.uwp.cs ├── GlobalSuppressions.shared.cs ├── Graphics │ ├── Color.cs │ └── Rect.cs ├── Gyroscope │ ├── Gyroscope.android.cs │ ├── Gyroscope.ios.watchos.cs │ ├── Gyroscope.netstandard.tvos.macos.cs │ ├── Gyroscope.shared.cs │ ├── Gyroscope.tizen.cs │ └── Gyroscope.uwp.cs ├── HapticFeedback │ ├── HapticFeedback.android.cs │ ├── HapticFeedback.ios.cs │ ├── HapticFeedback.macos.cs │ ├── HapticFeedback.netstandard.tvos.watchos.cs │ ├── HapticFeedback.shared.cs │ ├── HapticFeedback.tizen.cs │ ├── HapticFeedback.uwp.cs │ └── HapticFeedbackType.shared.cs ├── Launcher │ ├── Launcher.android.cs │ ├── Launcher.ios.tvos.cs │ ├── Launcher.macos.cs │ ├── Launcher.netstandard.watchos.cs │ ├── Launcher.shared.cs │ ├── Launcher.tizen.cs │ └── Launcher.uwp.cs ├── Magnetometer │ ├── Magnetometer.android.cs │ ├── Magnetometer.ios.watchos.cs │ ├── Magnetometer.netstandard.tvos.macos.cs │ ├── Magnetometer.shared.cs │ ├── Magnetometer.tizen.cs │ └── Magnetometer.uwp.cs ├── MainThread │ ├── MainThread.android.cs │ ├── MainThread.ios.tvos.watchos.macos.cs │ ├── MainThread.netstandard.cs │ ├── MainThread.shared.cs │ ├── MainThread.tizen.cs │ └── MainThread.uwp.cs ├── Map │ ├── Map.android.cs │ ├── Map.ios.watchos.macos.cs │ ├── Map.netstandard.tvos.cs │ ├── Map.shared.cs │ ├── Map.tizen.cs │ ├── Map.uwp.cs │ ├── MapLaunchOptions.shared.cs │ └── NavigationMode.shared.cs ├── MediaPicker │ ├── MediaPicker.android.cs │ ├── MediaPicker.ios.cs │ ├── MediaPicker.macos.cs │ ├── MediaPicker.netstandard.watchos.tvos.cs │ ├── MediaPicker.shared.cs │ ├── MediaPicker.tizen.cs │ └── MediaPicker.uwp.cs ├── OperatingSystemEx.cs ├── OrientationSensor │ ├── OrientationSensor.android.cs │ ├── OrientationSensor.ios.watchos.cs │ ├── OrientationSensor.netstandard.tvos.macos.cs │ ├── OrientationSensor.shared.cs │ ├── OrientationSensor.tizen.cs │ └── OrientationSensor.uwp.cs ├── Permissions │ ├── Permissions.android.cs │ ├── Permissions.ios.cs │ ├── Permissions.ios.tvos.macos.cs │ ├── Permissions.ios.tvos.watchos.cs │ ├── Permissions.ios.watchos.cs │ ├── Permissions.macos.cs │ ├── Permissions.netstandard.cs │ ├── Permissions.shared.cs │ ├── Permissions.shared.enums.cs │ ├── Permissions.tizen.cs │ └── Permissions.uwp.cs ├── PhoneDialer │ ├── PhoneDialer.android.cs │ ├── PhoneDialer.ios.cs │ ├── PhoneDialer.macos.cs │ ├── PhoneDialer.netstandard.tvos.watchos.cs │ ├── PhoneDialer.shared.cs │ ├── PhoneDialer.tizen.cs │ └── PhoneDialer.uwp.cs ├── Platform │ ├── ActiveWindowTracker.uwp.cs │ ├── ActivityStateManager.android.cs │ ├── IntermediateActivity.android.cs │ ├── Platform.shared.cs │ ├── PlatformMethods.uwp.cs │ ├── PlatformUtils.android.cs │ ├── PlatformUtils.ios.tvos.watchos.cs │ ├── PlatformUtils.macos.cs │ ├── PlatformUtils.tizen.cs │ ├── PlatformUtils.uwp.cs │ ├── UIPresentationControllerDelegate.ios.cs │ ├── WindowMessageEventArgs.uwp.cs │ ├── WindowMessageManager.uwp.cs │ ├── WindowStateManager.ios.cs │ └── WindowStateManager.uwp.cs ├── Preferences │ ├── Preferences.android.cs │ ├── Preferences.ios.tvos.watchos.macos.cs │ ├── Preferences.netstandard.cs │ ├── Preferences.shared.cs │ ├── Preferences.tizen.cs │ └── Preferences.uwp.cs ├── Properties │ └── AssemblyInfo.shared.cs ├── PublicAPI │ ├── net-android │ │ ├── PublicAPI.Shipped.txt │ │ └── PublicAPI.Unshipped.txt │ ├── net-ios │ │ ├── PublicAPI.Shipped.txt │ │ └── PublicAPI.Unshipped.txt │ ├── net-maccatalyst │ │ ├── PublicAPI.Shipped.txt │ │ └── PublicAPI.Unshipped.txt │ ├── net-tizen │ │ ├── PublicAPI.Shipped.txt │ │ └── PublicAPI.Unshipped.txt │ ├── net-windows │ │ ├── PublicAPI.Shipped.txt │ │ └── PublicAPI.Unshipped.txt │ ├── net │ │ ├── PublicAPI.Shipped.txt │ │ └── PublicAPI.Unshipped.txt │ └── netstandard │ │ ├── PublicAPI.Shipped.txt │ │ └── PublicAPI.Unshipped.txt ├── Resources │ └── xml │ │ └── microsoft_maui_essentials_fileprovider_file_paths.xml ├── Screenshot │ ├── Screenshot.android.cs │ ├── Screenshot.ios.cs │ ├── Screenshot.netstandard.watchos.macos.cs │ ├── Screenshot.shared.cs │ ├── Screenshot.tizen.cs │ ├── Screenshot.tvos.cs │ └── Screenshot.uwp.cs ├── SecureStorage │ ├── SecureStorage.android.cs │ ├── SecureStorage.ios.tvos.watchos.macos.cs │ ├── SecureStorage.netstandard.cs │ ├── SecureStorage.shared.cs │ ├── SecureStorage.tizen.cs │ └── SecureStorage.uwp.cs ├── SemanticScreenReader │ ├── SemanticScreenReader.android.cs │ ├── SemanticScreenReader.ios.cs │ ├── SemanticScreenReader.netstandard.tvos.watchos.macos.cs │ ├── SemanticScreenReader.shared.cs │ ├── SemanticScreenReader.tizen.cs │ └── SemanticScreenReader.uwp.cs ├── Share │ ├── Share.android.cs │ ├── Share.ios.cs │ ├── Share.macos.cs │ ├── Share.netstandard.tvos.watchos.cs │ ├── Share.shared.cs │ ├── Share.tizen.cs │ └── Share.uwp.cs ├── Sms │ ├── Sms.android.cs │ ├── Sms.ios.cs │ ├── Sms.macos.cs │ ├── Sms.netstandard.tvos.watchos.cs │ ├── Sms.shared.cs │ ├── Sms.tizen.cs │ └── Sms.uwp.cs ├── TextToSpeech │ ├── TextToSpeech.android.cs │ ├── TextToSpeech.ios.tvos.watchos.cs │ ├── TextToSpeech.macos.cs │ ├── TextToSpeech.netstandard.cs │ ├── TextToSpeech.shared.cs │ ├── TextToSpeech.tizen.cs │ └── TextToSpeech.uwp.cs ├── Types │ ├── Contact.shared.cs │ ├── DeviceIdiom.shared.cs │ ├── DevicePlatform.shared.cs │ ├── DisplayInfo.shared.cs │ ├── DisplayOrientation.shared.cs │ ├── DisplayRotation.shared.cs │ ├── FileProvider.android.cs │ ├── Location.shared.cs │ ├── LocationExtensions.android.cs │ ├── LocationExtensions.ios.tvos.watchos.macos.cs │ ├── LocationExtensions.shared.cs │ ├── LocationExtensions.uwp.cs │ ├── Placemark.shared.cs │ ├── PlacemarkExtensions.android.cs │ ├── PlacemarkExtensions.ios.tvos.watchos.macos.cs │ ├── PlacemarkExtensions.shared.cs │ ├── PlacemarkExtensions.uwp.cs │ ├── SensorSpeed.android.cs │ ├── SensorSpeed.ios.tvos.watchos.cs │ ├── SensorSpeed.shared.cs │ ├── SensorSpeed.tizen.cs │ ├── SensorSpeed.uwp.cs │ └── Shared │ │ ├── Exceptions.shared.cs │ │ ├── Utils.shared.cs │ │ └── WebUtils.shared.cs ├── UnitConverters │ └── UnitConverters.shared.cs ├── VersionTracking │ └── VersionTracking.shared.cs ├── Vibration │ ├── Vibration.android.cs │ ├── Vibration.ios.cs │ ├── Vibration.netstandard.tvos.watchos.macos.cs │ ├── Vibration.shared.cs │ ├── Vibration.tizen.cs │ └── Vibration.uwp.cs ├── WebAuthenticator │ ├── AppleSignInAuthenticator.ios.cs │ ├── AppleSignInAuthenticator.netstandard.android.tvos.watchos.uwp.tizen.macos.cs │ ├── AppleSignInAuthenticator.shared.cs │ ├── WebAuthenticator.android.cs │ ├── WebAuthenticator.ios.tvos.cs │ ├── WebAuthenticator.macos.cs │ ├── WebAuthenticator.netstandard.watchos.tizen.cs │ ├── WebAuthenticator.shared.cs │ ├── WebAuthenticator.uwp.cs │ ├── WebAuthenticatorCallbackActivity.android.cs │ ├── WebAuthenticatorIntermediateActivity.android.cs │ └── WebAuthenticatorResult.shared.cs └── WinRTEmbed.props └── test ├── DeviceTests ├── Directory.Build.targets ├── Essentials.DeviceTests.csproj ├── Platforms │ ├── Android │ │ ├── AndroidManifest.xml │ │ └── environment.txt │ ├── MacCatalyst │ │ └── Info.plist │ ├── Windows │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── Package.appxmanifest │ │ └── app.manifest │ └── iOS │ │ ├── Entitlements.plist │ │ └── Info.plist ├── Properties │ └── launchSettings.json ├── Resources │ ├── Raw │ │ ├── AppBundleFile.txt │ │ ├── AppBundleFile_NoExtension │ │ └── Folder │ │ │ └── AppBundleFile_Nested.txt │ ├── appicon.svg │ └── appiconfg.svg ├── Startup.cs ├── Tests │ ├── Accelerometer_Tests.cs │ ├── Android │ │ └── FileProvider_Tests.cs │ ├── AppActions_Tests.cs │ ├── AppInfo_Tests.cs │ ├── Barometer_Shared.cs │ ├── Battery_Tests.cs │ ├── Clipboard_Tests.cs │ ├── Compass_Tests.cs │ ├── Connectivity_Tests.cs │ ├── Contacts_Tests.cs │ ├── DeviceDisplay_Tests.cs │ ├── DeviceInfo_Tests.cs │ ├── Email_Tests.cs │ ├── FileSystem_Tests.cs │ ├── Flashlight_Tests.cs │ ├── Geocoding_Tests.cs │ ├── Geolocation_Tests.cs │ ├── Gyroscope_Tests.cs │ ├── HapticFeedback_Tests.cs │ ├── HardwareSupport.cs │ ├── Launcher_Tests.cs │ ├── Magnetometer_Tests.cs │ ├── MainThread_Tests.cs │ ├── Maps_Tests.cs │ ├── Permissions_Tests.cs │ ├── PhoneDialer_Tests.cs │ ├── Preferences_Tests.cs │ ├── Screenshot_Tests.cs │ ├── SecureStorage_Tests.cs │ ├── Share_Tests.cs │ ├── VersionTracking_Tests.cs │ ├── Vibration_Tests.cs │ ├── WebAuthenticator_Tests.cs │ ├── WindowStateManager_Tests.cs │ └── Windows │ │ ├── ActiveWindowTracker_Tests.cs │ │ ├── BaseWindowMessageManager_Tests.cs │ │ ├── DeviceDisplay_Windows_Tests.cs │ │ └── WindowMessageManager_Tests.cs ├── Traits.cs └── Utils.cs └── UnitTests ├── Accelerometer_Tests.cs ├── AppActions_Tests.cs ├── Barometer_Tests.cs ├── Battery_Tests.cs ├── Browser_Tests.cs ├── Clipboard_Tests.cs ├── Compass_Tests.cs ├── Connectivity_Tests.cs ├── Contacts_Tests.cs ├── DeviceDisplay_Tests.cs ├── Email_Tests.cs ├── Essentials.UnitTests.csproj ├── FilePicker_Tests.cs ├── FileSystem_Tests.cs ├── Geocoding_Tests.cs ├── Gyroscope_Tests.cs ├── Launcher_Tests.cs ├── Magnetometer_Tests.cs ├── Maps_Tests.cs ├── OrientationSensor_Tests.cs ├── PhoneDialer_Tests.cs ├── Preferences_Tests.cs ├── SecureStorage_Tests.cs ├── Share_Tests.cs ├── Sms_Tests.cs ├── TextToSpeech_Tests.cs ├── UnitConverters_Tests.cs ├── Utils.cs └── Utils_Tests.cs /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set default behaviour, in case users don't have core.autocrlf set. 2 | * text=auto 3 | 4 | # Explicitly declare text files we want to always be normalized and converted 5 | # to native line endings on checkout. 6 | *.cs text 7 | 8 | # Declare files that will always have CRLF line endings on checkout. 9 | *.sln text eol=crlf 10 | 11 | # Denote all files that are truly binary and should not be modified. 12 | *.png binary 13 | *.jpg binary 14 | *.jpeg binary 15 | 16 | # Always checkout docs using unix line endings because mdoc uses unix line endings even on windows 17 | /docs/**/*.xml text eol=lf 18 | 19 | # avoid overriding GitInfo.txt on merge 20 | GitInfo.txt merge=ours 21 | -------------------------------------------------------------------------------- /.gitconfig: -------------------------------------------------------------------------------- 1 | [merge "ours"] 2 | driver = true 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "submodules/Avalonia.Labs"] 2 | path = submodules/Avalonia.Labs 3 | url = https://github.com/AvaloniaUI/Avalonia.Labs.git 4 | -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | <_MauiDotNetTfm>net6.0 4 | 11 5 | 6 | 7 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) .NET Foundation and Contributors 4 | 5 | All rights reserved. 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This repository is archived. 2 | The only reason for Avalonia.Essentials was to enable Maui.Essential working with any non-MAUI project. 3 | But starting with .NET 8 Maui.Essentials can be used detached from the Maui, which is handy with Avalonia. 4 | 5 | Alternatively, you can still integrate full Maui, if you wish, with [Avalonia.Maui](https://github.com/AvaloniaUI/AvaloniaMauiHybrid)https://github.com/AvaloniaUI/AvaloniaMauiHybrid hybrid project. 6 | 7 | Keep in mind, Maui.Essentials still has a limited set of supported platforms. For example, it doesn't support Browser, Linux, macOS (only macCatalyst). But it still is really useful with mobile. 8 | 9 | If you just need to call platform APIs, but don't want to use Essentials, please visit our documentation: 10 | https://docs.avaloniaui.net/docs/guides/platforms/platform-specific-code/dotnet 11 | -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "6.0.0", 4 | "rollForward": "latestMajor", 5 | "allowPrerelease": true 6 | } 7 | } -------------------------------------------------------------------------------- /samples/Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | true 5 | 11.0.0-preview8 6 | 7 | 8 | -------------------------------------------------------------------------------- /samples/Directory.Build.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Android/Essentials.Sample.Android.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Exe 4 | net7.0-android 5 | 21 6 | enable 7 | com.CompanyName.Essentials.Sample 8 | 1 9 | 1.0 10 | apk 11 | False 12 | 13 | 14 | 15 | 16 | Resources\drawable\Icon.png 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Android/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AvaloniaUI/Avalonia.Essentials/3cf7aa3445725c84a70a3e7c8c5f0ee2d0292922/samples/Essentials.Sample.Android/Icon.png -------------------------------------------------------------------------------- /samples/Essentials.Sample.Android/Resources/drawable/splash_screen.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Android/Resources/values-night/colors.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | #212121 4 | 5 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Android/Resources/values/colors.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | #FFFFFF 4 | 5 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Android/Resources/values/styles.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 6 | 7 | 11 | 12 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Android/SplashActivity.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Content; 3 | using Android.OS; 4 | using Application = Android.App.Application; 5 | using Avalonia; 6 | using Avalonia.Android; 7 | using Samples; 8 | 9 | namespace Essentials.Sample.Android; 10 | 11 | [Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)] 12 | public class SplashActivity : AvaloniaSplashActivity 13 | { 14 | protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) 15 | { 16 | return base.CustomizeAppBuilder(builder) 17 | .WithInterFont(); 18 | } 19 | 20 | protected override void OnCreate(Bundle? savedInstanceState) 21 | { 22 | base.OnCreate(savedInstanceState); 23 | } 24 | 25 | protected override void OnResume() 26 | { 27 | base.OnResume(); 28 | 29 | StartActivity(new Intent(Application.Context, typeof(MainActivity))); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Desktop/Essentials.Sample.Desktop.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | WinExe 4 | net6.0 5 | enable 6 | 7 | 8 | 9 | app.manifest 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Desktop/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Avalonia; 3 | using Samples; 4 | 5 | namespace HotReloadTest.Desktop; 6 | 7 | class Program 8 | { 9 | // Initialization code. Don't use any Avalonia, third-party APIs or any 10 | // SynchronizationContext-reliant code before AppMain is called: things aren't initialized 11 | // yet and stuff might break. 12 | [STAThread] 13 | public static void Main(string[] args) => BuildAvaloniaApp() 14 | .StartWithClassicDesktopLifetime(args); 15 | 16 | // Avalonia configuration, don't remove; also used by visual designer. 17 | public static AppBuilder BuildAvaloniaApp() 18 | => AppBuilder.Configure() 19 | .UsePlatformDetect() 20 | .WithInterFont() 21 | .LogToTrace(); 22 | } 23 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.Desktop/app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using Foundation; 2 | using Avalonia; 3 | using Avalonia.iOS; 4 | using Microsoft.Maui.ApplicationModel; 5 | using Samples; 6 | 7 | namespace Essentials.Sample.iOS; 8 | 9 | // The UIApplicationDelegate for the application. This class is responsible for launching the 10 | // User Interface of the application, as well as listening (and optionally responding) to 11 | // application events from iOS. 12 | [Register("AppDelegate")] 13 | public partial class AppDelegate : AvaloniaAppDelegate 14 | { 15 | protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) 16 | { 17 | return base.CustomizeAppBuilder(builder) 18 | .AfterSetup(_ => Platform.Init(() => Window.RootViewController!)) 19 | .WithInterFont(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.iOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | keychain-access-groups 6 | 7 | $(AppIdentifierPrefix)$(CFBundleIdentifier) 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.iOS/Essentials.Sample.iOS.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | Exe 4 | net7.0-ios 5 | 10.0 6 | manual 7 | enable 8 | iossimulator-x64 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /samples/Essentials.Sample.iOS/Main.cs: -------------------------------------------------------------------------------- 1 | using UIKit; 2 | 3 | namespace Essentials.Sample.iOS; 4 | 5 | public class Application 6 | { 7 | // This is the main entry point of the application. 8 | 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, typeof(AppDelegate)); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/App.xaml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia; 2 | using Avalonia.Controls.ApplicationLifetimes; 3 | using Avalonia.Markup.Xaml; 4 | using Avalonia.Threading; 5 | using Microsoft.Maui.ApplicationModel; 6 | using Samples.View; 7 | 8 | namespace Samples 9 | { 10 | public partial class App : Application 11 | { 12 | private static HomePage _host; 13 | 14 | public App() 15 | { 16 | AvaloniaXamlLoader.Load(this); 17 | } 18 | 19 | public override void OnFrameworkInitializationCompleted() 20 | { 21 | _host = new HomePage(); 22 | 23 | if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) 24 | { 25 | desktop.MainWindow = new MainWindow 26 | { 27 | Content = _host 28 | }; 29 | } 30 | else if (ApplicationLifetime is ISingleViewApplicationLifetime singleView) 31 | { 32 | singleView.MainView = _host; 33 | } 34 | 35 | base.OnFrameworkInitializationCompleted(); 36 | } 37 | 38 | public static void HandleAppActions(AppAction appAction) 39 | { 40 | Dispatcher.UIThread.Invoke(() => 41 | { 42 | var page = appAction.Id switch 43 | { 44 | "battery_info" => typeof(BatteryPage), 45 | "app_info" => typeof(AppInfoPage), 46 | _ => null 47 | }; 48 | 49 | if (page != null) 50 | { 51 | _host?.Navigate(page); 52 | } 53 | }); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/Converters/NegativeConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using Avalonia.Data.Converters; 4 | 5 | namespace Samples.Converters 6 | { 7 | public class NegativeConverter : IValueConverter 8 | { 9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | if (value is bool v) 12 | return !v; 13 | else 14 | return false; 15 | } 16 | 17 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 18 | { 19 | if (value is bool v) 20 | return !v; 21 | else 22 | return true; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/Essentials.Sample.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | false 6 | $(NoWarn),CA1416 7 | true 8 | Essentials.Sample 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/Helpers/CommonConstants.cs: -------------------------------------------------------------------------------- 1 | namespace Samples.Helpers 2 | { 3 | public static class CommonConstants 4 | { 5 | internal const string AppCenterAndroid = "AC_ANDROID"; 6 | internal const string AppCenteriOS = "AC_IOS"; 7 | internal const string AppCenterUWP = "AC_UWP"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/Helpers/ViewHelpers.cs: -------------------------------------------------------------------------------- 1 | 2 | using Avalonia; 3 | using Avalonia.VisualTree; 4 | 5 | namespace Samples.Helpers 6 | { 7 | public static class ViewHelpers 8 | { 9 | public static Microsoft.Maui.Essentials.Rect GetAbsoluteBounds(this Visual element) 10 | { 11 | var bounds = element.GetTransformedBounds().Value; 12 | var avRect = new Rect(bounds.Transform.Transform(bounds.Bounds.Position), bounds.Bounds.Size); 13 | return new Microsoft.Maui.Essentials.Rect(avRect.X, avRect.Y, avRect.Width, avRect.Height); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/Model/SampleItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Samples.Model 4 | { 5 | public class SampleItem 6 | { 7 | public SampleItem(string icon, string name, Type pageType, string description, params string[] tags) 8 | { 9 | Icon = icon; 10 | Name = name; 11 | Description = description; 12 | PageType = pageType; 13 | Tags = tags ?? new string[0]; 14 | } 15 | 16 | public string Icon { get; } 17 | 18 | public string Name { get; } 19 | 20 | public string Description { get; } 21 | 22 | public Type PageType { get; } 23 | 24 | public string[] Tags { get; } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/Resources/AppIcons/appicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/Resources/Images/app_info_action_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AvaloniaUI/Avalonia.Essentials/3cf7aa3445725c84a70a3e7c8c5f0ee2d0292922/samples/Essentials.Sample/Resources/Images/app_info_action_icon.png -------------------------------------------------------------------------------- /samples/Essentials.Sample/Resources/Images/battery_action_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AvaloniaUI/Avalonia.Essentials/3cf7aa3445725c84a70a3e7c8c5f0ee2d0292922/samples/Essentials.Sample/Resources/Images/battery_action_icon.png -------------------------------------------------------------------------------- /samples/Essentials.Sample/Resources/Raw/FileSystemTemplate.txt: -------------------------------------------------------------------------------- 1 | This file was loaded from the app package. 2 | 3 | You can use this as a starting point for your comments... 4 | 5 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/View/AccelerometerPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Samples.View 2 | { 3 | public partial class AccelerometerPage : BasePage 4 | { 5 | public AccelerometerPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/View/AllSensorsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Samples.View 2 | { 3 | public partial class AllSensorsPage : BasePage 4 | { 5 | public AllSensorsPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | 10 | protected override void OnLoaded() 11 | { 12 | base.OnLoaded(); 13 | 14 | SetupBinding(GridAccelerometer.DataContext); 15 | SetupBinding(GridCompass.DataContext); 16 | SetupBinding(GridGyro.DataContext); 17 | SetupBinding(GridMagnetometer.DataContext); 18 | SetupBinding(GridOrientation.DataContext); 19 | SetupBinding(GridBarometer.DataContext); 20 | } 21 | 22 | protected override void OnUnloaded() 23 | { 24 | TearDownBinding(GridAccelerometer.DataContext); 25 | TearDownBinding(GridCompass.DataContext); 26 | TearDownBinding(GridGyro.DataContext); 27 | TearDownBinding(GridMagnetometer.DataContext); 28 | TearDownBinding(GridOrientation.DataContext); 29 | TearDownBinding(GridBarometer.DataContext); 30 | 31 | base.OnUnloaded(); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/View/AppInfoPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Samples.View 2 | { 3 | public partial class AppInfoPage : BasePage 4 | { 5 | public AppInfoPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/View/BarometerPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Samples.View 2 | { 3 | public partial class BarometerPage : BasePage 4 | { 5 | public BarometerPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/View/BatteryPage.xaml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/View/BatteryPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Samples.View 2 | { 3 | public partial class BatteryPage : BasePage 4 | { 5 | public BatteryPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/View/BrowserPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Samples.View 2 | { 3 | public partial class BrowserPage : BasePage 4 | { 5 | public BrowserPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Essentials.Sample/View/ClipboardPage.xaml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |