├── .editorconfig ├── .gitattributes ├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yml └── workflows │ └── build.yml ├── .gitignore ├── .vscode └── settings.json ├── Build.slnf ├── LICENSE.md ├── Shiny.sln ├── art ├── color_wheel.png ├── gonemobile.jpg ├── logo.ai ├── logo.mp4 ├── logo.pdf ├── logo.png ├── logo.svg ├── logo_black_bg.png ├── logo_white_bg.png ├── nuget.png └── shiny-logo-text.ai ├── build.ps1 ├── build.sh ├── build ├── BuildContext.cs ├── Constants.cs ├── Extensions.cs ├── Program.cs ├── Properties │ └── launchSettings.json ├── ShinyBuild.csproj └── Tasks │ ├── DefaultTask.cs │ └── Library │ ├── BuildTask.cs │ ├── CopyArtifactsTask.cs │ ├── GitHubReleaseTask.cs │ ├── NugetDeployTask.cs │ └── ReleaseAnnouncementTask.cs ├── nuget.config ├── readme.md ├── samples ├── Directory.build.props ├── Sample.Api │ ├── Controllers │ │ └── TransfersController.cs │ ├── GlobalUsings.cs │ ├── JsonModelBinder.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── Sample.Api.csproj │ ├── appsettings.Development.json │ └── appsettings.json ├── Sample.Maui │ ├── App.xaml │ ├── App.xaml.cs │ ├── Beacons │ │ ├── BeaconViewModel.cs │ │ ├── CreatePage.xaml │ │ ├── CreatePage.xaml.cs │ │ ├── CreateViewModel.cs │ │ ├── ManagedRangingPage.xaml │ │ ├── ManagedRangingPage.xaml.cs │ │ ├── ManagedRangingViewModel.cs │ │ ├── MonitoringPage.xaml │ │ ├── MonitoringPage.xaml.cs │ │ ├── MonitoringViewModel.cs │ │ ├── MyBeaconMonitorDelegate.cs │ │ ├── RangingPage.xaml │ │ ├── RangingPage.xaml.cs │ │ └── RangingViewModel.cs │ ├── BleClient │ │ ├── CharacteristicPage.xaml │ │ ├── CharacteristicPage.xaml.cs │ │ ├── CharacteristicViewModel.cs │ │ ├── MyBleDelegate.cs │ │ ├── PeripheralItemViewModel.cs │ │ ├── PeripheralPage.xaml │ │ ├── PeripheralPage.xaml.cs │ │ ├── PeripheralViewModel.cs │ │ ├── ScanPage.xaml │ │ ├── ScanPage.xaml.cs │ │ ├── ScanViewModel.cs │ │ ├── ServicePage.xaml │ │ ├── ServicePage.xaml.cs │ │ └── ServiceViewModel.cs │ ├── BleHosting │ │ ├── BeaconAdvertisePage.xaml │ │ ├── BeaconAdvertisePage.xaml.cs │ │ ├── BeaconAdvertiseViewModel.cs │ │ ├── Constants.cs │ │ ├── MainPage.xaml │ │ ├── MainPage.xaml.cs │ │ ├── MainViewModel.cs │ │ ├── ManagedPage.xaml │ │ ├── ManagedPage.xaml.cs │ │ ├── ManagedViewModel.cs │ │ └── MyManagedCharacteristics.cs │ ├── BleManaged │ │ ├── ManagedScanPage.xaml │ │ ├── ManagedScanPage.xaml.cs │ │ └── ManagedScanViewModel.cs │ ├── CommandExceptionHandler.cs │ ├── CurrentPermissionPage.xaml │ ├── CurrentPermissionPage.xaml.cs │ ├── CurrentPermissionViewModel.cs │ ├── Dev │ │ ├── AppDataPage.xaml │ │ ├── AppDataPage.xaml.cs │ │ ├── AppDataViewModel.cs │ │ ├── BleHostUnitTestsPage.cs │ │ ├── BleHostUnitTestsViewModel.cs │ │ ├── FileViewPage.xaml │ │ ├── FileViewPage.xaml.cs │ │ ├── FileViewViewModel.cs │ │ ├── HttpTransfersPage.xaml │ │ ├── HttpTransfersPage.xaml.cs │ │ ├── HttpTransfersViewModel.cs │ │ ├── LoggerPage.xaml │ │ ├── LoggerPage.xaml.cs │ │ ├── LoggerViewModel.cs │ │ ├── PlatformStateTests.cs │ │ ├── SupportServicePage.xaml │ │ ├── SupportServicePage.xaml.cs │ │ ├── SupportServiceViewModel.cs │ │ └── UnitTestBleCharacteristic.cs │ ├── ErrorLoggingPage.xaml │ ├── ErrorLoggingPage.xaml.cs │ ├── ErrorLoggingViewModel.cs │ ├── FodyWeavers.xml │ ├── FodyWeavers.xsd │ ├── Geofencing │ │ ├── CreatePage.xaml │ │ ├── CreatePage.xaml.cs │ │ ├── CreateViewModel.cs │ │ ├── GeofenceRegionViewModel.cs │ │ ├── ListPage.xaml │ │ ├── ListPage.xaml.cs │ │ ├── ListViewModel.cs │ │ └── MyGeofenceDelegate.cs │ ├── GlobalUsings.cs │ ├── Gps │ │ ├── GpsPage.xaml │ │ ├── GpsPage.xaml.cs │ │ ├── GpsViewModel.cs │ │ └── MyGpsDelegate.cs │ ├── HttpTransfers │ │ ├── CreatePage.xaml │ │ ├── CreatePage.xaml.cs │ │ ├── CreateViewModel.cs │ │ ├── MyHttpTransferDelegate.cs │ │ ├── PendingPage.xaml │ │ ├── PendingPage.xaml.cs │ │ └── PendingViewModel.cs │ ├── Infrastructure │ │ ├── CommandItem.cs │ │ ├── Extensions.cs │ │ ├── InvertedBooleanConverter.cs │ │ ├── SampleSqlConnection.cs │ │ └── ViewModel.cs │ ├── Jobs │ │ ├── CreatePage.xaml │ │ ├── CreatePage.xaml.cs │ │ ├── CreateViewModel.cs │ │ ├── JobLoggerTask.cs │ │ ├── ListPage.xaml │ │ ├── ListPage.xaml.cs │ │ ├── ListViewModel.cs │ │ └── SampleJob.cs │ ├── LogsPage.xaml │ ├── LogsPage.xaml.cs │ ├── LogsViewModel.cs │ ├── MainPage.xaml │ ├── MainPage.xaml.cs │ ├── MainViewModel.cs │ ├── MauiProgram.cs │ ├── Notifications │ │ ├── Channels │ │ │ ├── ActionViewModel.cs │ │ │ ├── ChannelCreatePage.xaml │ │ │ ├── ChannelCreatePage.xaml.cs │ │ │ ├── ChannelCreateViewModel.cs │ │ │ ├── ChannelListPage.xaml │ │ │ ├── ChannelListPage.xaml.cs │ │ │ └── ChannelListViewModel.cs │ │ ├── Create │ │ │ ├── CreatePage.xaml │ │ │ ├── CreatePage.xaml.cs │ │ │ ├── CreateViewModel.cs │ │ │ ├── IntervalPage.xaml │ │ │ ├── IntervalPage.xaml.cs │ │ │ ├── IntervalViewModel.cs │ │ │ ├── LocationPage.xaml │ │ │ ├── LocationPage.xaml.cs │ │ │ ├── LocationViewModel.cs │ │ │ ├── SchedulePage.xaml │ │ │ ├── SchedulePage.xaml.cs │ │ │ ├── ScheduleViewModel.cs │ │ │ └── State.cs │ │ ├── MyNotificationDelegate.cs │ │ ├── OtherPage.xaml │ │ ├── OtherPage.xaml.cs │ │ ├── OtherViewModel.cs │ │ ├── PendingPage.xaml │ │ ├── PendingPage.xaml.cs │ │ └── PendingViewModel.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── AndroidManifest.xml │ │ │ ├── MainActivity.cs │ │ │ ├── MainApplication.cs │ │ │ └── Resources │ │ │ │ ├── values │ │ │ │ └── colors.xml │ │ │ │ └── xml │ │ │ │ └── network_security_config.xml │ │ ├── MacCatalyst │ │ │ ├── AppDelegate.cs │ │ │ ├── Info.plist │ │ │ └── Program.cs │ │ └── iOS │ │ │ ├── AppDelegate.cs │ │ │ ├── Info.plist │ │ │ └── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── Resources │ │ ├── AppIcon │ │ │ ├── appicon.svg │ │ │ └── appiconfg.svg │ │ ├── Fonts │ │ │ ├── OpenSans-Regular.ttf │ │ │ ├── OpenSans-Semibold.ttf │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-regular-400.ttf │ │ │ └── fa-solid-900.ttf │ │ ├── Images │ │ │ ├── notification.svg │ │ │ └── shiny.svg │ │ ├── Raw │ │ │ └── notification.mp3 │ │ ├── Splash │ │ │ └── splash.svg │ │ └── Styles │ │ │ ├── Colors.xaml │ │ │ └── Styles.xaml │ ├── Sample.Maui.csproj │ ├── SpeechRecognition │ │ ├── ConversationPage.xaml │ │ ├── ConversationPage.xaml.cs │ │ ├── ConversationViewModel.cs │ │ ├── DictationPage.xaml │ │ ├── DictationPage.xaml.cs │ │ ├── DictationViewModel.cs │ │ └── ListItemViewModel.cs │ ├── Stores │ │ ├── AppSettings.cs │ │ ├── BasicPage.xaml │ │ ├── BasicPage.xaml.cs │ │ ├── BasicViewModel.cs │ │ ├── BindPage.xaml │ │ ├── BindPage.xaml.cs │ │ └── BindViewModel.cs │ ├── TODO │ │ ├── Hosting │ │ │ ├── L2CapPage.xaml │ │ │ ├── L2CapPage.xaml.cs │ │ │ └── L2CapViewModel.cs │ │ ├── L2CapPage.xaml │ │ ├── L2CapPage.xaml.cs │ │ └── L2CapViewModel.cs │ ├── appsettings.android.json │ ├── appsettings.apple.json │ └── appsettings.json └── readme.md ├── src ├── Directory.build.props ├── Directory.build.targets ├── IsExternalInit.cs ├── Shiny.Beacons │ ├── BeaconExtensions.cs │ ├── IBeaconMonitorDelegate.cs │ ├── IBeaconMonitoringManager.cs │ ├── IBeaconRangingManager.cs │ ├── Managed │ │ ├── ManagedBeacon.cs │ │ └── ManagedScan.cs │ ├── Models.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── BackgroundTask.cs │ │ │ ├── BeaconMonitoringManager.cs │ │ │ ├── BeaconRangingManager.cs │ │ │ ├── BeaconRegionStatus.cs │ │ │ ├── BleManagerExtensions.cs │ │ │ └── ShinyBeaconMonitoringService.cs │ │ ├── Apple │ │ │ ├── BeaconLocationManagerDelegate.cs │ │ │ ├── BeaconMonitoringManager.cs │ │ │ ├── BeaconRangingManager.cs │ │ │ └── PlatformExtensions.cs │ │ └── Shared │ │ │ └── ServiceCollectionExtensions.cs │ └── Shiny.Beacons.csproj ├── Shiny.BluetoothLE.Common │ ├── BleException.cs │ ├── CharacteristicProperties.cs │ ├── ConnectionState.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── Extensions.cs │ │ │ ├── ShinyBleAdapterStateBroadcastReceiver.cs │ │ │ └── Utils.cs │ │ └── Apple │ │ │ └── Extensions.cs │ └── Shiny.BluetoothLE.Common.csproj ├── Shiny.BluetoothLE.Hosting │ ├── AdvertisementOptions.cs │ ├── CharacteristicSubscription.cs │ ├── GattResult.cs │ ├── GattState.cs │ ├── IBleHostingManager.cs │ ├── IGattCharacteristic.cs │ ├── IGattCharacteristicBuilder.cs │ ├── IGattService.cs │ ├── IGattServiceBuilder.cs │ ├── IPeripheral.cs │ ├── L2CapChannel.cs │ ├── L2CapInstance.cs │ ├── Managed │ │ ├── BleGattCharacteristic.cs │ │ └── BleGattCharacteristicAttribute.cs │ ├── NotificationOptions.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── AndroidExtensions.cs │ │ │ ├── BleHostingManager.cs │ │ │ ├── Constants.cs │ │ │ ├── GattCharacteristic.cs │ │ │ ├── GattService.cs │ │ │ ├── Internals │ │ │ │ ├── AdvertisementCallbacks.cs │ │ │ │ ├── CharacteristicReadEventArgs.cs │ │ │ │ ├── CharacteristicWriteEventArgs.cs │ │ │ │ ├── ConnectionStateChangeEventArgs.cs │ │ │ │ ├── DescriptorReadEventArgs.cs │ │ │ │ ├── DescriptorWriteEventArgs.cs │ │ │ │ ├── GattEventArgs.cs │ │ │ │ ├── GattRequestEventArgs.cs │ │ │ │ ├── GattServerContext.cs │ │ │ │ ├── MtuChangedEventArgs.cs │ │ │ │ └── WriteRequestEventArgs.cs │ │ │ └── Peripheral.cs │ │ ├── Apple │ │ │ ├── BleHostingManager.cs │ │ │ ├── GattCharacteristic.cs │ │ │ ├── GattService.cs │ │ │ ├── Peripheral.cs │ │ │ └── PeripheralCache.cs │ │ ├── Shared │ │ │ ├── BleHostingManager.cs │ │ │ └── ServiceCollectionExtensions.cs │ │ └── Windows │ │ │ ├── BleHostingManager.cs │ │ │ ├── GattCharacteristic.cs │ │ │ ├── GattDescriptor.cs │ │ │ ├── GattService.cs │ │ │ └── Peripheral.cs │ ├── ReadRequest.cs │ ├── Shiny.BluetoothLE.Hosting.csproj │ ├── WriteOptions.cs │ └── WriteRequest.cs ├── Shiny.BluetoothLE │ ├── BleOperationException.cs │ ├── ConnectionConfig.cs │ ├── Extensions_Async.cs │ ├── Extensions_BleManager.cs │ ├── Extensions_Characteristics.cs │ ├── Extensions_Peripheral.cs │ ├── Feature_L2Cap.cs │ ├── Feature_Mtu.cs │ ├── Feature_Pairing.cs │ ├── Feature_Phy.cs │ ├── Feature_Transactions.cs │ ├── IAdvertisementData.cs │ ├── IBleDelegate.cs │ ├── IBleManager.cs │ ├── IPeripheral.cs │ ├── Intrastructure │ │ └── OperationQueue.cs │ ├── Managed │ │ ├── IManagedScan.cs │ │ ├── ManagedExtensions.cs │ │ ├── ManagedScan.cs │ │ └── ManagedScanResult.cs │ ├── Models.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── AdvertisementData.cs │ │ │ ├── AndroidConnectionConfig.cs │ │ │ ├── AndroidScanConfig.cs │ │ │ ├── BleManager.cs │ │ │ ├── BleManager_Pairing.cs │ │ │ ├── Log.cs │ │ │ ├── Peripheral.cs │ │ │ ├── Peripheral_AndroidPhy.cs │ │ │ ├── Peripheral_Characteristics.cs │ │ │ ├── Peripheral_Descriptors.cs │ │ │ ├── Peripheral_L2Cap.cs │ │ │ ├── Peripheral_Mtu.cs │ │ │ ├── Peripheral_Pairing.cs │ │ │ ├── Peripheral_Services.cs │ │ │ ├── Peripheral_Transactions.cs │ │ │ └── ShinyBleBroadcastReceiver.cs │ │ ├── Apple │ │ │ ├── AdvertisementData.cs │ │ │ ├── AppleBleConfiguration.cs │ │ │ ├── BleManager.cs │ │ │ ├── Extensions.cs │ │ │ ├── Log.cs │ │ │ ├── Peripheral.cs │ │ │ ├── Peripheral_Characteristics.cs │ │ │ ├── Peripheral_Descriptors.cs │ │ │ ├── Peripheral_L2Cap.cs │ │ │ └── Peripheral_Services.cs │ │ ├── Shared │ │ │ └── ServiceCollectionExtensions.cs │ │ ├── WebAssembly │ │ │ ├── AdvertisementData.cs │ │ │ ├── BleManager.cs │ │ │ ├── JsScanResult.cs │ │ │ ├── Peripheral.cs │ │ │ ├── ServiceCollectionExtensions.cs │ │ │ └── ble.js │ │ └── Windows │ │ │ ├── AdvertisementData.cs │ │ │ ├── BleManager.cs │ │ │ ├── BleManager_Pairing.cs │ │ │ ├── GattReliableTransaction.cs │ │ │ ├── Peripheral.cs │ │ │ ├── Peripheral_Characteristics.cs │ │ │ ├── Peripheral_Descriptors.cs │ │ │ ├── Peripheral_Pairing.cs │ │ │ ├── Peripheral_Services.cs │ │ │ └── Utils.cs │ ├── Shiny.BluetoothLE.csproj │ └── StandardUuids.cs ├── Shiny.Core │ ├── AccessState.cs │ ├── GeneralExtensions.cs │ ├── Hosting │ │ ├── Host.cs │ │ ├── HostBuilder.cs │ │ └── IHost.cs │ ├── IShinyComponentStartup.cs │ ├── IShinyStartupTask.cs │ ├── Logging │ │ ├── GenericLogger.cs │ │ └── ShinyLoggingBuilder.cs │ ├── NotifyPropertyChanged.cs │ ├── ObservableExtensions.cs │ ├── ObservableList.cs │ ├── PermissionException.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── ActionBroadcastReceiver.cs │ │ │ ├── ActivityChanged.cs │ │ │ ├── AndroidActivityLifecycle.cs │ │ │ ├── AndroidPermission.cs │ │ │ ├── AndroidPlatform.Extensions.cs │ │ │ ├── AndroidPlatform.cs │ │ │ ├── Hosting │ │ │ │ ├── AndroidLifecycleExecutor.cs │ │ │ │ └── IAndroidLifecycle.cs │ │ │ ├── IAndroidForegroundServiceDelegate.cs │ │ │ ├── PermissionRequestResult.cs │ │ │ ├── ShinyAndroidForegroundService.cs │ │ │ ├── ShinyBroadcastReceiver.cs │ │ │ └── Stores │ │ │ │ ├── AndroidKeyStore.cs │ │ │ │ ├── SecureKeyValueStore.cs │ │ │ │ └── SettingsKeyValueStore.cs │ │ ├── Apple │ │ │ ├── AppleExtensions.cs │ │ │ ├── Hosting │ │ │ │ ├── IIosLifecycle.cs │ │ │ │ ├── IosLifecycleExecutor.cs │ │ │ │ ├── Messaging.cs │ │ │ │ └── ShinyUNUserNotificationCenterDelegate.cs │ │ │ ├── IosPlatform.cs │ │ │ ├── Log.cs │ │ │ └── Stores │ │ │ │ ├── SecureKeyValueStore.cs │ │ │ │ └── SettingsKeyValueStore.cs │ │ ├── Shared │ │ │ ├── IPlatform.cs │ │ │ ├── LifecycleTask.cs │ │ │ ├── OperatingSystemShim.cs │ │ │ ├── PlatformExtensions.cs │ │ │ └── ShinyInfrastructureExtensions.cs │ │ └── Windows │ │ │ ├── Permissions.cs │ │ │ ├── SecureKeyValueStore.cs │ │ │ ├── SettingsKeyValueStore.cs │ │ │ └── WindowsPlatform.cs │ ├── Reflection │ │ └── Extensions.cs │ ├── ServiceProviderExtensions.cs │ ├── Shiny.Core.csproj │ ├── Shiny.Core.targets │ ├── ShinySubject.cs │ └── Stores │ │ ├── IKeyValueStore.cs │ │ ├── IObjectStoreBinder.cs │ │ ├── ISerializer.cs │ │ ├── Impl │ │ ├── DefaultSerializer.cs │ │ ├── Log.cs │ │ ├── MemoryKeyValueStore.cs │ │ ├── ObjectStoreBinder.cs │ │ └── TypeJsonConverter.cs │ │ ├── KeyValueStoreFactory.cs │ │ ├── ObjectStoreBinderAttribute.cs │ │ └── StoreExtensions.cs ├── Shiny.Extensions.Configuration │ ├── Platforms │ │ ├── Android │ │ │ ├── ConfigurationBuilderExtensions.cs │ │ │ ├── PrefChangeListener.cs │ │ │ ├── SharedPreferencesConfigurationProvider.cs │ │ │ └── SharedPreferencesConfigurationSource.cs │ │ ├── Apple │ │ │ ├── ConfigurationBuilderExtensions.cs │ │ │ ├── NSUserDefaultsConfigurationProvider.cs │ │ │ └── NSUserDefaultsConfigurationSource.cs │ │ └── Shared │ │ │ └── ConfigurationBuilderExtensions.cs │ └── Shiny.Extensions.Configuration.csproj ├── Shiny.Hosting.Maui │ ├── Shiny.Hosting.Maui.csproj │ ├── ShinyExtensions.cs │ └── ShinyMauiInitializationService.cs ├── Shiny.Hosting.Native │ ├── Platforms │ │ ├── Android │ │ │ ├── ShinyAndroidActivity.cs │ │ │ └── ShinyAndroidApplication.cs │ │ └── iOS │ │ │ └── ShinyAppDelegate.cs │ └── Shiny.Hosting.Native.csproj ├── Shiny.Jobs │ ├── AbstractJobManager.cs │ ├── Enums.cs │ ├── IJob.cs │ ├── IJobManager.cs │ ├── Infrastructure │ │ └── JobLifecycleTask.cs │ ├── Job.cs │ ├── JobExtensions.cs │ ├── JobInfo.cs │ ├── JobRunResult.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── JobManager.cs │ │ │ └── ShinyJobWorker.cs │ │ ├── Apple │ │ │ └── JobManager.cs │ │ ├── Scripts │ │ │ ├── JobManager.cs │ │ │ └── jobs.js │ │ └── Shared │ │ │ └── ServiceCollectionExtensions.cs │ └── Shiny.Jobs.csproj ├── Shiny.Locations │ ├── Extensions.cs │ ├── GeofenceRegion.cs │ ├── GpsDelegate.cs │ ├── GpsGeofenceDelegate.cs │ ├── GpsGeofenceManagerImpl.cs │ ├── GpsReading.cs │ ├── GpsRequest.cs │ ├── IGeofenceDelegate.cs │ ├── IGeofenceManager.cs │ ├── IGpsDelegate.cs │ ├── IGpsManager.cs │ ├── Log.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── AbstractGpsManager.cs │ │ │ ├── AndroidGpsRequest.cs │ │ │ ├── GeofenceBroadcastReceiver.cs │ │ │ ├── GeofenceManager.cs │ │ │ ├── GooglePlayServiceGpsManager.cs │ │ │ ├── LocationServicesGpsManager.cs │ │ │ ├── PlatformExtensions.cs │ │ │ ├── ShinyGpsService.cs │ │ │ └── ShinyLocationCallback.cs │ │ ├── Apple │ │ │ ├── AppleGpsRequest.cs │ │ │ ├── GeofenceManager.cs │ │ │ ├── GeofenceManagerDelegate.cs │ │ │ ├── GpsManager.cs │ │ │ ├── GpsManagerDelegate.cs │ │ │ └── PlatformExtensions.cs │ │ ├── Shared │ │ │ ├── GeofenceServiceCollectionExtensions.cs │ │ │ └── GpsServiceCollectionExtensions.cs │ │ └── WebAssembly │ │ │ ├── GeoPosition.cs │ │ │ ├── GpsManager.cs │ │ │ ├── ServiceCollectionExtensions.cs │ │ │ └── gps.js │ └── Shiny.Locations.csproj ├── Shiny.Logging.Sqlite │ ├── LoggingSqliteConnection.cs │ ├── NullScope.cs │ ├── ServiceCollectionExtensions.cs │ ├── Shiny.Logging.Sqlite.csproj │ ├── SqliteLogger.cs │ └── SqliteLoggerFactory.cs ├── Shiny.Net.Http │ ├── HttpClientExtensions.cs │ ├── HttpTransferExtensions.cs │ ├── HttpTransferMonitor.cs │ ├── IHttpTransferDelegate.cs │ ├── IHttpTransferManager.cs │ ├── Infrastructure │ │ └── ProgressStreamContent.cs │ ├── Log.cs │ ├── Models.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── AbstractTransferNotificationStrategy.cs │ │ │ ├── HttpTransferManager.cs │ │ │ ├── HttpTransferProcess.cs │ │ │ ├── HttpTransferService.cs │ │ │ ├── PerTransferNotificationStrategy.cs │ │ │ └── SummaryTransferNotificationStrategy.cs │ │ ├── Apple │ │ │ ├── AppleHttpTransferRequest.cs │ │ │ ├── HttpTransferManager.cs │ │ │ ├── INativeConfigurator.cs │ │ │ └── PlatformExtensions.cs │ │ └── Shared │ │ │ └── ServiceCollectionExtensions.cs │ └── Shiny.Net.Http.csproj ├── Shiny.Notifications │ ├── Channel.cs │ ├── ChannelAction.cs │ ├── ChannelExtensions.cs │ ├── ChannelImportance.cs │ ├── ChannelSound.cs │ ├── Enums.cs │ ├── Feature_Badges.cs │ ├── GeofenceTrigger.cs │ ├── IChannelManager.cs │ ├── INotificationDelegate.cs │ ├── INotificationManager.cs │ ├── IntervalTrigger.cs │ ├── Notification.cs │ ├── NotificationExtensions.cs │ ├── NotificationResponse.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── AndroidChannel.cs │ │ │ ├── AndroidNotification.cs │ │ │ ├── AndroidNotificationManager.cs │ │ │ ├── AndroidNotificationProcessor.cs │ │ │ ├── AndroidPlatformExtensions.cs │ │ │ ├── ChannelManager.cs │ │ │ ├── NotificationGeofenceDelegate.cs │ │ │ ├── NotificationManager.cs │ │ │ ├── PlatformExtensions.cs │ │ │ ├── ShinyIntents.cs │ │ │ └── ShinyNotificationBroadcastReceiver.cs │ │ ├── Apple │ │ │ ├── AppleChannel.cs │ │ │ ├── AppleNotification.cs │ │ │ ├── ApplePlatformExtensions.cs │ │ │ ├── ChannelManager.cs │ │ │ ├── IosConfiguration.cs │ │ │ └── NotificationManager.cs │ │ ├── Shared │ │ │ ├── CommonExtensions.cs │ │ │ └── ServiceCollectionExtensions.cs │ │ └── WebAssembly │ │ │ ├── NotificationManager.cs │ │ │ ├── ServiceCollectionExtensions.cs │ │ │ └── notifications.js │ └── Shiny.Notifications.csproj ├── Shiny.Push.AzureNotificationHubs │ ├── AzureNotificationConfig.cs │ ├── Platforms │ │ └── Shared │ │ │ ├── AzureNotificationHubsPushProvider.cs │ │ │ └── ServiceCollectionExtensions.cs │ └── Shiny.Push.AzureNotificationHubs.csproj ├── Shiny.Push.FirebaseMessaging │ ├── FirebaseConfiguration.cs │ ├── Platforms │ │ ├── Shared │ │ │ └── ServiceCollectionExtensions.cs │ │ └── iOS │ │ │ └── FirebasePushProvider.cs │ └── Shiny.Push.FirebaseMessaging.csproj ├── Shiny.Push │ ├── IPushManager.cs │ ├── IPushProvider.cs │ ├── IPushSenderSupport.cs │ ├── IPushTagSupport.cs │ ├── Notification.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── AndroidPushNotification.cs │ │ │ ├── FirebaseConfig.cs │ │ │ ├── FirebasePushProvider.cs │ │ │ ├── PushManager.cs │ │ │ ├── ShinyFirebaseService.cs │ │ │ └── ShinyIntents.cs │ │ ├── Apple │ │ │ ├── IApplePushDelegate.cs │ │ │ ├── IApplePushManager.cs │ │ │ ├── PlatformExtensions.cs │ │ │ ├── PushManager.cs │ │ │ └── ShinyNotificationServiceExtension.cs │ │ ├── Shared │ │ │ └── ServiceCollectionExtensions.cs │ │ └── WebAssembly │ │ │ ├── PushManager.cs │ │ │ ├── ServiceCollectionExtensions.cs │ │ │ └── push.js │ ├── PushAccessState.cs │ ├── PushDelegate.cs │ ├── PushExtensions.cs │ ├── PushNotification.cs │ └── Shiny.Push.csproj ├── Shiny.SourceGenerators │ ├── Attributes.cs │ ├── AutoRegistrationGenerator.cs │ ├── GlobalOptions.cs │ ├── Shiny.SourceGenerators.csproj │ ├── StoreGeneratedGenerator.cs │ ├── UseShinyInitializationAnalyzer.cs │ └── build │ │ └── Shiny.Auto.Generators.props ├── Shiny.SpeechRecognition │ ├── Extensions.cs │ ├── ISpeechRecognizer.cs │ ├── Platforms │ │ ├── Android │ │ │ └── SpeechRecognizerImpl.cs │ │ ├── Apple │ │ │ └── SpeechRecognizerImpl.cs │ │ ├── Shared │ │ │ └── ServiceCollectionExtensions.cs │ │ └── WebAssembly │ │ │ ├── ServiceCollectionExtensions.cs │ │ │ ├── SpeechRecognizer.cs │ │ │ └── speech.js │ └── Shiny.SpeechRecognition.csproj ├── Shiny.Support.DeviceMonitoring │ ├── Net │ │ ├── ConnectivityExtensions.cs │ │ ├── Enums.cs │ │ └── IConnectivity.cs │ ├── Platforms │ │ ├── Android │ │ │ ├── BatteryImpl.cs │ │ │ └── ConnectivityImpl.cs │ │ ├── Apple │ │ │ ├── BatteryImpl.cs │ │ │ ├── ConnectivityImpl.cs │ │ │ └── Log.cs │ │ ├── Shared │ │ │ └── ServiceCollectionExtensions.cs │ │ ├── WebAssembly │ │ │ ├── Infrastructure │ │ │ │ ├── Battery.cs │ │ │ │ ├── Connectivity.cs │ │ │ │ ├── Interop.cs │ │ │ │ ├── LocalStorageRepository.cs │ │ │ │ └── LocalStorageStore.cs │ │ │ ├── RegistrationExtensions.cs │ │ │ ├── battery.js │ │ │ ├── connectivity.js │ │ │ └── storage.js │ │ └── Windows │ │ │ ├── BatteryImpl.cs │ │ │ └── ConnectivityImpl.cs │ ├── Power │ │ ├── BatteryExtensions.cs │ │ ├── BatteryState.cs │ │ └── IBattery.cs │ └── Shiny.Support.DeviceMonitoring.csproj ├── Shiny.Support.Locations │ ├── Distance.cs │ ├── PlatformExtensions.cs │ ├── Position.cs │ ├── Shiny.Support.Locations.csproj │ └── ShinyLocationDelegate.cs ├── Shiny.Support.Repositories │ ├── Extensions.cs │ ├── IRepository.cs │ ├── IRepositoryEntity.cs │ ├── Impl │ │ ├── FileSystemRepository.cs │ │ └── Log.cs │ ├── RepositoryException.cs │ └── Shiny.Support.Repositories.csproj ├── nuget.png └── nuget.txt ├── tests ├── Shiny.SourceGenerators.Tests │ ├── GlobalUsings.cs │ ├── Shiny.SourceGenerators.Tests.csproj │ └── Tests.cs └── Shiny.Tests │ ├── AbstractShinyTests.cs │ ├── Beacons │ ├── BeaconParserTests.cs │ └── BeaconRegionTests.cs │ ├── BluetoothLE │ ├── AbstractBleTests.cs │ ├── BleConfiguration.cs │ ├── BleHostTests.cs │ ├── BleManagerTests.cs │ ├── CharacteristicTests.cs │ ├── L2CapTests.cs │ ├── PeripheralTests.cs │ └── ServiceTests.cs │ ├── ClearTests.cs │ ├── ConfigurationTests.cs │ ├── Core │ ├── FileSystemRepositoryTests.cs │ ├── Infrastructure │ │ ├── DependencyInjectionTests.cs │ │ └── FullService.cs │ └── Stores │ │ ├── AttributeTestBind.cs │ │ ├── MyTestEnum.cs │ │ ├── SecureStorageTests.cs │ │ ├── StoreTests.Base.cs │ │ ├── StoreTests.Extensions.cs │ │ ├── StoreTests.ObjectBinder.cs │ │ ├── StoreTests.Types.cs │ │ ├── StoreTests.cs │ │ └── TestBind.cs │ ├── GlobalUsings.cs │ ├── HttpTransferTests.cs │ ├── Locations │ ├── DistanceTests.cs │ ├── GeofenceManagerTests.cs │ ├── GeofenceRegionTests.cs │ ├── GpsGeofenceDelegateTests.cs │ ├── GpsManagerTests.cs │ ├── MotionActivityTests.cs │ └── PositionTests.cs │ ├── Logging │ ├── AppCenterLoggingTests.cs │ └── SqliteLoggingTests.cs │ ├── MauiProgram.cs │ ├── Mocks │ ├── MockBattery.cs │ └── MockConnectivity.cs │ ├── Notifications │ └── NotificationTests.cs │ ├── PlatformTests.cs │ ├── Platforms │ ├── Android │ │ ├── AndroidManifest.xml │ │ ├── MainActivity.cs │ │ ├── MainApplication.cs │ │ └── Resources │ │ │ ├── values │ │ │ └── colors.xml │ │ │ └── xml │ │ │ └── network_security_config.xml │ ├── MacCatalyst │ │ ├── AppDelegate.cs │ │ ├── Info.plist │ │ └── Program.cs │ └── iOS │ │ ├── AppDelegate.cs │ │ ├── Info.plist │ │ └── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Push │ ├── AbstractPushTests.cs │ ├── AppleNativeTests.cs │ ├── AzureNotificationHubTests.cs │ ├── FirebaseTests.cs │ └── TestGoogleCredential.cs │ ├── Resources │ ├── AppIcon │ │ ├── appicon.svg │ │ └── appiconfg.svg │ ├── Fonts │ │ ├── OpenSans-Regular.ttf │ │ └── OpenSans-Semibold.ttf │ ├── Images │ │ ├── notification.svg │ │ └── shiny.svg │ ├── Splash │ │ └── splash.svg │ └── Styles │ │ ├── Colors.xaml │ │ └── Styles.xaml │ ├── Samples │ ├── SampleBeaconMonitorDelegate.cs │ ├── SampleBleDelegate.cs │ ├── SampleGeofenceDelegate.cs │ ├── SampleGpsDelegate.cs │ ├── SampleHttpTransferDelegate.cs │ ├── SampleJob.cs │ ├── SampleNotificationDelegate.cs │ ├── SamplePushDelegate.cs │ └── StartupTask.cs │ ├── Shiny.Tests.csproj │ ├── Utils.cs │ ├── appsettings.android.json │ ├── appsettings.ios.json │ ├── appsettings.json │ └── appsettings.maccatalyst.json └── version.json /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thanks you for your interest in contributing to Shiny - Please see our our [Code of Conduct](CODE_OF_CONDUCT.md). 4 | 5 | 6 | ### Bug Fixes 7 | 8 | If you're looking for something to fix, please browse [open issues](https://github.com/shinyorg/shiny/issues). 9 | 10 | Please follow the style used within the project 11 | 12 | - Don't use the `private` keyword as it is the default accessibility level in C# 13 | - Apply readonly on class level private variables that are assigned in the constructor 14 | - 4 SPACES - tabs do not exist :) 15 | 16 | ### Feature Requests 17 | 18 | To propose a change or new feature, please make use the feature request area in issues/ 19 | 20 | #### Non-Starter Topics 21 | The following topics should generally not be proposed for discussion as they are non-starters: 22 | 23 | * Large renames of APIs 24 | * Large non-backward-compatible breaking changes 25 | * Avoid clutter posts like "+1" which do not serve to further the conversation 26 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [aritchie] 2 | # custom: https://www.buymeacoffee.com/QDF8SWy 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Shiny Community Forums 4 | url: https://github.com/shinyorg/shiny/discussions 5 | about: Please ask and answer questions here. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: You have an idea for an enhancement within Shiny 3 | title: "[Feature Request]: " 4 | labels: [feature request, unverified] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Please note that we are not taking feature requests for Windows or Shiny v2. 10 | - type: textarea 11 | attributes: 12 | label: Summary 13 | description: Your summary of the feature 14 | validations: 15 | required: true 16 | - type: textarea 17 | attributes: 18 | label: API Changes 19 | validations: 20 | required: true 21 | - type: textarea 22 | attributes: 23 | label: Intended Use Case 24 | validations: 25 | required: true 26 | - type: checkboxes 27 | id: terms 28 | attributes: 29 | label: Code of Conduct 30 | description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/shinyorg/shiny/blob/master/.github/CODE_OF_CONDUCT.md) 31 | options: 32 | - label: I agree to follow this project's Code of Conduct 33 | required: true 34 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Description of Change ### 2 | 3 | 4 | 5 | ### Issues Resolved ### 6 | 7 | 8 | - fixes # 9 | 10 | ### API Changes ### 11 | 12 | 13 | None 14 | 15 | ### Platforms Affected ### 16 | 17 | 18 | - All 19 | - iOS 20 | - Android 21 | - UWP 22 | 23 | ### Behavioral Changes ### 24 | 25 | 26 | None 27 | 28 | ### Testing Procedure ### 29 | 30 | 31 | ### PR Checklist ### 32 | 33 | - [ ] Rebased on top of the target branch at time of PR 34 | - [ ] Changes adhere to coding standard 35 | - [ ] Sent to a v(branch) or DEV branch -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | 4 | updates: 5 | - package-ecosystem: nuget 6 | directory: "/" 7 | schedule: 8 | interval: weekly 9 | time: "10:00" 10 | open-pull-requests-limit: 10 11 | target-branch: dev 12 | groups: 13 | AndroidX: 14 | patterns: 15 | - "Xamarin.AndroidX.*" 16 | AspNetCore: 17 | patterns: 18 | - "Microsoft.AspNetCore.*" 19 | - "Microsoft.JSInterop" 20 | Firebase: 21 | patterns: 22 | - "Xamarin.Firebase.*" 23 | labels: 24 | - dependencies 25 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "dotnet.defaultSolution": "Shiny.sln" 3 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2020 Allan Ritchie 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 | -------------------------------------------------------------------------------- /art/color_wheel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/color_wheel.png -------------------------------------------------------------------------------- /art/gonemobile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/gonemobile.jpg -------------------------------------------------------------------------------- /art/logo.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/logo.ai -------------------------------------------------------------------------------- /art/logo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/logo.mp4 -------------------------------------------------------------------------------- /art/logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/logo.pdf -------------------------------------------------------------------------------- /art/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/logo.png -------------------------------------------------------------------------------- /art/logo_black_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/logo_black_bg.png -------------------------------------------------------------------------------- /art/logo_white_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/logo_white_bg.png -------------------------------------------------------------------------------- /art/nuget.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/nuget.png -------------------------------------------------------------------------------- /art/shiny-logo-text.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shinyorg/shiny/ec91b230b41939308c88840ed699e53c26c1dde9/art/shiny-logo-text.ai -------------------------------------------------------------------------------- /build.ps1: -------------------------------------------------------------------------------- 1 | dotnet run --project build/ShinyBuild.csproj -- $args 2 | exit $LASTEXITCODE; -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | dotnet run --project ./build/ShinyBuild.csproj -- "$@" 2 | -------------------------------------------------------------------------------- /build/Constants.cs: -------------------------------------------------------------------------------- 1 | namespace ShinyBuild; 2 | 3 | public static class Constants 4 | { 5 | public const string DefaultBuildConfiguration = "Release"; 6 | } 7 | -------------------------------------------------------------------------------- /build/Extensions.cs: -------------------------------------------------------------------------------- 1 | using Cake.Core; 2 | using Cake.Core.IO; 3 | 4 | namespace ShinyBuild; 5 | 6 | public static class Extensions 7 | { 8 | public static IProcess Execute(this ICakeContext context, FilePath exe, string args) => 9 | context.ProcessRunner.Start( 10 | exe, 11 | new ProcessSettings 12 | { 13 | Arguments = ProcessArgumentBuilder.FromString(args) 14 | } 15 | ); 16 | } -------------------------------------------------------------------------------- /build/Program.cs: -------------------------------------------------------------------------------- 1 | using Cake.Frosting; 2 | 3 | namespace ShinyBuild; 4 | 5 | 6 | class Program 7 | { 8 | //https://cakebuild.net/docs/running-builds/runners/cake-frosting#bootstrapping-for-cake-frosting 9 | public static int Main(string[] args) 10 | => new CakeHost() 11 | .UseContext() 12 | //.UseLifetime() 13 | //.InstallTool(new Uri("dotnet:n?package=GitVersion.Tool&version=5.6.9")) 14 | .Run(args); 15 | } 16 | -------------------------------------------------------------------------------- /build/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "WSL": { 4 | "commandName": "WSL2", 5 | "distributionName": "" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /build/ShinyBuild.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net8.0 6 | latest 7 | enable 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /build/Tasks/DefaultTask.cs: -------------------------------------------------------------------------------- 1 | using Cake.Frosting; 2 | using ShinyBuild.Tasks.Library; 3 | 4 | namespace ShinyBuild.Tasks; 5 | 6 | 7 | [TaskName("Default")] 8 | [IsDependentOn(typeof(CopyArtifactsTask))] 9 | [IsDependentOn(typeof(NugetDeployTask))] 10 | [IsDependentOn(typeof(ReleaseAnnouncementTask))] 11 | //[IsDependentOn(typeof(GitHubReleaseTask))] 12 | public sealed class DefaultTarget : FrostingTask { } 13 | -------------------------------------------------------------------------------- /build/Tasks/Library/CopyArtifactsTask.cs: -------------------------------------------------------------------------------- 1 | using Cake.Common.IO; 2 | using Cake.Frosting; 3 | 4 | namespace ShinyBuild.Tasks.Library; 5 | 6 | 7 | [IsDependentOn(typeof(BuildTask))] 8 | public class CopyArtifactsTask : FrostingTask 9 | { 10 | public override void Run(BuildContext context) 11 | { 12 | var directory = context.Directory(context.ArtifactDirectory); 13 | if (Directory.Exists(directory.Path.FullPath)) 14 | context.CleanDirectory(directory); 15 | else 16 | Directory.CreateDirectory(directory.Path.FullPath); 17 | 18 | context.CopyFiles("src/**/*.nupkg", directory); 19 | context.CopyFiles("src/**/*.snupkg", directory); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /nuget.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /samples/Directory.build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8.0.20 4 | 8.0.0 5 | 6 | -------------------------------------------------------------------------------- /samples/Sample.Api/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | global using System; 2 | global using System.Threading.Tasks; 3 | global using Microsoft.AspNetCore.Mvc; 4 | -------------------------------------------------------------------------------- /samples/Sample.Api/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Http.Features; 2 | using Microsoft.AspNetCore.Server.Kestrel.Core; 3 | 4 | var builder = WebApplication.CreateBuilder(args); 5 | 6 | builder.Services.Configure(options => 7 | { 8 | options.Limits.MaxRequestBodySize = int.MaxValue; // if don't set default value is: 30 MB 9 | }); 10 | builder.Services.Configure(x => 11 | { 12 | x.ValueLengthLimit = int.MaxValue; 13 | x.MultipartBodyLengthLimit = int.MaxValue; // if don't set default value is: 128 MB 14 | x.MultipartHeadersLengthLimit = int.MaxValue; 15 | }); 16 | builder.Services.AddControllers(); 17 | builder.Services.AddEndpointsApiExplorer(); 18 | builder.Services.AddSwaggerGen(); 19 | 20 | var app = builder.Build(); 21 | 22 | if (app.Environment.IsDevelopment()) 23 | { 24 | app.UseSwagger(); 25 | app.UseSwaggerUI(); 26 | } 27 | 28 | app.UseHttpsRedirection(); 29 | app.MapControllers(); 30 | 31 | app.Run(); 32 | 33 | -------------------------------------------------------------------------------- /samples/Sample.Api/Sample.Api.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net8.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /samples/Sample.Api/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "Push": { 9 | "AzureNotificationHubs": { 10 | "ConnectionString": "", 11 | "HubName": "" 12 | }, 13 | "Firebase": { 14 | 15 | } 16 | //"Apple": { 17 | // "": "" 18 | //} 19 | } 20 | } 21 | 22 | -------------------------------------------------------------------------------- /samples/Sample.Api/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | 11 | -------------------------------------------------------------------------------- /samples/Sample.Maui/App.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample; 2 | 3 | 4 | public partial class App : Application 5 | { 6 | public App() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Beacons/BeaconViewModel.cs: -------------------------------------------------------------------------------- 1 | using Shiny.Beacons; 2 | 3 | namespace Sample.Beacons; 4 | 5 | 6 | public class BeaconViewModel : ReactiveObject 7 | { 8 | public BeaconViewModel(Beacon beacon) 9 | { 10 | this.Beacon = beacon; 11 | this.Proximity = beacon.Proximity; 12 | } 13 | 14 | 15 | public Beacon Beacon { get; } 16 | public ushort Major => this.Beacon.Major; 17 | public ushort Minor => this.Beacon.Minor; 18 | public string RegionIdentifier => $"Major: {this.Major} - Minor: {this.Minor}"; 19 | 20 | [Reactive] public Proximity Proximity { get; set; } 21 | } 22 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Beacons/CreatePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Beacons; 2 | 3 | public partial class CreatePage : ContentPage 4 | { 5 | public CreatePage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Beacons/ManagedRangingPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Beacons; 2 | 3 | 4 | public partial class ManagedBeaconPage : ContentPage 5 | { 6 | public ManagedBeaconPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Beacons/MonitoringPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Beacons; 2 | 3 | 4 | public partial class MonitoringPage : ContentPage 5 | { 6 | public MonitoringPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Beacons/MyBeaconMonitorDelegate.cs: -------------------------------------------------------------------------------- 1 | using Shiny.Beacons; 2 | 3 | namespace Sample.Beacons; 4 | 5 | 6 | public partial class MyBeaconMonitorDelegate : IBeaconMonitorDelegate 7 | { 8 | readonly SampleSqliteConnection conn; 9 | public MyBeaconMonitorDelegate(SampleSqliteConnection conn) => this.conn = conn; 10 | public Task OnStatusChanged(BeaconRegionState newStatus, BeaconRegion region) => this.conn.Log( 11 | "Beacons", 12 | $"{region.Identifier} was {newStatus.ToString().ToLower()}", 13 | $"UUID: {region.Uuid} - M: {region.Major} - m: {region.Minor}" 14 | ); 15 | } 16 | 17 | #if ANDROID 18 | public partial class MyBeaconMonitorDelegate : IAndroidForegroundServiceDelegate 19 | { 20 | public void Configure(AndroidX.Core.App.NotificationCompat.Builder builder) 21 | { 22 | 23 | } 24 | } 25 | #endif -------------------------------------------------------------------------------- /samples/Sample.Maui/Beacons/RangingPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Beacons; 2 | 3 | 4 | public partial class RangingPage : ContentPage 5 | { 6 | public RangingPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /samples/Sample.Maui/BleClient/CharacteristicPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleClient; 2 | 3 | 4 | public partial class CharacteristicPage : ContentPage 5 | { 6 | public CharacteristicPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/BleClient/MyBleDelegate.cs: -------------------------------------------------------------------------------- 1 | using Shiny.BluetoothLE; 2 | 3 | namespace Sample.BleClient; 4 | 5 | 6 | public class MyBleDelegate : BleDelegate 7 | { 8 | readonly SampleSqliteConnection conn; 9 | public MyBleDelegate(SampleSqliteConnection conn) 10 | => this.conn = conn; 11 | 12 | 13 | public override Task OnAdapterStateChanged(AccessState state) 14 | => this.conn.Log( 15 | "BLE", 16 | "Adapter Status", 17 | $"New Status: {state}" 18 | ); 19 | 20 | public override Task OnPeripheralStateChanged(IPeripheral peripheral) 21 | => this.conn.Log( 22 | "BLE", 23 | "Peripheral Connected", 24 | peripheral.Name 25 | ); 26 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/BleClient/PeripheralPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleClient; 2 | 3 | 4 | public partial class PeripheralPage : ContentPage 5 | { 6 | public PeripheralPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Sample.Maui/BleClient/ScanPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleClient; 2 | 3 | 4 | public partial class ScanPage : ContentPage 5 | { 6 | public ScanPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/BleClient/ServicePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleClient; 2 | 3 | 4 | public partial class ServicePage : ContentPage 5 | { 6 | public ServicePage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Sample.Maui/BleHosting/BeaconAdvertisePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleHosting; 2 | 3 | public partial class BeaconAdvertisePage : ContentPage 4 | { 5 | public BeaconAdvertisePage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/BleHosting/Constants.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleHosting; 2 | 3 | 4 | public static class Constants 5 | { 6 | public const string ManagedServiceUuid = "9cc82e82-d889-4f29-bdba-124d5ee2b0d0"; 7 | public const string ManagedCharacteristicUuid = "9cc82e82-d889-4f29-bdba-124d5ee2b0d1"; 8 | public const string ManagedCharacteristicRequestUuid = "9cc82e82-d889-4f29-bdba-124d5ee2b0d3"; 9 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/BleHosting/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleHosting; 2 | 3 | 4 | public partial class MainPage : ContentPage 5 | { 6 | public MainPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Sample.Maui/BleHosting/ManagedPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleHosting; 2 | 3 | public partial class ManagedPage : ContentPage 4 | { 5 | public ManagedPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/BleManaged/ManagedScanPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.BleManaged; 2 | 3 | public partial class ManagedScanPage : ContentPage 4 | { 5 | public ManagedScanPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/CurrentPermissionPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample; 2 | 3 | public partial class CurrentPermissionPage : ContentPage 4 | { 5 | public CurrentPermissionPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Dev/AppDataPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Dev; 2 | 3 | public partial class AppDataPage : ContentPage 4 | { 5 | public AppDataPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Dev/FileViewPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Dev/FileViewPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Dev; 2 | 3 | public partial class FileViewPage : ContentPage 4 | { 5 | public FileViewPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Dev/FileViewViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Dev; 2 | 3 | 4 | public class FileViewViewModel : ViewModel 5 | { 6 | public FileViewViewModel(BaseServices services) : base(services) {} 7 | 8 | 9 | [Reactive] public string Content { get; private set; } 10 | 11 | public override void OnNavigatedTo(INavigationParameters parameters) 12 | { 13 | base.OnNavigatedTo(parameters); 14 | var path = parameters.GetValue("FilePath"); 15 | this.Content = File.ReadAllText(path); 16 | this.Title = Path.GetFileNameWithoutExtension(path); 17 | } 18 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Dev/HttpTransfersPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Dev; 2 | 3 | public partial class HttpTransfersPage : ContentPage 4 | { 5 | public HttpTransfersPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Dev/LoggerPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Dev; 2 | 3 | public partial class LoggerPage : ContentPage 4 | { 5 | public LoggerPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Dev/SupportServicePage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 8 | 9 | 10 | 18 | 19 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Dev/SupportServicePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Dev; 2 | 3 | public partial class SupportServicePage : ContentPage 4 | { 5 | public SupportServicePage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/ErrorLoggingPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample; 2 | 3 | 4 | public partial class ErrorLoggingPage : ContentPage 5 | { 6 | public ErrorLoggingPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Geofencing/CreatePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Geofencing; 2 | 3 | public partial class CreatePage : ContentPage 4 | { 5 | public CreatePage () 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Geofencing/GeofenceRegionViewModel.cs: -------------------------------------------------------------------------------- 1 | using Shiny.Locations; 2 | 3 | namespace Sample.Geofencing; 4 | 5 | 6 | public class GeofenceRegionViewModel 7 | { 8 | public GeofenceRegionViewModel(GeofenceRegion region, ICommand remove, ICommand requestCurrent) 9 | { 10 | this.Region = region; 11 | this.Remove = remove; 12 | this.RequestCurrentState = requestCurrent; 13 | } 14 | 15 | 16 | public GeofenceRegion Region { get; } 17 | public ICommand RequestCurrentState { get; } 18 | public ICommand Remove { get; } 19 | 20 | 21 | public string Text => this.Region.Identifier; 22 | public string Detail => $"{this.Region.Radius.TotalMeters}m from {this.Region.Center.Latitude}/{this.Region.Center.Longitude}"; 23 | } 24 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Geofencing/ListPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Geofencing; 2 | 3 | 4 | public partial class ListPage : ContentPage 5 | { 6 | public ListPage () 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Geofencing/MyGeofenceDelegate.cs: -------------------------------------------------------------------------------- 1 | using Shiny.Locations; 2 | using Shiny.Notifications; 3 | 4 | namespace Sample.Geofencing; 5 | 6 | 7 | public class MyGeofenceDelegate : IGeofenceDelegate 8 | { 9 | readonly INotificationManager notificationManager; 10 | readonly SampleSqliteConnection conn; 11 | 12 | 13 | public MyGeofenceDelegate(INotificationManager notificationManager, SampleSqliteConnection conn) 14 | { 15 | this.notificationManager = notificationManager; 16 | this.conn = conn; 17 | } 18 | 19 | 20 | public async Task OnStatusChanged(GeofenceState newStatus, GeofenceRegion region) 21 | { 22 | var state = newStatus.ToString().ToUpper(); 23 | 24 | await this.conn.Log( 25 | "Geofencing", 26 | "State Change", 27 | $"You {state} the geofence {region.Identifier}" 28 | ); 29 | await this.notificationManager.Send( 30 | "Geofencing", 31 | $"You {state} the geofence" 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /samples/Sample.Maui/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | global using ReactiveUI; 2 | global using ReactiveUI.Fody.Helpers; 3 | global using Shiny; 4 | global using System; 5 | global using System.Windows.Input; 6 | global using System.Collections.ObjectModel; 7 | global using System.Reactive; 8 | global using System.Reactive.Linq; 9 | global using System.Reactive.Threading.Tasks; 10 | global using Prism.Navigation; 11 | global using Prism.Services; 12 | global using Microsoft.Extensions.Logging; 13 | global using Sample.Infrastructure; -------------------------------------------------------------------------------- /samples/Sample.Maui/Gps/GpsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Gps; 2 | 3 | public partial class GpsPage : ContentPage 4 | { 5 | public GpsPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/HttpTransfers/CreatePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.HttpTransfers; 2 | 3 | 4 | public partial class CreatePage : ContentPage 5 | { 6 | public CreatePage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Sample.Maui/HttpTransfers/PendingPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.HttpTransfers; 2 | 3 | 4 | public partial class PendingPage : ContentPage 5 | { 6 | public PendingPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Infrastructure/CommandItem.cs: -------------------------------------------------------------------------------- 1 | namespace Sample; 2 | 3 | 4 | public class CommandItem 5 | { 6 | public string? Text { get; set; } 7 | public string? Detail { get; set; } 8 | public string? ImageUri { get; set; } 9 | public object? Data { get; set; } 10 | 11 | public ICommand? PrimaryCommand { get; set; } 12 | public ICommand? SecondaryCommand { get; set; } 13 | } 14 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Infrastructure/InvertedBooleanConverter.cs: -------------------------------------------------------------------------------- 1 | using System.Globalization; 2 | 3 | namespace Sample.Infrastructure; 4 | 5 | 6 | public class InvertedBoolConverter : IValueConverter 7 | { 8 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => !((bool)value); 9 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => !((bool)value); 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Infrastructure/SampleSqlConnection.cs: -------------------------------------------------------------------------------- 1 | using SQLite; 2 | 3 | namespace Sample.Infrastructure; 4 | 5 | 6 | public class SampleSqliteConnection : SQLiteAsyncConnection 7 | { 8 | public SampleSqliteConnection(IPlatform platform) : base(Path.Combine(platform.AppData.FullName, "sample.db")) 9 | { 10 | var conn = this.GetConnection(); 11 | var result = conn.CreateTable(); 12 | } 13 | 14 | 15 | public Task Log(string category, string text, string? detail = null, DateTimeOffset? timestamp = null) => this.InsertAsync(new Log 16 | { 17 | Category = category, 18 | Text = text, 19 | Detail = detail, 20 | Timestamp = timestamp ?? DateTimeOffset.UtcNow 21 | }); 22 | public AsyncTableQuery Logs => this.Table(); 23 | } 24 | 25 | 26 | public class Log 27 | { 28 | [AutoIncrement] 29 | [PrimaryKey] 30 | public int Id { get; set; } 31 | 32 | public string Category { get; set; } 33 | public string Text { get; set; } 34 | public string Detail { get; set; } 35 | public DateTimeOffset Timestamp { get; set; } 36 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Jobs/CreatePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Jobs; 2 | 3 | 4 | public partial class CreatePage : ContentPage 5 | { 6 | public CreatePage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Jobs/JobLoggerTask.cs: -------------------------------------------------------------------------------- 1 | using Shiny.Jobs; 2 | 3 | namespace Sample.Jobs; 4 | 5 | 6 | public class JobLoggerTask : IShinyStartupTask 7 | { 8 | readonly IJobManager jobManager; 9 | readonly SampleSqliteConnection conn; 10 | 11 | 12 | public JobLoggerTask(IJobManager jobManager, SampleSqliteConnection conn) 13 | { 14 | this.jobManager = jobManager; 15 | this.conn = conn; 16 | } 17 | 18 | 19 | public void Start() 20 | { 21 | this.jobManager.JobStarted.SubscribeAsync(job => this.conn.Log( 22 | $"[JOB] {job.Identifier} Started", 23 | "" 24 | )); 25 | this.jobManager.JobFinished.SubscribeAsync(result => this.conn.Log( 26 | $"[JOB]: {result.Job?.Identifier} " + (result.Success ? "Completed" : "Failed"), 27 | result.Exception?.ToString() ?? "" 28 | )); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Jobs/ListPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Jobs; 2 | 3 | 4 | public partial class ListPage : ContentPage 5 | { 6 | public ListPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/LogsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample; 2 | 3 | public partial class LogsPage : ContentPage 4 | { 5 | public LogsPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/LogsViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace Sample; 2 | 3 | 4 | public class LogsViewModel : ViewModel 5 | { 6 | public LogsViewModel(BaseServices services, SampleSqliteConnection conn) : base(services) 7 | { 8 | this.Load = ReactiveCommand.CreateFromTask(async () => 9 | { 10 | this.IsBusy = true; 11 | this.Logs = await conn 12 | .Logs 13 | .OrderByDescending(x => x.Timestamp) 14 | .ToListAsync(); 15 | this.IsBusy = false; 16 | }); 17 | } 18 | 19 | 20 | public ICommand Load { get; } 21 | [Reactive] public IList Logs { get; private set; } 22 | 23 | 24 | public override Task InitializeAsync(INavigationParameters parameters) 25 | { 26 | this.Load.Execute(null); 27 | return base.InitializeAsync(parameters); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /samples/Sample.Maui/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample; 2 | 3 | public partial class MainPage : FlyoutPage 4 | { 5 | public MainPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Notifications/Channels/ActionViewModel.cs: -------------------------------------------------------------------------------- 1 | using Shiny.Notifications; 2 | 3 | namespace Sample.Notifications.Channels; 4 | 5 | 6 | public class ActionViewModel : ViewModel 7 | { 8 | public ActionViewModel(BaseServices services) : base(services) {} 9 | 10 | 11 | public ChannelActionType[] Types => new[] 12 | { 13 | ChannelActionType.None, 14 | ChannelActionType.OpenApp, 15 | ChannelActionType.TextReply, 16 | ChannelActionType.Destructive 17 | }; 18 | 19 | [Reactive] public ChannelActionType SelectedType { get; set; } = ChannelActionType.None; 20 | [Reactive] public bool IsEnabled { get; set; } 21 | [Reactive] public string Identifier { get; set; } 22 | [Reactive] public string Title { get; set; } 23 | public ChannelAction ToAction() => new ChannelAction 24 | { 25 | Identifier = this.Identifier, 26 | Title = this.Title, 27 | ActionType = this.SelectedType 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /samples/Sample.Maui/Notifications/Channels/ChannelCreatePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Notifications.Channels; 2 | 3 | 4 | public partial class ChannelCreatePage : ContentPage 5 | { 6 | public ChannelCreatePage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Notifications/Channels/ChannelListPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Notifications.Channels; 2 | 3 | public partial class ChannelListPage : ContentPage 4 | { 5 | public ChannelListPage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Notifications/Create/CreatePage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Notifications.Create; 2 | 3 | public partial class CreatePage : ContentPage 4 | { 5 | public CreatePage() 6 | { 7 | this.InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Notifications/Create/IntervalPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Notifications.Create; 2 | 3 | 4 | public partial class IntervalPage : ContentPage 5 | { 6 | public IntervalPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Notifications/Create/LocationPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Sample.Notifications.Create; 2 | 3 | 4 | public partial class LocationPage : ContentPage 5 | { 6 | public LocationPage() 7 | { 8 | this.InitializeComponent(); 9 | } 10 | } -------------------------------------------------------------------------------- /samples/Sample.Maui/Notifications/Create/SchedulePage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 7 | 8 | 9 | 10 |