The date's value was being set on every redraw, and since we handle date
selection onfocusout on iOS, this would result in date having an
outdated value if a redraw (triggered by progress monitor for example)
happens between input and focusout events.
To mitigate this, we only set the date's value `oncreate`.
Close#9642
Co-authored-by: hrb-hub <hrb-hub@users.noreply.github.com>
Since there is at least one case where there is no _ownerEncSessionKey
on an encrypted (aggregated) type (GroupInvitationPostReturn and its
MailAddress aggregates), we cannot assertNotNull for the attribute.
This fixes the error that was introduced by
c7a8749a71.
Co-authored-by: jomapp <17314077+jomapp@users.noreply.github.com>
When trying to decrypt instances that were either not encrypted or
did not have an _ownerEncSessionKey (but a bucketKey), we failed to
set the instance on the entityUpdateData. Instead of checking for
existence of the _ownerEncSessionKey, we now resolve the optional
sessionKey using the cryptoFacade.
Co-authored-by: abp <abp@tutao.de>
Instead of applying inbox rules based on the unread mail state in the
inbox folder, we introduce the new ProcessingState enum on
the mail type. If a mail has been processed by the leader client, which
is checking for matching inbox rules, the ProcessingState is
updated. If there is a matching rule the flag is updated through the
MoveMailService, if there is no matching rule, the flag is updated
using the ClientClassifierResultService. Both requests are
throttled / debounced. After processing inbox rules, spam prediction
is conducted for mails that have not yet been moved by an inbox rule.
The ProcessingState for not matching ham mails is also updated using
the ClientClassifierResultService.
This new inbox rule handing solves the following two problems:
- when clicking on a notification it could still happen,
that sometimes the inbox rules where not applied
- when the inbox folder had a lot of unread mails, the loading time did
massively increase, since inbox rules were re-applied on every load
Co-authored-by: amm <amm@tutao.de>
Co-authored-by: Nick <nif@tutao.de>
Co-authored-by: das <das@tutao.de>
Co-authored-by: abp <abp@tutao.de>
Co-authored-by: jhm <17314077+jomapp@users.noreply.github.com>
Co-authored-by: map <mpfau@users.noreply.github.com>
Co-authored-by: Kinan <104761667+kibibytium@users.noreply.github.com>
Implement a local machine learning model for client-side spam filtering.
The local model is implemented using tensorflow "LayersModel" to train
separate models in all available mailboxes, resulting in one model
per ownerGroup (i.e. mailbox).
Initially, the training data is aggregated from the last 30 days of
received mails, and the data is stored in a separate offline database
table named spam_classification_training_data. The trained model is
stored in the table spam_classification_model. The initial training
starts after indexing, with periodic training happening
every 30 minutes and on each subsequent login.
The model will predict on incoming mails once we have received the
entity event for said mail, moving it to either inbox or spam folder.
When users move mails, we update the training data labels accordingly,
by adjusting the isSpam classification and isSpamConfidence values in
the offline database. The MoveMailService now contains a moveReason,
which indicates that the mail has been moved by our spam filter.
Client-side spam filtering can be activated using the
SpamClientClassification feature flag, and is for now only
available on the desktop client.
Co-authored-by: sug <sug@tutao.de>
Co-authored-by: kib <104761667+kibibytium@users.noreply.github.com>
Co-authored-by: abp <abp@tutao.de>
Co-authored-by: map <mpfau@users.noreply.github.com>
Co-authored-by: jhm <17314077+jomapp@users.noreply.github.com>
Co-authored-by: frm <frm@tutao.de>
Co-authored-by: das <das@tutao.de>
Co-authored-by: nif <nif@tutao.de>
Co-authored-by: amm <amm@tutao.de>
Reviewed by jhm, abp, das.
The library is added to support training a spam classification model on
client. A custom rollupTensorFlow was created to only use the needed
methods on the final file, which also has multiple stubs which remove
code which is unwanted such as Requests.
Co-authored-by: jhm <17314077+jomapp@users.noreply.github.com>
Co-authored-by: abp <abp@tutao.de>
Google now requires all Android apps to support 16KB page sizes
until November to remain eligible for publishing on the Play Store.
This commit updates the Kotlin version, NDK, target and compile SDK
versions, as well all third-party dependencies used by the apps,
making our Apps compatibility with 16KB page size support.
Closes#9679
Previously, some weekly events were not correctly rendered during the last
week of the month. This was caused by the event generation loop exiting
prematurely.
This commit adjusts the loop termination condition. Now it only exits if
the event's start time exceeds the maximum date, or if no event is found
and the loop has already reached the configured limit.
Fixes#9667
This commit adds tests for the loadCalendars function, making sure
that calendars are correctly ordered when returned.
It also tests that event loading still working even when the loadCalendars
call fails.
The parser was using /\r?\n\s/g to unfold lines, but \s matches ALL
whitespace including newlines. This caused empty lines (e.g. between
END:VEVENT and END:VCALENDAR) to be incorrectly removed, concatenating
the lines and causing 'no end for tag VEVENT' errors.
Fixed by using /\r?\n[ \t]/g which only matches space or tab, as per
RFC 5545 specification for line folding.
- Fix line folding regex in parseICalendar()
- Add tests for empty line handling and proper line folding
- Fixes parsing of calendars with empty lines between tags
- Accept webcal:// and webcals:// protocols in URL validation
- Automatically convert webcal/webcals URLs to https before fetching
- Update help text to show webcal example
- Add comprehensive test suite for URL normalization
This allows users to subscribe to external calendars using the standard
webcal:// and webcals:// protocols, which are automatically converted to
secure HTTPS connections before fetching.
When receiving an event invitation, users may have more
than just one conflicting event, but we show only one
inside the time overview.
This commit adds an expandable panel to the event banner,
allowing users to expand it by clicking in the warning info
and quickly see which events, along the already displayed one,
are conflicting with the invitation.
Closes#9726
- This commit introduces CalendarInfoBase as a base type to hold common fields between CalendarInfo and BirthdayCalendarInfo
- It also makes CalendarModel provide the available calendars.
- SearchViewModel dependency on the locator is removed and CalendarModel is now injected.
With our new approach we no longer need to set up and store the birthday calendar locally.
Color will be stored in the server and name won't be editable.
Co-authored-by: bed <bed@tutao.de>
we migrated all mails to use the authStatus from mailDetails. we should not use the deprecated status anymore. it will eventually be removed from the model