Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions WeatherExtension.Tests/CommandInvocationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,12 +108,13 @@ public void UnfavoriteLocationCommand_Invoke_RemovesFavorite()

private WeatherListPage CreateListPage()
{
var settingsManager = new WeatherSettingsManager(_settingsPath);
return new WeatherListPage(
new StubWeatherService(),
new StubGeocodingService(),
new WeatherSettingsManager(_settingsPath),

new FavoritesManager(_favoritesPath));
settingsManager,
new FavoritesManager(_favoritesPath),
new WeatherSettingsPage(settingsManager));
}

}
2 changes: 1 addition & 1 deletion WeatherExtension.Tests/SearchHintTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void TurkishCulture_ExamplesBlockUsesLocalSamples()
var block = Resources.search_hint_examples_block;

StringAssert.Contains(block, "İstanbul");
StringAssert.Contains(Resources.search_hint_multiple_favorites, "ilk favori");
StringAssert.Contains(Resources.search_hint_multiple_favorites, "eklenti ayarlarından");
}
finally
{
Expand Down
6 changes: 4 additions & 2 deletions WeatherExtension.Tests/WeatherListPageTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,12 @@ private WeatherListPage CreatePage(
FavoritesManager? favorites = null,
StubGeocodingService? geocoding = null)
{
var settingsManager = new WeatherSettingsManager(_settingsPath);
return new WeatherListPage(
new StubWeatherService(),
geocoding ?? new StubGeocodingService(),
new WeatherSettingsManager(_settingsPath),
favorites ?? new FavoritesManager(_favoritesPath));
settingsManager,
favorites ?? new FavoritesManager(_favoritesPath),
new WeatherSettingsPage(settingsManager));
}
}
8 changes: 8 additions & 0 deletions WeatherExtension.Tests/WeatherSettingsManagerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,12 @@ public void RaiseSettingsChanged_DoesNotThrow()

manager.RaiseSettingsChanged();
}

[TestMethod]
public void DefaultLocationKey_DefaultsToAuto()
{
var manager = new WeatherSettingsManager(_tempFilePath);

Assert.AreEqual("auto", manager.DefaultLocationKey);
}
}
12 changes: 11 additions & 1 deletion WeatherExtension/DockBands/PinnedWeatherBand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ internal sealed partial class PinnedWeatherBand : ListItem, IDisposable
private readonly OpenMeteoService _weatherService;
private readonly WeatherSettingsManager _settings;
private readonly WeatherBandCard _contentPage;
private readonly WeatherSettingsPage _settingsPage;
private readonly Timer _updateTimer;
private readonly CancellationTokenSource _cts = new();
private bool _isDisposed;
Expand All @@ -32,18 +33,26 @@ public PinnedWeatherBand(
GeocodingResult location,
OpenMeteoService weatherService,
WeatherSettingsManager settings,
WeatherBandCard contentPage)
WeatherBandCard contentPage,
WeatherSettingsPage settingsPage)
{
BaldBeardedBuilder.WeatherExtension.WeatherLogger.Debug($"PinnedWeatherBand.ctor: {location?.DisplayName}");
_location = location ?? throw new ArgumentNullException(nameof(location));
_weatherService = weatherService ?? throw new ArgumentNullException(nameof(weatherService));
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
_contentPage = contentPage ?? throw new ArgumentNullException(nameof(contentPage));
_settingsPage = settingsPage ?? throw new ArgumentNullException(nameof(settingsPage));

Command = _contentPage;
Icon = Icons.WeatherIcon;
Title = Resources.dock_band_loading;
Subtitle = _location.DisplayName;

MoreCommands =
[
new CommandContextItem(_settingsPage) { Title = Resources.settings_page_title },
];

var intervalMs = _settings.UpdateIntervalMinutes * 60 * 1000;
_updateTimer = new Timer(intervalMs);
_updateTimer.Elapsed += OnTimerElapsed;
Expand Down Expand Up @@ -223,6 +232,7 @@ private async void OnSettingsChanged(object sender, Settings args)

public void Dispose()
{
BaldBeardedBuilder.WeatherExtension.WeatherLogger.Debug($"PinnedWeatherBand.Dispose: {_location?.DisplayName}");
if (_isDisposed)
{
return;
Expand Down
8 changes: 7 additions & 1 deletion WeatherExtension/Pages/WeatherBandCard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ internal sealed partial class WeatherBandCard : ContentPage, IDisposable
private readonly FormContent _weatherForm = new();
private readonly CancellationTokenSource _cts = new();
private readonly GeocodingResult? _fixedLocation;
private readonly WeatherSettingsPage? _settingsPage;

public WeatherBandCard(
OpenMeteoService weatherService,
IGeocodingService geocodingService,
WeatherSettingsManager settings,
FavoritesManager? favoritesManager = null,
GeocodingResult? fixedLocation = null)
GeocodingResult? fixedLocation = null,
WeatherSettingsPage? settingsPage = null)
{
_weatherService = weatherService ?? throw new ArgumentNullException(nameof(weatherService));
_geocodingService = geocodingService ?? throw new ArgumentNullException(nameof(geocodingService));
Expand All @@ -42,6 +44,8 @@ public WeatherBandCard(
_weatherForm.TemplateJson = GetCardTemplate();
_weatherForm.DataJson = GetLoadingData();

_settingsPage = settingsPage;

_settings.Settings.SettingsChanged += OnSettingsChanged;
if (_favoritesManager != null)
{
Expand Down Expand Up @@ -104,6 +108,7 @@ internal async Task LoadWeatherDataAsync()
_cts.Token);

_weatherForm.DataJson = BuildWeatherData(location, weather, forecast, hourly);

RaiseItemsChanged();
}
catch (Exception ex)
Expand All @@ -114,6 +119,7 @@ internal async Task LoadWeatherDataAsync()

_weatherForm.DataJson = GetErrorData(
Resources.unavailable);

RaiseItemsChanged();
}
}
Expand Down
5 changes: 4 additions & 1 deletion WeatherExtension/Pages/WeatherDetailPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ internal sealed partial class WeatherDetailPage : ListPage, IDisposable
private readonly GeocodingResult _location;
private readonly IWeatherService _weatherService;
private readonly WeatherSettingsManager _settingsManager;
private readonly WeatherSettingsPage _settingsPage;
private readonly Lock _sync = new();
private readonly CancellationTokenSource _cts = new();

Expand All @@ -25,7 +26,8 @@ internal sealed partial class WeatherDetailPage : ListPage, IDisposable
public WeatherDetailPage(
GeocodingResult location,
IWeatherService weatherService,
WeatherSettingsManager settingsManager)
WeatherSettingsManager settingsManager,
WeatherSettingsPage settingsPage)
{
ArgumentNullException.ThrowIfNull(location);
ArgumentNullException.ThrowIfNull(weatherService);
Expand All @@ -34,6 +36,7 @@ public WeatherDetailPage(
_location = location;
_weatherService = weatherService;
_settingsManager = settingsManager;
_settingsPage = settingsPage;

Name = Resources.page_forecast_title;
Title = Resources.page_forecast_title;
Expand Down
9 changes: 7 additions & 2 deletions WeatherExtension/Pages/WeatherListPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ internal sealed partial class WeatherListPage : DynamicListPage, IDisposable
private readonly IGeocodingService _geocodingService;
private readonly WeatherSettingsManager _settingsManager;
private readonly FavoritesManager _favoritesManager;
private readonly WeatherSettingsPage _settingsPage;
private readonly Lock _sync = new();
private readonly CancellationTokenSource _cts = new();

Expand All @@ -33,7 +34,8 @@ public WeatherListPage(
IWeatherService weatherService,
IGeocodingService geocodingService,
WeatherSettingsManager settingsManager,
FavoritesManager favoritesManager)
FavoritesManager favoritesManager,
WeatherSettingsPage settingsPage)
{
ArgumentNullException.ThrowIfNull(weatherService);
ArgumentNullException.ThrowIfNull(geocodingService);
Expand All @@ -44,6 +46,7 @@ public WeatherListPage(
_geocodingService = geocodingService;
_settingsManager = settingsManager;
_favoritesManager = favoritesManager;
_settingsPage = settingsPage;

Name = Resources.plugin_name;
Title = Resources.plugin_name;
Expand Down Expand Up @@ -252,11 +255,13 @@ private ListItem CreateWeatherItem(GeocodingResult location, WeatherData weather
var detailPage = new WeatherDetailPage(
location,
_weatherService,
_settingsManager);
_settingsManager,
_settingsPage);

var moreCommands = new List<ICommandContextItem>
{
new CommandContextItem(new RefreshWeatherCommand(this)),
new CommandContextItem(_settingsPage) { Title = Resources.settings_page_title },
};

if (_favoritesManager.IsFavorite(location))
Expand Down
13 changes: 12 additions & 1 deletion WeatherExtension/Pages/WeatherSettingsPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ namespace Microsoft.CmdPal.Ext.Weather.Pages;
/// That makes adjusting more than one option a frustrating round trip,
/// so we own the page ourselves and return <c>KeepOpen()</c> instead.
/// </summary>
internal sealed partial class WeatherSettingsPage : ContentPage
internal sealed partial class WeatherSettingsPage : ContentPage, IDisposable
{
private readonly WeatherSettingsManager _settingsManager;
private readonly WeatherSettingsForm _form;
Expand All @@ -34,6 +34,12 @@ public WeatherSettingsPage(WeatherSettingsManager settingsManager)
Id = "com.baldbeardedbuilder.cmdpal.weather.settings";

_form = new WeatherSettingsForm(_settingsManager);
_settingsManager.Settings.SettingsChanged += OnSettingsChanged;
}

private void OnSettingsChanged(object? sender, Settings e)
{
Refresh();
}

public override IContent[] GetContent() => [_form];
Expand All @@ -48,6 +54,11 @@ public void Refresh()
_form.Refresh();
RaiseItemsChanged();
}

public void Dispose()
{
_settingsManager.Settings.SettingsChanged -= OnSettingsChanged;
}
}

internal sealed partial class WeatherSettingsForm : FormContent
Expand Down
3 changes: 3 additions & 0 deletions WeatherExtension/Properties/Resources.Designer.cs

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

Loading
Loading