149 Commits

Author SHA1 Message Date
Burak Kaan Köse
52923ed35b Bump some more nugets, remove redundant events, and fix Outlook profile sync permission issue. 2024-08-26 22:09:00 +02:00
Burak Kaan Köse
b64cc44531 Bumping some nugets. 2024-08-26 11:30:29 +02:00
Burak Kaan Köse
1b51982551 Merge pull request #335 from bkaankose/code-quality/tabbed-commandbar
Code Quality: TabbedCommandBar
2024-08-26 01:14:29 +02:00
Aleh Khantsevich
10c94efa57 Fix priority button size 2024-08-26 00:58:41 +02:00
Aleh Khantsevich
c84316e974 Added translations for discard/send buttons in composer 2024-08-26 00:31:12 +02:00
Aleh Khantsevich
7e4d1fbf49 Replace custom pivot + command bar with tabbed commandbar 2024-08-25 23:52:55 +02:00
Burak Kaan Köse
31c7c8b46f Remove unused namespace. 2024-08-25 21:45:13 +02:00
Burak Kaan Köse
8cdb6646c4 Fixed account re-ordering issues with merged accounts. 2024-08-25 19:51:19 +02:00
Burak Kaan Köse
43a51e5f2f Per-session ImapSynchronizer protocol log based on accounts. 2024-08-25 10:32:07 +02:00
Burak Kaan Köse
d0b54ea44b Prevent delay between mail addings and better folder init cancellation. 2024-08-25 02:01:08 +02:00
Burak Kaan Köse
c8fce82dc1 Fix merged accounts report progress for incorrect account during synchronization. 2024-08-24 21:09:20 +02:00
Burak Kaan Köse
3ffccaa7e5 Fixed non-updating UI for thread items. 2024-08-24 18:12:20 +02:00
Burak Kaan Köse
3f7e7a1474 Generalized sender-from name for IMAP synchronizer. 2024-08-24 17:35:46 +02:00
Burak Kaan Köse
d30c15464b Fix account folder layout is not updated if there is a change after the synchronization. 2024-08-24 17:22:47 +02:00
Burak Kaan Köse
2a1f748469 Fix for to,cc and bcc fields are cut out in rendering page. 2024-08-24 17:22:03 +02:00
Burak Kaan Köse
74b429b1bf Applying default xaml styler configs. 2024-08-24 16:16:56 +02:00
Burak Kaan Köse
7afe1b517c Ignore task bar pinning errors. 2024-08-24 16:10:14 +02:00
Burak Kaan Köse
fcdcf5692f Fix indentation. 2024-08-24 16:06:36 +02:00
Burak Kaan Köse
735baa67ed Default XamlStyler config for the solution. 2024-08-24 16:06:14 +02:00
Burak Kaan Köse
ac00caf83e AccountContact comments. 2024-08-24 16:06:06 +02:00
Burak Kaan Köse
2ccda353e9 Debug log messages on updating flag changes. 2024-08-24 15:54:35 +02:00
Burak Kaan Köse
4257ca54b7 Fix updating folder on name changes for imap. 2024-08-24 15:54:12 +02:00
Burak Kaan Köse
20dd2ef98d Min log level to Debug for debug builds. 2024-08-24 15:53:46 +02:00
Burak Kaan Köse
8be52c9ddd Capitilize first letter of folder names if all capital for IMAP. 2024-08-24 15:38:52 +02:00
Burak Kaan Köse
3bea6619fa Enable all folder sync for gmail. 2024-08-24 15:38:23 +02:00
Burak Kaan Köse
0e5fb11c52 Fix for missing folder update changes for gmail. 2024-08-24 15:26:08 +02:00
Burak Kaan Köse
fc47f7701d Always focus to first line on editor focus. 2024-08-24 15:13:02 +02:00
Burak Kaan Köse
3e4ccf8de4 Merge pull request #331 from bkaankose/feature/ContactPictures
Account contact pictures
2024-08-24 12:55:04 +02:00
Burak Kaan Köse
8abb3c709b More logging for App.xaml.cs 2024-08-24 12:54:39 +02:00
Burak Kaan Köse
5263900620 Async cancellation support for contact picture loading. 2024-08-24 01:57:36 +02:00
Burak Kaan Köse
54ee9e5072 Remove redundant IsKnown property. 2024-08-24 01:57:19 +02:00
Burak Kaan Köse
20f4857405 Root contact concept. 2024-08-24 00:14:32 +02:00
Burak Kaan Köse
55110dd39d Merge pull request #333 from bkaankose/l10n_main
New Crowdin updates
2024-08-23 15:04:04 +02:00
Burak Kaan Köse
07d8111df9 New translations resources.json (Indonesian) 2024-08-23 15:03:46 +02:00
Burak Kaan Köse
a701b97f1e New translations resources.json (Portuguese, Brazilian) 2024-08-23 15:03:45 +02:00
Burak Kaan Köse
b025537d62 New translations resources.json (Galician) 2024-08-23 15:03:44 +02:00
Burak Kaan Köse
e68bc2de65 New translations resources.json (Chinese Simplified) 2024-08-23 15:03:43 +02:00
Burak Kaan Köse
d0b1c93382 New translations resources.json (Ukrainian) 2024-08-23 15:03:42 +02:00
Burak Kaan Köse
a08fa9eabf New translations resources.json (Turkish) 2024-08-23 15:03:40 +02:00
Burak Kaan Köse
65ef130bda New translations resources.json (Russian) 2024-08-23 15:03:39 +02:00
Burak Kaan Köse
32471a71e5 New translations resources.json (Polish) 2024-08-23 15:03:38 +02:00
Burak Kaan Köse
ca80f01907 New translations resources.json (Dutch) 2024-08-23 15:03:37 +02:00
Burak Kaan Köse
b1fae57922 New translations resources.json (Japanese) 2024-08-23 15:03:36 +02:00
Burak Kaan Köse
dea01dda2d New translations resources.json (Italian) 2024-08-23 15:03:35 +02:00
Burak Kaan Köse
9777619259 New translations resources.json (Finnish) 2024-08-23 15:03:34 +02:00
Burak Kaan Köse
6db0f84f8f New translations resources.json (Greek) 2024-08-23 15:03:32 +02:00
Burak Kaan Köse
84e382fcc5 New translations resources.json (German) 2024-08-23 15:03:31 +02:00
Burak Kaan Köse
eceed1b934 New translations resources.json (Danish) 2024-08-23 15:03:30 +02:00
Burak Kaan Köse
e7b5cd74a4 New translations resources.json (Czech) 2024-08-23 15:03:29 +02:00
Burak Kaan Köse
a98930791c New translations resources.json (Catalan) 2024-08-23 15:03:28 +02:00
Burak Kaan Köse
67b0389097 New translations resources.json (Spanish) 2024-08-23 15:03:27 +02:00
Burak Kaan Köse
ff30595fb4 New translations resources.json (French) 2024-08-23 15:03:26 +02:00
Burak Kaan Köse
d272b62c45 Remove commented code. 2024-08-23 14:54:30 +02:00
Burak Kaan Köse
c1973023d0 Fix for webview2 not focusing properly issue. 2024-08-23 03:00:22 +02:00
Burak Kaan Köse
ef4689619e Displaying contact picture for rendering page and small adjustments for addresses UI. 2024-08-23 02:23:52 +02:00
Burak Kaan Köse
9ed297a49d New contact picture display for address fields. 2024-08-23 02:23:27 +02:00
Burak Kaan Köse
9950729080 New contact retrival method. 2024-08-23 02:07:50 +02:00
Burak Kaan Köse
36eec9d061 Remove obsolete code. 2024-08-23 02:07:32 +02:00
Burak Kaan Köse
fd3a977009 Creating contract on profile update. 2024-08-23 02:07:25 +02:00
Burak Kaan Köse
ff88832cca Asynchronously load correct contact data for composer. 2024-08-23 02:06:58 +02:00
Burak Kaan Köse
d69b72b77d Fixed not-scrollable address infos for to,cc and bcc fields. 2024-08-23 02:06:28 +02:00
Burak Kaan Köse
d9bd9e996b Fix for duplicating incorrect address info in rendering page. 2024-08-23 02:05:15 +02:00
Burak Kaan Köse
f45580be70 Adding contact details for loaded mails and fixing background notification actions. 2024-08-23 01:07:00 +02:00
Burak Kaan Köse
0fbeb11304 Merge pull request #329 from bkaankose/feature/NewStartup
Handling app termination and reworked dialog messages.
2024-08-22 18:41:38 +02:00
Burak Kaan Köse
6a70c13b57 Merge pull request #330 from bkaankose/fix/editor-full-height
Make Jodit fill all available height of webview
2024-08-22 14:01:25 +02:00
Aleh Khantsevich
f797520e56 Make Jodit fill all available height of webview 2024-08-22 01:59:09 +02:00
Burak Kaan Köse
d060db3c96 Fixing an issue where doing folder config on account does not refresh the folder list. 2024-08-22 01:20:08 +02:00
Burak Kaan Köse
298344c2ab Remove async from adding attachments. 2024-08-22 00:57:46 +02:00
Burak Kaan Köse
53dbeadabb Prevent asking users for startup launch if they already did that. 2024-08-22 00:52:41 +02:00
Burak Kaan Köse
93087d7aa7 Ask for enable startup on first launch. 2024-08-22 00:51:10 +02:00
Burak Kaan Köse
c304517fc2 Revert debug code. 2024-08-21 23:30:57 +02:00
Burak Kaan Köse
af13e034c3 New resource strings for app closing handlers. 2024-08-21 23:22:32 +02:00
Burak Kaan Köse
e6b9d59160 Potential crash for imap. 2024-08-21 23:16:46 +02:00
Burak Kaan Köse
bd9cbe30c5 Fixed crashing issue with disposing composing page. 2024-08-21 23:14:59 +02:00
Burak Kaan Köse
f627226da9 Server termination and refactoring message dialogs. 2024-08-21 22:42:52 +02:00
Burak Kaan Köse
bab3272970 Fix couple potential crash issues due to unsupported APIs. 2024-08-21 19:50:14 +02:00
Burak Kaan Köse
003085db7e Merge pull request #328 from bkaankose/hotfix/LogsArchive
Fixing sharing logs
2024-08-21 13:58:39 +02:00
Burak Kaan Köse
8f98bd37c7 Implemented log archive. 2024-08-21 13:54:24 +02:00
Burak Kaan Köse
6971ef1ede Remove imap protocol log sharing since it's already moved to a separate dialog when error occurs during setup. 2024-08-21 13:49:38 +02:00
Burak Kaan Köse
0baac3dc49 Addressing some Outlook sending issues due to API delay. 2024-08-21 13:15:50 +02:00
Burak Kaan Köse
16feb8602d Getting rid of ARM32 and preperation for beta 1.8.3. 2024-08-21 03:54:36 +02:00
Burak Kaan Köse
d623129d56 Merge pull request #325 from bkaankose/features/mail-list-splitter
Mail List splitter
2024-08-19 21:21:28 +02:00
Aleh Khantsevich
9cc4c33bb1 Fix multiselect and hide sizer 2024-08-19 21:16:58 +02:00
Burak Kaan Köse
c087b40d4a Renaming event handlers and fixing the search box margin issue. 2024-08-19 21:07:21 +02:00
Aleh Khantsevich
a82e074bd4 Fix merge conflicts 2024-08-19 20:50:14 +02:00
Burak Kaan Köse
3365c099bb Missing comments. 2024-08-19 20:43:26 +02:00
Aleh Khantsevich
d8705de26f Replaced setting with reset button 2024-08-19 20:41:55 +02:00
Burak Kaan Köse
3af181e736 Merge pull request #324 from bkaankose/feature/Aliases
E-mail Aliases Support
2024-08-19 20:37:58 +02:00
Burak Kaan Köse
ba6c01b7c6 Missing comments. 2024-08-19 19:16:54 +02:00
Burak Kaan Köse
7a7cdcb041 Remove json.net dependency to STJson 2024-08-19 19:16:47 +02:00
Burak Kaan Köse
09e52bf199 Remove not implemented comment. 2024-08-19 19:05:54 +02:00
Burak Kaan Köse
a8c39a1587 Fixing send draft issue with OutlookSynchronizer. 2024-08-19 19:02:33 +02:00
Aleh Khantsevich
68536d6c34 Fix padding in narrow state 2024-08-19 18:49:35 +02:00
Aleh Khantsevich
f57c27e755 Fix multiple items selected 2024-08-19 17:15:59 +02:00
Aleh Khantsevich
9a97a27c8a Init 2024-08-19 16:26:15 +02:00
Burak Kaan Köse
07bb90dda9 Refactoring outlook draft creation and sending. 2024-08-19 03:44:16 +02:00
Burak Kaan Köse
3bb156f4da Handling of OutlookSynchronizer alias. 2024-08-18 22:45:23 +02:00
Burak Kaan Köse
e13e0efcc6 Bump some nugets. 2024-08-18 22:44:55 +02:00
Burak Kaan Köse
3ae0a94159 Remove folder init progress bar in mail list page. 2024-08-18 22:27:31 +02:00
Burak Kaan Köse
eec67ec7dc Fixed an issue where re-loading messages with attachments break the included attachment encodings. 2024-08-18 22:25:29 +02:00
Burak Kaan Köse
cf51853eec Removed non-mandatory reply-to validation. 2024-08-18 01:11:23 +02:00
Burak Kaan Köse
67838b28a4 Syntactic sugar. 2024-08-18 01:06:21 +02:00
Burak Kaan Köse
bf68e3b7d5 Fix sending draft issue. 2024-08-18 01:05:43 +02:00
Burak Kaan Köse
91ed0bb8bd Ability to select alias in composer page. 2024-08-17 22:55:58 +02:00
Burak Kaan Köse
55fe791c2a Handling of missing mime downloads and mail processed messages. 2024-08-17 20:19:01 +02:00
Burak Kaan Köse
747efac2ec Reworked aliases. 2024-08-17 19:54:52 +02:00
Burak Kaan Köse
a87df2e9f6 Fixed an issue where deleting account navigates back to mail list of the next account. 2024-08-17 19:54:44 +02:00
Burak Kaan Köse
2e4a664744 More detailed ImapImplementation for ID extension. 2024-08-17 19:53:50 +02:00
Tiktack
579a22ea45 Remove self from reply all when no other recepients (#319) 2024-08-17 15:00:25 +02:00
Burak Kaan Köse
abff850427 Managing account aliases and profile synchronization for outlook and gmail. 2024-08-17 03:43:37 +02:00
Burak Kaan Köse
f1154058ba Fix ascending download for messages. QQ server issue will be handled later. 2024-08-17 00:03:45 +02:00
Burak Kaan Köse
cf9f308b7f Updating aliases during profile sync for Gmail. 2024-08-16 01:29:31 +02:00
Burak Kaan Köse
1791df236c Remove unused extension class. 2024-08-16 01:03:00 +02:00
Burak Kaan Köse
7211f94f08 Try - catch for outlook profile sync. 2024-08-16 00:40:10 +02:00
Burak Kaan Köse
7b0343c87f Added sender name comment for gmail. 2024-08-16 00:37:50 +02:00
Burak Kaan Köse
b80f0276b4 Sender Name and Profile Picture synchronization for Outlook 2024-08-16 00:37:38 +02:00
Burak Kaan Köse
8f66fcbb00 Activated contact service for Gmail to retrieve profile picture and sender name. 2024-08-15 23:57:45 +02:00
Burak Kaan Köse
fe449ee1f3 Comments for alias entity. 2024-08-15 16:13:18 +02:00
Burak Kaan Köse
34d6d95186 Including ReplyToAddress for alias. 2024-08-15 16:11:12 +02:00
Burak Kaan Köse
05ddc0660a Creating MailAccountAlias entity. 2024-08-15 16:02:02 +02:00
Burak Kaan Köse
c6047a8428 Version bump 2024-08-13 23:40:09 +02:00
Burak Kaan Köse
bc4838578e Handling null client connection while sending server response. 2024-08-13 22:57:36 +02:00
Burak Kaan Köse
548996405a Fix incorrect accounts' mails are going to different accounts. 2024-08-13 22:54:36 +02:00
Burak Kaan Köse
a9a5f0bd14 Ascending downloading of mails since some servers require it. 2024-08-13 22:54:14 +02:00
Burak Kaan Köse
ec05ff6123 Optional splash screen. 2024-08-13 19:26:24 +02:00
Burak Kaan Köse
10c7ab421b Setting exception on connection failure. 2024-08-13 16:14:25 +02:00
Burak Kaan Köse
a8a5cc53ea Merge branch 'main' of https://github.com/bkaankose/Wino-Mail 2024-08-13 16:13:25 +02:00
Burak Kaan Köse
8fe48ca438 Fixed an issue where reconnecting doesn't await the handle in the second attempt. 2024-08-13 16:12:34 +02:00
Tiktack
cbd5a515a9 Fix account signature preferences during draft creation (#314)
* Pass account ID instead of account to draft creation method, since account object can be stale.

* Configure await
2024-08-12 00:56:26 +02:00
Tiktack
5912adff93 Embedded images replaced with cid linked resources. (#313)
* Added logic to replace embedded images with linked resources

* Added alt text for images and replaced NewtonSoft with Text.Json

* Fix draft mime preparation

* Fix crashes for signatures without images.

---------

Co-authored-by: Burak Kaan Köse <bkaankose@outlook.com>
2024-08-11 23:58:54 +02:00
Burak Kaan Köse
983bc21448 Removing server init from the app init. Making sure server connection is established before doing a request. Handling Connecting state. 2024-08-11 15:25:40 +02:00
Burak Kaan Köse
6d08368462 Hiding reconnect flyout on clicking reconnect. 2024-08-11 15:18:23 +02:00
Burak Kaan Köse
cde7bb3524 Merged main. 2024-08-10 14:35:26 +02:00
Burak Kaan Köse
133dc91561 Prevent crashes on invalid Uri for protocol activation. 2024-08-10 14:35:01 +02:00
Tiktack
f408f59beb Improve mailto links handling (#310)
* Refactor draft creation

* try scoped namespace

* Refactor mailto protocol and revert namespaces

* Remove useless account query

* Fix typo and CC/BCC in replies

* Replace convert with existing extension

* Small fixes

* Fix CC/Bcc in replies to automatically show if needed.

* Fixed body parameter position from mailto parameters

* Fixed issue with ReplyAll self not removed
2024-08-10 14:33:02 +02:00
Burak Kaan Köse
8763bf11ab Fix typo. 2024-08-09 14:23:51 +02:00
Burak Kaan Köse
99592a52be Unregistration condition. 2024-08-09 02:02:11 +02:00
Burak Kaan Köse
25a8a52573 Remove SessionConnectedTask 2024-08-09 01:51:21 +02:00
Burak Kaan Köse
5901344459 Remove SessionConntectedTask. 2024-08-09 01:24:55 +02:00
Burak Kaan Köse
b07ae4bc42 New Crowdin updates (#303)
* New translations resources.json (French)

* New translations resources.json (Spanish)

* New translations resources.json (Catalan)

* New translations resources.json (Czech)

* New translations resources.json (Danish)

* New translations resources.json (German)

* New translations resources.json (Greek)

* New translations resources.json (Finnish)

* New translations resources.json (Italian)

* New translations resources.json (Japanese)

* New translations resources.json (Dutch)

* New translations resources.json (Polish)

* New translations resources.json (Russian)

* New translations resources.json (Turkish)

* New translations resources.json (Ukrainian)

* New translations resources.json (Chinese Simplified)

* New translations resources.json (Galician)

* New translations resources.json (Portuguese, Brazilian)

* New translations resources.json (Indonesian)
2024-08-05 01:07:55 +02:00
Burak Kaan Köse
0d9e61480a Fix typo. 2024-08-05 01:07:02 +02:00
Burak Kaan Köse
baaea96b1d Add Italian languge. 2024-08-05 01:06:19 +02:00
Burak Kaan Köse
e156cb5c2e New Crowdin updates (#302)
* New translations resources.json (French)

* New translations resources.json (Spanish)

* New translations resources.json (Catalan)

* New translations resources.json (Czech)

* New translations resources.json (Danish)

* New translations resources.json (German)

* New translations resources.json (Greek)

* New translations resources.json (Finnish)

* New translations resources.json (Italian)

* New translations resources.json (Japanese)

* New translations resources.json (Dutch)

* New translations resources.json (Polish)

* New translations resources.json (Russian)

* New translations resources.json (Turkish)

* New translations resources.json (Ukrainian)

* New translations resources.json (Chinese Simplified)

* New translations resources.json (Galician)

* New translations resources.json (Portuguese, Brazilian)

* New translations resources.json (Indonesian)
2024-08-05 01:02:19 +02:00
Burak Kaan Köse
ff77b2b3dc Full trust Wino Server implementation. (#295)
* Separation of messages. Introducing Wino.Messages library.

* Wino.Server and Wino.Packaging projects. Enabling full trust for UWP and app service connection manager basics.

* Remove debug code.

* Enable generating assembly info to deal with unsupported os platform warnings.

* Fix server-client connection.

* UIMessage communication. Single instancing for server and re-connection mechanism on suspension.

* Removed IWinoSynchronizerFactory from UWP project.

* Removal of background task service from core.

* Delegating changes to UI and triggering new background synchronization.

* Fix build error.

* Moved core lib messages to Messaging project.

* Better client-server communication. Handling of requests in the server. New synchronizer factory in the server.

* WAM broker and MSAL token caching for OutlookAuthenticator. Handling account creation for Outlook.

* WinoServerResponse basics.

* Delegating protocol activation for Gmail authenticator.

* Adding margin to searchbox to match action bar width.

* Move libraries into lib folder.

* Storing base64 encoded mime on draft creation instead of MimeMessage object. Fixes serialization/deserialization issue with S.T.Json

* Scrollbar adjustments

* WınoExpander for thread expander layout ıssue.

* Handling synchronizer state changes.

* Double init on background activation.

* FIxing packaging issues and new Wino Mail launcher protocol for activation from full thrust process.

* Remove debug deserialization.

* Remove debug code.

* Making sure the server connection is established when the app is launched.

* Thrust -> Trust string replacement...

* Rename package to Wino Mail

* Enable translated values in the server.

* Fixed an issue where toast activation can't find the clicked mail after the folder is initialized.

* Revert debug code.

* Change server background sync to every 3 minute and Inbox only synchronization.

* Revert google auth changes.

* App preferences page.

* Changing tray icon visibility on preference change.

* Start the server with invisible tray icon if set to invisible.

* Reconnect button on the title bar.

* Handling of toast actions.

* Enable x86 build for server during packaging.

* Get rid of old background tasks and v180 migration.

* Terminate client when Exit clicked in server.

* Introducing SynchronizationSource to prevent notifying UI after server tick synchronization.

* Remove confirmAppClose restricted capability and unused debug code in manifest.

* Closing the reconnect info popup when reconnect is clicked.

* Custom RetryHandler for OutlookSynchronizer and separating client/server logs.

* Running server on Windows startup.

* Fix startup exe.

* Fix for expander list view item paddings.

* Force full sync on app launch instead of Inbox.

* Fix draft creation.

* Fix an issue with custom folder sync logic.

* Reporting back account sync progress from server.

* Fix sending drafts and missing notifications for imap.

* Changing imap folder sync requirements.

* Retain file  count is set to 3.

* Disabled swipe gestures temporarily due to native crash
 with SwipeControl

* Save all attachments implementation.

* Localization for save all attachments button.

* Fix logging dates for logs.

* Fixing ARM64 build.

* Add ARM64 build config to packaging project.

* Comment out OutOfProcPDB for ARM64.

* Hnadling GONE response for Outlook folder synchronization.
2024-08-05 00:36:26 +02:00
Burak Kaan Köse
4dc225184d Bump version 1.7.8 2024-07-24 14:04:36 +02:00
Burak Kaan Köse
49a0266224 Fix an issue with rendering drafts and replies. 2024-07-24 13:18:05 +02:00
Burak Kaan Köse
7a62d96b91 Bump client version. 2024-07-23 21:39:56 +02:00
Tiktack
641454fa14 Fixed broken build after compoer fonts merge (#288) 2024-07-18 21:02:03 +02:00
Tiktack
cf2f0ec936 Ability to set composer default font (#287)
* Added ability to set Composer font

* Added missing translations and refactoring

* Remove unused methods

* Small fixes
2024-07-18 20:04:11 +02:00
857 changed files with 15982 additions and 9399 deletions

3
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,3 @@
# These are supported funding model platforms
github: [bkaankose]

20
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View File

@@ -0,0 +1,20 @@
---
name: Bug Report
about: Something is not working as intended
title: "[Bug]"
labels: bug
assignees: bkaankose
---
**Describe the bug**
A clear and concise description of what the bug is.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,17 @@
---
name: Feature Proposal
about: Suggest an idea for this project
title: "[Proposal]"
labels: enhancement
assignees: ''
---
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Is your proposal implemented in Windows Mail?**
Wino's priority is to catch up with the feature set of Windows Mail first.
**Additional context**
Add any other context or screenshots about the feature request here.

42
Settings.XamlStyler Normal file
View File

@@ -0,0 +1,42 @@
{
"AttributesTolerance": 2,
"KeepFirstAttributeOnSameLine": false,
"MaxAttributeCharactersPerLine": 0,
"MaxAttributesPerLine": 1,
"NewlineExemptionElements": "RadialGradientBrush, GradientStop, LinearGradientBrush, ScaleTransform, SkewTransform, RotateTransform, TranslateTransform, Trigger, Condition, Setter",
"SeparateByGroups": false,
"AttributeIndentation": 0,
"AttributeIndentationStyle": 1,
"RemoveDesignTimeReferences": false,
"IgnoreDesignTimeReferencePrefix": false,
"EnableAttributeReordering": true,
"AttributeOrderingRuleGroups": [
"x:Class",
"xmlns, xmlns:x",
"xmlns:*",
"x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
"Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan, Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
"Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
"Margin, Padding, HorizontalAlignment, VerticalAlignment, HorizontalContentAlignment, VerticalContentAlignment, Panel.ZIndex",
"*:*, *",
"PageSource, PageIndex, Offset, Color, TargetName, Property, Value, StartPoint, EndPoint",
"mc:Ignorable, d:IsDataSource, d:LayoutOverrides, d:IsStaticText",
"Storyboard.*, From, To, Duration"
],
"FirstLineAttributes": "",
"OrderAttributesByName": true,
"PutEndingBracketOnNewLine": false,
"RemoveEndingTagOfEmptyElement": true,
"SpaceBeforeClosingSlash": true,
"RootElementLineBreakRule": 0,
"ReorderVSM": 2,
"ReorderGridChildren": false,
"ReorderCanvasChildren": false,
"ReorderSetters": 0,
"FormatMarkupExtension": true,
"NoNewLineMarkupExtensions": "x:Bind, Binding",
"ThicknessSeparator": 2,
"ThicknessAttributes": "Margin, Padding, BorderThickness, ThumbnailClipMargin",
"FormatOnSave": true,
"CommentPadding": 2,
}

View File

@@ -0,0 +1,34 @@
using Microsoft.Toolkit.Uwp.Notifications;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Background;
namespace Wino.BackgroundTasks
{
/// <summary>
/// Creates a toast notification to notify user when the Store update happens.
/// </summary>
public sealed class AppUpdatedTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
var def = taskInstance.GetDeferral();
var builder = new ToastContentBuilder();
builder.SetToastScenario(ToastScenario.Default);
Package package = Package.Current;
PackageId packageId = package.Id;
PackageVersion version = packageId.Version;
var versionText = string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);
// TODO: Handle with Translator, but it's not initialized here yet.
builder.AddText("Wino Mail is updated!");
builder.AddText(string.Format("New version {0} is ready.", versionText));
builder.Show();
def.Complete();
}
}
}

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.BackgroundTasks")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Wino.BackgroundTasks")]
[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,126 @@
<?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>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D9EF0F59-F5F2-4D6C-A5BA-84043D8F3E08}</ProjectGuid>
<OutputType>winmdobj</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Wino.BackgroundTasks</RootNamespace>
<AssemblyName>Wino.BackgroundTasks</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>
<AllowCrossPlatformRetargeting>false</AllowCrossPlatformRetargeting>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<PlatformTarget>x86</PlatformTarget>
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM64'">
<PlatformTarget>ARM64</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM64'">
<PlatformTarget>ARM64</PlatformTarget>
<OutputPath>bin\ARM64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<PlatformTarget>x64</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<PlatformTarget>x64</PlatformTarget>
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<ItemGroup>
<Compile Include="AppUpdatedTask.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.14</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications">
<Version>7.1.3</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<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\Wino.Core.csproj">
<Project>{e6b1632a-8901-41e8-9ddf-6793c7698b0b}</Project>
<Name>Wino.Core</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<SDKReference Include="WindowsDesktop, Version=10.0.22621.0">
<Name>Windows Desktop Extensions for the UWP</Name>
</SDKReference>
</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>

7
Wino.Calendar/App.xaml Normal file
View File

@@ -0,0 +1,7 @@
<Application
x:Class="Wino.Calendar.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Wino.Calendar">
</Application>

100
Wino.Calendar/App.xaml.cs Normal file
View File

@@ -0,0 +1,100 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
namespace Wino.Calendar
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
sealed partial class App : Application
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (e.PrelaunchActivated == false)
{
if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
// Ensure the current window is active
Window.Current.Activate();
}
}
/// <summary>
/// Invoked when Navigation to a certain page fails
/// </summary>
/// <param name="sender">The Frame which failed navigation</param>
/// <param name="e">Details about the navigation failure</param>
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
/// <summary>
/// Invoked when application execution is being suspended. Application state is saved
/// without knowing whether the application will be terminated or resumed with the contents
/// of memory still intact.
/// </summary>
/// <param name="sender">The source of the suspend request.</param>
/// <param name="e">Details about the suspend request.</param>
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
deferral.Complete();
}
}
}

Binary file not shown.

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,14 @@
<Page
x:Class="Wino.Calendar.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Wino.Calendar"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
</Grid>
</Page>

View File

@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
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
{
public MainPage()
{
this.InitializeComponent();
}
}
}

View File

@@ -4,25 +4,32 @@
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp">
IgnorableNamespaces="uap rescap">
<!-- Publisher Cache Folders -->
<Extensions>
<Extension Category="windows.publisherCacheFolders">
<PublisherCacheFolders>
<Folder Name="WinoShared" />
</PublisherCacheFolders>
</Extension>
</Extensions>
<Identity <Identity
Name="f7498058-466c-48d4-bc53-0afe4ec4de31" Name="58272BurakKSE.WinoCalendar"
Publisher="CN=bkaan" Publisher="CN=51FBDAF3-E212-4149-89A2-A2636B3BC911"
Version="1.0.0.0" /> Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="f7498058-466c-48d4-bc53-0afe4ec4de31" PhonePublisherId="00000000-0000-0000-0000-000000000000"/> <mp:PhoneIdentity PhoneProductId="f047b7dd-96ec-4d54-a862-9321e271e449" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties> <Properties>
<DisplayName>Wino.Server.NET8</DisplayName> <DisplayName>Wino Calendar</DisplayName>
<PublisherDisplayName>bkaan</PublisherDisplayName> <PublisherDisplayName>Burak KÖSE</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo> <Logo>Assets\StoreLogo.png</Logo>
</Properties> </Properties>
<Dependencies> <Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" /> <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies> </Dependencies>
<Resources> <Resources>
@@ -32,20 +39,20 @@
<Applications> <Applications>
<Application Id="App" <Application Id="App"
Executable="$targetnametoken$.exe" Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$"> EntryPoint="Wino.Calendar.App">
<uap:VisualElements <uap:VisualElements
DisplayName="Wino.Server.NET8" DisplayName="Wino Calendar"
Description="Wino.Server.NET8"
BackgroundColor="transparent"
Square150x150Logo="Assets\Square150x150Logo.png" Square150x150Logo="Assets\Square150x150Logo.png"
Square44x44Logo="Assets\Square44x44Logo.png"> Square44x44Logo="Assets\Square44x44Logo.png"
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" /> Description="Wino.Calendar"
BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>
<uap:SplashScreen Image="Assets\SplashScreen.png" /> <uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements> </uap:VisualElements>
</Application> </Application>
</Applications> </Applications>
<Capabilities> <Capabilities>
<rescap:Capability Name="runFullTrust" /> <Capability Name="internetClient" />
</Capabilities> </Capabilities>
</Package> </Package>

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,31 @@
<!--
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" />
<!-- Add your application specific runtime directives here. -->
</Application>
</Directives>

View File

@@ -0,0 +1,172 @@
<?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>
<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>
<PackageCertificateThumbprint>125A5273FCFE8D551C3FED87F67C87A663E98F1B</PackageCertificateThumbprint>
<PackageCertificateKeyFile />
<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|ARM'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM</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>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<ItemGroup>
<None Include="Package.StoreAssociation.xml" />
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.14</Version>
</PackageReference>
</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>

View File

@@ -1,6 +1,4 @@
using Wino.Domain.Enums; namespace Wino.Core.Domain
namespace Wino.Domain
{ {
public static class Constants public static class Constants
{ {
@@ -10,35 +8,11 @@ namespace Wino.Domain
public const string WinoLocalDraftHeader = "X-Wino-Draft-Id"; public const string WinoLocalDraftHeader = "X-Wino-Draft-Id";
public const string LocalDraftStartPrefix = "localDraft_"; public const string LocalDraftStartPrefix = "localDraft_";
// Toast Notification Keys public const string ToastMailUniqueIdKey = nameof(ToastMailUniqueIdKey);
public const string ToastMailItemIdKey = nameof(ToastMailItemIdKey);
public const string ToastMailItemRemoteFolderIdKey = nameof(ToastMailItemRemoteFolderIdKey);
public const string ToastActionKey = nameof(ToastActionKey); public const string ToastActionKey = nameof(ToastActionKey);
// App Configuration public const string ClientLogFile = "Client_.log";
public const AppLanguage DefaultAppLanguage = AppLanguage.English; public const string ServerLogFile = "Server_.log";
public const string SharedFolderName = "WinoShared"; public const string LogArchiveFileName = "WinoLogs.zip";
public static char MailCopyUidSeparator = '_';
// GMail Category Labels
public const string FORUMS_LABEL_ID = "FORUMS";
public const string UPDATES_LABEL_ID = "UPDATES";
public const string PROMOTIONS_LABEL_ID = "PROMOTIONS";
public const string SOCIAL_LABEL_ID = "SOCIAL";
public const string PERSONAL_LABEL_ID = "PERSONAL";
public static string[] SubCategoryFolderLabelIds =
[
FORUMS_LABEL_ID,
UPDATES_LABEL_ID,
PROMOTIONS_LABEL_ID,
SOCIAL_LABEL_ID,
PERSONAL_LABEL_ID
];
// File Names
public const string ProtocolLogFileName = "ImapProtocolLog.log";
public const string WinoLogFileName = "WinoDiagnostics.log";
} }
} }

View File

@@ -1,31 +1,49 @@
using SQLite; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using SQLite;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
/// <summary> /// <summary>
/// Back storage for simple name-address book. /// Back storage for simple name-address book.
/// These values will be inserted during MIME fetch. /// These values will be inserted during MIME fetch.
/// </summary> /// </summary>
// TODO: This can easily evolve to Contact store, just like People app in Windows 10/11. // TODO: This can easily evolve to Contact store, just like People app in Windows 10/11.
// Do it. // Do it.
public class AddressInformation : IEquatable<AddressInformation> public class AccountContact : IEquatable<AccountContact>
{ {
/// <summary>
/// E-mail address of the contact.
/// </summary>
[PrimaryKey] [PrimaryKey]
public string Address { get; set; } public string Address { get; set; }
/// <summary>
/// Display name of the contact.
/// </summary>
public string Name { get; set; } public string Name { get; set; }
/// <summary>
/// Base64 encoded profile image of the contact.
/// </summary>
public string Base64ContactPicture { get; set; }
/// <summary>
/// All registered accounts have their contacts registered as root.
/// Root contacts must not be overridden by any configuration.
/// They are created on account creation.
/// </summary>
public bool IsRootContact { get; set; }
public string DisplayName => Address == Name ? Address : $"{Name} <{Address}>"; public string DisplayName => Address == Name ? Address : $"{Name} <{Address}>";
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return Equals(obj as AddressInformation); return Equals(obj as AccountContact);
} }
public bool Equals(AddressInformation other) public bool Equals(AccountContact other)
{ {
return !(other is null) && return !(other is null) &&
Address == other.Address && Address == other.Address &&
@@ -40,12 +58,12 @@ namespace Wino.Domain.Entities
return hashCode; return hashCode;
} }
public static bool operator ==(AddressInformation left, AddressInformation right) public static bool operator ==(AccountContact left, AccountContact right)
{ {
return EqualityComparer<AddressInformation>.Default.Equals(left, right); return EqualityComparer<AccountContact>.Default.Equals(left, right);
} }
public static bool operator !=(AddressInformation left, AddressInformation right) public static bool operator !=(AccountContact left, AccountContact right)
{ {
return !(left == right); return !(left == right);
} }

View File

@@ -1,7 +1,7 @@
using System; using System;
using SQLite; using SQLite;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
public class AccountSignature public class AccountSignature
{ {

View File

@@ -1,8 +1,8 @@
using System; using System;
using SQLite; using SQLite;
using Wino.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
public class CustomServerInformation public class CustomServerInformation
{ {

View File

@@ -1,8 +1,8 @@
using System; using System;
using SQLite; using SQLite;
using Wino.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
public class MailAccount public class MailAccount
{ {
@@ -44,6 +44,11 @@ namespace Wino.Domain.Entities
/// </summary> /// </summary>
public string AccountColorHex { get; set; } public string AccountColorHex { get; set; }
/// <summary>
/// Base64 encoded profile picture of the account.
/// </summary>
public string Base64ProfilePictureData { get; set; }
/// <summary> /// <summary>
/// Gets or sets the listing order of the account in the accounts list. /// Gets or sets the listing order of the account in the accounts list.
/// </summary> /// </summary>
@@ -78,5 +83,15 @@ namespace Wino.Domain.Entities
/// </summary> /// </summary>
[Ignore] [Ignore]
public MailAccountPreferences Preferences { get; set; } public MailAccountPreferences Preferences { get; set; }
/// <summary>
/// Gets whether the account can perform ProfileInformation sync type.
/// </summary>
public bool IsProfileInfoSyncSupported => ProviderType == MailProviderType.Outlook || ProviderType == MailProviderType.Office365 || ProviderType == MailProviderType.Gmail;
/// <summary>
/// Gets whether the account can perform AliasInformation sync type.
/// </summary>
public bool IsAliasSyncSupported => ProviderType == MailProviderType.Gmail;
} }
} }

View File

@@ -0,0 +1,56 @@
using System;
using SQLite;
namespace Wino.Core.Domain.Entities
{
public class RemoteAccountAlias
{
/// <summary>
/// Display address of the alias.
/// </summary>
public string AliasAddress { get; set; }
/// <summary>
/// Address to be included in Reply-To header when alias is used for sending messages.
/// </summary>
public string ReplyToAddress { get; set; }
/// <summary>
/// Whether this alias is the primary alias for the account.
/// </summary>
public bool IsPrimary { get; set; }
/// <summary>
/// Whether the alias is verified by the server.
/// Only Gmail aliases are verified for now.
/// Non-verified alias messages might be rejected by SMTP server.
/// </summary>
public bool IsVerified { get; set; }
/// <summary>
/// Whether this alias is the root alias for the account.
/// Root alias means the first alias that was created for the account.
/// It can't be deleted or changed.
/// </summary>
public bool IsRootAlias { get; set; }
}
public class MailAccountAlias : RemoteAccountAlias
{
/// <summary>
/// Unique Id for the alias.
/// </summary>
[PrimaryKey]
public Guid Id { get; set; }
/// <summary>
/// Account id that this alias is attached to.
/// </summary>
public Guid AccountId { get; set; }
/// <summary>
/// Root aliases can't be deleted.
/// </summary>
public bool CanDelete => !IsRootAlias;
}
}

View File

@@ -1,7 +1,7 @@
using System; using System;
using SQLite; using SQLite;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
public class MailAccountPreferences public class MailAccountPreferences
{ {

View File

@@ -1,10 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using SQLite; using SQLite;
using Wino.Domain.Enums; using Wino.Core.Domain.Enums;
using Wino.Domain.Models.MailItem; using Wino.Core.Domain.Models.MailItem;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
/// <summary> /// <summary>
/// Summary of the parsed MIME messages. /// Summary of the parsed MIME messages.
@@ -141,7 +141,16 @@ namespace Wino.Domain.Entities
/// </summary> /// </summary>
[Ignore] [Ignore]
public MailAccount AssignedAccount { get; set; } public MailAccount AssignedAccount { get; set; }
public IEnumerable<Guid> GetContainingIds() => new[] { UniqueId };
/// <summary>
/// Contact information of the sender if exists.
/// Warning: This field is not populated by queries.
/// Services or View Models are responsible for populating this field.
/// </summary>
[Ignore]
public AccountContact SenderContact { get; set; }
public IEnumerable<Guid> GetContainingIds() => [UniqueId];
public override string ToString() => $"{Subject} <-> {Id}"; public override string ToString() => $"{Subject} <-> {Id}";
} }
} }

View File

@@ -2,11 +2,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using SQLite; using SQLite;
using Wino.Domain; using Wino.Core.Domain.Enums;
using Wino.Domain.Enums; using Wino.Core.Domain.Models.Folders;
using Wino.Domain.Models.Folders;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
[DebuggerDisplay("{FolderName} - {SpecialFolderType}")] [DebuggerDisplay("{FolderName} - {SpecialFolderType}")]
public class MailItemFolder : IMailItemFolder public class MailItemFolder : IMailItemFolder

View File

@@ -1,7 +1,7 @@
using System; using System;
using SQLite; using SQLite;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
public class MergedInbox public class MergedInbox
{ {

View File

@@ -2,7 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
public record SystemFolderConfiguration(MailItemFolder SentFolder, public record SystemFolderConfiguration(MailItemFolder SentFolder,
MailItemFolder DraftFolder, MailItemFolder DraftFolder,

View File

@@ -1,8 +1,8 @@
using System; using System;
using SQLite; using SQLite;
using Wino.Domain.Models.Authentication; using Wino.Core.Domain.Models.Authentication;
namespace Wino.Domain.Entities namespace Wino.Core.Domain.Entities
{ {
public class TokenInformation : TokenInformationBase public class TokenInformation : TokenInformationBase
{ {
@@ -11,6 +11,10 @@ namespace Wino.Domain.Entities
public Guid AccountId { get; set; } public Guid AccountId { get; set; }
/// <summary>
/// Unique object storage for authenticators if needed.
/// </summary>
public string UniqueId { get; set; }
public string Address { get; set; } public string Address { get; set; }
public void RefreshTokens(TokenInformationBase tokenInformationBase) public void RefreshTokens(TokenInformationBase tokenInformationBase)

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum AccountAttentionReason public enum AccountAttentionReason
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum AccountCreationDialogState public enum AccountCreationDialogState
{ {
@@ -9,6 +9,7 @@
ManuelSetupWaiting, ManuelSetupWaiting,
TestingConnection, TestingConnection,
AutoDiscoverySetup, AutoDiscoverySetup,
AutoDiscoveryInProgress AutoDiscoveryInProgress,
FetchingProfileInformation
} }
} }

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
/// <summary> /// <summary>
/// Indicates the state of synchronizer. /// Indicates the state of synchronizer.

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum AppLanguage public enum AppLanguage
{ {
@@ -15,5 +15,6 @@
Indonesian, Indonesian,
Greek, Greek,
PortugeseBrazil, PortugeseBrazil,
Italian
} }
} }

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum AppThemeType public enum AppThemeType
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum ApplicationElementTheme public enum ApplicationElementTheme
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum BackgroundSynchronizationReason public enum BackgroundSynchronizationReason
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum ChangeRequestType public enum ChangeRequestType
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum CustomIncomingServerType public enum CustomIncomingServerType
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum DraftCreationReason public enum DraftCreationReason
{ {

View File

@@ -1,11 +0,0 @@
namespace Wino.Domain.Enums
{
public enum EditorToolbarSectionType
{
None,
Format,
Insert,
Draw,
Options
}
}

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum FilterOptionType public enum FilterOptionType
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
/// <summary> /// <summary>
/// Defines all possible folder operations that can be done. /// Defines all possible folder operations that can be done.

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum ImapAuthenticationMethod public enum ImapAuthenticationMethod
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum ImapConnectionSecurity public enum ImapConnectionSecurity
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum InfoBarAnimationType public enum InfoBarAnimationType
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum InfoBarMessageType public enum InfoBarMessageType
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum MailAttachmentType public enum MailAttachmentType
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum MailImportance public enum MailImportance
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum MailListDisplayMode public enum MailListDisplayMode
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum MailMarkAsOption public enum MailMarkAsOption
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
// Synchronizer requests. // Synchronizer requests.
public enum MailSynchronizerOperation public enum MailSynchronizerOperation

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum MailProviderType public enum MailProviderType
{ {

View File

@@ -1,8 +0,0 @@
namespace Wino.Domain.Enums
{
public enum MenuPaneMode
{
Visible,
Hidden
}
}

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum NavigationReferenceFrame public enum NavigationReferenceFrame
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
/// <summary> /// <summary>
/// Defines the potential reasons for picking folder in the folder picking dialog. /// Defines the potential reasons for picking folder in the folder picking dialog.

View File

@@ -1,15 +0,0 @@
namespace Wino.Domain.Enums
{
public enum ReaderFont
{
Arial,
TimesNewRoman,
Verdana,
Tahoma,
CourierNew,
Georgia,
TrebuchetMS,
Calibri,
Helvetica
}
}

View File

@@ -0,0 +1,12 @@
namespace Wino.Core.Domain.Enums
{
/// <summary>
/// What should happen to server app when the client is terminated.
/// </summary>
public enum ServerBackgroundMode
{
MinimizedTray, // Still runs, tray icon is visible.
Invisible, // Still runs, tray icon is invisible.
Terminate // Server is terminated as Wino terminates.
}
}

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum SortingOptionType public enum SortingOptionType
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum SpecialFolderType public enum SpecialFolderType
{ {

View File

@@ -0,0 +1,11 @@
namespace Wino.Core.Domain.Enums
{
public enum StartupBehaviorResult
{
Enabled,
Disabled,
DisabledByUser,
DisabledByPolicy,
Fatal
}
}

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
// From the SDK. // From the SDK.
public enum StorePurchaseResult public enum StorePurchaseResult

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum SynchronizationCompletedState public enum SynchronizationCompletedState
{ {

View File

@@ -0,0 +1,12 @@
namespace Wino.Core.Domain.Enums
{
/// <summary>
/// Enumeration for the source of synchronization.
/// Right now it can either be from the client or the server.
/// </summary>
public enum SynchronizationSource
{
Client,
Server
}
}

View File

@@ -1,11 +1,13 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum SynchronizationType public enum SynchronizationType
{ {
FoldersOnly, // Only synchronize folder metadata. FoldersOnly, // Only synchronize folder metadata.
ExecuteRequests, // Run the queued requests, and then synchronize if needed. ExecuteRequests, // Run the queued requests, and then synchronize if needed.
Inbox, // Only Inbox Inbox, // Only Inbox, Sent and Draft folders.
Custom, // Only sync folders that are specified in the options. Custom, // Only sync folders that are specified in the options.
Full, // Synchronize everything Full, // Synchronize all folders. This won't update profile or alias information.
UpdateProfile, // Only update profile information
Alias, // Only update alias information
} }
} }

View File

@@ -0,0 +1,10 @@
namespace Wino.Core.Domain.Enums
{
public enum WinoCustomMessageDialogIcon
{
Information,
Warning,
Error,
Question
}
}

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
/// <summary> /// <summary>
/// All registered views. /// All registered views.
@@ -19,8 +19,10 @@
PersonalizationPage, PersonalizationPage,
MessageListPage, MessageListPage,
MailListPage, MailListPage,
ReadingPanePage, ReadComposePanePage,
LanguageTimePage, LanguageTimePage,
AppPreferencesPage,
SettingOptionsPage, SettingOptionsPage,
AliasManagementPage
} }
} }

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Enums namespace Wino.Core.Domain.Enums
{ {
public enum WinoServerConnectionStatus public enum WinoServerConnectionStatus
{ {

View File

@@ -1,6 +1,6 @@
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
public class AccountSetupCanceledException : Exception public class AccountSetupCanceledException : System.Exception
{ {
} }

View File

@@ -1,7 +1,7 @@
using System; using System;
using Wino.Domain.Entities; using Wino.Core.Domain.Entities;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
/// <summary> /// <summary>
/// Thrown when IAuthenticator requires user interaction to fix authentication issues. /// Thrown when IAuthenticator requires user interaction to fix authentication issues.

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
/// <summary> /// <summary>
/// All exceptions related to authentication. /// All exceptions related to authentication.

View File

@@ -1,9 +0,0 @@
using System;
namespace Wino.Domain.Exceptions
{
/// <summary>
/// An exception thrown when the background task execution policies are denied for some reason.
/// </summary>
public class BackgroundTaskExecutionRequestDeniedException : Exception { }
}

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
/// <summary> /// <summary>
/// An exception thrown when the background task registration is failed. /// An exception thrown when the background task registration is failed.

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
/// <summary> /// <summary>
/// Thrown when composer cant find the mime to load. /// Thrown when composer cant find the mime to load.

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
public class CustomThemeCreationFailedException : Exception public class CustomThemeCreationFailedException : Exception
{ {

View File

@@ -1,6 +1,6 @@
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
public class GoogleAuthenticationException : Exception public class GoogleAuthenticationException : System.Exception
{ {
public GoogleAuthenticationException(string message) : base(message) { } public GoogleAuthenticationException(string message) : base(message) { }
} }

View File

@@ -1,4 +1,6 @@
namespace Wino.Domain.Exceptions using System;
namespace Wino.Core.Domain.Exceptions
{ {
public class ImapClientPoolException : Exception public class ImapClientPoolException : Exception
{ {

View File

@@ -1,7 +1,7 @@
using System; using System;
using Wino.Domain.Models.AutoDiscovery; using Wino.Core.Domain.Models.AutoDiscovery;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
public class ImapConnectionFailedPackage public class ImapConnectionFailedPackage
{ {

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
public class InvalidMoveTargetException : Exception { } public class InvalidMoveTargetException : Exception { }
} }

View File

@@ -0,0 +1,7 @@
namespace Wino.Core.Domain.Exceptions
{
public class MissingAliasException : System.Exception
{
public MissingAliasException() : base(Translator.Exception_MissingAlias) { }
}
}

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
public class SynchronizerEntityNotFoundException : Exception public class SynchronizerEntityNotFoundException : Exception
{ {

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
public class SynchronizerException : Exception public class SynchronizerException : Exception
{ {

View File

@@ -1,7 +1,7 @@
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
/// <summary> /// <summary>
/// When IMAP account's system folder configuration setup is not done yet. /// When IMAP account's system folder configuration setup is not done yet.
/// </summary> /// </summary>
public class SystemFolderConfigurationMissingException : Exception { } public class SystemFolderConfigurationMissingException : System.Exception { }
} }

View File

@@ -1,7 +1,7 @@
using System; using System;
using Wino.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Domain.Exceptions namespace Wino.Core.Domain.Exceptions
{ {
/// <summary> /// <summary>
/// Emitted when special folder is needed for an operation but it couldn't be found. /// Emitted when special folder is needed for an operation but it couldn't be found.

View File

@@ -0,0 +1,12 @@
using System;
namespace Wino.Core.Domain.Exceptions
{
/// <summary>
/// All server crash types. Wino Server ideally should not throw anything else than this Exception type.
/// </summary>
public class WinoServerException : Exception
{
public WinoServerException(string message) : base(message) { }
}
}

View File

@@ -1,14 +0,0 @@
namespace Wino.Domain.Extensions
{
public static class MailkitClientExtensions
{
public static uint ResolveUid(string mailCopyId)
{
var splitted = mailCopyId.Split(Constants.MailCopyUidSeparator);
if (splitted.Length > 1 && uint.TryParse(splitted[1], out uint parsedUint)) return parsedUint;
throw new ArgumentOutOfRangeException(nameof(mailCopyId), mailCopyId, "Invalid mailCopyId format.");
}
}
}

View File

@@ -1,22 +1,20 @@
using MimeKit; using System;
using Wino.Domain;
using Wino.Domain.Entities;
namespace Wino.Domain.Extensions namespace Wino.Core.Domain.Extensions
{ {
public static class MimeExtensions public static class MimeExtensions
{ {
public static string GetBase64MimeMessage(this MimeKit.MimeMessage message)
public static AddressInformation ToAddressInformation(this MailboxAddress address)
{ {
if (address == null) using System.IO.MemoryStream memoryStream = new();
return new AddressInformation() { Name = Translator.UnknownSender, Address = Translator.UnknownAddress }; message.WriteTo(MimeKit.FormatOptions.Default, memoryStream);
byte[] buffer = memoryStream.GetBuffer();
int count = (int)memoryStream.Length;
if (string.IsNullOrEmpty(address.Name)) return Convert.ToBase64String(buffer);
address.Name = address.Address;
return new AddressInformation() { Name = address.Name, Address = address.Address };
} }
public static MimeKit.MimeMessage GetMimeMessageFromBase64(this string base64)
=> MimeKit.MimeMessage.Load(new System.IO.MemoryStream(Convert.FromBase64String(base64)));
} }
} }

View File

@@ -1,6 +1,6 @@
using Wino.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
public interface IAccountCreationDialog public interface IAccountCreationDialog
{ {

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Wino.Domain.Entities; using Wino.Core.Domain.Entities;
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
public interface IAccountMenuItem : IMenuItem public interface IAccountMenuItem : IMenuItem
{ {

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
public interface IAccountPickerDialog public interface IAccountPickerDialog
{ {

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
public interface IAccountProviderDetailViewModel public interface IAccountProviderDetailViewModel
{ {

View File

@@ -1,6 +1,6 @@
using Wino.Domain.Entities; using Wino.Core.Domain.Entities;
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
public interface IAccountProviderDetails public interface IAccountProviderDetails
{ {

View File

@@ -1,9 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Wino.Domain.Entities; using Wino.Core.Domain.Entities;
using Wino.Core.Domain.Models.Accounts;
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
public interface IAccountService public interface IAccountService
{ {
@@ -100,5 +101,59 @@ namespace Wino.Domain.Interfaces
/// </summary> /// </summary>
/// <param name="accountIdOrderPair">AccountId-OrderNumber pair for all accounts.</param> /// <param name="accountIdOrderPair">AccountId-OrderNumber pair for all accounts.</param>
Task UpdateAccountOrdersAsync(Dictionary<Guid, int> accountIdOrderPair); Task UpdateAccountOrdersAsync(Dictionary<Guid, int> accountIdOrderPair);
/// <summary>
/// Returns the account aliases.
/// </summary>
/// <param name="accountId">Account id.</param>
/// <returns>A list of MailAccountAlias that has e-mail aliases.</returns>
Task<List<MailAccountAlias>> GetAccountAliasesAsync(Guid accountId);
/// <summary>
/// Updated account's aliases.
/// </summary>
/// <param name="accountId">Account id to update aliases for.</param>
/// <param name="aliases">Full list of updated aliases.</param>
/// <returns></returns>
Task UpdateAccountAliasesAsync(Guid accountId, List<MailAccountAlias> aliases);
/// <summary>
/// Delete account alias.
/// </summary>
/// <param name="aliasId">Alias to remove.</param>
Task DeleteAccountAliasAsync(Guid aliasId);
/// <summary>
/// Updated profile information of the account.
/// </summary>
/// <param name="accountId">Account id to update info for.</param>
/// <param name="profileInformation">Info data.</param>
/// <returns></returns>
Task UpdateProfileInformationAsync(Guid accountId, ProfileInformation profileInformation);
/// <summary>
/// Creates a root + primary alias for the account.
/// This is only called when the account is created.
/// </summary>
/// <param name="accountId">Account id.</param>
/// <param name="address">Address to create root primary alias from.</param>
Task CreateRootAliasAsync(Guid accountId, string address);
/// <summary>
/// Will compare local-remote aliases and update the local ones or add/delete new ones.
/// </summary>
/// <param name="remoteAccountAliases">Remotely fetched basic alias info from synchronizer.</param>
/// <param name="account">Account to update remote aliases for..</param>
Task UpdateRemoteAliasInformationAsync(MailAccount account, List<RemoteAccountAlias> remoteAccountAliases);
/// <summary>
/// Gets the primary account alias for the given account id.
/// Used when creating draft messages.
/// </summary>
/// <param name="accountId">Account id.</param>
/// <returns>Primary alias for the account.</returns>
Task<MailAccountAlias> GetPrimaryAccountAliasAsync(Guid accountId);
} }
} }

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
/// <summary> /// <summary>
/// Singleton object that holds the application data folder path and the publisher shared folder path. /// Singleton object that holds the application data folder path and the publisher shared folder path.

View File

@@ -1,4 +1,4 @@
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
public interface IApplicationResourceManager<T> public interface IApplicationResourceManager<T>
{ {
@@ -7,6 +7,5 @@
bool ContainsResourceKey(string resourceKey); bool ContainsResourceKey(string resourceKey);
void ReplaceResource(string resourceKey, object resource); void ReplaceResource(string resourceKey, object resource);
T GetLastResource(); T GetLastResource();
TReturn GetResource<TReturn>(string resourceKey);
} }
} }

View File

@@ -1,6 +1,6 @@
using Wino.Domain.Enums; using Wino.Core.Domain.Enums;
namespace Wino.Domain.Interfaces namespace Wino.Core.Domain.Interfaces
{ {
public interface IAuthenticationProvider public interface IAuthenticationProvider
{ {

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