MobilePage.xaml.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using InABox.Mobile.Shared;
  5. using Syncfusion.XForms.Core;
  6. using Syncfusion.XForms.PopupLayout;
  7. using Xamarin.CommunityToolkit.UI.Views;
  8. using Xamarin.Forms;
  9. using Xamarin.Forms.Xaml;
  10. using XF.Material.Forms.UI.Dialogs;
  11. namespace InABox.Mobile
  12. {
  13. // public class BackButtonClickedEventArgs : CancelEventArgs
  14. // {
  15. //
  16. // }
  17. //
  18. // public delegate void BackButtonClickedEvent(object sender, BackButtonClickedEventArgs args);
  19. [XamlCompilation(XamlCompilationOptions.Compile)]
  20. public partial class MobilePage
  21. {
  22. public static IModelHost Host { get; set; }
  23. public IList<View> AlternateMenu => _alternateMenu.Children;
  24. public IList<View> PrimaryMenu => _primaryMenu.Children;
  25. public IList<View> PageContent => _content.Children;
  26. public bool BackButtonEnabled
  27. {
  28. get => _backButton.IsVisible;
  29. set => _backButton.IsVisible = value;
  30. }
  31. public MobilePage()
  32. {
  33. InitializeComponent();
  34. activity_indicator.BackgroundColor = XF.Material.Forms.Material.Color.Primary;
  35. activity_indicator.TextColor = XF.Material.Forms.Material.Color.OnPrimary;
  36. _titleBar.BackgroundColor = XF.Material.Forms.Material.Color.Primary;
  37. _titleLabel.TextColor = XF.Material.Forms.Material.Color.OnPrimary;
  38. BackgroundColor = Color.WhiteSmoke;
  39. }
  40. protected override void OnAppearing()
  41. {
  42. ProgressVisible = false;
  43. XF.Material.Forms.Material.PlatformConfiguration.ChangeStatusBarColor(XF.Material.Forms.Material.Color.PrimaryVariant);
  44. UpdateBackgroundUpdateStatus();
  45. Host.BackgroundUpdateStatusChanged += BackgroundUpdateStatusChanged;
  46. UpdateTransportStatus();
  47. Host.TransportConnected += TransportConnected;
  48. Host.TransportDisconnected += TransportDisconnected;
  49. base.OnAppearing();
  50. }
  51. protected override void OnDisappearing()
  52. {
  53. ProgressVisible = false;
  54. Host.BackgroundUpdateStatusChanged -= BackgroundUpdateStatusChanged;
  55. Host.TransportConnected -= TransportConnected;
  56. Host.TransportDisconnected -= TransportDisconnected;
  57. base.OnDisappearing();
  58. }
  59. private void TransportDisconnected(TransportDisconnectedEventArgs args) => UpdateConnectionStatus();
  60. private void TransportConnected(TransportConnectedEventArgs args) => UpdateConnectionStatus();
  61. private void UpdateConnectionStatus()
  62. {
  63. Device.BeginInvokeOnMainThread(UpdateTransportStatus);
  64. }
  65. protected virtual void UpdateTransportStatus()
  66. {
  67. _connectionIndicator.IsVisible = !Host.IsConnected();
  68. }
  69. private void BackgroundUpdateStatusChanged(object sender, EventArgs args)
  70. {
  71. Device.BeginInvokeOnMainThread(UpdateBackgroundUpdateStatus);
  72. }
  73. private void UpdateBackgroundUpdateStatus()
  74. {
  75. _updateIndicator.IsVisible = Host.IsBackgroundUpdateStatusActive;
  76. }
  77. private async void _backButton_OnClicked(object sender, EventArgs e)
  78. {
  79. if (await OnBackButtonClicked())
  80. Navigation.PopAsync();
  81. // if (OnBackButtonPressed())
  82. // {
  83. // if (await ConfirmChanges())
  84. // var args = new BackButtonClickedEventArgs() { Cancel = false };
  85. // BackButtonClicked?.Invoke(this, args);
  86. // if (!args.Cancel)
  87. //
  88. // }
  89. }
  90. protected virtual async Task<bool> OnBackButtonClicked()
  91. {
  92. return true;
  93. }
  94. protected async Task<bool> ConfirmChanges(IShell item)
  95. {
  96. if (item.IsChanged())
  97. {
  98. var choice = await MaterialDialog.Instance.SelectActionAsync("Confirm Cancel?",
  99. new string[] { "Yes, Cancel", "Keep Editing", "Save Changes" });
  100. if (choice == 0)
  101. item.Cancel();
  102. else if (choice == 2)
  103. item.Save("Saved on Mobile Device");
  104. else // Cancel (choice==1) or Tap outside box
  105. return false;
  106. Dispatcher.BeginInvokeOnMainThread(() => Navigation.PopAsync());
  107. return false;
  108. }
  109. return true;
  110. }
  111. protected void ShowPopup(Func<View> view, PopupManagerConfiguration config = null)
  112. => PopupManager.ShowPopup(this, view, config);
  113. protected void DismissPopup()
  114. => PopupManager.DismissPopup();
  115. public bool ProgressVisible
  116. {
  117. get => activity_indicator.IsBusy;
  118. set
  119. {
  120. activity_frame.IsVisible = value;
  121. activity_indicator.IsBusy = value;
  122. }
  123. }
  124. }
  125. }