Merge branch 'develop' into release/1.5.11

This commit is contained in:
Julian Raufelder 2021-01-26 09:05:07 +01:00
commit 4c3ffbc649
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
102 changed files with 1395 additions and 1148 deletions

View File

@ -4,12 +4,12 @@
- Ensure you're running the latest version of Cryptomator.
- Ensure the bug is related to the Android version of Cryptomator. Bugs concerning the Cryptomator desktop application and iOS app can be reported on the [Cryptomator issues list](https://github.com/cryptomator/cryptomator/issues) and [Cryptomator for iOS issues list](https://github.com/cryptomator/cryptomator-ios/issues) respectively.
- Ensure the bug was not [already reported](https://github.com/cryptomator/cryptomator-android/issues). You can also check out our [FAQ](https://community.cryptomator.org/c/faq).
- If you're unable to find an open issue addressing the problem, [submit a new one](https://github.com/cryptomator/cryptomator-android/issues/new).
- Ensure the bug was not [already reported](https://github.com/cryptomator/android/issues). You can also check out our [FAQ](https://community.cryptomator.org/c/faq).
- If you're unable to find an open issue addressing the problem, [submit a new one](https://github.com/cryptomator/android/issues/new).
## Code of Conduct
Help us keep Cryptomator open and inclusive. Please read and follow our [Code of Conduct](https://github.com/cryptomator/cryptomator-android/blob/master/CODE_OF_CONDUCT.md).
Help us keep Cryptomator open and inclusive. Please read and follow our [Code of Conduct](https://github.com/cryptomator/android/blob/develop/.github/CODE_OF_CONDUCT.md).
## Above all, thank you for your contributions

View File

@ -5,18 +5,12 @@ labels: type:bug
---
<!--
⚠️⚠️⚠️ READ CAREFULLY ⚠️⚠️⚠️
Please make sure to:
- Comply with our code of conduct: https://github.com/cryptomator/android/blob/develop/.github/CODE_OF_CONDUCT.md
- Search for existing similar issues first: https://github.com/cryptomator/android/issues?q=
Do you want to ask a QUESTION? Are you looking for SUPPORT?
We're happy to help you via our support channels! Please read: https://github.com/cryptomator/cryptomator-android/blob/master/SUPPORT.md
By filing an issue, you are expected to comply with our code of conduct: https://github.com/cryptomator/cryptomator-android/blob/master/CODE_OF_CONDUCT.md
Of course, we also expect you to search for existing similar issues first! ;) https://github.com/cryptomator/cryptomator/issues?q=
⚠️ IMPORTANT: If you don't stick to this template, the issue will get closed. To proof that you read this, please remove the X from the following line:
⚠️ IMPORTANT: If you don't stick to this template, the issue will get closed.
-->
<!-- oooXooo -->
### Description

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Help & Support
url: https://community.cryptomator.org/
about: You will find answers in our community forum
- name: User Manual
url: https://docs.cryptomator.org/
about: Read the Cryptomator documentation here

View File

@ -5,16 +5,12 @@ labels: type:feature-request
---
<!--
Do you want to ask a QUESTION? Are you looking for SUPPORT?
We're happy to help you via our support channels! Please read: https://github.com/cryptomator/cryptomator-android/blob/master/SUPPORT.md
By filing a feature request, you are expected to comply with our code of conduct: https://github.com/cryptomator/cryptomator-android/blob/master/CODE_OF_CONDUCT.md
Of course, we also expect you to search for existing similar feature requests first! ;)
Please make sure to:
- Comply with our code of conduct: https://github.com/cryptomator/android/blob/develop/.github/CODE_OF_CONDUCT.md
- Search for existing similar issues first: https://github.com/cryptomator/android/issues?q=
-->
### Summary
[One paragraph explanation of the feature.]
@ -29,4 +25,4 @@ Of course, we also expect you to search for existing similar feature requests fi
### Additional Context
[Add any other context or screenshots about the feature request here.]
[Add any other context or screenshots about the feature request here.]

124
.github/SECURITY.md vendored Normal file
View File

@ -0,0 +1,124 @@
# Security Policy
## Reporting a Vulnerability
For reporting security-related vulnerabilities or exploits that [haven't been reported yet](https://github.com/cryptomator/android/labels/type%3Asecurity-issue), contact us at: security@cryptomator.org
<details>
<summary>PGP Key</summary>
```
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: GPGTools - https://gpgtools.org
mQINBFbgeicBEADM9AcU6DTgM5KZnBaJc6x9DBLr+TCMHntTt7YM9GLTlO2Z43Jt
oYoyqdRWAY28veqpLEFgRvvVD3fdBj/KUOxF1cr2JsErwXqbjwaLq0o/0KIXz7UK
a6pQSemZKfpOtJrfacofOTwvG6AuG9uakBYNMyxuojyOkoh3xsYS1KZ7TwPgCdET
t8/zva41Pa5kh5+GeSZJdCuygG6ynPBJEpmK5V7Qizvics5fziXecF+QaFZijafv
YahfxokvF9pXCQTmV4m57NQma9uK0w83U9nJCPjEd+x3wK0Hxrc1ojy8ZFTA1YND
AQg/MTABgHbQQkXDQhjS/TloOObqtbMBqNSbcSXpaR4teaCWKBl1MSq00nJLj8db
vPJGqfg7UbXhlALggp029/kskYlR5SmbxWquLbl0Xre3fDHuHEiWcJL6MS3454Wt
Mno13/4UhOlRFh5g0pLmPz7seOTJjDqc9abn/RXOLq0+3qX0gC0bDm5aCE5dQ2MV
FMbrrlw/dZESNLZvtB3gOsramSry1R3HVZ0QJ2vMaF2cxewebqcYbuecUNj6bxpv
5LEhEmqz6dG1meLLWDsvQLPEUWEIJnfpBiDSm342yxJq4pXnVF+aqAQsCL3FpmvZ
2j0FgFOs7iXOcFUJIiR0xUmWPk1NWYcUowqmRW8pMM9nFUzFF99iggPznwARAQAB
tC1DcnlwdG9tYXRvciBTdXBwb3J0IDxzdXBwb3J0QGNyeXB0b21hdG9yLm9yZz6J
AkAEEwEKACoCGwMFCQcrKAAFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AFAleu2cQC
GQEACgkQI7Xb75TU2B3+7A/7BKRWdo5/moCCEbBzYQ7vRMLFdwmjFFlSZ7aGC0fP
YHdeUwxPbO0cATwmNpGMma7rBn1FDg3Vto6/wottGxm+XIRwlyY84CD1VZAihZ/e
WvjOO28/7VgRy6PGKzlhpDSoT8GwFOgO69e7bEff1Zj562RZe7nXc4tDivILMB++
KgmmSgtddygmNQCS3RD3KssGo+l+cSjsg09F5WAJ6nQe8Jq2hICq+o/P6UXPI5lX
bhvWYDn4/8sRHsIlGpQYYDDe0fz7IQKuSLAHpF5upNDxj6dYb05F8PPVrk6MW6nL
/kf1fZ27DlLN5/NFvhhBRuwxxoAFqPS7Iel3z7L0JkRUYmGLVB5m9Cqiw6FK8JRv
OtvakdDoKb5lVAoN5NeBfNBSqEcXVF/EdfTfIyyo7hZRA6xFMEVbmYbzt0sj0djV
ZOey2TOFrTCpkHfUUDgKvk5sn+F3u8mmPIbqquEzlFJSFjcyiYYDv22rg1In+zKV
Xmw4BFZRDS6IVSQRGlskRGJBixCaGyDYxHXXT2cg4Rk9uiCX11+0E9qlAsg6xPe6
rnaYDT8dU0AFyVpDpshflXH3kVQSpiqZS3jkAk1/54ODO8pE80Zrnd5m5AMuNcmX
+9MkZKE+h0882UskDs1dyt26GU2hoy4lAeRUaut7zIK/WO6nnuLaTvGWT95RDz+q
kD2JAiIEEwEKAAwFAleu2iYFgweGH4AACgkQZnuGbqgkCgnmCA//U22uhyEC/Tp3
Cbt5lctQmqbgMbjRBaHQyW52tPFMaq8vXMbo/5TTtVC6xsp2PJT84cxAd8KX8hWq
cPtF4wWCJGng/AzyxQ5dWfGvA/ll32ygjtJN3P/AvA9KlhG+6XYmS8cPkBkJBi6B
2yCdZT1cXc/TPAFzjgAwz7K9g3awG0OeOc/CXymH0DD/snkiwKQoucStolYywZGc
GszjMQgeT4zOc1wtEz24uL3dMNDlDcQMAh56YvK2oB0iMYmAFyX/IS+f2bM9paXi
HX+mg/z53iwgf5ZXbslNDbMTJ5GNksjEGjCFfDHAdNdgT+lcW4l2U7q4PYUaN4LA
DE9j2OlOlQ9qjucOgoCStirnTP7XHd4p31lgdz8+THOQowB5Ji95OkiNQAFCfxBt
mcA/bWnJZQDm7L8RVzHovBpAaK6vUjxEvR+DXdESSzyZwkpsZwGZcyqGRT26R1/L
JE5WvjKufNc5v3Cat320MjyrLZwVGRgvEpDMoCw3nTWl9AtOj5vgaakEWr7AnqET
xk7UFbYmdTlQqkWuLKubz9Rx/FbrBmvd6vwTHy1Dfl6QyMWNCClatgN00Hxped/6
CErg+R/RXd8apGxnOuWDqoujPn5LOHzgJolp1Ox16nTiZe2G+LbDr3hqRFi1wW6w
ioMB4KpkdA03uyxJSWmDEMiR1l3Oxom0KUNyeXB0b21hdG9yIFByZXNzIDxwcmVz
c0BjcnlwdG9tYXRvci5vcmc+iQI9BBMBCgAnBQJXrtnDAhsDBQkHKygABQsJCAcD
BRUKCQgLBRYCAwEAAh4BAheAAAoJECO12++U1NgdQYMQAKCIzNJF8rURQcFLSv3J
sPBjRy2HCzCWm21MuhU+bsaZx7U9M9dgEjzLfxN9s19VsBH3WKLgok2FgiYSGka3
6Oy/P8VFLFmHs7dS9i2fro2eF7i4zj/ZD/9t0jM4ZIgLpbzr5sTBld292nsfXGob
xOJeOx3oWYyR2FO9VQxXjC3JvJyZkFgoy0tauS4Mvii4cF56wJGcxDTbe1s7UaRC
a/fh4zgISZSBE3rYhCawkN4mqMDM5RDjrdtjKUPWk345HcjjQ4Wos8xw4YbGbNr9
Pc7m2URYJJ0jFM4tnoRF6cmA3bT9tm8pcOFg+K/ycVrltVEy+A8Wj8UGjyP1uI1t
EqWHN3LZpIGfW0w9AGrw7OUI9czXcukfngj/DsOU3WMBDIM8pW9+zBpr75yIS6lz
C0IqksLXSqX0b/Rby4O+wb6UZ1ZFkaim2GGtAZV+nGXtdnEXSNFiP7ykzjZ02m/1
7CKyj3VmdAgT56zEIypFSfxm9gOWsJPmfhSyuE8bFyoitgNxpheZk6xZy4upVMPR
WK3hutScU0yDv2HVCiA3o3Ggy42nmz9HpGF6W2DmBx4bhMaVs6I2VFyKdQzmJD/3
FCWjwz8PiEgVGHGPnD+WdPFLhrc/44gF4h/VuLjkubtULGuTVvgjeTIJ5LR1Gmwc
YOk6eD7MAJPzJVj5/PYFtIbKiQIiBBMBCgAMBQJXrtonBYMHhh+AAAoJEGZ7hm6o
JAoJBh4P/1w88YMTKUHpFTfJEwH2hK36BZN96Bf/k+vP7n1Xxp3NheInJblHFOt/
ccsup6am+APrk8gGtlIVmtVc3nO8WMsWxfJxGDecyRsNbessnODv/llyg3tzVU/H
tLk7gLiK0TcIsOLfeNXGTxRRSKWjVFsNfuixNCzzHa7tFq6ddVn9VRZ8fqJB2p21
OogWSDqUo9q9Wfb4RkYHguDx+8Jzoo/MxR1TSt8gUO2xDvEbqgeQiMCLF8R0lO3Y
zz0FrpyOsFU1CxVp+wo55bWv1UdwgQKQt4o0m5/zDJ2RAtscXpd4YcTE+XxKeK+4
qhihhkhLGpKsxzK5m9/qwMbodHwoBCBzfalkUR9xOq9yQIeEoC8XYL62NqB3BCSU
KfWFIHxUkE9WH5zHWaV+bhrlNgk7nz3xBfPf1P2mNIc1VUHoNqOZOmWwz2VaKLSW
f3GIqx9wGythFbLdXmUoC3W//DDYgQnvImvkncMqQ5nRHPf8uHcLQK5WZyIxpgWT
eKon5G/cj0BTptcBhapMwSIyfaC5FV7so0/CkOA6R9Fyq2VpGoHy7XPhFS+6ieLi
KUWhCvbuf2deWbSaJ0peMdzy1p72UXwrsEM0M3Fz+Jd8zvCaFzf5Fx27+pAAdlfg
4bT3/2gSf7S+cU3+DnYOH0NeRt2Z2mjEKg9OwttTO/oDboQHdZlrtDRDcnlwdG9t
YXRvciBTZWN1cml0eS1UZWFtIDxzZWN1cml0eUBjcnlwdG9tYXRvci5vcmc+iQI9
BBMBCgAnBQJXrtnWAhsDBQkHKygABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJ
ECO12++U1NgddzoQAI78+Nvm6VvNuptXJjEmrpHRyKCnHF9wH5kxvF8WZCgpOkJ4
vONmyS+9ZlepnT83MpGm/MzdIMCnDJmDmqmA5ISBRcD7k9Gjzz5rPKwE2zDyo0M0
wF1L2UEUqAlcvE0e4twZcP2DGoNqdSf6IaWsXhQMb1a/rTMsoGZLuTB8kCbv6Ntl
ULahcRToTB2shsbZjzE896P6X5hDCfGWl0Jhcbf53pnXX1dOsEw3et9AGru1IUMs
UGM+wpgTwagRj+XB/WY1x9IznKtiHTq83Fvt+3bkg0+NIcV3GDqXDIUtqIwy8gDd
4KgBU+LkyxXFDa4OxLc53n6b+Iy1nDosM+SiqSzdCCgEs/dY1tQBn/7P1GT18dEe
tFgeH/c6wLvEpDIc9urAsYXf8H+1uy7glWpWTq8DE0yhCr4adjCqlIsVHQQO4UUW
NfqMGEFpJ+3HjSSwnvDGY78lLQh5d4vqWV435aNaMqZg0gJIA0FtiP1fRtmT73BG
N/tBNiBxretFR4B+x/TWqPd5iJV7/MAn/pa1WSOcaxzJrVUsjXdgLQCqcHWd4/w1
f4DU9cJjl3sxZlMdAlg8Q1bF+pmjQQ4WKZkqMtwpoUilfVXmL42ay1LBCgW68/uJ
OTyGfp8ntUsbbm5raGsny3TLqnacyG9hxcPGNTzD1+MrbUvfsc7+4U0dCZTuiQIi
BBMBCgAMBQJXrtonBYMHhh+AAAoJEGZ7hm6oJAoJ1DQP/R+1drZiZQU45ChMbfTb
XQjJRsUOGZp3PTWtx4KrVFvE8ea0PF+DZX5gLJYIU+iZmPXRpzFu6dKPbcZ7RfRt
5RRH102zDZzijt2CQd7YLO8wxUFoWX9X7DGgxXEcNjl9kFVmnyHgiTwTzuZ0Zy4y
PvoiwrhcZmXEYbOeV40gLFie6wuzz5IIcs01e30xIs+1/1gwmgI5UnG3jveUgmcj
f/lvg3POKiwrY5Uzw1FSruJx21X06wTpDcfOACID4L7aY9eg2B/qL2Xj8nuhejqG
+1AVTMk2o6pxkvevHmxYQfEpuWGCw0RCBn9ObWwz6Zn5J9pjGbMrM+b1/M2Ouv3N
cpoGgCSahKNsRMKO7RMrBG0jtLcasPSgZFYPJSZAAb+YhxKUbpPHzDIwTEjgM7CL
gKSyRTKyp5IoFK53bpXL/ZIjkAhMvyDult6+BL6vI0+h3BBA9I0FF2Qhe139xLv/
DS7aDiYAE9vGMGoeCBfxJPwUsDU3hrGe/wgL7fR6nmN7R2QffisBHKHsklORy9t3
w3YFRd5sBAxv+EOcdkgXEmqKOfVQ8KU9adQcxPDGMAK/esjVwxUxsaf2PF5noxxW
3zL2ureUO/mMoH5Cwr0BuM3HFb82t1JJd4IXlLEyNvDMFMwD2d7h37bGK7Y5hEsl
zL7Dm+wQRY8sxg4QOZHbJjQXuQINBFbgeicBEADnkxGSEL1zwACaiVqADKC6/pgO
MMWjxoENBT6r8Vnp1D5hfNDkEi9iXUpCEO6nzywBf3/4c4Yk1wBOBZ7YWyWXMf4v
2g1evxELO5z1UlAwna6HSl7G0omIBqzz1Er5IS7C9WEZM8ZggwcuswCrbxfz4+fN
t7cCL5QyOvuxez+vrn+VIgLQzKm+LV4Wc+OFbHIys+0saQUhItKO0/CsXGc8R314
jdN5UsZk/MUdPPAs+6OCr8d3PpJvR6IST76TtN8aDjSS9T6em7dwdGFEwCGww3Jc
xrAkvvUmSlscz+rnvHA5DYQGK6NXLenB40sVQVfch1r1VqwvlzA0u7OovjwM8+7u
+DaBQ0YejbdnC7yfeE91LmZkG6jRKfvTJkv18tjNsgZsVmM13xzP67fCFIB9M+lN
t9zEldGKHVwm+06FHIWJsBDRgrquNb9xd1vgHHeIbJvKf+LqZhVrbKVEneG34Km+
ndtb+mvcGc0fOoMU9lYrFaxAWl8oU9BchC9IyjcPZB445R+AhfTuoHSUViSCo6IO
TG0hQsJuNoKmDAU8l5sTsiFXuXBOo1wK8gTkRnhZHduZrZIjJXvT7efz1knLQ6eG
prZHf4CtbgHyAe2XZabetWtCsFcPbOjC7ezNK57UvVH98h2GkckxOM00BESMCTee
kYy7uG0v0rrajzHY1wARAQABiQIlBBgBCgAPBQJW4HonAhsMBQkHKygAAAoJECO1
2++U1NgdyAsQAKZUVA6pY225BASkeNiW31L7K4VeRYpAdFkiRex2zQFtj9Vovfi1
JeTs0fRm35dUsQraf1bkhsjEdPVZ3gD324/baauFO04KX+soyQvK/tUq8KO+5ALt
Ul5aAljuSwxfJWFpApv+Mbf7gOjm+77jirs7pgG/gCow/mkRlmKTwAmn2DXjkckC
2EH0mqmh5pdoNWKO7WeTFFbUmESsPcnB2FwTpEjHFvgHll+rmKpXZTgFYN4dDhhm
HsL/SCf/Nw+YIsuvErQ9TJVdJDLG8ZYatruk7dZZMPtFxvxM1Q36gDIpPEOKPkvm
dMXg6jHaIdYIaoMpzXFaXsQMdRuMtzbcA+CdwXVY55qGLtfmM/QuEiIJdDeeh7iB
+VAMyEFOOpi8IFhixaeMoZAmrKDqOkzPcMJVklLYq8N+b9p5JszYNwZEbpyWCACM
6K+iJzlWzW/OPZttGLJBgYuSYIJIuG80Cx5m5m1e5RAgQ1iT8nbfrS+gYttwP48J
V7SXQg7QugxG9l1vlK4VjnXiOFulJ7V0e/VyUBpJp3qHcCxFq3RnxVwlIqKZh+jm
Q1bk0H0Xodd27nQITfDP5ullByGW2Jrjs6SsXeR3jl9+t0XQfInU1L9d/wSOkMjL
9IMUt06lV4vB/WP2xioqLZiZ4eAi0E+lWkFxjZsgNs2xbOAYRThMB8a5
=W1Ri
-----END PGP PUBLIC KEY BLOCK-----
```
</details>

View File

View File

@ -6,20 +6,33 @@ on:
jobs:
closeTemplateViolation:
name: Close bug reports that violate the issue template
name: Validate bug report against issue template
runs-on: ubuntu-latest
if: contains(github.event.issue.labels.*.name, 'type:bug')
steps:
- if: |
contains(github.event.issue.labels.*.name, 'type:bug')
&& (
!contains(github.event.issue.body, '<!-- oooooo -->')
|| !contains(github.event.issue.body, '### Description')
)
name: Close Issue
- name: Check "Description"
if: |
!contains(github.event.issue.body, env.MUST_CONTAIN)
|| contains(toJson(github.event.issue.body), env.MUST_NOT_CONTAIN)
run: exit 1
env:
MUST_CONTAIN: '### Description'
MUST_NOT_CONTAIN: '### Description\r\n\r\n[Summarize your problem.]\r\n\r\n### System Setup'
- name: Check "Steps to Reproduce"
if: |
!contains(github.event.issue.body, env.MUST_CONTAIN)
|| contains(toJson(github.event.issue.body), env.MUST_NOT_CONTAIN)
run: exit 1
env:
MUST_CONTAIN: '### Steps to Reproduce'
MUST_NOT_CONTAIN: '### Steps to Reproduce\r\n\r\n1. [First step]\r\n2. [Second step]\r\n3. [and so on…]\r\n\r\n#### Expected Behavior'
- name: Close issue if one of the checks failed
if: ${{ failure() }}
uses: peter-evans/close-issue@v1
with:
comment: |
This bug report did ignore our issue template. 😞
Auto-closing this issue, since it is most likely not useful.
_This decision was made by a bot. If you think the bot is wrong, let us know and we'll reopen this issue._
_This decision was made by a bot. If you think the bot is wrong, let us know and we'll reopen this issue._

2
.gitignore vendored
View File

@ -1,5 +1,3 @@
secrets.properties
###IntelliJ###
*.iml

View File

@ -25,10 +25,22 @@ Cryptomator for Android is currently available in the following distribution ch
```
git submodule init && git submodule update // (not necessary if cloned using --recurse-submodules)
./gradlew assembleLicenseDebug
./gradlew assembleApkstoreDebug
```
Before connecting to Onedrive or Dropbox you have to enter valid API keys in [secrets.properties](https://github.com/cryptomator/android/blob/master/secrets.properties).
Before connecting to OneDrive or Dropbox you have to provide valid API keys using environment variables:
For build type
* **release**: `DROPBOX_API_KEY` or `ONEDRIVE_API_KEY` and `ONEDRIVE_API_REDIRCT_URI`
* **debug**: `DROPBOX_API_KEY_DEBUG` or `ONEDRIVE_API_KEY_DEBUG` and `ONEDRIVE_API_REDIRCT_URI_DEBUG`
## Contributing to Cryptomator for Android
Please read our [contribution guide](.github/CONTRIBUTING.md), if you would like to report a bug, ask a question, translate the app or help us with coding.
## Code of Conduct
Help us keep Cryptomator open and inclusive. Please read and follow our [Code of Conduct](.github/CODE_OF_CONDUCT.md).
## License

View File

@ -10,7 +10,7 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.1'
classpath 'com.android.tools.build:gradle:4.1.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
classpath 'com.fernandocejas.frodo:frodo-plugin:0.8.3'
classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.16.0'

View File

@ -1,154 +1,155 @@
allprojects {
repositories {
jcenter()
}
repositories {
jcenter()
}
}
ext {
androidBuildToolsVersion = "29.0.2"
androidMinSdkVersion = 23
androidTargetSdkVersion = 29
androidCompileSdkVersion = 29
androidBuildToolsVersion = "29.0.2"
androidMinSdkVersion = 23
androidTargetSdkVersion = 29
androidCompileSdkVersion = 29
// android and java libs
androidVersion = '4.1.1.4'
multidexVersion = '2.0.1'
javaxAnnotationVersion = '1.0'
// android and java libs
androidVersion = '4.1.1.4'
multidexVersion = '2.0.1'
javaxAnnotationVersion = '1.0'
// support lib
androidSupportAnnotationsVersion = '1.1.0'
androidSupportAppcompatVersion = '1.2.0' // check https://stackoverflow.com/questions/41025200/android-view-inflateexception-error-inflating-class-android-webkit-webview/57968071#57968071 !!!!!!
androidSupportDesignVersion = '1.2.1'
// support lib
androidSupportAnnotationsVersion = '1.1.0'
androidSupportAppcompatVersion = '1.2.0'
// check https://stackoverflow.com/questions/41025200/android-view-inflateexception-error-inflating-class-android-webkit-webview/57968071#57968071 !!!!!!
androidSupportDesignVersion = '1.2.1'
// app frameworks and utilities
// app frameworks and utilities
rxJavaVersion = '2.2.20'
rxAndroidVersion = '2.1.1'
rxBindingVersion = '2.2.0'
rxJavaVersion = '2.2.20'
rxAndroidVersion = '2.1.1'
rxBindingVersion = '2.2.0'
daggerVersion = '2.30.1'
daggerVersion = '2.31.2'
gsonVersion = '2.8.6'
gsonVersion = '2.8.6'
okHttpVersion = '4.9.0'
okHttpDigestVersion = '2.5'
okHttpVersion = '4.9.0'
okHttpDigestVersion = '2.5'
velocityVersion = '1.7'
velocityVersion = '1.7'
timberVersion = '4.7.1'
timberVersion = '4.7.1'
zxcvbnVersion = '1.3.1'
zxcvbnVersion = '1.3.3'
scaleImageViewVersion = '3.10.0'
scaleImageViewVersion = '3.10.0'
lruFileCacheVersion = '1.0'
lruFileCacheVersion = '1.0'
// KEEP IN SYNC WITH GENERATOR VERSION IN root build.gradle
greenDaoVersion = '3.3.0'
// KEEP IN SYNC WITH GENERATOR VERSION IN root build.gradle
greenDaoVersion = '3.3.0'
// cloud provider libs
// cloud provider libs
// do not update to 1.4.0 until dropping minsdk 4.x
cryptolibVersion = '1.3.0'
// do not update to 1.4.0 until minsdk is 7.x (or desugaring works better) otherwise it will crash on 6.x
cryptolibVersion = '1.3.0'
dropboxVersion = '3.1.5'
dropboxVersion = '3.1.5'
googleApiServicesVersion = 'v3-rev197-1.25.0'
googlePlayServicesVersion = '19.0.0'
googleClientVersion = '1.31.1'
googleApiServicesVersion = 'v3-rev197-1.25.0'
googlePlayServicesVersion = '19.0.0'
googleClientVersion = '1.31.2'
msgraphVersion = '2.5.0'
msaAuthVersion = '0.10.0'
msgraphVersion = '2.5.0'
msaAuthVersion = '0.10.0'
commonsCodecVersion = '1.15'
commonsCodecVersion = '1.15'
recyclerViewFastScrollVersion = '2.0.1'
// testing dependencies
// testing dependencies
jUnitVersion = '5.7.0'
jUnitVersion = '5.7.0'
jUnit4Version = '4.13.1'
assertJVersion = '1.7.1'
mockitoVersion = '3.6.28'
mockitoInlineVersion = '3.6.28'
hamcrestVersion = '1.3'
dexmakerVersion = '1.0'
espressoVersion = '3.3.0'
testingSupportLibVersion = '0.1'
runnerVersion = '1.3.0'
rulesVersion = '1.3.0'
contributionVersion = '3.3.0'
uiautomatorVersion = '2.2.0'
assertJVersion = '1.7.1'
mockitoVersion = '3.7.7'
mockitoInlineVersion = '3.7.7'
hamcrestVersion = '1.3'
dexmakerVersion = '1.0'
espressoVersion = '3.3.0'
testingSupportLibVersion = '0.1'
runnerVersion = '1.3.0'
rulesVersion = '1.3.0'
contributionVersion = '3.3.0'
uiautomatorVersion = '2.2.0'
androidxCoreVersion = '1.3.2'
androidxFragmentVersion = '1.2.5'
androidxViewpagerVersion = '1.0.0'
androidxSwiperefreshVersion = '1.1.0'
androidxPreferenceVersion = '1.0.0' // 1.1.0 and 1.1.2 does have a bug with the text size
androidxRecyclerViewVersion = '1.1.0'
androidxDocumentfileVersion = '1.0.1'
androidxCoreVersion = '1.3.2'
androidxFragmentVersion = '1.2.5'
androidxViewpagerVersion = '1.0.0'
androidxSwiperefreshVersion = '1.1.0'
androidxPreferenceVersion = '1.0.0' // 1.1.0 and 1.1.2 does have a bug with the text size
androidxRecyclerViewVersion = '1.1.0'
androidxDocumentfileVersion = '1.0.1'
androidxBiometricVersion = '1.0.1'
androidxTestCoreVersion = '1.3.0'
jsonWebTokenApiVersion = '0.11.2'
jsonWebTokenApiVersion = '0.11.2'
dependencies = [
android : "com.google.android:android:${androidVersion}",
androidAnnotations : "androidx.annotation:annotation:${androidSupportAnnotationsVersion}",
appcompat : "androidx.appcompat:appcompat:${androidSupportAppcompatVersion}",
androidxBiometric : "androidx.biometric:biometric:${androidxBiometricVersion}",
dependencies = [
android : "com.google.android:android:${androidVersion}",
androidAnnotations : "androidx.annotation:annotation:${androidSupportAnnotationsVersion}",
appcompat : "androidx.appcompat:appcompat:${androidSupportAppcompatVersion}",
androidxBiometric : "androidx.biometric:biometric:${androidxBiometricVersion}",
androidxCore : "androidx.core:core-ktx:${androidxCoreVersion}",
androidxFragment : "androidx.fragment:fragment-ktx:${androidxFragmentVersion}",
androidxViewpager : "androidx.viewpager:viewpager:${androidxViewpagerVersion}",
androidxSwiperefresh : "androidx.swiperefreshlayout:swiperefreshlayout:${androidxSwiperefreshVersion}",
androidxPreference : "androidx.preference:preference:${androidxPreferenceVersion}",
documentFile : "androidx.documentfile:documentfile:${androidxDocumentfileVersion}",
recyclerView : "androidx.recyclerview:recyclerview:${androidxRecyclerViewVersion}",
androidxFragment : "androidx.fragment:fragment-ktx:${androidxFragmentVersion}",
androidxViewpager : "androidx.viewpager:viewpager:${androidxViewpagerVersion}",
androidxSwiperefresh : "androidx.swiperefreshlayout:swiperefreshlayout:${androidxSwiperefreshVersion}",
androidxPreference : "androidx.preference:preference:${androidxPreferenceVersion}",
documentFile : "androidx.documentfile:documentfile:${androidxDocumentfileVersion}",
recyclerView : "androidx.recyclerview:recyclerview:${androidxRecyclerViewVersion}",
androidxTestCore : "androidx.test:core:${androidxTestCoreVersion}",
commonsCodec : "commons-codec:commons-codec:${commonsCodecVersion}",
cryptolib : "org.cryptomator:cryptolib:${cryptolibVersion}",
dagger : "com.google.dagger:dagger:${daggerVersion}",
daggerCompiler : "com.google.dagger:dagger-compiler:${daggerVersion}",
design : "com.google.android.material:material:${androidSupportDesignVersion}",
dropbox : "com.dropbox.core:dropbox-core-sdk:${dropboxVersion}",
espresso : "androidx.test.espresso:espresso-core:${espressoVersion}",
googleApiClientAndroid: "com.google.api-client:google-api-client-android:${googleClientVersion}",
googleApiServicesDrive: "com.google.apis:google-api-services-drive:${googleApiServicesVersion}",
googlePlayServicesAuth: "com.google.android.gms:play-services-auth:${googlePlayServicesVersion}",
greenDao : "org.greenrobot:greendao:${greenDaoVersion}",
gson : "com.google.code.gson:gson:${gsonVersion}",
hamcrest : "org.hamcrest:hamcrest-all:${hamcrestVersion}",
javaxAnnotation : "javax.annotation:jsr250-api:${javaxAnnotationVersion}",
junit : "org.junit.jupiter:junit-jupiter:${jUnitVersion}",
commonsCodec : "commons-codec:commons-codec:${commonsCodecVersion}",
cryptolib : "org.cryptomator:cryptolib:${cryptolibVersion}",
dagger : "com.google.dagger:dagger:${daggerVersion}",
daggerCompiler : "com.google.dagger:dagger-compiler:${daggerVersion}",
design : "com.google.android.material:material:${androidSupportDesignVersion}",
dropbox : "com.dropbox.core:dropbox-core-sdk:${dropboxVersion}",
espresso : "androidx.test.espresso:espresso-core:${espressoVersion}",
googleApiClientAndroid: "com.google.api-client:google-api-client-android:${googleClientVersion}",
googleApiServicesDrive: "com.google.apis:google-api-services-drive:${googleApiServicesVersion}",
googlePlayServicesAuth: "com.google.android.gms:play-services-auth:${googlePlayServicesVersion}",
greenDao : "org.greenrobot:greendao:${greenDaoVersion}",
gson : "com.google.code.gson:gson:${gsonVersion}",
hamcrest : "org.hamcrest:hamcrest-all:${hamcrestVersion}",
javaxAnnotation : "javax.annotation:jsr250-api:${javaxAnnotationVersion}",
junit : "org.junit.jupiter:junit-jupiter:${jUnitVersion}",
junitApi : "org.junit.jupiter:junit-jupiter-api:${jUnitVersion}",
junitEngine : "org.junit.jupiter:junit-jupiter-engine:${jUnitVersion}",
junitParams : "org.junit.jupiter:junit-jupiter-params:${jUnitVersion}",
junit4 : "org.junit.jupiter:junit-jupiter:${jUnit4Version}",
junit4Engine : "org.junit.vintage:junit-vintage-engine:${jUnitVersion}",
msgraph : "com.microsoft.graph:microsoft-graph:${msgraphVersion}",
msaAuth : "com.microsoft.graph:msa-auth-for-android-adapter:${msaAuthVersion}",
mockito : "org.mockito:mockito-core:${mockitoVersion}",
msgraph : "com.microsoft.graph:microsoft-graph:${msgraphVersion}",
msaAuth : "com.microsoft.graph:msa-auth-for-android-adapter:${msaAuthVersion}",
mockito : "org.mockito:mockito-core:${mockitoVersion}",
mockitoInline : "org.mockito:mockito-inline:${mockitoInlineVersion}",
multidex : "androidx.multidex:multidex:${multidexVersion}",
okHttp : "com.squareup.okhttp3:okhttp:${okHttpVersion}",
okHttpDigest : "com.burgstaller:okhttp-digest:${okHttpDigestVersion}",
multidex : "androidx.multidex:multidex:${multidexVersion}",
okHttp : "com.squareup.okhttp3:okhttp:${okHttpVersion}",
okHttpDigest : "com.burgstaller:okhttp-digest:${okHttpDigestVersion}",
recyclerViewFastScroll: "com.simplecityapps:recyclerview-fastscroll:${recyclerViewFastScrollVersion}",
rxJava : "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
rxAndroid : "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}",
rxBinding : "com.jakewharton.rxbinding2:rxbinding:${rxBindingVersion}",
testingSupportLib : "com.android.support.test:testing-support-lib:${testingSupportLibVersion}",
timber : "com.jakewharton.timber:timber:${timberVersion}",
velocity : "org.apache.velocity:velocity:${velocityVersion}",
runner : "androidx.test:runner:${runnerVersion}",
rules : "androidx.test:rules:${rulesVersion}",
contribution : "androidx.test.espresso:espresso-contrib:${contributionVersion}",
uiAutomator : "androidx.test.uiautomator:uiautomator:${uiautomatorVersion}",
zxcvbn : "com.nulab-inc:zxcvbn:${zxcvbnVersion}",
scaleImageView : "com.davemorrissey.labs:subsampling-scale-image-view:${scaleImageViewVersion}",
lruFileCache : "com.tomclaw.cache:cache:${lruFileCacheVersion}",
jsonWebTokenApi : "io.jsonwebtoken:jjwt-api:${jsonWebTokenApiVersion}",
jsonWebTokenImpl : "io.jsonwebtoken:jjwt-impl:${jsonWebTokenApiVersion}",
jsonWebTokenJson : "io.jsonwebtoken:jjwt-orgjson:${jsonWebTokenApiVersion}"
]
rxAndroid : "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}",
rxBinding : "com.jakewharton.rxbinding2:rxbinding:${rxBindingVersion}",
testingSupportLib : "com.android.support.test:testing-support-lib:${testingSupportLibVersion}",
timber : "com.jakewharton.timber:timber:${timberVersion}",
velocity : "org.apache.velocity:velocity:${velocityVersion}",
runner : "androidx.test:runner:${runnerVersion}",
rules : "androidx.test:rules:${rulesVersion}",
contribution : "androidx.test.espresso:espresso-contrib:${contributionVersion}",
uiAutomator : "androidx.test.uiautomator:uiautomator:${uiautomatorVersion}",
zxcvbn : "com.nulab-inc:zxcvbn:${zxcvbnVersion}",
scaleImageView : "com.davemorrissey.labs:subsampling-scale-image-view:${scaleImageViewVersion}",
lruFileCache : "com.tomclaw.cache:cache:${lruFileCacheVersion}",
jsonWebTokenApi : "io.jsonwebtoken:jjwt-api:${jsonWebTokenApiVersion}",
jsonWebTokenImpl : "io.jsonwebtoken:jjwt-impl:${jsonWebTokenApiVersion}",
jsonWebTokenJson : "io.jsonwebtoken:jjwt-orgjson:${jsonWebTokenApiVersion}"
]
}

View File

@ -17,7 +17,6 @@ android {
buildConfigField 'int', 'VERSION_CODE', "${globalConfiguration["androidVersionCode"]}"
buildConfigField "String", "VERSION_NAME", "\"${globalConfiguration["androidVersionName"]}\""
buildConfigField "String", "ONEDRIVE_API_KEY", "\"" + getApiKey('ONEDRIVE_API_KEY') + "\""
}
compileOptions {
@ -31,6 +30,18 @@ android {
ignoreWarnings true
}
buildTypes {
release {
buildConfigField "String", "ONEDRIVE_API_KEY", "\"" + getApiKey('ONEDRIVE_API_KEY') + "\""
buildConfigField "String", "ONEDRIVE_API_REDIRCT_URI", "\"" + getApiKey('ONEDRIVE_API_REDIRCT_URI') + "\""
}
debug {
buildConfigField "String", "ONEDRIVE_API_KEY", "\"" + getApiKey('ONEDRIVE_API_KEY_DEBUG') + "\""
buildConfigField "String", "ONEDRIVE_API_REDIRCT_URI", "\"" + getApiKey('ONEDRIVE_API_REDIRCT_URI_DEBUG') + "\""
}
}
flavorDimensions "version"
productFlavors {
@ -38,9 +49,27 @@ android {
dimension "version"
}
license {
apkstore {
dimension "version"
}
fdroid {
dimension "version"
}
}
sourceSets {
playstore {
java.srcDirs = ['src/main/java', 'src/main/java/', 'src/notFoss/java', 'src/notFoss/java/']
}
apkstore {
java.srcDirs = ['src/main/java', 'src/main/java/', 'src/notFoss/java', 'src/notFoss/java/']
}
fdroid {
java.srcDirs = ['src/main/java', 'src/main/java/', 'src/foss/java', 'src/foss/java/']
}
}
}
@ -70,17 +99,29 @@ dependencies {
implementation dependencies.dagger
// cloud
implementation dependencies.dropbox
implementation dependencies.googlePlayServicesAuth
implementation(dependencies.googleApiServicesDrive) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
implementation(dependencies.googleApiClientAndroid) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
implementation dependencies.msgraph
playstoreImplementation dependencies.googlePlayServicesAuth
apkstoreImplementation dependencies.googlePlayServicesAuth
playstoreImplementation(dependencies.googleApiServicesDrive) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
apkstoreImplementation(dependencies.googleApiServicesDrive) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
playstoreImplementation(dependencies.googleApiClientAndroid) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
apkstoreImplementation(dependencies.googleApiClientAndroid) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
// rest
implementation dependencies.rxJava
implementation dependencies.rxAndroid
@ -116,7 +157,5 @@ configurations {
}
static def getApiKey(key) {
Properties props = new Properties()
props.load(new FileInputStream(new File('secrets.properties')))
return props[key]
return System.getenv().getOrDefault(key, "")
}

View File

@ -0,0 +1,42 @@
package org.cryptomator.data.cloud;
import org.cryptomator.data.cloud.crypto.CryptoCloudContentRepositoryFactory;
import org.cryptomator.data.cloud.dropbox.DropboxCloudContentRepositoryFactory;
import org.cryptomator.data.cloud.local.LocalStorageContentRepositoryFactory;
import org.cryptomator.data.cloud.onedrive.OnedriveCloudContentRepositoryFactory;
import org.cryptomator.data.cloud.webdav.WebDavCloudContentRepositoryFactory;
import org.cryptomator.data.repository.CloudContentRepositoryFactory;
import org.jetbrains.annotations.NotNull;
import java.util.Iterator;
import javax.inject.Inject;
import javax.inject.Singleton;
import static java.util.Arrays.asList;
@Singleton
public class CloudContentRepositoryFactories implements Iterable<CloudContentRepositoryFactory> {
private final Iterable<CloudContentRepositoryFactory> factories;
@Inject
public CloudContentRepositoryFactories(DropboxCloudContentRepositoryFactory dropboxFactory, //
OnedriveCloudContentRepositoryFactory oneDriveFactory, //
CryptoCloudContentRepositoryFactory cryptoFactory, //
LocalStorageContentRepositoryFactory localStorageFactory, //
WebDavCloudContentRepositoryFactory webDavFactory) {
factories = asList(dropboxFactory, //
oneDriveFactory, //
cryptoFactory, //
localStorageFactory, //
webDavFactory);
}
@NotNull
@Override
public Iterator<CloudContentRepositoryFactory> iterator() {
return factories.iterator();
}
}

View File

@ -4,6 +4,8 @@ import android.net.Uri;
import com.microsoft.services.msa.OAuthConfig;
import org.cryptomator.data.BuildConfig;
class MicrosoftOAuth2Endpoint implements OAuthConfig {
/**
* The current instance of this class
@ -12,7 +14,7 @@ class MicrosoftOAuth2Endpoint implements OAuthConfig {
/**
* The current instance of this class
*
*
* @return The instance
*/
static MicrosoftOAuth2Endpoint getInstance() {
@ -26,7 +28,7 @@ class MicrosoftOAuth2Endpoint implements OAuthConfig {
@Override
public Uri getDesktopUri() {
return Uri.parse("urn:ietf:wg:oauth:2.0:oob");
return Uri.parse(BuildConfig.ONEDRIVE_API_REDIRCT_URI);
}
@Override

View File

@ -2,8 +2,8 @@ package org.cryptomator.data.cloud.googledrive;
import android.content.Context;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
@ -24,7 +24,7 @@ class GoogleDriveClientFactory {
try {
FixedGoogleAccountCredential credential = FixedGoogleAccountCredential.usingOAuth2(context, Collections.singleton(DriveScopes.DRIVE));
credential.setAccountName(accountName);
return new Drive.Builder(AndroidHttp.newCompatibleTransport(), JacksonFactory.getDefaultInstance(), credential) //
return new Drive.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), credential) //
.setApplicationName("Cryptomator-Android/" + BuildConfig.VERSION_NAME) //
.build();
} catch (Exception e) {

View File

@ -13,7 +13,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.cryptomator.data.util.TransferredBytesAwareGoogleContentInputStream;
import org.cryptomator.data.util.TransferredBytesAwareOutputStream;
import org.cryptomator.domain.CloudNode;
import org.cryptomator.domain.GoogleDriveCloud;

View File

@ -1,7 +1,9 @@
package org.cryptomator.data.util;
package org.cryptomator.data.cloud.googledrive;
import com.google.api.client.http.AbstractInputStreamContent;
import org.cryptomator.data.util.TransferredBytesAwareInputStream;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;

8
demo-mode.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/bash
adb shell settings put global sysui_demo_allowed 1
adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1200
adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e level 4 -e datatype false
adb shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false
adb shell am broadcast -a com.android.systemui.demo -e command battery -e plugged false -e level 100

View File

@ -34,6 +34,7 @@ public class IntentProcessor extends BaseProcessor {
intentsModelBuilder.add(generateIntentReader((TypeElement) element));
}
if (!intentAnnotatedElements.isEmpty()) {
intentAnnotatedElements.sort((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString()));
generateIntents(intentsModelBuilder.build(), intentAnnotatedElements);
}
}

View File

@ -1,21 +1,21 @@
package org.cryptomator.generator.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class ActivitiesModel {
private final List<ActivityModel> activities;
private final Set<ActivityModel> activities;
public static ActivitiesModel.Builder builder() {
return new Builder();
}
private ActivitiesModel(List<ActivityModel> activities) {
private ActivitiesModel(Set<ActivityModel> activities) {
this.activities = activities;
}
public List<ActivityModel> getActivities() {
public Set<ActivityModel> getActivities() {
return activities;
}
@ -29,7 +29,7 @@ public class ActivitiesModel {
public static class Builder {
private final List<ActivityModel> activities = new ArrayList<>();
private final Set<ActivityModel> activities = new TreeSet<>();
private Builder() {
}

View File

@ -12,7 +12,7 @@ import javax.lang.model.element.TypeElement;
import static java.util.stream.Collectors.toList;
public class ActivityModel {
public class ActivityModel implements Comparable<ActivityModel> {
private final String qualifiedName;
@ -128,4 +128,9 @@ public class ActivityModel {
public String getPresenterIntentFieldName() {
return presenterIntentFieldName;
}
@Override
public int compareTo(ActivityModel activityModel) {
return this.qualifiedName.compareTo(activityModel.qualifiedName);
}
}

View File

@ -6,7 +6,7 @@ import org.cryptomator.generator.utils.Type;
import java.util.Optional;
public class FragmentModel {
public class FragmentModel implements Comparable<FragmentModel> {
private final String qualifiedName;
@ -45,4 +45,9 @@ public class FragmentModel {
public boolean isHasPresenter() {
return hasPresenter;
}
@Override
public int compareTo(FragmentModel fragmentModel) {
return this.qualifiedName.compareTo(fragmentModel.qualifiedName);
}
}

View File

@ -1,21 +1,21 @@
package org.cryptomator.generator.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class FragmentsModel {
private final List<FragmentModel> fragments;
private final Set<FragmentModel> fragments;
public static FragmentsModel.Builder builder() {
return new Builder();
}
private FragmentsModel(List<FragmentModel> fragments) {
private FragmentsModel(Set<FragmentModel> fragments) {
this.fragments = fragments;
}
public List<FragmentModel> getFragments() {
public Set<FragmentModel> getFragments() {
return fragments;
}
@ -29,7 +29,7 @@ public class FragmentsModel {
public static class Builder {
private final List<FragmentModel> fragments = new ArrayList<>();
private final Set<FragmentModel> fragments = new TreeSet<>();
private Builder() {
}

View File

@ -4,18 +4,18 @@ import org.cryptomator.generator.ProcessorException;
import org.cryptomator.generator.utils.Field;
import org.cryptomator.generator.utils.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.lang.model.element.Element;
public class InstanceStateModel {
private final String javaPackage;
private final Map<Type, InstanceStateType> types = new HashMap<>();
private final Map<Type, InstanceStateType> types = new TreeMap<>();
public InstanceStateModel(String javaPackage) {
this.javaPackage = javaPackage;
@ -47,7 +47,7 @@ public class InstanceStateModel {
public static class InstanceStateType {
private final List<InstanceStateField> fields = new ArrayList<>();
private final SortedSet<InstanceStateField> fields = new TreeSet<>();
private final String qualifiedName;
public InstanceStateType(Type type) {
@ -62,12 +62,12 @@ public class InstanceStateModel {
return qualifiedName;
}
public List<InstanceStateField> getFields() {
public SortedSet<InstanceStateField> getFields() {
return fields;
}
}
public static class InstanceStateField {
public static class InstanceStateField implements Comparable<InstanceStateField> {
private static int nextBundleKey = 0;
@ -142,6 +142,10 @@ public class InstanceStateModel {
return field.element();
}
@Override
public int compareTo(InstanceStateField instanceStateField) {
return this.bundleKey.compareTo(instanceStateField.bundleKey);
}
}
}

View File

@ -2,13 +2,13 @@ package org.cryptomator.generator.model;
import org.cryptomator.generator.utils.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Stream;
public class InstanceStatesModel {
private final Map<String, InstanceStateModel> instanceStatesByPackage = new HashMap<>();
private final Map<String, InstanceStateModel> instanceStatesByPackage = new TreeMap<>();
public void add(Field field) {
String packageName = field.declaringType().packageName();

View File

@ -3,9 +3,12 @@ package org.cryptomator.generator.model;
import org.cryptomator.generator.Intent;
import org.cryptomator.generator.Optional;
import java.util.List;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
@ -14,16 +17,15 @@ import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import static java.lang.Character.toLowerCase;
import static java.util.stream.Collectors.toList;
public class IntentBuilderModel {
public class IntentBuilderModel implements Comparable<IntentBuilderModel> {
private final String javaPackage;
private final String className;
private final String targetActivity;
private final String targetActivitySimpleName;
private final String buildMethodName;
private final List<ParameterModel> parameters;
private final Set<ParameterModel> parameters;
public IntentBuilderModel(TypeElement type) {
this.javaPackage = javaPackage(type);
@ -47,9 +49,21 @@ public class IntentBuilderModel {
}
private static String targetActivity(TypeElement type) {
return type.getAnnotationMirrors().stream().filter(is(Intent.class)).findFirst().get().getElementValues().entrySet().stream().map(entry -> (Map.Entry<ExecutableElement, AnnotationValue>) entry)
.filter(entry -> "value".equals(entry.getKey().getSimpleName().toString())).map(Map.Entry::getValue).map(AnnotationValue::getValue).map(DeclaredType.class::cast).map(DeclaredType::asElement)
.map(TypeElement.class::cast).findFirst().get().getQualifiedName().toString();
return type //
.getAnnotationMirrors() //
.stream() //
.filter(is(Intent.class)) //
.findFirst().get().getElementValues().entrySet() //
.stream() //
.map(entry -> (Map.Entry<ExecutableElement, AnnotationValue>) entry) //
.filter(entry -> "value".equals(entry.getKey().getSimpleName().toString())) //
.map(Map.Entry::getValue) //
.map(AnnotationValue::getValue) //
.map(DeclaredType.class::cast) //
.map(DeclaredType::asElement) //
.map(TypeElement.class::cast) //
.findFirst().get() //
.getQualifiedName().toString();
}
private static Predicate<AnnotationMirror> is(Class<?> type) {
@ -66,8 +80,14 @@ public class IntentBuilderModel {
return toLowerCase(name.charAt(0)) + name.substring(1);
}
private static List<ParameterModel> parameters(TypeElement type) {
return type.getEnclosedElements().stream().filter(ExecutableElement.class::isInstance).map(ExecutableElement.class::cast).map(ParameterModel::new).collect(toList());
private static Set<ParameterModel> parameters(TypeElement type) {
return type //
.getEnclosedElements() //
.stream() //
.filter(ExecutableElement.class::isInstance) //
.map(ExecutableElement.class::cast) //
.map(ParameterModel::new) //
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ParameterModel::getName))));
}
private static String buildMethodName(TypeElement type) {
@ -101,6 +121,11 @@ public class IntentBuilderModel {
return buildMethodName;
}
@Override
public int compareTo(IntentBuilderModel intentBuilderModel) {
return (this.javaPackage + this.className).compareTo(intentBuilderModel.javaPackage + intentBuilderModel.className);
}
public static class ParameterModel {
private final String nameWithFirstCharUppercase;

View File

@ -3,9 +3,12 @@ package org.cryptomator.generator.model;
import org.cryptomator.generator.Intent;
import org.cryptomator.generator.Optional;
import java.util.List;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
@ -13,16 +16,14 @@ import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import static java.util.stream.Collectors.toList;
public class IntentReaderModel {
public class IntentReaderModel implements Comparable<IntentReaderModel> {
private final String javaPackage;
private final String className;
private final String targetActivity;
private final String intentInterface;
private final String readMethodName;
private final List<ParameterModel> parameters;
private final Set<ParameterModel> parameters;
public IntentReaderModel(TypeElement type) {
this.intentInterface = type.getQualifiedName().toString();
@ -46,9 +47,22 @@ public class IntentReaderModel {
}
private static String targetActivity(TypeElement type) {
return type.getAnnotationMirrors().stream().filter(is(Intent.class)).findFirst().get().getElementValues().entrySet().stream().map(entry -> (Map.Entry<ExecutableElement, AnnotationValue>) entry)
.filter(entry -> "value".equals(entry.getKey().getSimpleName().toString())).map(Map.Entry::getValue).map(AnnotationValue::getValue).map(DeclaredType.class::cast).map(DeclaredType::asElement)
.map(TypeElement.class::cast).findFirst().get().getQualifiedName().toString();
return type //
.getAnnotationMirrors() //
.stream() //
.filter(is(Intent.class)) //
.findFirst().get().getElementValues().entrySet() //
.stream() //
.map(entry -> (Map.Entry<ExecutableElement, AnnotationValue>) entry) //
.filter(entry -> "value".equals(entry.getKey().getSimpleName().toString())) //
.map(Map.Entry::getValue) //
.map(AnnotationValue::getValue) //
.map(DeclaredType.class::cast) //
.map(DeclaredType::asElement) //
.map(TypeElement.class::cast) //
.findFirst().get() //
.getQualifiedName() //
.toString();
}
private static Predicate<AnnotationMirror> is(Class<?> type) {
@ -59,8 +73,14 @@ public class IntentReaderModel {
};
}
private static List<ParameterModel> parameters(TypeElement type) {
return type.getEnclosedElements().stream().filter(ExecutableElement.class::isInstance).map(ExecutableElement.class::cast).map(ParameterModel::new).collect(toList());
private static Set<ParameterModel> parameters(TypeElement type) {
return type //
.getEnclosedElements() //
.stream() //
.filter(ExecutableElement.class::isInstance) //
.map(ExecutableElement.class::cast) //
.map(ParameterModel::new) //
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ParameterModel::getName))));
}
private static String readMethodName(TypeElement type) {
@ -94,6 +114,11 @@ public class IntentReaderModel {
return readMethodName;
}
@Override
public int compareTo(IntentReaderModel intentReaderModel) {
return (this.javaPackage + this.className).compareTo(intentReaderModel.javaPackage + intentReaderModel.className);
}
public static class ParameterModel {
private final String name;

View File

@ -1,27 +1,27 @@
package org.cryptomator.generator.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class IntentsModel {
private final List<IntentBuilderModel> builders;
private final List<IntentReaderModel> readers;
private final Set<IntentBuilderModel> builders;
private final Set<IntentReaderModel> readers;
public static IntentsModel.Builder builder() {
return new Builder();
}
private IntentsModel(List<IntentBuilderModel> builders, List<IntentReaderModel> readers) {
private IntentsModel(Set<IntentBuilderModel> builders, Set<IntentReaderModel> readers) {
this.builders = builders;
this.readers = readers;
}
public List<IntentBuilderModel> getBuilders() {
public Set<IntentBuilderModel> getBuilders() {
return builders;
}
public List<IntentReaderModel> getReaders() {
public Set<IntentReaderModel> getReaders() {
return readers;
}
@ -35,8 +35,8 @@ public class IntentsModel {
public static class Builder {
private final List<IntentBuilderModel> builders = new ArrayList<>();
private final List<IntentReaderModel> readers = new ArrayList<>();
private final Set<IntentBuilderModel> builders = new TreeSet<>();
private final Set<IntentReaderModel> readers = new TreeSet<>();
private Builder() {
}

View File

@ -9,7 +9,7 @@ import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeKind;
public class Method {
public class Method implements Comparable<Method> {
private final Utils utils;
private final ExecutableElement delegate;
@ -75,4 +75,9 @@ public class Method {
public Type declaringType() {
return new Type(utils, (TypeElement) delegate.getEnclosingElement());
}
@Override
public int compareTo(Method method) {
return this.delegate.getSimpleName().toString().compareTo(method.delegate.getSimpleName().toString());
}
}

View File

@ -14,7 +14,7 @@ import static javax.lang.model.element.ElementKind.FIELD;
import static javax.lang.model.type.TypeKind.ARRAY;
import static javax.lang.model.type.TypeKind.NONE;
public class Type {
public class Type implements Comparable<Type> {
private final TypeMirror mirror;
private final Optional<TypeElement> element;
@ -89,6 +89,7 @@ public class Type {
return element //
.map(type -> type.getEnclosedElements().stream() //
.filter(ExecutableElement.class::isInstance) //
.sorted((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString())) //
.map(ExecutableElement.class::cast) //
.filter(Method::isConstructor) //
.map(executableElement -> new Method(utils, executableElement)))
@ -99,20 +100,22 @@ public class Type {
return element //
.map(type -> type.getEnclosedElements().stream() //
.filter(ExecutableElement.class::isInstance) //
.sorted((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString())) //
.map(ExecutableElement.class::cast) //
.filter(Method::isRegularMethod) //
.map(executableElement -> new Method(utils, executableElement)))
.orElse(Stream.empty()); //
.orElse(Stream.empty());
}
public Stream<Field> fields() {
return element //
.map(type -> type.getEnclosedElements().stream() //
.filter(VariableElement.class::isInstance) //
.sorted((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString())) //
.map(VariableElement.class::cast) //
.filter(variable -> variable.getKind() == FIELD) //
.map(variableElement -> new Field(utils, variableElement)))
.orElse(Stream.empty()); //
.map(variableElement -> new Field(utils, variableElement))) //
.orElse(Stream.empty());
}
@Override
@ -133,6 +136,11 @@ public class Type {
return mirror.hashCode();
}
@Override
public int compareTo(Type type) {
return this.qualifiedName().compareTo(type.qualifiedName());
}
public Optional<Type> enclosingType() {
if (mirror instanceof DeclaredType) {
return Optional.ofNullable(((DeclaredType) mirror).getEnclosingType()) //

@ -1 +1 @@
Subproject commit eca34e843a1ca2d7953f0d7c22efe72572ce7dc1
Subproject commit fe4e04589043cb18011cae80aec7eab09b46ed44

View File

@ -29,9 +29,6 @@ android {
multiDexEnabled true
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
buildConfigField "String", "DROPBOX_API_KEY", "\"" + getApiKey('DROPBOX_API_KEY') + "\""
manifestPlaceholders = [DROPBOX_API_KEY_DB: getApiKey('DROPBOX_API_KEY_DB')]
}
compileOptions {
@ -47,13 +44,32 @@ android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
crunchPngs false
minifyEnabled false
shrinkResources false
useProguard false
buildConfigField "String", "DROPBOX_API_KEY", "\"" + getApiKey('DROPBOX_API_KEY') + "\""
manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY')]
resValue "string", "app_id", androidApplicationId
}
debug {
signingConfig signingConfigs.debug
crunchPngs false
minifyEnabled false
shrinkResources false
testCoverageEnabled false
buildConfigField "String", "DROPBOX_API_KEY", "\"" + getApiKey('DROPBOX_API_KEY_DEBUG') + "\""
manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY_DEBUG')]
applicationIdSuffix ".debug"
versionNameSuffix '-DEBUG'
resValue "string", "app_id", androidApplicationId + applicationIdSuffix
}
}
@ -64,9 +80,27 @@ android {
dimension "version"
}
license {
apkstore {
dimension "version"
}
fdroid {
dimension "version"
}
}
sourceSets {
playstore {
java.srcDirs = ['src/main/java', 'src/main/java/', 'src/notFoss/java', 'src/notFoss/java/']
}
apkstore {
java.srcDirs = ['src/main/java', 'src/main/java/', 'src/notFoss/java', 'src/notFoss/java/']
}
fdroid {
java.srcDirs = ['src/main/java', 'src/main/java/', 'src/foss/java', 'src/foss/java/']
}
}
packagingOptions {
@ -106,11 +140,21 @@ dependencies {
// cloud
implementation dependencies.dropbox
implementation dependencies.msgraph
implementation(dependencies.googleApiServicesDrive) {
playstoreImplementation(dependencies.googleApiServicesDrive) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
implementation(dependencies.googleApiClientAndroid) {
apkstoreImplementation(dependencies.googleApiServicesDrive) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
playstoreImplementation(dependencies.googleApiClientAndroid) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
apkstoreImplementation(dependencies.googleApiClientAndroid) {
exclude module: 'guava-jdk5'
exclude module: 'httpclient'
}
@ -188,7 +232,5 @@ androidExtensions {
}
static def getApiKey(key) {
Properties props = new Properties()
props.load(new FileInputStream(new File('secrets.properties')))
return props[key]
return System.getenv().getOrDefault(key, "")
}

View File

@ -1,81 +0,0 @@
-useuniqueclassmembernames
# greenDAO 3, http://greenrobot.org/greendao/documentation/technical-faq
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties {*;}
-dontwarn org.greenrobot.greendao.database.**
-dontwarn net.sqlcipher.database.**
-dontwarn rx.**
# RxJava, https://github.com/artem-zinnatullin/RxJavaProGuardRules/blob/master/rxjava-proguard-rules/proguard-rules.txt
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
# Google API Client, https://github.com/google/google-api-java-client/blob/dev/google-api-client-assembly/proguard-google-api-client.txt
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
-keepclassmembers class * {
@com.google.api.client.util.Key <fields>;
}
-dontwarn com.google.api.client.extensions.android.**
-dontwarn com.google.api.client.googleapis.extensions.android.**
-dontwarn com.google.api.client.googleapis.testing.TestUtils
-dontwarn com.google.android.gms.**
# okhttp3
-dontwarn okhttp3.**
-dontwarn okio.**
# Others
-dontwarn org.slf4j.**
-dontwarn com.dropbox.core.**
-dontwarn com.fernandocejas.frodo.core.**
-dontwarn com.google.errorprone.annotations.**
-dontwarn com.google.common.util.concurrent.FuturesGetChecked**
-keepclassmembers class com.microsoft.graph.http.GraphServiceException {
int mResponseCode;
}
-keep class com.nulabinc.zxcvbn.**
# https://stackoverflow.com/a/47555897/1759462
-dontwarn afu.org.checkerframework.**
-dontwarn org.checkerframework.**
# https://github.com/microsoftgraph/msgraph-sdk-java/issues/258#issue-452030712
-keep class com.microsoft.** { *; }
-keep class com.microsoft.**
-keep interface com.microsoft.** { *; }
-keepclasseswithmembernames class com.microsoft.** { *; }
-keep class com.sun.** { *; }
-keep class com.sun.**
-keep interface com.sun.** { *; }
# https://github.com/jwtk/jjwt
-keepattributes InnerClasses
-keep class io.jsonwebtoken.** { *; }
-keepnames class io.jsonwebtoken.* { *; }
-keepnames interface io.jsonwebtoken.* { *; }
-keep class org.bouncycastle.** { *; }
-keepnames class org.bouncycastle.** { *; }
-dontwarn org.bouncycastle.**
-keep class android.net.http.** { *; }
-keep interface org.apache.** { *; }
-keep enum org.apache.** { *; }
-keep class org.apache.** { *; }
-keep class org.apache.commons.** { *; }
-keep class org.apache.http.** { *; }
-keep class org.apache.harmony.** {*;}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">Debug Cryptomator</string>
</resources>

View File

@ -0,0 +1,338 @@
package org.cryptomator.presentation.presenter
import android.Manifest
import android.accounts.AccountManager
import com.dropbox.core.android.Auth
import org.cryptomator.data.cloud.onedrive.OnedriveClientFactory
import org.cryptomator.data.cloud.onedrive.graph.ClientException
import org.cryptomator.data.cloud.onedrive.graph.ICallback
import org.cryptomator.data.util.X509CertificateHelper
import org.cryptomator.domain.*
import org.cryptomator.domain.di.PerView
import org.cryptomator.domain.exception.FatalBackendException
import org.cryptomator.domain.exception.NetworkConnectionException
import org.cryptomator.domain.exception.authentication.*
import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase
import org.cryptomator.domain.usecases.cloud.GetUsernameUseCase
import org.cryptomator.generator.Callback
import org.cryptomator.presentation.BuildConfig
import org.cryptomator.presentation.R
import org.cryptomator.presentation.exception.ExceptionHandlers
import org.cryptomator.presentation.exception.PermissionNotGrantedException
import org.cryptomator.presentation.intent.AuthenticateCloudIntent
import org.cryptomator.presentation.model.*
import org.cryptomator.presentation.model.mappers.CloudModelMapper
import org.cryptomator.presentation.ui.activity.view.AuthenticateCloudView
import org.cryptomator.presentation.workflow.*
import org.cryptomator.util.ExceptionUtil
import org.cryptomator.util.crypto.CredentialCryptor
import timber.log.Timber
import java.security.cert.CertificateEncodingException
import java.security.cert.CertificateException
import java.security.cert.X509Certificate
import javax.inject.Inject
@PerView
class AuthenticateCloudPresenter @Inject constructor( //
exceptionHandlers: ExceptionHandlers, //
private val cloudModelMapper: CloudModelMapper, //
private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, //
private val getUsernameUseCase: GetUsernameUseCase, //
private val addExistingVaultWorkflow: AddExistingVaultWorkflow, //
private val createNewVaultWorkflow: CreateNewVaultWorkflow) : Presenter<AuthenticateCloudView>(exceptionHandlers) {
private val strategies = arrayOf( //
DropboxAuthStrategy(), //
OnedriveAuthStrategy(), //
WebDAVAuthStrategy(), //
LocalStorageAuthStrategy() //
)
override fun workflows(): Iterable<Workflow<*>> {
return listOf(createNewVaultWorkflow, addExistingVaultWorkflow)
}
override fun resumed() {
val cloud = view?.intent()?.cloud()
val error = view?.intent()?.error()
handleNetworkConnectionExceptionIfRequired(error)
view?.intent()?.let { cloud?.let { cloud -> authStrategyFor(cloud).resumed(it) } }
}
private fun handleNetworkConnectionExceptionIfRequired(error: AuthenticationException?) {
if (error != null && ExceptionUtil.contains(error, NetworkConnectionException::class.java)) {
view?.showMessage(R.string.error_no_network_connection)
finish()
}
}
private fun authStrategyFor(cloud: CloudModel): AuthStrategy {
strategies.forEach { strategy ->
if (strategy.supports(cloud)) {
return strategy
}
}
return FailingAuthStrategy()
}
private fun getUsernameAndSuceedAuthentication(cloud: Cloud) {
getUsernameUseCase.withCloud(cloud).run(object : DefaultResultHandler<String>() {
override fun onSuccess(username: String) {
succeedAuthenticationWith(updateUsernameOf(cloud, username))
}
override fun onError(e: Throwable) {
super.onError(e)
finish()
}
})
}
private fun updateUsernameOf(cloud: Cloud, username: String): Cloud {
when (cloud.type()) {
CloudType.DROPBOX -> return DropboxCloud.aCopyOf(cloud as DropboxCloud).withUsername(username).build()
CloudType.ONEDRIVE -> return OnedriveCloud.aCopyOf(cloud as OnedriveCloud).withUsername(username).build()
}
throw IllegalStateException("Cloud " + cloud.type() + " is not supported")
}
private fun succeedAuthenticationWith(cloud: Cloud) {
addOrChangeCloudConnectionUseCase //
.withCloud(cloud) //
.run(object : DefaultResultHandler<Void?>() {
override fun onSuccess(void: Void?) {
finishWithResult(cloudModelMapper.toModel(cloud))
}
override fun onError(e: Throwable) {
super.onError(e)
finish()
}
})
}
private fun failAuthentication(cloudName: Int) {
view?.showMessage(String.format(getString(R.string.screen_authenticate_auth_authentication_failed), getString(cloudName)))
finish()
}
private fun failAuthentication(error: PermissionNotGrantedException) {
finishWithResult(error)
}
private inner class DropboxAuthStrategy : AuthStrategy {
private var authenticationStarted = false
override fun supports(cloud: CloudModel): Boolean {
return cloud.cloudType() == CloudTypeModel.DROPBOX
}
override fun resumed(intent: AuthenticateCloudIntent) {
if (authenticationStarted) {
handleAuthenticationResult(intent.cloud())
} else {
startAuthentication()
}
}
private fun startAuthentication() {
showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION))
authenticationStarted = true
Auth.startOAuth2Authentication(context(), BuildConfig.DROPBOX_API_KEY)
view?.skipTransition()
}
private fun handleAuthenticationResult(cloudModel: CloudModel) {
val authToken = Auth.getOAuth2Token()
if (authToken == null) {
failAuthentication(cloudModel.name())
} else {
getUsernameAndSuceedAuthentication( //
DropboxCloud.aCopyOf(cloudModel.toCloud() as DropboxCloud) //
.withAccessToken(encrypt(authToken)) //
.build())
}
}
}
@Callback(dispatchResultOkOnly = false)
fun onUserRecoveryFinished(result: ActivityResult, cloud: CloudModel) {
if (result.isResultOk) {
succeedAuthenticationWith(cloud.toCloud())
} else {
failAuthentication(cloud.name())
}
}
@Callback(dispatchResultOkOnly = false)
fun onGoogleDriveAuthenticated(result: ActivityResult, cloud: CloudModel) {
if (result.isResultOk) {
val accountName = result.intent()?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME)
succeedAuthenticationWith(GoogleDriveCloud.aCopyOf(cloud.toCloud() as GoogleDriveCloud) //
.withUsername(accountName) //
.withAccessToken(accountName) //
.build())
} else {
failAuthentication(cloud.name())
}
}
private inner class OnedriveAuthStrategy : AuthStrategy {
private var authenticationStarted = false
override fun supports(cloud: CloudModel): Boolean {
return cloud.cloudType() == CloudTypeModel.ONEDRIVE
}
override fun resumed(intent: AuthenticateCloudIntent) {
if (!authenticationStarted) {
startAuthentication(intent.cloud())
}
}
private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true
val authenticationAdapter = OnedriveClientFactory.instance(context(), (cloud.toCloud() as OnedriveCloud).accessToken()).authenticationAdapter
authenticationAdapter.login(activity(), object : ICallback<String?> {
override fun success(accessToken: String?) {
if (accessToken == null) {
Timber.tag("AuthicateCloudPrester").e("Onedrive access token is empty")
failAuthentication(cloud.name())
} else {
showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION))
handleAuthenticationResult(cloud, accessToken)
}
}
override fun failure(ex: ClientException) {
Timber.tag("AuthicateCloudPrester").e(ex)
failAuthentication(cloud.name())
}
})
}
private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) {
getUsernameAndSuceedAuthentication( //
OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) //
.withAccessToken(accessToken) //
.build())
}
}
private inner class WebDAVAuthStrategy : AuthStrategy {
override fun supports(cloud: CloudModel): Boolean {
return cloud.cloudType() == CloudTypeModel.WEBDAV
}
override fun resumed(intent: AuthenticateCloudIntent) {
handleWebDavAuthenticationExceptionIfRequired(intent.cloud() as WebDavCloudModel, intent.error())
}
private fun handleWebDavAuthenticationExceptionIfRequired(cloud: WebDavCloudModel, e: AuthenticationException) {
Timber.tag("AuthicateCloudPrester").e(e)
when {
ExceptionUtil.contains(e, WrongCredentialsException::class.java) -> {
failAuthentication(cloud.name())
}
ExceptionUtil.contains(e, WebDavCertificateUntrustedAuthenticationException::class.java) -> {
handleCertificateUntrustedExceptionIfRequired(cloud, e)
}
ExceptionUtil.contains(e, WebDavServerNotFoundException::class.java) -> {
view?.showMessage(R.string.error_server_not_found)
finish()
}
ExceptionUtil.contains(e, WebDavNotSupportedException::class.java) -> {
view?.showMessage(R.string.screen_cloud_error_webdav_not_supported)
finish()
}
}
}
private fun handleCertificateUntrustedExceptionIfRequired(cloud: WebDavCloudModel, e: AuthenticationException) {
val untrustedException = ExceptionUtil.extract(e, WebDavCertificateUntrustedAuthenticationException::class.java)
try {
val certificate = X509CertificateHelper.convertFromPem(untrustedException.get().certificate)
view?.showUntrustedCertificateDialog(cloud.toCloud() as WebDavCloud, certificate)
} catch (ex: CertificateException) {
Timber.tag("AuthicateCloudPrester").e(ex)
throw FatalBackendException(ex)
}
}
}
fun onAcceptWebDavCertificateClicked(cloud: WebDavCloud?, certificate: X509Certificate?) {
try {
val webDavCloudWithAcceptedCert = WebDavCloud.aCopyOf(cloud) //
.withCertificate(X509CertificateHelper.convertToPem(certificate)) //
.build()
finishWithResultAndExtra(cloudModelMapper.toModel(webDavCloudWithAcceptedCert), //
WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE, //
true)
} catch (e: CertificateEncodingException) {
Timber.tag("AuthicateCloudPrester").e(e)
throw FatalBackendException(e)
}
}
fun onAcceptWebDavCertificateDenied() {
finish()
}
private inner class LocalStorageAuthStrategy : AuthStrategy {
private var authenticationStarted = false
override fun supports(cloud: CloudModel): Boolean {
return cloud.cloudType() == CloudTypeModel.LOCAL
}
override fun resumed(intent: AuthenticateCloudIntent) {
if (!authenticationStarted) {
startAuthentication(intent.cloud())
}
}
private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true
requestPermissions(PermissionsResultCallbacks.onLocalStorageAuthenticated(cloud), //
R.string.permission_snackbar_auth_local_vault, //
Manifest.permission.READ_EXTERNAL_STORAGE, //
Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
}
@Callback
fun onLocalStorageAuthenticated(result: PermissionsResult, cloud: CloudModel) {
if (result.granted()) {
succeedAuthenticationWith(cloud.toCloud())
} else {
failAuthentication(PermissionNotGrantedException(R.string.permission_snackbar_auth_local_vault))
}
}
private fun encrypt(password: String): String {
return CredentialCryptor //
.getInstance(context()) //
.encrypt(password)
}
private inner class FailingAuthStrategy : AuthStrategy {
override fun supports(cloud: CloudModel): Boolean {
return false
}
override fun resumed(intent: AuthenticateCloudIntent) {
view?.showError(R.string.error_authentication_failed)
finish()
}
}
private interface AuthStrategy {
fun supports(cloud: CloudModel): Boolean
fun resumed(intent: AuthenticateCloudIntent)
}
companion object {
const val WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE = "acceptedUntrustedCertificate"
}
init {
unsubscribeOnDestroy(addOrChangeCloudConnectionUseCase, getUsernameUseCase)
}
}

View File

@ -28,9 +28,10 @@
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/AppTheme">
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<!-- Necessary for OneDrive https://stackoverflow.com/a/50779232/825532 -->
<uses-library
android:name="org.apache.http.legacy"
@ -66,8 +67,8 @@
<activity
android:name=".ui.activity.SharedFilesActivity"
android:taskAffinity=".share"
android:excludeFromRecents="true"
android:taskAffinity=".share"
android:windowSoftInputMode="stateHidden|adjustPan">
<intent-filter android:label="@string/share_with_label">
<action android:name="android.intent.action.SEND" />
@ -87,7 +88,7 @@
android:configChanges="orientation|keyboard"
android:launchMode="singleTask">
<intent-filter>
<data android:scheme="${DROPBOX_API_KEY_DB}" />
<data android:scheme="db-${DROPBOX_API_KEY}" />
<action android:name="android.intent.action.VIEW" />
@ -101,19 +102,17 @@
<!-- Settings -->
<activity android:name=".ui.activity.SettingsActivity" />
<activity android:name=".ui.activity.LicensesActivity" />
<activity android:name=".ui.activity.CloudSettingsActivity" />
<activity android:name=".ui.activity.WebDavAddOrChangeActivity" />
<activity android:name=".ui.activity.BiometricAuthSettingsActivity" />
<activity android:name=".ui.activity.CloudConnectionListActivity" />
<activity android:name=".ui.activity.CloudSettingsActivity" />
<activity android:name=".ui.activity.LicensesActivity" />
<activity android:name=".ui.activity.SettingsActivity" />
<activity android:name=".ui.activity.WebDavAddOrChangeActivity" />
<activity
android:name=".ui.activity.AuthenticateCloudActivity"
android:theme="@style/Theme.Transparent" />
<activity android:name=".ui.activity.BiometricAuthSettingsActivity" />
<activity
android:name=".ui.activity.ImagePreviewActivity"
android:theme="@style/FullscreenTheme" />
@ -121,15 +120,26 @@
<activity
android:name=".ui.activity.LicenseCheckActivity"
android:launchMode="singleTask">
<intent-filter android:label="@string/fab_transformation_scrim_behavior">
<intent-filter android:label="@string/dialog_enter_license_title">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="cryptomator"
android:host="*" />
android:host="*"
android:scheme="cryptomator" />
</intent-filter>
<intent-filter android:label="@string/dialog_enter_license_title">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="android.cryptomator.org"
android:pathPrefix="/app/license"
android:scheme="https" />
</intent-filter>
</activity>

View File

@ -42,8 +42,14 @@ class CryptomatorApp : MultiDexApplication(), HasComponent<ApplicationComponent>
override fun onCreate() {
super.onCreate()
setupLogging()
val flavor = if (BuildConfig.FLAVOR == "license") "License Edition" else "Google Play Edition"
val flavor = when (BuildConfig.FLAVOR) {
"apkstore" -> {
"APK Store Edition"
}
"fdroid" -> {
"F-Droid Edition"
} else -> "Google Play Edition"
}
Timber.tag("App").i("Cryptomator v%s (%d) \"%s\" started on android %s / API%d using a %s", //
BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, flavor, //
Build.VERSION.RELEASE, Build.VERSION.SDK_INT, //

View File

@ -0,0 +1,57 @@
package org.cryptomator.presentation.e;
import java.io.Serializable;
import java.util.Set;
/**
* This file is the obfuscated AutoUploadFilesStore of Cryptomator in version 1.5.10
* and is used to recover it in version 1.5.11 and 1.5.11-beta2
*
* TODO Delete as soon as possible
*
* See more information: https://github.com/cryptomator/android/issues/250
*/
public final class c implements Serializable {
public static final a Qb = new a();
private static final long serialVersionUID = -2190476748996271234L;
private final Set<String> vlb;
public c(Set<String> paramSet) {
this.vlb = paramSet;
}
public boolean equals(Object paramObject) {
if (this != paramObject) {
if (paramObject instanceof c) {
Object paramObject2 = ((c)paramObject).vlb;
return (this.vlb == null) ? ((paramObject2 == null)) : this.vlb.equals(paramObject2);
}
return false;
}
return true;
}
public int hashCode() {
Set<String> set = this.vlb;
return (set != null) ? set.hashCode() : 0;
}
public final Set<String> mE() {
return this.vlb;
}
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("AutoUploadFilesStore(uris=");
stringBuilder.append(this.vlb);
stringBuilder.append(")");
return stringBuilder.toString();
}
public static final class a {
private a() {}
}
}

View File

@ -0,0 +1,57 @@
package org.cryptomator.presentation.i;
import java.io.Serializable;
import java.util.Set;
/**
* This file is the obfuscated AutoUploadFilesStore of Cryptomator in version 1.5.11-beta1
* and is used to recover it in version 1.5.11-beta2
*
* TODO Delete as soon as possible
*
* See more information: https://github.com/cryptomator/android/issues/250
*/
public final class a implements Serializable {
private static final long serialVersionUID = 5147365921479820025L;
private final Set<String> b;
public a(Set<String> paramSet) {
this.b = paramSet;
}
public final Set<String> b() {
return this.b;
}
public boolean equals(Object paramObject) {
if (this != paramObject) {
if (paramObject instanceof a) {
Object paramObject2 = ((a)paramObject).b;
return (this.b == null) ? ((paramObject2 == null)) : this.b.equals(paramObject2);
}
return false;
}
return true;
}
public int hashCode() {
int bool;
Set<String> set = this.b;
if (set != null) {
bool = set.hashCode();
} else {
bool = 0;
}
return bool;
}
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("AutoUploadFilesStore(uris=");
stringBuilder.append(this.b);
stringBuilder.append(")");
return stringBuilder.toString();
}
}

View File

@ -5,6 +5,7 @@ import org.cryptomator.domain.di.PerView
import org.cryptomator.domain.exception.FatalBackendException
import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase
import org.cryptomator.generator.Callback
import org.cryptomator.presentation.BuildConfig
import org.cryptomator.presentation.R
import org.cryptomator.presentation.exception.ExceptionHandlers
import org.cryptomator.presentation.intent.Intents
@ -32,6 +33,11 @@ class ChooseCloudServicePresenter @Inject constructor( //
override fun resumed() {
val cloudTypeModels: MutableList<CloudTypeModel> = ArrayList(listOf(*CloudTypeModel.values()))
cloudTypeModels.remove(CloudTypeModel.CRYPTO)
if(BuildConfig.FLAVOR == "fdroid") {
cloudTypeModels.remove(CloudTypeModel.GOOGLE_DRIVE)
}
view?.render(cloudTypeModels)
}

View File

@ -9,6 +9,7 @@ import org.cryptomator.domain.usecases.cloud.GetAllCloudsUseCase
import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase
import org.cryptomator.domain.usecases.cloud.LogoutCloudUseCase
import org.cryptomator.generator.Callback
import org.cryptomator.presentation.BuildConfig
import org.cryptomator.presentation.R
import org.cryptomator.presentation.exception.ExceptionHandlers
import org.cryptomator.presentation.intent.Intents
@ -114,7 +115,10 @@ class CloudSettingsPresenter @Inject constructor( //
private inner class CloudsSubscriber : DefaultResultHandler<List<Cloud>>() {
override fun onSuccess(clouds: List<Cloud>) {
val cloudModel = cloudModelMapper.toModels(clouds).filter { isSingleLoginCloud(it) }.toMutableList() //
val cloudModel = cloudModelMapper.toModels(clouds) //
.filter { isSingleLoginCloud(it) } //
.filter { cloud -> !(BuildConfig.FLAVOR == "fdroid" && cloud.cloudType() == CloudTypeModel.GOOGLE_DRIVE)} //
.toMutableList() //
.also {
it.add(aWebdavCloud())
it.add(aLocalCloud())

View File

@ -16,8 +16,8 @@ class LicenseCheckPresenter @Inject internal constructor(
private val sharedPreferencesHandler: SharedPreferencesHandler) : Presenter<UpdateLicenseView>(exceptionHandlers) {
fun validate(data: Uri?) {
if (data != null) {
val license = data.lastPathSegment ?: ""
data?.let {
val license = it.fragment ?: it.lastPathSegment ?: ""
view?.showOrUpdateLicenseDialog(license)
doLicenseCheckUsecase
.withLicense(license)

View File

@ -66,9 +66,13 @@ class SettingsPresenter @Inject internal constructor(
}
private fun errorReportEmailBody(): String {
var variant = "PlayStore"
if (BuildConfig.FLAVOR == "license") {
variant = "ApkStore"
val variant = when (BuildConfig.FLAVOR) {
"apkstore" -> {
"APK Store"
}
"fdroid" -> {
"F-Droid"
} else -> "Google Play"
}
return StringBuilder().append("## ").append(context().getString(R.string.error_report_subject)).append("\n\n") //
.append("### ").append(context().getString(R.string.error_report_section_summary)).append('\n') //

View File

@ -105,12 +105,12 @@ class VaultListPresenter @Inject constructor( //
}
private fun checkLicense() {
if (BuildConfig.FLAVOR == "license") {
if (BuildConfig.FLAVOR == "apkstore" || BuildConfig.FLAVOR == "fdroid") {
licenseCheckUseCase //
.withLicense("") //
.run(object : NoOpResultHandler<LicenseCheck>() {
override fun onSuccess(licenseCheck: LicenseCheck) {
if (sharedPreferencesHandler.doUpdate()) {
if (BuildConfig.FLAVOR == "apkstore" && sharedPreferencesHandler.doUpdate()) {
checkForAppUpdates()
}
}

View File

@ -15,7 +15,9 @@ import android.provider.MediaStore
import android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
import androidx.annotation.RequiresApi
import org.cryptomator.domain.exception.FatalBackendException
import org.cryptomator.presentation.R
import org.cryptomator.presentation.util.FileUtil
import org.cryptomator.presentation.util.ResourceHelper
import org.cryptomator.util.file.MimeTypeMap_Factory
import org.cryptomator.util.file.MimeTypes
import timber.log.Timber
@ -121,7 +123,7 @@ class PhotoContentJob : JobService() {
private const val PHOTOS_CONTENT_JOB = 23
init {
val builder = JobInfo.Builder(PHOTOS_CONTENT_JOB, ComponentName("org.cryptomator", PhotoContentJob::class.java.name))
val builder = JobInfo.Builder(PHOTOS_CONTENT_JOB, ComponentName(ResourceHelper.getString(R.string.app_id), PhotoContentJob::class.java.name))
builder.addTriggerContentUri(JobInfo.TriggerContentUri(EXTERNAL_CONTENT_URI, FLAG_NOTIFY_FOR_DESCENDANTS))
builder.addTriggerContentUri(JobInfo.TriggerContentUri(MEDIA_URI, FLAG_NOTIFY_FOR_DESCENDANTS))
jobInfo = builder.build()

View File

@ -21,7 +21,7 @@ class CloudSettingsActivity : BaseActivity(), CloudSettingsView {
setSupportActionBar(toolbar)
}
override fun createFragment(): Fragment? = CloudSettingsFragment()
override fun createFragment(): Fragment = CloudSettingsFragment()
override fun render(cloudModels: List<CloudModel>) {
cloudSettingsFragment().showClouds(cloudModels)

View File

@ -1,11 +1,10 @@
package org.cryptomator.presentation.ui.fragment
import android.os.Bundle
import androidx.preference.PreferenceFragment
import androidx.preference.PreferenceFragmentCompat
import org.cryptomator.presentation.R
class LicensesFragment : PreferenceFragment() {
class LicensesFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.licenses)
}

View File

@ -148,18 +148,28 @@ class SettingsFragment : PreferenceFragmentCompat() {
}
private fun setupLicense() {
if (BuildConfig.FLAVOR == "license") {
findPreference(SharedPreferencesHandler.MAIL)?.title = format(getString(R.string.screen_settings_license_mail), sharedPreferencesHandler.mail())
setupUpdateCheck()
} else {
preferenceScreen.removePreference(findPreference(LICENSE_ITEM_KEY))
val versionCategory = findPreference("versionCategory") as PreferenceCategory?
versionCategory?.removePreference(findPreference(UPDATE_CHECK_ITEM_KEY))
versionCategory?.removePreference(findPreference(UPDATE_INTERVAL_ITEM_KEY))
when (BuildConfig.FLAVOR) {
"apkstore" -> {
findPreference(SharedPreferencesHandler.MAIL)?.title = format(getString(R.string.screen_settings_license_mail), sharedPreferencesHandler.mail())
setupUpdateCheck()
}
"fdroid" -> {
findPreference(SharedPreferencesHandler.MAIL)?.title = format(getString(R.string.screen_settings_license_mail), sharedPreferencesHandler.mail())
removeUpdateCheck()
}
else -> {
preferenceScreen.removePreference(findPreference(LICENSE_ITEM_KEY))
removeUpdateCheck()
}
}
}
private fun removeUpdateCheck() {
val versionCategory = findPreference("versionCategory") as PreferenceCategory?
versionCategory?.removePreference(findPreference(UPDATE_CHECK_ITEM_KEY))
versionCategory?.removePreference(findPreference(UPDATE_INTERVAL_ITEM_KEY))
}
fun setupUpdateCheck() {
val preference = findPreference(UPDATE_CHECK_ITEM_KEY)
@ -195,7 +205,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
findPreference(SharedPreferencesHandler.PHOTO_UPLOAD)?.onPreferenceChangeListener = useAutoPhotoUploadChangedListener
findPreference(SharedPreferencesHandler.USE_LRU_CACHE)?.onPreferenceChangeListener = useLruChangedListener
findPreference(SharedPreferencesHandler.LRU_CACHE_SIZE)?.onPreferenceChangeListener = useLruChangedListener
if (BuildConfig.FLAVOR == "license") {
if (BuildConfig.FLAVOR == "apkstore") {
findPreference(UPDATE_CHECK_ITEM_KEY)?.onPreferenceClickListener = updateCheckClickListener
}
}

View File

@ -2,7 +2,6 @@ package org.cryptomator.presentation.ui.layout
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
@ -10,6 +9,7 @@ import android.util.DisplayMetrics
import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout
import org.cryptomator.presentation.R
import timber.log.Timber
import kotlin.math.cos
import kotlin.math.sin
@ -44,18 +44,32 @@ class VaultListCoordinatorLayout : CoordinatorLayout {
val floatingActionButton = findViewById<View>(R.id.fab_vault)
val centerXOfHint = (vaultCreationHint.left + vaultCreationHint.right) / 2f
val bottomOfHint = vaultCreationHint.bottom.toFloat()
val leftOfFloatingActionButton = floatingActionButton.left.toFloat()
val topOfFloatingActionButton = floatingActionButton.top.toFloat()
arcFrom(centerXOfHint + dpToPixels(10f), bottomOfHint + dpToPixels(5f)) //
.to(leftOfFloatingActionButton - dpToPixels(3f), topOfFloatingActionButton + dpToPixels(5f)) //
.spanningAnAngleOf(60.0f) //
.build() //
.draw(canvas, strokeBlackWithWidthOf1f())
when (val layoutDirection = resources.configuration.layoutDirection) {
View.LAYOUT_DIRECTION_LTR -> {
arcFrom(centerXOfHint + dpToPixels(10f), bottomOfHint + dpToPixels(5f), layoutDirection) //
.to(floatingActionButton.left.toFloat() - dpToPixels(3f), topOfFloatingActionButton + dpToPixels(5f)) //
.spanningAnAngleOf(60.0f) //
.build() //
.draw(canvas, strokeLineWithWidthOf1f())
}
View.LAYOUT_DIRECTION_RTL -> {
arcFrom(floatingActionButton.right.toFloat() - dpToPixels(3f), bottomOfHint + dpToPixels(5f), layoutDirection) //
.to(centerXOfHint + dpToPixels(10f), topOfFloatingActionButton + dpToPixels(5f)) //
.spanningAnAngleOf(60.0f) //
.build() //
.draw(canvas, strokeLineWithWidthOf1f())
}
else -> {
Timber.tag("VaultListCoordinatorLay").e("Layout direction not supported, skip drawing arc")
}
}
}
private fun strokeBlackWithWidthOf1f(): Paint {
private fun strokeLineWithWidthOf1f(): Paint {
val paint = Paint()
paint.color = Color.BLACK
paint.color = context.getColor(R.color.textColorPrimary)
paint.strokeWidth = dpToPixels(1f)
paint.isAntiAlias = true
paint.style = Paint.Style.STROKE
@ -66,7 +80,7 @@ class VaultListCoordinatorLayout : CoordinatorLayout {
return dp * pixelsPerDp
}
private class ArcBuilder(val x1: Float, val y1: Float) {
private class ArcBuilder(val x1: Float, val y1: Float, val layoutDirection: Int) {
var angle = 0f
var x2 = 0f
var y2 = 0f
@ -95,6 +109,7 @@ class VaultListCoordinatorLayout : CoordinatorLayout {
private val bottom: Float
private val start: Float
private val angle: Float = b.angle
private val layoutDirection: Int = b.layoutDirection
fun draw(canvas: Canvas, paint: Paint) {
val rect = RectF()
@ -107,23 +122,51 @@ class VaultListCoordinatorLayout : CoordinatorLayout {
}
init {
start = 180f - angle
val sin = sin(TWO_PI * angle / 360).toFloat()
val cos = cos(TWO_PI * angle / 360).toFloat()
val widthCorrection = 1f / cos
val heightCorrection = 1f / sin
val w = (b.x2 - b.x1) * 2 * widthCorrection
val h = (b.y2 - b.y1) * 2 * heightCorrection
left = b.x1
right = b.x1 + w
start = when (layoutDirection) {
View.LAYOUT_DIRECTION_LTR -> {
180f - angle
}
View.LAYOUT_DIRECTION_RTL -> {
0f
}
else -> throw IllegalStateException("Not supported layout direction")
}
left = when (layoutDirection) {
View.LAYOUT_DIRECTION_LTR -> {
b.x1
}
View.LAYOUT_DIRECTION_RTL -> {
b.x2 - w
}
else -> throw IllegalStateException("Not supported layout direction")
}
right = when (layoutDirection) {
View.LAYOUT_DIRECTION_LTR -> {
b.x1 + w
}
View.LAYOUT_DIRECTION_RTL -> {
b.x2
}
else -> throw IllegalStateException("Not supported layout direction")
}
top = b.y1 - h / 2
bottom = b.y1 + h / 2
}
}
companion object {
private fun arcFrom(x1: Float, y1: Float): ArcBuilder {
return ArcBuilder(x1, y1)
private fun arcFrom(x1: Float, y1: Float, layoutDirection: Int): ArcBuilder {
return ArcBuilder(x1, y1, layoutDirection)
}
}
}

View File

@ -17,10 +17,9 @@ import java.io.*
import java.util.*
import javax.inject.Inject
class FileUtil @Inject constructor(private val context: Context, mimeTypes: MimeTypes) {
class FileUtil @Inject constructor(private val context: Context, private val mimeTypes: MimeTypes) {
private var decryptedFileStorage: File = File(context.cacheDir, "decrypted")
private val mimeTypes: MimeTypes = mimeTypes
fun cleanup() {
cleanupDir(context.cacheDir)
@ -126,7 +125,9 @@ class FileUtil @Inject constructor(private val context: Context, mimeTypes: Mime
fun getImagePreviewFiles(path: String): ImagePreviewFilesStore {
try {
ObjectInputStream(FileInputStream(path)).use { objectInputStream -> return objectInputStream.readObject() as ImagePreviewFilesStore }
ObjectInputStream(FileInputStream(path)).use { objectInputStream ->
return objectInputStream.readObject() as ImagePreviewFilesStore
}
} catch (e: ClassNotFoundException) {
Timber //
.tag("FileUtil") //
@ -140,40 +141,39 @@ class FileUtil @Inject constructor(private val context: Context, mimeTypes: Mime
}
}
fun addImageToAutoUploads(path: String) {
val file = File(decryptedFileStorage, AUTO_UPLOAD_IMAGE__FILE_NAMES)
val paths = getAutoUploadFilesStore(file).uris + path
addImageToAutoUploads(paths)
fun addImageToAutoUploads(path: String): AutoUploadFilesStore {
val paths = getAutoUploadFilesStore().uris + path
return addImageToAutoUploads(paths)
}
private fun addImageToAutoUploads(paths: Set<String>) {
addImageToAutoUploads(AutoUploadFilesStore(paths))
private fun addImageToAutoUploads(paths: Set<String>): AutoUploadFilesStore {
return addImageToAutoUploads(AutoUploadFilesStore(paths))
}
@Synchronized
private fun addImageToAutoUploads(autoUploadFilesStore: AutoUploadFilesStore) {
private fun addImageToAutoUploads(autoUploadFilesStore: AutoUploadFilesStore): AutoUploadFilesStore {
try {
decryptedFileStorage.mkdir()
val file = File(decryptedFileStorage, AUTO_UPLOAD_IMAGE__FILE_NAMES)
val out: ObjectOutput = ObjectOutputStream(FileOutputStream(file.path))
out.writeObject(autoUploadFilesStore)
out.close()
ObjectOutputStream(FileOutputStream(file.path)).use { objectOutputStream ->
objectOutputStream.writeObject(autoUploadFilesStore)
objectOutputStream.close()
}
return autoUploadFilesStore
} catch (e: IOException) {
Timber //
.tag("FileUtil") //
.e(e, "Failed to store image preview file list for PreviewActivity")
throw FatalBackendException(e)
}
}
@get:Throws(FatalBackendException::class)
val autoUploadFilesStore: AutoUploadFilesStore
get() {
val file = File(decryptedFileStorage, AUTO_UPLOAD_IMAGE__FILE_NAMES)
return getAutoUploadFilesStore(file)
}
@Synchronized
private fun getAutoUploadFilesStore(file: File): AutoUploadFilesStore {
fun getAutoUploadFilesStore(): AutoUploadFilesStore {
val file = File(decryptedFileStorage, AUTO_UPLOAD_IMAGE__FILE_NAMES)
if (!file.exists()) {
return AutoUploadFilesStore(HashSet())
}
@ -184,20 +184,9 @@ class FileUtil @Inject constructor(private val context: Context, mimeTypes: Mime
return autoUploadFilesStore
}
} catch (e: InvalidClassException) {
Timber //
.tag("FileUtil") //
.e(e, "This is a bug in Cryptomator version 1.4.1, only fix is to delete the AutoUploadFilesStore but no image inside so no problem")
if (!file.delete()) {
Timber //
.tag("FileUtil") //
.e("Failed to delete AutoUploadFilesStore")
}
throw FatalBackendException(e)
} catch (e: ClassNotFoundException) {
Timber //
.tag("FileUtil") //
.e(e, "Failed to read image preview file from list for PreviewActivity")
throw FatalBackendException(e)
return tryRecoverAutoUploadFilesStoreDueToFileObfuscation(file)
} catch (e: ClassCastException) {
return tryRecoverAutoUploadFilesStoreDueToFileObfuscation(file)
} catch (e: IOException) {
Timber
.tag("FileUtil")
@ -206,20 +195,47 @@ class FileUtil @Inject constructor(private val context: Context, mimeTypes: Mime
}
}
/**
* This method tries to recover the AutoUploadFilesStore which was obfuscated in version 1.5.10 and 1.5.11-beta1, each differently
*/
private fun tryRecoverAutoUploadFilesStoreDueToFileObfuscation(file: File): AutoUploadFilesStore {
Timber.tag("FileUtil").i("Try to recover AutoUploadFilesStore using class c or a")
try {
ObjectInputStream(FileInputStream(file)).use { objectInputStream ->
val uploadPaths = when (val obj = objectInputStream.readObject()) {
is org.cryptomator.presentation.e.c -> obj.mE() // version 1.5.10
is org.cryptomator.presentation.i.a -> obj.b() // version 1.5.11-beta1
else -> null
}
when {
uploadPaths != null -> {
Timber.tag("FileUtil").i("Nailed it! Successfully recovered AutoUploadFilesStore!")
file.delete()
return AutoUploadFilesStore(uploadPaths)
}
else -> throw FatalBackendException("Failed to recover AutoUploadFilesStore")
}
}
} catch (e: Exception) {
throw FatalBackendException("Failed to recover AutoUploadFilesStore", e)
}
}
@Synchronized
fun removeImagesFromAutoUploads(names: Set<String>) {
val autoUploadFilesStore = autoUploadFilesStore
fun removeImagesFromAutoUploads(names: Set<String>): AutoUploadFilesStore {
val autoUploadFilesStore = getAutoUploadFilesStore()
var paths = autoUploadFilesStore.uris
if (autoUploadFilesStore.uris.isEmpty()) {
return
return autoUploadFilesStore
}
val dirPath = File(autoUploadFilesStore.uris.iterator().next()).parent
names.forEach { name ->
paths = paths.minus(String.format("%s/%s", dirPath, name))
}
addImageToAutoUploads(paths)
return addImageToAutoUploads(paths)
}
class FileInfo(val name: String, mimeTypes: MimeTypes) {

View File

@ -11,6 +11,7 @@
android:layout_height="wrap_content" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/emptyDirIdFileInfoFragment"
android:name="org.cryptomator.presentation.ui.fragment.EmptyDirIdFileInfoFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@ -11,6 +11,7 @@
android:layout_height="wrap_content" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/licensesFragment"
android:name="org.cryptomator.presentation.ui.fragment.LicensesFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@ -5,8 +5,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".ui.activity.CreateVaultActivity"

View File

@ -22,8 +22,6 @@
android:layout_below="@id/tv_security_hint"
android:checked="true"
android:paddingEnd="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:text="@string/dialog_http_security_checkbox" />

View File

@ -4,8 +4,8 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView

View File

@ -18,9 +18,7 @@
android:layout_height="56dp"
android:gravity="center_vertical"
android:paddingStart="16dp"
android:paddingLeft="16dp"
android:paddingEnd="16dp"
android:paddingRight="16dp"
android:textSize="16sp" />
<TextView

View File

@ -23,8 +23,6 @@
android:layout_height="@dimen/thumbnail_size"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp" />
<LinearLayout

View File

@ -22,8 +22,6 @@
android:layout_height="@dimen/thumbnail_size"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp" />
<LinearLayout

View File

@ -23,8 +23,6 @@
android:layout_height="@dimen/thumbnail_size"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:src="@drawable/node_folder" />

View File

@ -18,8 +18,6 @@
android:ellipsize="middle"
android:gravity="center_vertical"
android:paddingEnd="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:singleLine="true"
android:textSize="16sp"

View File

@ -22,8 +22,6 @@
android:layout_width="@dimen/thumbnail_size"
android:layout_height="@dimen/thumbnail_size"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp" />
<LinearLayout

View File

@ -8,8 +8,8 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView

View File

@ -8,8 +8,8 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView

View File

@ -8,8 +8,8 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView

View File

@ -47,8 +47,6 @@
android:layout_height="wrap_content"
android:layout_below="@id/certificate_details"
android:paddingEnd="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:text="@string/dialog_accept_ssl_certificate_security_checkbox" />

View File

@ -22,8 +22,6 @@
android:layout_marginTop="27dp"
android:checked="true"
android:paddingEnd="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:text="@string/dialog_no_screen_lock_checkbox" />

View File

@ -12,8 +12,8 @@
android:id="@+id/file_upload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:textSize="20sp" />

View File

@ -8,8 +8,8 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView

View File

@ -17,8 +17,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginStart="5dp"
android:layout_toEndOf="@+id/cloud"
android:layout_toStartOf="@id/toggleBiometricAuth"

View File

@ -18,8 +18,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_toEndOf="@id/cloudImage"

View File

@ -18,8 +18,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_toEndOf="@id/cloudNodeImage"
android:layout_toStartOf="@+id/controls" />
@ -30,8 +28,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_toEndOf="@id/cloudNodeImage"

View File

@ -16,8 +16,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_toEndOf="@+id/cloudImage"
android:orientation="vertical">

View File

@ -17,8 +17,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_toEndOf="@+id/fileImage"
android:ellipsize="middle"

View File

@ -17,8 +17,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_toEndOf="@+id/cloudImage"
android:layout_toStartOf="@+id/unlockedImage"
@ -52,8 +50,8 @@
android:layout_toStartOf="@+id/settings"
android:background="?android:attr/selectableItemBackground"
android:paddingBottom="10dp"
android:paddingLeft="14dp"
android:paddingRight="14dp"
android:paddingStart="14dp"
android:paddingEnd="14dp"
android:paddingTop="10dp"
android:src="@drawable/vault_unlocked"
app:tint="@color/colorPrimary"

View File

@ -19,8 +19,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_toEndOf="@id/iv_cloud_model_image" />

View File

@ -5,8 +5,8 @@
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="gone">
<TextView

View File

@ -4,8 +4,8 @@
android:id="@+id/ll_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="visible">
<RelativeLayout

View File

@ -5,8 +5,8 @@
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="gone">
<ProgressBar style="@style/AppTheme.ProgressBar" />

View File

@ -1,11 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- # app -->
<string name="app_name">Cryptomator</string>
<string name="share_with_label">Verschlüsseln</string>
<string name="download_subdirectory_name">@string/app_name</string>
<!-- # error messages -->
<string name="error_generic">Ein Fehler ist aufgetreten</string>
<string name="error_authentication_failed">Authentifizierung fehlgeschlagen</string>
@ -29,134 +25,92 @@
<string name="error_failed_to_decrypt_webdav_password">Beim entschlüsseln des WebDAV-Passworts trat ein Fehler auf. Bitte in den Einstellungen erneut festlegen.</string>
<string name="error_play_services_not_available">Die Play Services sind nicht installiert</string>
<string name="error_biometric_auth_aborted">Biometrischer Login abgebrochen</string>
<!-- # clouds -->
<!-- ## cloud names -->
<string name="cloud_names_crypto">Crypto</string>
<string name="cloud_names_dropbox">Dropbox</string>
<string name="cloud_names_google_drive">Google Drive</string>
<string name="cloud_names_onedrive">OneDrive</string>
<string name="cloud_names_webdav">WebDAV</string>
<string name="cloud_names_local_storage">Lokaler Speicher</string>
<!-- # permission -->
<!-- ## permission messages -->
<string name="permission_message_export_file">Erlauben Sie Cryptomator Zugriff auf Ihren Speicher, um eine Datei zu exportieren</string>
<string name="permission_message_upload_file">Erlauben Sie Cryptomator Zugriff auf Ihren Speicher, um eine Datei hochzuladen</string>
<string name="permission_message_share_file">Erlauben Sie Cryptomator Zugriff auf Ihren Speicher, um eine Datei zu teilen</string>
<string name="snack_bar_action_title_settings">Einstellungen</string>
<string name="snack_bar_action_title_search">Suche</string>
<string name="snack_bar_action_title_search_next">Weiter</string>
<string name="snack_bar_action_title_search_previous">Vorheriges</string>
<string name="snack_bar_action_title_search_next">Weiter</string>
<string name="snack_bar_action_title_sort">Sortieren</string>
<string name="snack_bar_action_title_sort_az">A - Z</string>
<string name="snack_bar_action_title_sort_za">Z - A</string>
<string name="snack_bar_action_title_sort_newest">Neueste zuerst</string>
<string name="snack_bar_action_title_sort_oldest">Älteste zuerst</string>
<string name="snack_bar_action_title_sort_biggest">Größte zuerst</string>
<string name="snack_bar_action_title_sort_smallest">Kleinste zuerst</string>
<!-- # screens -->
<!-- # screen: vault list -->
<string name="screen_vault_list_actions_title">Zu Cryptomator hinzufügen</string>
<string name="screen_vault_list_action_create_new_vault">Neuen Tresor anlegen</string>
<string name="screen_vault_list_action_add_existing_vault">Vorhandenen Tresor hinzufügen</string>
<string name="screen_vault_list_vault_action_rename">@string/screen_file_browser_node_action_rename</string>
<string name="screen_vault_list_vault_action_delete">Entfernen</string>
<string name="screen_vault_list_vault_creation_hint">Hier einen neuen Tresor erstellen</string>
<string name="screen_vault_list_change_password_successful">Passwort wurde erfolgreich geändert</string>
<!-- # screen: file browser -->
<string name="screen_file_browser_default_title">Tresor</string>
<string name="screen_file_browser_subtitle_add_existing_vault">Neuen Tresor anlegen</string>
<string name="screen_file_browser_add_existing_vault_extra_text">Masterkey-Datei auswählen</string>
<string name="screen_file_browser_subtitle_create_new_vault">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_file_browser_create_new_vault_button_text">Hier ablegen</string>
<string name="screen_file_browser_create_new_vault_extra_text">Tresorname: %1$s</string>
<string name="screen_file_browser_move_button_text">Verschieben</string>
<plurals name="screen_file_browser_subtitle_move">
<item quantity="one">Verschieben von %1$s nach</item>
<item quantity="other">%2$d Elemente verschieben nach</item>
</plurals>
<string name="screen_file_browser_move_button_text">Verschieben</string>
<string name="screen_file_browser_msg_empty_folder">Leerer Ordner</string>
<string name="screen_file_browser_file_info_label_size">%1$s</string>
<string name="screen_file_browser_file_info_label_date">geändert vor %1$s</string>
<string name="screen_file_browser_share_intent_chooser_title">Teilen mit</string>
<string name="screen_file_browser_share_destination_title">Wählen Sie einen Ablageort aus</string>
<string name="screen_file_browser_share_button_text">Auswählen</string>
<string name="screen_file_browser_nothing_to_share">Nichts zum teilen</string>
<string name="screen_file_browser_actions_title">Zu %1$s hinzufügen</string>
<string name="screen_file_browser_action_create_folder">Ordner erstellen</string>
<string name="screen_file_browser_action_create_new_text_file">Text-Datei erstellen</string>
<string name="screen_file_browser_action_upload_files">Dateien hochladen</string>
<string name="screen_file_browser_upload_files_chooser_title">Dateien</string>
<string name="screen_file_browser_msg_file_exported">Datei exportiert</string>
<string name="screen_file_browser_msg_files_exported">Dateien exportiert</string>
<string name="screen_file_browser_nothing_to_export">Nichts zum exportieren</string>
<string name="screen_file_browser_msg_creating_download_dir_failed">Download-Verzeichnis konnte nicht erstellt werden</string>
<string name="screen_file_browser_node_action_share">Teilen</string>
<string name="screen_file_browser_node_action_rename">Umbenennen</string>
<string name="screen_file_browser_node_action_edit_text">Bearbeiten</string>
<string name="screen_file_browser_node_action_move">@string/screen_file_browser_move_button_text</string>
<string name="screen_file_browser_node_action_export">Exportieren</string>
<string name="screen_file_browser_node_action_delete">Löschen</string>
<string name="screen_file_browser_node_action_open_with_text">Öffnen mit&#8230;</string>
<string name="screen_file_browser_no_connection_message">Keine Verbindung</string>
<string name="screen_file_browser_no_connection_button_text">Wiederholen</string>
<string name="screen_file_browser_selection_mode_title_zero_elements">Elemente auswählen</string>
<string name="screen_file_browser_selection_mode_title_one_or_more_elements">%1$d ausgewählt</string>
<string name="screen_file_browser_select_items">Elemente auswählen</string>
<string name="screen_file_browser_select_all_items">Alle elemente auswählen</string>
<string name="screen_file_browser_refresh_items">Aktualisieren</string>
<string name="screen_file_browser_msg_files_exported">Dateien exportiert</string>
<string name="screen_file_browser_no_connection_message">Keine Verbindung</string>
<string name="screen_file_browser_no_connection_button_text">Wiederholen</string>
<!-- ## screen: text editor -->
<string name="screen_text_editor_save_success">Erfolgreich gespeichert</string>
<!-- ## screen: share files -->
<string name="screen_share_files_title">Speicher %1$s unter&#8230;</string>
<string name="screen_share_files_content_text">text</string>
<string name="screen_share_files_content_file">Datei</string>
<string name="screen_share_files_content_files">Dateien</string>
<string name="screen_share_files_msg_filenames_must_be_unique">Dateinamen müssen eindeutig sein, bitte benennen Sie die Duplikate um.</string>
<string name="screen_share_files_section_files">@string/screen_share_files_content_files</string>
<string name="screen_share_files_section_location">Speicherort</string>
<string name="screen_share_files_save_button_text">Speichern</string>
<string name="screen_share_files_msg_success">Dateien verschlüsselt</string>
<string name="screen_share_files_new_text_file">text.txt</string>
<!-- ## screen: choose cloud service -->
<string name="screen_choose_cloud_service_title">Cloud-Dienst</string>
<string name="screen_choose_cloud_service_subtitle_add_existing_vault">@string/screen_vault_list_action_add_existing_vault</string>
<string name="screen_choose_cloud_service_subtitle_create_new_vault">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_choose_cloud_service_subtitle_add_existing_vault">Neuen Tresor anlegen</string>
<!-- ## screen: cloud connections -->
<string name="screen_cloud_connections_title">Ort auswählen</string>
<string name="screen_cloud_settings_option_edit">@string/screen_file_browser_node_action_edit_text</string>
<string name="screen_cloud_settings_option_delete">@string/screen_vault_list_vault_action_delete</string>
<string name="screen_cloud_connections_no_connections">Hier einen neuen Ort hinzufügen</string>
<string name="screen_cloud_error_webdav_not_supported">Server scheint nicht WebDAV-kompatibel zu sein</string>
<string name="screen_cloud_local_custom_storage_title">Benutzerdefinierte Orte</string>
<string name="screen_cloud_local_default_storage_title">Standard-Speicher</string>
<string name="screen_cloud_local_error_no_content_provider">Weitere Orte sind nicht verfügbar.</string>
<!-- ## screen: webdav settings -->
<string name="screen_webdav_settings_title">@string/cloud_names_webdav</string>
<string name="screen_webdav_settings_url_port_label">URL</string>
<string name="screen_webdav_settings_username_label">Benutzername</string>
<string name="screen_webdav_settings_password_label">Passwort</string>
<string name="screen_webdav_settings_done_button_text">Verbinden</string>
@ -164,31 +118,23 @@
<string name="screen_webdav_settings_msg_url_is_invalid">URL ist ungültig.</string>
<string name="screen_webdav_settings_msg_username_must_not_be_empty">Benutzername muss ausgefüllt werden.</string>
<string name="screen_webdav_settings_msg_password_must_not_be_empty">Passwort muss ausgefüllt werden.</string>
<!-- ## screen: enter vault name -->
<string name="screen_enter_vault_name_title">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_enter_vault_name_msg_name_empty">Tresorname muss ausgefüllt werden.</string>
<string name="screen_enter_vault_name_vault_label">Tresorname</string>
<string name="screen_enter_vault_name_button_text">Erstellen</string>
<!-- ## screen: set password -->
<string name="screen_set_password_title">Passwort setzen</string>
<string name="screen_set_password_msg_password_empty">Passwort muss ausgefüllt werden.</string>
<string name="screen_set_password_msg_password_mismatch">Passwort stimmt nicht mit dem wiederholten Passwort überein.</string>
<string name="screen_set_password_button_text">Fertig</string>
<string name="screen_set_password_hint">WICHTIG: Wenn Sie Ihr Passwort vergessen, gibt es keine Möglichkeit die Daten zu entschlüsseln.</string>
<string name="screen_set_password_password_label">@string/screen_webdav_settings_password_label</string>
<string name="screen_set_password_retype_password_label">Passwort wiederholen</string>
<string name="screen_set_password_strength_indicator_0">Sehr Schwach</string>
<string name="screen_set_password_strength_indicator_1">Schwach</string>
<string name="screen_set_password_strength_indicator_2">Mittel</string>
<string name="screen_set_password_strength_indicator_3">Stark</string>
<string name="screen_set_password_strength_indicator_4">Sehr Stark</string>
<!-- ## screen: settings -->
<string name="screen_settings_title">@string/snack_bar_action_title_settings</string>
<string name="screen_settings_section_general">Allgemein</string>
<string name="screen_settings_cloud_settings_label">Cloud-Dienste</string>
<string name="screen_settings_biometric_auth">Biometrischer Login</string>
@ -196,95 +142,62 @@
<string name="screen_settings_confirm_face_unlock">Nach Entsperrung mittels dem Gesichts, bestätigen (falls verfügbar)</string>
<string name="screen_settings_block_app_when_obscured">App blockieren, wenn verdeckt</string>
<string name="screen_settings_secure_screen">Bildschirm-Sicherheit</string>
<string name="screen_settings_section_search">Search</string>
<string name="screen_settings_section_search">Suche</string>
<string name="screen_settings_live_search">Live-Suche</string>
<string name="screen_settings_glob_search">Suche mit Glob-Muster</string>
<string name="screen_settings_section_auto_lock">Automatisch sperren</string>
<string name="screen_settings_auto_lock_timeout">Sperren nach</string>
<string name="screen_settings_auto_lock_on_screen_lock">Bei deaktiviertem Bildschirm</string>
<string name="screen_settings_section_auto_photo_upload">Automatisches Photo-Hochladen</string>
<string name="screen_settings_section_auto_photo_upload_vault">Tresor auswählen für das Hochladen</string>
<string name="screen_settings_section_auto_photo_upload_toggle">Aktivieren</string>
<string name="screen_settings_section_auto_photo_upload_only_wifi_toggle">Nur mit WLAN hochladen</string>
<string name="screen_settings_auto_photo_upload_title">Bilder abspeichern in&#8230;</string>
<string name="screen_settings_section_social">Uns folgen</string>
<string name="screen_settings_website_label">Cryptomator-Website</string>
<string name="screen_settings_twitter_label">Folgen Sie uns auf Twitter</string>
<string name="screen_settings_facebook_label">Liken Sie uns auf Facebook</string>
<string name="screen_settings_website_uri">https://cryptomator.org/de</string>
<string name="screen_settings_twitter_uri">https://twitter.com/Cryptomator</string>
<string name="screen_settings_facebook_uri">https://facebook.com/Cryptomator</string>
<string name="screen_settings_section_legal">Rechtliches</string>
<string name="screen_settings_licenses_label">Lizenzen</string>
<string name="screen_settings_license_terms_label">Lizenztexte</string>
<string name="screen_settings_section_support">Support</string>
<string name="screen_settings_contact_label">Hilfe anfordern</string>
<string name="screen_settings_support_uri">https://cryptomator.org/de/contact/</string>
<string name="screen_settings_debug_mode_label">Debug-Modus</string>
<string name="screen_settings_error_report_label">Log-Datei senden</string>
<string name="screen_settings_error_report_failed">Senden fehlgeschlagen</string>
<string name="screen_settings_security_label">Sicherheitshinweise</string>
<string name="screen_settings_security_url">https://docs.cryptomator.org/en/1.5/security/best-practices/</string>
<string name="screen_settings_section_version">Version</string>
<string name="screen_settings_keep_unlocked_while_editing_files">Halte Tresore geöffnet während dem Editieren einer Datei</string>
<string name="screen_settings_advanced_settings">Erweiterte Eigenschaften</string>
<string name="screen_settings_background_unlock_preparation_label">Vorbereitungen zum Entsperren im Hintergrund</string>
<!-- ## screen: cloud settings -->
<string name="screen_cloud_settings_title">@string/screen_settings_cloud_settings_label</string>
<string name="screen_cloud_settings_webdav_connections">WebDAV-Verbindungen</string>
<string name="screen_cloud_settings_local_storage_locations">Lokale Speicherorte</string>
<string name="screen_cloud_settings_log_in_to">Einloggen in</string>
<string name="screen_cloud_settings_sign_out_from_cloud">Abmelden von</string>
<string name="screen_settings_advanced_settings">Erweiterte Eigenschaften</string>
<string name="screen_settings_background_unlock_preparation_label">Vorbereitungen zum Entsperren im Hintergrund</string>
<!-- ## screen: licenses -->
<string name="screen_licenses_title">@string/screen_settings_licenses_label</string>
<!-- ## screen: dropbox auth -->
<!-- ## screen: authenticate cloud -->
<string name="screen_authenticate_auth_authentication_failed">%1$s-Authentifizierung fehlgeschlagen.</string>
<!-- ## screen: empty dir file info -->
<string name="screen_empty_dir_file_info_title">\'%1$s\' nicht erreichbar</string>
<string name="screen_empty_dir_file_info_headline">Cryptomator hat erkannt, dass dieser Ordner nicht erreichbar ist.</string>
<string name="screen_empty_dir_file_info_text">Möglicherweise wurde dieser durch eine andere Anwendung gelöscht oder wurde durch eine fehlerhafte Synchronisation mit der Cloud verursacht.\n\nVersuchen Sie die Verzeichnisdatei über Ihren Cloud-Anbieter auf eine vorhergehende Version, die nicht leer ist, wiederherzustellen. Die betroffene Datei ist:\n%1$s\n\nFalls dies nicht funktioniert, könnten Sie Sanitizer verwenden, um Ihren Tresor auf Fehler zu überprüfen und möglicherweise Daten wiederherzustellen.</string>
<string name="screen_empty_dir_file_info_button_label">Mehr über Sanitizer</string>
<!-- ## screen: insecure android version info -->
<!-- # dialogs -->
<string name="dialog_button_cancel">Abbrechen</string>
<string name="dialog_create_folder_title">@string/screen_file_browser_action_create_folder</string>
<string name="dialog_create_folder_positive_button">@string/screen_enter_vault_name_button_text</string>
<string name="dialog_enter_password_password_label">@string/screen_webdav_settings_password_label</string>
<string name="dialog_enter_password_positive_button">Entsperren</string>
<string name="dialog_change_password_old_password_label">Altes Passwort</string>
<string name="dialog_change_password_new_password_label">Neues Passwort</string>
<string name="dialog_change_password_new_retype_password_label">@string/screen_set_password_retype_password_label</string>
<string name="dialog_change_password">Passwort ändern</string>
<string name="dialog_change_password_msg_old_password_empty">Altes Passwort muss ausgefüllt werden.</string>
<string name="dialog_change_password_msg_new_password_empty">Neues Passwort muss ausgefüllt werden.</string>
<string name="dialog_change_password_msg_password_mismatch">Neue Passwort stimmt nicht mit dem wiederholten Passwort überein.</string>
<!-- Vault not found -->
<string name="dialog_vault_not_found_title">Tresor %1$s nicht gefunden</string>
<string name="dialog_vault_not_found_message">Der Tresor wurde umbenannt, verschoben oder gelöscht. Entfernen Sie diesen aus der Tresorliste und fügen Sie ihn erneut hinzu um fortzufahren. Tresor jetzt entfernen?</string>
<string name="dialog_vault_not_found_positive_button_text">Entfernen</string>
<string name="dialog_existing_file_title">Datei existiert bereits</string>
<string name="dialog_existing_file_positive_button">Ersetzen</string>
<string name="dialog_existing_file_message">Eine Datei namens \'%1$s\' existiert bereits.</string>
<string name="dialog_replace_negative_button_at_least_two_but_not_all_files_exist">Existierende überspringen</string>
<string name="dialog_replace_positive_button_all_files_exist">Alle ersetzen</string>
<string name="dialog_replace_positive_button_some_files_exist">Existierende ersetzen</string>
@ -294,49 +207,28 @@
<string name="dialog_replace_msg_some_files_exists">%d Dateien existieren bereits. Sollen diese ersetzt werden?</string>
<string name="dialog_replace_title_single_file_exists">Datei ersetzen?</string>
<string name="dialog_replace_title_multiple_files_exist">Dateien ersetzen?</string>
<string name="dialog_unable_to_share_title">Teilen nicht möglich</string>
<string name="dialog_unable_to_share_message">Sie haben keinen Tresor eingerichtet. Bitte legen Sie zuerst einen Tresor mit der Cryptomator-App an.</string>
<string name="dialog_unable_to_share_positive_button">OK</string>
<string name="dialog_unable_to_share_negative_button">Tresor erstellen</string>
<string name="dialog_filetype_not_supported_title">%1$s kann nicht geöffnet werden</string>
<string name="dialog_filetype_not_supported_positive_button">@string/screen_file_browser_node_action_export</string>
<string name="dialog_filetype_not_supported_message">Bitte installieren Sie eine App, die diese Datei öffnen kann. Möchten Sie die Datei stattdessen auf dem Gerät speichern?</string>
<string name="dialog_rename_vault_title">Tresor umbenennen</string>
<string name="dialog_rename_vault_positive_button">@string/screen_file_browser_node_action_rename</string>
<string name="dialog_rename_node_folder_title">Ordner umbenennen</string>
<string name="dialog_rename_node_file_title">Datei umbenennen</string>
<string name="dialog_rename_node_positive_button">@string/screen_file_browser_node_action_rename</string>
<string name="dialog_unsaved_changes_title">Sie haben ungespeicherte Änderungen</string>
<string name="dialog_unsaved_changes_message">Möchten Sie wirklich beenden, ohne zu speichern?</string>
<string name="dialog_unsaved_changes_discard">Verwerfen</string>
<string name="dialog_unsaved_changes_save">@string/dialog_button_cancel</string>
<string name="dialog_file_name_title">@string/screen_file_browser_action_create_new_text_file</string>
<string name="dialog_file_name_create">@string/screen_enter_vault_name_button_text</string>
<string name="dialog_file_name_cancel">@string/dialog_button_cancel</string>
<string name="dialog_file_name_placeholder">@string/screen_share_files_new_text_file</string>
<string name="dialog_delete_vault_positive_button_text">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_delete_vault_message">Sind Sie sicher, dass sie den Tresor entfernen wollen?</string>
<string name="dialog_delete_vault_hint">Dieser Vorgang wird den Tresor nur aus dieser Liste entfernen und nicht tatsächlich löschen.</string>
<string name="dialog_upload_file_title">Lade hoch&#8230;</string>
<string name="dialog_upload_file_cancel_button">@string/dialog_button_cancel</string>
<string name="dialog_upload_file_remaining">Datei %1$d von %2$d</string>
<string name="dialog_export_file_title">Exportiere (%1$d/%2$d)</string>
<string name="dialog_export_file_cancel_button">@string/dialog_button_cancel</string>
<string name="dialog_progress_please_wait">Bitte warten&#8230;</string>
<string name="dialog_progress_creating_folder">Erstelle Ordner&#8230;</string>
<string name="dialog_progress_creating_text_file">Erstelle Text-Datei&#8230;</string>
<string name="action_progress_authentication">Authentifizierung&#8230;</string>
<string name="action_progress_renaming">Benenne um&#8230;</string>
<string name="action_progress_deleting">Lösche&#8230;</string>
<string name="dialog_progress_unlocking_vault">Entsperre Tresor&#8230;</string>
@ -348,105 +240,63 @@
<string name="dialog_progress_decryption">Entschlüssele&#8230;</string>
<string name="action_progress_moving">Verschiebe&#8230;</string>
<string name="dialog_lock_vault">Sperren</string>
<string name="dialog_accept_ssl_certificate_title">Ungültiges SSL-Zertifikat</string>
<string name="dialog_accept_ssl_certificate_hint">Das SSL-Zertifikat ist ungültig. Wollen Sie diesem trotzdem vertrauen?</string>
<string name="dialog_accept_ssl_certificate_details">Details</string>
<string name="dialog_accept_ssl_certificate_security_checkbox">Dies könnte ein Sicherheitsrisiko sein. Ich weiß was ich tue.</string>
<string name="dialog_http_security_hint">Die Verwendung von HTTP ist unsicher. Wir empfehlen stattdessen die Nutzung von HTTPS. Wenn Sie sich der Risiken bewusst sind, können Sie mit HTTP fortfahren.</string>
<string name="dialog_http_security_checkbox">Zu HTTPS ändern</string>
<string name="dialog_http_security_title">HTTPS nutzen?</string>
<string name="dialog_no_screen_lock_hint">Kein Sperrbildschirm ist gesetzt. Um Ihre Passwörter sicher speichern zu können, setzen Sie bitte mit OK ein Muster oder ein Passwort.</string>
<string name="dialog_no_screen_lock_title">Sperrbildschirm setzen?</string>
<string name="dialog_no_screen_lock_checkbox">Sperrbildschirm setzen</string>
<string name="dialog_no_biometric_auth_set_up_title">Kein Fingerabdruck/Gesicht im System</string>
<string name="dialog_no_biometric_auth_set_up_message">Legen Sie mindestens einen Fingerabdruck/Gesicht im System an, um diesen Dienst nutzen zu können.</string>
<string name="dialog_debug_mode_disclaimer_hint">In diesem Modus könnten sensible Daten in eine Log-Datei auf diesem Gerät geschrieben werden (z.B. Dateinamen und Pfade). Ausgeschlossen davon sind u.a. Passwörter und Cookies.\n\nDenken Sie daran, den Debug-Modus so schnell wie möglich wieder zu deaktivieren.</string>
<string name="dialog_debug_mode_disclaimer_title">Achtung</string>
<string name="dialog_debug_mode_positive_button">Aktivieren</string>
<string name="dialog_debug_mode_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_disable_app_obscured_disclaimer_hint">Dies ist eine Sicherheitsfunktion und verhindert, dass andere Apps Nutzer dazu bringen, Dinge zu tun, die sie nicht tun wollen.\n\nDurch die Deaktivierung bestätigen Sie, dass Sie sich <a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">der Risiken bewusst</a> sind.</string>
<string name="dialog_disable_app_obscured_disclaimer_title">Achtung</string>
<string name="dialog_disable_app_obscured_positive_button">Deaktivieren</string>
<string name="dialog_disable_app_obscured_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_app_is_obscured_info_title">App wird verdeckt</string>
<string name="dialog_app_is_obscured_info_hint">Eine App zeigt etwas über Cryptomator an (z.B. ein Blaulichtfilter oder eine Nachtmodus-App). Aus Sicherheitsgründen ist Cryptomator deaktiviert.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Wie Cryptomator aktiviert werden kann</a></string>
<string name="dialog_app_is_obscured_info_neutral_button">Schließen</string>
<string name="dialog_disable_secure_screen_disclaimer_hint">Dies ist eine Sicherheitsfunktion und verhindert, dass andere Apps Nutzer dazu bringen, Dinge zu tun, die sie nicht tun wollen.\n\nDurch die Deaktivierung bestätigen Sie, dass Sie sich <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">der Risiken bewusst</a> sind.</string>
<string name="dialog_delete_cloud_connection_with_vaults_message">Sind Sie sicher, dass sie den Cloud-Dienst entfernen wollen?</string>
<string name="dialog_delete_cloud_connection_with_vaults_hint">Dieser Vorgang wird den Cloud-Dienst und desen zugehörigen Tresor löschen.</string>
<string name="dialog_delete_cloud_connection_with_vaults_positive_button">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_delete_cloud_connection_with_vaults_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_confirm_delete_positive_button">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_confirm_delete_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_confirm_delete_multiple_title">%1$d Elemente löschen?</string>
<string name="dialog_confirm_delete_multiple_message">Sind Sie sicher, dass Sie diese Elemente löschen wollen?</string>
<string name="dialog_confirm_delete_file_message">Sind Sie sicher, dass Sie diese Datei löschen wollen?</string>
<string name="dialog_confirm_delete_folder_message">Dieser Vorgang wird den gesamten Ordnerinhalt löschen. Sind Sie sicher, dass Sie diesen Ordner löschen wollen?</string>
<string name="dialog_biometric_auth_key_invalidated_title">Biometrischer Login deaktiviert</string>
<string name="dialog_biometric_auth_key_invalidated_message">Da der Schlüssel nicht mehr zur Verfügung steht, wurde der Biometrischer Login deaktiviert. Zur Reaktivierung öffnen Sie die Cryptomator-Einstellungen.</string>
<string name="dialog_biometric_auth_key_invalidated_neutral_button">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_beta_confirmation_title">Beta-Version</string>
<string name="dialog_beta_confirmation">Das ist eine Beta-Version, die das Tresor-Format 7 unterstützt. Bitte nicht mit einem produktiv eingesetzten Tresor verwenden oder dafür sorgen, dass gute Sicherungen vorhanden sind.</string>
<string name="dialog_enter_license_title">APK-Store Lizenz</string>
<string name="dialog_enter_license_content">Cryptomator wurde ohne Google Play Store installiert. Geben Sie eine gültige Lizenz ein, falls nicht bereits vorhanden, kann sie unter folgender URL erworben werden: <a href="https://cryptomator.org/android/">https://cryptomator.org/android/</a></string>
<string name="dialog_enter_license_not_valid_content">Die eingegebene Lizenz ist nicht gültig. Stellen Sie sicher, dass sie korrekt eingegeben wurde.</string>
<string name="dialog_enter_license_no_content">Keine Lizenz vorhanden. Geben Sie eine gültige Lizenz ein.</string>
<string name="dialog_enter_license_ok_button">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_enter_license_decline_button">Beenden</string>
<string name="dialog_license_confirmation_message">Danke für die Eingabe Ihrer gültige Lizenz %1$s.</string>
<string name="dialog_license_confirmation_title">Lizenzbestätigung</string>
<string name="dialog_license_confirmation_ok_btn">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_license_confirmation_message">Danke für die Eingabe Ihrer gültige Lizenz %1$s.</string>
<string name="dialog_update_available_title">Neue Version verfügbar</string>
<string name="dialog_update_available_message">Cryptomator mit auf den aktuellen Stand aktualisieren. Mit OK wird die neueste Version heruntergeladen. Daraufhin werden Sie aufgefordert sie zu installieren.</string>
<string name="dialog_update_available_update">Jetzt aktualisieren</string>
<string name="dialog_update_available_download_site">Download-Seite öffnen</string>
<string name="dialog_update_available_cancel">Später</string>
<string name="dialog_download_update_title">Download in Ausführung</string>
<string name="dialog_download_update_message">Lade die aktuelle Version von Cryptomator herunter</string>
<string name="dialog_sym_link_title">Dieser Ordner ist ein symbolischer Link</string>
<string name="dialog_sym_link_message">Sie können nicht in diesen symbolischen Link navigieren</string>
<string name="dialog_sym_link_back_button">Zurück</string>
<string name="dialog_no_dir_file_title">Verzeichniss kann nicht geladen werden</string>
<string name="dialog_no_dir_file_message">Der Ordner \'%1$s\' in der Cloud hat keine Verzeichniss-Datei. Es könnte sein, dass der Ordner auf einem anderen Gerät erstellt wurde und noch nicht vollständig mit der Cloud synchronisiert ist. Bitte überprüfen, ob die folgende Datei in der Cloud existiert:\n%2$s</string>
<string name="dialog_no_dir_file_back_button">@string/dialog_sym_link_back_button</string>
<string name="dialog_beta_confirmation_title">Beta-Version</string>
<string name="dialog_beta_confirmation">Das ist eine Beta-Version, die das Tresor-Format 7 unterstützt. Bitte nicht mit einem produktiv eingesetzten Tresor verwenden oder dafür sorgen, dass gute Sicherungen vorhanden sind.</string>
<string name="permission_snackbar_auth_local_vault">Cryptomator benötigt Zugriff auf den Speicher um lokale Tresore zu nutzen</string>
<string name="permission_snackbar_auth_auto_upload">Cryptomator benötigt Zugriff auf den Speicher um den automatischen Foto-Upload zu nutzen</string>
<!-- # error reports -->
<string name="error_report_subject">Android Fehlerbericht</string>
<string name="error_report_section_summary">Zusammenfassung</string>
<string name="error_report_summary_description">Beschreiben Sie ausführlich, was sie in der App getan haben oder verweisen Sie auf ein existierendes Support-Ticket.</string>
<string name="error_report_section_device">Geräteinfo</string>
<!-- # misc -->
<!-- ## file size helper -->
<string name="file_size_zero">Null kB</string>
<string name="file_size_unit_bytes">Bytes</string>
<string name="file_size_unit_kilo_bytes">kB</string>
<string name="file_size_unit_mega_bytes">MB</string>
<string name="file_size_unit_giga_bytes">GB</string>
<string name="file_size_unit_tera_bytes">TB</string>
<!-- ## date helper -->
<string name="time_unit_seconds_sg">Sekunde</string>
<string name="time_unit_seconds_pl">Sekunden</string>
@ -462,52 +312,38 @@
<string name="time_unit_months_pl">Monate</string>
<string name="time_unit_years_sg">Jahr</string>
<string name="time_unit_years_pl">Jahre</string>
<!-- ## biometric authentication -->
<string name="dialog_biometric_auth_title">Biometrischer Login</string>
<string name="dialog_biometric_auth_message">Tresor mittels Biometrie entsperren</string>
<string name="dialog_biometric_auth_use_password">Tresor-Passwort verwenden</string>
<string name="dialog_unable_to_auto_upload_files_title">Automatischer Upload nicht möglich</string>
<!-- notification -->
<string name="notification_unlocked">Tresore entsperrt: %1$d</string>
<string name="notification_timeout">Auto-Lock in %1$s</string>
<string name="notification_lock_all">Alle sperren</string>
<string name="notification_cancel_auto_upload">Hochladen abbrechen</string>
<string name="notification_auto_upload_title">Automatisches Foto-Hochladen läuft</string>
<string name="notification_auto_upload_message">Lade hoch %1d/%2d</string>
<string name="notification_auto_upload_finished_message">%1$d Bilder wurden in den Tresor hochgeladen</string>
<string name="notification_auto_upload_finished_title">Automatisches Foto-Hochladen beendet</string>
<string name="notification_auto_upload_finished_message">%1$d Bilder wurden in den Tresor hochgeladen</string>
<string name="notification_auto_upload_failed_title">Fehler beim automatischen Photo-Hochladen</string>
<string name="notification_auto_upload_failed_general_error">Generaller Fehler während dem Hochladen.</string>
<string name="notification_auto_upload_failed_due_to_folder_not_exists">Ausgewählter Ordner für das Photo-Hochladen existiert nicht mehr. In der Einstellungen neuen auswählen</string>
<string name="notification_auto_upload_failed_due_to_vault_locked">Tresor gesperrt während dem hochladen, zum weiteren Hochladen entsperren</string>
<string name="notification_cancel_open_writable_file">@string/dialog_button_cancel</string>
<string name="notification_open_writable_file_message">Tresor bleibt entsperrt bis die Datei nicht mehr editiert wird</string>
<string name="notification_open_writable_file_title">Datei mit Schreibrechten geöffnet</string>
<string name="notification_open_writable_file_message">Tresor bleibt entsperrt bis die Datei nicht mehr editiert wird</string>
<string name="notification_update_check_finished_latest">Neueste Version installiert</string>
<string name="screen_settings_lru_cache">Zwischenspeicher</string>
<string name="screen_settings_clear_lru_cache_size">Zwischenspeicher leeren</string>
<string name="screen_settings_lru_cache_size">Zwischenspeichergröße insgesamt</string>
<string name="screen_settings_lru_cache_toggle">@string/screen_settings_section_auto_photo_upload_toggle</string>
<string name="screen_settings_clear_lru_cache_size">Zwischenspeicher leeren</string>
<string name="screen_settings_lru_cache_changed__restart_toast">Änderungen werden nach einem Neustart der App aktiv</string>
<string name="screen_settings_license">Registriert für</string>
<string name="screen_settings_license_mail">%1$s</string>
<string name="dialog_settings_update_check_interval_title">Intervall der Aktualisierungsprüfung</string>
<string name="screen_settings_check_updates">Nach Aktualisierungen suchen</string>
<string name="screen_settings_last_check_updates">Letzte Ausführung %1$s</string>
<string name="screen_settings_last_check_updates_never">Noch nie</string>
<string name="screen_settings_last_check_updates_never_pre_marshmallow">Noch nie ~ Wenn aus technischen Gründen keine Update-Prüfung durchgeführt werden kann, können Updates manuell über die Website https://cryptomator.org/android/ heruntergeladen und installiert werden.</string>
<string name="dialog_cache_size_title">Zwischenspeichergröße pro Cloud</string>
<!-- lock timeout names -->
<string name="lock_timeout_instant">Sofort</string>
<string name="lock_timeout_1m">1 Minute</string>
@ -515,25 +351,15 @@
<string name="lock_timeout_5m">5 Minuten</string>
<string name="lock_timeout_10m">10 Minuten</string>
<string name="lock_timeout_never">Nie</string>
<!-- cache size names -->
<string name="cache_size_50m">50 MB</string>
<string name="cache_size_100m">100 MB</string>
<string name="cache_size_250m">250 MB</string>
<string name="cache_size_500m">500 MB</string>
<string name="cache_size_1000m">1 GB</string>
<string name="cache_size_5000m">5 GB</string>
<!-- screen scheme mode names -->
<string name="screen_settings_style_mode">Design</string>
<string name="follow_system">Automatisch (System-Einstellung verwenden)</string>
<string name="light">Hell</string>
<string name="dark">Dunkel</string>
<!-- update interval names -->
<string name="update_interval_1d">Einmal am Tag</string>
<string name="update_interval_1w">Einmal pro Woche</string>
<string name="update_interval_1m">Einmal im Monat</string>
<string name="update_interval_never">@string/lock_timeout_never</string>
</resources>

View File

@ -1,10 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- # app -->
<string name="app_name">Cryptomator</string>
<string name="share_with_label">Cifrar</string>
<string name="download_subdirectory_name">@string/app_name</string>
<!-- # error messages -->
<string name="error_generic">Se ha producido un error</string>
<string name="error_authentication_failed">Ha fallado la autenticación</string>
@ -17,43 +14,31 @@
<string name="error_cloud_already_exists">La nube ya existe.</string>
<string name="error_activity_not_found">Por favor, descarga una aplicación que pueda abrir este archivo.</string>
<string name="error_server_not_found">Servidor no encontrado.</string>
<!-- # clouds
## cloud names -->
<string name="cloud_names_crypto">Crypto</string>
<string name="cloud_names_dropbox">Dropbox</string>
<string name="cloud_names_google_drive">Google Drive</string>
<string name="cloud_names_onedrive">OneDrive</string>
<string name="cloud_names_webdav">WebDAV</string>
<!-- # clouds -->
<!-- ## cloud names -->
<string name="cloud_names_local_storage">Almacenamiento local</string>
<!-- # permission
## permission messages -->
<!-- # permission -->
<!-- ## permission messages -->
<string name="permission_message_export_file">Cryptomator necesita acceso al almacenamiento para exportar archivos.</string>
<string name="permission_message_upload_file">Cryptomator necesita acceso al almacenamiento para subir archivos.</string>
<string name="permission_message_share_file">Cryptomator necesita acceso al almacenamiento para compartir archivos.</string>
<string name="snack_bar_action_title_settings">Configuración</string>
<!-- # screens
# screen: vault list -->
<!-- # screens -->
<!-- # screen: vault list -->
<string name="screen_vault_list_actions_title">Añadir a Cryptomator</string>
<string name="screen_vault_list_action_create_new_vault">Crear nueva caja fuerte</string>
<string name="screen_vault_list_action_add_existing_vault">Añadir caja fuerte existente</string>
<string name="screen_vault_list_vault_action_rename">@string/screen_file_browser_node_action_rename</string>
<string name="screen_vault_list_vault_action_delete">Eliminar</string>
<string name="screen_vault_list_vault_creation_hint">Haz clic aquí para crear una caja fuerte</string>
<string name="screen_vault_list_change_password_successful">Contraseña cambiada con éxito</string>
<!-- # screen: file browser -->
<string name="screen_file_browser_default_title">Caja fuerte</string>
<string name="screen_file_browser_subtitle_add_existing_vault">@string/screen_vault_list_action_add_existing_vault</string>
<string name="screen_file_browser_add_existing_vault_extra_text">Seleccionar archivo masterkey</string>
<string name="screen_file_browser_subtitle_create_new_vault">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_file_browser_create_new_vault_button_text">Dejar aquí</string>
<string name="screen_file_browser_create_new_vault_extra_text">Nombre de caja fuerte: %1$s</string>
<string name="screen_file_browser_move_button_text">Mover</string>
<string name="screen_file_browser_msg_empty_folder">Carpeta vacía</string>
<string name="screen_file_browser_file_info_label_size">"%1$s</string>
<string name="screen_file_browser_file_info_label_size">\"%1$s</string>
<string name="screen_file_browser_file_info_label_date">modificado hace %1$s</string>
<string name="screen_file_browser_share_intent_chooser_title">Compartir con</string>
<string name="screen_file_browser_share_destination_title">Elegir destino</string>
@ -68,45 +53,31 @@
<string name="screen_file_browser_node_action_share">Compartir</string>
<string name="screen_file_browser_node_action_rename">Renombrar</string>
<string name="screen_file_browser_node_action_edit_text">Editar</string>
<string name="screen_file_browser_node_action_move">@string/screen_file_browser_move_button_text</string>
<string name="screen_file_browser_node_action_export">Exportar</string>
<string name="screen_file_browser_node_action_delete">Eliminar</string>
<string name="screen_file_browser_no_connection_message">Sin conexión</string>
<string name="screen_file_browser_no_connection_button_text">Reintentar</string>
<!-- ## screen: text editor -->
<string name="screen_text_editor_save_success">Guardado correctamente</string>
<!-- ## screen: share files -->
<string name="screen_share_files_title">Guardar %1$s en&#8230;</string>
<string name="screen_share_files_content_text">texto</string>
<string name="screen_share_files_content_file">archivo</string>
<string name="screen_share_files_content_files">archivos</string>
<string name="screen_share_files_msg_filenames_must_be_unique">Los nombres de archivo deben ser únicos. Renombra los duplicados.</string>
<string name="screen_share_files_section_files">@string/screen_share_files_content_files</string>
<string name="screen_share_files_section_location">Guardar ubicación</string>
<string name="screen_share_files_save_button_text">Guardar</string>
<string name="screen_share_files_msg_success">Cifrado completado</string>
<string name="screen_share_files_new_text_file">@string/dialog_file_name_placeholder</string>
<!-- ## screen: choose cloud service -->
<string name="screen_choose_cloud_service_title">Servicio de nube</string>
<string name="screen_choose_cloud_service_subtitle_add_existing_vault">@string/screen_vault_list_action_add_existing_vault</string>
<string name="screen_choose_cloud_service_subtitle_create_new_vault">@string/screen_vault_list_action_create_new_vault</string>
<!-- ## screen: cloud connections -->
<string name="screen_cloud_connections_title">Elegir ubicación</string>
<string name="screen_cloud_settings_option_edit">@string/screen_file_browser_node_action_edit_text</string>
<string name="screen_cloud_settings_option_delete">@string/screen_vault_list_vault_action_delete</string>
<string name="screen_cloud_connections_no_connections">Haz clic aquí para añadir ubicaciones</string>
<string name="screen_cloud_error_webdav_not_supported">El servidor no parece ser compatible con WebDAV</string>
<string name="screen_cloud_local_custom_storage_title">Ubicaciones personalizadas</string>
<string name="screen_cloud_local_default_storage_title">Almacenamiento predeterminado</string>
<string name="screen_cloud_local_error_no_content_provider">No hay ubicaciones extra disponibles.</string>
<!-- ## screen: webdav settings -->
<string name="screen_webdav_settings_title">@string/cloud_names_webdav</string>
<string name="screen_webdav_settings_url_port_label">URL</string>
<string name="screen_webdav_settings_username_label">Nombre de usuario</string>
<string name="screen_webdav_settings_password_label">Contraseña</string>
<string name="screen_webdav_settings_done_button_text">Conectar</string>
@ -114,78 +85,53 @@
<string name="screen_webdav_settings_msg_url_is_invalid">La URL no es válida.</string>
<string name="screen_webdav_settings_msg_username_must_not_be_empty">El nombre de usuario no puede estar vacio.</string>
<string name="screen_webdav_settings_msg_password_must_not_be_empty">La contraseña no puede estar vacía.</string>
<!-- ## screen: enter vault name -->
<string name="screen_enter_vault_name_title">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_enter_vault_name_msg_name_empty">El nombre de la caja fuerte no puede estar vacío.</string>
<string name="screen_enter_vault_name_vault_label">Nombre de la caja fuerte</string>
<string name="screen_enter_vault_name_button_text">Crear</string>
<!-- ## screen: set password -->
<string name="screen_set_password_title">Establecer contraseña</string>
<string name="screen_set_password_msg_password_empty">@string/screen_webdav_settings_msg_password_must_not_be_empty</string>
<string name="screen_set_password_msg_password_mismatch">Las contraseñas no coinciden.</string>
<string name="screen_set_password_button_text">Completado</string>
<string name="screen_set_password_hint">IMPORTANTE: si olvida su contraseña no habrá manera de recuperar los datos.</string>
<string name="screen_set_password_password_label">@string/screen_webdav_settings_password_label</string>
<string name="screen_set_password_retype_password_label">Reescriba la contraseña</string>
<!-- ## screen: settings -->
<string name="screen_settings_title">@string/snack_bar_action_title_settings</string>
<string name="screen_settings_section_general">General</string>
<string name="screen_settings_cloud_settings_label">Servicios de nube</string>
<string name="screen_settings_section_social">@string/screen_webdav_settings_done_button_text</string>
<string name="screen_settings_website_label">Web de Cryptomator</string>
<string name="screen_settings_twitter_label">Síguenos en Twitter</string>
<string name="screen_settings_facebook_label">Danos me gusta en Facebook</string>
<string name="screen_settings_website_uri">https://cryptomator.org</string>
<string name="screen_settings_facebook_uri">https://facebook.com/Cryptomator</string>
<string name="screen_settings_twitter_uri">https://twitter.com/Cryptomator</string>
<string name="screen_settings_section_legal">Legal</string>
<string name="screen_settings_licenses_label">Licencias</string>
<string name="screen_settings_license_terms_label">Términos de la licencia</string>
<string name="screen_settings_section_support">Soporte</string>
<string name="screen_settings_contact_label">Solicitar ayuda</string>
<string name="screen_settings_support_uri">https://cryptomator.org/contact/</string>
<string name="screen_settings_debug_mode_label">Modo de depuración</string>
<string name="screen_settings_error_report_label">Enviar archivo de trazas</string>
<string name="screen_settings_error_report_failed">Error en el envío</string>
<string name="screen_settings_section_version">Versión</string>
<!-- ## screen: cloud settings -->
<string name="screen_cloud_settings_title">@string/screen_settings_cloud_settings_label</string>
<string name="screen_cloud_settings_webdav_connections">Conexiones de WebDAV</string>
<string name="screen_cloud_settings_local_storage_locations">Ubicaciones de almacenamiento local</string>
<string name="screen_cloud_settings_log_in_to">Iniciar sesión en</string>
<string name="screen_cloud_settings_sign_out_from_cloud">Cerrar sesión de</string>
<!-- ## screen: licenses -->
<string name="screen_licenses_title">@string/screen_settings_licenses_label</string>
<!-- ## screen: dropbox auth -->
<!-- ## screen: authenticate cloud -->
<string name="screen_authenticate_auth_authentication_failed">No se pudo autenticar en %1$s.</string>
<!-- ## screen: empty dir file info -->
<string name="screen_empty_dir_file_info_title">No se llega a %1$s</string>
<string name="screen_empty_dir_file_info_headline">Cryptomator ha detectado que no se llega a esta carpeta</string>
<string name="screen_empty_dir_file_info_button_label">Más detalles sobre Sanitizer</string>
<!-- ## screen: insecure android version info -->
<!-- # dialogs -->
<string name="dialog_button_cancel">Cancelar</string>
<string name="dialog_create_folder_title">@string/screen_file_browser_action_create_folder</string>
<string name="dialog_create_folder_positive_button">@string/screen_enter_vault_name_button_text</string>
<string name="dialog_enter_password_password_label">@string/screen_webdav_settings_password_label</string>
<string name="dialog_enter_password_positive_button">Desbloquear</string>
<string name="dialog_change_password_old_password_label">Antigua contraseña</string>
<string name="dialog_change_password_new_password_label">Nueva contraseña</string>
<string name="dialog_change_password_new_retype_password_label">@string/screen_set_password_retype_password_label</string>
<string name="dialog_change_password">Cambiar contraseña</string>
<string name="dialog_change_password_msg_old_password_empty">La antigua contraseña no puede estar vacía.</string>
<string name="dialog_change_password_msg_new_password_empty">La nueva contraseña no puede estar vacía.</string>
<string name="dialog_change_password_msg_password_mismatch">Las nuevas contraseñas no coinciden.</string>
<!-- Vault not found -->
<string name="dialog_vault_not_found_positive_button_text">Eliminar</string>
<string name="dialog_existing_file_title">El archivo ya existe</string>
<string name="dialog_existing_file_positive_button">Reemplazar</string>
<string name="dialog_existing_file_message">Ya existe un archivo llamado %1$s.</string>
@ -195,34 +141,25 @@
<string name="dialog_replace_positive_button_single_file_exists">Reemplazar</string>
<string name="dialog_replace_msg_single_file_exists">Ya existe un archivo llamado %1$s. ¿Quieres reemplazarlo?</string>
<string name="dialog_replace_msg_all_files_exists">Todos los archivos existen ya. ¿Quieres reemplazarlos?</string>
<string name="dialog_replace_msg_some_files_exists">"%d archivos existen ya. ¿Quieres reemplazarlos?</string>
<string name="dialog_replace_title_single_file_exists">"¿Reemplazar archivo?</string>
<string name="dialog_replace_title_multiple_files_exist">"¿Reemplazar archivos?</string>
<string name="dialog_replace_msg_some_files_exists">\"%d archivos existen ya. ¿Quieres reemplazarlos?</string>
<string name="dialog_replace_title_single_file_exists">\"¿Reemplazar archivo?</string>
<string name="dialog_replace_title_multiple_files_exist">\"¿Reemplazar archivos?</string>
<string name="dialog_unable_to_share_title">No se puede compartir archivos</string>
<string name="dialog_unable_to_share_message">No ha configurado ninguna caja fuerte. Cree antes una nueva caja fuerte con la aplicación Cryptomator.</string>
<string name="dialog_unable_to_share_positive_button">Aceptar</string>
<string name="dialog_unable_to_share_negative_button">Crear caja fuerte</string>
<string name="dialog_filetype_not_supported_title">No se puede abrir %1$s</string>
<string name="dialog_filetype_not_supported_positive_button">@string/screen_file_browser_node_action_export</string>
<string name="dialog_filetype_not_supported_message">Descarga una aplicación que pueda abrir el archivo o, ¿quieres guardarlo en el dispositivo?</string>
<string name="dialog_rename_vault_title">Renombrar caja fuerte</string>
<string name="dialog_rename_vault_positive_button">@string/screen_file_browser_node_action_rename</string>
<string name="dialog_rename_node_folder_title">Renombrar carpeta</string>
<string name="dialog_rename_node_file_title">Renombrar archivo</string>
<string name="dialog_rename_node_positive_button">@string/screen_file_browser_node_action_rename</string>
<string name="dialog_unsaved_changes_title">Tienes cambios sin guardar</string>
<string name="dialog_unsaved_changes_message">"¿De verdad quieres salir sin guardar?</string>
<string name="dialog_unsaved_changes_message">\"¿De verdad quieres salir sin guardar?</string>
<string name="dialog_unsaved_changes_discard">Descartar</string>
<string name="dialog_unsaved_changes_save">@string/screen_share_files_save_button_text</string>
<string name="dialog_file_name_title">@string/screen_file_browser_action_create_new_text_file</string>
<string name="dialog_file_name_create">@string/screen_enter_vault_name_button_text</string>
<string name="dialog_file_name_cancel">@string/dialog_button_cancel</string>
<string name="dialog_file_name_placeholder">texto.txt</string>
<string name="dialog_delete_vault_positive_button_text">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_delete_vault_message">"¿Estás seguro de que quieres eliminar esta caja fuerte?</string>
<string name="dialog_delete_vault_message">\"¿Estás seguro de que quieres eliminar esta caja fuerte?</string>
<string name="dialog_delete_vault_hint">Esta acción solo eliminará la caja fuerte de esta lista y no la borrará físicamente.</string>
<string name="dialog_upload_file_title">Sube&#8230;</string>
<string name="dialog_upload_file_cancel_button">@string/dialog_button_cancel</string>
<string name="dialog_progress_please_wait">Espera, por favor&#8230;</string>
<string name="dialog_progress_creating_folder">Creando carpeta&#8230;</string>
<string name="dialog_progress_creating_text_file">Creando archivo de texto&#8230;</string>
@ -241,37 +178,21 @@
<string name="dialog_accept_ssl_certificate_hint">El certificado SSL no es válido. ¿Quiere confiar en él de todas formas?</string>
<string name="dialog_http_security_hint">El uso de HTTP no es seguro. Recomendamos usar HTTPS en su lugar. Si conoce los riesgos puede seguir usando HTTP.</string>
<string name="dialog_http_security_checkbox">Cambiar a HTTPS</string>
<string name="dialog_http_security_title">"¿Usar HTPPS?</string>
<string name="dialog_http_security_title">\"¿Usar HTPPS?</string>
<string name="dialog_no_screen_lock_hint">No se ha establecido el bloqueo de pantalla. Para almacenar las credenciales de forma segura, establece con Aceptar un patrón o contraseña.</string>
<string name="dialog_no_screen_lock_title">"¿Establecer bloqueo de pantalla?</string>
<string name="dialog_no_screen_lock_title">\"¿Establecer bloqueo de pantalla?</string>
<string name="dialog_no_screen_lock_checkbox">Establecer bloqueo de pantalla</string>
<string name="dialog_debug_mode_disclaimer_title">Aviso</string>
<string name="dialog_debug_mode_positive_button">Activar</string>
<string name="dialog_debug_mode_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_delete_cloud_connection_with_vaults_message">"¿Estás seguro de que quieres eliminar esta conexión de nube?</string>
<string name="dialog_disable_app_obscured_disclaimer_title">Aviso</string>
<string name="dialog_delete_cloud_connection_with_vaults_message">\"¿Estás seguro de que quieres eliminar esta conexión de nube?</string>
<string name="dialog_delete_cloud_connection_with_vaults_hint">Esta acción eliminará la conexión de nube y todas las cajas fuertes de esta nube.</string>
<string name="dialog_delete_cloud_connection_with_vaults_positive_button">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_delete_cloud_connection_with_vaults_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_confirm_delete_positive_button">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_confirm_delete_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_confirm_delete_file_message">"¿Estás seguro de que quieres borrar este archivo?</string>
<string name="dialog_confirm_delete_file_message">\"¿Estás seguro de que quieres borrar este archivo?</string>
<string name="dialog_confirm_delete_folder_message">Esto borrará todo el contenido de la carpeta. ¿Estás seguro de que quiere borrar esta carpeta?</string>
<!-- # error reports -->
<string name="error_report_subject">Informe de error de Android</string>
<string name="error_report_section_summary">Sumario</string>
<string name="error_report_summary_description">Introduce una descripción corta de lo has intentado hacer o indica el ticket de soporte si ya habías creado uno.</string>
<string name="error_report_section_device">Información del dispositivo</string>
<!-- # misc
## file size helper -->
<!-- # misc -->
<!-- ## file size helper -->
<string name="file_size_zero">Cero kB</string>
<string name="file_size_unit_bytes">bytes</string>
<string name="file_size_unit_kilo_bytes">kB</string>
<string name="file_size_unit_mega_bytes">MB</string>
<string name="file_size_unit_giga_bytes">GB</string>
<string name="file_size_unit_tera_bytes">TB</string>
<!-- ## date helper -->
<string name="time_unit_seconds_sg">segundo</string>
<string name="time_unit_seconds_pl">segundos</string>
@ -287,17 +208,20 @@
<string name="time_unit_months_pl">meses</string>
<string name="time_unit_years_sg">año</string>
<string name="time_unit_years_pl">años</string>
<!-- ## biometric authentication -->
<!-- notification -->
<string name="notification_unlocked">Cajas fuertes desbloqueadas: %1$d</string>
<string name="notification_timeout">Autobloqueo en %1$s</string>
<string name="notification_lock_all">Bloquear todas</string>
<string name="screen_settings_license_mail">\"%1$s</string>
<!-- lock timeout names -->
<string name="lock_timeout_1m">1 minuto</string>
<string name="lock_timeout_2m">2 minutos</string>
<string name="lock_timeout_5m">5 minutos</string>
<string name="lock_timeout_10m">10 minutos</string>
<string name="lock_timeout_never">Nunca</string>
<!-- cache size names -->
<!-- screen scheme mode names -->
<!-- update interval names -->
<string name="update_interval_never">Nunca</string>
</resources>

View File

@ -1,11 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- # app -->
<string name="app_name">Cryptomator</string>
<string name="share_with_label">Chiffrer</string>
<string name="download_subdirectory_name">@string/app_name</string>
<!-- # error messages -->
<string name="error_generic">Une erreur est survenue</string>
<string name="error_authentication_failed">Échec de l\'authentification</string>
@ -29,29 +25,18 @@
<string name="error_failed_to_decrypt_webdav_password">Le mot de passe WebDAV n\'a pas été déchiffré, veuillez l\'ajouter une nouvelle fois dans les paramètres</string>
<string name="error_play_services_not_available">Services Google play non installés</string>
<string name="error_biometric_auth_aborted">Authentification biométrique avortée</string>
<!-- # clouds -->
<!-- ## cloud names -->
<string name="cloud_names_crypto">Crypto</string>
<string name="cloud_names_dropbox">Dropbox</string>
<string name="cloud_names_google_drive">Google Drive</string>
<string name="cloud_names_onedrive">OneDrive</string>
<string name="cloud_names_webdav">WebDAV</string>
<string name="cloud_names_local_storage">Stockage local</string>
<!-- # permission -->
<!-- ## permission messages -->
<string name="permission_message_export_file">Cryptomator a besoin de l\'accès au stockage pour exporter des fichiers</string>
<string name="permission_message_upload_file">Cryptomateur a besoin de l\'accès au stockage pour téléverser des fichiers</string>
<string name="permission_message_share_file">Cryptomator a besoin de l\'accès au stockage pour partager des fichiers</string>
<string name="snack_bar_action_title_settings">Paramètres</string>
<string name="snack_bar_action_title_search">Rechercher</string>
<string name="snack_bar_action_title_search_previous">Précédent</string>
<string name="snack_bar_action_title_search_next">Suivant</string>
<string name="snack_bar_action_title_sort">Trier par</string>
<string name="snack_bar_action_title_sort_az">A - Z</string>
<string name="snack_bar_action_title_sort_za">Z - A</string>
@ -59,105 +44,74 @@
<string name="snack_bar_action_title_sort_oldest">Plus ancien</string>
<string name="snack_bar_action_title_sort_biggest">Taille décroissante</string>
<string name="snack_bar_action_title_sort_smallest">Taille croissante</string>
<!-- # screens -->
<!-- # screen: vault list -->
<string name="screen_vault_list_actions_title">Ajouter à Cryptomator</string>
<string name="screen_vault_list_action_create_new_vault">Créer un nouveau coffre-fort</string>
<string name="screen_vault_list_action_add_existing_vault">Ajouter un coffre-fort existant</string>
<string name="screen_vault_list_vault_action_rename">@string/screen_file_browser_node_action_rename</string>
<string name="screen_vault_list_vault_action_delete">Retirer</string>
<string name="screen_vault_list_vault_creation_hint">Cliquez ici pour créer un nouveau coffre-fort</string>
<string name="screen_vault_list_change_password_successful">Mot de passe modifié avec succès</string>
<!-- # screen: file browser -->
<string name="screen_file_browser_default_title">Coffre</string>
<string name="screen_file_browser_subtitle_add_existing_vault">@string/screen_vault_list_action_add_existing_vault</string>
<string name="screen_file_browser_add_existing_vault_extra_text">Sélectionné le fichier de clé principal</string>
<string name="screen_file_browser_subtitle_create_new_vault">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_file_browser_create_new_vault_button_text">Placé ici</string>
<string name="screen_file_browser_create_new_vault_extra_text">Nom du coffre-fort: %1$s</string>
<plurals name="screen_file_browser_subtitle_move">
<item quantity="one">Déplacé %1$s vers</item>
<item quantity="other">Déplacer des éléments de %2$s vers</item>
</plurals>
<string name="screen_file_browser_move_button_text">Déplacer</string>
<string name="screen_file_browser_msg_empty_folder">Dossier vide</string>
<string name="screen_file_browser_file_info_label_size">%1$s</string>
<string name="screen_file_browser_file_info_label_date">Modifié il y à %1$s</string>
<string name="screen_file_browser_share_intent_chooser_title">Partager avec</string>
<string name="screen_file_browser_share_destination_title">Choisissez la destination</string>
<string name="screen_file_browser_share_button_text">Choisir</string>
<string name="screen_file_browser_nothing_to_share">Rien à partager</string>
<string name="screen_file_browser_actions_title">Ajouter le %1$s</string>
<string name="screen_file_browser_action_create_folder">Créer le dossier</string>
<string name="screen_file_browser_action_create_new_text_file">Créer le fichier texte</string>
<string name="screen_file_browser_action_upload_files">Televerser des fichiers</string>
<string name="screen_file_browser_upload_files_chooser_title">Fichiers</string>
<string name="screen_file_browser_msg_file_exported">Fichier exporté</string>
<string name="screen_file_browser_msg_files_exported">Fichiers exportés</string>
<string name="screen_file_browser_nothing_to_export">Rien à exporter</string>
<string name="screen_file_browser_msg_creating_download_dir_failed">Échec de la création du répertoire de téléchargement</string>
<string name="screen_file_browser_node_action_open_with_text">Ouvrir avec&#8230;</string>
<string name="screen_file_browser_node_action_share">Partager</string>
<string name="screen_file_browser_node_action_rename">Renommer</string>
<string name="screen_file_browser_node_action_edit_text">Éditer</string>
<string name="screen_file_browser_node_action_move">@string/screen_file_browser_move_button_text</string>
<string name="screen_file_browser_node_action_export">Exporter</string>
<string name="screen_file_browser_node_action_delete">Supprimer</string>
<string name="screen_file_browser_node_action_open_with_text">Ouvrir avec&#8230;</string>
<string name="screen_file_browser_selection_mode_title_zero_elements">Sélectionnez les éléments</string>
<string name="screen_file_browser_selection_mode_title_one_or_more_elements">%1$d sélectionné</string>
<string name="screen_file_browser_select_items">Sélectionner&#8230;</string>
<string name="screen_file_browser_select_all_items">Tout sélectionner</string>
<string name="screen_file_browser_refresh_items">Rafraîchir</string>
<string name="screen_file_browser_no_connection_message">Aucune connection</string>
<string name="screen_file_browser_no_connection_button_text">Réessayer</string>
<!-- ## screen: text editor -->
<string name="screen_text_editor_save_success">Enregistré avec succès</string>
<!-- ## screen: share files -->
<string name="screen_share_files_title">Enregistré %1$s vers&#8230;</string>
<string name="screen_share_files_content_text">texte</string>
<string name="screen_share_files_content_file">fichier</string>
<string name="screen_share_files_content_files">fichiers</string>
<string name="screen_share_files_msg_filenames_must_be_unique">Les noms de fichiers doivent être uniques, veuillez renommer les doublons</string>
<string name="screen_share_files_section_files">@string/screen_share_files_content_files</string>
<string name="screen_share_files_section_location">Enregistrer l\'emplacement</string>
<string name="screen_share_files_save_button_text">Enregistrer</string>
<string name="screen_share_files_msg_success">Chiffrement terminé </string>
<string name="screen_share_files_new_text_file">@string/dialog_file_name_placeholder</string>
<!-- ## screen: choose cloud service -->
<string name="screen_choose_cloud_service_title">Service cloud</string>
<string name="screen_choose_cloud_service_subtitle_add_existing_vault">@string/screen_vault_list_action_add_existing_vault</string>
<string name="screen_choose_cloud_service_subtitle_create_new_vault">@string/screen_vault_list_action_create_new_vault</string>
<!-- ## screen: cloud connections -->
<string name="screen_cloud_connections_title">Choisissez l\'emplacement</string>
<string name="screen_cloud_settings_option_edit">@string/screen_file_browser_node_action_edit_text</string>
<string name="screen_cloud_settings_option_delete">@string/screen_vault_list_vault_action_delete</string>
<string name="screen_cloud_connections_no_connections">Cliquez ici pour ajouter des emplacements</string>
<string name="screen_cloud_error_webdav_not_supported">Le serveur ne semble pas compatible avec WebDAV</string>
<string name="screen_cloud_local_custom_storage_title">Emplacements personnalisés</string>
<string name="screen_cloud_local_default_storage_title">Stockage par défaut</string>
<string name="screen_cloud_local_error_no_content_provider">Aucun emplacement supplémentaire disponible.</string>
<!-- ## screen: webdav settings -->
<string name="screen_webdav_settings_title">@string/cloud_names_webdav</string>
<string name="screen_webdav_settings_url_port_label">URL</string>
<string name="screen_webdav_settings_username_label">Nom d\'utilisateur</string>
<string name="screen_webdav_settings_password_label">Mot de passe</string>
@ -166,31 +120,22 @@
<string name="screen_webdav_settings_msg_url_is_invalid">URL invalide.</string>
<string name="screen_webdav_settings_msg_username_must_not_be_empty">Le nom d\'utilisateur ne peut pas être vide.</string>
<string name="screen_webdav_settings_msg_password_must_not_be_empty">Le mot de passe ne peut pas être vide.</string>
<!-- ## screen: enter vault name -->
<string name="screen_enter_vault_name_title">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_enter_vault_name_msg_name_empty">Le nom du coffre-fort ne peut pas être vide.</string>
<string name="screen_enter_vault_name_vault_label">Nom du coffre-fort</string>
<string name="screen_enter_vault_name_button_text">Créer</string>
<!-- ## screen: set password -->
<string name="screen_set_password_title">Définir le mot de passe</string>
<string name="screen_set_password_msg_password_empty">@string/screen_webdav_settings_msg_password_must_not_be_empty</string>
<string name="screen_set_password_msg_password_mismatch">Le mot de passe ne correspond pas au mot de passe retapé.</string>
<string name="screen_set_password_button_text">Terminé</string>
<string name="screen_set_password_hint">IMPORTANT: Si vous oubliez votre mot de passe, il n\'y aura aucun moyen de récupérer vos données.</string>
<string name="screen_set_password_password_label">@string/screen_webdav_settings_password_label</string>
<string name="screen_set_password_retype_password_label">Retaper le mot de passe</string>
<string name="screen_set_password_strength_indicator_0">Très faible</string>
<string name="screen_set_password_strength_indicator_1">Faible</string>
<string name="screen_set_password_strength_indicator_2">Acceptable</string>
<string name="screen_set_password_strength_indicator_3">Fort</string>
<string name="screen_set_password_strength_indicator_4">Très fort</string>
<!-- ## screen: settings -->
<string name="screen_settings_title">@string/snack_bar_action_title_settings</string>
<string name="screen_settings_section_general">Général</string>
<string name="screen_settings_cloud_settings_label">Service cloud</string>
<string name="screen_settings_biometric_auth">Authentification biométrique</string>
@ -198,94 +143,63 @@
<string name="screen_settings_confirm_face_unlock">Confirmer le déverrouillage par reconnaissance faciale (si disponible)</string>
<string name="screen_settings_block_app_when_obscured">Bloquer l\'application lorsqu\'elle est masquée</string>
<string name="screen_settings_secure_screen">Sécurité de l\'écran</string>
<string name="screen_settings_section_search">Recherche</string>
<string name="screen_settings_live_search">Recherche en direct</string>
<string name="screen_settings_glob_search">Recherche avec le modèle glob</string>
<string name="screen_settings_section_auto_lock">Verrouillage automatique</string>
<string name="screen_settings_auto_lock_timeout">Verrouillage après</string>
<string name="screen_settings_auto_lock_on_screen_lock">Lorsque l\'écran est éteint</string>
<string name="screen_settings_section_auto_photo_upload">Téléversement automatique de photo</string>
<string name="screen_settings_section_auto_photo_upload_vault">Choisir un coffre-fort pour le téléversement</string>
<string name="screen_settings_section_auto_photo_upload_toggle">Activer</string>
<string name="screen_settings_section_auto_photo_upload_only_wifi_toggle">Téléverser sur réseau WIFI uniquement</string>
<string name="screen_settings_auto_photo_upload_title">Enregistrer les fichiers du téléversement automatique dans&#8230;</string>
<string name="screen_settings_section_social">@string/screen_webdav_settings_done_button_text</string>
<string name="screen_settings_website_label">Site web de Cryptomator</string>
<string name="screen_settings_twitter_label">Suivez-nous sur Twitter</string>
<string name="screen_settings_facebook_label">Aimez notre page Facebook</string>
<string name="screen_settings_website_uri">https://cryptomator.org</string>
<string name="screen_settings_facebook_uri">https://facebook.com/Cryptomator</string>
<string name="screen_settings_twitter_uri">https://twitter.com/Cryptomator</string>
<string name="screen_settings_section_legal">Légal</string>
<string name="screen_settings_licenses_label">Licenses</string>
<string name="screen_settings_licenses_label">Licences</string>
<string name="screen_settings_license_terms_label">Termes de la licence</string>
<string name="screen_settings_section_support">Support</string>
<string name="screen_settings_section_support">Support technique</string>
<string name="screen_settings_contact_label">Demander de l\'aide</string>
<string name="screen_settings_support_uri">https://cryptomator.org/contact/</string>
<string name="screen_settings_debug_mode_label">Mode débogage</string>
<string name="screen_settings_error_report_label">Envoyer un fichier journal</string>
<string name="screen_settings_error_report_failed">L\'envoi a échoué</string>
<string name="screen_settings_security_label">Conseils de sécurité</string>
<string name="screen_settings_security_url">https://docs.cryptomator.org/en/1.5/security/best-practices/</string>
<string name="screen_settings_section_version">Version</string>
<string name="screen_settings_keep_unlocked_while_editing_files">Gardez les coffres déverrouillés lors de la modification des fichiers</string>
<string name="screen_settings_advanced_settings">Paramètres Avancés</string>
<string name="screen_settings_background_unlock_preparation_label">Préparations du déverrouillage en arrière-plan</string>
<!-- ## screen: cloud settings -->
<string name="screen_cloud_settings_title">@string/screen_settings_cloud_settings_label</string>
<string name="screen_cloud_settings_webdav_connections">Connexions WebDAV</string>
<string name="screen_cloud_settings_local_storage_locations">Emplacements du stockage local</string>
<string name="screen_cloud_settings_log_in_to">Se connecter à</string>
<string name="screen_cloud_settings_sign_out_from_cloud">Se déconnecter de</string>
<!-- ## screen: licenses -->
<string name="screen_licenses_title">@string/screen_settings_licenses_label</string>
<!-- ## screen: authenticate cloud -->
<string name="screen_authenticate_auth_authentication_failed">%1$s n\'a pas pu être authentifié.</string>
<!-- ## screen: empty dir file info -->
<string name="screen_empty_dir_file_info_title">\'%1$s\' inaccessible</string>
<string name="screen_empty_dir_file_info_headline">Cryptomator a détecté que ce dossier est inaccessible.</string>
<string name="screen_empty_dir_file_info_text">Il a peut-être été supprimé par une autre application ou une synchronisation cloud défectueuse pourrait en être la cause.\n\nEssayez de restaurer le fichier de répertoire via votre fournisseur de cloud dans une version précédente qui n\'est pas vide. Le fichier en question est:\n%1$s\n\nSi cela ne fonctionne pas, vous pouvez utiliser Sanitizer pour rechercher des problèmes dans votre coffre-fort et éventuellement restaurer vos données.</string>
<string name="screen_empty_dir_file_info_button_label">Plus de détails sur Sanitizer</string>
<!-- ## screen: insecure android version info -->
<!-- # dialogs -->
<string name="dialog_button_cancel">Annuler</string>
<string name="dialog_create_folder_title">@string/screen_file_browser_action_create_folder</string>
<string name="dialog_create_folder_positive_button">@string/screen_enter_vault_name_button_text</string>
<string name="dialog_enter_password_password_label">@string/screen_webdav_settings_password_label</string>
<string name="dialog_enter_password_positive_button">Déverrouiller</string>
<string name="dialog_change_password_old_password_label">Ancien mot de passe</string>
<string name="dialog_change_password_new_password_label">Nouveau mot de passe</string>
<string name="dialog_change_password_new_retype_password_label">@string/screen_set_password_retype_password_label</string>
<string name="dialog_change_password">Changer le mot de passe</string>
<string name="dialog_change_password_msg_old_password_empty">L\'ancien mot de passe ne peut pas être vide.</string>
<string name="dialog_change_password_msg_new_password_empty">Le nouveau mot de passe ne peut pas être vide.</string>
<string name="dialog_change_password_msg_password_mismatch">Le nouveau mot de passe ne correspond pas au mot de passe retapé.</string>
<!-- Vault not found -->
<string name="dialog_vault_not_found_title">Coffre-fort %1$s introuvable</string>
<string name="dialog_vault_not_found_message">Le coffre-fort a été renommé, déplacé ou supprimé. Supprimez ce coffre-fort de la liste et ajoutez-le à nouveau pour continuer. Supprimer maintenant?</string>
<string name="dialog_vault_not_found_positive_button_text">Supprimer</string>
<string name="dialog_existing_file_title">Le fichier existe déjà</string>
<string name="dialog_existing_file_positive_button">Remplacer</string>
<string name="dialog_existing_file_message">Un fichier nommé \'%1$s\' existe déjà.</string>
<string name="dialog_replace_negative_button_at_least_two_but_not_all_files_exist">Ignorer l\'existant</string>
<string name="dialog_replace_positive_button_all_files_exist">Remplacer tout</string>
<string name="dialog_replace_positive_button_some_files_exist">Remplacer existant</string>
@ -295,44 +209,24 @@
<string name="dialog_replace_msg_some_files_exists">%d fichiers existent déjà. Voulez-vous les remplacer?</string>
<string name="dialog_replace_title_single_file_exists">Remplacer le fichier?</string>
<string name="dialog_replace_title_multiple_files_exist">Remplacer les fichiers?</string>
<string name="dialog_unable_to_share_title">Impossible de partager des fichiers</string>
<string name="dialog_unable_to_share_message">Vous n\'avez pas configuré de coffre-fort. Veuillez d\'abord créer un nouveau coffre-fort avec l\'application Cryptomator.</string>
<string name="dialog_unable_to_share_positive_button">OK</string>
<string name="dialog_unable_to_share_negative_button">Créer un coffre-fort</string>
<string name="dialog_filetype_not_supported_title">Impossible d\'ouvrir %1$s</string>
<string name="dialog_filetype_not_supported_positive_button">@string/screen_file_browser_node_action_export</string>
<string name="dialog_filetype_not_supported_message">Veuillez télécharger une application qui peut ouvrir ce fichier ou souhaitez-vous l\'enregistrer sur votre appareil?</string>
<string name="dialog_rename_vault_title">Renommer le coffre-fort</string>
<string name="dialog_rename_vault_positive_button">@string/screen_file_browser_node_action_rename</string>
<string name="dialog_rename_node_folder_title">Renommer le dossier</string>
<string name="dialog_rename_node_file_title">Renommer le fichier</string>
<string name="dialog_rename_node_positive_button">@string/screen_file_browser_node_action_rename</string>
<string name="dialog_unsaved_changes_title">Vous avez des modifications non enregistrés</string>
<string name="dialog_unsaved_changes_message">Désirez-vous vraiment quitter sans enregistrer?</string>
<string name="dialog_unsaved_changes_discard">Abandonner</string>
<string name="dialog_unsaved_changes_save">@string/screen_share_files_save_button_text</string>
<string name="dialog_file_name_title">@string/screen_file_browser_action_create_new_text_file</string>
<string name="dialog_file_name_create">@string/screen_enter_vault_name_button_text</string>
<string name="dialog_file_name_cancel">@string/dialog_button_cancel</string>
<string name="dialog_file_name_placeholder">texte.txt</string>
<string name="dialog_delete_vault_positive_button_text">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_delete_vault_message">Êtes-vous sûr de vouloir retirer ce coffre-fort?</string>
<string name="dialog_delete_vault_hint">Cette action ne fera que retirer le coffre-fort de cette liste sans le supprimer physiquement.</string>
<string name="dialog_upload_file_title">Téléversement&#8230;</string>
<string name="dialog_upload_file_cancel_button">@string/dialog_button_cancel</string>
<string name="dialog_upload_file_remaining">Fichier %1$d à %2$d</string>
<string name="dialog_export_file_title">Exportation (%1$d/%2$d)</string>
<string name="dialog_export_file_cancel_button">@string/dialog_button_cancel</string>
<string name="dialog_progress_please_wait">Patientez s\'il vous plaît&#8230;</string>
<string name="dialog_progress_creating_folder">Création du dossier&#8230;</string>
<string name="dialog_progress_creating_text_file">Création du fichier texte&#8230;</string>
@ -348,104 +242,68 @@
<string name="dialog_progress_decryption">Déchiffrement&#8230;</string>
<string name="action_progress_moving">Déplacement&#8230;</string>
<string name="dialog_lock_vault">Verouiller</string>
<string name="dialog_accept_ssl_certificate_title">Certificat SSL invalide</string>
<string name="dialog_accept_ssl_certificate_hint">Le certificat SSL n\'est pas valide. Vous voulez quand même lui faire confiance?</string>
<string name="dialog_accept_ssl_certificate_details">Détails</string>
<string name="dialog_accept_ssl_certificate_security_checkbox">Cela pourrait constituer un risque pour la sécurité. Je sais ce que je fais.</string>
<string name="dialog_http_security_hint">L\'utilisation du HTTP n\'est pas sûre. Nous recommandons d\'utiliser plutôt le HTTPS. Si vous connaissez les risques, vous pouvez continuer à utiliser HTTP.</string>
<string name="dialog_http_security_checkbox">Passage au HTTPS</string>
<string name="dialog_http_security_title">Utiliser le HTTPS?</string>
<string name="dialog_no_screen_lock_hint">Aucun verrouillage de l\'écran n\'est activé. Pour stocker vos informations d\'identification de manière sécurisée, définissez un schéma ou un mot de passe avec OK.</string>
<string name="dialog_no_screen_lock_title">Régler le verrouillage de l\'écran?</string>
<string name="dialog_no_screen_lock_checkbox">Régler le verrouillage de l\'écran</string>
<string name="dialog_no_biometric_auth_set_up_title">Aucune authentification de base n\'est configurée dans le système</string>
<string name="dialog_no_biometric_auth_set_up_message">Inscrivez au moins un doigt/visage pour utiliser ce service.</string>
<string name="dialog_debug_mode_disclaimer_hint">Dans ce mode, les données sensibles peuvent être écrites dans un fichier journal sur votre appareil (par exemple, les noms de fichiers et les chemins d\'accès). Les mots de passe, cookies, etc. sont explicitement exclus.\n\nN\'oubliez pas de désactiver le mode de débogage dès que possible.</string>
<string name="dialog_debug_mode_disclaimer_title">Attention</string>
<string name="dialog_debug_mode_disclaimer_title">Avertissement</string>
<string name="dialog_debug_mode_positive_button">Activer</string>
<string name="dialog_debug_mode_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_disable_app_obscured_disclaimer_hint">Ce paramètre est une fonction de sécurité qui empêche les autres applications de tromper les utilisateurs en leur faisant faire des choses qu\'ils ne veulent pas faire.\n\nEn le désactivant, vous confirmez que vous êtes <a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">conscients des risques</a>.</string>
<string name="dialog_disable_app_obscured_disclaimer_title">Attention</string>
<string name="dialog_disable_app_obscured_disclaimer_title">Avertissement</string>
<string name="dialog_disable_app_obscured_positive_button">Désactiver</string>
<string name="dialog_disable_app_obscured_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_app_is_obscured_info_title">\'application est masquée</string>
<string name="dialog_app_is_obscured_info_hint">Une autre application affiche quelque chose au-dessus de Cryptomator (par exemple, un filtre de lumière bleue ou une application forçant le mode nuit). Pour des raisons de sécurité, Cryptomator est désactivé.\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Comment activer Cryptomator</a></string>
<string name="dialog_app_is_obscured_info_neutral_button">Fermer</string>
<string name="dialog_disable_secure_screen_disclaimer_hint">Ce paramètre est une fonction de sécurité qui empêche les autres applications de tromper les utilisateurs en leur faisant faire des choses qu\'ils ne veulent pas faire.\n\nEn le désactivant, vous confirmez que vous êtes <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">conscients des risques</a>.</string>
<string name="dialog_delete_cloud_connection_with_vaults_message">Êtes-vous sûr de vouloir supprimer cette connexion au cloud?</string>
<string name="dialog_delete_cloud_connection_with_vaults_hint">Cette action retirera l\'accès à ce cloud et à tous les coffre-fort de celui-ci.</string>
<string name="dialog_delete_cloud_connection_with_vaults_positive_button">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_delete_cloud_connection_with_vaults_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_confirm_delete_positive_button">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_confirm_delete_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_confirm_delete_multiple_title">Supprimé %1$d éléments?</string>
<string name="dialog_confirm_delete_multiple_message">Êtes-vous sûr de vouloir supprimer ces éléments?</string>
<string name="dialog_confirm_delete_file_message">Êtes-vous sûr de vouloir supprimer ce fichier?</string>
<string name="dialog_confirm_delete_folder_message">Cela supprimera tout le contenu du dossier. Êtes-vous sûr de vouloir supprimer ce dossier?</string>
<string name="dialog_biometric_auth_key_invalidated_title">Fonctionnalité d\'authentification biométrique désactivée</string>
<string name="dialog_biometric_auth_key_invalidated_message">La clé ayant été invalidée, la fonctionnalité d\'authentification biométrique a été désactivée. Pour la réactiver, ouvrez les paramètres de Cryptomator.</string>
<string name="dialog_biometric_auth_key_invalidated_neutral_button">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_enter_license_title">Fournir une licence valide</string>
<string name="dialog_enter_license_content">Nous avons détecté que vous avez installé Cryptomator sans utiliser le Play Store de Google. Fournissez une licence valide, qui peut être achetée sur <a href="https://cryptomator.org/android/">https://cryptomator.org/android/</a></string>
<string name="dialog_enter_license_not_valid_content">La licence fournie n\'est pas valide. Vérifiez que vous l\'avez saisie correctement.</string>
<string name="dialog_enter_license_no_content">Aucune licence n\'est fournie. Veuillez saisir une licence valide.</string>
<string name="dialog_enter_license_ok_button">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_enter_license_decline_button">Sortie</string>
<string name="dialog_license_confirmation_title">Confirmation de la licence</string>
<string name="dialog_license_confirmation_message">Merci %1$s d\'avoir fourni votre licence valide.</string>
<string name="dialog_license_confirmation_ok_btn">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_update_available_title">Mise à jour disponible</string>
<string name="dialog_update_available_message">Mettez à jour Cryptomator vers la dernière version. En appuyant sur OK, nous téléchargerons l\'application en arrière-plan et vous proposerons de l\'installer.</string>
<string name="dialog_update_available_update">Mettre à jour maintenant</string>
<string name="dialog_update_available_download_site">Accéder au site de téléchargements</string>
<string name="dialog_update_available_cancel">Plus tard</string>
<string name="dialog_download_update_title">Téléchargement en cours</string>
<string name="dialog_download_update_message">Téléchargement de la dernière version de Cryptomator</string>
<string name="dialog_sym_link_title">Le dossier est un lien symbolique</string>
<string name="dialog_sym_link_message">Vous ne pouvez pas naviguer dans ce lien symbolique</string>
<string name="dialog_sym_link_back_button">Retour</string>
<string name="dialog_no_dir_file_title">Impossible de charger le contenu du répertoire</string>
<string name="dialog_no_dir_file_message">Le dossier cloud \'%1$s\' n\'a pas de fichier de répertoire. Il se peut que le dossier ait été créé sur un autre appareil et qu\'il n\'ait pas encore été entièrement synchronisé avec le cloud. Veuillez vérifier dans votre cloud si le fichier suivant existe: \n%2$s</string>
<string name="dialog_no_dir_file_back_button">@string/dialog_sym_link_back_button</string>
<string name="dialog_beta_confirmation_title">Version bêta</string>
<string name="dialog_beta_confirmation">Il s\'agit d\'une version bêta qui introduit la prise en charge du format de coffre-fort vault 7. Veuillez vous assurer que vous n\'utilisez pas votre coffre-fort principal pour les tests ou que vous disposez d\'une bonne stratégie de sauvegarde.</string>
<string name="permission_snackbar_auth_local_vault">Cryptomator a besoin de l\'accès au stockage pour utiliser les coffres locaux</string>
<string name="permission_snackbar_auth_auto_upload">Cryptomator a besoin de l\'accès au stockage pour effectuer le téléversement automatique de photos</string>
<!-- # error reports -->
<string name="error_report_subject">Rapport d\'erreur Android</string>
<string name="error_report_section_summary">Résumé</string>
<string name="error_report_summary_description">Insérez une courte description de ce que vous avez essayé de faire ou mentionnez votre ticket d\'assistance si vous en avez déjà créé un.</string>
<string name="error_report_section_device">Informations sur l\'appareil</string>
<!-- # misc -->
<!-- ## file size helper -->
<string name="file_size_zero">Zero kB</string>
<string name="file_size_unit_bytes">bytes</string>
<string name="file_size_unit_kilo_bytes">kB</string>
<string name="file_size_unit_mega_bytes">MB</string>
<string name="file_size_unit_giga_bytes">GB</string>
<string name="file_size_unit_tera_bytes">TB</string>
<string name="file_size_zero">Zéro Ko</string>
<string name="file_size_unit_bytes">octets</string>
<string name="file_size_unit_kilo_bytes">ko</string>
<string name="file_size_unit_mega_bytes">Mo</string>
<string name="file_size_unit_giga_bytes">Go</string>
<string name="file_size_unit_tera_bytes">To</string>
<!-- ## date helper -->
<string name="time_unit_seconds_sg">seconde</string>
<string name="time_unit_seconds_pl">secondes</string>
@ -461,54 +319,39 @@
<string name="time_unit_months_pl">mois</string>
<string name="time_unit_years_sg">année</string>
<string name="time_unit_years_pl">années</string>
<!-- ## biometric authentication -->
<string name="dialog_biometric_auth_title">Identification biométrique</string>
<string name="dialog_biometric_auth_message">Connectez-vous à l\'aide de votre identifiant biométrique</string>
<string name="dialog_biometric_auth_use_password">Utiliser le mot de passe du coffre-fort</string>
<string name="dialog_unable_to_auto_upload_files_title">"Impossible de téléverser automatiquement les fichiers"</string>
<string name="dialog_unable_to_auto_upload_files_title">Impossible de téléverser automatiquement les fichiers</string>
<!-- notification -->
<string name="notification_unlocked">Coffre-fort déverrouillées: %1$d</string>
<string name="notification_timeout">Verrouillage automatique dans %1$s</string>
<string name="notification_lock_all">Tout verrouiller</string>
<string name="notification_cancel_auto_upload">Annuler le téléversement</string>
<string name="notification_auto_upload_title">Téléversement auto de photos en cours</string>
<string name="notification_auto_upload_message">Téléversement %1d/%2d</string>
<string name="notification_auto_upload_finished_title">Téléversement auto des photos terminé</string>
<string name="notification_auto_upload_finished_message">%1$d images téléversées dans le coffre-fort</string>
<string name="notification_auto_upload_failed_title">Échec du téléversement auto des photos</string>
<string name="notification_auto_upload_failed_general_error">Une erreur générale s\'est produite lors du téléversement.</string>
<string name="notification_auto_upload_failed_due_to_folder_not_exists">Le dossier sélectionné pour le téléversement n\'est plus disponible. Accédez aux paramètres et choisissez-en un nouveau</string>
<string name="notification_auto_upload_failed_due_to_vault_locked">Coffre-fort verrouillé pendant le téléchargement, veuillez rouvrir le coffre-fort pour continuer</string>
<string name="notification_cancel_open_writable_file">@string/dialog_button_cancel</string>
<string name="notification_open_writable_file_title">Ouvrir un fichier accessible en écriture</string>
<string name="notification_open_writable_file_message">Le coffre-fort reste déverrouillé jusqu\'à la fin des modifications</string>
<string name="notification_update_check_finished_latest">Dernière version installée</string>
<string name="screen_settings_lru_cache">Cache</string>
<string name="screen_settings_lru_cache_toggle">@string/screen_settings_section_auto_photo_upload_toggle</string>
<string name="screen_settings_lru_cache_size">Taille totale du cache</string>
<string name="screen_settings_clear_lru_cache_size">Vider le cache</string>
<string name="screen_settings_lru_cache_changed__restart_toast">Les changements seront appliqués lors du prochain démarrage de l\'application</string>
<string name="screen_settings_license">Enregistré pour</string>
<string name="screen_settings_license_mail">%1$s</string>
<string name="dialog_settings_update_check_interval_title">Intervalle de vérification des mises à jour</string>
<string name="screen_settings_check_updates">Vérifier les mises à jour</string>
<string name="screen_settings_last_check_updates">Dernière exécution %1$s</string>
<string name="screen_settings_last_check_updates_never">@string/lock_timeout_never</string>
<string name="screen_settings_last_check_updates_never_pre_marshmallow">Jamais ~ Si la vérification de mise à jour ne peut être effectué pour des raisons techniques, les mises à jour peuvent être téléchargées et installées manuellement à partir du site https://cryptomator.org/android/.</string>
<string name="dialog_cache_size_title">Taille du cache par cloud</string>
<!-- lock timeout names -->
<string name="lock_timeout_instant">Instantané</string>
<string name="lock_timeout_1m">1 minute</string>
@ -516,26 +359,21 @@
<string name="lock_timeout_5m">5 minutes</string>
<string name="lock_timeout_10m">10 minutes</string>
<string name="lock_timeout_never">Jamais</string>
<!-- cache size names -->
<string name="cache_size_50m">50 MB</string>
<string name="cache_size_100m">100 MB</string>
<string name="cache_size_250m">250 MB</string>
<string name="cache_size_500m">500 MB</string>
<string name="cache_size_1000m">1 GB</string>
<string name="cache_size_5000m">5 GB</string>
<string name="cache_size_50m">50 Mo</string>
<string name="cache_size_100m">100 Mo</string>
<string name="cache_size_250m">250 Mo</string>
<string name="cache_size_500m">500 Mo</string>
<string name="cache_size_1000m">1 Go</string>
<string name="cache_size_5000m">5 Go</string>
<!-- screen scheme mode names -->
<string name="screen_settings_style_mode">Style</string>
<string name="screen_settings_style_mode">Aspect</string>
<string name="follow_system">Automatique (suivre le système)</string>
<string name="light">Clair</string>
<string name="dark">Sombre</string>
<!-- update interval names -->
<string name="update_interval_1d">Une fois par jour</string>
<string name="update_interval_1w">Une fois par semaine</string>
<string name="update_interval_1m">Une fois par mois</string>
<string name="dialog_update_available_title">Mise à jour disponible</string>
<string name="update_interval_never">@string/lock_timeout_never</string>
</resources>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- # app -->
<!-- # error messages -->
<!-- # clouds -->
<!-- ## cloud names -->
<!-- # permission -->
<!-- ## permission messages -->
<!-- # screens -->
<!-- # screen: vault list -->
<!-- # screen: file browser -->
<!-- ## screen: text editor -->
<!-- ## screen: share files -->
<!-- ## screen: choose cloud service -->
<!-- ## screen: cloud connections -->
<!-- ## screen: webdav settings -->
<!-- ## screen: enter vault name -->
<!-- ## screen: set password -->
<!-- ## screen: settings -->
<!-- ## screen: cloud settings -->
<!-- ## screen: licenses -->
<!-- ## screen: authenticate cloud -->
<!-- ## screen: empty dir file info -->
<!-- ## screen: insecure android version info -->
<!-- # dialogs -->
<!-- Vault not found -->
<!-- # error reports -->
<!-- # misc -->
<!-- ## file size helper -->
<!-- ## date helper -->
<!-- ## biometric authentication -->
<!-- notification -->
<!-- lock timeout names -->
<!-- cache size names -->
<!-- screen scheme mode names -->
<!-- update interval names -->
</resources>

View File

@ -66,8 +66,8 @@
<item name="android:layout_height">48dp</item>
<item name="android:textSize">16sp</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_marginLeft">16dp</item>
<item name="android:layout_marginRight">16dp</item>
<item name="android:layout_marginStart">16dp</item>
<item name="android:layout_marginEnd">16dp</item>
<item name="android:paddingBottom">16dp</item>
<item name="android:drawablePadding">32dp</item>
<item name="android:clickable">true</item>

View File

@ -1,11 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- # app -->
<string name="app_name">Cryptomator</string>
<string name="share_with_label">Şifrele</string>
<string name="download_subdirectory_name">@string/app_name</string>
<!-- # error messages -->
<string name="error_generic">Bir hata oluştu</string>
<string name="error_authentication_failed">Kullanıcı adı veya şifre yanlış</string>
@ -29,136 +25,90 @@
<string name="error_failed_to_decrypt_webdav_password">WebDAV şifresi çözülemedi, lütfen ayarlara yeniden ekleyin</string>
<string name="error_play_services_not_available">Play Hizmetleri yüklü değil</string>
<string name="error_biometric_auth_aborted">Biyometrik kimlik doğrulama iptal edildi</string>
<!-- # clouds -->
<!-- ## cloud names -->
<string name="cloud_names_crypto">Kripto</string>
<string name="cloud_names_dropbox">Dropbox</string>
<string name="cloud_names_google_drive">Google Drive</string>
<string name="cloud_names_onedrive">OneDrive</string>
<string name="cloud_names_webdav">WebDAV</string>
<string name="cloud_names_local_storage">Yerel depolama</string>
<!-- # permission -->
<!-- ## permission messages -->
<string name="permission_message_export_file">Cryptomator\'un dosyaları dışa aktarmak için depolama erişimine ihtiyacı var</string>
<string name="permission_message_upload_file">Cryptomator\'un dosyaları yüklemek için depolama erişimine ihtiyacı var</string>
<string name="permission_message_share_file">Cryptomator\'un dosyaları paylaşmak için depolama erişimine ihtiyacı var</string>
<string name="snack_bar_action_title_settings">Ayarlar</string>
<string name="snack_bar_action_title_search">Ara</string>
<string name="snack_bar_action_title_search_previous">Önceki</string>
<string name="snack_bar_action_title_search_next">Sonraki</string>
<string name="snack_bar_action_title_sort">Sırala</string>
<string name="snack_bar_action_title_sort_az">A - Z</string>
<string name="snack_bar_action_title_sort_za">Z - A</string>
<string name="snack_bar_action_title_sort_newest">Önce en yenisi</string>
<string name="snack_bar_action_title_sort_oldest">Önce en eskisi</string>
<string name="snack_bar_action_title_sort_biggest">Önce en büyüğü</string>
<string name="snack_bar_action_title_sort_smallest">Önce en küçüğü</string>
<!-- # screens -->
<!-- # screen: vault list -->
<string name="screen_vault_list_actions_title">Cryptomator\'a ekle</string>
<string name="screen_vault_list_action_create_new_vault">Yeni kasa oluştur</string>
<string name="screen_vault_list_action_add_existing_vault">Mevcut kasayı ekle</string>
<string name="screen_vault_list_vault_action_rename">@string/screen_file_browser_node_action_rename</string>
<string name="screen_vault_list_vault_action_delete">Kaldır</string>
<string name="screen_vault_list_vault_creation_hint">Kasa oluşturmak/eklemek için burayı tıklayın</string>
<string name="screen_vault_list_change_password_successful">Şifre başarıyla değiştirildi</string>
<!-- # screen: file browser -->
<string name="screen_file_browser_default_title">Kasa</string>
<string name="screen_file_browser_subtitle_add_existing_vault">@string/screen_vault_list_action_add_existing_vault</string>
<string name="screen_file_browser_add_existing_vault_extra_text">Ana anahtar dosyasını seçin</string>
<string name="screen_file_browser_subtitle_create_new_vault">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_file_browser_create_new_vault_button_text">Buraya kaydet</string>
<string name="screen_file_browser_create_new_vault_extra_text">Kasa adı: %1$s</string>
<plurals name="screen_file_browser_subtitle_move">
<item quantity="one">%1$s öğesini şuraya taşı</item>
<item quantity="other">%2$d öğeyi şuraya taşı</item>
</plurals>
<string name="screen_file_browser_move_button_text">Taşı</string>
<string name="screen_file_browser_msg_empty_folder">Boş</string>
<string name="screen_file_browser_file_info_label_size">%1$s</string>
<string name="screen_file_browser_file_info_label_date">%1$s önce değiştirildi</string>
<string name="screen_file_browser_share_intent_chooser_title">İle paylaş</string>
<string name="screen_file_browser_share_destination_title">Bir varış noktası seçin</string>
<string name="screen_file_browser_share_button_text">Seç</string>
<string name="screen_file_browser_nothing_to_share">Paylaşacak bir şey yok</string>
<string name="screen_file_browser_actions_title">%1$s listesine ekle</string>
<string name="screen_file_browser_action_create_folder">Klasör oluştur</string>
<string name="screen_file_browser_action_create_new_text_file">Metin dosyası oluştur</string>
<string name="screen_file_browser_action_upload_files">Dosya yükle</string>
<string name="screen_file_browser_upload_files_chooser_title">Dosyalar</string>
<string name="screen_file_browser_msg_file_exported">Dosya başarıyla dışa aktarıldı</string>
<string name="screen_file_browser_msg_files_exported">Dosyalar başarıyla dışa aktarıldı</string>
<string name="screen_file_browser_nothing_to_export">Dışa aktarılacak bir şey yok</string>
<string name="screen_file_browser_msg_creating_download_dir_failed">İndirme dizini oluşturulamadı</string>
<string name="screen_file_browser_node_action_share">Paylaş</string>
<string name="screen_file_browser_node_action_rename">Yeniden adlandır</string>
<string name="screen_file_browser_node_action_edit_text">Düzenle</string>
<string name="screen_file_browser_node_action_move">@string/screen_file_browser_move_button_text</string>
<string name="screen_file_browser_node_action_export">Dışa aktar</string>
<string name="screen_file_browser_node_action_delete">Sil</string>
<string name="screen_file_browser_node_action_open_with_text">Bununla aç&#8230;</string>
<string name="screen_file_browser_selection_mode_title_zero_elements">Öğeleri seç</string>
<string name="screen_file_browser_selection_mode_title_one_or_more_elements">%1$d seçildi</string>
<string name="screen_file_browser_select_items">Seç&#8230;</string>
<string name="screen_file_browser_select_all_items">Tümünü seç</string>
<string name="screen_file_browser_refresh_items">Yenile</string>
<string name="screen_file_browser_no_connection_message">Bağlantı yok</string>
<string name="screen_file_browser_no_connection_button_text">Yeniden dene</string>
<!-- ## screen: text editor -->
<string name="screen_text_editor_save_success">Başarıyla kaydedildi</string>
<!-- ## screen: share files -->
<string name="screen_share_files_title">%1$s kaydet&#8230;</string>
<string name="screen_share_files_content_text">Metin</string>
<string name="screen_share_files_content_file">Dosya</string>
<string name="screen_share_files_content_files">Dosyalar</string>
<string name="screen_share_files_msg_filenames_must_be_unique">Dosya adları benzersiz olmalıdır, lütfen kopyaları yeniden adlandırın.</string>
<string name="screen_share_files_section_files">@string/screen_share_files_content_files</string>
<string name="screen_share_files_section_location">Konumu kaydet</string>
<string name="screen_share_files_save_button_text">Kaydet</string>
<string name="screen_share_files_msg_success">Şifreleme tamamlandı</string>
<string name="screen_share_files_new_text_file">@string/dialog_file_name_placeholder</string>
<!-- ## screen: choose cloud service -->
<string name="screen_choose_cloud_service_title">Bulut hizmeti</string>
<string name="screen_choose_cloud_service_subtitle_add_existing_vault">@string/screen_vault_list_action_add_existing_vault</string>
<string name="screen_choose_cloud_service_subtitle_create_new_vault">@string/screen_vault_list_action_create_new_vault</string>
<!-- ## screen: cloud connections -->
<string name="screen_cloud_connections_title">Bir yer seçin</string>
<string name="screen_cloud_settings_option_edit">@string/screen_file_browser_node_action_edit_text</string>
<string name="screen_cloud_settings_option_delete">@string/screen_vault_list_vault_action_delete</string>
<string name="screen_cloud_connections_no_connections">Konum eklemek için + butonunu tıklayın</string>
<string name="screen_cloud_error_webdav_not_supported">Sunucu WebDAV uyumlu görünmüyor</string>
<string name="screen_cloud_local_custom_storage_title">Özel konumlar</string>
<string name="screen_cloud_local_default_storage_title">Varsayılan depolama</string>
<string name="screen_cloud_local_error_no_content_provider">Kullanılabilir ek konum yok.</string>
<!-- ## screen: webdav settings -->
<string name="screen_webdav_settings_title">@string/cloud_names_webdav</string>
<string name="screen_webdav_settings_url_port_label">URL</string>
<string name="screen_webdav_settings_username_label">Kullanıcı adı</string>
<string name="screen_webdav_settings_password_label">Parola</string>
<string name="screen_webdav_settings_done_button_text">Bağlan</string>
@ -166,31 +116,22 @@
<string name="screen_webdav_settings_msg_url_is_invalid">URL geçersiz.</string>
<string name="screen_webdav_settings_msg_username_must_not_be_empty">Kullanıcı adı boş olamaz.</string>
<string name="screen_webdav_settings_msg_password_must_not_be_empty">Parola boş olamaz.</string>
<!-- ## screen: enter vault name -->
<string name="screen_enter_vault_name_title">@string/screen_vault_list_action_create_new_vault</string>
<string name="screen_enter_vault_name_msg_name_empty">Kasa adı boş olamaz.</string>
<string name="screen_enter_vault_name_vault_label">Kasa adı</string>
<string name="screen_enter_vault_name_button_text">Oluştur</string>
<!-- ## screen: set password -->
<string name="screen_set_password_title">Şifreyi belirle</string>
<string name="screen_set_password_msg_password_empty">@string/screen_webdav_settings_msg_password_must_not_be_empty</string>
<string name="screen_set_password_msg_password_mismatch">Parola, yeniden yazılan parolayla eşleşmiyor.</string>
<string name="screen_set_password_button_text">Bitti</string>
<string name="screen_set_password_hint">ÖNEMLİ UYARI: Parolanızı unutursanız, verilerinizi kurtarmanın herhangi bir yolu yoktur.</string>
<string name="screen_set_password_password_label">@string/screen_webdav_settings_password_label</string>
<string name="screen_set_password_retype_password_label">Yeni şifreyi tekrar yazın</string>
<string name="screen_set_password_strength_indicator_0">Çok zayıf</string>
<string name="screen_set_password_strength_indicator_1">Güçsüz</string>
<string name="screen_set_password_strength_indicator_2">Makul</string>
<string name="screen_set_password_strength_indicator_3">Kuvvetli</string>
<string name="screen_set_password_strength_indicator_4">Çok güçlü</string>
<!-- ## screen: settings -->
<string name="screen_settings_title">@string/snack_bar_action_title_settings</string>
<string name="screen_settings_section_general">Genel</string>
<string name="screen_settings_cloud_settings_label">Kaydetme konumları</string>
<string name="screen_settings_biometric_auth">Biyometrik kimlik doğrulama</string>
@ -201,93 +142,60 @@
<string name="screen_settings_section_search">Arama</string>
<string name="screen_settings_live_search">Canlı arama</string>
<string name="screen_settings_glob_search">Glob kalıbı kullanarak ara</string>
<string name="screen_settings_section_auto_lock">Otomatik Kilitleme</string>
<string name="screen_settings_auto_lock_timeout">Kilitleme zamanı</string>
<string name="screen_settings_auto_lock_on_screen_lock">Ekran devre dışı bırakıldığında</string>
<string name="screen_settings_section_auto_photo_upload">Otomatik Fotoğraf Yükleme</string>
<string name="screen_settings_section_auto_photo_upload_vault">Yükleme için kasa seçin</string>
<string name="screen_settings_section_auto_photo_upload_toggle">Etkinleştir</string>
<string name="screen_settings_section_auto_photo_upload_only_wifi_toggle">Yalnızca WIFI kullanarak yükle</string>
<string name="screen_settings_auto_photo_upload_title">Otomatik yükleme&#8230;</string>
<string name="screen_settings_section_social">@string/screen_webdav_settings_done_button_text</string>
<string name="screen_settings_website_label">Cryptomator web sitesi</string>
<string name="screen_settings_twitter_label">Bizi Twitter\'da takip edin</string>
<string name="screen_settings_facebook_label">Bizi Facebook\'ta beğenin</string>
<string name="screen_settings_website_uri">https://cryptomator.org</string>
<string name="screen_settings_facebook_uri">https://facebook.com/Cryptomator</string>
<string name="screen_settings_twitter_uri">https://twitter.com/Cryptomator</string>
<string name="screen_settings_section_legal">Yasal</string>
<string name="screen_settings_licenses_label">Lisanslar</string>
<string name="screen_settings_license_terms_label">Lisans şartları</string>
<string name="screen_settings_section_support">Destek</string>
<string name="screen_settings_contact_label">Yardım isteyin</string>
<string name="screen_settings_support_uri">https://cryptomator.org/contact/</string>
<string name="screen_settings_debug_mode_label">Hata ayıklama modu</string>
<string name="screen_settings_error_report_label">Günlük dosyası gönder</string>
<string name="screen_settings_error_report_failed">Gönderim başarısız oldu</string>
<string name="screen_settings_security_label">Güvenlik ipuçları</string>
<string name="screen_settings_security_url">https://docs.cryptomator.org/en/1.5/security/best-practices/</string>
<string name="screen_settings_section_version">Sürüm</string>
<string name="screen_settings_keep_unlocked_while_editing_files">Düzenlerken kasa kilidi açık</string>
<string name="screen_settings_advanced_settings">Gelişmiş Ayarlar</string>
<string name="screen_settings_background_unlock_preparation_label">Arka planda kilit açma</string>
<!-- ## screen: cloud settings -->
<string name="screen_cloud_settings_title">@string/screen_settings_cloud_settings_label</string>
<string name="screen_cloud_settings_webdav_connections">WebDAV bağlantıları</string>
<string name="screen_cloud_settings_local_storage_locations">Yerel depolama konumları</string>
<string name="screen_cloud_settings_log_in_to">Giriş</string>
<string name="screen_cloud_settings_sign_out_from_cloud">Oturumunu kapat</string>
<!-- ## screen: licenses -->
<string name="screen_licenses_title">@string/screen_settings_licenses_label</string>
<!-- ## screen: authenticate cloud -->
<string name="screen_authenticate_auth_authentication_failed">%1$s kimliği doğrulanamadı.</string>
<!-- ## screen: empty dir file info -->
<string name="screen_empty_dir_file_info_title">\'%1$s\' ulaşılamaz</string>
<string name="screen_empty_dir_file_info_headline">Cryptomator bu klasöre erişilemediğini tespit etti.</string>
<string name="screen_empty_dir_file_info_text">Dizin dosyasını bulut sağlayıcınız aracılığıyla boş olmayan önceki bir sürüme geri yüklemeyi deneyin. Söz konusu dosya:\n%1$s\n\nBu işe yaramazsa, kasanızı sorunlar için kontrol etmek ve muhtemelen verilerinizi geri yüklemek için Sanitizer\'ı kullanabilirsiniz.</string>
<string name="screen_empty_dir_file_info_button_label">Sanitizer Hakkında Daha Fazla Bilgi</string>
<!-- ## screen: insecure android version info -->
<!-- # dialogs -->
<string name="dialog_button_cancel">İptal</string>
<string name="dialog_create_folder_title">@string/screen_file_browser_action_create_folder</string>
<string name="dialog_create_folder_positive_button">@string/screen_enter_vault_name_button_text</string>
<string name="dialog_enter_password_password_label">@string/screen_webdav_settings_password_label</string>
<string name="dialog_enter_password_positive_button">Kilidi Aç</string>
<string name="dialog_change_password_old_password_label">Eski şifre</string>
<string name="dialog_change_password_new_password_label">Yeni şifre</string>
<string name="dialog_change_password_new_retype_password_label">@string/screen_set_password_retype_password_label</string>
<string name="dialog_change_password">Şifreyi değiştir</string>
<string name="dialog_change_password_msg_old_password_empty">Eski şifre boş olamaz.</string>
<string name="dialog_change_password_msg_new_password_empty">Yeni şifre boş olamaz.</string>
<string name="dialog_change_password_msg_password_mismatch">Yeni parola, parola tekrarı ile eşleşmiyor.</string>
<!-- Vault not found -->
<string name="dialog_vault_not_found_title">%1$s kasası bulunamadı</string>
<string name="dialog_vault_not_found_message">Kasa yeniden adlandırılmış, taşınmış veya silinmiş olabilir. Bu kasayı listeden çıkarın ve devam etmek için tekrar ekleyin. Şimdi kaldırılsın mı?</string>
<string name="dialog_vault_not_found_positive_button_text">Kaldır</string>
<string name="dialog_existing_file_title">Dosya zaten mevcut</string>
<string name="dialog_existing_file_positive_button">Değiştir</string>
<string name="dialog_existing_file_message">\'%1$s\' adlı bir dosya zaten var.</string>
<string name="dialog_replace_negative_button_at_least_two_but_not_all_files_exist">Var olanı atla</string>
<string name="dialog_replace_positive_button_all_files_exist">Tümünü değiştir</string>
<string name="dialog_replace_positive_button_some_files_exist">Var olanı değiştir</string>
@ -297,44 +205,24 @@
<string name="dialog_replace_msg_some_files_exists">%d dosya zaten var. Onları değiştirmek ister misin?</string>
<string name="dialog_replace_title_single_file_exists">Dosya değiştirilsin mi?</string>
<string name="dialog_replace_title_multiple_files_exist">Dosyalar değiştirilsin mi?</string>
<string name="dialog_unable_to_share_title">Dosyalar paylaşılamıyor</string>
<string name="dialog_unable_to_share_message">Daha önce herhangi bir kasa oluşturmadınız! Önce Cryptomator uygulamasıyla yeni bir kasa oluşturun lütfen.</string>
<string name="dialog_unable_to_share_positive_button">Tamam</string>
<string name="dialog_unable_to_share_negative_button">Kasa oluştur</string>
<string name="dialog_filetype_not_supported_title">%1$s açılamıyor</string>
<string name="dialog_filetype_not_supported_positive_button">@string/screen_file_browser_node_action_export</string>
<string name="dialog_filetype_not_supported_message">Lütfen bu dosyayı açabilecek bir uygulama indirin veya cihazınıza kaydetmek ister misiniz?</string>
<string name="dialog_rename_vault_title">Kasayı yeniden adlandır</string>
<string name="dialog_rename_vault_positive_button">@string/screen_file_browser_node_action_rename</string>
<string name="dialog_rename_node_folder_title">Dosyayı yeniden adlandır</string>
<string name="dialog_rename_node_file_title">Dosyayı yeniden adlandır</string>
<string name="dialog_rename_node_positive_button">@string/screen_file_browser_node_action_rename</string>
<string name="dialog_unsaved_changes_title">Kaydedilmemiş değişiklikleriniz mevcut</string>
<string name="dialog_unsaved_changes_message">Kaydetmeden çıkmak istiyor musunuz?</string>
<string name="dialog_unsaved_changes_discard">Gözardı et</string>
<string name="dialog_unsaved_changes_save">@string/screen_share_files_save_button_text</string>
<string name="dialog_file_name_title">@string/screen_file_browser_action_create_new_text_file</string>
<string name="dialog_file_name_create">@string/screen_enter_vault_name_button_text</string>
<string name="dialog_file_name_cancel">@string/dialog_button_cancel</string>
<string name="dialog_file_name_placeholder">metin.txt</string>
<string name="dialog_delete_vault_positive_button_text">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_delete_vault_message">Bu kasayı kaldırmak istediğinizden emin misiniz?</string>
<string name="dialog_delete_vault_hint">Bu işlem kasayı yalnızca bu listeden kaldıracak ve fiziksel olarak silmeyecektir.</string>
<string name="dialog_upload_file_title">Yükleniyor&#8230;</string>
<string name="dialog_upload_file_cancel_button">@string/dialog_button_cancel</string>
<string name="dialog_upload_file_remaining">%1$d / %2$d dosyası</string>
<string name="dialog_export_file_title">Dışa aktarılıyor (%1$d/%2$d)</string>
<string name="dialog_export_file_cancel_button">@string/dialog_button_cancel</string>
<string name="dialog_progress_please_wait">Lütfen bekleyin&#8230;</string>
<string name="dialog_progress_creating_folder">Klasör oluşturuluyor&#8230;</string>
<string name="dialog_progress_creating_text_file">Metin dosyası oluşturuluyor&#8230;</string>
@ -350,105 +238,65 @@
<string name="dialog_progress_decryption">Şifre çözülüyor&#8230;</string>
<string name="action_progress_moving">Taşınıyor&#8230;</string>
<string name="dialog_lock_vault">Kilitle</string>
<string name="dialog_accept_ssl_certificate_title">Geçersiz SSL sertifikası</string>
<string name="dialog_accept_ssl_certificate_hint">SSL sertifikası geçersiz. Yine de güvenmek istiyor musun?</string>
<string name="dialog_accept_ssl_certificate_details">Detaylar</string>
<string name="dialog_accept_ssl_certificate_security_checkbox">Bu bir güvenlik riski olabilir! Ne yaptığımı biliyorum.</string>
<string name="dialog_http_security_hint">HTTP\'nin kullanımı güvensizdir. Bunun yerine HTTPS kullanmanızı öneririz. Riskleri biliyorsanız, HTTP ile devam edebilirsiniz.</string>
<string name="dialog_http_security_checkbox">HTTPS\'ye geç</string>
<string name="dialog_http_security_title">HTTPS kullanılsın mı?</string>
<string name="dialog_no_screen_lock_hint">Ekran kilidi ayarlanmadı. Kimlik bilgilerinizi güvenli bir şekilde saklamak için, Tamam ile bir kalıp veya şifre ayarlayınız.</string>
<string name="dialog_no_screen_lock_title">Ekran kilidi ayarlansın mı?</string>
<string name="dialog_no_screen_lock_checkbox">Ekran kilidini ayarla</string>
<string name="dialog_no_biometric_auth_set_up_title">Sistemde temel kimlik doğrulama kurulumu yok</string>
<string name="dialog_no_biometric_auth_set_up_message">Bu hizmeti kullanmak için en az bir parmağınızı/yüzünüzü kaydedin.</string>
<string name="dialog_debug_mode_disclaimer_hint">Bu modda, hassas veriler cihazınızdaki bir günlük dosyasına (örn. Dosya adları ve yolları) yazılabilir. Şifreler, tanımlama vb. bilgiler hariç tutulmuştur.\n\nHata ayıklama modunu mümkün olan en kısa sürede devre dışı bırakmayı unutmayın.</string>
<string name="dialog_debug_mode_disclaimer_title">Dikkat</string>
<string name="dialog_debug_mode_positive_button">Etkinleştir</string>
<string name="dialog_debug_mode_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_disable_app_obscured_disclaimer_hint">Bu ayar bir güvenlik özelliğidir ve diğer uygulamaların, kullanıcıları kandırmasını engeller.\n\nDevre dışı bırakarak, <a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">risklerin farkında olduğunuzu onaylamış olursunuz</a>.</string>
<string name="dialog_disable_app_obscured_disclaimer_title">Dikkat</string>
<string name="dialog_disable_app_obscured_positive_button">Devre dışı bırak</string>
<string name="dialog_disable_app_obscured_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_app_is_obscured_info_title">Uygulama gizlendi</string>
<string name="dialog_app_is_obscured_info_hint">Cryptomator\'un üstünde çalışan bazı uygulamalar, (örn. Mavi ışık filtresi ve gece modu uygulamaları gibi) içeriği görüntüler! Bu nedenden dolayı, güvenlik amacıyla Cryptomator devre dışı bırakılır!\n\n<a href="https://docs.cryptomator.org/en/1.5/android/settings/#block-app-when-obscured">Cryptomator\'u tekrar nasıl etkinleştirebilirim?</a></string>
<string name="dialog_app_is_obscured_info_neutral_button">Kapat</string>
<string name="dialog_disable_secure_screen_disclaimer_hint">Bu ayar bir güvenlik özelliğidir ve diğer uygulamaların, kullanıcıları kandırmasını engeller.\n\nDevre dışı bırakarak, <a href="https://docs.cryptomator.org/en/1.5/android/settings/#screen-security">risklerin farkında olduğunuzu onaylamış olursunuz</a>.</string>
<string name="dialog_delete_cloud_connection_with_vaults_message">Bu bulut bağlantısını kaldırmak istediğinizden emin misiniz?</string>
<string name="dialog_delete_cloud_connection_with_vaults_hint">Bu işlem, bulut bağlantısını ve bu bulutun tüm kasalarını kaldıracak.</string>
<string name="dialog_delete_cloud_connection_with_vaults_positive_button">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_delete_cloud_connection_with_vaults_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_confirm_delete_positive_button">@string/screen_file_browser_node_action_delete</string>
<string name="dialog_confirm_delete_negative_button">@string/dialog_button_cancel</string>
<string name="dialog_confirm_delete_multiple_title">%1$d öğe silinsin mi?</string>
<string name="dialog_confirm_delete_multiple_message">Bu öğeleri silmek istediğinizden emin misiniz?</string>
<string name="dialog_confirm_delete_file_message">Bu dosyayı silmek istediğinizden emin misiniz?</string>
<string name="dialog_confirm_delete_folder_message">Klasördeki tüm içerikler silinecek! Bu klasörü silmek istediğinizden emin misiniz?</string>
<string name="dialog_biometric_auth_key_invalidated_title">Biyometrik kimlik doğrulama özelliği devre dışı bırakıldı</string>
<string name="dialog_biometric_auth_key_invalidated_message">Anahtar geçersiz olduğu için biyometrik kimlik doğrulama özelliği devre dışı bırakıldı. Yeniden etkinleştirmek için Cryptomator ayarlarınıın.</string>
<string name="dialog_biometric_auth_key_invalidated_neutral_button">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_enter_license_title">Geçerli bir lisans sağlayın</string>
<string name="dialog_enter_license_content">Cryptomator\'u Google Play Store kullanmadan yüklediğinizi tespit ettik. https://cryptomator.org/android/ adresinden satın alınabilecek geçerli bir lisans edinin lütfen.</string>
<string name="dialog_enter_license_not_valid_content">Sağlanan lisans geçerli değil. Doğru girdiğinizden emin olun.</string>
<string name="dialog_enter_license_no_content">Lisans verilmemiştir. Lütfen geçerli bir lisans girin.</string>
<string name="dialog_enter_license_ok_button">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_enter_license_decline_button">Çıkış</string>
<string name="dialog_license_confirmation_title">Lisans onayı</string>
<string name="dialog_license_confirmation_message">Geçerli lisansınızı sağladığınız için teşekkür ederiz %1$s.</string>
<string name="dialog_license_confirmation_ok_btn">@string/dialog_unable_to_share_positive_button</string>
<string name="dialog_update_available_title">Güncelleme uygun</string>
<string name="dialog_update_available_message">Cryptomator\'ı en son sürüme güncellemek için Tamam\'a dokunun lütfen. Uygulamayı arka planda indireceğiz ve sizden yüklemenizi isteyeceğiz.</string>
<string name="dialog_update_available_update">Şimdi güncelle</string>
<string name="dialog_update_available_download_site">İndirme sitesine git</string>
<string name="dialog_update_available_cancel">Sonra</string>
<string name="dialog_download_update_title">Çalışmayı indir</string>
<string name="dialog_download_update_message">Cryptomator\'ın son sürümünü indir</string>
<string name="dialog_sym_link_title">Klasör sembolik bir bağlantıdır</string>
<string name="dialog_sym_link_message">Bu sembolik bağlantıya gidemezsin</string>
<string name="dialog_sym_link_back_button">Geri</string>
<string name="dialog_no_dir_file_title">Dizinin içeriği yüklenemiyor</string>
<string name="dialog_no_dir_file_message">\'%1$s\' bulut klasörünün bir dizin dosyası yok. Klasör başka bir cihazda oluşturulmuş ve henüz buluta tam olarak senkronize edilmemiş olabilir. Lütfen aşağıdaki dosyanın mevcut olup olmadığını kontrol edin:\n%2$s</string>
<string name="dialog_no_dir_file_back_button">@string/dialog_sym_link_back_button</string>
<string name="dialog_beta_confirmation_title">Beta sürümü</string>
<string name="dialog_beta_confirmation">Bu, kasa formatı 7 desteğini tanıtan bir beta sürümüdür. Lütfen test için önemli kasanızı kullanmadığınızdan veya iyi bir yedekleme stratejisine sahip olmadığınızdan emin olun.</string>
<string name="permission_snackbar_auth_local_vault">Cryptomator\'un yerel kasaları kullanmak için depolama erişimine ihtiyacı var</string>
<string name="permission_snackbar_auth_auto_upload">Cryptomator\'un otomatik fotoğraf yüklemesi için depolama erişimine ihtiyacı var</string>
<!-- # error reports -->
<string name="error_report_subject">Android Error Report</string>
<string name="error_report_section_summary">Summary</string>
<string name="error_report_summary_description">Insert a short description of what you tried to do or mention your support ticket if you already created one.</string>
<string name="error_report_section_device">Device Info</string>
<!-- # misc -->
<!-- ## file size helper -->
<string name="file_size_zero">Sıfır KB</string>
<string name="file_size_unit_bytes">bayt</string>
<string name="file_size_unit_kilo_bytes">KB</string>
<string name="file_size_unit_mega_bytes">MB</string>
<string name="file_size_unit_giga_bytes">GB</string>
<string name="file_size_unit_tera_bytes">TB</string>
<!-- ## date helper -->
<string name="time_unit_seconds_sg">sn</string>
<string name="time_unit_seconds_pl">sn</string>
@ -464,54 +312,38 @@
<string name="time_unit_months_pl">ay</string>
<string name="time_unit_years_sg">yıl</string>
<string name="time_unit_years_pl">yıl</string>
<!-- ## biometric authentication -->
<string name="dialog_biometric_auth_title">Biyometrik giriş</string>
<string name="dialog_biometric_auth_message">Biyometrik kimlik bilgilerinizi kullanarak giriş yapın</string>
<string name="dialog_biometric_auth_use_password">Kasa şifresini kullan</string>
<string name="dialog_unable_to_auto_upload_files_title">Dosyaları otomatik olarak yükleyemiyor</string>
<!-- notification -->
<string name="notification_unlocked">Kasaların Kilidi Açıldı: %1$d</string>
<string name="notification_timeout">%1$s içinde otomatik kilitlenecek</string>
<string name="notification_lock_all">Tümünü kilitle</string>
<string name="notification_cancel_auto_upload">Yüklemeyi iptal et</string>
<string name="notification_auto_upload_title">Otomatik fotoğraf yükleme çalışıyor</string>
<string name="notification_auto_upload_message">%1d/%2d yükleniyor</string>
<string name="notification_auto_upload_finished_title">Otomatik fotoğraf yükleme tamamlandı</string>
<string name="notification_auto_upload_finished_message">Kasaya %1$d görüntü yüklendi</string>
<string name="notification_auto_upload_failed_title">Otomatik fotoğraf yükleme başarısız oldu</string>
<string name="notification_auto_upload_failed_general_error">Yükleme sırasında genel hata oluştu.</string>
<string name="notification_auto_upload_failed_due_to_folder_not_exists">Yükleme için seçilen klasör artık mevcut değil! Ayarlara gidin ve yeni bir tane seçin</string>
<string name="notification_auto_upload_failed_due_to_vault_locked">Kasa yükleme sırasında kilitlendi, devam etmek için kasayı yeniden açın lütfen</string>
<string name="notification_cancel_open_writable_file">@string/dialog_button_cancel</string>
<string name="notification_open_writable_file_title">Yazılabilir dosyayı</string>
<string name="notification_open_writable_file_message">Düzenleme tamamlanana kadar, uygulamalar kasası kilidi açık kalır</string>
<string name="notification_update_check_finished_latest">En son sürüm yüklendi</string>
<string name="screen_settings_lru_cache">Önbellek</string>
<string name="screen_settings_lru_cache_toggle">@string/screen_settings_section_auto_photo_upload_toggle</string>
<string name="screen_settings_lru_cache_size">Toplam önbellek boyutu</string>
<string name="screen_settings_clear_lru_cache_size">Önbelleği temizle</string>
<string name="screen_settings_lru_cache_changed__restart_toast">Değişiklikler, uygulama yeniden başlatıldığında uygulanacak</string>
<string name="screen_settings_license">Kayıtlı</string>
<string name="screen_settings_license_mail">%1$s</string>
<string name="dialog_settings_update_check_interval_title">Kontrol aralığını güncelle</string>
<string name="screen_settings_check_updates">Güncellemeleri kontrol et</string>
<string name="screen_settings_last_check_updates">Son çalıştırma %1$s</string>
<string name="screen_settings_last_check_updates_never">@string/lock_timeout_never</string>
<string name="screen_settings_last_check_updates_never_pre_marshmallow">Teknik nedenlerle güncelleme kontrolü yapılamıyorsa, güncellemeler, https://cryptomator.org/android/ web sitesinden manuel olarak indirilebilir ve yüklenebilir.</string>
<string name="dialog_cache_size_title">Bulut başına önbellek boyutu</string>
<!-- lock timeout names -->
<string name="lock_timeout_instant">Anında</string>
<string name="lock_timeout_1m">1 dakika</string>
@ -519,25 +351,15 @@
<string name="lock_timeout_5m">5 dakika</string>
<string name="lock_timeout_10m">10 dakika</string>
<string name="lock_timeout_never">Asla</string>
<!-- cache size names -->
<string name="cache_size_50m">50 MB</string>
<string name="cache_size_100m">100 MB</string>
<string name="cache_size_250m">250 MB</string>
<string name="cache_size_500m">500 MB</string>
<string name="cache_size_1000m">1 GB</string>
<string name="cache_size_5000m">5 GB</string>
<!-- screen scheme mode names -->
<string name="screen_settings_style_mode">Görünüm modu</string>
<string name="follow_system">Otomatik</string>
<string name="light">Aydınlık</string>
<string name="dark">Karanlık</string>
<!-- update interval names -->
<string name="update_interval_1d">Günde bir</string>
<string name="update_interval_1w">Haftada bir</string>
<string name="update_interval_1m">Ayda bir</string>
<string name="update_interval_never">@string/lock_timeout_never</string>
</resources>

View File

@ -4,9 +4,9 @@
<string name="empty" translatable="false"></string>
<!-- # app -->
<string name="app_name">Cryptomator</string>
<string name="app_name" translatable="false">Cryptomator</string>
<string name="download_subdirectory_name" translatable="false">@string/app_name</string>
<string name="share_with_label">Encrypt</string>
<string name="download_subdirectory_name">@string/app_name</string>
<!-- # error messages -->
<string name="error_generic">An error occurred</string>
@ -35,11 +35,11 @@
<!-- # clouds -->
<!-- ## cloud names -->
<string name="cloud_names_crypto">Crypto</string>
<string name="cloud_names_dropbox">Dropbox</string>
<string name="cloud_names_google_drive">Google Drive</string>
<string name="cloud_names_onedrive">OneDrive</string>
<string name="cloud_names_webdav">WebDAV</string>
<string name="cloud_names_crypto" translatable="false">Crypto</string>
<string name="cloud_names_dropbox" translatable="false">Dropbox</string>
<string name="cloud_names_google_drive" translatable="false">Google Drive</string>
<string name="cloud_names_onedrive" translatable="false">OneDrive</string>
<string name="cloud_names_webdav" translatable="false">WebDAV</string>
<string name="cloud_names_local_storage">Local storage</string>
<!-- # permission -->
@ -219,9 +219,9 @@
<string name="screen_settings_website_label">Cryptomator website</string>
<string name="screen_settings_twitter_label">Follow us on Twitter</string>
<string name="screen_settings_facebook_label">Like us on Facebook</string>
<string name="screen_settings_website_uri">https://cryptomator.org</string>
<string name="screen_settings_facebook_uri">https://facebook.com/Cryptomator</string>
<string name="screen_settings_twitter_uri">https://twitter.com/Cryptomator</string>
<string name="screen_settings_website_uri" translatable="false">https://cryptomator.org</string>
<string name="screen_settings_facebook_uri" translatable="false">https://facebook.com/Cryptomator</string>
<string name="screen_settings_twitter_uri" translatable="false">https://twitter.com/Cryptomator</string>
<string name="screen_settings_section_legal">Legal</string>
<string name="screen_settings_licenses_label">Licenses</string>
@ -229,12 +229,12 @@
<string name="screen_settings_section_support">Support</string>
<string name="screen_settings_contact_label">Request help</string>
<string name="screen_settings_support_uri">https://cryptomator.org/contact/</string>
<string name="screen_settings_support_uri" translatable="false">https://cryptomator.org/contact/</string>
<string name="screen_settings_debug_mode_label">Debug mode</string>
<string name="screen_settings_error_report_label">Send log file</string>
<string name="screen_settings_error_report_failed">Sending failed</string>
<string name="screen_settings_security_label">Security hints</string>
<string name="screen_settings_security_url">https://docs.cryptomator.org/en/1.5/security/best-practices/</string>
<string name="screen_settings_security_url" translatable="false">https://docs.cryptomator.org/en/1.5/security/best-practices/</string>
<string name="screen_settings_section_version">Version</string>
@ -436,10 +436,10 @@
<string name="permission_snackbar_auth_auto_upload">Cryptomator needs storage access to use auto photo upload</string>
<!-- # error reports -->
<string name="error_report_subject">Android Error Report</string>
<string name="error_report_section_summary">Summary</string>
<string name="error_report_summary_description">Insert a detailed description of what you tried to do or mention your support ticket if you already created one.</string>
<string name="error_report_section_device">Device Info</string>
<string name="error_report_subject" translatable="false">Android Error Report</string>
<string name="error_report_section_summary" translatable="false">Summary</string>
<string name="error_report_summary_description" translatable="false">Insert a detailed description of what you tried to do or mention your support ticket if you already created one.</string>
<string name="error_report_section_device" translatable="false">Device Info</string>
<!-- # misc -->

View File

@ -66,8 +66,8 @@
<item name="android:layout_height">48dp</item>
<item name="android:textSize">16sp</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_marginLeft">16dp</item>
<item name="android:layout_marginRight">16dp</item>
<item name="android:layout_marginStart">16dp</item>
<item name="android:layout_marginEnd">16dp</item>
<item name="android:paddingBottom">16dp</item>
<item name="android:drawablePadding">32dp</item>
<item name="android:clickable">true</item>

View File

@ -21,7 +21,7 @@
<intent
android:action="android.intent.action.MAIN"
android:targetClass="org.cryptomator.presentation.ui.activity.CloudSettingsActivity"
android:targetPackage="org.cryptomator" />
android:targetPackage="@string/app_id" />
</Preference>
@ -32,7 +32,7 @@
<intent
android:action="android.intent.action.MAIN"
android:targetClass="org.cryptomator.presentation.ui.activity.BiometricAuthSettingsActivity"
android:targetPackage="org.cryptomator" />
android:targetPackage="@string/app_id" />
</Preference>
@ -117,7 +117,7 @@
<intent
android:action="android.intent.action.MAIN"
android:targetClass="org.cryptomator.presentation.ui.activity.AutoUploadChooseVaultActivity"
android:targetPackage="org.cryptomator" />
android:targetPackage="@string/app_id" />
</Preference>
</PreferenceCategory>
@ -204,7 +204,7 @@
<intent
android:action="android.intent.action.MAIN"
android:targetClass="org.cryptomator.presentation.ui.activity.LicensesActivity"
android:targetPackage="org.cryptomator" />
android:targetPackage="@string/app_id" />
</Preference>
<Preference android:title="@string/screen_settings_security_label">

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