using Bit.Core; using Bit.Core.Abstractions; using Bit.Core.Utilities; using System; using System.Threading.Tasks; using Xamarin.Forms; namespace Bit.App.Pages { public class BaseContentPage : ContentPage { private IStorageService _storageService; protected int AndroidShowModalAnimationDelay = 400; protected int AndroidShowPageAnimationDelay = 100; public DateTime? LastPageAction { get; set; } protected override void OnAppearing() { base.OnAppearing(); SaveActivity(); } protected override void OnDisappearing() { base.OnDisappearing(); SaveActivity(); } public bool DoOnce(Action action = null, int milliseconds = 1000) { if(LastPageAction.HasValue && (DateTime.UtcNow - LastPageAction.Value).TotalMilliseconds < milliseconds) { // Last action occurred recently. return false; } LastPageAction = DateTime.UtcNow; action?.Invoke(); return true; } protected void SetActivityIndicator(ContentView targetView = null) { var indicator = new ActivityIndicator { IsRunning = true, VerticalOptions = LayoutOptions.CenterAndExpand, HorizontalOptions = LayoutOptions.Center }; if(targetView != null) { targetView.Content = indicator; } else { Content = indicator; } } protected async Task LoadOnAppearedAsync(View sourceView, bool fromModal, Func workFunction, ContentView targetView = null) { async Task DoWorkAsync() { await workFunction.Invoke(); if(sourceView != null) { if(targetView != null) { targetView.Content = sourceView; } else { Content = sourceView; } } } if(Device.RuntimePlatform == Device.iOS) { await DoWorkAsync(); return; } await Task.Run(async () => { await Task.Delay(fromModal ? AndroidShowModalAnimationDelay : AndroidShowPageAnimationDelay); Device.BeginInvokeOnMainThread(async () => await DoWorkAsync()); }); } protected void RequestFocus(InputView input) { if(Device.RuntimePlatform == Device.iOS) { input.Focus(); return; } Task.Run(async () => { await Task.Delay(AndroidShowModalAnimationDelay); Device.BeginInvokeOnMainThread(() => input.Focus()); }); } private void SetStorageService() { if(_storageService == null) { _storageService = ServiceContainer.Resolve("storageService"); } } private void SaveActivity() { SetStorageService(); _storageService.SaveAsync(Constants.LastActiveKey, DateTime.UtcNow); } } }