using System; using System.ComponentModel; using System.Threading.Tasks; using TINK.Model.Device; using TINK.Services.CopriApi.ServerUris; using Xamarin.Essentials; using Xamarin.Forms; namespace TINK.ViewModel.Info { /// Manges the tabbed info page. public class InfoPageViewModel : INotifyPropertyChanged { /// Fired whenever a property changed. public event PropertyChangedEventHandler PropertyChanged; /// Holds the name of the host. private string HostName { get; } /// Holds value wether site caching is on or off. bool IsSiteCachingOn { get; } private string AgbResourcePath { get; } private string PrivacyResourcePath { get; } private string ImpressResourcePath { get; } /// Constructs Info view model /// Holds value wether site caching is on or off. /// Delegate to get an an embedded html ressource. Used as fallback if download from web page does not work and cache is empty. public InfoPageViewModel( string hostName, string agbResourcePath, string privacyResourcePath, string impressResourcePath, bool isSiteCachingOn, Func resourceProvider) { HostName = hostName; AgbResourcePath = agbResourcePath; PrivacyResourcePath = privacyResourcePath; ImpressResourcePath = impressResourcePath; IsSiteCachingOn = isSiteCachingOn; InfoAgb = new HtmlWebViewSource { Html = "Loading..." }; ResourceProvider = resourceProvider ?? throw new ArgumentException($"Can not instantiate {typeof(InfoPageViewModel)}-object. No ressource provider availalbe."); } /// Called when page is shown. public async void OnAppearing() { InfoAgb = await GetAgb(HostName, AgbResourcePath, IsSiteCachingOn); InfoPrivacy = new HtmlWebViewSource { Html = !string.IsNullOrEmpty(PrivacyResourcePath) ? await ViewModelHelper.GetSource( $"https://{HostName}/{PrivacyResourcePath}", // "site/privacy.html" IsSiteCachingOn) : await Task.FromResult(ViewModelHelper.FromBody("No privacy resource available. Resource path is null or empty.")) }; InfoImpressum = new HtmlWebViewSource { Html = !string.IsNullOrEmpty(ImpressResourcePath) ? await ViewModelHelper.GetSource( $"https://{HostName}/{ImpressResourcePath}", // "site/impress.html" IsSiteCachingOn) : await Task.FromResult(ViewModelHelper.FromBody("No impress resource available. Resource path is null or empty.")) }; } /// Gets the AGBs /// /// AGBs public static async Task GetAgb( string hostName, string agbResourcePath, bool isSiteCachingOn) { return new HtmlWebViewSource { Html = !string.IsNullOrEmpty(agbResourcePath) ? await ViewModelHelper.GetSource( $"https://{hostName}/{agbResourcePath}", // "agb.html" isSiteCachingOn) : await Task.FromResult(ViewModelHelper.FromBody("No terms resource available. Resource path is null or empty.")) }; } /// Gets the platfrom specific prefix. private Func ResourceProvider { get; set; } /// Gets the app related information (app version and licenses). public HtmlWebViewSource InfoLicenses => new HtmlWebViewSource { Html = ResourceProvider("HtmlResouces.V02.InfoLicenses.html") .Replace("CURRENT_VERSION_TINKAPP", DependencyService.Get().Version.ToString()) .Replace("ACTIVE_APPNAME", AppInfo.Name) }; /// Privacy text. private HtmlWebViewSource infoImpress; /// Gets the privacy related information. public HtmlWebViewSource InfoImpressum { get => infoImpress; set { infoImpress = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(InfoImpressum))); } } /// Agb information text. private HtmlWebViewSource infoAgb; /// Privacy text. private HtmlWebViewSource infoPrivacy; /// Agb information text. public HtmlWebViewSource InfoAgb { get => infoAgb; set { infoAgb = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(InfoAgb))); } } /// Agb information text. public HtmlWebViewSource InfoPrivacy { get => infoPrivacy; set { infoPrivacy = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(InfoPrivacy))); } } } }