| File: Hosting\EssentialsMauiAppBuilderExtensions.cs | Web Access |
| Project: src\src\Core\src\Core.csproj (Microsoft.Maui) |
using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using Microsoft.Maui.ApplicationModel; using Microsoft.Maui.Hosting; using Microsoft.Maui.LifecycleEvents; namespace Microsoft.Maui.Hosting { public interface IEssentialsBuilder { IEssentialsBuilder UseMapServiceToken(string token); IEssentialsBuilder AddAppAction(AppAction appAction); IEssentialsBuilder OnAppAction(Action<AppAction> action); IEssentialsBuilder UseVersionTracking(); } public static class EssentialsExtensions { internal static MauiAppBuilder UseEssentials(this MauiAppBuilder builder) { builder.ConfigureLifecycleEvents(life => { #if __ANDROID__ ApplicationModel.Platform.Init((Android.App.Application)Android.App.Application.Context); life.AddAndroid(android => android .OnCreate((activity, savedInstanceState) => { ApplicationModel.Platform.Init(activity, savedInstanceState); }) .OnRequestPermissionsResult((activity, requestCode, permissions, grantResults) => { ApplicationModel.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); }) .OnNewIntent((activity, intent) => { ApplicationModel.Platform.OnNewIntent(intent); }) .OnResume((activity) => { ApplicationModel.Platform.OnResume(); })); #elif __IOS__ life.AddiOS(ios => ios .ContinueUserActivity((application, userActivity, completionHandler) => { return ApplicationModel.Platform.ContinueUserActivity(application, userActivity, completionHandler); }) .OpenUrl((application, url, options) => { return ApplicationModel.Platform.OpenUrl(application, url, options); }) .PerformActionForShortcutItem((application, shortcutItem, completionHandler) => { ApplicationModel.Platform.PerformActionForShortcutItem(application, shortcutItem, completionHandler); })); #elif WINDOWS life.AddWindows(windows => windows .OnActivated((window, args) => { ApplicationModel.Platform.OnActivated(window, args); }) .OnLaunched((application, args) => { ApplicationModel.Platform.OnLaunched(args); }) .OnPlatformWindowSubclassed((window, context) => { ApplicationModel.Platform.OnPlatformWindowInitialized(window); })); #elif TIZEN #endif }); return builder; } public static MauiAppBuilder ConfigureEssentials(this MauiAppBuilder builder, Action<IEssentialsBuilder>? configureDelegate = null) { if (configureDelegate != null) { builder.Services.AddSingleton<EssentialsRegistration>(new EssentialsRegistration(configureDelegate)); } builder.Services.TryAddEnumerable(ServiceDescriptor.Transient<IMauiInitializeService, EssentialsInitializer>()); return builder; } public static IEssentialsBuilder AddAppAction(this IEssentialsBuilder essentials, string id, string title, string? subtitle = null, string? icon = null) => essentials.AddAppAction(new AppAction(id, title, subtitle, icon)); internal class EssentialsRegistration { private readonly Action<IEssentialsBuilder> _registerEssentials; public EssentialsRegistration(Action<IEssentialsBuilder> registerEssentials) { _registerEssentials = registerEssentials; } internal void RegisterEssentialsOptions(IEssentialsBuilder essentials) { _registerEssentials(essentials); } } class EssentialsInitializer : IMauiInitializeService { private readonly IEnumerable<EssentialsRegistration> _essentialsRegistrations; private EssentialsBuilder? _essentialsBuilder; public EssentialsInitializer(IEnumerable<EssentialsRegistration> essentialsRegistrations) { _essentialsRegistrations = essentialsRegistrations; } public void Initialize(IServiceProvider services) { _essentialsBuilder = new EssentialsBuilder(); if (_essentialsRegistrations != null) { foreach (var essentialsRegistration in _essentialsRegistrations) { essentialsRegistration.RegisterEssentialsOptions(_essentialsBuilder); } } #if WINDOWS ApplicationModel.Platform.MapServiceToken = _essentialsBuilder.MapServiceToken; #endif #if !TIZEN AppActions.OnAppAction += HandleOnAppAction; if (_essentialsBuilder.AppActions is not null) { SetAppActions(services, _essentialsBuilder.AppActions); } #endif if (_essentialsBuilder.TrackVersions) VersionTracking.Track(); } private static async void SetAppActions(IServiceProvider services, List<AppAction> appActions) { try { await AppActions.SetAsync(appActions); } catch (FeatureNotSupportedException ex) { services.GetService<ILoggerFactory>()? .CreateLogger<IEssentialsBuilder>()? .LogError(ex, "App Actions are not supported on this platform."); } } void HandleOnAppAction(object? sender, AppActionEventArgs e) { _essentialsBuilder?.AppActionHandlers?.Invoke(e.AppAction); } } class EssentialsBuilder : IEssentialsBuilder { List<AppAction>? _appActions; internal Action<AppAction>? AppActionHandlers; internal bool TrackVersions; internal List<AppAction>? AppActions => _appActions; #pragma warning disable CS0414 // Remove unread private members internal string? MapServiceToken; #pragma warning restore CS0414 // Remove unread private members public IEssentialsBuilder UseMapServiceToken(string token) { MapServiceToken = token; return this; } public IEssentialsBuilder AddAppAction(AppAction appAction) { _appActions ??= new List<AppAction>(); _appActions.Add(appAction); return this; } public IEssentialsBuilder OnAppAction(Action<AppAction> action) { AppActionHandlers += action; return this; } public IEssentialsBuilder UseVersionTracking() { TrackVersions = true; return this; } } } }