-
Notifications
You must be signed in to change notification settings - Fork 386
/
StatusBarBehavior.shared.cs
162 lines (140 loc) · 4.4 KB
/
StatusBarBehavior.shared.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using CommunityToolkit.Maui.Core;
using CommunityToolkit.Maui.Core.Platform;
using CommunityToolkit.Maui.Extensions;
namespace CommunityToolkit.Maui.Behaviors;
/// <summary>
/// When to apply the status bar color and style.
/// </summary>
public enum StatusBarApplyOn
{
/// <summary>
/// Apply color and style when the behavior has been attached to the page.
/// </summary>
OnBehaviorAttachedTo,
/// <summary>
/// Apply color and style when the page has been navigated to.
/// </summary>
OnPageNavigatedTo
}
/// <summary>
/// <see cref="PlatformBehavior{TView,TPlatformView}"/> that controls the Status bar color
/// </summary>
[UnsupportedOSPlatform("Windows"), UnsupportedOSPlatform("MacCatalyst"), UnsupportedOSPlatform("MacOS"), UnsupportedOSPlatform("Tizen")]
public class StatusBarBehavior : BasePlatformBehavior<Page>
{
/// <summary>
/// <see cref="BindableProperty"/> that manages the StatusBarColor property.
/// </summary>
public static readonly BindableProperty StatusBarColorProperty =
BindableProperty.Create(nameof(StatusBarColor), typeof(Color), typeof(StatusBarBehavior), Colors.Transparent);
/// <summary>
/// <see cref="BindableProperty"/> that manages the StatusBarColor property.
/// </summary>
public static readonly BindableProperty StatusBarStyleProperty =
BindableProperty.Create(nameof(StatusBarStyle), typeof(StatusBarStyle), typeof(StatusBarBehavior), StatusBarStyle.Default);
/// <summary>
/// <see cref="BindableProperty"/> that manages the ApplyOn property.
/// </summary>
public static readonly BindableProperty ApplyOnProperty =
BindableProperty.Create(nameof(ApplyOn), typeof(StatusBarApplyOn), typeof(StatusBarBehavior), StatusBarApplyOn.OnBehaviorAttachedTo);
/// <summary>
/// Property that holds the value of the Status bar color.
/// </summary>
public Color StatusBarColor
{
get => (Color)GetValue(StatusBarColorProperty);
set => SetValue(StatusBarColorProperty, value);
}
/// <summary>
/// Property that holds the value of the Status bar color.
/// </summary>
public StatusBarStyle StatusBarStyle
{
get => (StatusBarStyle)GetValue(StatusBarStyleProperty);
set => SetValue(StatusBarStyleProperty, value);
}
/// <summary>
/// When the status bar color and style should be applied.
/// </summary>
public StatusBarApplyOn ApplyOn
{
get => (StatusBarApplyOn)GetValue(ApplyOnProperty);
set => SetValue(ApplyOnProperty, value);
}
#if !(WINDOWS || MACCATALYST || TIZEN)
/// <inheritdoc />
#if IOS
protected override void OnAttachedTo(Page bindable, UIKit.UIView platformView)
#elif ANDROID
protected override void OnAttachedTo(Page bindable, Android.Views.View platformView)
#else
protected override void OnAttachedTo(Page bindable, object platformView)
#endif
{
base.OnAttachedTo(bindable, platformView);
if (ApplyOn == StatusBarApplyOn.OnBehaviorAttachedTo)
{
StatusBar.SetColor(StatusBarColor);
StatusBar.SetStyle(StatusBarStyle);
}
bindable.NavigatedTo += OnPageNavigatedTo;
#if IOS
bindable.SizeChanged += OnPageSizeChanged;
#endif
}
/// <inheritdoc />
#if IOS
protected override void OnDetachedFrom(Page bindable, UIKit.UIView platformView)
#elif ANDROID
protected override void OnDetachedFrom(Page bindable, Android.Views.View platformView)
#else
protected override void OnDetachedFrom(Page bindable, object platformView)
#endif
{
#if IOS
bindable.SizeChanged -= OnPageSizeChanged;
#endif
base.OnDetachedFrom(bindable, platformView);
bindable.NavigatedTo -= OnPageNavigatedTo;
}
#if IOS
void OnPageSizeChanged(object? sender, EventArgs e)
{
StatusBar.UpdateBarSize();
}
#endif
void OnPageNavigatedTo(object? sender, NavigatedToEventArgs e)
{
if (ApplyOn == StatusBarApplyOn.OnPageNavigatedTo)
{
StatusBar.SetColor(StatusBarColor);
StatusBar.SetStyle(StatusBarStyle);
}
}
/// <inheritdoc />
protected override void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (string.IsNullOrWhiteSpace(propertyName))
{
return;
}
#if ANDROID
if (Platform.CurrentActivity is null)
{
return;
}
#endif
if (propertyName.IsOneOf(StatusBarColorProperty, VisualElement.WidthProperty, VisualElement.HeightProperty))
{
StatusBar.SetColor(StatusBarColor);
}
else if (propertyName == StatusBarStyleProperty.PropertyName)
{
StatusBar.SetStyle(StatusBarStyle);
}
}
#endif
}