22 Commits

Author SHA1 Message Date
Burak Kaan Köse
133f768af4 Remove commented code. 2025-02-03 19:15:54 +01:00
Burak Kaan Köse
380883a3d5 Remove smtp encoding constraint. 2025-02-03 19:13:56 +01:00
Burak Kaan Köse
662ce99f94 Fixed an issue where disabled folders causing an exception on forced sync. 2025-02-02 17:53:41 +01:00
Burak Kaan Köse
006404aa87 Fix icons for yahoo and apple. 2025-02-02 17:53:24 +01:00
Burak Kaan Köse
42070a2e5b merge main 2025-02-02 15:48:47 +01:00
Burak Kaan Köse
6fcfb7ff7b Remove ARM32. Upgrade server to .NET 9. 2025-02-02 15:34:42 +01:00
Burak Kaan Köse
616b56f4bd Server crash handlers. 2025-02-01 23:15:01 +01:00
Burak Kaan Köse
16272fa049 NRE on canceled token accounts during setup. 2025-02-01 20:43:55 +01:00
Burak Kaan Köse
3021850fa0 Fixing the build issue.... 2025-02-01 20:25:22 +01:00
Burak Kaan Köse
bb2dbe1457 Bump google sdk package. 2025-01-30 19:33:28 +01:00
Burak Kaan Köse
62fc21be7e Yahoo custom settings. 2025-01-29 18:55:54 +01:00
Burak Kaan Köse
50d0ebc6c8 Fixing remote highest mode seq checks for qresync and condstore synchronizers. 2025-01-29 16:12:10 +01:00
Burak Kaan Köse
ad900d596c Update mailkit to resolve qresync bug with iCloud. 2025-01-29 16:06:31 +01:00
Burak Kaan Köse
7d8da33f42 Delegating idle synchronizations to server to post-sync operations. 2025-01-28 23:57:09 +01:00
Burak Kaan Köse
b73eb3efcb Bumping some nugets. More on the imap synchronizers. 2025-01-28 22:56:19 +01:00
Burak Kaan Köse
b7b51ac4e6 Batching condstore downloads into 50, using SORT extension for searches if supported. 2025-01-25 00:58:40 +01:00
Burak Kaan Köse
bf1480705d Update privacy policy url. 2025-01-25 00:57:49 +01:00
Burak Kaan Köse
973ab1570d Support for killing synchronizers. 2025-01-25 00:00:10 +01:00
Burak Kaan Köse
20010e77ae iCloud special imap handling. 2025-01-21 23:57:58 +01:00
Burak Kaan Köse
05280dfd42 Adding iCloud and Yahoo as special IMAP handling scenario. 2025-01-19 23:52:27 +01:00
Burak Kaan Köse
e0f87f1374 IDLE implementation, imap synchronization strategies basics and condstore synchronization. 2025-01-19 20:35:41 +01:00
Burak Kaan Köse
46cbf443cf Fixing an issue where scrollviewer overrides a part of template in mail list. Adjusted zoomed out header grid's corner radius. 2025-01-19 20:35:12 +01:00
898 changed files with 43340 additions and 47524 deletions

View File

@@ -149,7 +149,7 @@ csharp_preferred_modifier_order = public,private,protected,internal,static,exter
# Code-block preferences # Code-block preferences
csharp_prefer_braces = true:silent csharp_prefer_braces = true:silent
csharp_prefer_simple_using_statement = true:suggestion csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = file_scoped:error csharp_style_namespace_declarations = block_scoped:silent
# Expression-level preferences # Expression-level preferences
csharp_prefer_simple_default_expression = true:suggestion csharp_prefer_simple_default_expression = true:suggestion
@@ -288,5 +288,3 @@ csharp_style_prefer_utf8_string_literals = true:suggestion
csharp_style_prefer_readonly_struct = true:suggestion csharp_style_prefer_readonly_struct = true:suggestion
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
csharp_style_prefer_primary_constructors = true:silent
csharp_prefer_system_threading_lock = true:suggestion

View File

@@ -1,7 +0,0 @@
<Project>
<PropertyGroup>
<LangVersion>preview</LangVersion>
<IsAotCompatible>true</IsAotCompatible>
<Configurations>Debug;Release</Configurations>
</PropertyGroup>
</Project>

View File

@@ -1,66 +0,0 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="ColorHashSharp" Version="1.0.0" />
<PackageVersion Include="CommunityToolkit.Common" Version="8.4.0" />
<PackageVersion Include="CommunityToolkit.Diagnostics" Version="8.4.0" />
<PackageVersion Include="CommunityToolkit.Labs.Uwp.Controls.MarkdownTextBlock" Version="0.1.250206-build.2040" />
<PackageVersion Include="CommunityToolkit.Labs.Uwp.DependencyPropertyGenerator" Version="0.1.250206-build.2040" />
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageVersion Include="CommunityToolkit.Uwp.Animations" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.Uwp.Behaviors" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.Uwp.Controls.Segmented" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.Uwp.Controls.SettingsControls" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.Uwp.Controls.Sizers" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.Uwp.Controls.TabbedCommandBar" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.Uwp.Controls.TokenizingTextBox" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.Uwp.Extensions" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.Uwp.Controls.Primitives" Version="8.2.250129-preview2" />
<PackageVersion Include="EmailValidation" Version="1.3.0" />
<PackageVersion Include="HtmlAgilityPack" Version="1.12.0" />
<PackageVersion Include="Ical.Net" Version="4.3.1" />
<PackageVersion Include="IsExternalInit" Version="1.0.3" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.4" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.4" />
<PackageVersion Include="Microsoft.Graph" Version="5.75.0" />
<PackageVersion Include="Microsoft.Identity.Client" Version="4.70.1" />
<PackageVersion Include="Microsoft.Identity.Client.Broker" Version="4.70.1" />
<PackageVersion Include="Microsoft.Identity.Client.Extensions.Msal" Version="4.70.1" />
<PackageVersion Include="Microsoft.NETCore.UniversalWindowsPlatform" Version="6.2.14" />
<PackageVersion Include="Microsoft.UI.Xaml" Version="2.8.7" />
<PackageVersion Include="Microsoft.Xaml.Behaviors.Uwp.Managed" Version="3.0.0" />
<PackageVersion Include="MimeKit" Version="4.11.0" />
<PackageVersion Include="morelinq" Version="4.4.0" />
<PackageVersion Include="Nito.AsyncEx" Version="5.1.2" />
<PackageVersion Include="Nito.AsyncEx.Tasks" Version="5.1.2" />
<PackageVersion Include="NodaTime" Version="3.2.2" />
<PackageVersion Include="Serilog" Version="4.2.0" />
<PackageVersion Include="Serilog.Exceptions" Version="8.4.0" />
<PackageVersion Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.ApplicationInsights" Version="4.0.0" />
<PackageVersion Include="SkiaSharp" Version="3.116.1" />
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
<PackageVersion Include="SqlKata" Version="4.0.1" />
<PackageVersion Include="System.Private.Uri" Version="4.3.2" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="9.0.4" />
<PackageVersion Include="System.Text.Json" Version="9.0.4" />
<PackageVersion Include="Win2D.uwp" Version="1.28.2" />
<PackageVersion Include="H.NotifyIcon.Wpf" Version="2.3.0" />
<PackageVersion Include="CommunityToolkit.WinUI.Notifications" Version="7.1.2" />
<PackageVersion Include="Google.Apis.Auth" Version="1.69.0" />
<PackageVersion Include="Google.Apis.Calendar.v3" Version="1.69.0.3667" />
<PackageVersion Include="Google.Apis.Gmail.v1" Version="1.68.0.3427" />
<PackageVersion Include="Google.Apis.PeopleService.v1" Version="1.68.0.3359" />
<PackageVersion Include="HtmlKit" Version="1.2.0" />
<PackageVersion Include="MailKit" Version="4.11.0" />
<PackageVersion Include="TimePeriodLibrary.NET" Version="2.1.6" />
<PackageVersion Include="System.Reactive" Version="6.0.1" />
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.4" />
<PackageVersion Include="System.Text.Encodings.Web" Version="9.0.4" />
</ItemGroup>
</Project>

View File

@@ -1,10 +1,10 @@
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
namespace Wino.Authentication; namespace Wino.Authentication
public abstract class BaseAuthenticator
{ {
public abstract class BaseAuthenticator
{
public abstract MailProviderType ProviderType { get; } public abstract MailProviderType ProviderType { get; }
protected IAuthenticatorConfig AuthenticatorConfig { get; } protected IAuthenticatorConfig AuthenticatorConfig { get; }
@@ -13,4 +13,5 @@ public abstract class BaseAuthenticator
AuthenticatorConfig = authenticatorConfig; AuthenticatorConfig = authenticatorConfig;
} }
}
} }

View File

@@ -7,10 +7,10 @@ using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Authentication; using Wino.Core.Domain.Models.Authentication;
namespace Wino.Authentication; namespace Wino.Authentication
public class GmailAuthenticator : BaseAuthenticator, IGmailAuthenticator
{ {
public class GmailAuthenticator : BaseAuthenticator, IGmailAuthenticator
{
public GmailAuthenticator(IAuthenticatorConfig authConfig) : base(authConfig) public GmailAuthenticator(IAuthenticatorConfig authConfig) : base(authConfig)
{ {
} }
@@ -47,4 +47,5 @@ public class GmailAuthenticator : BaseAuthenticator, IGmailAuthenticator
ClientId = ClientId ClientId = ClientId
}, AuthenticatorConfig.GmailScope, account.Id.ToString(), CancellationToken.None, new FileDataStore(AuthenticatorConfig.GmailTokenStoreIdentifier)); }, AuthenticatorConfig.GmailScope, account.Id.ToString(), CancellationToken.None, new FileDataStore(AuthenticatorConfig.GmailTokenStoreIdentifier));
} }
}
} }

View File

@@ -11,10 +11,10 @@ using Wino.Core.Domain.Exceptions;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Authentication; using Wino.Core.Domain.Models.Authentication;
namespace Wino.Authentication; namespace Wino.Authentication
public class OutlookAuthenticator : BaseAuthenticator, IOutlookAuthenticator
{ {
public class OutlookAuthenticator : BaseAuthenticator, IOutlookAuthenticator
{
private const string TokenCacheFileName = "OutlookCache.bin"; private const string TokenCacheFileName = "OutlookCache.bin";
private bool isTokenCacheAttached = false; private bool isTokenCacheAttached = false;
@@ -67,8 +67,7 @@ public class OutlookAuthenticator : BaseAuthenticator, IOutlookAuthenticator
{ {
await EnsureTokenCacheAttachedAsync(); await EnsureTokenCacheAttachedAsync();
var storedAccount = (await _publicClientApplication.GetAccountsAsync()).FirstOrDefault( var storedAccount = (await _publicClientApplication.GetAccountsAsync()).FirstOrDefault(a => a.Username == account.Address);
a => string.Equals(a.Username?.Trim(), account.Address?.Trim(), StringComparison.OrdinalIgnoreCase));
if (storedAccount == null) if (storedAccount == null)
return await GenerateTokenInformationAsync(account); return await GenerateTokenInformationAsync(account);
@@ -108,7 +107,7 @@ public class OutlookAuthenticator : BaseAuthenticator, IOutlookAuthenticator
if (account?.Address != null && !account.Address.Equals(authResult.Account.Username, StringComparison.OrdinalIgnoreCase)) if (account?.Address != null && !account.Address.Equals(authResult.Account.Username, StringComparison.OrdinalIgnoreCase))
{ {
throw new AuthenticationException("Authenticated address does not match with your account address. If you are signing with a Office365, it is not officially supported yet."); throw new AuthenticationException("Authenticated address does not match with your account address.");
} }
return new TokenInformationEx(authResult.AccessToken, authResult.Account.Username); return new TokenInformationEx(authResult.AccessToken, authResult.Account.Username);
@@ -123,4 +122,5 @@ public class OutlookAuthenticator : BaseAuthenticator, IOutlookAuthenticator
throw new AuthenticationException(Translator.Exception_UnknowErrorDuringAuthentication, new Exception(Translator.Exception_TokenGenerationFailed)); throw new AuthenticationException(Translator.Exception_UnknowErrorDuringAuthentication, new Exception(Translator.Exception_TokenGenerationFailed));
} }
}
} }

View File

@@ -1,20 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
<RootNamespace>Wino.Authentication</RootNamespace> <RootNamespace>Wino.Authentication</RootNamespace>
<Platforms>x86;x64;arm64</Platforms> <Configurations>Debug;Release</Configurations>
<LangVersion>12</LangVersion>
<Platforms>AnyCPU;x64;x86</Platforms>
<AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio> <AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio>
<ProduceReferenceAssembly>true</ProduceReferenceAssembly> <ProduceReferenceAssembly>true</ProduceReferenceAssembly>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CommunityToolkit.Diagnostics" /> <PackageReference Include="CommunityToolkit.Diagnostics" Version="8.3.2" />
<PackageReference Include="CommunityToolkit.Mvvm" /> <PackageReference Include="CommunityToolkit.Mvvm" Version="8.3.2" />
<PackageReference Include="Google.Apis.Auth" /> <PackageReference Include="Google.Apis.Auth" Version="1.68.0" />
<PackageReference Include="Microsoft.Identity.Client" /> <PackageReference Include="Microsoft.Identity.Client" Version="4.66.2" />
<PackageReference Include="Microsoft.Identity.Client.Broker" /> <PackageReference Include="Microsoft.Identity.Client.Broker" Version="4.66.2" />
<PackageReference Include="Microsoft.Identity.Client.Extensions.Msal" /> <PackageReference Include="Microsoft.Identity.Client.Extensions.Msal" Version="4.66.2" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Wino.Core.Domain\Wino.Core.Domain.csproj" /> <ProjectReference Include="..\Wino.Core.Domain\Wino.Core.Domain.csproj" />
<ProjectReference Include="..\Wino.Messages\Wino.Messaging.csproj" /> <ProjectReference Include="..\Wino.Messages\Wino.Messaging.csproj" />

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity
Name="58272BurakKSE.WinoCalendar"
Publisher="CN=51FBDAF3-E212-4149-89A2-A2636B3BC911"
Version="1.0.0.0" />
<Properties>
<DisplayName>Wino Calendar</DisplayName>
<PublisherDisplayName>Burak KÖSE</PublisherDisplayName>
<Logo>Images\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="Wino Calendar"
Description="Wino.Calendar.Packaging"
BackgroundColor="transparent"
Square150x150Logo="Images\Square150x150Logo.png"
Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
<uap:SplashScreen Image="Images\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<!-- Registration of full trust backend application. -->
<uap:Extension Category="windows.appService">
<uap:AppService Name="WinoInteropService" />
</uap:Extension>
<!-- Protocol activation: Google OAuth -->
<uap:Extension Category="windows.protocol">
<uap:Protocol Name="google.pw.oauth2">
<uap:DisplayName>Wino Google Authentication Protocol</uap:DisplayName>
</uap:Protocol>
</uap:Extension>
<!-- Protocol activation: Launch UWP app from Full Trust Process -->
<uap:Extension Category="windows.protocol">
<uap:Protocol Name="wino.calendar.launch">
<uap:DisplayName>Wino Calendara Launcher Protocol</uap:DisplayName>
</uap:Protocol>
</uap:Extension>
<!-- Startup Task -->
<uap5:Extension
Category="windows.startupTask"
Executable="Wino.Server\Wino.Server.exe"
EntryPoint="Windows.FullTrustApplication">
<uap5:StartupTask
TaskId="WinoServer"
Enabled="false"
DisplayName="Wino Mail" />
</uap5:Extension>
<desktop:Extension Category="windows.fullTrustProcess" Executable="Wino.Server\Wino.Server.exe">
<desktop:FullTrustProcess>
<desktop:ParameterGroup GroupId="WinoServer" Parameters="Calendar" />
</desktop:FullTrustProcess>
</desktop:Extension>
</Extensions>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="confirmAppClose" />
</Capabilities>
</Package>

View File

@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'">
<VisualStudioVersion>15.0</VisualStudioVersion>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x86">
<Configuration>Debug</Configuration>
<Platform>x86</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x86">
<Configuration>Release</Configuration>
<Platform>x86</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|AnyCPU">
<Configuration>Debug</Configuration>
<Platform>AnyCPU</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|AnyCPU">
<Configuration>Release</Configuration>
<Platform>AnyCPU</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup>
<WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
</PropertyGroup>
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
<PropertyGroup>
<ProjectGuid>7485b18c-f5ab-4abe-ba7f-05b6623c67c8</ProjectGuid>
<TargetPlatformVersion>10.0.22621.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
<DefaultLanguage>en-US</DefaultLanguage>
<AppxPackageSigningEnabled>false</AppxPackageSigningEnabled>
<NoWarn>$(NoWarn);NU1702</NoWarn>
<EntryPointProjectUniqueName>..\Wino.Calendar\Wino.Calendar.csproj</EntryPointProjectUniqueName>
<GenerateTemporaryStoreCertificate>True</GenerateTemporaryStoreCertificate>
</PropertyGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<ItemGroup>
<Content Include="Images\SplashScreen.scale-200.png" />
<Content Include="Images\LockScreenLogo.scale-200.png" />
<Content Include="Images\Square150x150Logo.scale-200.png" />
<Content Include="Images\Square44x44Logo.scale-200.png" />
<Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Images\StoreLogo.png" />
<Content Include="Images\Wide310x150Logo.scale-200.png" />
<None Include="Package.StoreAssociation.xml" />
</ItemGroup>
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
<ItemGroup>
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Wino.Calendar\Wino.Calendar.csproj" />
<ProjectReference Include="..\Wino.Server\Wino.Server.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,18 +1,16 @@
using CommunityToolkit.Mvvm.Input; using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Input;
using Wino.Calendar.ViewModels.Interfaces; using Wino.Calendar.ViewModels.Interfaces;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Navigation; using Wino.Core.Domain.Models.Navigation;
using Wino.Core.ViewModels; using Wino.Core.ViewModels;
using Wino.Mail.ViewModels.Data; using Wino.Mail.ViewModels.Data;
using Wino.Messaging.Client.Navigation; using Wino.Messaging.UI;
namespace Wino.Calendar.ViewModels; namespace Wino.Calendar.ViewModels
public partial class AccountDetailsPageViewModel : CalendarBaseViewModel
{ {
public partial class AccountDetailsPageViewModel : CalendarBaseViewModel
{
private readonly IAccountService _accountService; private readonly IAccountService _accountService;
public AccountProviderDetailViewModel Account { get; private set; } public AccountProviderDetailViewModel Account { get; private set; }
@@ -27,11 +25,24 @@ public partial class AccountDetailsPageViewModel : CalendarBaseViewModel
} }
[RelayCommand] [RelayCommand]
private void EditAccountDetails() private async Task RenameAccount()
=> Messenger.Send(new BreadcrumbNavigationRequested(Translator.SettingsEditAccountDetails_Title, WinoPage.EditAccountDetailsPage, Account)); {
if (Account == null)
return;
var updatedAccount = await CalendarDialogService.ShowEditAccountDialogAsync(Account.Account);
if (updatedAccount != null)
{
await _accountService.UpdateAccountAsync(updatedAccount);
ReportUIChange(new AccountUpdatedMessage(updatedAccount));
}
}
public override void OnNavigatedTo(NavigationMode mode, object parameters) public override void OnNavigatedTo(NavigationMode mode, object parameters)
{ {
base.OnNavigatedTo(mode, parameters); base.OnNavigatedTo(mode, parameters);
} }
}
} }

View File

@@ -13,10 +13,10 @@ using Wino.Core.Domain.Models.Synchronization;
using Wino.Core.ViewModels; using Wino.Core.ViewModels;
using Wino.Messaging.Server; using Wino.Messaging.Server;
namespace Wino.Calendar.ViewModels; namespace Wino.Calendar.ViewModels
public partial class AccountManagementViewModel : AccountManagementPageViewModelBase
{ {
public partial class AccountManagementViewModel : AccountManagementPageViewModelBase
{
private readonly IProviderService _providerService; private readonly IProviderService _providerService;
public AccountManagementViewModel(ICalendarDialogService dialogService, public AccountManagementViewModel(ICalendarDialogService dialogService,
@@ -83,8 +83,8 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel
var accountCreationCancellationTokenSource = new CancellationTokenSource(); var accountCreationCancellationTokenSource = new CancellationTokenSource();
var accountCreationDialog = CalendarDialogService.GetAccountCreationDialog(accountCreationDialogResult); var accountCreationDialog = CalendarDialogService.GetAccountCreationDialog(accountCreationDialogResult);
await accountCreationDialog.ShowDialogAsync(accountCreationCancellationTokenSource); accountCreationDialog.ShowDialog(accountCreationCancellationTokenSource);
await Task.Delay(500); accountCreationDialog.State = AccountCreationDialogState.SigningIn;
// For OAuth authentications, we just generate token and assign it to the MailAccount. // For OAuth authentications, we just generate token and assign it to the MailAccount.
@@ -142,7 +142,6 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel
}; };
var synchronizationResponse = await WinoServerConnectionManager.GetResponseAsync<CalendarSynchronizationResult, NewCalendarSynchronizationRequested>(new NewCalendarSynchronizationRequested(synchronizationOptions, SynchronizationSource.Client)); var synchronizationResponse = await WinoServerConnectionManager.GetResponseAsync<CalendarSynchronizationResult, NewCalendarSynchronizationRequested>(new NewCalendarSynchronizationRequested(synchronizationOptions, SynchronizationSource.Client));
accountCreationDialog.Complete(cancel: false); }
} }
} }

View File

@@ -21,15 +21,15 @@ using Wino.Messaging.Client.Calendar;
using Wino.Messaging.Client.Navigation; using Wino.Messaging.Client.Navigation;
using Wino.Messaging.Server; using Wino.Messaging.Server;
namespace Wino.Calendar.ViewModels; namespace Wino.Calendar.ViewModels
{
public partial class AppShellViewModel : CalendarBaseViewModel, public partial class AppShellViewModel : CalendarBaseViewModel,
IRecipient<VisibleDateRangeChangedMessage>, IRecipient<VisibleDateRangeChangedMessage>,
IRecipient<CalendarEnableStatusChangedMessage>, IRecipient<CalendarEnableStatusChangedMessage>,
IRecipient<NavigateManageAccountsRequested>, IRecipient<NavigateManageAccountsRequested>,
IRecipient<CalendarDisplayTypeChangedMessage>, IRecipient<CalendarDisplayTypeChangedMessage>,
IRecipient<DetailsPageStateChangedMessage> IRecipient<DetailsPageStateChangedMessage>
{ {
public IPreferencesService PreferencesService { get; } public IPreferencesService PreferencesService { get; }
public IStatePersistanceService StatePersistenceService { get; } public IStatePersistanceService StatePersistenceService { get; }
public IAccountCalendarStateService AccountCalendarStateService { get; } public IAccountCalendarStateService AccountCalendarStateService { get; }
@@ -363,4 +363,5 @@ public partial class AppShellViewModel : CalendarBaseViewModel,
StatePersistenceService.IsReadingMail = message.IsActivated; StatePersistenceService.IsReadingMail = message.IsActivated;
}); });
} }
}
} }

View File

@@ -23,16 +23,16 @@ using Wino.Core.Domain.Models.Navigation;
using Wino.Core.ViewModels; using Wino.Core.ViewModels;
using Wino.Messaging.Client.Calendar; using Wino.Messaging.Client.Calendar;
namespace Wino.Calendar.ViewModels; namespace Wino.Calendar.ViewModels
{
public partial class CalendarPageViewModel : CalendarBaseViewModel, public partial class CalendarPageViewModel : CalendarBaseViewModel,
IRecipient<LoadCalendarMessage>, IRecipient<LoadCalendarMessage>,
IRecipient<CalendarItemDeleted>, IRecipient<CalendarItemDeleted>,
IRecipient<CalendarSettingsUpdatedMessage>, IRecipient<CalendarSettingsUpdatedMessage>,
IRecipient<CalendarItemTappedMessage>, IRecipient<CalendarItemTappedMessage>,
IRecipient<CalendarItemDoubleTappedMessage>, IRecipient<CalendarItemDoubleTappedMessage>,
IRecipient<CalendarItemRightTappedMessage> IRecipient<CalendarItemRightTappedMessage>
{ {
#region Quick Event Creation #region Quick Event Creation
[ObservableProperty] [ObservableProperty]
@@ -237,20 +237,20 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
{ {
var durationSeconds = (QuickEventEndTime - QuickEventStartTime).TotalSeconds; var durationSeconds = (QuickEventEndTime - QuickEventStartTime).TotalSeconds;
//var testCalendarItem = new CalendarItem var testCalendarItem = new CalendarItem
//{ {
// CalendarId = SelectedQuickEventAccountCalendar.Id, CalendarId = SelectedQuickEventAccountCalendar.Id,
// StartDate = QuickEventStartTime, StartDate = QuickEventStartTime,
// DurationInSeconds = durationSeconds, DurationInSeconds = durationSeconds,
// CreatedAt = DateTime.UtcNow, CreatedAt = DateTime.UtcNow,
// Description = string.Empty, Description = string.Empty,
// Location = Location, Location = Location,
// Title = EventName, Title = EventName,
// Id = Guid.NewGuid() Id = Guid.NewGuid()
//}; };
//IsQuickEventDialogOpen = false; IsQuickEventDialogOpen = false;
//await _calendarService.CreateNewCalendarItemAsync(testCalendarItem, null); await _calendarService.CreateNewCalendarItemAsync(testCalendarItem, null);
// TODO: Create the request with the synchronizer. // TODO: Create the request with the synchronizer.
} }
@@ -867,4 +867,5 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
// var calendarItems = GetCalendarItems(deletedItem.Id); // var calendarItems = GetCalendarItems(deletedItem.Id);
}); });
} }
}
} }

View File

@@ -8,10 +8,10 @@ using Wino.Core.Domain.Translations;
using Wino.Core.ViewModels; using Wino.Core.ViewModels;
using Wino.Messaging.Client.Calendar; using Wino.Messaging.Client.Calendar;
namespace Wino.Calendar.ViewModels; namespace Wino.Calendar.ViewModels
public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel
{ {
public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel
{
[ObservableProperty] [ObservableProperty]
private double _cellHourHeight; private double _cellHourHeight;
@@ -123,4 +123,5 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel
Messenger.Send(new CalendarSettingsUpdatedMessage()); Messenger.Send(new CalendarSettingsUpdatedMessage());
} }
}
} }

View File

@@ -1,12 +1,13 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Wino.Core; using Wino.Core;
namespace Wino.Calendar.ViewModels; namespace Wino.Calendar.ViewModels
public static class CalendarViewModelContainerSetup
{ {
public static class CalendarViewModelContainerSetup
{
public static void RegisterCalendarViewModelServices(this IServiceCollection services) public static void RegisterCalendarViewModelServices(this IServiceCollection services)
{ {
services.RegisterCoreServices(); services.RegisterCoreServices();
} }
}
} }

View File

@@ -4,10 +4,10 @@ using Wino.Core.Domain.Entities.Calendar;
using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
namespace Wino.Calendar.ViewModels.Data; namespace Wino.Calendar.ViewModels.Data
public partial class AccountCalendarViewModel : ObservableObject, IAccountCalendar
{ {
public partial class AccountCalendarViewModel : ObservableObject, IAccountCalendar
{
public MailAccount Account { get; } public MailAccount Account { get; }
public AccountCalendar AccountCalendar { get; } public AccountCalendar AccountCalendar { get; }
@@ -66,4 +66,5 @@ public partial class AccountCalendarViewModel : ObservableObject, IAccountCalend
set => SetProperty(AccountCalendar.RemoteCalendarId, value, AccountCalendar, (u, r) => u.RemoteCalendarId = r); set => SetProperty(AccountCalendar.RemoteCalendarId, value, AccountCalendar, (u, r) => u.RemoteCalendarId = r);
} }
public Guid Id { get => ((IAccountCalendar)AccountCalendar).Id; set => ((IAccountCalendar)AccountCalendar).Id = value; } public Guid Id { get => ((IAccountCalendar)AccountCalendar).Id; set => ((IAccountCalendar)AccountCalendar).Id = value; }
}
} }

View File

@@ -5,10 +5,10 @@ using Itenso.TimePeriod;
using Wino.Core.Domain.Entities.Calendar; using Wino.Core.Domain.Entities.Calendar;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
namespace Wino.Calendar.ViewModels.Data; namespace Wino.Calendar.ViewModels.Data
public partial class CalendarItemViewModel : ObservableObject, ICalendarItem, ICalendarItemViewModel
{ {
public partial class CalendarItemViewModel : ObservableObject, ICalendarItem, ICalendarItemViewModel
{
public CalendarItem CalendarItem { get; } public CalendarItem CalendarItem { get; }
public string Title => CalendarItem.Title; public string Title => CalendarItem.Title;
@@ -17,11 +17,11 @@ public partial class CalendarItemViewModel : ObservableObject, ICalendarItem, IC
public IAccountCalendar AssignedCalendar => CalendarItem.AssignedCalendar; public IAccountCalendar AssignedCalendar => CalendarItem.AssignedCalendar;
public DateTime StartDate => CalendarItem.StartDate; public DateTime StartDate { get => CalendarItem.StartDate; set => CalendarItem.StartDate = value; }
public DateTime EndDate => CalendarItem.EndDate; public DateTime EndDate => CalendarItem.EndDate;
public double DurationInSeconds => CalendarItem.DurationInSeconds; public double DurationInSeconds { get => CalendarItem.DurationInSeconds; set => CalendarItem.DurationInSeconds = value; }
public ITimePeriod Period => CalendarItem.Period; public ITimePeriod Period => CalendarItem.Period;
@@ -42,4 +42,5 @@ public partial class CalendarItemViewModel : ObservableObject, ICalendarItem, IC
} }
public override string ToString() => CalendarItem.Title; public override string ToString() => CalendarItem.Title;
}
} }

View File

@@ -6,10 +6,10 @@ using System.Linq;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Entities.Shared;
namespace Wino.Calendar.ViewModels.Data; namespace Wino.Calendar.ViewModels.Data
public partial class GroupedAccountCalendarViewModel : ObservableObject
{ {
public partial class GroupedAccountCalendarViewModel : ObservableObject
{
public event EventHandler CollectiveSelectionStateChanged; public event EventHandler CollectiveSelectionStateChanged;
public event EventHandler<AccountCalendarViewModel> CalendarSelectionStateChanged; public event EventHandler<AccountCalendarViewModel> CalendarSelectionStateChanged;
@@ -142,4 +142,5 @@ public partial class GroupedAccountCalendarViewModel : ObservableObject
CalendarSelectionStateChanged?.Invoke(this, accountCalendarViewModel); CalendarSelectionStateChanged?.Invoke(this, accountCalendarViewModel);
} }
}
} }

View File

@@ -12,10 +12,10 @@ using Wino.Core.Domain.Models.Navigation;
using Wino.Core.ViewModels; using Wino.Core.ViewModels;
using Wino.Messaging.Client.Calendar; using Wino.Messaging.Client.Calendar;
namespace Wino.Calendar.ViewModels; namespace Wino.Calendar.ViewModels
public partial class EventDetailsPageViewModel : CalendarBaseViewModel
{ {
public partial class EventDetailsPageViewModel : CalendarBaseViewModel
{
private readonly ICalendarService _calendarService; private readonly ICalendarService _calendarService;
private readonly INativeAppService _nativeAppService; private readonly INativeAppService _nativeAppService;
private readonly IPreferencesService _preferencesService; private readonly IPreferencesService _preferencesService;
@@ -112,4 +112,5 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel
{ {
if (CurrentEvent == null) return; if (CurrentEvent == null) return;
} }
}
} }

View File

@@ -6,10 +6,10 @@ using System.Linq;
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Entities.Shared;
namespace Wino.Calendar.ViewModels.Interfaces; namespace Wino.Calendar.ViewModels.Interfaces
public interface IAccountCalendarStateService : INotifyPropertyChanged
{ {
public interface IAccountCalendarStateService : INotifyPropertyChanged
{
ReadOnlyObservableCollection<GroupedAccountCalendarViewModel> GroupedAccountCalendars { get; } ReadOnlyObservableCollection<GroupedAccountCalendarViewModel> GroupedAccountCalendars { get; }
event EventHandler<GroupedAccountCalendarViewModel> CollectiveAccountGroupSelectionStateChanged; event EventHandler<GroupedAccountCalendarViewModel> CollectiveAccountGroupSelectionStateChanged;
@@ -27,4 +27,5 @@ public interface IAccountCalendarStateService : INotifyPropertyChanged
/// </summary> /// </summary>
IEnumerable<AccountCalendarViewModel> ActiveCalendars { get; } IEnumerable<AccountCalendarViewModel> ActiveCalendars { get; }
IEnumerable<IGrouping<MailAccount, AccountCalendarViewModel>> GroupedAccountCalendarsEnumerable { get; } IEnumerable<IGrouping<MailAccount, AccountCalendarViewModel>> GroupedAccountCalendarsEnumerable { get; }
}
} }

View File

@@ -1,13 +1,14 @@
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
namespace Wino.Calendar.ViewModels.Messages; namespace Wino.Calendar.ViewModels.Messages
public class CalendarItemDoubleTappedMessage
{ {
public class CalendarItemDoubleTappedMessage
{
public CalendarItemDoubleTappedMessage(CalendarItemViewModel calendarItemViewModel) public CalendarItemDoubleTappedMessage(CalendarItemViewModel calendarItemViewModel)
{ {
CalendarItemViewModel = calendarItemViewModel; CalendarItemViewModel = calendarItemViewModel;
} }
public CalendarItemViewModel CalendarItemViewModel { get; } public CalendarItemViewModel CalendarItemViewModel { get; }
}
} }

View File

@@ -1,13 +1,14 @@
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
namespace Wino.Calendar.ViewModels.Messages; namespace Wino.Calendar.ViewModels.Messages
public class CalendarItemRightTappedMessage
{ {
public class CalendarItemRightTappedMessage
{
public CalendarItemRightTappedMessage(CalendarItemViewModel calendarItemViewModel) public CalendarItemRightTappedMessage(CalendarItemViewModel calendarItemViewModel)
{ {
CalendarItemViewModel = calendarItemViewModel; CalendarItemViewModel = calendarItemViewModel;
} }
public CalendarItemViewModel CalendarItemViewModel { get; } public CalendarItemViewModel CalendarItemViewModel { get; }
}
} }

View File

@@ -1,10 +1,10 @@
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
namespace Wino.Calendar.ViewModels.Messages; namespace Wino.Calendar.ViewModels.Messages
public class CalendarItemTappedMessage
{ {
public class CalendarItemTappedMessage
{
public CalendarItemTappedMessage(CalendarItemViewModel calendarItemViewModel, CalendarDayModel clickedPeriod) public CalendarItemTappedMessage(CalendarItemViewModel calendarItemViewModel, CalendarDayModel clickedPeriod)
{ {
CalendarItemViewModel = calendarItemViewModel; CalendarItemViewModel = calendarItemViewModel;
@@ -13,4 +13,5 @@ public class CalendarItemTappedMessage
public CalendarItemViewModel CalendarItemViewModel { get; } public CalendarItemViewModel CalendarItemViewModel { get; }
public CalendarDayModel ClickedPeriod { get; } public CalendarDayModel ClickedPeriod { get; }
}
} }

View File

@@ -1,13 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<Platforms>x86;x64;arm64</Platforms> <LangVersion>12</LangVersion>
<RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers> <Platforms>AnyCPU;x64;x86</Platforms>
<AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio> <AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio>
<ProduceReferenceAssembly>true</ProduceReferenceAssembly> <ProduceReferenceAssembly>true</ProduceReferenceAssembly>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="TimePeriodLibrary.NET" /> <PackageReference Include="TimePeriodLibrary.NET" Version="2.1.5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -6,10 +6,10 @@ using Windows.UI.Xaml.Media.Animation;
using Wino.Activation; using Wino.Activation;
using Wino.Calendar.Views; using Wino.Calendar.Views;
namespace Wino.Calendar.Activation; namespace Wino.Calendar.Activation
public class DefaultActivationHandler : ActivationHandler<IActivatedEventArgs>
{ {
public class DefaultActivationHandler : ActivationHandler<IActivatedEventArgs>
{
protected override Task HandleInternalAsync(IActivatedEventArgs args) protected override Task HandleInternalAsync(IActivatedEventArgs args)
{ {
(Window.Current.Content as Frame).Navigate(typeof(AppShell), null, new DrillInNavigationTransitionInfo()); (Window.Current.Content as Frame).Navigate(typeof(AppShell), null, new DrillInNavigationTransitionInfo());
@@ -20,4 +20,5 @@ public class DefaultActivationHandler : ActivationHandler<IActivatedEventArgs>
// Only navigate if Frame content doesn't exist. // Only navigate if Frame content doesn't exist.
protected override bool CanHandleInternal(IActivatedEventArgs args) protected override bool CanHandleInternal(IActivatedEventArgs args)
=> (Window.Current?.Content as Frame)?.Content == null; => (Window.Current?.Content as Frame)?.Content == null;
}
} }

View File

@@ -24,16 +24,20 @@ using Wino.Messaging.Client.Connection;
using Wino.Messaging.Server; using Wino.Messaging.Server;
using Wino.Services; using Wino.Services;
namespace Wino.Calendar; namespace Wino.Calendar
public sealed partial class App : WinoApplication, IRecipient<NewCalendarSynchronizationRequested>
{ {
public sealed partial class App : WinoApplication, IRecipient<NewCalendarSynchronizationRequested>
{
public override string AppCenterKey => "dfdad6ab-95f9-44cc-9112-45ec6730c49e";
private BackgroundTaskDeferral connectionBackgroundTaskDeferral; private BackgroundTaskDeferral connectionBackgroundTaskDeferral;
private BackgroundTaskDeferral toastActionBackgroundTaskDeferral;
public App() public App()
{ {
InitializeComponent(); InitializeComponent();
WeakReferenceMessenger.Default.Register<NewCalendarSynchronizationRequested>(this);
WeakReferenceMessenger.Default.Register(this);
} }
public override IServiceProvider ConfigureServices() public override IServiceProvider ConfigureServices()
@@ -156,4 +160,5 @@ public sealed partial class App : WinoApplication, IRecipient<NewCalendarSynchro
dialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, serverException.Message, InfoBarMessageType.Error); dialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, serverException.Message, InfoBarMessageType.Error);
} }
} }
}
} }

View File

@@ -1,13 +1,13 @@
using System; using System;
using Windows.Foundation; using Windows.Foundation;
namespace Wino.Calendar.Args; namespace Wino.Calendar.Args
/// <summary>
/// When a new timeline cell is selected.
/// </summary>
public class TimelineCellSelectedArgs : EventArgs
{ {
/// <summary>
/// When a new timeline cell is selected.
/// </summary>
public class TimelineCellSelectedArgs : EventArgs
{
public TimelineCellSelectedArgs(DateTime clickedDate, Point canvasPoint, Point positionerPoint, Size cellSize) public TimelineCellSelectedArgs(DateTime clickedDate, Point canvasPoint, Point positionerPoint, Size cellSize)
{ {
ClickedDate = clickedDate; ClickedDate = clickedDate;
@@ -37,4 +37,5 @@ public class TimelineCellSelectedArgs : EventArgs
/// Size of the cell. /// Size of the cell.
/// </summary> /// </summary>
public Size CellSize { get; } public Size CellSize { get; }
}
} }

View File

@@ -1,8 +1,9 @@
using System; using System;
namespace Wino.Calendar.Args; namespace Wino.Calendar.Args
{
/// <summary> /// <summary>
/// When selected timeline cell is unselected. /// When selected timeline cell is unselected.
/// </summary> /// </summary>
public class TimelineCellUnselectedArgs : EventArgs { } public class TimelineCellUnselectedArgs : EventArgs { }
}

View File

@@ -2,10 +2,10 @@
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class CalendarItemCommandBarFlyout : CommandBarFlyout
{ {
public class CalendarItemCommandBarFlyout : CommandBarFlyout
{
public static readonly DependencyProperty ItemProperty = DependencyProperty.Register(nameof(Item), typeof(CalendarItemViewModel), typeof(CalendarItemCommandBarFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnItemChanged))); public static readonly DependencyProperty ItemProperty = DependencyProperty.Register(nameof(Item), typeof(CalendarItemViewModel), typeof(CalendarItemCommandBarFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnItemChanged)));
public CalendarItemViewModel Item public CalendarItemViewModel Item
@@ -27,4 +27,5 @@ public partial class CalendarItemCommandBarFlyout : CommandBarFlyout
{ {
} }
}
} }

View File

@@ -9,10 +9,10 @@ using Wino.Calendar.ViewModels.Messages;
using Wino.Core.Domain; using Wino.Core.Domain;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public sealed partial class CalendarItemControl : UserControl
{ {
public sealed partial class CalendarItemControl : UserControl
{
// Single tap has a delay to report double taps properly. // Single tap has a delay to report double taps properly.
private bool isSingleTap = false; private bool isSingleTap = false;
@@ -194,4 +194,5 @@ public sealed partial class CalendarItemControl : UserControl
WeakReferenceMessenger.Default.Send(new CalendarItemRightTappedMessage(CalendarItem)); WeakReferenceMessenger.Default.Send(new CalendarItemRightTappedMessage(CalendarItem));
} }
}
} }

View File

@@ -1,13 +1,13 @@
using Windows.UI.Xaml.Automation.Peers; using Windows.UI.Xaml.Automation.Peers;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
/// <summary>
/// FlipView that hides the navigation buttons and exposes methods to navigate to the next and previous items with animations.
/// </summary>
public partial class CustomCalendarFlipView : FlipView
{ {
/// <summary>
/// FlipView that hides the navigation buttons and exposes methods to navigate to the next and previous items with animations.
/// </summary>
public class CustomCalendarFlipView : FlipView
{
private const string PART_PreviousButton = "PreviousButtonHorizontal"; private const string PART_PreviousButton = "PreviousButtonHorizontal";
private const string PART_NextButton = "NextButtonHorizontal"; private const string PART_NextButton = "NextButtonHorizontal";
@@ -39,4 +39,5 @@ public partial class CustomCalendarFlipView : FlipView
var nextPeer = new ButtonAutomationPeer(NextButton); var nextPeer = new ButtonAutomationPeer(NextButton);
nextPeer.Invoke(); nextPeer.Invoke();
} }
}
} }

View File

@@ -3,10 +3,10 @@ using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class DayColumnControl : Control
{ {
public class DayColumnControl : Control
{
private const string PART_HeaderDateDayText = nameof(PART_HeaderDateDayText); private const string PART_HeaderDateDayText = nameof(PART_HeaderDateDayText);
private const string PART_IsTodayBorder = nameof(PART_IsTodayBorder); private const string PART_IsTodayBorder = nameof(PART_IsTodayBorder);
private const string PART_ColumnHeaderText = nameof(PART_ColumnHeaderText); private const string PART_ColumnHeaderText = nameof(PART_ColumnHeaderText);
@@ -74,4 +74,5 @@ public partial class DayColumnControl : Control
UpdateLayout(); UpdateLayout();
} }
}
} }

View File

@@ -3,10 +3,10 @@ using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class DayHeaderControl : Control
{ {
public class DayHeaderControl : Control
{
private const string PART_DayHeaderTextBlock = nameof(PART_DayHeaderTextBlock); private const string PART_DayHeaderTextBlock = nameof(PART_DayHeaderTextBlock);
private TextBlock HeaderTextblock; private TextBlock HeaderTextblock;
@@ -53,4 +53,5 @@ public partial class DayHeaderControl : Control
HeaderTextblock.Text = DisplayType == DayHeaderDisplayType.TwelveHour ? Date.ToString("h tt") : Date.ToString("HH:mm"); HeaderTextblock.Text = DisplayType == DayHeaderDisplayType.TwelveHour ? Date.ToString("h tt") : Date.ToString("HH:mm");
} }
} }
}
} }

View File

@@ -10,10 +10,10 @@ using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
using Wino.Helpers; using Wino.Helpers;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class WinoCalendarControl : Control
{ {
public class WinoCalendarControl : Control
{
private const string PART_WinoFlipView = nameof(PART_WinoFlipView); private const string PART_WinoFlipView = nameof(PART_WinoFlipView);
private const string PART_IdleGrid = nameof(PART_IdleGrid); private const string PART_IdleGrid = nameof(PART_IdleGrid);
@@ -296,4 +296,5 @@ public partial class WinoCalendarControl : Control
{ {
return this.FindDescendants<CalendarItemControl>().FirstOrDefault(a => a.CalendarItem == calendarItemViewModel); return this.FindDescendants<CalendarItemControl>().FirstOrDefault(a => a.CalendarItem == calendarItemViewModel);
} }
}
} }

View File

@@ -8,10 +8,10 @@ using Windows.UI.Xaml.Controls;
using Wino.Core.Domain.Collections; using Wino.Core.Domain.Collections;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class WinoCalendarFlipView : CustomCalendarFlipView
{ {
public class WinoCalendarFlipView : CustomCalendarFlipView
{
public static readonly DependencyProperty IsIdleProperty = DependencyProperty.Register(nameof(IsIdle), typeof(bool), typeof(WinoCalendarFlipView), new PropertyMetadata(true)); public static readonly DependencyProperty IsIdleProperty = DependencyProperty.Register(nameof(IsIdle), typeof(bool), typeof(WinoCalendarFlipView), new PropertyMetadata(true));
public static readonly DependencyProperty ActiveCanvasProperty = DependencyProperty.Register(nameof(ActiveCanvas), typeof(WinoDayTimelineCanvas), typeof(WinoCalendarFlipView), new PropertyMetadata(null)); public static readonly DependencyProperty ActiveCanvasProperty = DependencyProperty.Register(nameof(ActiveCanvas), typeof(WinoDayTimelineCanvas), typeof(WinoCalendarFlipView), new PropertyMetadata(null));
public static readonly DependencyProperty ActiveVerticalScrollViewerProperty = DependencyProperty.Register(nameof(ActiveVerticalScrollViewer), typeof(ScrollViewer), typeof(WinoCalendarFlipView), new PropertyMetadata(null)); public static readonly DependencyProperty ActiveVerticalScrollViewerProperty = DependencyProperty.Register(nameof(ActiveVerticalScrollViewer), typeof(ScrollViewer), typeof(WinoCalendarFlipView), new PropertyMetadata(null));
@@ -182,4 +182,5 @@ public partial class WinoCalendarFlipView : CustomCalendarFlipView
private ObservableRangeCollection<DayRangeRenderModel> GetItemsSource() private ObservableRangeCollection<DayRangeRenderModel> GetItemsSource()
=> ItemsSource as ObservableRangeCollection<DayRangeRenderModel>; => ItemsSource as ObservableRangeCollection<DayRangeRenderModel>;
}
} }

View File

@@ -11,10 +11,10 @@ using Wino.Calendar.Models;
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class WinoCalendarPanel : Panel
{ {
public class WinoCalendarPanel : Panel
{
private const double LastItemRightExtraMargin = 12d; private const double LastItemRightExtraMargin = 12d;
// Store each ICalendarItem measurements by their Id. // Store each ICalendarItem measurements by their Id.
@@ -290,4 +290,5 @@ public partial class WinoCalendarPanel : Panel
} }
#endregion #endregion
}
} }

View File

@@ -4,10 +4,10 @@ using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class WinoCalendarTypeSelectorControl : Control
{ {
public class WinoCalendarTypeSelectorControl : Control
{
private const string PART_TodayButton = nameof(PART_TodayButton); private const string PART_TodayButton = nameof(PART_TodayButton);
private const string PART_DayToggle = nameof(PART_DayToggle); private const string PART_DayToggle = nameof(PART_DayToggle);
private const string PART_WeekToggle = nameof(PART_WeekToggle); private const string PART_WeekToggle = nameof(PART_WeekToggle);
@@ -88,4 +88,5 @@ public partial class WinoCalendarTypeSelectorControl : Control
_monthToggle.IsChecked = SelectedType == CalendarDisplayType.Month; _monthToggle.IsChecked = SelectedType == CalendarDisplayType.Month;
_yearToggle.IsChecked = SelectedType == CalendarDisplayType.Year; _yearToggle.IsChecked = SelectedType == CalendarDisplayType.Year;
} }
}
} }

View File

@@ -8,10 +8,10 @@ using Windows.UI.Xaml.Media;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
using Wino.Helpers; using Wino.Helpers;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class WinoCalendarView : Control
{ {
public class WinoCalendarView : Control
{
private const string PART_DayViewItemBorder = nameof(PART_DayViewItemBorder); private const string PART_DayViewItemBorder = nameof(PART_DayViewItemBorder);
private const string PART_CalendarView = nameof(PART_CalendarView); private const string PART_CalendarView = nameof(PART_CalendarView);
@@ -144,4 +144,5 @@ public partial class WinoCalendarView : Control
} }
} }
} }
}
} }

View File

@@ -10,10 +10,10 @@ using Windows.UI.Xaml.Media;
using Wino.Calendar.Args; using Wino.Calendar.Args;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
namespace Wino.Calendar.Controls; namespace Wino.Calendar.Controls
public partial class WinoDayTimelineCanvas : Control, IDisposable
{ {
public class WinoDayTimelineCanvas : Control, IDisposable
{
public event EventHandler<TimelineCellSelectedArgs> TimelineCellSelected; public event EventHandler<TimelineCellSelectedArgs> TimelineCellSelected;
public event EventHandler<TimelineCellUnselectedArgs> TimelineCellUnselected; public event EventHandler<TimelineCellUnselectedArgs> TimelineCellUnselected;
@@ -274,4 +274,5 @@ public partial class WinoDayTimelineCanvas : Control, IDisposable
Canvas = null; Canvas = null;
} }
}
} }

View File

@@ -10,10 +10,10 @@ using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
using Wino.Helpers; using Wino.Helpers;
namespace Wino.Calendar.Helpers; namespace Wino.Calendar.Helpers
public static class CalendarXamlHelpers
{ {
public static class CalendarXamlHelpers
{
public static CalendarItemViewModel GetFirstAllDayEvent(CalendarEventCollection collection) public static CalendarItemViewModel GetFirstAllDayEvent(CalendarEventCollection collection)
=> (CalendarItemViewModel)collection.AllDayEvents.FirstOrDefault(); => (CalendarItemViewModel)collection.AllDayEvents.FirstOrDefault();
@@ -103,4 +103,5 @@ public static class CalendarXamlHelpers
return XamlHelpers.GetPlaccementModeForCalendarType(calendarDisplayType); return XamlHelpers.GetPlaccementModeForCalendarType(calendarDisplayType);
} }
}
} }

View File

@@ -15,15 +15,16 @@ using Windows.UI.Xaml.Navigation;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 // The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace Wino.Calendar; namespace Wino.Calendar
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{ {
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage() public MainPage()
{ {
this.InitializeComponent(); this.InitializeComponent();
} }
}
} }

View File

@@ -1,7 +1,7 @@
namespace Wino.Calendar.Models; namespace Wino.Calendar.Models
public struct CalendarItemMeasurement
{ {
public struct CalendarItemMeasurement
{
// Where to start? // Where to start?
public double Left { get; set; } public double Left { get; set; }
@@ -13,4 +13,5 @@ public struct CalendarItemMeasurement
Left = left; Left = left;
Right = right; Right = right;
} }
}
} }

View File

@@ -8,11 +8,6 @@
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
IgnorableNamespaces="uap mp"> IgnorableNamespaces="uap mp">
<Identity
Name="58272BurakKSE.WinoCalendar"
Publisher="CN=51FBDAF3-E212-4149-89A2-A2636B3BC911"
Version="1.0.15.0" />
<!-- Publisher Cache Folders --> <!-- Publisher Cache Folders -->
<Extensions> <Extensions>
<Extension Category="windows.publisherCacheFolders"> <Extension Category="windows.publisherCacheFolders">
@@ -22,6 +17,11 @@
</Extension> </Extension>
</Extensions> </Extensions>
<Identity
Name="58272BurakKSE.WinoCalendar"
Publisher="CN=51FBDAF3-E212-4149-89A2-A2636B3BC911"
Version="1.0.15.0" />
<mp:PhoneIdentity PhoneProductId="f047b7dd-96ec-4d54-a862-9321e271e449" PhonePublisherId="00000000-0000-0000-0000-000000000000"/> <mp:PhoneIdentity PhoneProductId="f047b7dd-96ec-4d54-a862-9321e271e449" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties> <Properties>

View File

@@ -0,0 +1,29 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Wino.Calendar")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Wino.Calendar")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: ComVisible(false)]

View File

@@ -0,0 +1,44 @@
<!--
This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most
developers. However, you can modify these parameters to modify the behavior of the .NET Native
optimizer.
Runtime Directives are documented at https://go.microsoft.com/fwlink/?LinkID=391919
To fully enable reflection for App1.MyClass and all of its public/private members
<Type Name="App1.MyClass" Dynamic="Required All"/>
To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32
<TypeInstantiation Name="App1.AppClass" Arguments="System.Int32" Activate="Required Public" />
Using the Namespace directive to apply reflection policy to all the types in a particular namespace
<Namespace Name="DataClasses.ViewModels" Serialize="All" />
-->
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<!--
An Assembly element with Name="*Application*" applies to all assemblies in
the application package. The asterisks are not wildcards.
-->
<Assembly Name="*Application*" Dynamic="Required All" />
<!-- Reduce memory footprint when building with Microsoft.Graph -->
<Assembly Name="Microsoft.Graph" Serialize="Excluded" />
<Assembly Name="Microsoft.Kiota.Abstractions" Dynamic="Public" />
<Assembly Name="Microsoft.Kiota.Authentication.Azure" Dynamic="Public" />
<Assembly Name="Microsoft.Kiota.Http.HttpClientLibrary" Dynamic="Public" />
<Assembly Name="Microsoft.Kiota.Serialization.Form" Dynamic="Public" />
<Assembly Name="Microsoft.Kiota.Serialization.Json" Dynamic="Public" />
<Assembly Name="Microsoft.Kiota.Serialization.Multipart" Dynamic="Public" />
<!-- Add your application specific runtime directives here. -->
<Type Name="Windows.Foundation.TypedEventHandler{Microsoft.UI.Xaml.Controls.NavigationView,Microsoft.UI.Xaml.Controls.NavigationViewItemInvokedEventArgs}" MarshalObject="Public" />
<Type Name="Microsoft.UI.Xaml.Controls.NavigationView">
<Event Name="ItemInvoked" Dynamic="Required"/>
</Type>
</Application>
</Directives>

View File

@@ -1,7 +0,0 @@
{
"profiles": {
"Wino.Calendar": {
"commandName": "MsixPackage"
}
}
}

View File

@@ -2,10 +2,10 @@
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
namespace Wino.Calendar.Selectors; namespace Wino.Calendar.Selectors
public partial class CustomAreaCalendarItemSelector : DataTemplateSelector
{ {
public class CustomAreaCalendarItemSelector : DataTemplateSelector
{
public DataTemplate AllDayTemplate { get; set; } public DataTemplate AllDayTemplate { get; set; }
public DataTemplate MultiDayTemplate { get; set; } public DataTemplate MultiDayTemplate { get; set; }
@@ -18,4 +18,5 @@ public partial class CustomAreaCalendarItemSelector : DataTemplateSelector
return base.SelectTemplateCore(item, container); return base.SelectTemplateCore(item, container);
} }
}
} }

View File

@@ -2,10 +2,10 @@
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Calendar.Selectors; namespace Wino.Calendar.Selectors
public partial class WinoCalendarItemTemplateSelector : DataTemplateSelector
{ {
public class WinoCalendarItemTemplateSelector : DataTemplateSelector
{
public CalendarDisplayType DisplayType { get; set; } public CalendarDisplayType DisplayType { get; set; }
public DataTemplate DayWeekWorkWeekTemplate { get; set; } public DataTemplate DayWeekWorkWeekTemplate { get; set; }
@@ -30,4 +30,5 @@ public partial class WinoCalendarItemTemplateSelector : DataTemplateSelector
return base.SelectTemplateCore(item, container); return base.SelectTemplateCore(item, container);
} }
}
} }

View File

@@ -7,19 +7,19 @@ using Wino.Calendar.ViewModels.Data;
using Wino.Calendar.ViewModels.Interfaces; using Wino.Calendar.ViewModels.Interfaces;
using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Entities.Shared;
namespace Wino.Calendar.Services; namespace Wino.Calendar.Services
/// <summary>
/// Encapsulated state manager for collectively managing the state of account calendars.
/// Callers must react to the events to update their state only from this service.
/// </summary>
public partial class AccountCalendarStateService : ObservableObject, IAccountCalendarStateService
{ {
/// <summary>
/// Encapsulated state manager for collectively managing the state of account calendars.
/// Callers must react to the events to update their state only from this service.
/// </summary>
public partial class AccountCalendarStateService : ObservableObject, IAccountCalendarStateService
{
public event EventHandler<GroupedAccountCalendarViewModel> CollectiveAccountGroupSelectionStateChanged; public event EventHandler<GroupedAccountCalendarViewModel> CollectiveAccountGroupSelectionStateChanged;
public event EventHandler<AccountCalendarViewModel> AccountCalendarSelectionStateChanged; public event EventHandler<AccountCalendarViewModel> AccountCalendarSelectionStateChanged;
[ObservableProperty] [ObservableProperty]
public partial ReadOnlyObservableCollection<GroupedAccountCalendarViewModel> GroupedAccountCalendars { get; set; } private ReadOnlyObservableCollection<GroupedAccountCalendarViewModel> groupedAccountCalendars;
private ObservableCollection<GroupedAccountCalendarViewModel> _internalGroupedAccountCalendars = new ObservableCollection<GroupedAccountCalendarViewModel>(); private ObservableCollection<GroupedAccountCalendarViewModel> _internalGroupedAccountCalendars = new ObservableCollection<GroupedAccountCalendarViewModel>();
@@ -110,4 +110,5 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
RemoveGroupedAccountCalendar(group); RemoveGroupedAccountCalendar(group);
} }
} }
}
} }

View File

@@ -1,9 +1,9 @@
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
namespace Wino.Calendar.Services; namespace Wino.Calendar.Services
public class CalendarAuthenticatorConfig : IAuthenticatorConfig
{ {
public class CalendarAuthenticatorConfig : IAuthenticatorConfig
{
public string OutlookAuthenticatorClientId => "b19c2035-d740-49ff-b297-de6ec561b208"; public string OutlookAuthenticatorClientId => "b19c2035-d740-49ff-b297-de6ec561b208";
public string[] OutlookScope => new string[] public string[] OutlookScope => new string[]
@@ -29,4 +29,5 @@ public class CalendarAuthenticatorConfig : IAuthenticatorConfig
}; };
public string GmailTokenStoreIdentifier => "WinoCalendarGmailTokenStore"; public string GmailTokenStoreIdentifier => "WinoCalendarGmailTokenStore";
}
} }

View File

@@ -2,13 +2,14 @@
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.UWP.Services; using Wino.Core.UWP.Services;
namespace Wino.Calendar.Services; namespace Wino.Calendar.Services
public class DialogService : DialogServiceBase, ICalendarDialogService
{ {
public class DialogService : DialogServiceBase, ICalendarDialogService
{
public DialogService(IThemeService themeService, public DialogService(IThemeService themeService,
IConfigurationService configurationService, IConfigurationService configurationService,
IApplicationResourceManager<ResourceDictionary> applicationResourceManager) : base(themeService, configurationService, applicationResourceManager) IApplicationResourceManager<ResourceDictionary> applicationResourceManager) : base(themeService, configurationService, applicationResourceManager)
{ {
} }
}
} }

View File

@@ -10,10 +10,10 @@ using Wino.Core.Domain.Models.Navigation;
using Wino.Core.UWP.Services; using Wino.Core.UWP.Services;
using Wino.Views; using Wino.Views;
namespace Wino.Calendar.Services; namespace Wino.Calendar.Services
public class NavigationService : NavigationServiceBase, INavigationService
{ {
public class NavigationService : NavigationServiceBase, INavigationService
{
public Type GetPageType(WinoPage winoPage) public Type GetPageType(WinoPage winoPage)
{ {
return winoPage switch return winoPage switch
@@ -59,4 +59,5 @@ public class NavigationService : NavigationServiceBase, INavigationService
return false; return false;
} }
}
} }

View File

@@ -4,10 +4,10 @@ using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Accounts; using Wino.Core.Domain.Models.Accounts;
namespace Wino.Calendar.Services; namespace Wino.Calendar.Services
public class ProviderService : IProviderService
{ {
public class ProviderService : IProviderService
{
public IProviderDetail GetProviderDetail(MailProviderType type) public IProviderDetail GetProviderDetail(MailProviderType type)
{ {
var details = GetAvailableProviders(); var details = GetAvailableProviders();
@@ -32,4 +32,5 @@ public class ProviderService : IProviderService
return providerList; return providerList;
} }
}
} }

File diff suppressed because one or more lines are too long

View File

@@ -1,11 +1,12 @@
using Windows.UI.Xaml; using Windows.UI.Xaml;
namespace Wino.Calendar.Styles; namespace Wino.Calendar.Styles
public sealed partial class WinoCalendarResources : ResourceDictionary
{ {
public sealed partial class WinoCalendarResources : ResourceDictionary
{
public WinoCalendarResources() public WinoCalendarResources()
{ {
this.InitializeComponent(); this.InitializeComponent();
} }
}
} }

View File

@@ -1,6 +1,7 @@
using Wino.Calendar.ViewModels; using Wino.Calendar.ViewModels;
using Wino.Core.UWP; using Wino.Core.UWP;
namespace Wino.Calendar.Views.Abstract; namespace Wino.Calendar.Views.Abstract
{
public abstract class AccountDetailsPageAbstract : BasePage<AccountDetailsPageViewModel> { } public abstract class AccountDetailsPageAbstract : BasePage<AccountDetailsPageViewModel> { }
}

View File

@@ -1,6 +1,7 @@
using Wino.Calendar.ViewModels; using Wino.Calendar.ViewModels;
using Wino.Core.UWP; using Wino.Core.UWP;
namespace Wino.Calendar.Views.Abstract; namespace Wino.Calendar.Views.Abstract
{
public partial class AccountManagementPageAbstract : BasePage<AccountManagementViewModel> { } public class AccountManagementPageAbstract : BasePage<AccountManagementViewModel> { }
}

View File

@@ -1,6 +1,7 @@
using Wino.Calendar.ViewModels; using Wino.Calendar.ViewModels;
using Wino.Core.UWP; using Wino.Core.UWP;
namespace Wino.Calendar.Views.Abstract; namespace Wino.Calendar.Views.Abstract
{
public abstract class AppShellAbstract : BasePage<AppShellViewModel> { } public abstract class AppShellAbstract : BasePage<AppShellViewModel> { }
}

View File

@@ -1,6 +1,7 @@
using Wino.Calendar.ViewModels; using Wino.Calendar.ViewModels;
using Wino.Core.UWP; using Wino.Core.UWP;
namespace Wino.Calendar.Views.Abstract; namespace Wino.Calendar.Views.Abstract
{
public abstract class CalendarPageAbstract : BasePage<CalendarPageViewModel> { } public abstract class CalendarPageAbstract : BasePage<CalendarPageViewModel> { }
}

View File

@@ -1,6 +1,7 @@
using Wino.Calendar.ViewModels; using Wino.Calendar.ViewModels;
using Wino.Core.UWP; using Wino.Core.UWP;
namespace Wino.Calendar.Views.Abstract; namespace Wino.Calendar.Views.Abstract
{
public abstract class CalendarSettingsPageAbstract : BasePage<CalendarSettingsPageViewModel> { } public abstract class CalendarSettingsPageAbstract : BasePage<CalendarSettingsPageViewModel> { }
}

View File

@@ -1,6 +1,7 @@
using Wino.Calendar.ViewModels; using Wino.Calendar.ViewModels;
using Wino.Core.UWP; using Wino.Core.UWP;
namespace Wino.Calendar.Views.Abstract; namespace Wino.Calendar.Views.Abstract
{
public abstract class EventDetailsPageAbstract : BasePage<EventDetailsPageViewModel> { } public abstract class EventDetailsPageAbstract : BasePage<EventDetailsPageViewModel> { }
}

View File

@@ -1,6 +1,7 @@
using Wino.Core.UWP; using Wino.Core.UWP;
using Wino.Core.ViewModels; using Wino.Core.ViewModels;
namespace Wino.Calendar.Views.Abstract; namespace Wino.Calendar.Views.Abstract
{
public partial class PersonalizationPageAbstract : BasePage<PersonalizationPageViewModel> { } public class PersonalizationPageAbstract : BasePage<PersonalizationPageViewModel> { }
}

View File

@@ -1,11 +1,12 @@
using Wino.Calendar.Views.Abstract; using Wino.Calendar.Views.Abstract;
namespace Wino.Calendar.Views.Account; namespace Wino.Calendar.Views.Account
public sealed partial class AccountManagementPage : AccountManagementPageAbstract
{ {
public sealed partial class AccountManagementPage : AccountManagementPageAbstract
{
public AccountManagementPage() public AccountManagementPage()
{ {
InitializeComponent(); InitializeComponent();
} }
}
} }

View File

@@ -5,11 +5,11 @@ using Wino.Calendar.Views.Abstract;
using Wino.Core.UWP; using Wino.Core.UWP;
using Wino.Messaging.Client.Calendar; using Wino.Messaging.Client.Calendar;
namespace Wino.Calendar.Views; namespace Wino.Calendar.Views
public sealed partial class AppShell : AppShellAbstract,
IRecipient<CalendarDisplayTypeChangedMessage>
{ {
public sealed partial class AppShell : AppShellAbstract,
IRecipient<CalendarDisplayTypeChangedMessage>
{
private const string STATE_HorizontalCalendar = "HorizontalCalendar"; private const string STATE_HorizontalCalendar = "HorizontalCalendar";
private const string STATE_VerticalCalendar = "VerticalCalendar"; private const string STATE_VerticalCalendar = "VerticalCalendar";
@@ -50,4 +50,5 @@ public sealed partial class AppShell : AppShellAbstract,
private void AppBarBackButtonClicked(Core.UWP.Controls.WinoAppTitleBar sender, RoutedEventArgs args) private void AppBarBackButtonClicked(Core.UWP.Controls.WinoAppTitleBar sender, RoutedEventArgs args)
=> ViewModel.NavigationService.GoBack(); => ViewModel.NavigationService.GoBack();
}
} }

View File

@@ -9,14 +9,14 @@ using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
using Wino.Messaging.Client.Calendar; using Wino.Messaging.Client.Calendar;
namespace Wino.Calendar.Views; namespace Wino.Calendar.Views
{
public sealed partial class CalendarPage : CalendarPageAbstract, public sealed partial class CalendarPage : CalendarPageAbstract,
IRecipient<ScrollToDateMessage>, IRecipient<ScrollToDateMessage>,
IRecipient<ScrollToHourMessage>, IRecipient<ScrollToHourMessage>,
IRecipient<GoNextDateRequestedMessage>, IRecipient<GoNextDateRequestedMessage>,
IRecipient<GoPreviousDateRequestedMessage> IRecipient<GoPreviousDateRequestedMessage>
{ {
private const int PopupDialogOffset = 12; private const int PopupDialogOffset = 12;
public CalendarPage() public CalendarPage()
@@ -157,4 +157,5 @@ public sealed partial class CalendarPage : CalendarPageAbstract,
// In case of scrolling, we must dismiss the event details dialog. // In case of scrolling, we must dismiss the event details dialog.
ViewModel.DisplayDetailsCalendarItemViewModel = null; ViewModel.DisplayDetailsCalendarItemViewModel = null;
} }
}
} }

View File

@@ -1,12 +1,13 @@
using Wino.Calendar.Views.Abstract; using Wino.Calendar.Views.Abstract;
namespace Wino.Calendar.Views; namespace Wino.Calendar.Views
public sealed partial class EventDetailsPage : EventDetailsPageAbstract
{ {
public sealed partial class EventDetailsPage : EventDetailsPageAbstract
{
public EventDetailsPage() public EventDetailsPage()
{ {
this.InitializeComponent(); this.InitializeComponent();
} }
}
} }

View File

@@ -20,7 +20,7 @@
<controls:SettingsCard.HeaderIcon> <controls:SettingsCard.HeaderIcon>
<PathIcon Data="F1 M 10 0.625 C 10 0.45573 10.061849 0.309246 10.185547 0.185547 C 10.309244 0.06185 10.455729 0 10.625 0 L 15.625 0 C 15.79427 0 15.940754 0.06185 16.064453 0.185547 C 16.18815 0.309246 16.25 0.45573 16.25 0.625 C 16.25 0.794271 16.18815 0.940756 16.064453 1.064453 C 15.940754 1.188152 15.79427 1.25 15.625 1.25 L 13.75 1.25 L 13.75 18.75 L 15.625 18.75 C 15.79427 18.75 15.940754 18.81185 16.064453 18.935547 C 16.18815 19.059244 16.25 19.205729 16.25 19.375 C 16.25 19.544271 16.18815 19.690756 16.064453 19.814453 C 15.940754 19.93815 15.79427 20 15.625 20 L 10.625 20 C 10.455729 20 10.309244 19.93815 10.185547 19.814453 C 10.061849 19.690756 10 19.544271 10 19.375 C 10 19.205729 10.061849 19.059244 10.185547 18.935547 C 10.309244 18.81185 10.455729 18.75 10.625 18.75 L 12.5 18.75 L 12.5 1.25 L 10.625 1.25 C 10.455729 1.25 10.309244 1.188152 10.185547 1.064453 C 10.061849 0.940756 10 0.794271 10 0.625 Z M 0 6.25 C 0 5.735678 0.097656 5.250651 0.292969 4.794922 C 0.488281 4.339193 0.756836 3.94043 1.098633 3.598633 C 1.44043 3.256836 1.837565 2.988281 2.290039 2.792969 C 2.742513 2.597656 3.229167 2.5 3.75 2.5 L 11.25 2.5 L 11.25 3.75 L 3.75 3.75 C 3.404948 3.75 3.081055 3.815105 2.77832 3.945312 C 2.475586 4.075521 2.210286 4.254558 1.982422 4.482422 C 1.754557 4.710287 1.575521 4.975587 1.445312 5.27832 C 1.315104 5.581056 1.25 5.904949 1.25 6.25 L 1.25 13.75 C 1.25 14.095053 1.315104 14.418945 1.445312 14.72168 C 1.575521 15.024414 1.754557 15.289714 1.982422 15.517578 C 2.210286 15.745443 2.475586 15.924479 2.77832 16.054688 C 3.081055 16.184896 3.404948 16.25 3.75 16.25 L 11.25 16.25 L 11.25 17.5 L 3.75 17.5 C 3.229167 17.5 2.742513 17.402344 2.290039 17.207031 C 1.837565 17.011719 1.44043 16.743164 1.098633 16.401367 C 0.756836 16.05957 0.488281 15.662436 0.292969 15.209961 C 0.097656 14.757487 0 14.270834 0 13.75 Z M 15 3.75 L 15 2.5 L 16.25 2.5 C 16.764322 2.5 17.249348 2.597656 17.705078 2.792969 C 18.160807 2.988281 18.55957 3.256836 18.901367 3.598633 C 19.243164 3.94043 19.511719 4.339193 19.707031 4.794922 C 19.902344 5.250651 20 5.735678 20 6.25 L 20 13.75 C 20 14.270834 19.902344 14.757487 19.707031 15.209961 C 19.511719 15.662436 19.243164 16.05957 18.901367 16.401367 C 18.55957 16.743164 18.160807 17.011719 17.705078 17.207031 C 17.249348 17.402344 16.764322 17.5 16.25 17.5 L 15 17.5 L 15 16.25 L 16.25 16.25 C 16.595051 16.25 16.918945 16.184896 17.22168 16.054688 C 17.524414 15.924479 17.789713 15.745443 18.017578 15.517578 C 18.245441 15.289714 18.424479 15.024414 18.554688 14.72168 C 18.684895 14.418945 18.75 14.095053 18.75 13.75 L 18.75 6.25 C 18.75 5.904949 18.684895 5.581056 18.554688 5.27832 C 18.424479 4.975587 18.245441 4.710287 18.017578 4.482422 C 17.789713 4.254558 17.524414 4.075521 17.22168 3.945312 C 16.918945 3.815105 16.595051 3.75 16.25 3.75 Z M 7.441406 5.361328 C 7.389323 5.250651 7.312825 5.162761 7.211914 5.097656 C 7.111002 5.032553 6.998697 5.000001 6.875 5 C 6.751302 5.000001 6.638997 5.032553 6.538086 5.097656 C 6.437174 5.162761 6.360677 5.250651 6.308594 5.361328 L 2.871094 12.861328 C 2.799479 13.017578 2.792969 13.177084 2.851562 13.339844 C 2.910156 13.502604 3.017578 13.619792 3.173828 13.691406 C 3.330078 13.763021 3.489583 13.769531 3.652344 13.710938 C 3.815104 13.652344 3.932292 13.544922 4.003906 13.388672 L 4.84375 11.5625 L 8.896484 11.5625 L 8.90625 11.5625 L 9.746094 13.388672 C 9.817708 13.544922 9.934896 13.652344 10.097656 13.710938 C 10.260416 13.769531 10.419922 13.763021 10.576172 13.691406 C 10.732422 13.619792 10.839844 13.502604 10.898438 13.339844 C 10.957031 13.177084 10.950521 13.017578 10.878906 12.861328 Z M 5.410156 10.3125 L 6.875 7.128906 L 8.339844 10.3125 Z " /> <PathIcon Data="F1 M 10 0.625 C 10 0.45573 10.061849 0.309246 10.185547 0.185547 C 10.309244 0.06185 10.455729 0 10.625 0 L 15.625 0 C 15.79427 0 15.940754 0.06185 16.064453 0.185547 C 16.18815 0.309246 16.25 0.45573 16.25 0.625 C 16.25 0.794271 16.18815 0.940756 16.064453 1.064453 C 15.940754 1.188152 15.79427 1.25 15.625 1.25 L 13.75 1.25 L 13.75 18.75 L 15.625 18.75 C 15.79427 18.75 15.940754 18.81185 16.064453 18.935547 C 16.18815 19.059244 16.25 19.205729 16.25 19.375 C 16.25 19.544271 16.18815 19.690756 16.064453 19.814453 C 15.940754 19.93815 15.79427 20 15.625 20 L 10.625 20 C 10.455729 20 10.309244 19.93815 10.185547 19.814453 C 10.061849 19.690756 10 19.544271 10 19.375 C 10 19.205729 10.061849 19.059244 10.185547 18.935547 C 10.309244 18.81185 10.455729 18.75 10.625 18.75 L 12.5 18.75 L 12.5 1.25 L 10.625 1.25 C 10.455729 1.25 10.309244 1.188152 10.185547 1.064453 C 10.061849 0.940756 10 0.794271 10 0.625 Z M 0 6.25 C 0 5.735678 0.097656 5.250651 0.292969 4.794922 C 0.488281 4.339193 0.756836 3.94043 1.098633 3.598633 C 1.44043 3.256836 1.837565 2.988281 2.290039 2.792969 C 2.742513 2.597656 3.229167 2.5 3.75 2.5 L 11.25 2.5 L 11.25 3.75 L 3.75 3.75 C 3.404948 3.75 3.081055 3.815105 2.77832 3.945312 C 2.475586 4.075521 2.210286 4.254558 1.982422 4.482422 C 1.754557 4.710287 1.575521 4.975587 1.445312 5.27832 C 1.315104 5.581056 1.25 5.904949 1.25 6.25 L 1.25 13.75 C 1.25 14.095053 1.315104 14.418945 1.445312 14.72168 C 1.575521 15.024414 1.754557 15.289714 1.982422 15.517578 C 2.210286 15.745443 2.475586 15.924479 2.77832 16.054688 C 3.081055 16.184896 3.404948 16.25 3.75 16.25 L 11.25 16.25 L 11.25 17.5 L 3.75 17.5 C 3.229167 17.5 2.742513 17.402344 2.290039 17.207031 C 1.837565 17.011719 1.44043 16.743164 1.098633 16.401367 C 0.756836 16.05957 0.488281 15.662436 0.292969 15.209961 C 0.097656 14.757487 0 14.270834 0 13.75 Z M 15 3.75 L 15 2.5 L 16.25 2.5 C 16.764322 2.5 17.249348 2.597656 17.705078 2.792969 C 18.160807 2.988281 18.55957 3.256836 18.901367 3.598633 C 19.243164 3.94043 19.511719 4.339193 19.707031 4.794922 C 19.902344 5.250651 20 5.735678 20 6.25 L 20 13.75 C 20 14.270834 19.902344 14.757487 19.707031 15.209961 C 19.511719 15.662436 19.243164 16.05957 18.901367 16.401367 C 18.55957 16.743164 18.160807 17.011719 17.705078 17.207031 C 17.249348 17.402344 16.764322 17.5 16.25 17.5 L 15 17.5 L 15 16.25 L 16.25 16.25 C 16.595051 16.25 16.918945 16.184896 17.22168 16.054688 C 17.524414 15.924479 17.789713 15.745443 18.017578 15.517578 C 18.245441 15.289714 18.424479 15.024414 18.554688 14.72168 C 18.684895 14.418945 18.75 14.095053 18.75 13.75 L 18.75 6.25 C 18.75 5.904949 18.684895 5.581056 18.554688 5.27832 C 18.424479 4.975587 18.245441 4.710287 18.017578 4.482422 C 17.789713 4.254558 17.524414 4.075521 17.22168 3.945312 C 16.918945 3.815105 16.595051 3.75 16.25 3.75 Z M 7.441406 5.361328 C 7.389323 5.250651 7.312825 5.162761 7.211914 5.097656 C 7.111002 5.032553 6.998697 5.000001 6.875 5 C 6.751302 5.000001 6.638997 5.032553 6.538086 5.097656 C 6.437174 5.162761 6.360677 5.250651 6.308594 5.361328 L 2.871094 12.861328 C 2.799479 13.017578 2.792969 13.177084 2.851562 13.339844 C 2.910156 13.502604 3.017578 13.619792 3.173828 13.691406 C 3.330078 13.763021 3.489583 13.769531 3.652344 13.710938 C 3.815104 13.652344 3.932292 13.544922 4.003906 13.388672 L 4.84375 11.5625 L 8.896484 11.5625 L 8.90625 11.5625 L 9.746094 13.388672 C 9.817708 13.544922 9.934896 13.652344 10.097656 13.710938 C 10.260416 13.769531 10.419922 13.763021 10.576172 13.691406 C 10.732422 13.619792 10.839844 13.502604 10.898438 13.339844 C 10.957031 13.177084 10.950521 13.017578 10.878906 12.861328 Z M 5.410156 10.3125 L 6.875 7.128906 L 8.339844 10.3125 Z " />
</controls:SettingsCard.HeaderIcon> </controls:SettingsCard.HeaderIcon>
<Button Command="{x:Bind ViewModel.EditAccountDetailsCommand}" Content="{x:Bind domain:Translator.FolderOperation_Rename}" /> <Button Command="{x:Bind ViewModel.RenameAccountCommand}" Content="{x:Bind domain:Translator.FolderOperation_Rename}" />
</controls:SettingsCard> </controls:SettingsCard>
<!-- TODO --> <!-- TODO -->

View File

@@ -1,11 +1,12 @@
using Wino.Calendar.Views.Abstract; using Wino.Calendar.Views.Abstract;
namespace Wino.Calendar.Views.Settings; namespace Wino.Calendar.Views.Settings
public sealed partial class AccountDetailsPage : AccountDetailsPageAbstract
{ {
public sealed partial class AccountDetailsPage : AccountDetailsPageAbstract
{
public AccountDetailsPage() public AccountDetailsPage()
{ {
this.InitializeComponent(); this.InitializeComponent();
} }
}
} }

View File

@@ -1,12 +1,13 @@
using Wino.Calendar.Views.Abstract; using Wino.Calendar.Views.Abstract;
namespace Wino.Calendar.Views.Settings; namespace Wino.Calendar.Views.Settings
public sealed partial class CalendarSettingsPage : CalendarSettingsPageAbstract
{ {
public sealed partial class CalendarSettingsPage : CalendarSettingsPageAbstract
{
public CalendarSettingsPage() public CalendarSettingsPage()
{ {
InitializeComponent(); InitializeComponent();
} }
}
} }

View File

@@ -1,11 +1,12 @@
using Wino.Calendar.Views.Abstract; using Wino.Calendar.Views.Abstract;
namespace Wino.Calendar.Views.Settings; namespace Wino.Calendar.Views.Settings
public sealed partial class PersonalizationPage : PersonalizationPageAbstract
{ {
public sealed partial class PersonalizationPage : PersonalizationPageAbstract
{
public PersonalizationPage() public PersonalizationPage()
{ {
this.InitializeComponent(); this.InitializeComponent();
} }
}
} }

View File

@@ -1,31 +1,184 @@
<Project Sdk="Microsoft.NET.Sdk"> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <LangVersion>8.0</LangVersion>
<TargetFramework>net9.0-windows10.0.26100.0</TargetFramework> <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<TargetPlatformMinVersion>10.0.18362.0</TargetPlatformMinVersion> <!-- UWP WAM Authentication on Xbox needs this. -->
<UseUwp>true</UseUwp> <UseDotNetNativeSharedAssemblyFrameworkPackage>false</UseDotNetNativeSharedAssemblyFrameworkPackage>
<Platforms>x86;x64;arm64</Platforms> <PackageCertificateThumbprint>
<RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers> </PackageCertificateThumbprint>
<DefaultLanguage>en-US</DefaultLanguage> <PackageCertificateKeyFile>Wino.Mail_TemporaryKey.pfx</PackageCertificateKeyFile>
<!--<PublishAot>true</PublishAot>--> <GenerateAppInstallerFile>False</GenerateAppInstallerFile>
<PublishProfile>win-$(Platform).pubxml</PublishProfile>
<DisableRuntimeMarshalling>true</DisableRuntimeMarshalling>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<GenerateAppInstallerFile>True</GenerateAppInstallerFile>
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm> <AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
<AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>
<AppxSymbolPackageEnabled>False</AppxSymbolPackageEnabled>
<GenerateTestArtifacts>True</GenerateTestArtifacts>
<AppxBundle>Always</AppxBundle>
<AppxBundlePlatforms>x64</AppxBundlePlatforms>
<HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
</PropertyGroup>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{600F4979-DB7E-409D-B7DA-B60BE4C55C35}</ProjectGuid>
<OutputType>AppContainerExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Wino.Calendar</RootNamespace>
<AssemblyName>Wino.Calendar</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.22621.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WindowsXamlEnableOverview>true</WindowsXamlEnableOverview>
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
<GenerateTemporaryStoreCertificate>True</GenerateTemporaryStoreCertificate>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM64'">
<OutputPath>bin\ARM64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<!-- .NET Native Shit -->
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
<UseDotNetNativeSharedAssemblyFrameworkPackage>false</UseDotNetNativeSharedAssemblyFrameworkPackage>
<Use64BitCompiler>true</Use64BitCompiler>
<OutOfProcPDB>true</OutOfProcPDB>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Remove="BundleArtifacts\**" /> <Compile Include="Activation\DefaultActivationHandler.cs" />
<EmbeddedResource Remove="BundleArtifacts\**" /> <Compile Include="App.xaml.cs">
<None Remove="BundleArtifacts\**" /> <DependentUpon>App.xaml</DependentUpon>
<Page Remove="BundleArtifacts\**" /> </Compile>
<Compile Include="Args\TimelineCellSelectedArgs.cs" />
<Compile Include="Args\TimelineCellUnselectedArgs.cs" />
<Compile Include="Controls\CalendarItemCommandBarFlyout.cs" />
<Compile Include="Controls\CalendarItemControl.xaml.cs">
<DependentUpon>CalendarItemControl.xaml</DependentUpon>
</Compile>
<Compile Include="Controls\CustomCalendarFlipView.cs" />
<Compile Include="Controls\DayColumnControl.cs" />
<Compile Include="Controls\DayHeaderControl.cs" />
<Compile Include="Controls\WinoCalendarControl.cs" />
<Compile Include="Controls\WinoCalendarFlipView.cs" />
<Compile Include="Controls\WinoCalendarPanel.cs" />
<Compile Include="Controls\WinoCalendarTypeSelectorControl.cs" />
<Compile Include="Controls\WinoCalendarView.cs" />
<Compile Include="Controls\WinoDayTimelineCanvas.cs" />
<Compile Include="Helpers\CalendarXamlHelpers.cs" />
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Models\CalendarItemMeasurement.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Selectors\CustomAreaCalendarItemSelector.cs" />
<Compile Include="Selectors\WinoCalendarItemTemplateSelector.cs" />
<Compile Include="Services\AccountCalendarStateService.cs" />
<Compile Include="Services\CalendarAuthenticatorConfig.cs" />
<Compile Include="Services\DialogService.cs" />
<Compile Include="Services\NavigationService.cs" />
<Compile Include="Services\ProviderService.cs" />
<Compile Include="Services\SettingsBuilderService.cs" />
<Compile Include="Styles\WinoCalendarResources.xaml.cs" />
<Compile Include="Views\Abstract\AccountDetailsPageAbstract.cs" />
<Compile Include="Views\Abstract\AccountManagementPageAbstract.cs" />
<Compile Include="Views\Abstract\AppShellAbstract.cs" />
<Compile Include="Views\Abstract\CalendarPageAbstract.cs" />
<Compile Include="Views\Abstract\CalendarSettingsPageAbstract.cs" />
<Compile Include="Views\Abstract\EventDetailsPageAbstract.cs" />
<Compile Include="Views\Abstract\PersonalizationPageAbstract.cs" />
<Compile Include="Views\Account\AccountManagementPage.xaml.cs">
<DependentUpon>AccountManagementPage.xaml</DependentUpon>
</Compile>
<Compile Include="Views\AppShell.xaml.cs">
<DependentUpon>AppShell.xaml</DependentUpon>
</Compile>
<Compile Include="Views\CalendarPage.xaml.cs">
<DependentUpon>CalendarPage.xaml</DependentUpon>
</Compile>
<Compile Include="Views\EventDetailsPage.xaml.cs">
<DependentUpon>EventDetailsPage.xaml</DependentUpon>
</Compile>
<Compile Include="Views\Settings\AccountDetailsPage.xaml.cs">
<DependentUpon>AccountDetailsPage.xaml</DependentUpon>
</Compile>
<Compile Include="Views\Settings\CalendarSettingsPage.xaml.cs">
<DependentUpon>CalendarSettingsPage.xaml</DependentUpon>
</Compile>
<Compile Include="Views\Settings\PersonalizationPage.xaml.cs">
<DependentUpon>PersonalizationPage.xaml</DependentUpon>
</Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PRIResource Remove="BundleArtifacts\**" /> <AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Package.StoreAssociation.xml" /> <None Include="Package.StoreAssociation.xml" />
<Content Include="Assets\LargeTile.scale-100.png" /> <Content Include="Assets\LargeTile.scale-100.png" />
@@ -73,6 +226,7 @@
<Content Include="Assets\Wide310x150Logo.scale-125.png" /> <Content Include="Assets\Wide310x150Logo.scale-125.png" />
<Content Include="Assets\Wide310x150Logo.scale-150.png" /> <Content Include="Assets\Wide310x150Logo.scale-150.png" />
<Content Include="Assets\Wide310x150Logo.scale-400.png" /> <Content Include="Assets\Wide310x150Logo.scale-400.png" />
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" /> <Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" /> <Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" /> <Content Include="Assets\Square150x150Logo.scale-200.png" />
@@ -81,18 +235,120 @@
<Content Include="Assets\Wide310x150Logo.scale-200.png" /> <Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CommunityToolkit.Uwp.Controls.Primitives" /> <ApplicationDefinition Include="App.xaml">
<PackageReference Include="Microsoft.Identity.Client" /> <Generator>MSBuild:Compile</Generator>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform" /> <SubType>Designer</SubType>
<PackageReference Include="Win2D.uwp" /> </ApplicationDefinition>
<Page Include="Controls\CalendarItemControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Styles\CalendarThemeResources.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Styles\DayHeaderControl.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Styles\WinoCalendarResources.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Styles\WinoCalendarTypeSelectorControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\WinoCalendarView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\WinoDayTimelineCanvas.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Views\Account\AccountManagementPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\AppShell.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\CalendarPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\EventDetailsPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\Settings\AccountDetailsPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\Settings\CalendarSettingsPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\Settings\PersonalizationPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Wino.Authentication\Wino.Authentication.csproj" /> <PackageReference Include="CommunityToolkit.Uwp.Controls.Primitives">
<ProjectReference Include="..\Wino.Calendar.ViewModels\Wino.Calendar.ViewModels.csproj" /> <Version>8.1.240916</Version>
<ProjectReference Include="..\Wino.Core.Domain\Wino.Core.Domain.csproj" /> </PackageReference>
<ProjectReference Include="..\Wino.Core.UWP\Wino.Core.UWP.csproj" /> <PackageReference Include="Microsoft.Identity.Client">
<ProjectReference Include="..\Wino.Core.ViewModels\Wino.Core.ViewModels.csproj" /> <Version>4.66.2</Version>
<ProjectReference Include="..\Wino.Messages\Wino.Messaging.csproj" /> </PackageReference>
<ProjectReference Include="..\Wino.Services\Wino.Services.csproj" /> <PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.14</Version>
</PackageReference>
<PackageReference Include="Win2D.uwp">
<Version>1.28.1</Version>
</PackageReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Wino.Calendar.ViewModels\Wino.Calendar.ViewModels.csproj">
<Project>{039affa8-c1cc-4e3b-8a31-6814d7557f74}</Project>
<Name>Wino.Calendar.ViewModels</Name>
</ProjectReference>
<ProjectReference Include="..\Wino.Core.Domain\Wino.Core.Domain.csproj">
<Project>{cf3312e5-5da0-4867-9945-49ea7598af1f}</Project>
<Name>Wino.Core.Domain</Name>
</ProjectReference>
<ProjectReference Include="..\Wino.Core.UWP\Wino.Core.UWP.csproj">
<Project>{395f19ba-1e42-495c-9db5-1a6f537fccb8}</Project>
<Name>Wino.Core.UWP</Name>
</ProjectReference>
<ProjectReference Include="..\Wino.Core.ViewModels\Wino.Core.ViewModels.csproj">
<Project>{53723ae8-7e7e-4d54-adab-0a6033255cc8}</Project>
<Name>Wino.Core.ViewModels</Name>
</ProjectReference>
<ProjectReference Include="..\Wino.Messages\Wino.Messaging.csproj">
<Project>{0c307d7e-256f-448c-8265-5622a812fbcc}</Project>
<Name>Wino.Messaging</Name>
</ProjectReference>
<ProjectReference Include="..\Wino.Services\Wino.Services.csproj">
<Project>{bba49030-7277-48cf-b2fe-3d01cb6b6c81}</Project>
<Name>Wino.Services</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project> </Project>

View File

@@ -1,11 +0,0 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Wino.Core.Domain;
[JsonSerializable(typeof(Dictionary<string, string>))]
[JsonSerializable(typeof(string))]
[JsonSerializable(typeof(int))]
[JsonSerializable(typeof(List<string>))]
[JsonSerializable(typeof(bool))]
public partial class BasicTypesJsonContext : JsonSerializerContext;

View File

@@ -7,10 +7,10 @@ using Wino.Core.Domain.Entities.Calendar;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
namespace Wino.Core.Domain.Collections; namespace Wino.Core.Domain.Collections
public class CalendarEventCollection
{ {
public class CalendarEventCollection
{
public event EventHandler<ICalendarItem> CalendarItemAdded; public event EventHandler<ICalendarItem> CalendarItemAdded;
public event EventHandler<ICalendarItem> CalendarItemRemoved; public event EventHandler<ICalendarItem> CalendarItemRemoved;
@@ -152,4 +152,5 @@ public class CalendarEventCollection
CalendarItemsCleared?.Invoke(this, EventArgs.Empty); CalendarItemsCleared?.Invoke(this, EventArgs.Empty);
} }
}
} }

View File

@@ -2,10 +2,10 @@
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Calendar;
namespace Wino.Core.Domain.Collections; namespace Wino.Core.Domain.Collections
public class DayRangeCollection : ObservableRangeCollection<DayRangeRenderModel>
{ {
public class DayRangeCollection : ObservableRangeCollection<DayRangeRenderModel>
{
/// <summary> /// <summary>
/// Gets the range of dates that are currently displayed in the collection. /// Gets the range of dates that are currently displayed in the collection.
/// </summary> /// </summary>
@@ -38,4 +38,5 @@ public class DayRangeCollection : ObservableRangeCollection<DayRangeRenderModel>
calendarDayModel?.EventsCollection.AddCalendarItem(calendarItem); calendarDayModel?.EventsCollection.AddCalendarItem(calendarItem);
} }
} }
}
} }

View File

@@ -4,14 +4,14 @@ using System.Collections.ObjectModel;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.ComponentModel; using System.ComponentModel;
namespace Wino.Core.Domain.Collections; namespace Wino.Core.Domain.Collections
/// <summary>
/// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed.
/// </summary>
/// <typeparam name="T"></typeparam>
public class ObservableRangeCollection<T> : ObservableCollection<T>
{ {
/// <summary>
/// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed.
/// </summary>
/// <typeparam name="T"></typeparam>
public class ObservableRangeCollection<T> : ObservableCollection<T>
{
/// <summary> /// <summary>
/// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class.
@@ -170,4 +170,5 @@ public class ObservableRangeCollection<T> : ObservableCollection<T>
else else
OnCollectionChanged(new NotifyCollectionChangedEventArgs(action, changedItems: changedItems, startingIndex: startingIndex)); OnCollectionChanged(new NotifyCollectionChangedEventArgs(action, changedItems: changedItems, startingIndex: startingIndex));
} }
}
} }

View File

@@ -1,7 +1,7 @@
namespace Wino.Core.Domain; namespace Wino.Core.Domain
public static class Constants
{ {
public static class Constants
{
/// <summary> /// <summary>
/// MIME header that exists in all the drafts created from Wino. /// MIME header that exists in all the drafts created from Wino.
/// </summary> /// </summary>
@@ -19,4 +19,5 @@ public static class Constants
public const string WinoMailIdentiifer = nameof(WinoMailIdentiifer); public const string WinoMailIdentiifer = nameof(WinoMailIdentiifer);
public const string WinoCalendarIdentifier = nameof(WinoCalendarIdentifier); public const string WinoCalendarIdentifier = nameof(WinoCalendarIdentifier);
}
} }

View File

@@ -2,10 +2,10 @@
using SQLite; using SQLite;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
namespace Wino.Core.Domain.Entities.Calendar; namespace Wino.Core.Domain.Entities.Calendar
public class AccountCalendar : IAccountCalendar
{ {
public class AccountCalendar : IAccountCalendar
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
public Guid AccountId { get; set; } public Guid AccountId { get; set; }
@@ -21,4 +21,5 @@ public class AccountCalendar : IAccountCalendar
public string TextColorHex { get; set; } public string TextColorHex { get; set; }
public string BackgroundColorHex { get; set; } public string BackgroundColorHex { get; set; }
public string TimeZone { get; set; } public string TimeZone { get; set; }
}
} }

View File

@@ -2,11 +2,11 @@
using SQLite; using SQLite;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Entities.Calendar; namespace Wino.Core.Domain.Entities.Calendar
// TODO: Connect to Contact store with Wino People.
public class CalendarEventAttendee
{ {
// TODO: Connect to Contact store with Wino People.
public class CalendarEventAttendee
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
public Guid CalendarItemId { get; set; } public Guid CalendarItemId { get; set; }
@@ -16,4 +16,5 @@ public class CalendarEventAttendee
public bool IsOrganizer { get; set; } public bool IsOrganizer { get; set; }
public bool IsOptionalAttendee { get; set; } public bool IsOptionalAttendee { get; set; }
public string Comment { get; set; } public string Comment { get; set; }
}
} }

View File

@@ -5,11 +5,11 @@ using SQLite;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
namespace Wino.Core.Domain.Entities.Calendar; namespace Wino.Core.Domain.Entities.Calendar
[DebuggerDisplay("{Title} ({StartDate} - {EndDate})")]
public class CalendarItem : ICalendarItem
{ {
[DebuggerDisplay("{Title} ({StartDate} - {EndDate})")]
public class CalendarItem : ICalendarItem
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
public string RemoteEventId { get; set; } public string RemoteEventId { get; set; }
@@ -17,23 +17,24 @@ public class CalendarItem : ICalendarItem
public string Description { get; set; } public string Description { get; set; }
public string Location { get; set; } public string Location { get; set; }
public string StartTimeOffset { get; set; } public DateTime StartDate { get; set; }
public string EndTimeOffset { get; set; }
public DateTimeOffset StartDateTimeOffset => DateTimeOffset.Parse(StartTimeOffset); public DateTime EndDate
public DateTimeOffset EndDateTimeOffsete => DateTimeOffset.Parse(EndTimeOffset); {
get
{
return StartDate.AddSeconds(DurationInSeconds);
}
}
public DateTime StartDate => StartDateTimeOffset.DateTime;//TimeZoneInfo.ConvertTime(StartDateTimeOffset, TimeZoneInfo.Local).DateTime; public TimeSpan StartDateOffset { get; set; }
public DateTime EndDate => EndDateTimeOffsete.DateTime;// TimeZoneInfo.ConvertTime(, TimeZoneInfo.Local).DateTime; public TimeSpan EndDateOffset { get; set; }
private ITimePeriod _period; private ITimePeriod _period;
public ITimePeriod Period public ITimePeriod Period
{ {
get get
{ {
// Period must be loaded by user's current UI culture based on StartDateTimeOffset and EndDateTimeOffset
// Get the time zone corresponding to the current culture
_period ??= new TimeRange(StartDate, EndDate); _period ??= new TimeRange(StartDate, EndDate);
return _period; return _period;
@@ -93,7 +94,7 @@ public class CalendarItem : ICalendarItem
} }
} }
public double DurationInSeconds => Period.Duration.TotalSeconds; public double DurationInSeconds { get; set; }
public string Recurrence { get; set; } public string Recurrence { get; set; }
public string OrganizerDisplayName { get; set; } public string OrganizerDisplayName { get; set; }
@@ -143,7 +144,7 @@ public class CalendarItem : ICalendarItem
/// </summary> /// </summary>
public Guid EventTrackingId => IsOccurrence ? RecurringCalendarItemId.Value : Id; public Guid EventTrackingId => IsOccurrence ? RecurringCalendarItemId.Value : Id;
public CalendarItem CreateRecurrence(DateTimeOffset startDateOffset, DateTimeOffset endDateOffset) public CalendarItem CreateRecurrence(DateTime startDate, double durationInSeconds)
{ {
// Create a copy with the new start date and duration // Create a copy with the new start date and duration
@@ -153,8 +154,8 @@ public class CalendarItem : ICalendarItem
Title = Title, Title = Title,
Description = Description, Description = Description,
Location = Location, Location = Location,
StartTimeOffset = startDateOffset.ToString("o"), StartDate = startDate,
EndTimeOffset = endDateOffset.ToString("o"), DurationInSeconds = durationInSeconds,
Recurrence = Recurrence, Recurrence = Recurrence,
OrganizerDisplayName = OrganizerDisplayName, OrganizerDisplayName = OrganizerDisplayName,
OrganizerEmail = OrganizerEmail, OrganizerEmail = OrganizerEmail,
@@ -167,10 +168,13 @@ public class CalendarItem : ICalendarItem
Status = Status, Status = Status,
CustomEventColorHex = CustomEventColorHex, CustomEventColorHex = CustomEventColorHex,
HtmlLink = HtmlLink, HtmlLink = HtmlLink,
StartDateOffset = StartDateOffset,
EndDateOffset = EndDateOffset,
RemoteEventId = RemoteEventId, RemoteEventId = RemoteEventId,
IsHidden = IsHidden, IsHidden = IsHidden,
IsLocked = IsLocked, IsLocked = IsLocked,
IsOccurrence = true IsOccurrence = true
}; };
} }
}
} }

View File

@@ -2,14 +2,15 @@
using SQLite; using SQLite;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Entities.Calendar; namespace Wino.Core.Domain.Entities.Calendar
public class Reminder
{ {
public class Reminder
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
public Guid CalendarItemId { get; set; } public Guid CalendarItemId { get; set; }
public DateTimeOffset ReminderTime { get; set; } public DateTimeOffset ReminderTime { get; set; }
public CalendarItemReminderType ReminderType { get; set; } public CalendarItemReminderType ReminderType { get; set; }
}
} }

View File

@@ -1,10 +1,10 @@
using System; using System;
using SQLite; using SQLite;
namespace Wino.Core.Domain.Entities.Mail; namespace Wino.Core.Domain.Entities.Mail
public class AccountSignature
{ {
public class AccountSignature
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
@@ -13,4 +13,5 @@ public class AccountSignature
public string HtmlBody { get; set; } public string HtmlBody { get; set; }
public Guid MailAccountId { get; set; } public Guid MailAccountId { get; set; }
}
} }

View File

@@ -1,10 +1,10 @@
using System; using System;
using SQLite; using SQLite;
namespace Wino.Core.Domain.Entities.Mail; namespace Wino.Core.Domain.Entities.Mail
public class RemoteAccountAlias
{ {
public class RemoteAccountAlias
{
/// <summary> /// <summary>
/// Display address of the alias. /// Display address of the alias.
/// </summary> /// </summary>
@@ -40,10 +40,10 @@ public class RemoteAccountAlias
/// Used for Gmail only. /// Used for Gmail only.
/// </summary> /// </summary>
public string AliasSenderName { get; set; } public string AliasSenderName { get; set; }
} }
public class MailAccountAlias : RemoteAccountAlias public class MailAccountAlias : RemoteAccountAlias
{ {
/// <summary> /// <summary>
/// Unique Id for the alias. /// Unique Id for the alias.
/// </summary> /// </summary>
@@ -59,4 +59,5 @@ public class MailAccountAlias : RemoteAccountAlias
/// Root aliases can't be deleted. /// Root aliases can't be deleted.
/// </summary> /// </summary>
public bool CanDelete => !IsRootAlias; public bool CanDelete => !IsRootAlias;
}
} }

View File

@@ -5,14 +5,14 @@ using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.MailItem; using Wino.Core.Domain.Models.MailItem;
namespace Wino.Core.Domain.Entities.Mail; namespace Wino.Core.Domain.Entities.Mail
/// <summary>
/// Summary of the parsed MIME messages.
/// Wino will do non-network operations on this table and others from the original MIME.
/// </summary>
public class MailCopy : IMailItem
{ {
/// <summary>
/// Summary of the parsed MIME messages.
/// Wino will do non-network operations on this table and others from the original MIME.
/// </summary>
public class MailCopy : IMailItem
{
/// <summary> /// <summary>
/// Unique Id of the mail. /// Unique Id of the mail.
/// </summary> /// </summary>
@@ -153,4 +153,5 @@ public class MailCopy : IMailItem
public IEnumerable<Guid> GetContainingIds() => [UniqueId]; public IEnumerable<Guid> GetContainingIds() => [UniqueId];
public override string ToString() => $"{Subject} <-> {Id}"; public override string ToString() => $"{Subject} <-> {Id}";
}
} }

View File

@@ -5,11 +5,11 @@ using SQLite;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Folders; using Wino.Core.Domain.Models.Folders;
namespace Wino.Core.Domain.Entities.Mail; namespace Wino.Core.Domain.Entities.Mail
[DebuggerDisplay("{FolderName} - {SpecialFolderType}")]
public class MailItemFolder : IMailItemFolder
{ {
[DebuggerDisplay("{FolderName} - {SpecialFolderType}")]
public class MailItemFolder : IMailItemFolder
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
@@ -71,4 +71,5 @@ public class MailItemFolder : IMailItemFolder
public static MailItemFolder CreateCategoriesFolder() => new MailItemFolder() { IsSticky = true, SpecialFolderType = SpecialFolderType.Category, FolderName = Translator.CategoriesFolderNameOverride }; public static MailItemFolder CreateCategoriesFolder() => new MailItemFolder() { IsSticky = true, SpecialFolderType = SpecialFolderType.Category, FolderName = Translator.CategoriesFolderNameOverride };
public override string ToString() => FolderName; public override string ToString() => FolderName;
}
} }

View File

@@ -1,12 +1,13 @@
using System; using System;
using SQLite; using SQLite;
namespace Wino.Core.Domain.Entities.Mail; namespace Wino.Core.Domain.Entities.Mail
public class MergedInbox
{ {
public class MergedInbox
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
public string Name { get; set; } public string Name { get; set; }
}
} }

View File

@@ -2,17 +2,17 @@
using System.Collections.Generic; using System.Collections.Generic;
using SQLite; using SQLite;
namespace Wino.Core.Domain.Entities.Shared; namespace Wino.Core.Domain.Entities.Shared
/// <summary>
/// Back storage for simple name-address book.
/// These values will be inserted during MIME fetch.
/// </summary>
// TODO: This can easily evolve to Contact store, just like People app in Windows 10/11.
// Do it.
public class AccountContact : IEquatable<AccountContact>
{ {
/// <summary>
/// Back storage for simple name-address book.
/// These values will be inserted during MIME fetch.
/// </summary>
// TODO: This can easily evolve to Contact store, just like People app in Windows 10/11.
// Do it.
public class AccountContact : IEquatable<AccountContact>
{
/// <summary> /// <summary>
/// E-mail address of the contact. /// E-mail address of the contact.
/// </summary> /// </summary>
@@ -36,6 +36,14 @@ public class AccountContact : IEquatable<AccountContact>
/// </summary> /// </summary>
public bool IsRootContact { get; set; } public bool IsRootContact { get; set; }
/// <summary>
/// Short display name of the contact.
/// Eather Name or Address.
/// </summary>
public string ShortDisplayName => Address == Name || string.IsNullOrWhiteSpace(Name) ? $"{Address.ToLowerInvariant()};" : $"{Name};";
public string DisplayName => Address == Name || string.IsNullOrWhiteSpace(Name) ? Address.ToLowerInvariant() : $"{Name} <{Address.ToLowerInvariant()}>";
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return Equals(obj as AccountContact); return Equals(obj as AccountContact);
@@ -50,7 +58,10 @@ public class AccountContact : IEquatable<AccountContact>
public override int GetHashCode() public override int GetHashCode()
{ {
return HashCode.Combine(Address, Name); int hashCode = -1717786383;
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Address);
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Name);
return hashCode;
} }
public static bool operator ==(AccountContact left, AccountContact right) public static bool operator ==(AccountContact left, AccountContact right)
@@ -62,4 +73,5 @@ public class AccountContact : IEquatable<AccountContact>
{ {
return !(left == right); return !(left == right);
} }
}
} }

View File

@@ -1,12 +1,11 @@
using System; using System;
using System.Collections.Generic;
using SQLite; using SQLite;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Entities.Shared; namespace Wino.Core.Domain.Entities.Shared
public class CustomServerInformation
{ {
public class CustomServerInformation
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
@@ -50,25 +49,5 @@ public class CustomServerInformation
/// Default is 5. /// Default is 5.
/// </summary> /// </summary>
public int MaxConcurrentClients { get; set; } public int MaxConcurrentClients { get; set; }
public Dictionary<string, string> GetConnectionProperties()
{
// Printout the public connection properties.
var connectionProperties = new Dictionary<string, string>
{
{ "IncomingServer", IncomingServer },
{ "IncomingServerPort", IncomingServerPort },
{ "IncomingServerSocketOption", IncomingServerSocketOption.ToString() },
{ "IncomingAuthenticationMethod", IncomingAuthenticationMethod.ToString() },
{ "OutgoingServer", OutgoingServer },
{ "OutgoingServerPort", OutgoingServerPort },
{ "OutgoingServerSocketOption", OutgoingServerSocketOption.ToString() },
{ "OutgoingAuthenticationMethod", OutgoingAuthenticationMethod.ToString() },
{ "ProxyServer", ProxyServer },
{ "ProxyServerPort", ProxyServerPort }
};
return connectionProperties;
} }
} }

View File

@@ -3,10 +3,10 @@ using SQLite;
using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Entities.Mail;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Entities.Shared; namespace Wino.Core.Domain.Entities.Shared
public class MailAccount
{ {
public class MailAccount
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
@@ -107,4 +107,5 @@ public class MailAccount
/// Gets whether the account can perform AliasInformation sync type. /// Gets whether the account can perform AliasInformation sync type.
/// </summary> /// </summary>
public bool IsAliasSyncSupported => ProviderType == MailProviderType.Gmail; public bool IsAliasSyncSupported => ProviderType == MailProviderType.Gmail;
}
} }

View File

@@ -1,10 +1,10 @@
using System; using System;
using SQLite; using SQLite;
namespace Wino.Core.Domain.Entities.Shared; namespace Wino.Core.Domain.Entities.Shared
public class MailAccountPreferences
{ {
public class MailAccountPreferences
{
[PrimaryKey] [PrimaryKey]
public Guid Id { get; set; } public Guid Id { get; set; }
@@ -50,4 +50,5 @@ public class MailAccountPreferences
/// Gets or sets signature for following messages. Null if signature is not needed. /// Gets or sets signature for following messages. Null if signature is not needed.
/// </summary> /// </summary>
public Guid? SignatureIdForFollowingMessages { get; set; } public Guid? SignatureIdForFollowingMessages { get; set; }
}
} }

View File

@@ -1,8 +1,9 @@
namespace Wino.Core.Domain.Enums; namespace Wino.Core.Domain.Enums
public enum AccountAttentionReason
{ {
public enum AccountAttentionReason
{
None, None,
InvalidCredentials, InvalidCredentials,
MissingSystemFolderConfiguration MissingSystemFolderConfiguration
}
} }

View File

@@ -1,7 +0,0 @@
namespace Wino.Core.Domain.Enums;
public enum AccountCacheResetReason
{
AccountRemoval,
ExpiredCache
}

View File

@@ -1,7 +1,7 @@
namespace Wino.Core.Domain.Enums; namespace Wino.Core.Domain.Enums
public enum AccountCreationDialogState
{ {
public enum AccountCreationDialogState
{
Idle, Idle,
SigningIn, SigningIn,
PreparingFolders, PreparingFolders,
@@ -13,4 +13,5 @@ public enum AccountCreationDialogState
FetchingProfileInformation, FetchingProfileInformation,
Canceled, Canceled,
FetchingEvents FetchingEvents
}
} }

View File

@@ -1,11 +1,12 @@
namespace Wino.Core.Domain.Enums; namespace Wino.Core.Domain.Enums
/// <summary>
/// Indicates the state of synchronizer.
/// </summary>
public enum AccountSynchronizerState
{ {
/// <summary>
/// Indicates the state of synchronizer.
/// </summary>
public enum AccountSynchronizerState
{
Idle, Idle,
ExecutingRequests, ExecutingRequests,
Synchronizing Synchronizing
}
} }

Some files were not shown because too many files have changed in this diff Show More