1
0
mirror of https://github.com/chylex/Nextcloud-Desktop.git synced 2026-04-03 18:11:32 +02:00

Compare commits

..

195 Commits

Author SHA1 Message Date
Matthieu Gallien
04afaa1fe6 Merge pull request #3373 from nextcloud/bump-version-3.2.2
Bump version to 3.2.2
2021-05-27 14:18:17 +02:00
Felix Weilbach
60f3b7781e Bump version to 3.2.2
Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-05-27 14:14:50 +02:00
Nextcloud bot
c626033445 [tx-robot] updated from transifex 2021-05-27 04:00:48 +00:00
Nextcloud bot
76687ce8fd [tx-robot] updated from transifex 2021-05-26 04:04:32 +00:00
allexzander
7c987281cc Merge pull request #3357 from nextcloud/backport/3239/stable-3.2
[stable-3.2] VFS. Display local file name clash error when syncing in VFS mode.
2021-05-25 14:27:17 +03:00
allexzander
91dd481f1a VFS. Display local file name clash error when syncing in VFS mode.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-05-25 10:34:35 +00:00
allexzander
7b725f04e0 Merge pull request #3358 from nextcloud/backport/3246/stable-3.2
[stable-3.2] VFS. Allow dehydartion of readonly files. Preserve 'readonly' flag when creating a placeholder.
2021-05-25 13:33:28 +03:00
allexzander
0b776d2be2 Fix review comments.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-05-25 07:58:00 +00:00
allexzander
7960aca617 VFS. Allow dehydartion of readonly files. Preserve 'readonly' flag when creating a placeholder.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-05-25 07:58:00 +00:00
Nextcloud bot
da4b016b7c [tx-robot] updated from transifex 2021-05-25 04:04:00 +00:00
Nextcloud bot
c82491ebe3 [tx-robot] updated from transifex 2021-05-24 03:57:52 +00:00
Nextcloud bot
025e4a600a [tx-robot] updated from transifex 2021-05-23 03:59:29 +00:00
Nextcloud bot
cb52e36e08 [tx-robot] updated from transifex 2021-05-22 04:03:25 +00:00
Nextcloud bot
f8b7d5bc84 [tx-robot] updated from transifex 2021-05-21 04:05:49 +00:00
Nextcloud bot
0b703ed518 [tx-robot] updated from transifex 2021-05-20 04:17:02 +00:00
Nextcloud bot
19aa80116f [tx-robot] updated from transifex 2021-05-19 04:17:29 +00:00
Nextcloud bot
faa5b2ef54 [tx-robot] updated from transifex 2021-05-18 03:59:47 +00:00
Matthieu Gallien
0778b2178f Merge pull request #3327 from nextcloud/backport/3308/stable-3.2
[stable-3.2] upgrade SQLite3 to 3.35.5
2021-05-17 12:18:02 +02:00
Matthieu Gallien
4f0a8995c2 upgrade SQLite3 to 3.35.5
Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-05-17 09:59:02 +00:00
Nextcloud bot
b5e5985fcb [tx-robot] updated from transifex 2021-05-17 03:58:32 +00:00
Nextcloud bot
705990291b [tx-robot] updated from transifex 2021-05-16 04:01:18 +00:00
Nextcloud bot
364e02bdb0 [tx-robot] updated from transifex 2021-05-15 04:02:31 +00:00
Nextcloud bot
981d94c139 [tx-robot] updated from transifex 2021-05-14 03:52:07 +00:00
Nextcloud bot
14ccfe831a [tx-robot] updated from transifex 2021-05-13 03:49:12 +00:00
Nextcloud bot
0e31d6fe57 [tx-robot] updated from transifex 2021-05-12 03:53:51 +00:00
Nextcloud bot
79128c51b7 [tx-robot] updated from transifex 2021-05-11 03:53:29 +00:00
Nextcloud bot
abf75cc80d [tx-robot] updated from transifex 2021-05-09 03:53:11 +00:00
Nextcloud bot
dd3e6a6ad0 [tx-robot] updated from transifex 2021-05-08 03:55:50 +00:00
Nextcloud bot
aaf4b1d2be [tx-robot] updated from transifex 2021-05-07 03:59:00 +00:00
Matthieu Gallien
9c6c6d82f0 Merge pull request #3273 from nextcloud/backport/3267/stable-3.2
[stable-3.2] send OS name and version to auto updater to allow selective upgrades
2021-05-06 14:28:57 +02:00
Matthieu Gallien
a559513912 send OS name and version to auto updater to allow selective upgrades
in order to be able to suuport legacy OS, also sends the OS name and
version

will be used to detect Windows 8.1 and similar legacy versions

Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-05-06 10:15:12 +00:00
Nextcloud bot
741231f3df [tx-robot] updated from transifex 2021-05-06 03:59:04 +00:00
Felix Weilbach
6cb5bdf2d1 Merge pull request #3264 from nextcloud/backport/3263/stable-3.2
[stable-3.2] Fallback to primary screen if screen under pointer not found
2021-05-05 12:26:58 +02:00
Felix Weilbach
104941e4bb Fallback to primary screen if screen under pointer not found
Fixes #3252

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-05-05 10:13:14 +00:00
Nextcloud bot
d7fb1ebc51 [tx-robot] updated from transifex 2021-05-05 04:07:32 +00:00
Nextcloud bot
c4fec24b23 [tx-robot] updated from transifex 2021-05-04 03:56:18 +00:00
Nextcloud bot
59595152c7 [tx-robot] updated from transifex 2021-05-03 03:54:12 +00:00
Nextcloud bot
5644fcb332 [tx-robot] updated from transifex 2021-05-02 03:53:14 +00:00
Nextcloud bot
d4322ed003 [tx-robot] updated from transifex 2021-05-01 03:56:59 +00:00
Nextcloud bot
046e19465f [tx-robot] updated from transifex 2021-04-30 03:58:24 +00:00
Nextcloud bot
28ccaff866 [tx-robot] updated from transifex 2021-04-29 03:58:27 +00:00
Matthieu Gallien
0a36214189 Merge pull request #3226 from nextcloud/release-3.2.1
update version to 3.2.1
2021-04-28 10:08:41 +02:00
Matthieu Gallien
5901a0f983 update version to 3.2.1
Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-04-28 09:38:14 +02:00
Nextcloud bot
7825cf7f86 [tx-robot] updated from transifex 2021-04-28 03:56:37 +00:00
Matthieu Gallien
d65611bcb7 Merge pull request #3219 from nextcloud/backport/3214/stable-3.2
[stable-3.2] update the news part of documentation with improvements from 3.2 release
2021-04-27 10:01:24 +02:00
Matthieu Gallien
c5f17a7f77 update the versions and date used in the doc generation
should no longer be necessary when this will come from cmake until that,
let's update it

Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-04-27 07:31:02 +00:00
Matthieu Gallien
4637ce7526 update the news part of documentation with improvements from 3.2 release
Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-04-27 07:31:02 +00:00
Nextcloud bot
c3ed9a9d65 [tx-robot] updated from transifex 2021-04-27 03:58:26 +00:00
Matthieu Gallien
6da0650c61 Merge pull request #3213 from nextcloud/backport/3170/stable-3.2
[stable-3.2] status wrong for directories when using vfs and nextcloud desktop 3.2.0
2021-04-26 16:27:43 +02:00
Matthieu Gallien
031f7c48a3 when files get hydrated indirectly through pinning, sets correct state
files that get downloaded not through an hydration request need to be
converted to placeholder

sets the expected state when converting them to placeholder files

 #3082

Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-04-26 13:57:23 +00:00
Matthieu Gallien
abb57d6202 prevent progress bar to appear after a download is finished with CfApi
when using Cloud Filter API with enabled VFS on Windows, a progress bar
stays visible for some time after hydration is completed. Not updating a
last time the progress bar prevents that.

Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-04-26 13:57:23 +00:00
Matthieu Gallien
1e309b71a6 Merge pull request #3212 from nextcloud/backport/3209/stable-3.2
[stable-3.2] add info in the installation page about the supported server versions
2021-04-26 15:56:02 +02:00
Matthieu Gallien
5a159d49d0 add info in the installation page about the supported server versions
Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-04-26 13:32:44 +00:00
Matthieu Gallien
1cc082cec5 Merge pull request #3211 from nextcloud/backport/3187/stable-3.2
[stable-3.2] fix errors when calling CfRegisterSyncRoot by setting more fields
2021-04-26 15:31:15 +02:00
Matthieu Gallien
149bfa9001 fix errors when calling CfRegisterSyncRoot by setting more fields
sets a reasonable size of the StructSize members in the struct passed to
CfRegisterSyncRoot function

Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-04-26 11:57:06 +00:00
Nextcloud bot
f660f923a3 [tx-robot] updated from transifex 2021-04-26 03:55:47 +00:00
Nextcloud bot
f7c4030463 [tx-robot] updated from transifex 2021-04-25 03:57:25 +00:00
Nextcloud bot
55c0cbde36 [tx-robot] updated from transifex 2021-04-24 03:57:30 +00:00
Nextcloud bot
3deb08a7fc [tx-robot] updated from transifex 2021-04-23 03:57:35 +00:00
Nextcloud bot
594b13ed6a [tx-robot] updated from transifex 2021-04-22 03:55:41 +00:00
Nextcloud bot
9cda48e0a6 [tx-robot] updated from transifex 2021-04-21 11:24:08 +00:00
Nextcloud bot
03117c0dcf [tx-robot] updated from transifex 2021-04-21 04:02:57 +00:00
Nextcloud bot
96dab4ff84 [tx-robot] updated from transifex 2021-04-21 03:56:21 +00:00
Nextcloud bot
7dfb6c300f [tx-robot] updated from transifex 2021-04-20 03:55:44 +00:00
Nextcloud bot
9a75fa5db5 [tx-robot] updated from transifex 2021-04-19 03:58:13 +00:00
Nextcloud bot
2272cb6c3a [tx-robot] updated from transifex 2021-04-18 03:52:06 +00:00
Nextcloud bot
e909add969 [tx-robot] updated from transifex 2021-04-17 03:54:02 +00:00
allexzander
33ea9ba00e Merge pull request #3151 from nextcloud/backport/3138/stable-3.2
[stable-3.2] Windows MSI. Do not allow installing Nextcloud client on < Windows 10 or < 1709
2021-04-16 17:15:05 +03:00
allexzander
f86fcc94d8 Minimum supported Windows 10, build 1709.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-16 13:44:03 +00:00
allexzander
443d8baf3a Merge pull request #3149 from nextcloud/backport/3125/stable-3.2
[stable-3.2] Display VFS sync folder within the navigation panel on Windows.
2021-04-16 16:42:12 +03:00
allexzander
c2e217352f Display VFS sync folder within the navigation panel on Windows.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-16 13:10:09 +00:00
Nextcloud bot
555c157cda [tx-robot] updated from transifex 2021-04-16 03:58:42 +00:00
allexzander
03466431be Merge pull request #3123 from nextcloud/backport/3066/stable-3.2
[stable-3.2] Temporary solution for file restoration issue due to failing the data…
2021-04-15 11:02:43 +03:00
allexzander
9b8115558d Temporary solution for file restoration issue due to failing the dataFingerprint on client.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-15 07:39:28 +00:00
Matthieu Gallien
8344969549 Merge pull request #3122 from nextcloud/backport/3046/stable-3.2
[stable-3.2] Do not schedule reboot when installing MSI in silent mode unless 'SCHEDULE_REBOOT is set.
2021-04-15 09:38:19 +02:00
allexzander
eed7fd73a3 Do not schedule reboot when installing MSI in silent mode unless 'SCHEDULE_REBOOT' is set.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-15 07:26:26 +00:00
Nextcloud bot
4c50ba294e [tx-robot] updated from transifex 2021-04-15 03:56:08 +00:00
Nextcloud bot
ec5be0f29a [tx-robot] updated from transifex 2021-04-14 03:58:28 +00:00
Nextcloud bot
f79f4f6783 [tx-robot] updated from transifex 2021-04-13 03:55:05 +00:00
Nextcloud bot
89919b6b33 [tx-robot] updated from transifex 2021-04-12 03:54:03 +00:00
Nextcloud bot
86e0ad4ec6 [tx-robot] updated from transifex 2021-04-11 03:52:34 +00:00
Nextcloud bot
328877c70b [tx-robot] updated from transifex 2021-04-10 04:05:30 +00:00
Matthieu Gallien
14fbf1b106 Merge pull request #3077 from nextcloud/backport/3075/stable-3.2
[stable-3.2] Embed version and icon into windows executable
2021-04-09 15:10:16 +02:00
Felix Weilbach
5f6236bd73 Embed version and icon into windows executable
These changes are necessary because of changing the compilation
process for the gui from a single executable to static lib +
executable in commit 0521dce174.
Otherwise the version and icon information will be lost.

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-04-09 12:30:47 +00:00
Nextcloud bot
a3968bcc87 [tx-robot] updated from transifex 2021-04-09 03:54:31 +00:00
allexzander
5e6c31b262 Merge pull request #3072 from nextcloud/bump-version-3.2.0
Bump version to 3.2.0.
2021-04-08 10:47:24 +03:00
allexzander
8550bfa8f1 Bump version to 3.2.0.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-08 10:38:10 +03:00
allexzander
f6afb62a53 Merge pull request #3069 from nextcloud/feature/user-status
User status bug fixing...
2021-04-08 10:18:13 +03:00
Camila
1ca0ea49dd Remove unnecessary local variable.
Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
29f4a3857b Reposition qml elements for the folder status icon.
Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
050bd49373 Rename enumToUserString => enumToString.
Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
8986975a17 Use enum class instead of enum.
Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
50de12b3c3 Undo unnecessary removal of lines.
Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
163015492a Fix #3067: missing apps icon.
Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
c8ac99c8cf Align status text with server url.
Cleans the space in the beginning of the string when there is no emoji
set.

Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
e51dad79a2 Refactor UserStatus.
- Make preDefinedStatus a local var.
- Add function to get the status user string.

Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
d2b762aa66 Move curly brackets to the correct line.
Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:59 +00:00
Camila
98cfc362f7 Remove const and reference of base types.
Signed-off-by: Camila <hello@camila.codes>
2021-04-08 07:10:58 +00:00
Nextcloud bot
835a61c5ee [tx-robot] updated from transifex 2021-04-08 03:55:06 +00:00
allexzander
5eb6834167 Merge pull request #3057 from nextcloud/bugfix/vfs-windows-lnk-files-freeze-issue
Fix VFX Windows .lnk files freeze/crash issue
2021-04-07 12:28:05 +03:00
allexzander
4b58c2b7b7 Fix review comments.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-07 09:08:02 +00:00
allexzander
82953d0601 Fix review comments.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-07 09:08:02 +00:00
allexzander
de85b79bb8 Address review comments.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-07 09:08:02 +00:00
allexzander
cb8b6ccd9b Ignore *.lnk files on Windows.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-07 09:08:02 +00:00
allexzander
13f4bb541d Treat .lnk files as normal files without hydrating them or creating a placeholder.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-07 09:08:02 +00:00
allexzander
3906ae0922 Another way to fix this.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-07 09:08:02 +00:00
allexzander
7235c708dc Added .lnk file placeholder creation fix.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-07 09:08:02 +00:00
allexzander
d5b6d93978 Fix VFS freeze when syncing '.lnk' files on Windows.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-07 09:08:02 +00:00
Matthieu Gallien
4a7145f1f3 Merge pull request #3068 from nextcloud/bug/fixAssertEditIgnoredFiles
use QFileInfo to check if path is absolute to avoid assert on windows
2021-04-07 10:06:29 +02:00
Matthieu Gallien
d6752c96b1 use QFileInfo to check if path is absolute to avoid assert on windows
on windos absolute path does not have to start with / . Remove failing assert
when editing ignored files list.

Signed-off-by: Matthieu Gallien <matthieu_gallien@yahoo.fr>
2021-04-07 07:40:07 +00:00
Nextcloud bot
77681ff5b5 [tx-robot] updated from transifex 2021-04-07 03:55:50 +00:00
allexzander
4c8378030d Merge pull request #3061 from nextcloud/bugfix/vfs-syncroot-reg-params-non-temp
Create std::wstrings out of const wchar_t* so a copy is created every time
2021-04-06 15:46:06 +03:00
allexzander
0a33e99053 Create std::wstrings out of const wchar_t* so a copy is created every time.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-06 10:03:22 +03:00
allexzander
454226b3ea Merge pull request #3060 from nextcloud/bugfix/reduce-socketapi-logging
Reduce Socket API logging.
2021-04-06 09:49:21 +03:00
allexzander
e15045977e Reduce Socket API logging.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-04-06 09:34:20 +03:00
Nextcloud bot
a599cd2c3f [tx-robot] updated from transifex 2021-04-06 03:54:22 +00:00
Nextcloud bot
487f29cf80 [tx-robot] updated from transifex 2021-04-04 03:53:11 +00:00
Nextcloud bot
2268facd9d [tx-robot] updated from transifex 2021-04-03 04:11:49 +00:00
Nextcloud bot
57aeeca172 [tx-robot] updated from transifex 2021-04-02 03:55:01 +00:00
Nextcloud bot
962bbf3043 [tx-robot] updated from transifex 2021-04-01 03:55:02 +00:00
Felix Weilbach
6e147a7a8c Merge pull request #3052 from nextcloud/bugfix/remove-html-tags-from-notifications
Remove html tags from strings that may appear in notifications
2021-03-31 17:36:15 +02:00
Felix Weilbach
b2377ff64f Remove html tags from strings that may appear in notifications
The content of notifications on MacOS are not allowed to contain HTML
tags in it. Linux (Free Desktop) notifications may contain HTML tags
in their content. However, it is optional that the notification daemon
interprets the tags. The GNOME notification daemon does not interpret
HTML tags and even does not strip them off. KDE's daemon interprets
the tags. For now I think it's the best solution to remove the HTML
tags. In the future we should fire a action if the user clicks on the
notification and react on it and open the link then. This should work
on all platforms. But as this change involves working with the native
MacOS api and I don't have hardware for that at the moment for that I
will postpone it.

Fixes #2200

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-31 16:23:42 +02:00
Camila
be6e0f26df Merge pull request #3049 from nextcloud/bump-version-rc3
Bump version to 3.1.83.
2021-03-31 12:27:22 +02:00
Camila
8741f4386c Bump version to 3.1.83.
Signed-off-by: Camila <hello@camila.codes>
2021-03-31 12:14:18 +02:00
Nextcloud bot
ac6b62e19d [tx-robot] updated from transifex 2021-03-31 03:55:58 +00:00
Nextcloud bot
044b5a33e9 [tx-robot] updated from transifex 2021-03-30 03:51:17 +00:00
Felix Weilbach
dde9eb645e Merge pull request #3040 from nextcloud/bugfix/macos-dont-deploy-bearer
Don't deploy bearer plugin on MacOS
2021-03-29 16:01:41 +02:00
Felix Weilbach
354f4c02ee Don't deploy bearer plugin on MacOS
Fixes #2944, #2237

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-29 13:46:07 +00:00
Camila
58dd076b2b Merge pull request #3015 from nextcloud/bugfix/update-wizard-doc
Update documentation for the account wizard.
2021-03-29 14:51:59 +02:00
Felix Weilbach
7faa80c1e1 Update documentation for the account wizard
This update is necessary because of the following commit:
b5cf820b42

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-29 12:10:37 +00:00
Nextcloud bot
f7dd4bbf69 [tx-robot] updated from transifex 2021-03-29 03:52:25 +00:00
Nextcloud bot
a7ac7991b8 [tx-robot] updated from transifex 2021-03-28 03:51:07 +00:00
Nextcloud bot
8eb5ed07bf [tx-robot] updated from transifex 2021-03-27 03:52:53 +00:00
allexzander
4ce2e79e90 Merge pull request #3043 from nextcloud/bugfix/vfs-syncroot-register-error
Fix VFS CfAPI Syncroot Register Error.
2021-03-27 02:44:13 +02:00
allexzander
28771b25e3 Fix VFS CfAPI Syncroot Register Error.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-03-27 02:41:24 +02:00
allexzander
ab128cc4aa Revert "Merge pull request #3042 from nextcloud/temp-fix-vfs-failure-wow6432"
This reverts commit cafa475398, reversing
changes made to 003e56f4e6.
2021-03-26 22:25:31 +02:00
allexzander
cafa475398 Merge pull request #3042 from nextcloud/temp-fix-vfs-failure-wow6432
Temp fix for vfs failure.
2021-03-26 21:46:10 +02:00
allexzander
9d15334813 Temp fix for vfs failure.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-03-26 21:41:44 +02:00
Nextcloud bot
003e56f4e6 [tx-robot] updated from transifex 2021-03-26 03:54:34 +00:00
Nextcloud bot
99309ab33b [tx-robot] updated from transifex 2021-03-25 03:54:25 +00:00
Camila
d91e24d77d Merge pull request #3034 from nextcloud/bump-version
Bump version to 3.1.82.
2021-03-24 19:48:28 +01:00
Camila
1edc2cfd31 Bump version to 3.1.82.
Signed-off-by: Camila <hello@camila.codes>
2021-03-24 19:47:01 +01:00
Camila
e8669ad4b6 Merge pull request #2505 from nextcloud/status-feature
Status feature.
2021-03-24 17:28:27 +01:00
Camila
9219926a74 Add checks in case userStatus is not available/fails on the server side.
Signed-off-by: Camila <hello@camila.codes>
2021-03-24 15:42:26 +01:00
Camila
d9a0778e52 Add UserStatus enum with the pre defined status.
- User QHash to map status strings and Status enum.

Signed-off-by: Camila <hello@camila.codes>
2021-03-24 15:41:31 +01:00
Camila
974e2fb718 Do not display notifications when user status is do not disturb.
- This information is retrieved from the notifications endpoint.
- Add icons for the different pre defined status.
- Make functions available to QML to decide which status icon to display.
- Display the user status icon on the avatar and
move the online/offline connection status to the folder icon.

Signed-off-by: Camila <hello@camila.codes>
2021-03-24 15:40:05 +01:00
Camila
f4d8699db8 Add UserStatus class to retrieve the user status.
- AccountState controls UserStatus.
- Display user status in the system tray menu next to user's avatar.

Signed-off-by: Camila <hello@camila.codes>
2021-03-24 15:39:13 +01:00
Felix Weilbach
c29c011095 Merge pull request #3029 from nextcloud/Valdnet-patch-2
l10n: Change sync message
2021-03-24 15:03:22 +01:00
Valdnet
519dee9104 l10n: Change sync message #3027 2021-03-24 13:13:40 +00:00
allexzander
e3a26477a2 Merge pull request #2981 from nextcloud/vfs_win_progress_bar_refresh
Refresh Windows download dialog progress when hydrating a placeholder
2021-03-24 15:01:27 +02:00
allexzander
193e50311b Refresh Windows download dialog progress when hydrating a placeholder
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-03-24 14:09:06 +02:00
Felix Weilbach
6a53491645 Merge pull request #3028 from nextcloud/bugfix/check-db-read-successful-on-hydration-canceled
Check reading from journal was successful before remove placeholder
2021-03-24 12:25:13 +01:00
Felix Weilbach
d78774f29e Check reading from journal was successful before remove placeholder
Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-24 10:51:50 +00:00
Nextcloud bot
4e420fcb5c [tx-robot] updated from transifex 2021-03-24 03:52:27 +00:00
Felix Weilbach
22a9d18d3b Merge pull request #3025 from nextcloud/bugfix/hidpi-scaling
Enable high dpi scaling on all platforms
2021-03-23 09:49:25 +01:00
Felix Weilbach
c296a93cee Enable high dpi scaling on all platforms
Fixes #2295, #1079, #914

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-23 08:36:11 +00:00
Nextcloud bot
66ee5087f6 [tx-robot] updated from transifex 2021-03-23 03:51:35 +00:00
Felix Weilbach
4d921c8025 Merge pull request #3020 from nextcloud/feature/increase-file-removal-logging
Increase logging around file removal events
2021-03-22 09:01:42 +01:00
Felix Weilbach
b1983d7d19 Increase logging around file removal events
To better see what is going on when and if files are removed by the
client.

See also: #260, #1433, #2913

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-22 07:48:39 +00:00
Nextcloud bot
54c1ab8828 [tx-robot] updated from transifex 2021-03-22 03:51:08 +00:00
Nextcloud bot
3652251587 [tx-robot] updated from transifex 2021-03-21 03:47:05 +00:00
Nextcloud bot
9c4c7217a0 [tx-robot] updated from transifex 2021-03-20 03:49:45 +00:00
Nextcloud bot
b3d5b4983e [tx-robot] updated from transifex 2021-03-19 03:49:45 +00:00
Felix Weilbach
278a6fd005 Merge pull request #3010 from nextcloud/feature/cfapi-handle-cancelation
CFAPI: Handle cancelation of hydration requests
2021-03-18 13:27:27 +01:00
Felix Weilbach
9bf5b5c7ba CFAPI: Handle cancelation of hydration requests
Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-18 10:43:48 +00:00
allexzander
6abb0b2184 Merge pull request #3016 from nextcloud/fix_for_win_createfile_long_path
Fix for Windows CreateFile long path
2021-03-18 12:34:22 +02:00
allexzander
5f0344abb2 Fix warnings in CfApiWrapper.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-03-18 12:07:07 +02:00
allexzander
3fde838bee Fix for Windows long path issue.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-03-18 12:07:07 +02:00
Nextcloud bot
af654fb4ed [tx-robot] updated from transifex 2021-03-18 03:52:32 +00:00
Felix Weilbach
2ab23e3b3c Merge pull request #2990 from nextcloud/bugfix/fix-create-folder-dialog-crash
Fix crash when trying to open the folder creation dialog
2021-03-17 09:41:06 +01:00
Felix Weilbach
f4853da2ab Fix crash when trying to open the folder creation dialog
The bug does seem to just appear in special compiler
constellations. We're unsure why this fix works. To better see if this
fix works or if crashes still occur, we added some logging.

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-17 08:43:32 +01:00
Nextcloud bot
262f20a8f4 [tx-robot] updated from transifex 2021-03-17 03:49:13 +00:00
Felix Weilbach
96ded93597 Merge pull request #3009 from nextcloud/bugfix/check-not-for-productname
Don't check against product name if checking server version
2021-03-16 16:00:32 +01:00
Felix Weilbach
c0f09ae12c Don't check against product name if checking server version
We should not rely on the product name because it is something the
user can change in the theming options on the server.

Fixes #3001

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-16 14:30:56 +00:00
Felix Weilbach
162dff9525 Merge pull request #2989 from nextcloud/bugfix/fix-appearance-login-dialog
Display the content of the login dialog correct
2021-03-16 14:59:33 +01:00
Felix Weilbach
ff7932bb54 Display the content of the login dialog correct
This adjustment is necessary because of the changes of the new account
wizard that were introduced with:
e0b7ef15b2

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-16 13:34:34 +00:00
Nextcloud bot
6d6da18f9a [tx-robot] updated from transifex 2021-03-16 03:50:03 +00:00
allexzander
a92d300b7f Merge pull request #2995 from nextcloud/repair_basic_auth_support
Repair basic auth support
2021-03-15 11:52:21 +02:00
Kevin Ottens
a6bcd3af46 Force basic auth on get authentication required error
If the get job got an authentication required error on the account url
(not davUrl! at that stage we always get auth error there), then it is
safe to assume basic auth is used on the server. It is then kind of
pointless to use any other auth mode they will necessarily fail. Only
basic auth will do the job so force it.

Signed-off-by: Kevin Ottens <kevin.ottens@enioka.com>
2021-03-15 09:38:15 +00:00
Kevin Ottens
0d3459e85e Introduce an empty auth type
This is necessary to be able to distinguish between "I decided on basic
by default" and "I didn't write any auth type". To make sure all the
jobs end up writing something we then implement the "I decided on basic
by default" in the slots connected to the job and we assert it in
checkAllDone()

Signed-off-by: Kevin Ottens <kevin.ottens@enioka.com>
2021-03-15 09:38:15 +00:00
Kevin Ottens
7ad0208800 Finish cleaning up shibboleth
There were a couple of shibboleth related enums left, since that auth
method isn't supported anymore remove the code tied to those enums. It
was dead code anyway.

Signed-off-by: Kevin Ottens <kevin.ottens@enioka.com>
2021-03-15 09:38:15 +00:00
Nextcloud bot
a61d2d2dd0 [tx-robot] updated from transifex 2021-03-15 03:55:26 +00:00
Nextcloud bot
88a7285e5f [tx-robot] updated from transifex 2021-03-14 03:48:03 +00:00
Nextcloud bot
6c194be02d [tx-robot] updated from transifex 2021-03-13 03:47:03 +00:00
Felix Weilbach
aa9821f05f Merge pull request #2999 from nextcloud/bugfix/fix-settings-dialog-on-dark-theme
Don't customize settings dialog palette
2021-03-12 15:22:15 +01:00
Felix Weilbach
cdc2e4c56e Don't customize settings dialog palette
Customizing of the palette will prevent the settings dialog from
display a dark theme correct.

Fixes #2993

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-12 11:47:16 +01:00
allexzander
d028466d1c Merge pull request #2998 from nextcloud/fix_incorrect_logexpire_config_type
Fix incorrect type when reading the 'logExpire' property from config.
2021-03-12 10:40:12 +02:00
allexzander
c89d351d97 Fix incorrect type when reading the 'logExpire' property from config.
Signed-off-by: allexzander <blackslayer4@gmail.com>
2021-03-12 10:23:31 +02:00
Nextcloud bot
90a06aa57b [tx-robot] updated from transifex 2021-03-12 03:48:03 +00:00
Felix Weilbach
72858da27b Merge pull request #2967 from nextcloud/bugfix/fix-missing-error-handling-download-encrypted
Add missing error handling for downloads of client side encryption
2021-03-11 14:40:40 +01:00
Felix Weilbach
88426de4dd Add missing error handling for downloads of client side encryption
The missing error handlers can cause the sync to hang forever

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-11 10:59:08 +00:00
Felix Weilbach
6fac2d1e40 Merge pull request #2976 from nextcloud/refactor/split-out-valuable-activities
Split content of User::isValueableActivity()
2021-03-11 11:57:55 +01:00
Felix Weilbach
e3ac63e9ff Rename isActivityIgnored() to isUnsolvableconflict()
Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-11 09:42:38 +00:00
Felix Weilbach
05d31e2e53 Split content of User::isValueableActivity()
Refactoring of User::isValueableactivity() because of changes
introduced with merge commit f17c52d.

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
2021-03-11 09:42:38 +00:00
Nextcloud bot
0ce965e8da [tx-robot] updated from transifex 2021-03-11 03:51:50 +00:00
191 changed files with 100455 additions and 58218 deletions

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[bg_BG]=@APPLICATION_ICON_NAME@
Name[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
Comment[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
GenericName[bg_BG]=Синхронизиране на папка

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[br]=@APPLICATION_ICON_NAME@
Name[br]=@APPLICATION_NAME@ burev kempreet an implijer
Comment[br]=@APPLICATION_NAME@ burev kempreet an implijer
GenericName[br]=Tuliad kemprenan

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[ca]=@APPLICATION_ICON_NAME@
Name[ca]=Client de sincronització d'escriptori del @APPLICATION_NAME@
Name[ca]=@APPLICATION_NAME@ per a escriptori
Comment[ca]=Client de sincronització d'escriptori del @APPLICATION_NAME@
GenericName[ca]=Sincronització de carpetes

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[cs_CZ]=@APPLICATION_ICON_NAME@
Name[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
Name[cs_CZ]=@APPLICATION_NAME@ Desktop
Comment[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
GenericName[cs_CZ]=Synchronizace složek

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[cy_GB]=@APPLICATION_ICON_NAME@
Name[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
Comment[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
GenericName[cy_GB]=Cydweddu Ffolder

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[da]=@APPLICATION_ICON_NAME@
Name[da]=@APPLICATION_NAME@ Arbejdsstationsssynkroniseringsklient
Comment[da]=@APPLICATION_NAME@ Arbejdsstationsssynkroniseringsklient
GenericName[da]=Mappesynkronisering

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[el]=@APPLICATION_ICON_NAME@
Name[el]=@APPLICATION_NAME@ πρόγραμμα συγχρονισμού
Comment[el]=@APPLICATION_NAME@ πρόγραμμα συγχρονισμού
GenericName[el]=Συγχρονισμός φακέλου

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[en_GB]=@APPLICATION_ICON_NAME@
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
GenericName[en_GB]=Folder Sync

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[eo]=@APPLICATION_ICON_NAME@
Name[eo]=@APPLICATION_NAME@ sinkroniga kliento
Comment[eo]=@APPLICATION_NAME@ sinkroniga kliento
GenericName[eo]=Dosieruja sinkronigo

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[es_AR]=@APPLICATION_ICON_NAME@
Name[es_AR]=@APPLICATION_NAME@ cliente de sincronización de escritorio
Comment[es_AR]=@APPLICATION_NAME@ cliente de sincronización de escritorio
GenericName[es_AR]=Sincronización de carpetas

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Name[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
Comment[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
GenericName[es_CL]=Sincronización de carpeta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Name[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
Comment[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
GenericName[es_CO]=Sincronización de carpeta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Name[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
Comment[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
GenericName[es_CR]=Sincronización de carpeta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[es_DO]=@APPLICATION_ICON_NAME@
Name[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
Comment[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
GenericName[es_DO]=Sincronización de carpeta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Name[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
Comment[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
GenericName[es_EC]=Sincronización de carpeta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Name[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
Comment[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
GenericName[es_GT]=Sincronización de carpeta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Name[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
Comment[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
GenericName[es_MX]=Sincronización de carpeta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Name[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
Comment[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
GenericName[es_SV]=Sincronización de carpeta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[es]=@APPLICATION_ICON_NAME@
Name[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
Comment[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
Name[es]=@APPLICATION_NAME@ Desktop
Comment[es]=@APPLICATION_NAME@ desktop synchronization client
GenericName[es]=Sincronización de carpetas

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[et_EE]=@APPLICATION_ICON_NAME@
Name[et_EE]=@APPLICATION_NAME@ töölaua sünkimise klient
Comment[et_EE]=@APPLICATION_NAME@ töölaua sünkroniseerimise klient
GenericName[et_EE]=Kausta Sünkroonimine

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[eu]=@APPLICATION_ICON_NAME@
Name[eu]=@APPLICATION_NAME@ mahaigainerako sinkronizazio bezeroa
Name[eu]=@APPLICATION_NAME@ Mahaigaina
Comment[eu]=@APPLICATION_NAME@ mahaigainerako sinkronizazio bezeroa
GenericName[eu]=Karpeta-sinkronizazioa

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[fi_FI]=@APPLICATION_ICON_NAME@
Name[fi_FI]=@APPLICATION_NAME@ työpöydän synkronointipääte
Comment[fi_FI]=@APPLICATION_NAME@ työpöydän synkronointipääte
GenericName[fi_FI]=Kansio synkronointi

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[fr]=@APPLICATION_ICON_NAME@
Name[fr]=Client de synchro @APPLICATION_NAME@
Comment[fr]=Client de synchronisation @APPLICATION_NAME@
GenericName[fr]=Synchronisation du dossier

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[gl]=@APPLICATION_ICON_NAME@
Name[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
GenericName[gl]=Sincronización de cartafol

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[he]=@APPLICATION_ICON_NAME@
Name[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
GenericName[he]=סנכרון תיקיות

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[hr]=@APPLICATION_ICON_NAME@
Name[hr]=@APPLICATION_NAME@ klijent za sink. računala
Comment[hr]=@APPLICATION_NAME@ klijent za sinkronizaciju računala
GenericName[hr]=Sinkronizacija mapa

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[hu_HU]=@APPLICATION_ICON_NAME@
Name[hu_HU]=@APPLICATION_NAME@ asztali szinkronizálási kliens
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizálási kliens
GenericName[hu_HU]=Mappaszinkronizálás

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[is]=@APPLICATION_ICON_NAME@
Name[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
Comment[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
GenericName[is]=Samstilling á möppum

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[it]=@APPLICATION_ICON_NAME@
Name[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
Name[it]=@APPLICATION_NAME@ Desktop
Comment[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
GenericName[it]=Sincronizzazione cartelle

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[ja_JP]=@APPLICATION_ICON_NAME@
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
GenericName[ja_JP]=フォルダーを同期する

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[ko]=@APPLICATION_ICON_NAME@
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
GenericName[ko]=폴더 동기화

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[lt_LT]=@APPLICATION_ICON_NAME@
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
GenericName[lt_LT]=Aplankų sinchronizavimas

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[lv]=@APPLICATION_ICON_NAME@
Name[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
Comment[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
GenericName[lv]=Mapju Sinhronizēšana

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[mk]=@APPLICATION_ICON_NAME@
Name[mk]=@APPLICATION_NAME@ клиент за синхронизација на компјутер
Comment[mk]=@APPLICATION_NAME@ клиент за синхронизација на компјутер
GenericName[mk]=Папка за синхронизација

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[nb_NO]=@APPLICATION_ICON_NAME@
Name[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
GenericName[nb_NO]=Mappe synkroinisering

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[nl]=@APPLICATION_ICON_NAME@
Name[nl]=@APPLICATION_NAME@ desktop sync client
Name[nl]=@APPLICATION_NAME@ Desktop
Comment[nl]=@APPLICATION_NAME@ desktopsynchronisatieclient
GenericName[nl]=Map synchronisatie

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[oc]=@APPLICATION_ICON_NAME@
Name[oc]=@APPLICATION_NAME@ client de sincronizacion
Comment[oc]=@APPLICATION_NAME@ client de sincronizacion
GenericName[oc]=Sincro. dossièr

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[pl]=@APPLICATION_ICON_NAME@
Name[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
Comment[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
Name[pl]=@APPLICATION_NAME@ Desktop
Comment[pl]=Desktopowy klient synchronizacji @APPLICATION_NAME@
GenericName[pl]=Katalog synchronizacji

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[pt_BR]=@APPLICATION_ICON_NAME@
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
Name[pt_BR]=@APPLICATION_NAME@ Desktop
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
GenericName[pt_BR]=Sincronizar pasta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[pt_PT]=@APPLICATION_ICON_NAME@
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
GenericName[pt_PT]=Sincronização de Pasta

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[ro]=@APPLICATION_ICON_NAME@
Name[ro]=@APPLICATION_NAME@ client de sincronizare pentru desktop
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pentru desktop
GenericName[ro]=Sincronizare director

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[ru]=@APPLICATION_ICON_NAME@
Name[ru]=@APPLICATION_NAME@ для ПК
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
GenericName[ru]=Синхронизация папок

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[sc]=@NÙMENE_ICONA_APLICATZIONE@
Name[sc]=@NÙMENE_APLICATZIONE@ cliente sicronizadore de iscrivania
Comment[sc]=@NÙMENE_APLICATZIONE@ cliente de sincronizatzione iscrivania
GenericName[sc]=Sincronizadore de cartellas

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[sk_SK]=@APPLICATION_ICON_NAME@
Name[sk_SK]=@APPLICATION_NAME@ synchronizačný klient pre PC
Comment[sk_SK]=@APPLICATION_NAME@ synchronizačný klient pre PC
GenericName[sk_SK]=Synchronizácia priečinkov

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[sl]=@APPLICATION_ICON_NAME@
Name[sl]=@APPLICATION_NAME@ program za usklajevanje
Comment[sl]=@APPLICATION_NAME@ program za usklajevanje
Name[sl]=Namizni program @APPLICATION_NAME@
Comment[sl]=Program za usklajevanje @APPLICATION_NAME@
GenericName[sl]=Usklajevanje map

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[sr]=@APPLICATION_ICON_NAME@
Name[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
GenericName[sr]=Синхронизација фасцикли

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[sv]=@APPLICATION_ICON_NAME@
Name[sv]=@APPLICATION_NAME@ desktopssynkklient
Comment[sv]=@APPLICATION_NAME@ desktopssynkroniseringsklient
GenericName[sv]=Mappsynkronisering

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[sw]=@APPLICATION_ICON_NAME@
Name[sw]=Teja ya @APPLICATION_NAME@ ya kufanana faili kwa seva na faili ziko hapa
Comment[sw]=Teja ya @APPLICATION_NAME@ ya kufanana faili kwa seva na faili ziko hapa
GenericName[sw]=Fanana Kabrasha

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[tr]=@APPLICATION_ICON_NAME@
Name[tr]=@APPLICATION_NAME@ masaüstü eşiteme istemcisi
Name[tr]=@APPLICATION_NAME@ Masaüstü
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
GenericName[tr]=Klasör Eşitleme

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[uk]=@APPLICATION_ICON_NAME@
Name[uk]=@APPLICATION_NAME@ клієнт для ПК
Comment[uk]=Клієнт синхронізації @APPLICATION_NAME@ для ПК
GenericName[uk]=Синхронізація тек

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[zh_CN]=@APPLICATION_ICON_NAME@
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
Name[zh_CN]=@APPLICATION_NAME@ 桌面
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
GenericName[zh_CN]=文件夹同步

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[zh_HK]=@APPLICATION_ICON_NAME@
Name[zh_HK]= @APPLICATION_NAME@ 桌面同步客戶端
Name[zh_HK]=@APPLICATION_NAME@ 桌面電腦
Comment[zh_HK]= @APPLICATION_NAME@ 桌面同步客戶端
GenericName[zh_HK]=資料夾同步

View File

@@ -2,7 +2,7 @@
Categories=Utility;X-SuSE-SyncUtility;
Type=Application
Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Name=@APPLICATION_NAME@ Desktop
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_ICON_NAME@
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
# Translations
Icon[zh_TW]=@APPLICATION_ICON_NAME@
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
Name[zh_TW]=@APPLICATION_NAME@ 桌面
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
GenericName[zh_TW]=資料夾同步

View File

@@ -1,9 +1,14 @@
set( MIRALL_VERSION_MAJOR 3 )
set( MIRALL_VERSION_MINOR 1 )
set( MIRALL_VERSION_PATCH 81 )
set( MIRALL_VERSION_YEAR 2020 )
set( MIRALL_VERSION_MINOR 2 )
set( MIRALL_VERSION_PATCH 2 )
set( MIRALL_VERSION_YEAR 2021 )
set( MIRALL_SOVERSION 0 )
# Minimum supported server version according to https://docs.nextcloud.com/server/latest/admin_manual/release_schedule.html
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MAJOR 19)
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MINOR 0)
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_PATCH 0)
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
set( MIRALL_VERSION_SUFFIX "git") #e.g. beta1, beta2, rc1
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )

View File

@@ -52,6 +52,9 @@
<Property Id="INSTALLDIR">
<RegistrySearch Id="RegistryInstallDir" Type="raw" Root="HKLM" Key="Software\$(var.AppVendor)\$(var.AppName)" Win64="no" />
</Property>
<Property Id="WINDOWSRELEASEID">
<RegistrySearch Id="RegistryWindowsReleaseId" Type="raw" Root="HKLM" Key="Software\Microsoft\Windows NT\CurrentVersion" Name="ReleaseId"/>
</Property>
<!-- Detect legacy NSIS installation -->
<Property Id="NSIS_UNINSTALLEXE">
@@ -77,8 +80,8 @@
<!-- Uninstall: Remove sync folders from Explorer's Navigation Pane, only effective for the current user (home users) -->
<Custom Action="RemoveNavigationPaneEntries" After="RemoveFiles">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
<!-- Schedule Reboot for the Shell Extensions -->
<ScheduleReboot After="InstallFinalize">NOT (DO_NOT_SCHEDULE_REBOOT=1)</ScheduleReboot>
<!-- Schedule Reboot for the Shell Extensions (in silent installation mode only, or if SCHEDULE_REBOOT argument is set-->
<ScheduleReboot After="InstallFinalize">(SCHEDULE_REBOOT=1) OR NOT (UILevel=2)</ScheduleReboot>
</InstallExecuteSequence>
<!-- "Add or Remove" Programs Entries -->
@@ -214,6 +217,6 @@
<Condition Level="0">(NO_DESKTOP_SHORTCUT=1)</Condition>
</Feature>
</Feature>
<Condition Message="This application only runs on Windows 10, version 1709 or higher!">(VersionNT>=603 AND WINDOWSRELEASEID>=1709)</Condition>
</Product>
</Wix>

View File

@@ -41,16 +41,16 @@ master_doc = 'index'
# General information about the project.
project = u'Nextcloud Client Manual'
copyright = u'2013-2020, The Nextcloud developers'
copyright = u'2013-2021, The Nextcloud developers'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '3.0'
version = '3.2'
# The full version, including alpha/beta/rc tags.
release = '3.0'
release = '3.2.2'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
doc/images/wizard_flow2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
doc/images/wizard_setup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -6,6 +6,10 @@ You can download the latest version of the Nextcloud Desktop Synchronization
Client from the `Nextcloud download page`_.
There are clients for Linux, macOs, and Microsoft Windows.
The currently supported server releases are the latest three stable versions
at time of publication. It means that the |version| release series is supporting
server major version 19, 20 and 21.
Installation on Mac OS X and Windows is the same as for any software
application: download the program and then double-click it to launch the
installation, and then follow the installation wizard. After it is installed and
@@ -27,7 +31,7 @@ download page.
System Requirements
----------------------------------
- Windows 8.1+
- Windows 10+
- macOS 10.12+ (**64-bit only**)
- macOS 10.10 & 10.11 (**64-bit and up to client legacy version 2.6.5 only**)
- CentOS 6 & 7 (64-bit only)
@@ -169,36 +173,49 @@ Installation Wizard
-------------------
The installation wizard takes you step-by-step through configuration options and
account setup. First you need to enter the URL of your Nextcloud server.
account setup. First, you need to enter the URL of your Nextcloud server.
.. image:: images/client-1.png
.. image:: images/wizard_welcome.png
:alt: form for choosing between login and registering
If you already have an account on a Nextcloud instance, you want to
press the button ``Login to your Nextcloud``. If you don't have a
Nextcloud instance and an account there, you might want to register an
account with a provider. Press ``Create account with Provider`` in
that case. Please keep in mind that the desktop client might have
built without provider support. In that case, you won't see this
page. Instead, you will be prompted with the next page.
.. image:: images/wizard_setup.png
:alt: form for entering Nextcloud server URL
Enter your Nextcloud login on the next screen.
Enter the URL for your Nextcloud instance. The URL is the same URL that
you type into your browser when you try to access your Nextcloud
instance.
.. image:: images/client-2.png
:alt: form for entering your Nextcloud login
.. image:: images/wizard_flow2.png
:alt: form waiting for authorization
On the Local Folder Option screen you may sync
all of your files on the Nextcloud server, or select individual folders. The
default local sync folder is ``Nextcloud``, in your home directory. You may
change this as well.
Now your web browser should open and prompt you to login into your
Nextcloud instance. Enter your username and password in your web
browser and grant access. After you did that, go back to the
wizard. Please keep in mind that you might not need to enter your
username and password if you are already logged in to your browser.
.. image:: images/client-3.png
.. image:: images/wizard_advanced.png
:alt: Select which remote folders to sync, and which local folder to store
them in.
When you have completed selecting your sync folders, click the Connect button
at the bottom right. The client will attempt to connect to your Nextcloud
server, and when it is successful you'll see two buttons: one to connect to
your Nextcloud Web GUI, and one to open your local folder. It will also start
synchronizing your files.
On the local folder options screen, you may sync all of your files on
the Nextcloud server, or select individual folders. The default local
sync folder is ``Nextcloud``, in your home directory. You may change
this as well.
.. image:: images/client-4.png
:alt: A successful server connection, showing a button to connect to your
Web GUI, and one to open your local Nextcloud folder
Click the Finish button, and you're all done.
When you have completed selecting your sync folders, click the Connect
button at the bottom right. The client will attempt to connect to your
Nextcloud server, and when it is successful, the wizard closes
itself. You can now observe the sync activity if you open the main
dialogue by clicking on the tray icon.
.. Links

View File

@@ -18,10 +18,8 @@ Improvements and New Features
The |version| release of the Nextcloud desktop sync client has many new features and
improvements.
* Show server notifications on the client
* Improved sync speed
* Improved handling of Win32 file locks and network files
* Improved user notifications about ignored files and conflicts
* Add warnings for old server versions
* Update of QtKeyChain to support Windows credential store
* Packaging of dolphin overlay icon module for bleeding edge distributions
* Virtual Files on Windows
* Support for the user status from the server
* Many improvements to the sync engine
* Make the end-to-end encryption work more reliable
* Improve sync performance

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -44,6 +44,12 @@ struct OCSYNC_EXPORT VfsSetupParams
*/
QString filesystemPath;
// Folder display name in Windows Explorer
QString displayName;
// Folder alias
QString alias;
/** The path to the synced folder on the account
*
* Always ends with /.

View File

@@ -52,7 +52,7 @@ struct csync_vio_handle_t {
QString path; // Always ends with '\'
};
static int _csync_vio_local_stat_mb(const mbchar_t *uri, csync_file_stat_t *buf);
static int _csync_vio_local_stat_mb(const QString &path, csync_file_stat_t *buf);
csync_vio_handle_t *csync_vio_local_opendir(const QString &name) {
@@ -163,7 +163,8 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
file_stat->type = ItemTypeDirectory;
} else {
file_stat->type = ItemTypeFile;
// exclude ".lnk" files as they are not essential, but, causing troubles when enabling the VFS due to QFileInfo::isDir() and other methods are freezing, which causes the ".lnk" files to start hydrating and freezing the app eventually.
file_stat->type = !OCC::FileSystem::isLnkFile(path) ? ItemTypeFile : ItemTypeSoftLink;
}
/* Check for the hidden flag */
@@ -174,12 +175,12 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
file_stat->size = (handle->ffd.nFileSizeHigh * ((int64_t)(MAXDWORD)+1)) + handle->ffd.nFileSizeLow;
file_stat->modtime = FileTimeToUnixTime(&handle->ffd.ftLastWriteTime, &rem);
std::wstring fullPath;
QString fullPath;
fullPath.reserve(handle->path.size() + std::wcslen(handle->ffd.cFileName));
fullPath += handle->path.toStdWString(); // path always ends with '\', by construction
fullPath += handle->ffd.cFileName;
fullPath += handle->path; // path always ends with '\', by construction
fullPath += QString::fromWCharArray(handle->ffd.cFileName);
if (_csync_vio_local_stat_mb(fullPath.data(), file_stat.get()) < 0) {
if (_csync_vio_local_stat_mb(fullPath, file_stat.get()) < 0) {
// Will get excluded by _csync_detect_update.
file_stat->type = ItemTypeSkip;
}
@@ -190,12 +191,11 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
int csync_vio_local_stat(const QString &uri, csync_file_stat_t *buf)
{
const std::wstring wuri = uri.toStdWString();
int rc = _csync_vio_local_stat_mb(wuri.data(), buf);
int rc = _csync_vio_local_stat_mb(uri, buf);
return rc;
}
static int _csync_vio_local_stat_mb(const mbchar_t *wuri, csync_file_stat_t *buf)
static int _csync_vio_local_stat_mb(const QString &path, csync_file_stat_t *buf)
{
/* Almost nothing to do since csync_vio_local_readdir already filled up most of the information
But we still need to fetch the file ID.
@@ -206,18 +206,20 @@ static int _csync_vio_local_stat_mb(const mbchar_t *wuri, csync_file_stat_t *buf
BY_HANDLE_FILE_INFORMATION fileInfo;
ULARGE_INTEGER FileIndex;
h = CreateFileW( wuri, 0, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
const auto longPath = OCC::FileSystem::longWinPath(path);
h = CreateFileW(longPath.toStdWString().data(), 0, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
nullptr, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
nullptr );
if( h == INVALID_HANDLE_VALUE ) {
qCCritical(lcCSyncVIOLocal, "CreateFileW failed on %ls", wuri);
qCCritical(lcCSyncVIOLocal) << "CreateFileW failed on" << longPath;
errno = GetLastError();
return -1;
}
if(!GetFileInformationByHandle( h, &fileInfo ) ) {
qCCritical(lcCSyncVIOLocal, "GetFileInformationByHandle failed on %ls", wuri);
qCCritical(lcCSyncVIOLocal) << "GetFileInformationByHandle failed on" << longPath;
errno = GetLastError();
CloseHandle(h);
return -1;

View File

@@ -98,6 +98,7 @@ set(client_SRCS
systray.cpp
thumbnailjob.cpp
userinfo.cpp
userstatus.cpp
accountstate.cpp
addcertificatedialog.cpp
authenticationdialog.cpp
@@ -222,8 +223,6 @@ set( final_src
${MIRALL_RC_SRC}
${client_SRCS}
${client_UI_SRCS}
${client_version}
${client_manifest}
${guiMoc}
${client_I18N}
${3rdparty_SRC}
@@ -252,7 +251,7 @@ if(APPLE)
file(GLOB_RECURSE OWNCLOUD_SIDEBAR_ICONS "${theme_dir}/colored/*-${APPLICATION_ICON_NAME}-sidebar*")
MESSAGE(STATUS "OWNCLOUD_SIDEBAR_ICONS: ${APPLICATION_ICON_NAME}: ${OWNCLOUD_SIDEBAR_ICONS}")
endif()
ecm_add_app_icon(final_src ICONS "${OWNCLOUD_ICONS}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASENAME "${APPLICATION_ICON_NAME}")
ecm_add_app_icon(APP_ICON ICONS "${OWNCLOUD_ICONS}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASENAME "${APPLICATION_ICON_NAME}")
if(UNIX AND NOT APPLE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
@@ -314,13 +313,13 @@ if(NOT BUILD_OWNCLOUD_OSX_BUNDLE)
endif()
# we may not add MACOSX_BUNDLE here, if not building one
add_executable(${APPLICATION_EXECUTABLE} WIN32 main.cpp)
add_executable(${APPLICATION_EXECUTABLE} WIN32 main.cpp ${client_version} ${client_manifest} ${APP_ICON})
else()
# set(CMAKE_INSTALL_PREFIX ".") # Examples use /Applications. hurmpf.
set(MACOSX_BUNDLE_ICON_FILE "${APPLICATION_ICON_NAME}.icns")
# we must add MACOSX_BUNDLE only if building a bundle
add_executable(${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp)
add_executable(${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp ${APP_ICON})
set (QM_DIR ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/Translations)
install(FILES ${client_I18N} DESTINATION ${QM_DIR})
@@ -429,11 +428,13 @@ if(BUILD_OWNCLOUD_OSX_BUNDLE AND NOT BUILD_LIBRARIES_ONLY)
add_custom_command(TARGET ${APPLICATION_EXECUTABLE} POST_BUILD
COMMAND "${MACDEPLOYQT_EXECUTABLE}"
"$<TARGET_FILE_DIR:${APPLICATION_EXECUTABLE}>/../.."
-qmldir=${CMAKE_SOURCE_DIR}/src/gui
-always-overwrite
-executable="$<TARGET_FILE_DIR:${APPLICATION_EXECUTABLE}>/${cmd_NAME}"
${NO_STRIP}
"$<TARGET_FILE_DIR:${APPLICATION_EXECUTABLE}>/../.."
-qmldir=${CMAKE_SOURCE_DIR}/src/gui
-always-overwrite
-executable="$<TARGET_FILE_DIR:${APPLICATION_EXECUTABLE}>/${cmd_NAME}"
${NO_STRIP}
COMMAND "${CMAKE_COMMAND}"
-E rm -rf "${BIN_OUTPUT_DIRECTORY}/${OWNCLOUD_OSX_BUNDLE}/Contents/PlugIns/bearer"
COMMENT "Running macdeployqt..."
)
endif()

View File

@@ -380,6 +380,7 @@ void AccountManager::deleteAccount(AccountState *account)
// Forget E2E keys
account->account()->e2e()->forgetSensitiveData(account->account());
emit accountSyncConnectionRemoved(account);
emit accountRemoved(account);
}

View File

@@ -114,6 +114,7 @@ public slots:
Q_SIGNALS:
void accountAdded(AccountState *account);
void accountRemoved(AccountState *account);
void accountSyncConnectionRemoved(AccountState *account);
void removeAccountFolders(AccountState *account);
};
}

View File

@@ -385,8 +385,7 @@ void AccountSettings::slotEditCurrentLocalIgnoredFiles()
void AccountSettings::openIgnoredFilesDialog(const QString & absFolderPath)
{
Q_ASSERT(absFolderPath.startsWith('/'));
Q_ASSERT(absFolderPath.endsWith('/'));
Q_ASSERT(QFileInfo(absFolderPath).isAbsolute());
const QString ignoreFile = absFolderPath + ".sync-exclude.lst";
auto layout = new QVBoxLayout();

View File

@@ -44,6 +44,8 @@ AccountState::AccountState(AccountPtr account)
, _waitingForNewCredentials(false)
, _maintenanceToConnectedDelay(60000 + (qrand() % (4 * 60000))) // 1-5min delay
, _remoteWipe(new RemoteWipe(_account))
, _userStatus(new UserStatus(this))
, _isDesktopNotificationsAllowed(true)
{
qRegisterMetaType<AccountState *>("AccountState*");
@@ -125,6 +127,21 @@ void AccountState::setState(State state)
emit stateChanged(_state);
}
UserStatus::Status AccountState::status() const
{
return _userStatus->status();
}
QString AccountState::statusMessage() const
{
return _userStatus->message();
}
QUrl AccountState::statusIcon() const
{
return _userStatus->icon();
}
QString AccountState::stateString(State state)
{
switch (state) {
@@ -205,6 +222,16 @@ void AccountState::setNavigationAppsEtagResponseHeader(const QByteArray &value)
_navigationAppsEtagResponseHeader = value;
}
bool AccountState::isDesktopNotificationsAllowed() const
{
return _isDesktopNotificationsAllowed;
}
void AccountState::setDesktopNotificationsAllowed(bool isAllowed)
{
_isDesktopNotificationsAllowed = isAllowed;
}
void AccountState::checkConnectivity()
{
if (isSignedOut() || _waitingForNewCredentials) {
@@ -422,6 +449,12 @@ void AccountState::fetchNavigationApps(){
job->getNavigationApps();
}
void AccountState::fetchUserStatus()
{
connect(_userStatus, &UserStatus::fetchUserStatusFinished, this, &AccountState::statusChanged);
_userStatus->fetchUserStatus(_account);
}
void AccountState::slotEtagResponseHeaderReceived(const QByteArray &value, int statusCode){
if(statusCode == 200){
qCDebug(lcAccountState) << "New navigation apps ETag Response Header received " << value;

View File

@@ -21,6 +21,7 @@
#include <QPointer>
#include "connectionvalidator.h"
#include "creds/abstractcredentials.h"
#include "userstatus.h"
#include <memory>
class QSettings;
@@ -161,6 +162,32 @@ public:
///Asks for user credentials
void handleInvalidCredentials();
/** Returns the user status (Online, Dnd, Away, Offline, Invisible)
* https://gist.github.com/georgehrke/55a0412007f13be1551d1f9436a39675
*/
UserStatus::Status status() const;
/** Returns the user status Message (emoji + text)
*/
QString statusMessage() const;
/** Returns the user status icon url
*/
QUrl statusIcon() const;
/** Returns the notifications status retrieved by the notificatons endpoint
* https://github.com/nextcloud/desktop/issues/2318#issuecomment-680698429
*/
bool isDesktopNotificationsAllowed() const;
/** Set desktop notifications status retrieved by the notificatons endpoint
*/
void setDesktopNotificationsAllowed(bool isAllowed);
/** Fetch the user status (status, icon, message)
*/
void fetchUserStatus();
public slots:
/// Triggers a ping to the server to update state and
/// connection status and errors.
@@ -174,6 +201,7 @@ signals:
void stateChanged(State state);
void isConnectedChanged();
void hasFetchedNavigationApps();
void statusChanged();
protected Q_SLOTS:
void slotConnectionValidatorResult(ConnectionValidator::Status status, const QStringList &errors);
@@ -223,6 +251,8 @@ private:
*/
AccountAppList _apps;
UserStatus *_userStatus;
bool _isDesktopNotificationsAllowed;
};
class AccountApp : public QObject

View File

@@ -156,8 +156,8 @@ void WebFlowCredentials::askFromUser() {
_askDialog->setUrl(url);
}
QString msg = tr("You have been logged out of %1 as user %2. Please login again")
.arg(_account->displayName(), _user);
QString msg = tr("You have been logged out of %1 as user %2. Please login again.")
.arg(_account->displayName(), _user);
_askDialog->setInfo(msg);
_askDialog->show();

View File

@@ -27,19 +27,12 @@ WebFlowCredentialsDialog::WebFlowCredentialsDialog(Account *account, bool useFlo
_layout->setSpacing(0);
_layout->setMargin(0);
if(_useFlow2) {
_headerBanner = new HeaderBanner(this);
_layout->addWidget(_headerBanner);
Theme *theme = Theme::instance();
_headerBanner->setup(tr("Log in"), theme->wizardHeaderLogo(), theme->wizardHeaderBanner(),
Qt::AutoText, QString::fromLatin1("color:#fff;"));
}
_containerLayout = new QVBoxLayout(this);
_containerLayout->setSpacing(spacing);
_containerLayout->setMargin(margin);
_infoLabel = new QLabel();
_infoLabel->setAlignment(Qt::AlignCenter);
_containerLayout->addWidget(_infoLabel);
if (_useFlow2) {

View File

@@ -300,6 +300,14 @@ void Folder::setSyncPaused(bool paused)
emit canSyncChanged();
}
void Folder::onAssociatedAccountRemoved()
{
if (_vfs) {
_vfs->stop();
_vfs->unregisterFolder();
}
}
void Folder::setSyncState(SyncResult::Status state)
{
_syncResult.setStatus(state);
@@ -486,6 +494,8 @@ void Folder::startVfs()
VfsSetupParams vfsParams;
vfsParams.filesystemPath = path();
vfsParams.displayName = shortGuiRemotePathOrAppName();
vfsParams.alias = alias();
vfsParams.remotePath = remotePathTrailingSlash();
vfsParams.account = _accountState->account();
vfsParams.journal = &_journal;

View File

@@ -206,6 +206,8 @@ public:
*/
virtual void wipeForRemoval();
void onAssociatedAccountRemoved();
void setSyncState(SyncResult::Status state);
void setDirtyNetworkLimits();

View File

@@ -19,9 +19,12 @@
#include <QDir>
#include <QMessageBox>
#include <QLoggingCategory>
namespace OCC {
Q_LOGGING_CATEGORY(lcFolderCreationDialog, "nextcloud.gui.foldercreationdialog", QtInfoMsg)
FolderCreationDialog::FolderCreationDialog(const QString &destination, QWidget *parent)
: QDialog(parent)
, ui(new Ui::FolderCreationDialog)
@@ -37,7 +40,7 @@ FolderCreationDialog::FolderCreationDialog(const QString &destination, QWidget *
const QString suggestedFolderNamePrefix = QObject::tr("New folder");
const auto newFolderFullPath = _destination + "/" + suggestedFolderNamePrefix;
const QString newFolderFullPath = _destination + QLatin1Char('/') + suggestedFolderNamePrefix;
if (!QDir(newFolderFullPath).exists()) {
ui->newFolderNameEdit->setText(suggestedFolderNamePrefix);
} else {

View File

@@ -76,6 +76,9 @@ FolderMan::FolderMan(QObject *parent)
connect(AccountManager::instance(), &AccountManager::removeAccountFolders,
this, &FolderMan::slotRemoveFoldersForAccount);
connect(AccountManager::instance(), &AccountManager::accountSyncConnectionRemoved,
this, &FolderMan::slotAccountRemoved);
connect(_lockWatcher.data(), &LockWatcher::fileUnlocked,
this, &FolderMan::slotWatchedFileUnlocked);
@@ -902,6 +905,15 @@ void FolderMan::runEtagJobIfPossible(Folder *folder)
QMetaObject::invokeMethod(folder, "slotRunEtagJob", Qt::QueuedConnection);
}
void FolderMan::slotAccountRemoved(AccountState *accountState)
{
for (const auto &folder : qAsConst(_folderMap)) {
if (folder->accountState() == accountState) {
folder->onAssociatedAccountRemoved();
}
}
}
void FolderMan::slotRemoveFoldersForAccount(AccountState *accountState)
{
QVarLengthArray<Folder *, 16> foldersToRemove;
@@ -1477,7 +1489,7 @@ QString FolderMan::trayTooltipStatusString(
case SyncResult::Success:
case SyncResult::Problem:
if (hasUnresolvedConflicts) {
folderMessage = tr("Sync was successful, unresolved conflicts.");
folderMessage = tr("Sync finished with unresolved conflicts.");
} else {
folderMessage = tr("Last Sync was successful.");
}

View File

@@ -264,6 +264,8 @@ private slots:
void slotStartScheduledFolderSync();
void slotEtagPollTimerTimeout();
void slotAccountRemoved(AccountState *accountState);
void slotRemoveFoldersForAccount(AccountState *accountState);
// Wraps the Folder::syncStateChange() signal into the

View File

@@ -64,10 +64,7 @@ int main(int argc, char **argv)
// OpenSSL 1.1.0: No explicit initialisation or de-initialisation is necessary.
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
#ifdef Q_OS_WIN
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
#endif // !Q_OS_WIN
#ifdef Q_OS_MAC
Mac::CocoaInitializer cocoaInit; // RIIA
#endif

View File

@@ -86,9 +86,6 @@ void NavigationPaneHelper::updateCloudStorageRegistry()
// We currently don't distinguish between new and existing CLSIDs, if it's there we just
// save over it. We at least need to update the tile in case we are suddently using multiple accounts.
foreach (Folder *folder, _folderMan->map()) {
if (folder->vfs().mode() == Vfs::WindowsCfApi) {
continue;
}
if (!folder->navigationPaneClsid().isNull()) {
// If it already exists, unmark it for removal, this is a valid sync root.
entriesToRemove.removeOne(folder->navigationPaneClsid());

View File

@@ -86,17 +86,6 @@ bool OwncloudSetupWizard::bringWizardToFrontIfVisible()
return false;
}
if (wiz->_ocWizard->currentId() == WizardCommon::Page_ShibbolethCreds) {
// Try to find if there is a browser open and raise that instead (Issue #6105)
const auto allWindow = qApp->topLevelWidgets();
auto it = std::find_if(allWindow.cbegin(), allWindow.cend(), [](QWidget *w)
{ return QLatin1String(w->metaObject()->className()) == QLatin1String("OCC::ShibbolethWebView"); });
if (it != allWindow.cend()) {
ownCloudGui::raiseDialog(*it);
return true;
}
}
ownCloudGui::raiseDialog(wiz->_ocWizard);
return true;
}
@@ -413,7 +402,7 @@ void OwncloudSetupWizard::slotAuthError()
// bring wizard to top
_ocWizard->bringToTop();
if (_ocWizard->currentId() == WizardCommon::Page_ShibbolethCreds || _ocWizard->currentId() == WizardCommon::Page_OAuthCreds || _ocWizard->currentId() == WizardCommon::Page_Flow2AuthCreds) {
if (_ocWizard->currentId() == WizardCommon::Page_OAuthCreds || _ocWizard->currentId() == WizardCommon::Page_Flow2AuthCreds) {
_ocWizard->back();
}
_ocWizard->displayError(errorMsg, _ocWizard->currentId() == WizardCommon::Page_ServerSetup && checkDowngradeAdvised(reply));

View File

@@ -31,70 +31,6 @@
</property>
<item row="0" column="0">
<widget class="QStackedWidget" name="stack">
<property name="palette">
<palette>
<active>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>252</red>
<green>252</green>
<blue>252</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>252</red>
<green>252</green>
<blue>252</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="lineWidth">
<number>0</number>
</property>

View File

@@ -180,11 +180,11 @@ Q_LOGGING_CATEGORY(lcPublicLink, "nextcloud.gui.socketapi.publiclink", QtInfoMsg
void SocketListener::sendMessage(const QString &message, bool doWait) const
{
if (!socket) {
qCInfo(lcSocketApi) << "Not sending message to dead socket:" << message;
qCWarning(lcSocketApi) << "Not sending message to dead socket:" << message;
return;
}
qCInfo(lcSocketApi) << "Sending SocketAPI message -->" << message << "to" << socket;
qCDebug(lcSocketApi) << "Sending SocketAPI message -->" << message << "to" << socket;
QString localMessage = message;
if (!localMessage.endsWith(QLatin1Char('\n'))) {
localMessage.append(QLatin1Char('\n'));
@@ -313,6 +313,7 @@ void SocketApi::slotNewConnection()
foreach (Folder *f, FolderMan::instance()->map()) {
if (f->canSync()) {
QString message = buildRegisterPathMessage(removeTrailingSlash(f->path()));
qCInfo(lcSocketApi) << "Trying to send SocketAPI Register Path Message -->" << message << "to" << listener.socket;
listener.sendMessage(message);
}
}
@@ -417,6 +418,7 @@ void SocketApi::slotRegisterPath(const QString &alias)
if (f) {
QString message = buildRegisterPathMessage(removeTrailingSlash(f->path()));
foreach (auto &listener, _listeners) {
qCInfo(lcSocketApi) << "Trying to send SocketAPI Register Path Message -->" << message << "to" << listener.socket;
listener.sendMessage(message);
}
}

View File

@@ -48,6 +48,8 @@ void ServerNotificationHandler::slotFetchNotifications()
this, &ServerNotificationHandler::slotNotificationsReceived);
QObject::connect(_notificationJob.data(), &JsonApiJob::etagResponseHeaderReceived,
this, &ServerNotificationHandler::slotEtagResponseHeaderReceived);
QObject::connect(_notificationJob.data(), &JsonApiJob::allowDesktopNotificationsChanged,
this, &ServerNotificationHandler::slotAllowDesktopNotificationsChanged);
_notificationJob->setProperty(propertyAccountStateC, QVariant::fromValue<AccountState *>(_accountState));
_notificationJob->addRawHeader("If-None-Match", _accountState->notificationsEtagResponseHeader());
_notificationJob->start();
@@ -62,6 +64,14 @@ void ServerNotificationHandler::slotEtagResponseHeaderReceived(const QByteArray
}
}
void ServerNotificationHandler::slotAllowDesktopNotificationsChanged(bool isAllowed)
{
auto *account = qvariant_cast<AccountState *>(sender()->property(propertyAccountStateC));
if (account != nullptr) {
account->setDesktopNotificationsAllowed(isAllowed);
}
}
void ServerNotificationHandler::slotIconDownloaded(QByteArray iconData)
{
iconCache.insert(sender()->property("activityId").toInt(),iconData);

View File

@@ -26,6 +26,7 @@ private slots:
void slotNotificationsReceived(const QJsonDocument &json, int statusCode);
void slotEtagResponseHeaderReceived(const QByteArray &value, int statusCode);
void slotIconDownloaded(QByteArray iconData);
void slotAllowDesktopNotificationsChanged(bool isAllowed);
private:
QPointer<JsonApiJob> _notificationJob;

View File

@@ -35,7 +35,7 @@ MenuItem {
anchors.fill: parent
hoverEnabled: true
onContainsMouseChanged: {
accountStateIndicatorBackground.color = (containsMouse ? "#f6f6f6" : "white")
accountStatusIndicatorBackground.color = (containsMouse ? "#f6f6f6" : "white")
}
onClicked: {
if (!isCurrentUser) {
@@ -71,8 +71,8 @@ MenuItem {
Layout.preferredHeight: (userLineLayout.height -16)
Layout.preferredWidth: (userLineLayout.height -16)
Rectangle {
id: accountStateIndicatorBackground
width: accountStateIndicator.sourceSize.width + 2
id: accountStatusIndicatorBackground
width: accountStatusIndicator.sourceSize.width + 2
height: width
anchors.bottom: accountAvatar.bottom
anchors.right: accountAvatar.right
@@ -80,18 +80,16 @@ MenuItem {
radius: width*0.5
}
Image {
id: accountStateIndicator
source: model.isConnected
? Style.stateOnlineImageSource
: Style.stateOfflineImageSource
id: accountStatusIndicator
source: model.statusIcon
cache: false
x: accountStateIndicatorBackground.x + 1
y: accountStateIndicatorBackground.y + 1
x: accountStatusIndicatorBackground.x + 1
y: accountStatusIndicatorBackground.y + 1
sourceSize.width: Style.accountAvatarStateIndicatorSize
sourceSize.height: Style.accountAvatarStateIndicatorSize
Accessible.role: Accessible.Indicator
Accessible.name: model.isConnected ? qsTr("Account connected") : qsTr("Account not connected")
Accessible.name: model.isStatusOnline ? qsTr("Current user status is online") : qsTr("Current user status is do not disturb")
}
}
@@ -109,6 +107,14 @@ MenuItem {
font.pixelSize: 12
font.bold: true
}
Label {
id: userStatusMessage
width: 128
text: statusMessage
elide: Text.ElideRight
color: "black"
font.pixelSize: 10
}
Label {
id: accountServer
width: 128
@@ -223,13 +229,4 @@ MenuItem {
}
}
}
Connections {
target: UserModel
onRefreshCurrentUserGui: {
accountStateIndicator.source = model.isConnected
? Style.stateOnlineImageSource
: Style.stateOfflineImageSource
}
}
} // MenuItem userLine

View File

@@ -53,6 +53,7 @@ User::User(AccountStatePtr &account, const bool &isCurrent, QObject *parent)
connect(this, &User::guiLog, Logger::instance(), &Logger::guiLog);
connect(_account->account().data(), &Account::accountChangedAvatar, this, &User::avatarChanged);
connect(_account.data(), &AccountState::statusChanged, this, &User::statusChanged);
connect(_activityModel, &ActivityListModel::sendNotificationRequest, this, &User::slotSendNotificationRequest);
}
@@ -87,7 +88,7 @@ void User::slotBuildNotificationDisplay(const ActivityList &list)
// Assemble a tray notification for the NEW notification
ConfigFile cfg;
if (cfg.optionalServerNotifications()) {
if (cfg.optionalServerNotifications() && isDesktopNotificationsAllowed()) {
if (AccountManager::instance()->accounts().count() == 1) {
emit guiLog(activity._subject, "");
} else {
@@ -185,6 +186,8 @@ void User::slotRefreshImmediately() {
void User::slotRefresh()
{
slotRefreshUserStatus();
if (checkPushNotificationsAreReady()) {
// we are relying on WebSocket push notifications - ignore refresh attempts from UI
_timeSinceLastCheck[_account.data()].invalidate();
@@ -216,6 +219,14 @@ void User::slotRefreshActivities()
_activityModel->slotRefreshActivity();
}
void User::slotRefreshUserStatus()
{
// TODO: check for _account->account()->capabilities().userStatus()
if (_account.data() && _account.data()->isConnected()) {
_account.data()->fetchUserStatus();
}
}
void User::slotRefreshNotifications()
{
// start a server notification handler if no notification requests
@@ -413,19 +424,15 @@ void User::slotAddError(const QString &folderAlias, const QString &message, Erro
}
}
bool User::isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const
bool User::isActivityOfCurrentAccount(const Folder *folder) const
{
// Ignore activity from a different account
if (folder->accountState() != _account.data()) {
return false;
}
return folder->accountState() == _account.data();
}
bool User::isUnsolvableConflict(const SyncFileItemPtr &item) const
{
// We just care about conflict issues that we are able to resolve
if (item->_status == SyncFileItem::Conflict && !Utility::isConflictFile(item->_file)) {
return false;
}
return true;
return item->_status == SyncFileItem::Conflict && !Utility::isConflictFile(item->_file);
}
void User::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item)
@@ -435,56 +442,62 @@ void User::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item)
if (!folderInstance)
return;
if (isValueableActivity(folderInstance, item)) {
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in " << item->_errorString;
if (!isActivityOfCurrentAccount(folderInstance)) {
return;
}
Activity activity;
activity._type = Activity::SyncFileItemType; //client activity
activity._status = item->_status;
activity._dateTime = QDateTime::currentDateTime();
activity._message = item->_originalFile;
activity._link = folderInstance->accountState()->account()->url();
activity._accName = folderInstance->accountState()->account()->displayName();
activity._file = item->_file;
activity._folder = folder;
activity._fileAction = "";
if (isUnsolvableConflict(item)) {
return;
}
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
activity._fileAction = "file_deleted";
} else if (item->_instruction == CSYNC_INSTRUCTION_NEW) {
activity._fileAction = "file_created";
} else if (item->_instruction == CSYNC_INSTRUCTION_RENAME) {
activity._fileAction = "file_renamed";
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in " << item->_errorString;
Activity activity;
activity._type = Activity::SyncFileItemType; //client activity
activity._status = item->_status;
activity._dateTime = QDateTime::currentDateTime();
activity._message = item->_originalFile;
activity._link = folderInstance->accountState()->account()->url();
activity._accName = folderInstance->accountState()->account()->displayName();
activity._file = item->_file;
activity._folder = folder;
activity._fileAction = "";
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
activity._fileAction = "file_deleted";
} else if (item->_instruction == CSYNC_INSTRUCTION_NEW) {
activity._fileAction = "file_created";
} else if (item->_instruction == CSYNC_INSTRUCTION_RENAME) {
activity._fileAction = "file_renamed";
} else {
activity._fileAction = "file_changed";
}
if (item->_status == SyncFileItem::NoStatus || item->_status == SyncFileItem::Success) {
qCWarning(lcActivity) << "Item " << item->_file << " retrieved successfully.";
if (item->_direction != SyncFileItem::Up) {
activity._message = tr("Synced %1").arg(item->_originalFile);
} else if (activity._fileAction == "file_renamed") {
activity._message = tr("You renamed %1").arg(item->_originalFile);
} else if (activity._fileAction == "file_deleted") {
activity._message = tr("You deleted %1").arg(item->_originalFile);
} else if (activity._fileAction == "file_created") {
activity._message = tr("You created %1").arg(item->_originalFile);
} else {
activity._fileAction = "file_changed";
activity._message = tr("You changed %1").arg(item->_originalFile);
}
if (item->_status == SyncFileItem::NoStatus || item->_status == SyncFileItem::Success) {
qCWarning(lcActivity) << "Item " << item->_file << " retrieved successfully.";
_activityModel->addSyncFileItemToActivityList(activity);
} else {
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in error " << item->_errorString;
activity._subject = item->_errorString;
if (item->_direction != SyncFileItem::Up) {
activity._message = tr("Synced %1").arg(item->_originalFile);
} else if (activity._fileAction == "file_renamed") {
activity._message = tr("You renamed %1").arg(item->_originalFile);
} else if (activity._fileAction == "file_deleted") {
activity._message = tr("You deleted %1").arg(item->_originalFile);
} else if (activity._fileAction == "file_created") {
activity._message = tr("You created %1").arg(item->_originalFile);
} else {
activity._message = tr("You changed %1").arg(item->_originalFile);
}
_activityModel->addSyncFileItemToActivityList(activity);
if (item->_status == SyncFileItem::Status::FileIgnored) {
_activityModel->addIgnoredFileToList(activity);
} else {
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in error " << item->_errorString;
activity._subject = item->_errorString;
if (item->_status == SyncFileItem::Status::FileIgnored) {
_activityModel->addIgnoredFileToList(activity);
} else {
// add 'protocol error' to activity list
_activityModel->addErrorToActivityList(activity);
}
// add 'protocol error' to activity list
_activityModel->addErrorToActivityList(activity);
}
}
}
@@ -555,6 +568,21 @@ QString User::server(bool shortened) const
return serverUrl;
}
UserStatus::Status User::status() const
{
return _account->status();
}
QString User::statusMessage() const
{
return _account->statusMessage();
}
QUrl User::statusIcon() const
{
return _account->statusIcon();
}
QImage User::avatar() const
{
return AvatarJob::makeCircularAvatar(_account->account()->avatar());
@@ -604,6 +632,12 @@ bool User::isConnected() const
return (_account->connectionStatus() == AccountState::ConnectionStatus::Connected);
}
bool User::isDesktopNotificationsAllowed() const
{
return _account.data()->isDesktopNotificationsAllowed();
}
void User::removeAccount() const
{
AccountManager::instance()->deleteAccount(_account.data());
@@ -665,6 +699,16 @@ Q_INVOKABLE bool UserModel::isUserConnected(const int &id)
return _users[id]->isConnected();
}
Q_INVOKABLE QUrl UserModel::statusIcon(int id)
{
if (id < 0 || id >= _users.size()) {
return {};
}
return _users[id]->statusIcon();
}
QImage UserModel::avatarById(const int &id)
{
if (id < 0 || id >= _users.size())
@@ -701,6 +745,11 @@ void UserModel::addUser(AccountStatePtr &user, const bool &isCurrent)
emit dataChanged(index(row, 0), index(row, 0), {UserModel::AvatarRole});
});
connect(u, &User::statusChanged, this, [this, row] {
emit dataChanged(index(row, 0), index(row, 0), {UserModel::StatusIconRole,
UserModel::StatusMessageRole});
});
_users << u;
if (isCurrent) {
_currentUserId = _users.indexOf(_users.last());
@@ -839,6 +888,10 @@ QVariant UserModel::data(const QModelIndex &index, int role) const
return _users[index.row()]->name();
} else if (role == ServerRole) {
return _users[index.row()]->server();
} else if (role == StatusIconRole) {
return _users[index.row()]->statusIcon();
} else if (role == StatusMessageRole) {
return _users[index.row()]->statusMessage();
} else if (role == AvatarRole) {
return _users[index.row()]->avatarUrl();
} else if (role == IsCurrentUserRole) {
@@ -856,6 +909,8 @@ QHash<int, QByteArray> UserModel::roleNames() const
QHash<int, QByteArray> roles;
roles[NameRole] = "name";
roles[ServerRole] = "server";
roles[StatusIconRole] = "statusIcon";
roles[StatusMessageRole] = "statusMessage";
roles[AvatarRole] = "avatar";
roles[IsCurrentUserRole] = "isCurrentUser";
roles[IsConnectedRole] = "isConnected";

View File

@@ -19,6 +19,8 @@ class User : public QObject
Q_OBJECT
Q_PROPERTY(QString name READ name NOTIFY nameChanged)
Q_PROPERTY(QString server READ server CONSTANT)
Q_PROPERTY(QUrl statusIcon READ statusIcon NOTIFY statusChanged)
Q_PROPERTY(QString statusMessage READ statusMessage NOTIFY statusChanged)
Q_PROPERTY(bool hasLocalFolder READ hasLocalFolder NOTIFY hasLocalFolderChanged)
Q_PROPERTY(bool serverHasTalk READ serverHasTalk NOTIFY serverHasTalkChanged)
Q_PROPERTY(QString avatar READ avatarUrl NOTIFY avatarChanged)
@@ -45,6 +47,10 @@ public:
void logout() const;
void removeAccount() const;
QString avatarUrl() const;
bool isDesktopNotificationsAllowed() const;
UserStatus::Status status() const;
QString statusMessage() const;
QUrl statusIcon() const;
signals:
void guiLog(const QString &, const QString &);
@@ -53,6 +59,7 @@ signals:
void serverHasTalkChanged();
void avatarChanged();
void accountStateChanged(int state);
void statusChanged();
public slots:
void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item);
@@ -67,6 +74,7 @@ public slots:
void slotRefreshNotifications();
void slotRefreshActivities();
void slotRefresh();
void slotRefreshUserStatus();
void slotRefreshImmediately();
void setNotificationRefreshInterval(std::chrono::milliseconds interval);
void slotRebuildNavigationAppList();
@@ -80,7 +88,8 @@ private:
void connectPushNotifications() const;
bool checkPushNotificationsAreReady() const;
bool isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const;
bool isActivityOfCurrentAccount(const Folder *folder) const;
bool isUnsolvableConflict(const SyncFileItemPtr &item) const;
private:
AccountStatePtr _account;
@@ -131,6 +140,7 @@ public:
Q_INVOKABLE bool currentUserHasLocalFolder();
int currentUserId() const;
Q_INVOKABLE bool isUserConnected(const int &id);
Q_INVOKABLE QUrl statusIcon(int id);
Q_INVOKABLE void switchCurrentUser(const int &id);
Q_INVOKABLE void login(const int &id);
Q_INVOKABLE void logout(const int &id);
@@ -141,6 +151,8 @@ public:
enum UserRoles {
NameRole = Qt::UserRole + 1,
ServerRole,
StatusIconRole,
StatusMessageRole,
AvatarRole,
IsCurrentUserRole,
IsConnectedRole,

View File

@@ -35,8 +35,8 @@ Window {
}
onVisibleChanged: {
currentAccountStateIndicator.source = ""
currentAccountStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId)
folderStateIndicator.source = ""
folderStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId)
? Style.stateOnlineImageSource
: Style.stateOfflineImageSource
@@ -49,8 +49,8 @@ Window {
Connections {
target: UserModel
onRefreshCurrentUserGui: {
currentAccountStateIndicator.source = ""
currentAccountStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId)
folderStateIndicator.source = ""
folderStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId)
? Style.stateOnlineImageSource
: Style.stateOfflineImageSource
}
@@ -328,7 +328,7 @@ Window {
Accessible.name: qsTr("Current user avatar")
Rectangle {
id: currentAccountStateIndicatorBackground
id: currentAccountStatusIndicatorBackground
width: Style.accountAvatarStateIndicatorSize + 2
height: width
anchors.bottom: currentAccountAvatar.bottom
@@ -348,18 +348,16 @@ Window {
}
Image {
id: currentAccountStateIndicator
source: UserModel.isUserConnected(UserModel.currentUserId)
? Style.stateOnlineImageSource
: Style.stateOfflineImageSource
id: currentAccountStatusIndicator
source: UserModel.currentUser.statusIcon
cache: false
x: currentAccountStateIndicatorBackground.x + 1
y: currentAccountStateIndicatorBackground.y + 1
x: currentAccountStatusIndicatorBackground.x + 1
y: currentAccountStatusIndicatorBackground.y + 1
sourceSize.width: Style.accountAvatarStateIndicatorSize
sourceSize.height: Style.accountAvatarStateIndicatorSize
Accessible.role: Accessible.Indicator
Accessible.name: UserModel.isUserConnected(UserModel.currentUserId()) ? qsTr("Connected") : qsTr("Disconnected")
Accessible.name: UserModel.isUserStatusOnline(UserModel.currentUserId()) ? qsTr("Current user status is online") : qsTr("Current user status is do not disturb")
}
}
@@ -379,9 +377,9 @@ Window {
font.bold: true
}
Label {
id: currentAccountServer
id: currentUserStatus
width: Style.currentAccountLabelWidth
text: UserModel.currentUser.server
text: UserModel.currentUser.statusMessage
elide: Text.ElideRight
color: Style.ncTextColor
font.pixelSize: Style.subLinePixelSize
@@ -405,31 +403,57 @@ Window {
}
}
// Filler between account dropdown and header app buttons
Item {
id: trayWindowHeaderSpacer
Layout.fillWidth: true
}
RowLayout {
id: openLocalFolderRowLayout
spacing: 0
Layout.preferredWidth: Style.trayWindowHeaderHeight
Layout.preferredHeight: Style.trayWindowHeaderHeight
HeaderButton {
id: openLocalFolderButton
visible: UserModel.currentUser.hasLocalFolder
icon.source: "qrc:///client/theme/white/folder.svg"
onClicked: UserModel.openCurrentAccountLocalFolder()
Rectangle {
id: folderStateIndicatorBackground
width: Style.folderStateIndicatorSize
height: width
anchors.top: openLocalFolderButton.verticalCenter
anchors.left: openLocalFolderButton.horizontalCenter
color: Style.ncBlue
radius: width*0.5
z: 1
}
}
HeaderButton {
id: openLocalFolderButton
visible: UserModel.currentUser.hasLocalFolder
icon.source: "qrc:///client/theme/white/folder.svg"
onClicked: UserModel.openCurrentAccountLocalFolder()
Image {
id: folderStateIndicator
source: UserModel.isUserConnected(UserModel.currentUserId)
? Style.stateOnlineImageSource
: Style.stateOfflineImageSource
cache: false
anchors.top: openLocalFolderButton.verticalCenter
anchors.left: openLocalFolderButton.horizontalCenter
sourceSize.width: Style.folderStateIndicatorSize
sourceSize.height: Style.folderStateIndicatorSize
Accessible.role: Accessible.Indicator
Accessible.name: UserModel.isUserConnected(UserModel.currentUserId()) ? qsTr("Connected") : qsTr("Disconnected")
}
Accessible.role: Accessible.Button
Accessible.name: qsTr("Open local folder of current account")
Accessible.onPressAction: openLocalFolderButton.clicked()
}
HeaderButton {
id: trayWindowTalkButton
visible: UserModel.currentUser.serverHasTalk
icon.source: "qrc:///client/theme/white/talk-app.svg"
onClicked: UserModel.openCurrentAccountTalk()
Accessible.role: Accessible.Button
Accessible.name: qsTr("Open Nextcloud Talk in browser")
Accessible.onPressAction: trayWindowTalkButton.clicked()
@@ -438,6 +462,7 @@ Window {
HeaderButton {
id: trayWindowAppsButton
icon.source: "qrc:///client/theme/white/more-apps.svg"
onClicked: {
if(appsMenu.count <= 0) {
UserModel.openCurrentAccountServer()

View File

@@ -149,11 +149,11 @@ QString OCUpdater::statusString() const
case DownloadComplete:
return tr("%1 available. Restart application to start the update.").arg(updateVersion);
case DownloadFailed:
return tr("Could not download update. Please click <a href='%1'>here</a> to download the update manually.").arg(_updateInfo.web());
return tr("Could not download update. Please open %1 to download the update manually.").arg(_updateInfo.web());
case DownloadTimedOut:
return tr("Could not check for new updates.");
case UpdateOnlyAvailableThroughSystem:
return tr("New %1 is available. Please click <a href='%2'>here</a> to download the update.").arg(updateVersion, _updateInfo.web());
return tr("New %1 is available. Please open %2 to download the update.").arg(updateVersion, _updateInfo.web());
case CheckingServer:
return tr("Checking update server …");
case Unknown:

View File

@@ -28,6 +28,8 @@
#include "config.h"
#include "configfile.h"
#include <QSysInfo>
namespace OCC {
Q_LOGGING_CATEGORY(lcUpdater, "nextcloud.gui.updater", QtInfoMsg)
@@ -88,6 +90,9 @@ QUrlQuery Updater::getQueryParams()
}
query.addQueryItem(QStringLiteral("version"), clientVersion());
query.addQueryItem(QStringLiteral("platform"), platform);
query.addQueryItem(QStringLiteral("osRelease"), QSysInfo::productType());
query.addQueryItem(QStringLiteral("osVersion"), QSysInfo::productVersion());
query.addQueryItem(QStringLiteral("kernelVersion"), QSysInfo::kernelVersion());
query.addQueryItem(QStringLiteral("oem"), theme->appName());
query.addQueryItem(QStringLiteral("buildArch"), QSysInfo::buildCpuArchitecture());
query.addQueryItem(QStringLiteral("currentArch"), QSysInfo::currentCpuArchitecture());

126
src/gui/userstatus.cpp Normal file
View File

@@ -0,0 +1,126 @@
/*
* Copyright (C) by Camila <hello@camila.codes>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "userstatus.h"
#include "account.h"
#include "accountstate.h"
#include "networkjobs.h"
#include "folderman.h"
#include "creds/abstractcredentials.h"
#include "theme.h"
#include <QTimer>
#include <QJsonDocument>
#include <QJsonObject>
namespace OCC {
Q_LOGGING_CATEGORY(lcUserStatus, "nextcloud.gui.userstatus", QtInfoMsg)
UserStatus::UserStatus(QObject *parent)
: QObject(parent)
{
}
UserStatus::Status UserStatus::stringToEnum(const QString &status) const
{
// it needs to match the Status enum
const QHash<QString, Status> preDefinedStatus{{"online", Status::Online},
{"dnd", Status::DoNotDisturb}, //DoNotDisturb
{"away", Status::Away},
{"offline", Status::Offline},
{"invisible", Status::Invisible}};
// api should return invisible, dnd,... toLower() it is to make sure
// it matches _preDefinedStatus, otherwise the default is online (0)
const auto statusKey = status.isEmpty() ? QStringLiteral("online") : status.toLower();
return preDefinedStatus.value(statusKey, Status::Online);
}
QString UserStatus::enumToString(Status status) const
{
switch (status) {
case Status::Away:
return tr("Away");
case Status::DoNotDisturb:
return tr("Do not disturb");
case Status::Invisible:
case Status::Offline:
return tr("Offline");
default:
return tr("Online");
}
}
void UserStatus::fetchUserStatus(AccountPtr account)
{
if (_job) {
_job->deleteLater();
}
_job = new JsonApiJob(account, QStringLiteral("/ocs/v2.php/apps/user_status/api/v1/user_status"), this);
connect(_job.data(), &JsonApiJob::jsonReceived, this, &UserStatus::slotFetchUserStatusFinished);
_job->start();
}
void UserStatus::slotFetchUserStatusFinished(const QJsonDocument &json, int statusCode)
{
const QJsonObject defaultValues {
{"icon", ""},
{"message", ""},
{"status", "online"}
};
if (statusCode != 200) {
qCInfo(lcUserStatus) << "Slot fetch UserStatus finished with status code" << statusCode;
qCInfo(lcUserStatus) << "Using then default values as if user has not set any status" << defaultValues;
}
const auto retrievedData = json.object().value("ocs").toObject().value("data").toObject(defaultValues);
const auto emoji = retrievedData.value("icon").toString();
const auto message = retrievedData.value("message").toString();
_status = stringToEnum(retrievedData.value("status").toString());
const auto visibleStatusText = message.isEmpty() ? enumToString(_status) : message;
_message = QString("%1 %2").arg(emoji, visibleStatusText);
emit fetchUserStatusFinished();
}
UserStatus::Status UserStatus::status() const
{
return _status;
}
QString UserStatus::message() const
{
return _message.trimmed();
}
QUrl UserStatus::icon() const
{
switch (_status) {
case Status::Away:
return Theme::instance()->statusAwayImageSource();
case Status::DoNotDisturb:
return Theme::instance()->statusDoNotDisturbImageSource();
case Status::Invisible:
case Status::Offline:
return Theme::instance()->statusInvisibleImageSource();
default:
return Theme::instance()->statusOnlineImageSource();
}
}
} // namespace OCC

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