From b72f2bc99e54db4a71707b2450c010eb51d02674 Mon Sep 17 00:00:00 2001 From: "Zach Keeping [SSW]" <11418832+zacharykeeping@users.noreply.github.com> Date: Fri, 6 Sep 2024 10:00:44 +1000 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Mobile=20|=20Update=20My?= =?UTF-8?q?=20QR=20Code=20button=20to=20use=20new=20scanner=20page=20(#102?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Set flyout button to open scan page with qr code tab selected * Remove old QR code popup * Set brightness on qr code * Fix camera on scan detection * Move to variable * Cleanup --- .../Controls/SegmentedControl.xaml.cs | 26 +++++---- src/MobileUI/DependencyInjection.cs | 6 +- .../Features/Flyout/FlyoutFooterViewModel.cs | 15 ++--- .../Features/Redeem/RedeemRewardViewModel.cs | 3 +- src/MobileUI/Features/Scanner/QrCodePage.xaml | 58 ------------------- .../Features/Scanner/QrCodePage.xaml.cs | 42 -------------- .../Features/Scanner/QrCodeViewModel.cs | 25 -------- src/MobileUI/Features/Scanner/ScanPage.xaml | 2 +- .../Features/Scanner/ScanPage.xaml.cs | 7 ++- .../Features/Scanner/ScanViewModel.cs | 56 ++++++++++-------- 10 files changed, 69 insertions(+), 171 deletions(-) delete mode 100644 src/MobileUI/Features/Scanner/QrCodePage.xaml delete mode 100644 src/MobileUI/Features/Scanner/QrCodePage.xaml.cs delete mode 100644 src/MobileUI/Features/Scanner/QrCodeViewModel.cs diff --git a/src/MobileUI/Controls/SegmentedControl.xaml.cs b/src/MobileUI/Controls/SegmentedControl.xaml.cs index 81be83a4..5372400b 100644 --- a/src/MobileUI/Controls/SegmentedControl.xaml.cs +++ b/src/MobileUI/Controls/SegmentedControl.xaml.cs @@ -14,9 +14,14 @@ public SegmentedControl() public event EventHandler SelectionChanged; - [AutoBindable(DefaultBindingMode = "TwoWay")] + [AutoBindable(DefaultBindingMode = "TwoWay", OnChanged = nameof(SegmentChanged))] private Segment _selectedSegment; + private void SegmentChanged(Segment segment) + { + SetSelected(segment); + } + [AutoBindable(OnChanged = nameof(SegmentsChanged))] private List _segments; private void SegmentsChanged(List segments) @@ -43,6 +48,14 @@ private void Segment_Tapped(object sender, TappedEventArgs e) { var segment = e.Parameter as Segment; + SetSelected(segment); + + SelectedSegment = segment; + SelectionChanged?.Invoke(this, segment); + } + + private void SetSelected(Segment segment) + { if (segment == null) { return; @@ -50,19 +63,10 @@ private void Segment_Tapped(object sender, TappedEventArgs e) foreach (var item in Segments) { - if (item == segment) - { - item.IsSelected = true; - } - else - { - item.IsSelected = false; - } + item.IsSelected = item == segment; } segment.IsSelected = true; - SelectedSegment = segment; - SelectionChanged?.Invoke(this, segment); } } diff --git a/src/MobileUI/DependencyInjection.cs b/src/MobileUI/DependencyInjection.cs index 97fa25a7..199a2611 100644 --- a/src/MobileUI/DependencyInjection.cs +++ b/src/MobileUI/DependencyInjection.cs @@ -29,7 +29,9 @@ public static IServiceCollection AddDependencies(this IServiceCollection service typeof(OthersProfileViewModel), typeof(ProfileViewModelBase), typeof(QuizDetailsPage), - typeof(QuizDetailsViewModel) + typeof(QuizDetailsViewModel), + typeof(ScanPage), + typeof(ScanViewModel) }; var definedTypes = Assembly.GetExecutingAssembly().DefinedTypes @@ -44,6 +46,8 @@ public static IServiceCollection AddDependencies(this IServiceCollection service services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/MobileUI/Features/Flyout/FlyoutFooterViewModel.cs b/src/MobileUI/Features/Flyout/FlyoutFooterViewModel.cs index adbc914c..66f24a75 100644 --- a/src/MobileUI/Features/Flyout/FlyoutFooterViewModel.cs +++ b/src/MobileUI/Features/Flyout/FlyoutFooterViewModel.cs @@ -10,6 +10,7 @@ public partial class FlyoutFooterViewModel : ObservableObject private readonly IUserService _userService; private readonly IAuthenticationService _authService; private readonly IFirebaseAnalyticsService _firebaseAnalyticsService; + private readonly IPermissionsService _permissionsService; [ObservableProperty] private bool _isStaff; @@ -17,11 +18,12 @@ public partial class FlyoutFooterViewModel : ObservableObject [ObservableProperty] private string _versionNumber; - public FlyoutFooterViewModel(IUserService userService, IAuthenticationService authService, IFirebaseAnalyticsService firebaseAnalyticsService) + public FlyoutFooterViewModel(IUserService userService, IAuthenticationService authService, IFirebaseAnalyticsService firebaseAnalyticsService, IPermissionsService permissionsService) { _userService = userService; _authService = authService; _firebaseAnalyticsService = firebaseAnalyticsService; + _permissionsService = permissionsService; VersionNumber = $"Version {AppInfo.VersionString}"; @@ -31,12 +33,11 @@ public FlyoutFooterViewModel(IUserService userService, IAuthenticationService au [RelayCommand] private async Task MyQrCodeTapped() { - if (!IsStaff) - return; - - Application.Current.Resources.TryGetValue("Background", out var statusBarColor); - var popup = new QrCodePage(new QrCodeViewModel(_userService), _firebaseAnalyticsService, statusBarColor as Color); - await MopupService.Instance.PushAsync(popup); + var granted = await _permissionsService.CheckAndRequestPermission(); + if (granted) + { + await App.Current.MainPage.Navigation.PushModalAsync(ScanPageSegments.MyCode); + } } [RelayCommand] diff --git a/src/MobileUI/Features/Redeem/RedeemRewardViewModel.cs b/src/MobileUI/Features/Redeem/RedeemRewardViewModel.cs index 9d307c78..02ca4288 100644 --- a/src/MobileUI/Features/Redeem/RedeemRewardViewModel.cs +++ b/src/MobileUI/Features/Redeem/RedeemRewardViewModel.cs @@ -20,6 +20,7 @@ public partial class RedeemRewardViewModel( { private Reward _reward; private float _defaultBrightness; + private const float MaxBrightness = 1.0f; [ObservableProperty] private string _image; @@ -101,7 +102,7 @@ public void OnDisappearing() private void ShowQrCode(string qrCode = null) { - ScreenBrightness.Default.Brightness = 1; + ScreenBrightness.Default.Brightness = MaxBrightness; IsHeaderVisible = false; IsBalanceVisible = false; diff --git a/src/MobileUI/Features/Scanner/QrCodePage.xaml b/src/MobileUI/Features/Scanner/QrCodePage.xaml deleted file mode 100644 index 124b5f90..00000000 --- a/src/MobileUI/Features/Scanner/QrCodePage.xaml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/MobileUI/Features/Scanner/QrCodePage.xaml.cs b/src/MobileUI/Features/Scanner/QrCodePage.xaml.cs deleted file mode 100644 index b5d5e3f5..00000000 --- a/src/MobileUI/Features/Scanner/QrCodePage.xaml.cs +++ /dev/null @@ -1,42 +0,0 @@ -using CommunityToolkit.Maui.Behaviors; -using CommunityToolkit.Maui.Core; -using Plugin.Maui.ScreenBrightness; - -namespace SSW.Rewards.Mobile.PopupPages; - -public partial class QrCodePage -{ - private readonly Color _parentPageStatusBarColor; - private readonly IFirebaseAnalyticsService _firebaseAnalyticsService; - - private float _prevValue; - public QrCodePage(QrCodeViewModel viewModel, IFirebaseAnalyticsService firebaseAnalyticsService, Color parentPageStatusBarColor = null) - { - InitializeComponent(); - BindingContext = viewModel; - _parentPageStatusBarColor = parentPageStatusBarColor ?? Colors.Black; - _firebaseAnalyticsService = firebaseAnalyticsService; - } - - protected override void OnAppearing() - { - base.OnAppearing(); - _firebaseAnalyticsService.Log("QrCodePage"); - _prevValue = ScreenBrightness.Default.Brightness; - ScreenBrightness.Default.Brightness = 1; - } - - protected override void OnDisappearing() - { - base.OnDisappearing(); - ScreenBrightness.Default.Brightness = _prevValue; - - // Change status bar back - this.Behaviors.Clear(); - this.Behaviors.Add(new StatusBarBehavior - { - StatusBarColor = _parentPageStatusBarColor, - StatusBarStyle = StatusBarStyle.LightContent, - }); - } -} \ No newline at end of file diff --git a/src/MobileUI/Features/Scanner/QrCodeViewModel.cs b/src/MobileUI/Features/Scanner/QrCodeViewModel.cs deleted file mode 100644 index 7a485642..00000000 --- a/src/MobileUI/Features/Scanner/QrCodeViewModel.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Mopups.Services; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; - -namespace SSW.Rewards.Mobile.ViewModels; - -public partial class QrCodeViewModel : BaseViewModel -{ - [ObservableProperty] - private ImageSource _qrCode; - - public QrCodeViewModel(IUserService userService) - { - userService.MyQrCodeObservable().Subscribe(myQrCode => - { - QrCode = ImageHelpers.GenerateQrCode(myQrCode); - }); - } - - [RelayCommand] - private static async Task ClosePopup() - { - await MopupService.Instance.PopAsync(); - } -} \ No newline at end of file diff --git a/src/MobileUI/Features/Scanner/ScanPage.xaml b/src/MobileUI/Features/Scanner/ScanPage.xaml index 9f47f73e..a3c0acf4 100644 --- a/src/MobileUI/Features/Scanner/ScanPage.xaml +++ b/src/MobileUI/Features/Scanner/ScanPage.xaml @@ -122,7 +122,7 @@ Segments="{Binding Segments}" VerticalOptions="End" HeightRequest="50" - SelectedSegment="{Binding SelectedSegment, Mode=OneWayToSource}"> + SelectedSegment="{Binding SelectedSegment}"> { private readonly ScanResultViewModel _resultViewModel; + private readonly float _defaultBrightness; private const float ZoomFactorStep = 1.0f; + private const float MaxBrightness = 1.0f; - public ScanPageSegments CurrentSegment { get; set; } = ScanPageSegments.Scan; + public ScanPageSegments CurrentSegment { get; set; } public List Segments { get; set; } = [ - new Segment + new() { Name = "Scan", Value = ScanPageSegments.Scan, Icon = new FontImageSource { FontFamily = "FluentIcons", Glyph = "\uf255" } }, - new Segment + new() { Name = "My Code", Value = ScanPageSegments.MyCode, @@ -74,6 +77,8 @@ public ScanViewModel(IUserService userService, ScanResultViewModel resultViewMod { _resultViewModel = resultViewModel; + _defaultBrightness = ScreenBrightness.Default.Brightness; + userService.MyProfilePicObservable().Subscribe(myProfilePage => ProfilePic = myProfilePage); userService.MyNameObservable().Subscribe(myName => UserName = myName); @@ -87,34 +92,41 @@ public ScanViewModel(IUserService userService, ScanResultViewModel resultViewMod public void OnAppearing() { WeakReferenceMessenger.Default.Register(this); - - if (CurrentSegment == ScanPageSegments.Scan) - { - ToggleScanner(true); - } } public void OnDisappearing() { - // Reset zoom when exiting camera - if (CurrentZoomFactor > -1) - { - RequestZoomFactor = MinZoomFactor; - } - - ToggleScanner(false); + IsCameraEnabled = false; + ScreenBrightness.Default.Brightness = _defaultBrightness; WeakReferenceMessenger.Default.Unregister(this); } private void ToggleScanner(bool toggleOn) { + IsScanVisible = toggleOn; IsCameraEnabled = toggleOn; + + ScreenBrightness.Default.Brightness = toggleOn ? _defaultBrightness : MaxBrightness; } public void Receive(EnableScannerMessage message) { ToggleScanner(true); } + + public void SetSegment(ScanPageSegments segment) + { + var matchingSegment = Segments.FirstOrDefault(s => (ScanPageSegments)s.Value == segment); + + if (matchingSegment == null) + { + return; + } + + SelectedSegment = matchingSegment; + CurrentSegment = segment; + FilterBySegment(); + } [RelayCommand] private void DetectionFinished(BarcodeResult[] result) @@ -126,8 +138,8 @@ private void DetectionFinished(BarcodeResult[] result) { return; } - - ToggleScanner(false); + + IsCameraEnabled = false; var rawValue = result.FirstOrDefault()?.RawValue; @@ -143,15 +155,13 @@ private void FilterBySegment() switch (CurrentSegment) { - case ScanPageSegments.Scan: - IsScanVisible = true; - ToggleScanner(true); - break; case ScanPageSegments.MyCode: - default: - IsScanVisible = false; ToggleScanner(false); break; + case ScanPageSegments.Scan: + default: + ToggleScanner(true); + break; } }