Skip to content

Commit

Permalink
Merge pull request #71 from aschuhardt/beta
Browse files Browse the repository at this point in the history
1.4.2 main
  • Loading branch information
aschuhardt committed Nov 27, 2023
2 parents 03fece2 + bfbf145 commit 4e677dc
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 34 deletions.
27 changes: 20 additions & 7 deletions Extensions/ContentPageExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,43 @@ namespace RosyCrow.Extensions;

internal static class ContentPageExtensions
{
private static readonly object _alertLock = new();
public static void ShowToast(this ContentPage page, string message, ToastDuration duration)
{
page.Dispatcher.Dispatch(async () => { await Toast.Make(message, duration).Show(); });
}

public static Task<bool> DisplayAlertOnMainThread(this ContentPage page, string title, string message, string cancel, string accept)
{
return MainThread.IsMainThread
? page.DisplayAlert(title, message, cancel, accept)
: MainThread.InvokeOnMainThreadAsync(() => page.DisplayAlert(title, message, cancel, accept));
lock (_alertLock)
{
return MainThread.IsMainThread
? page.DisplayAlert(title, message, cancel, accept)
: MainThread.InvokeOnMainThreadAsync(() => page.DisplayAlert(title, message, cancel, accept));
}
}

public static Task DisplayAlertOnMainThread(this ContentPage page, string title, string message, string cancel)
{
return MainThread.IsMainThread
if (!Monitor.TryEnter(_alertLock))
return Task.CompletedTask;

var result = MainThread.IsMainThread
? page.DisplayAlert(title, message, cancel)
: MainThread.InvokeOnMainThreadAsync(() => page.DisplayAlert(title, message, cancel));

Monitor.Exit(_alertLock);
return result;
}

public static Task<string> DisplayPromptOnMainThread(this ContentPage page, string title, string message, string accept = "OK",
string cancel = "Cancel", string placeholder = null, Keyboard keyboard = null, int maxLength = -1)
{
return MainThread.IsMainThread
? page.DisplayPromptAsync(title, message, accept, cancel, placeholder, maxLength)
: MainThread.InvokeOnMainThreadAsync(() => page.DisplayPromptAsync(title, message, accept, cancel, placeholder, maxLength));
lock (_alertLock)
{
return MainThread.IsMainThread
? page.DisplayPromptAsync(title, message, accept, cancel, placeholder, maxLength)
: MainThread.InvokeOnMainThreadAsync(() => page.DisplayPromptAsync(title, message, accept, cancel, placeholder, maxLength));
}
}
}
27 changes: 27 additions & 0 deletions Resources/Localization/Text.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions Resources/Localization/Text.resx
Original file line number Diff line number Diff line change
Expand Up @@ -692,4 +692,13 @@ Try again after you've granted the app permission to do so.</value>
<data name="MainPage_TrySetHomeUrl_Home_URL_cleared" xml:space="preserve">
<value>Home URL cleared</value>
</data>
<data name="BrowserView_PageWebView_OnNavigating_Cannot_Open_URL" xml:space="preserve">
<value>Cannot Open URL</value>
</data>
<data name="BrowserView_PageWebView_OnNavigating_No_app_is_configured_to_open__0__links_" xml:space="preserve">
<value>No app is configured to open {0} links.</value>
</data>
<data name="BrowserView_PageWebView_OnNavigating_OK" xml:space="preserve">
<value>OK</value>
</data>
</root>
9 changes: 8 additions & 1 deletion Resources/Raw/whats-new.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,14 @@
margin-top: 0!important;
}
</style>


<h4>Version 1.4.2 - November 26th, 2023</h4>
<ul>
<li><a class="tracker-id" href="gemini://bbs.geminispace.org/s/Rosy-Crow-Issues/36">#36</a> Modified the swipe-style tab navigation so that it doesn't interfere with horizontal scrolling. <b>Swipe left or right on the navigation bar to navigate between tabs.</b></li>
<li><a class="tracker-id" href="gemini://bbs.geminispace.org/s/Rosy-Crow-Issues/39">#39</a> Fixed a crash triggered by attempting to open a link with a scheme the device has no app for (such as gopher)</li>
<li><a class="tracker-id" href="gemini://bbs.geminispace.org/s/Rosy-Crow-Issues/41">#41</a> Prevent multiple alerts from displaying simultaneously</li>
<li>Fixed a couple of issues related to loading the active Identity on startup</li>
</ul>
<h4>Version 1.4 - October 27th, 2023</h4>
<h5>Tabs <a class="tracker-id" href="gemini://bbs.geminispace.org/s/Rosy-Crow-Issues/27">#27</a></h5>
<ul>
Expand Down
14 changes: 14 additions & 0 deletions Services/Identity/IdentityService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ internal class IdentityService : IIdentityService
private readonly IFingerprint _fingerprint;
private readonly ILogger<IdentityService> _logger;
private readonly ISettingsDatabase _settingsDatabase;
private bool _unlockingIdentity = false;

public IdentityService(IFingerprint fingerprint, ISettingsDatabase settingsDatabase,
IBrowsingDatabase browsingDatabase, ILogger<IdentityService> logger)
Expand Down Expand Up @@ -125,13 +126,26 @@ public async Task Activate(Models.Identity identity)
{
try
{
// don't attempt to load the identity we're already doing so
if (_unlockingIdentity)
return;

// the identity has already been loaded
if (ActiveCertificate != null)
return;

_unlockingIdentity = true;
_settingsDatabase.ActiveIdentityId = identity.Id;
ActiveCertificate = await LoadActiveCertificate();
}
catch (Exception e)
{
_logger.LogError(e, @"Exception thrown while activating identity {ID} ({Name})", identity.Id, identity.Name);
}
finally
{
_unlockingIdentity = false;
}
}

public async Task<Models.Identity> ImportIdentityCertificate(string name, X509Certificate2 certificate,
Expand Down
14 changes: 10 additions & 4 deletions Views/BrowserView.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -577,13 +577,19 @@ private async Task LoadInternalPage(string name = "default")

private async void PageWebView_OnNavigating(object sender, WebNavigatingEventArgs e)
{
// don't ever let the default navigation behavior happen
e.Cancel = true;

var uri = e.Url.ToUri();
if (!uri.IsAbsoluteUri || uri.Scheme is Constants.GeminiScheme or Constants.TitanScheme or Constants.InternalScheme)
_tab.Location = uri;
else
await Launcher.Default.OpenAsync(uri);

e.Cancel = true;
else if (!await Launcher.Default.TryOpenAsync(uri))
{
await _tab.ParentPage.DisplayAlertOnMainThread(
Text.BrowserView_PageWebView_OnNavigating_Cannot_Open_URL,
string.Format(Text.BrowserView_PageWebView_OnNavigating_No_app_is_configured_to_open__0__links_, uri.Scheme),
Text.BrowserView_PageWebView_OnNavigating_OK);
}
}

protected virtual void OnFindNext()
Expand Down
8 changes: 6 additions & 2 deletions Views/MainPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@
AbsoluteLayout.LayoutFlags="All" Loop="False"
ItemsSource="{Binding Tabs}"
ItemTemplate="{Binding CurrentTabViewTemplate}"
CurrentItem="{Binding CurrentTab, Mode=TwoWay}"/>
CurrentItem="{Binding CurrentTab, Mode=TwoWay}"
IsSwipeEnabled="False" />
<Grid
x:Name="PullTab" ColumnDefinitions="*,Auto" IsVisible="{Binding PullTabVisible}"
AbsoluteLayout.LayoutBounds="0,48,0.98,AutoSize" AbsoluteLayout.LayoutFlags="WidthProportional">
Expand Down Expand Up @@ -61,6 +62,9 @@
<VerticalStackLayout.GestureRecognizers>
<SwipeGestureRecognizer x:Name="SwipeDownRecognizer" Direction="Down" Command="{Binding ExpandMenu}" />
<SwipeGestureRecognizer x:Name="SwipeUpRecognizer" Direction="Up" Command="{Binding HideMenu}" />
<SwipeGestureRecognizer x:Name="SwipeRightRecognizer" Direction="Right"
Command="{Binding NavigateLeft}" />
<SwipeGestureRecognizer x:Name="SwipeLeftRecognizer" Direction="Left" Command="{Binding NavigateRight}" />
</VerticalStackLayout.GestureRecognizers>
<Grid Padding="0,2,0,0" x:Name="NavigationGrid" ColumnDefinitions="Auto,*,Auto,Auto,Auto">
<ImageButton
Expand Down Expand Up @@ -157,6 +161,6 @@
VerticalOptions="End"
SelectedTabChanged="Tabs_SelectedTabChanged"
ZIndex="10"
IsVisible="{Binding TabsEnabled}"/>
IsVisible="{Binding TabsEnabled}" />
</AbsoluteLayout>
</ContentPage>
54 changes: 34 additions & 20 deletions Views/MainPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
using CommunityToolkit.Maui.Alerts;
using CommunityToolkit.Maui.Core;
using Microsoft.Extensions.Logging;
using Microsoft.Maui.Controls.Handlers.Items;
using Microsoft.Maui.Handlers;
using RosyCrow.Extensions;
using RosyCrow.Interfaces;
Expand All @@ -32,7 +31,6 @@ public partial class MainPage : ContentPage
private readonly IBrowsingDatabase _browsingDatabase;
private readonly ILogger<MainPage> _logger;
private readonly ISettingsDatabase _settingsDatabase;
private readonly IDispatcherTimer _swipeTimer;

private ICommand _expandMenu;
private ICommand _findInPage;
Expand All @@ -57,6 +55,8 @@ public partial class MainPage : ContentPage
private ICommand _toggleBookmarked;
private ICommand _toggleMenuExpanded;
private bool _whatsNewShown;
private ICommand _navigateLeft;
private ICommand _navigateRight;

public MainPage(ISettingsDatabase settingsDatabase, IBrowsingDatabase browsingDatabase, ILogger<MainPage> logger)
{
Expand All @@ -67,24 +67,16 @@ public MainPage(ISettingsDatabase settingsDatabase, IBrowsingDatabase browsingDa
_settingsDatabase.PropertyChanged += SettingsChanged;
TabsEnabled = _settingsDatabase.TabsEnabled;

_swipeTimer = Dispatcher.CreateTimer();
_swipeTimer.Interval = TimeSpan.FromMilliseconds(500);
_swipeTimer.IsRepeating = false;
_swipeTimer.Tick += (_, _) =>
{
if (Carousel != null)
Carousel.IsSwipeEnabled = TabsEnabled && _settingsDatabase.SwipeEnabled;
};

InitializeComponent();

BindingContext = this;

Carousel.IsSwipeEnabled = TabsEnabled && _settingsDatabase.SwipeEnabled;
LoadEnteredUrl = new Command<string>(async url => await TryLoadEnteredUrl(url));
ToggleMenuExpanded = new Command(() => IsMenuExpanded = !IsMenuExpanded);
HideMenu = new Command(() => IsMenuExpanded = false);
ExpandMenu = new Command(() => IsMenuExpanded = true);
NavigateLeft = new Command(() => Carousel.Position--, () => TabsEnabled && _settingsDatabase.SwipeEnabled && Carousel.Position > 0);
NavigateRight = new Command(() => Carousel.Position++, () => TabsEnabled && _settingsDatabase.SwipeEnabled && Carousel.Position < Tabs.Count - 1);
LoadHomeUrl = new Command(TryLoadHomeUrl);
SetHomeUrl = new Command(TrySetHomeUrl);
ToggleBookmarked = new Command(TryToggleBookmarked);
Expand All @@ -111,6 +103,12 @@ public MainPage(ISettingsDatabase settingsDatabase, IBrowsingDatabase browsingDa
HomeButton.GestureRecognizers.Add(SwipeUpRecognizer);
BookmarkButton.GestureRecognizers.Add(SwipeDownRecognizer);
BookmarkButton.GestureRecognizers.Add(SwipeUpRecognizer);
UrlEntry.GestureRecognizers.Add(SwipeLeftRecognizer);
UrlEntry.GestureRecognizers.Add(SwipeRightRecognizer);
HomeButton.GestureRecognizers.Add(SwipeLeftRecognizer);
HomeButton.GestureRecognizers.Add(SwipeRightRecognizer);
BookmarkButton.GestureRecognizers.Add(SwipeLeftRecognizer);
BookmarkButton.GestureRecognizers.Add(SwipeRightRecognizer);

foreach (var button in ExpandableMenu.Children.Where(v => v is Button).Cast<Button>())
{
Expand All @@ -128,13 +126,6 @@ public MainPage(ISettingsDatabase settingsDatabase, IBrowsingDatabase browsingDa
IsNavBarVisible = false;
else if (args.ScrollY < args.OldScrollY - 20 || args.ScrollY == 0)
IsNavBarVisible = true;
if (TabsEnabled)
{
Carousel.IsSwipeEnabled = false;
_swipeTimer.Stop();
_swipeTimer.Start();
}
};
#endif
});
Expand Down Expand Up @@ -334,6 +325,30 @@ public ICommand HideMenu
}
}

public ICommand NavigateLeft
{
get => _navigateLeft;
set
{
if (Equals(value, _navigateLeft)) return;

_navigateLeft = value;
OnPropertyChanged();
}
}

public ICommand NavigateRight
{
get => _navigateRight;
set
{
if (Equals(value, _navigateRight)) return;

_navigateRight = value;
OnPropertyChanged();
}
}

public ICommand LoadEnteredUrl
{
get => _loadEnteredUrl;
Expand Down Expand Up @@ -447,7 +462,6 @@ private void SettingsChanged(object sender, PropertyChangedEventArgs e)
if (e.PropertyName is nameof(ISettingsDatabase.TabsEnabled) or nameof(ISettingsDatabase.SwipeEnabled))
{
TabsEnabled = _settingsDatabase.TabsEnabled;
Carousel.IsSwipeEnabled = TabsEnabled && _settingsDatabase.SwipeEnabled;
}
}

Expand Down

0 comments on commit 4e677dc

Please sign in to comment.