Skip to content

Commit 6260a71

Browse files
committed
Minor improvements to HealthPage
1 parent 02e44d8 commit 6260a71

3 files changed

Lines changed: 132 additions & 133 deletions

File tree

src/Platforms/SecureFolderFS.Maui/Views/Vault/HealthPage.xaml

Lines changed: 119 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -69,143 +69,130 @@
6969
</DataTemplate>
7070
</ContentPage.Resources>
7171

72-
<Grid>
72+
<Grid Padding="16">
7373
<Grid.RowDefinitions>
74-
<RowDefinition />
7574
<RowDefinition Height="Auto" />
75+
<RowDefinition />
7676
</Grid.RowDefinitions>
7777

78-
<Grid Padding="16" RowSpacing="32">
79-
<Grid.RowDefinitions>
80-
<RowDefinition Height="Auto" />
81-
<RowDefinition />
82-
</Grid.RowDefinitions>
83-
84-
<!-- Status card -->
85-
<Border
86-
x:Name="StatusCard"
87-
Grid.Row="0"
88-
Margin="0,4,0,0"
89-
StrokeThickness="0"
90-
VerticalOptions="Start">
91-
<Border.StrokeShape>
92-
<RoundRectangle CornerRadius="12" />
93-
</Border.StrokeShape>
94-
95-
<Grid>
96-
<!-- Gradient background (set from code-behind) -->
97-
<BoxView x:Name="GradientBackground" CornerRadius="12" />
98-
99-
<!-- Shimmer sweep overlay -->
100-
<BoxView
101-
x:Name="ShimmerOverlay"
102-
CornerRadius="12"
103-
IsVisible="False"
104-
Opacity="0.18">
105-
<BoxView.Background>
106-
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
107-
<GradientStop Offset="0.0" Color="Transparent" />
108-
<GradientStop Offset="0.4" Color="White" />
109-
<GradientStop Offset="0.6" Color="White" />
110-
<GradientStop Offset="1.0" Color="Transparent" />
111-
</LinearGradientBrush>
112-
</BoxView.Background>
113-
</BoxView>
114-
115-
<!-- Content row -->
116-
<Grid Padding="16,14" ColumnSpacing="14">
117-
<Grid.ColumnDefinitions>
118-
<ColumnDefinition Width="Auto" />
119-
<ColumnDefinition />
120-
<ColumnDefinition Width="Auto" />
121-
</Grid.ColumnDefinitions>
122-
123-
<!-- Severity icon -->
124-
<Image
125-
Grid.Column="0"
126-
HeightRequest="32"
127-
Source="{Binding ViewModel.HealthViewModel.Severity, Mode=OneWay, Converter={StaticResource SeverityHealthIconConverter}}"
128-
VerticalOptions="Center"
129-
WidthRequest="32" />
130-
131-
<!-- Title + subtitle -->
132-
<VerticalStackLayout
133-
Grid.Column="1"
134-
Spacing="2"
135-
VerticalOptions="Center">
136-
<Label
137-
FontAttributes="Bold"
138-
FontSize="16"
139-
Text="{Binding ViewModel.HealthViewModel.StatusTitle, Mode=OneWay}"
140-
TextColor="White" />
141-
<Label
142-
FontSize="13"
143-
IsVisible="{Binding ViewModel.HealthViewModel.Subtitle, Mode=OneWay, Converter={StaticResource NullToBoolConverter}}"
144-
Opacity="0.75"
145-
Text="{Binding ViewModel.HealthViewModel.Subtitle, Mode=OneWay}"
146-
TextColor="White" />
147-
</VerticalStackLayout>
148-
149-
<!-- Options button -->
150-
<apesui:ContextMenuContainer Grid.Column="2" VerticalOptions="Center">
151-
<apesui:ContextMenuContainer.MenuItems>
152-
<apesui:ContextMenuItem Command="{Binding ViewModel.HealthViewModel.StartScanningCommand, Mode=OneWay}" Text="Scan vault" />
153-
<apesui:ContextMenuItem
154-
Command="{Binding ViewModel.HealthViewModel.StartScanningCommand, Mode=OneWay}"
155-
CommandParameter="include_file_contents"
156-
Text="Scan full vault (include file contents)" />
157-
<apesui:ContextMenuItem Command="{Binding ViewModel.HealthViewModel.CancelScanningCommand, Mode=OneWay}" Text="Cancel scan" />
158-
</apesui:ContextMenuContainer.MenuItems>
159-
<apesui:ContextMenuContainer.Content>
160-
<Border
161-
Padding="8,6"
162-
BackgroundColor="#22FFFFFF"
163-
StrokeThickness="0">
164-
<Border.StrokeShape>
165-
<RoundRectangle CornerRadius="8" />
166-
</Border.StrokeShape>
167-
<Grid>
168-
<mi:MauiIcon
169-
Icon="{mi_material:Material MoreVert}"
170-
IconColor="White"
171-
IconSize="20"
172-
OnPlatforms="Android" />
173-
<mi:MauiIcon
174-
Icon="{mi_cupertino:Cupertino Ellipsis}"
175-
IconColor="White"
176-
IconSize="20"
177-
OnPlatforms="iOS" />
178-
</Grid>
179-
</Border>
180-
</apesui:ContextMenuContainer.Content>
181-
</apesui:ContextMenuContainer>
182-
</Grid>
78+
<apesui:ContextMenuContainer Grid.Row="0" VerticalOptions="Center">
79+
<apesui:ContextMenuContainer.MenuItems>
80+
<apesui:ContextMenuItem
81+
Command="{Binding ViewModel.HealthViewModel.StartScanningCommand, Mode=OneWay}"
82+
CommandParameter="include_file_contents"
83+
Text="Scan full vault (include file contents)" />
84+
</apesui:ContextMenuContainer.MenuItems>
85+
<apesui:ContextMenuContainer.Content>
86+
<Grid RowSpacing="32">
87+
<Grid.RowDefinitions>
88+
<RowDefinition Height="Auto" />
89+
<RowDefinition />
90+
</Grid.RowDefinitions>
91+
92+
<!-- Status card -->
93+
<Border
94+
x:Name="StatusCard"
95+
Grid.Row="0"
96+
Margin="0,4,0,0"
97+
StrokeThickness="0"
98+
VerticalOptions="Start">
99+
<Border.StrokeShape>
100+
<RoundRectangle CornerRadius="12" />
101+
</Border.StrokeShape>
102+
103+
<Grid>
104+
<!-- Gradient background (set from code-behind) -->
105+
<BoxView x:Name="GradientBackground" CornerRadius="12" />
106+
107+
<!-- Shimmer sweep overlay -->
108+
<BoxView
109+
x:Name="ShimmerOverlay"
110+
CornerRadius="12"
111+
IsVisible="False"
112+
Opacity="0.18">
113+
<BoxView.Background>
114+
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
115+
<GradientStop Offset="0.0" Color="Transparent" />
116+
<GradientStop Offset="0.4" Color="White" />
117+
<GradientStop Offset="0.6" Color="White" />
118+
<GradientStop Offset="1.0" Color="Transparent" />
119+
</LinearGradientBrush>
120+
</BoxView.Background>
121+
</BoxView>
122+
123+
<!-- Content row -->
124+
<Grid Padding="16,14" ColumnSpacing="14">
125+
<Grid.ColumnDefinitions>
126+
<ColumnDefinition Width="Auto" />
127+
<ColumnDefinition />
128+
<ColumnDefinition Width="Auto" />
129+
</Grid.ColumnDefinitions>
130+
131+
<!-- Severity icon -->
132+
<Image
133+
Grid.Column="0"
134+
HeightRequest="32"
135+
Source="{Binding ViewModel.HealthViewModel.Severity, Mode=OneWay, Converter={StaticResource SeverityHealthIconConverter}}"
136+
VerticalOptions="Center"
137+
WidthRequest="32" />
138+
139+
<!-- Title + subtitle -->
140+
<VerticalStackLayout
141+
Grid.Column="1"
142+
Spacing="2"
143+
VerticalOptions="Center">
144+
<Label
145+
FontAttributes="Bold"
146+
FontSize="16"
147+
Text="{Binding ViewModel.HealthViewModel.StatusTitle, Mode=OneWay}"
148+
TextColor="White" />
149+
<Label
150+
FontSize="13"
151+
IsVisible="{Binding ViewModel.HealthViewModel.Subtitle, Mode=OneWay, Converter={StaticResource NullToBoolConverter}}"
152+
Opacity="0.75"
153+
Text="{Binding ViewModel.HealthViewModel.Subtitle, Mode=OneWay}"
154+
TextColor="White" />
155+
</VerticalStackLayout>
156+
</Grid>
157+
</Grid>
158+
159+
<Border.Behaviors>
160+
<mtk:TouchBehavior
161+
DefaultAnimationDuration="150"
162+
DefaultBackgroundColor="{AppThemeBinding Light={StaticResource LightTransparentColor},
163+
Dark={StaticResource DarkTransparentColor}}"
164+
PressedAnimationDuration="150"
165+
PressedBackgroundColor="{AppThemeBinding Light={StaticResource ShimFillSecondaryLightColor},
166+
Dark={StaticResource ShimFillSecondaryDarkColor}}"
167+
TouchGestureCompleted="StatusCard_TouchGestureCompleted" />
168+
</Border.Behaviors>
169+
</Border>
183170
</Grid>
184-
</Border>
185-
186-
<!-- Issues list -->
187-
<Grid Grid.Row="1">
188-
<uco:OptionsContainer
189-
Title="{l:ResourceString Rid=FoundIssues}"
190-
IsVisible="{Binding ViewModel.HealthViewModel.FoundIssues.Count, Mode=OneWay, Converter={StaticResource CountToBoolConverter}}"
191-
VerticalOptions="Fill">
192-
<uco:OptionsContainer.InnerContent>
193-
<CollectionView ItemSizingStrategy="MeasureFirstItem" ItemsSource="{Binding ViewModel.HealthViewModel.FoundIssues, Mode=OneWay}">
194-
<CollectionView.ItemTemplate>
195-
<ts:HealthIssueTemplateSelector
196-
DirectoryIssueTemplate="{StaticResource DirectoryIssueTemplate}"
197-
IssueTemplate="{StaticResource IssueTemplate}"
198-
NameIssueTemplate="{StaticResource NameIssueTemplate}" />
199-
</CollectionView.ItemTemplate>
200-
</CollectionView>
201-
</uco:OptionsContainer.InnerContent>
202-
</uco:OptionsContainer>
203-
<Label
204-
FontSize="18"
205-
HorizontalOptions="Center"
206-
IsVisible="{Binding ViewModel.HealthViewModel.FoundIssues.Count, Mode=OneWay, Converter={StaticResource CountToBoolConverter}, ConverterParameter='invert'}"
207-
Text="{l:ResourceString Rid=NoIssuesFound}" />
208-
</Grid>
171+
</apesui:ContextMenuContainer.Content>
172+
</apesui:ContextMenuContainer>
173+
174+
<!-- Issues list -->
175+
<Grid Grid.Row="1">
176+
<uco:OptionsContainer
177+
Title="{l:ResourceString Rid=FoundIssues}"
178+
IsVisible="{Binding ViewModel.HealthViewModel.FoundIssues.Count, Mode=OneWay, Converter={StaticResource CountToBoolConverter}}"
179+
VerticalOptions="Fill">
180+
<uco:OptionsContainer.InnerContent>
181+
<CollectionView ItemSizingStrategy="MeasureFirstItem" ItemsSource="{Binding ViewModel.HealthViewModel.FoundIssues, Mode=OneWay}">
182+
<CollectionView.ItemTemplate>
183+
<ts:HealthIssueTemplateSelector
184+
DirectoryIssueTemplate="{StaticResource DirectoryIssueTemplate}"
185+
IssueTemplate="{StaticResource IssueTemplate}"
186+
NameIssueTemplate="{StaticResource NameIssueTemplate}" />
187+
</CollectionView.ItemTemplate>
188+
</CollectionView>
189+
</uco:OptionsContainer.InnerContent>
190+
</uco:OptionsContainer>
191+
<Label
192+
FontSize="18"
193+
HorizontalOptions="Center"
194+
IsVisible="{Binding ViewModel.HealthViewModel.FoundIssues.Count, Mode=OneWay, Converter={StaticResource CountToBoolConverter}, ConverterParameter='invert'}"
195+
Text="{l:ResourceString Rid=NoIssuesFound}" />
209196
</Grid>
210197

211198
<VerticalStackLayout

src/Platforms/SecureFolderFS.Maui/Views/Vault/HealthPage.xaml.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using CommunityToolkit.Maui.Core;
12
using SecureFolderFS.Maui.Extensions;
23
using SecureFolderFS.Maui.Helpers;
34
using SecureFolderFS.Sdk.Enums;
@@ -95,6 +96,17 @@ private void StopShimmer()
9596
ShimmerOverlay.CancelAnimations();
9697
}
9798

99+
private void StatusCard_TouchGestureCompleted(object? sender, TouchGestureCompletedEventArgs e)
100+
{
101+
if (ViewModel is null)
102+
return;
103+
104+
if (ViewModel.HealthViewModel.IsProgressing)
105+
ViewModel.HealthViewModel.CancelScanningCommand.Execute(null);
106+
else
107+
ViewModel.HealthViewModel.StartScanningCommand.Execute(null);
108+
}
109+
98110
private void HealthViewModel_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
99111
{
100112
if (sender is not VaultHealthViewModel viewModel)

src/Platforms/SecureFolderFS.UI/ServiceImplementation/DebugIapService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public sealed class DebugIapService : IIapService
1111
/// <inheritdoc/>
1212
public Task<bool> IsOwnedAsync(IapProductType productType, CancellationToken cancellationToken = default)
1313
{
14-
return Task.FromResult(false);
14+
return Task.FromResult(true);
1515
}
1616

1717
/// <inheritdoc/>

0 commit comments

Comments
 (0)