mirror of
https://github.com/FossifyOrg/File-Manager.git
synced 2026-11-04 03:54:24 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c95de62b90 | ||
|
|
5d1894ba42 | ||
|
|
7f074fe17c | ||
|
|
1ee4d0636e | ||
|
|
2b0873f4b1 | ||
|
|
9ae4b70ae6 | ||
|
|
ef7524c013 | ||
|
|
5a1027caa1 | ||
|
|
68e06aab8e | ||
|
|
aef9f9566e | ||
|
|
82b3c98c9a | ||
|
|
6bfcd8d1ea | ||
|
|
7a90732f96 | ||
|
|
e299956da2 | ||
|
|
a5d92c7f76 | ||
|
|
7844f4b85a | ||
|
|
95548acecc | ||
|
|
9c29ef68a8 | ||
|
|
3fdb6cd380 | ||
|
|
0856c68e2a | ||
|
|
4080ea9b06 | ||
|
|
ef41411d5b | ||
|
|
f79e8b5ebd | ||
|
|
a2eeb40309 | ||
|
|
a4390a22b0 | ||
|
|
6591c26758 | ||
|
|
577f510c61 | ||
|
|
0e22535a06 | ||
|
|
77e6f4fb9e | ||
|
|
c1253e1de2 | ||
|
|
ab8989ad92 | ||
|
|
bfe06e62c6 | ||
|
|
fea0394118 | ||
|
|
d7636f9d4a | ||
|
|
02c508d4e1 | ||
|
|
328a0a8f3c | ||
|
|
a5d0f3cf1b | ||
|
|
87b1dabca3 | ||
|
|
aabfcde47b | ||
|
|
77b2611dc9 | ||
|
|
99f13929e3 | ||
|
|
6cf1bfe5c5 | ||
|
|
f53f84677c | ||
|
|
7493541725 | ||
|
|
5e316369df | ||
|
|
878fa50963 | ||
|
|
893526efa0 | ||
|
|
2d3cb1a555 | ||
|
|
5b4a82615e | ||
|
|
a660857cc6 | ||
|
|
d8bef198cd | ||
|
|
3a3ccfe959 | ||
|
|
60c6fbc304 | ||
|
|
3f0f9e2df8 | ||
|
|
74b34e8fb0 | ||
|
|
06db3c88b4 | ||
|
|
d6987db37f | ||
|
|
d98e78eda1 | ||
|
|
1fbfc978ca | ||
|
|
c9b998f4a7 | ||
|
|
2258a58a2d | ||
|
|
eb95cb540d | ||
|
|
8f74c493e0 | ||
|
|
a2d6e4d7c2 | ||
|
|
1480831b15 | ||
|
|
0211111a34 | ||
|
|
64032a3082 | ||
|
|
463d016d68 | ||
|
|
4346de59d2 | ||
|
|
9f5b41d6fa | ||
|
|
6879b7871a | ||
|
|
efcc213ed6 | ||
|
|
432c9bf929 | ||
|
|
900d9c197b | ||
|
|
b09e037e61 | ||
|
|
ddb8afdfc6 | ||
|
|
4cfc92b0fe | ||
|
|
a1f06bfcbc | ||
|
|
be63034b1c | ||
|
|
8a8b9b9da8 | ||
|
|
c76a56061b | ||
|
|
23f0e848c4 | ||
|
|
65ebbf059a | ||
|
|
8887b510ca | ||
|
|
1f8efdf9fe | ||
|
|
7b6e49111a | ||
|
|
60f30bca73 | ||
|
|
d056d6d57b | ||
|
|
1e64ef351c | ||
|
|
1b6241aaff | ||
|
|
dd6f701f39 | ||
|
|
16e51ca4f5 | ||
|
|
0dea8e0576 | ||
|
|
323c882128 | ||
|
|
1476234289 | ||
|
|
b96aee5a2d | ||
|
|
e25bd7750f | ||
|
|
ae8ca6b2e8 | ||
|
|
07fb062a0d | ||
|
|
75c5d3c5ec | ||
|
|
8e5ccc05ba | ||
|
|
26fc5f1c22 | ||
|
|
86e79e5e0b | ||
|
|
42ba12b1ce | ||
|
|
2a36e87588 | ||
|
|
a155339348 | ||
|
|
24eb4ad3cd | ||
|
|
0d36078e70 | ||
|
|
67d77b3431 | ||
|
|
d9ef0f78b3 | ||
|
|
f57e492c16 | ||
|
|
5f7b12e736 | ||
|
|
40091ff02b | ||
|
|
8231505848 | ||
|
|
3b8eb29e28 | ||
|
|
baaf7ffa80 | ||
|
|
046c2c1bc0 | ||
|
|
2237f84971 | ||
|
|
4cc0ce941c | ||
|
|
ff35055f8f | ||
|
|
8eea02c2aa | ||
|
|
c0d7f64551 | ||
|
|
749c398aa6 | ||
|
|
8812e0ba58 | ||
|
|
6a30697c16 | ||
|
|
146ad3b129 | ||
|
|
b3fc8c7e6f | ||
|
|
599b2cad0b | ||
|
|
f0631e274a | ||
|
|
90741e28ea | ||
|
|
d1ed44688e | ||
|
|
eb75e8bafc | ||
|
|
8c723eb004 | ||
|
|
4ed2868456 | ||
|
|
547bf5421e | ||
|
|
c97940a3d9 | ||
|
|
2889538bf7 | ||
|
|
d911299f2f | ||
|
|
e8ca000dce | ||
|
|
b098f3dc99 | ||
|
|
f820b6e617 | ||
|
|
a0bbc177d7 | ||
|
|
0a0590cab6 | ||
|
|
7a4adb8783 | ||
|
|
044ac49a9c | ||
|
|
5921c27328 | ||
|
|
c12d1d7631 | ||
|
|
0c9892a9e5 | ||
|
|
57fbcea742 | ||
|
|
7ae71a5d22 | ||
|
|
00b21b8b0f | ||
|
|
18ae5f3229 | ||
|
|
b1b1599cc5 | ||
|
|
97791feaed | ||
|
|
a4c8da6c31 | ||
|
|
e6c465d9d0 | ||
|
|
ee20fa406f | ||
|
|
c55d685022 | ||
|
|
1e2e304f70 | ||
|
|
e0b1e884ce | ||
|
|
dfd73bddd0 | ||
|
|
a88355c9ad | ||
|
|
e6593a5c6b | ||
|
|
880f383e76 | ||
|
|
ab31c828a1 | ||
|
|
f71a4b7f55 | ||
|
|
c2482ee5dc | ||
|
|
de5b6da9d5 | ||
|
|
4812bc8d4b | ||
|
|
3ec4591b58 | ||
|
|
d11a710106 | ||
|
|
2cf0fdf7d1 | ||
|
|
25fe232c27 | ||
|
|
f733553ff3 | ||
|
|
5b278f6e4a | ||
|
|
fec28af74f | ||
|
|
eb4d38d25a | ||
|
|
8647071c66 | ||
|
|
630d7b2cea | ||
|
|
223e644f36 | ||
|
|
055bfbd3b8 | ||
|
|
ceb7a5f2a2 | ||
|
|
20aee9162d | ||
|
|
7a5f797a2a | ||
|
|
10a83a18b1 | ||
|
|
fb3384fb08 | ||
|
|
666c8d8c53 | ||
|
|
8c711104ed | ||
|
|
e7186a9c79 | ||
|
|
55eff8a6ae | ||
|
|
8b76e7f28a | ||
|
|
0bee809420 | ||
|
|
2b51c3f2fa | ||
|
|
1b03d62494 | ||
|
|
e9ecfe53a4 | ||
|
|
da8202ee2d | ||
|
|
31d4fdbf4f | ||
|
|
f68fe061e0 | ||
|
|
f24a8089d2 | ||
|
|
1571214647 | ||
|
|
5da4a63e8d | ||
|
|
aeb8977a77 | ||
|
|
0b93fcbb3e | ||
|
|
39f9b00f6a | ||
|
|
cfc1a89300 | ||
|
|
5e8cd437d2 | ||
|
|
3832e9db5d | ||
|
|
1f61e17fd3 | ||
|
|
259d185b95 | ||
|
|
c69d10b8fe | ||
|
|
21637a6d8a | ||
|
|
ac4be152ed | ||
|
|
e52a9bc776 | ||
|
|
1066344336 | ||
|
|
d8500c0c2a | ||
|
|
81276fe6c0 | ||
|
|
70ad7a07bc | ||
|
|
ec0f0f7893 | ||
|
|
c2953276e2 | ||
|
|
0b208bf63b | ||
|
|
141010a523 | ||
|
|
8d2a67dc50 | ||
|
|
0172a2517b | ||
|
|
986d7d5215 | ||
|
|
769c0dbb6a | ||
|
|
7d1f4c5eed | ||
|
|
1d16ff7505 | ||
|
|
e2b73dd6e7 | ||
|
|
24122e36f8 | ||
|
|
9ad80710e8 | ||
|
|
6c87991332 | ||
|
|
467021f8c1 | ||
|
|
96c6e28800 | ||
|
|
21e2ab1510 | ||
|
|
9ffeb94a35 | ||
|
|
5738639e97 | ||
|
|
32aeae6b38 | ||
|
|
416cf9675a | ||
|
|
4e0b5ba7b6 | ||
|
|
d3fe0f8bc4 | ||
|
|
8151b2dd00 | ||
|
|
f9f37718de | ||
|
|
ba605b59e3 | ||
|
|
bd7d2204ee | ||
|
|
d8720bb355 | ||
|
|
f23a4925a7 | ||
|
|
30dd2397a2 | ||
|
|
9dad0da353 | ||
|
|
6f96f85d1a | ||
|
|
27acc647d8 | ||
|
|
f3c01f4846 | ||
|
|
33b783bf3c | ||
|
|
45f9b5c261 | ||
|
|
ea082d2dd1 | ||
|
|
ef23996ced | ||
|
|
68aec3ac61 | ||
|
|
93893ce919 | ||
|
|
222995b4b6 | ||
|
|
626497acc5 | ||
|
|
cb1cd83f50 | ||
|
|
0548e07f21 | ||
|
|
94924bd19c | ||
|
|
19f0a2ad35 | ||
|
|
97dcf30b47 | ||
|
|
5dae7f82f5 | ||
|
|
b302495c30 | ||
|
|
747d4b5b43 | ||
|
|
1f8f779ed1 | ||
|
|
68c00dc3c0 | ||
|
|
2fe8b22fd4 | ||
|
|
2c0e31cdcf | ||
|
|
8df0412e11 | ||
|
|
25cfd43655 | ||
|
|
73e9080b67 | ||
|
|
581d56ffdc | ||
|
|
c1f7169332 | ||
|
|
482cfeda68 | ||
|
|
d76a33730f | ||
|
|
6e97c28536 | ||
|
|
699e3ec836 | ||
|
|
31e7920991 | ||
|
|
991a99a46e | ||
|
|
72cd81e24c | ||
|
|
bdc8d9c6ab | ||
|
|
6a786d5f25 | ||
|
|
e1ca6d77f4 | ||
|
|
97db302e2e | ||
|
|
ea767df3c0 | ||
|
|
d0f7e96a84 | ||
|
|
5bbe0b59e0 | ||
|
|
00dd6f4500 | ||
|
|
9f81ce77c2 | ||
|
|
742d63af2b | ||
|
|
df9249f989 | ||
|
|
0490de7627 | ||
|
|
a0c87edc3e | ||
|
|
127a820c25 | ||
|
|
be63e6f9a8 | ||
|
|
55cc3bb441 | ||
|
|
8daff3f0db | ||
|
|
3aef65fa37 | ||
|
|
645d5d1943 | ||
|
|
3fe891a821 | ||
|
|
80793f1a0e | ||
|
|
d856a9cebd | ||
|
|
2fce420cd1 | ||
|
|
447769190b | ||
|
|
e89e5b3a17 | ||
|
|
fcdf530ffa | ||
|
|
ba339261f7 | ||
|
|
11c7a6dd5a | ||
|
|
1d9404f7fa | ||
|
|
a91f7a2df8 | ||
|
|
0332a63ee4 | ||
|
|
20b9776364 | ||
|
|
47849e1d07 | ||
|
|
e4ee20c5fb | ||
|
|
88ed94ddae | ||
|
|
827cd9114a | ||
|
|
6fd361eb14 | ||
|
|
f153ffa8e1 | ||
|
|
1383a26ef7 | ||
|
|
4f92ddbc1c | ||
|
|
4d5720d2d1 | ||
|
|
f0925f7945 | ||
|
|
0e7f0b40a1 | ||
|
|
8b6fc1cc46 | ||
|
|
1cbeab42ea | ||
|
|
69f29435c3 | ||
|
|
b5e8d10af2 | ||
|
|
395b183b77 | ||
|
|
3722501aea | ||
|
|
1500f45593 | ||
|
|
0aa27861e7 | ||
|
|
98383895c5 | ||
|
|
a1bb523e8d | ||
|
|
cd6db6d71a | ||
|
|
42a34f3d1c | ||
|
|
2c6b98e22e | ||
|
|
badf7ccd21 | ||
|
|
67788e7d4b | ||
|
|
b118080dc9 | ||
|
|
1c049561fb | ||
|
|
cb29636dd0 | ||
|
|
2b7246bbf4 | ||
|
|
e156413e42 | ||
|
|
7268af9d6c | ||
|
|
08dd3dc171 | ||
|
|
1ef3d26025 | ||
|
|
a35fb3e847 | ||
|
|
074700bf77 | ||
|
|
d850827ce7 | ||
|
|
61c3e8884b | ||
|
|
f0fa5a87ae | ||
|
|
c240674079 | ||
|
|
cbd8d60ff6 | ||
|
|
34aa03a7e0 | ||
|
|
dc34c03368 | ||
|
|
b55a9df5ab | ||
|
|
8219d1f56f | ||
|
|
ae15e123fe | ||
|
|
a6e14aa641 | ||
|
|
4c930e0944 | ||
|
|
8651f32b72 | ||
|
|
c9fb0f523d | ||
|
|
bcc92b1483 | ||
|
|
901f3bb877 | ||
|
|
36f5af651a | ||
|
|
6751fda69f | ||
|
|
bf322c6ad8 | ||
|
|
591d693ae6 | ||
|
|
8ea493739e | ||
|
|
0722176c87 | ||
|
|
a19efbda60 | ||
|
|
4ed7c97044 | ||
|
|
cec9ee04df | ||
|
|
1effc571e5 | ||
|
|
a6d53c8207 | ||
|
|
e70f6305d2 | ||
|
|
0ca9a84b5d | ||
|
|
506a60fad6 | ||
|
|
f9103a602d | ||
|
|
0cddc4a903 | ||
|
|
f5b3f0f461 | ||
|
|
caec5063bf | ||
|
|
bad5451789 | ||
|
|
0ba8d43538 | ||
|
|
47e4ef1ff0 | ||
|
|
e59e396f8d | ||
|
|
f445fe4c9d | ||
|
|
541f5eff81 | ||
|
|
e4f6317a79 | ||
|
|
38e22d4b86 | ||
|
|
3aa6d20005 | ||
|
|
3e92e44e52 | ||
|
|
4b0c8adfdc | ||
|
|
0f682cc286 | ||
|
|
afd13dd28f | ||
|
|
9f3a16e1b5 | ||
|
|
7552c26f20 | ||
|
|
005aa67f40 | ||
|
|
aebc59facd | ||
|
|
1179d0fa00 | ||
|
|
439b5faaf9 | ||
|
|
4da76fb249 | ||
|
|
b739866d05 | ||
|
|
b11df5fe5f | ||
|
|
31e0f90f75 | ||
|
|
4c6d009373 | ||
|
|
db9f44d189 | ||
|
|
0261280eff | ||
|
|
302af120f5 | ||
|
|
117c07c231 | ||
|
|
666bfb6b5c | ||
|
|
007a481aa3 | ||
|
|
d96a148404 |
No files matched your search
@@ -0,0 +1,2 @@
|
||||
# Auto-generated file. DO NOT EDIT.
|
||||
1.6.3 (15)
|
||||
@@ -18,7 +18,7 @@ body:
|
||||
required: true
|
||||
- label: "I made sure that there are **no existing issues** - [open](https://github.com/FossifyOrg/File-Manager/issues) or [closed](https://github.com/FossifyOrg/File-Manager/issues?q=is%3Aissue+is%3Aclosed) - to which I could contribute my information."
|
||||
required: true
|
||||
- label: "I made sure that there are **no existing discussions** - [open](https://github.com/FossifyOrg/File-Manager/discussions) or [closed](https://github.com/FossifyOrg/File-Manager/discussions?discussions_q=is%3Aclosed) - to which I could contribute my information."
|
||||
- label: "I made sure that there are **no existing discussions** - [open](https://github.com/orgs/FossifyOrg/discussions?discussions_q=is:open+label:filemanager) or [closed](https://github.com/orgs/FossifyOrg/discussions?discussions_q=is:closed+label:filemanager) - to which I could contribute my information."
|
||||
required: true
|
||||
- label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed."
|
||||
required: true
|
||||
@@ -77,9 +77,6 @@ body:
|
||||
What did you do for the bug to show up?
|
||||
|
||||
If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug.
|
||||
|
||||
⚠️ Please **DO NOT** add links to SimpleMobileTools issues as they can be deleted at any time. Instead, copy-paste any useful information or instructions manually.
|
||||
|
||||
placeholder: |
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
@@ -112,7 +109,7 @@ body:
|
||||
description: |
|
||||
A picture or video is worth a thousand words.
|
||||
|
||||
If applicable, drag and drop screenshots or a screen recording to help explain your problem. If your file is too big for Github to accept, try to compress it (ZIP file), or feel free to paste a link to an image/video hoster here instead.
|
||||
If applicable, drag and drop screenshots or a screen recording to help explain your problem. If your file is too big for Github to accept, try to compress it (ZIP file), or feel free to paste a link to an image/video instead.
|
||||
|
||||
- type: textarea
|
||||
id: additional-information
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Questions
|
||||
url: https://github.com/FossifyOrg/File-Manager/discussions
|
||||
url: https://github.com/orgs/FossifyOrg/discussions
|
||||
about: Please ask and answer questions here.
|
||||
@@ -16,18 +16,16 @@ body:
|
||||
options:
|
||||
- label: "I made sure that there are **no existing issues** - [open](https://github.com/FossifyOrg/File-Manager/issues) or [closed](https://github.com/FossifyOrg/File-Manager/issues?q=is%3Aissue+is%3Aclosed) - to which I could contribute my information."
|
||||
required: true
|
||||
- label: "I made sure that there are **no existing discussions** - [open](https://github.com/FossifyOrg/File-Manager/discussions) or [closed](https://github.com/FossifyOrg/File-Manager/discussions?discussions_q=is%3Aclosed) - to which I could contribute my information."
|
||||
- label: "I made sure that there are **no existing discussions** - [open](https://github.com/orgs/FossifyOrg/discussions?discussions_q=is:open+label:filemanager) or [closed](https://github.com/orgs/FossifyOrg/discussions?discussions_q=is:closed+label:filemanager) - to which I could contribute my information."
|
||||
required: true
|
||||
- label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed."
|
||||
required: true
|
||||
- label: "**I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise.**"
|
||||
- label: "**I have taken the time to fill in all the required details. I understand that the request will be dismissed otherwise.**"
|
||||
required: true
|
||||
- label: "This issue contains only one feature request."
|
||||
required: true
|
||||
- label: "I have read and understood the [contribution guidelines](https://github.com/FossifyOrg/File-Manager/blob/master/CONTRIBUTING.md)."
|
||||
required: true
|
||||
- label: "I optionally [donated](https://fossify.org/donate) to support the Fossify mission."
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: feature-description
|
||||
@@ -35,8 +33,6 @@ body:
|
||||
label: Feature description
|
||||
description: |
|
||||
Explain how you want the app's look or behavior to change to suit your needs.
|
||||
|
||||
⚠️ Please **DO NOT** add links to SimpleMobileTools issues as they can be deleted at any time. Instead, copy-paste any useful information manually.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
<!-- Hey there. Thank you so much for improving Fossify. Please consider filling out the details :)-->
|
||||
|
||||
#### What is it?
|
||||
- [ ] Bugfix
|
||||
- [ ] Feature
|
||||
- [ ] Codebase improvement
|
||||
|
||||
#### Description of the changes in your PR
|
||||
<!-- Bullet points are preferred. The following is an example -->
|
||||
- Updated colors
|
||||
- Update strings
|
||||
- Added documentation
|
||||
|
||||
#### Before/After Screenshots/Screen Record
|
||||
<!-- If your PR changes the app's UI in any way, consider including screenshots or a video showing exactly what changed, so that developers and users can pinpoint it easily. Delete this if it doesn't apply to your PR.-->
|
||||
- Before:
|
||||
- After:
|
||||
|
||||
#### Fixes the following issue(s)
|
||||
<!-- Prefix issues with "Fixes" so that GitHub closes them when the PR is merged (note that each "Fixes #" should be in its own item). Also add any other relevant links. -->
|
||||
- Fixes #
|
||||
|
||||
#### Relies on the following changes
|
||||
<!-- Delete this if it doesn't apply to your PR. -->
|
||||
-
|
||||
|
||||
#### Acknowledgement
|
||||
- [ ] I read the [contribution guidelines](https://github.com/FossifyOrg/File-Manager/blob/master/CONTRIBUTING.md).
|
||||
@@ -0,0 +1,48 @@
|
||||
version: 2
|
||||
|
||||
registries:
|
||||
maven-google:
|
||||
type: maven-repository
|
||||
url: "https://dl.google.com/dl/android/maven2/"
|
||||
|
||||
maven-central:
|
||||
type: maven-repository
|
||||
url: "https://repo.maven.apache.org/maven2"
|
||||
|
||||
jitpack:
|
||||
type: maven-repository
|
||||
url: "https://www.jitpack.io"
|
||||
|
||||
updates:
|
||||
- package-ecosystem: "bundler"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "chore"
|
||||
prefix-development: "chore"
|
||||
include: "scope"
|
||||
|
||||
- package-ecosystem: "gradle"
|
||||
directory: "/"
|
||||
registries:
|
||||
- maven-central
|
||||
- maven-google
|
||||
- jitpack
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "chore"
|
||||
prefix-development: "chore"
|
||||
include: "scope"
|
||||
ignore:
|
||||
- dependency-name: "org.fossify:commons"
|
||||
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "chore"
|
||||
prefix-development: "chore"
|
||||
include: "scope"
|
||||
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
* Script for minimizing big images (jpg,gif,png) when they are uploaded to GitHub and not edited otherwise.
|
||||
* Source: https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/workflows/image-minimizer.js
|
||||
*/
|
||||
module.exports = async ({github, context}) => {
|
||||
const IGNORE_KEY = '<!-- IGNORE IMAGE MINIFY -->';
|
||||
const IGNORE_ALT_NAME_END = 'ignoreImageMinify';
|
||||
// Targeted maximum height
|
||||
const IMG_MAX_HEIGHT_PX = 400;
|
||||
// maximum width of GitHub issues/comments
|
||||
const IMG_MAX_WIDTH_PX = 800;
|
||||
// all images that have a lower aspect ratio (-> have a smaller width) than this will be minimized
|
||||
const MIN_ASPECT_RATIO = IMG_MAX_WIDTH_PX / IMG_MAX_HEIGHT_PX
|
||||
|
||||
// Get the body of the image
|
||||
let initialBody = null;
|
||||
if (context.eventName == 'issue_comment') {
|
||||
initialBody = context.payload.comment.body;
|
||||
} else if (context.eventName == 'issues') {
|
||||
initialBody = context.payload.issue.body;
|
||||
} else if (context.eventName == 'pull_request') {
|
||||
initialBody = context.payload.pull_request.body;
|
||||
} else {
|
||||
console.log('Aborting: No body found');
|
||||
return;
|
||||
}
|
||||
console.log(`Found body: \n${initialBody}\n`);
|
||||
|
||||
// Check if we should ignore the currently processing element
|
||||
if (initialBody.includes(IGNORE_KEY)) {
|
||||
console.log('Ignoring: Body contains IGNORE_KEY');
|
||||
return;
|
||||
}
|
||||
|
||||
// Regex for finding images (simple variant) 
|
||||
const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm;
|
||||
const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/[-\w\d]+\/[-\w\d]+\/assets\/\d+\/[\-0-9a-f]{32,512})\)/gm;
|
||||
|
||||
// Check if we found something
|
||||
let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody)
|
||||
|| REGEX_ASSETS_IMAGE_LOCKUP.test(initialBody);
|
||||
if (!foundSimpleImages) {
|
||||
console.log('Found no simple images to process');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('Found at least one simple image to process');
|
||||
|
||||
// Require the probe lib for getting the image dimensions
|
||||
const probe = require('probe-image-size');
|
||||
|
||||
var wasMatchModified = false;
|
||||
|
||||
// Try to find and replace the images with minimized ones
|
||||
let newBody = await replaceAsync(initialBody, REGEX_USER_CONTENT_IMAGE_LOOKUP, minimizeAsync);
|
||||
newBody = await replaceAsync(newBody, REGEX_ASSETS_IMAGE_LOCKUP, minimizeAsync);
|
||||
|
||||
if (!wasMatchModified) {
|
||||
console.log('Nothing was modified. Skipping update');
|
||||
return;
|
||||
}
|
||||
|
||||
// Update the corresponding element
|
||||
if (context.eventName == 'issue_comment') {
|
||||
console.log('Updating comment with id', context.payload.comment.id);
|
||||
await github.rest.issues.updateComment({
|
||||
comment_id: context.payload.comment.id,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: newBody
|
||||
})
|
||||
} else if (context.eventName == 'issues') {
|
||||
console.log('Updating issue', context.payload.issue.number);
|
||||
await github.rest.issues.update({
|
||||
issue_number: context.payload.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: newBody
|
||||
});
|
||||
} else if (context.eventName == 'pull_request') {
|
||||
console.log('Updating pull request', context.payload.pull_request.number);
|
||||
await github.rest.pulls.update({
|
||||
pull_number: context.payload.pull_request.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: newBody
|
||||
});
|
||||
}
|
||||
|
||||
// Async replace function from https://stackoverflow.com/a/48032528
|
||||
async function replaceAsync(str, regex, asyncFn) {
|
||||
const promises = [];
|
||||
str.replace(regex, (match, ...args) => {
|
||||
const promise = asyncFn(match, ...args);
|
||||
promises.push(promise);
|
||||
});
|
||||
const data = await Promise.all(promises);
|
||||
return str.replace(regex, () => data.shift());
|
||||
}
|
||||
|
||||
async function minimizeAsync(match, g1, g2) {
|
||||
console.log(`Found match '${match}'`);
|
||||
|
||||
if (g1.endsWith(IGNORE_ALT_NAME_END)) {
|
||||
console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`);
|
||||
return match;
|
||||
}
|
||||
|
||||
let probeAspectRatio = 0;
|
||||
let shouldModify = false;
|
||||
try {
|
||||
console.log(`Probing ${g2}`);
|
||||
let probeResult = await probe(g2);
|
||||
if (probeResult == null) {
|
||||
throw 'No probeResult';
|
||||
}
|
||||
if (probeResult.hUnits != 'px') {
|
||||
throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`;
|
||||
}
|
||||
if (probeResult.height <= 0) {
|
||||
throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`;
|
||||
}
|
||||
if (probeResult.wUnits != 'px') {
|
||||
throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`;
|
||||
}
|
||||
if (probeResult.width <= 0) {
|
||||
throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`;
|
||||
}
|
||||
console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`);
|
||||
|
||||
probeAspectRatio = probeResult.width / probeResult.height;
|
||||
shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO;
|
||||
} catch(e) {
|
||||
console.log('Probing failed:', e);
|
||||
// Immediately abort
|
||||
return match;
|
||||
}
|
||||
|
||||
if (shouldModify) {
|
||||
wasMatchModified = true;
|
||||
console.log(`Modifying match '${match}'`);
|
||||
return `<img alt="${g1}" src="${g2}" width=${Math.min(600, Math.floor(IMG_MAX_HEIGHT_PX * probeAspectRatio))} />`;
|
||||
}
|
||||
|
||||
console.log(`Match '${match}' is ok/will not be modified`);
|
||||
return match;
|
||||
}
|
||||
}
|
||||
@@ -5,31 +5,10 @@ on:
|
||||
types: [created, edited]
|
||||
issues:
|
||||
types: [opened, edited]
|
||||
pull_request:
|
||||
pull_request_target:
|
||||
types: [opened, edited]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
try-minimize:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
- name: Install probe-image-size
|
||||
run: npm i probe-image-size@7.2.3 --ignore-scripts
|
||||
|
||||
- name: Minimize simple images
|
||||
uses: actions/github-script@v6
|
||||
timeout-minutes: 3
|
||||
with:
|
||||
script: |
|
||||
const script = require('.github/workflows/image-minimizer.js');
|
||||
await script({github, context});
|
||||
call-image-minimizer-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/image-minimizer.yml@main
|
||||
secrets: inherit
|
||||
@@ -1,25 +1,11 @@
|
||||
name: no-response
|
||||
name: No Response
|
||||
|
||||
# Both `issue_comment` and `scheduled` event types are required for this Action
|
||||
# to work properly.
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
schedule:
|
||||
# Run daily at midnight.
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
- cron: "0 12 * * *" # Runs daily at noon
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
noResponse:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: lee-dohm/no-response@v0.5.0
|
||||
with:
|
||||
token: ${{ github.token }}
|
||||
# Number of days of inactivity before an issue is closed for lack of response.
|
||||
daysUntilClose: 30
|
||||
responseRequiredLabel: waiting for author
|
||||
call-no-response-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/no-response.yml@main
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,10 @@
|
||||
name: PR Labeler
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
call-pr-labeler-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/pr-labeler.yml@main
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,13 @@
|
||||
name: PR
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
|
||||
jobs:
|
||||
call-pr-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/pr.yml@main
|
||||
@@ -0,0 +1,15 @@
|
||||
name: Prepare Release PR
|
||||
|
||||
on:
|
||||
repository_dispatch:
|
||||
types: [prepare-release]
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "CHANGELOG.md"
|
||||
|
||||
jobs:
|
||||
call-release-pr:
|
||||
uses: FossifyOrg/.github/.github/workflows/prepare-release-pr.yml@main
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,17 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
paths:
|
||||
- ".fossify/release-marker.txt"
|
||||
|
||||
jobs:
|
||||
call-release-workflow:
|
||||
name: Release
|
||||
uses: FossifyOrg/.github/.github/workflows/release.yml@main
|
||||
with:
|
||||
track: ${{ vars.GPLAY_TRACK || 'beta' }}
|
||||
rollout: ${{ vars.GPLAY_ROLLOUT || '0.05' }}
|
||||
validate_only: ${{ vars.GPLAY_DRY_RUN == 'true' }}
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,18 @@
|
||||
name: Testing build (on PR)
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
types: [labeled, opened, synchronize, reopened]
|
||||
paths-ignore:
|
||||
- ".github/**"
|
||||
- "CHANGELOG.md"
|
||||
- "docs/**"
|
||||
- "fastlane/**"
|
||||
- "LICENSE"
|
||||
- "README.md"
|
||||
|
||||
jobs:
|
||||
call-testing-build-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,13 @@
|
||||
name: Update Fossify Commons
|
||||
|
||||
on:
|
||||
repository_dispatch:
|
||||
types: [update-commons]
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "0 6 * * 0"
|
||||
|
||||
jobs:
|
||||
update-commons:
|
||||
uses: FossifyOrg/.github/.github/workflows/update-commons.yml@main
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,13 @@
|
||||
name: Update lint baselines
|
||||
|
||||
on:
|
||||
repository_dispatch:
|
||||
types: [update-lint-baselines]
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "0 0 1 * *"
|
||||
|
||||
jobs:
|
||||
update-lint-baselines:
|
||||
uses: FossifyOrg/.github/.github/workflows/update-lint-baselines.yml@main
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,15 @@
|
||||
name: Fastlane metadata validation
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "fastlane/**"
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "fastlane/**"
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
uses: FossifyOrg/.github/.github/workflows/validate-fastlane-metadata.yml@main
|
||||
+2
-2
@@ -9,5 +9,5 @@
|
||||
keystore.jks
|
||||
keystore.properties
|
||||
fastlane/fastlane.json
|
||||
Gemfile
|
||||
Gemfile.lock
|
||||
fastlane/report.xml
|
||||
.kotlin/
|
||||
+159
-14
@@ -1,18 +1,163 @@
|
||||
Changelog
|
||||
==========
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
Version 1.0.1 *(2024-03-17)*
|
||||
----------------------------
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
* Folders now use primary/accent color.
|
||||
* Addressed unnecessary delays when renaming files.
|
||||
* Enhanced search performance in the text editor.
|
||||
* Fixed unresponsive behavior when viewing contents of a zip file.
|
||||
* Disabled the use of invalid characters such as `/` for batch file renaming.
|
||||
* Fixed invisible sort menu when viewing storage summary.
|
||||
* Added some translations.
|
||||
## [Unreleased]
|
||||
|
||||
Version 1.0.0 *(2024-01-07)*
|
||||
----------------------------
|
||||
## [1.6.3] - 2026-10-20
|
||||
### Changed
|
||||
- Updated translations
|
||||
|
||||
* Initial release
|
||||
## [1.6.2] - 2026-10-10
|
||||
### Changed
|
||||
- Updated translations
|
||||
|
||||
### Fixed
|
||||
- Fixed the modification of the original timestamp when decompressing folders ([#190])
|
||||
|
||||
## [1.6.1] - 2026-02-14
|
||||
### Changed
|
||||
- Updated translations
|
||||
|
||||
### Fixed
|
||||
- Fixed file size calculations to use SI decimal units (divide by 1000)
|
||||
|
||||
## [1.6.0] - 2026-01-30
|
||||
### Added
|
||||
- Added support for custom fonts
|
||||
|
||||
### Changed
|
||||
- Updated translations
|
||||
|
||||
## [1.5.0] - 2025-12-16
|
||||
### Changed
|
||||
- Updated translations
|
||||
|
||||
### Fixed
|
||||
- Fixed an issue where existing files were overwritten when saving new files ([#131])
|
||||
|
||||
## [1.4.0] - 2025-10-29
|
||||
### Changed
|
||||
- Compatibility updates for Android 15 & 16
|
||||
- Updated translations
|
||||
|
||||
### Fixed
|
||||
- Fixed duplicated entries when viewing protected ZIP files ([#76])
|
||||
|
||||
## [1.3.1] - 2025-10-02
|
||||
### Changed
|
||||
- Updated translations
|
||||
|
||||
### Fixed
|
||||
- Fixed files from hidden folders showing up in storage tab browser ([#217])
|
||||
- Fixed an issue where existing files were overwritten when saving new files ([#131])
|
||||
|
||||
## [1.3.0] - 2025-09-30
|
||||
### Added
|
||||
- Added a separate "Save as" option in the text editor ([#224])
|
||||
|
||||
### Changed
|
||||
- Save button now overwrites files directly in the text editor ([#224])
|
||||
- Search now ignores accents and diacritics ([#95])
|
||||
- Updated translations
|
||||
|
||||
### Fixed
|
||||
- Fixed folders showing up incorrectly as files in copy/move dialog ([#267])
|
||||
- Fixed error when saving files with unsupported characters ([#250])
|
||||
- Fixed missing permission prompt on initial "Save as" launch ([#85])
|
||||
- Fixed printing text files containing a "#" ([#104])
|
||||
- Fixed files in hidden folders showing up in recent tab ([#217])
|
||||
|
||||
## [1.2.3] - 2025-09-15
|
||||
### Fixed
|
||||
- Fixed folders showing up incorrectly as files in some cases ([#80])
|
||||
|
||||
## [1.2.2] - 2025-09-01
|
||||
### Changed
|
||||
- Updated translations
|
||||
|
||||
### Fixed
|
||||
- Fixed empty storage usage bars on initial load ([#251])
|
||||
|
||||
## [1.2.0] - 2025-07-12
|
||||
### Changed
|
||||
- Updated translations
|
||||
|
||||
### Fixed
|
||||
- File modification time is now preserved when compressing/decompressing files ([#176])
|
||||
|
||||
## [1.1.0] - 2025-05-21
|
||||
### Added
|
||||
- Added SHA-1 and SHA-256 hashes to file properties ([#149])
|
||||
|
||||
### Changed
|
||||
- Replaced checkboxes with switches
|
||||
- Updated translations
|
||||
|
||||
### Removed
|
||||
- Dropped support for Android 7 and older versions
|
||||
|
||||
### Fixed
|
||||
- Files saved via `Save As` option are now named properly ([#37])
|
||||
- Decompressed folders are now named properly ([#120])
|
||||
- Text editor no longer resets on device rotation ([#106])
|
||||
- JSON files can now be edited in-app ([#105])
|
||||
- Fixed accidental rendering of pull-to-refresh indicator ([#27])
|
||||
- Pull-to-refresh setting is now applied as expected ([#136])
|
||||
- Fixed invisible content when using app lock ([#150])
|
||||
|
||||
## [1.0.1] - 2024-03-17
|
||||
### Changed
|
||||
- Folders now use primary/accent color.
|
||||
- Enhanced search performance in the text editor.
|
||||
- Added some translations.
|
||||
|
||||
### Fixed
|
||||
- Addressed unnecessary delays when renaming files.
|
||||
- Fixed unresponsive behavior when viewing contents of a zip file.
|
||||
- Disabled the use of invalid characters such as `/` for batch file renaming.
|
||||
- Fixed invisible sort menu when viewing storage summary.
|
||||
|
||||
## [1.0.0] - 2024-01-07
|
||||
### Added
|
||||
- Initial release
|
||||
|
||||
[#27]: https://github.com/FossifyOrg/File-Manager/issues/27
|
||||
[#37]: https://github.com/FossifyOrg/File-Manager/issues/37
|
||||
[#76]: https://github.com/FossifyOrg/File-Manager/issues/76
|
||||
[#80]: https://github.com/FossifyOrg/File-Manager/issues/80
|
||||
[#85]: https://github.com/FossifyOrg/File-Manager/issues/85
|
||||
[#95]: https://github.com/FossifyOrg/File-Manager/issues/95
|
||||
[#104]: https://github.com/FossifyOrg/File-Manager/issues/104
|
||||
[#105]: https://github.com/FossifyOrg/File-Manager/issues/105
|
||||
[#106]: https://github.com/FossifyOrg/File-Manager/issues/106
|
||||
[#120]: https://github.com/FossifyOrg/File-Manager/issues/120
|
||||
[#131]: https://github.com/FossifyOrg/File-Manager/issues/131
|
||||
[#136]: https://github.com/FossifyOrg/File-Manager/issues/136
|
||||
[#149]: https://github.com/FossifyOrg/File-Manager/issues/149
|
||||
[#150]: https://github.com/FossifyOrg/File-Manager/issues/150
|
||||
[#176]: https://github.com/FossifyOrg/File-Manager/issues/176
|
||||
[#190]: https://github.com/FossifyOrg/File-Manager/issues/190
|
||||
[#217]: https://github.com/FossifyOrg/File-Manager/issues/217
|
||||
[#224]: https://github.com/FossifyOrg/File-Manager/issues/224
|
||||
[#250]: https://github.com/FossifyOrg/File-Manager/issues/250
|
||||
[#251]: https://github.com/FossifyOrg/File-Manager/issues/251
|
||||
[#267]: https://github.com/FossifyOrg/File-Manager/issues/267
|
||||
|
||||
[Unreleased]: https://github.com/FossifyOrg/File-Manager/compare/1.6.3...HEAD
|
||||
[1.6.3]: https://github.com/FossifyOrg/File-Manager/compare/1.6.2...1.6.3
|
||||
[1.6.2]: https://github.com/FossifyOrg/File-Manager/compare/1.6.1...1.6.2
|
||||
[1.6.1]: https://github.com/FossifyOrg/File-Manager/compare/1.6.0...1.6.1
|
||||
[1.6.0]: https://github.com/FossifyOrg/File-Manager/compare/1.5.0...1.6.0
|
||||
[1.5.0]: https://github.com/FossifyOrg/File-Manager/compare/1.4.0...1.5.0
|
||||
[1.4.0]: https://github.com/FossifyOrg/File-Manager/compare/1.3.1...1.4.0
|
||||
[1.3.1]: https://github.com/FossifyOrg/File-Manager/compare/1.3.0...1.3.1
|
||||
[1.3.0]: https://github.com/FossifyOrg/File-Manager/compare/1.2.3...1.3.0
|
||||
[1.2.3]: https://github.com/FossifyOrg/File-Manager/compare/1.2.2...1.2.3
|
||||
[1.2.2]: https://github.com/FossifyOrg/File-Manager/compare/1.2.0...1.2.2
|
||||
[1.2.0]: https://github.com/FossifyOrg/File-Manager/compare/1.1.0...1.2.0
|
||||
[1.1.0]: https://github.com/FossifyOrg/File-Manager/compare/1.0.1...1.1.0
|
||||
[1.0.1]: https://github.com/FossifyOrg/File-Manager/compare/1.0.0...1.0.1
|
||||
[1.0.0]: https://github.com/FossifyOrg/File-Manager/releases/tag/1.0.0
|
||||
@@ -0,0 +1 @@
|
||||
* @naveensingh
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
Before you report something, read the reporting rules [here](https://github.com/FossifyOrg/General-Discussion#how-do-i-suggest-an-improvement-ask-a-question-or-report-an-issue) please.
|
||||
|
||||
### Contributing as a developer
|
||||
Some instructions about code style and everything that has to be done to increase the change of your code getting accepted can be found at the [General Discussion](https://github.com/FossifyOrg/General-Discussion#contribution-rules-for-developers) section.
|
||||
Some instructions about code style and everything that has to be done to increase the chance of your code getting accepted can be found at the [General Discussion](https://github.com/FossifyOrg/General-Discussion#contribution-rules-for-developers) section.
|
||||
|
||||
### Contributing as a non developer
|
||||
In case you just want to for example improve a translation, you can find the way of doing it [here](https://github.com/FossifyOrg/General-Discussion#how-can-i-suggest-an-edit-to-a-file).
|
||||
@@ -0,0 +1,4 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "fastlane"
|
||||
gem "fastlane-plugin-fossify", "~> 1.0"
|
||||
+271
@@ -0,0 +1,271 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.8)
|
||||
abbrev (0.1.2)
|
||||
addressable (2.9.2)
|
||||
public_suffix (>= 2.0.2, < 8.0)
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.4.1)
|
||||
aws-partitions (1.1300.0)
|
||||
aws-sdk-core (3.263.0)
|
||||
aws-eventstream (~> 1, >= 1.4.1)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
base64
|
||||
bigdecimal
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
logger
|
||||
rexml (~> 3.4, >= 3.4.2)
|
||||
aws-sdk-kms (1.138.0)
|
||||
aws-sdk-core (~> 3, >= 3.263.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.237.0)
|
||||
aws-sdk-core (~> 3, >= 3.263.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.12.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
base64 (0.3.0)
|
||||
benchmark (0.5.0)
|
||||
bigdecimal (4.1.3)
|
||||
cgi (0.5.2)
|
||||
claide (1.1.0)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
commander (4.6.0)
|
||||
highline (~> 2.0.0)
|
||||
csv (3.3.7)
|
||||
declarative (0.0.20)
|
||||
digest-crc (0.7.0)
|
||||
rake (>= 12.0.0, < 14.0.0)
|
||||
domain_name (0.7.20261007)
|
||||
dotenv (2.8.1)
|
||||
emoji_regex (3.2.3)
|
||||
erb (6.0.7)
|
||||
excon (1.10.0)
|
||||
faraday (2.15.1)
|
||||
faraday-net_http (>= 2.0, < 3.6)
|
||||
json
|
||||
logger
|
||||
faraday-cookie_jar (0.0.8)
|
||||
faraday (>= 0.8.0)
|
||||
http-cookie (>= 1.0.0)
|
||||
faraday-follow_redirects (0.5.0)
|
||||
faraday (>= 1, < 3)
|
||||
faraday-multipart (1.2.0)
|
||||
multipart-post (~> 2.0)
|
||||
faraday-net_http (3.5.0)
|
||||
net-http (~> 0.5)
|
||||
faraday-retry (2.4.0)
|
||||
faraday (~> 2.0)
|
||||
fastimage (2.4.3)
|
||||
fastlane (2.241.2)
|
||||
CFPropertyList (>= 2.3, < 5.0.0)
|
||||
abbrev (~> 0.1)
|
||||
addressable (>= 2.9.0, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
aws-sdk-s3 (~> 1.197)
|
||||
babosa (>= 1.0.3, < 2.0.0)
|
||||
base64 (~> 0.2)
|
||||
benchmark (>= 0.1.0)
|
||||
bundler (>= 2.4.0, < 5.0.0)
|
||||
cgi (~> 0.4)
|
||||
colored (~> 1.2)
|
||||
commander (~> 4.6)
|
||||
csv (~> 3.3)
|
||||
dotenv (>= 2.1.1, < 3.0.0)
|
||||
emoji_regex (>= 0.1, < 4.0)
|
||||
erb (>= 4.0, < 7.0)
|
||||
excon (>= 1.0.0, < 2.0.0)
|
||||
faraday (~> 2.7)
|
||||
faraday-cookie_jar (~> 0.0.8)
|
||||
faraday-follow_redirects (~> 0.3)
|
||||
faraday-multipart (~> 1.0)
|
||||
faraday-retry (~> 2.0)
|
||||
fastimage (>= 2.1.0, < 3.0.0)
|
||||
fastlane-sirp (>= 1.1.0)
|
||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||
google-apis-androidpublisher_v3 (~> 0.99)
|
||||
google-apis-playcustomapp_v1 (~> 0.1)
|
||||
google-cloud-env (>= 1.6.0, < 2.5.0)
|
||||
google-cloud-storage (~> 1.31)
|
||||
highline (~> 2.0)
|
||||
irb (>= 1.8)
|
||||
json (< 3.0.0)
|
||||
jwt (>= 2.10.3, < 4)
|
||||
logger (>= 1.6, < 2.0)
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multi_json (~> 1.12)
|
||||
multipart-post (>= 2.0.0, < 3.0.0)
|
||||
mutex_m (~> 0.3)
|
||||
naturally (~> 2.2)
|
||||
nkf (~> 0.2)
|
||||
optparse (>= 0.1.1, < 1.0.0)
|
||||
ostruct (>= 0.1.0)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
rubyzip (>= 3.4.0, < 4.0.0)
|
||||
security (~> 0.3)
|
||||
simctl (~> 1.6.3)
|
||||
terminal-notifier (>= 3.1.0, < 4.0.0)
|
||||
terminal-table (~> 4)
|
||||
tty-screen (>= 0.6.3, < 1.0.0)
|
||||
tty-spinner (>= 0.8.0, < 1.0.0)
|
||||
word_wrap (~> 1.0.0)
|
||||
xcodeproj (>= 1.13.0, < 2.0.0)
|
||||
xcpretty (~> 0.4.1)
|
||||
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
|
||||
fastlane-plugin-fossify (1.0.2)
|
||||
abbrev
|
||||
fastlane-sirp (1.1.0)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.111.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-apis-core (1.4.0)
|
||||
addressable (~> 2.9)
|
||||
faraday (~> 2.13)
|
||||
faraday-follow_redirects (~> 0.3)
|
||||
googleauth (~> 1.14)
|
||||
mini_mime (~> 1.1)
|
||||
multi_json (~> 1.11)
|
||||
representable (~> 3.0)
|
||||
retriable (>= 3.1, < 5.0)
|
||||
google-apis-iamcredentials_v1 (0.28.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.18.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-apis-storage_v1 (0.70.0)
|
||||
google-apis-core (>= 0.15.0, < 2.a)
|
||||
google-cloud-core (1.9.1)
|
||||
google-cloud-env (>= 1.0, < 3.a)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (2.4.1)
|
||||
base64 (~> 0.2)
|
||||
faraday (>= 1.0, < 3.a)
|
||||
google-cloud-errors (1.7.1)
|
||||
google-cloud-storage (1.62.1)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-core (>= 0.18, < 2)
|
||||
google-apis-iamcredentials_v1 (~> 0.18)
|
||||
google-apis-storage_v1 (>= 0.42)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (~> 1.9)
|
||||
mini_mime (~> 1.0)
|
||||
google-logging-utils (0.2.2)
|
||||
googleauth (1.17.7)
|
||||
faraday (>= 1.0, < 3.a)
|
||||
google-cloud-env (~> 2.2)
|
||||
google-logging-utils (~> 0.1)
|
||||
jwt (>= 1.4, < 4.0)
|
||||
os (>= 0.9, < 2.0)
|
||||
pstore (~> 0.1)
|
||||
signet (>= 0.16, < 2.a)
|
||||
highline (2.0.3)
|
||||
http-cookie (1.1.6)
|
||||
domain_name (~> 0.5)
|
||||
io-console (0.9.5)
|
||||
irb (1.18.0)
|
||||
pp (>= 0.6.0)
|
||||
prism (>= 1.3.0)
|
||||
rdoc (>= 4.0.0)
|
||||
reline (>= 0.4.2)
|
||||
jmespath (1.6.2)
|
||||
json (2.21.2)
|
||||
jwt (3.3.0)
|
||||
base64
|
||||
logger (1.7.0)
|
||||
mini_magick (4.13.2)
|
||||
mini_mime (1.1.5)
|
||||
multi_json (1.21.2)
|
||||
multipart-post (2.4.1)
|
||||
mutex_m (0.3.0)
|
||||
nanaimo (0.4.0)
|
||||
naturally (2.3.0)
|
||||
net-http (0.10.0)
|
||||
net-protocol (>= 0.3.0)
|
||||
uri (>= 0.11.1)
|
||||
net-protocol (0.4.0)
|
||||
timeout
|
||||
nkf (0.3.0)
|
||||
optparse (0.8.1)
|
||||
os (1.1.4)
|
||||
ostruct (0.6.3)
|
||||
plist (3.7.2)
|
||||
pp (0.6.4)
|
||||
prettyprint
|
||||
prettyprint (0.2.1)
|
||||
prism (2.1.0)
|
||||
prism (2.1.0-x86_64-linux-gnu)
|
||||
pstore (0.3.0)
|
||||
public_suffix (7.0.5)
|
||||
rake (13.4.2)
|
||||
rbs (4.2.0)
|
||||
logger
|
||||
prism (>= 1.6.0)
|
||||
tsort
|
||||
rdoc (8.1.0)
|
||||
erb
|
||||
prism (>= 1.6.0)
|
||||
rbs (>= 4.0.0)
|
||||
tsort
|
||||
reline (0.7.0)
|
||||
io-console (~> 0.5)
|
||||
representable (3.3.1)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
retriable (4.2.0)
|
||||
rexml (3.4.4)
|
||||
rouge (3.28.0)
|
||||
rubyzip (3.7.0)
|
||||
security (0.4.0)
|
||||
signet (0.22.2)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.5, < 3.a)
|
||||
jwt (>= 1.5, < 4.0)
|
||||
simctl (1.6.10)
|
||||
CFPropertyList
|
||||
naturally
|
||||
terminal-notifier (3.1.0)
|
||||
terminal-table (4.0.0)
|
||||
unicode-display_width (>= 1.1.1, < 4)
|
||||
timeout (0.6.1)
|
||||
trailblazer-option (0.1.2)
|
||||
tsort (0.2.0)
|
||||
tty-cursor (0.7.1)
|
||||
tty-screen (0.8.2)
|
||||
tty-spinner (0.9.3)
|
||||
tty-cursor (~> 0.7)
|
||||
uber (0.1.0)
|
||||
unicode-display_width (3.3.0)
|
||||
unicode-emoji (~> 4.3)
|
||||
unicode-emoji (4.3.0)
|
||||
uri (1.1.2)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.28.1)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
base64
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.4.0)
|
||||
nkf
|
||||
rexml (>= 3.3.6, < 4.0)
|
||||
xcpretty (0.4.1)
|
||||
rouge (~> 3.28.0)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
xcpretty (~> 0.2, >= 0.0.7)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
x86_64-linux
|
||||
|
||||
DEPENDENCIES
|
||||
fastlane
|
||||
fastlane-plugin-fossify (~> 1.0)
|
||||
|
||||
BUNDLED WITH
|
||||
2.6.8
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
/build
|
||||
/foss/
|
||||
/prepaid/
|
||||
/gplay/
|
||||
+61
-14
@@ -1,11 +1,11 @@
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
|
||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
import org.jetbrains.kotlin.konan.properties.Properties
|
||||
import java.io.FileInputStream
|
||||
|
||||
plugins {
|
||||
alias(libs.plugins.android)
|
||||
alias(libs.plugins.kotlinAndroid)
|
||||
alias(libs.plugins.detekt)
|
||||
}
|
||||
|
||||
val keystorePropertiesFile: File = rootProject.file("keystore.properties")
|
||||
@@ -14,16 +14,27 @@ if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
|
||||
}
|
||||
|
||||
fun hasSigningVars(): Boolean {
|
||||
return providers.environmentVariable("SIGNING_KEY_ALIAS").orNull != null
|
||||
&& providers.environmentVariable("SIGNING_KEY_PASSWORD").orNull != null
|
||||
&& providers.environmentVariable("SIGNING_STORE_FILE").orNull != null
|
||||
&& providers.environmentVariable("SIGNING_STORE_PASSWORD").orNull != null
|
||||
}
|
||||
|
||||
base {
|
||||
val versionCode = project.property("VERSION_CODE").toString().toInt()
|
||||
archivesName = "file-manager-$versionCode"
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk = project.libs.versions.app.build.compileSDKVersion.get().toInt()
|
||||
|
||||
defaultConfig {
|
||||
applicationId = libs.versions.app.version.appId.get()
|
||||
applicationId = project.property("APP_ID").toString()
|
||||
minSdk = project.libs.versions.app.build.minimumSDK.get().toInt()
|
||||
targetSdk = project.libs.versions.app.build.targetSDK.get().toInt()
|
||||
versionName = project.libs.versions.app.version.versionName.get()
|
||||
versionCode = project.libs.versions.app.version.versionCode.get().toInt()
|
||||
archivesName.set("file-manager-$versionCode")
|
||||
versionName = project.property("VERSION_NAME").toString()
|
||||
versionCode = project.property("VERSION_CODE").toString().toInt()
|
||||
multiDexEnabled = true
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
}
|
||||
@@ -36,6 +47,15 @@ android {
|
||||
storeFile = file(keystoreProperties.getProperty("storeFile"))
|
||||
storePassword = keystoreProperties.getProperty("storePassword")
|
||||
}
|
||||
} else if (hasSigningVars()) {
|
||||
register("release") {
|
||||
keyAlias = providers.environmentVariable("SIGNING_KEY_ALIAS").get()
|
||||
keyPassword = providers.environmentVariable("SIGNING_KEY_PASSWORD").get()
|
||||
storeFile = file(providers.environmentVariable("SIGNING_STORE_FILE").get())
|
||||
storePassword = providers.environmentVariable("SIGNING_STORE_PASSWORD").get()
|
||||
}
|
||||
} else {
|
||||
logger.warn("Warning: No signing config found. Build will be unsigned.")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +74,7 @@ android {
|
||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||
"proguard-rules.pro"
|
||||
)
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
if (keystorePropertiesFile.exists() || hasSigningVars()) {
|
||||
signingConfig = signingConfigs.getByName("release")
|
||||
}
|
||||
}
|
||||
@@ -62,13 +82,12 @@ android {
|
||||
|
||||
flavorDimensions.add("variants")
|
||||
productFlavors {
|
||||
register("core")
|
||||
register("foss")
|
||||
register("prepaid")
|
||||
register("gplay")
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
getByName("main").java.srcDirs("src/main/kotlin")
|
||||
getByName("main").java.directories.add("src/main/kotlin")
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@@ -77,16 +96,43 @@ android {
|
||||
targetCompatibility = currentJavaVersionFromLibs
|
||||
}
|
||||
|
||||
tasks.withType<KotlinCompile> {
|
||||
kotlinOptions.jvmTarget = project.libs.versions.app.build.kotlinJVMTarget.get()
|
||||
dependenciesInfo {
|
||||
includeInApk = false
|
||||
}
|
||||
|
||||
namespace = libs.versions.app.version.appId.get()
|
||||
androidResources {
|
||||
@Suppress("UnstableApiUsage")
|
||||
generateLocaleConfig = true
|
||||
}
|
||||
|
||||
tasks.withType<KotlinCompile> {
|
||||
compilerOptions.jvmTarget.set(
|
||||
JvmTarget.fromTarget(project.libs.versions.app.build.kotlinJVMTarget.get())
|
||||
)
|
||||
}
|
||||
|
||||
namespace = project.property("APP_ID").toString()
|
||||
|
||||
lint {
|
||||
checkReleaseBuilds = false
|
||||
abortOnError = false
|
||||
abortOnError = true
|
||||
warningsAsErrors = false
|
||||
baseline = file("lint-baseline.xml")
|
||||
lintConfig = rootProject.file("lint.xml")
|
||||
}
|
||||
|
||||
bundle {
|
||||
language {
|
||||
enableSplit = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
detekt {
|
||||
baseline = file("detekt-baseline.xml")
|
||||
config.setFrom("$rootDir/detekt.yml")
|
||||
buildUponDefaultConfig = true
|
||||
allRules = false
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@@ -98,4 +144,5 @@ dependencies {
|
||||
implementation(libs.gestureviews)
|
||||
implementation(libs.autofittextview)
|
||||
implementation(libs.zip4j)
|
||||
detektPlugins(libs.compose.detekt)
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
<?xml version="1.0" ?>
|
||||
<SmellBaseline>
|
||||
<ManuallySuppressedIssues/>
|
||||
<CurrentIssues>
|
||||
<ID>ComplexCondition:Activity.kt$(hide && filename.startsWith('.')) || (!hide && !filename.startsWith('.'))</ID>
|
||||
<ID>ComplexCondition:ItemsAdapter.kt$ItemsAdapter$activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) && sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0</ID>
|
||||
<ID>ComplexCondition:ItemsAdapter.kt$ItemsAdapter$hasOTGConnected && itemToLoad is String && activity.isPathOnOTG(itemToLoad) && baseConfig.OTGTreeUri.isNotEmpty() && baseConfig.OTGPartition.isNotEmpty()</ID>
|
||||
<ID>ComplexCondition:MainActivity.kt$MainActivity$!config.wasOTGHandled && hasPermission(PERMISSION_WRITE_STORAGE) && hasOTGConnected() && config.OTGPath.isEmpty()</ID>
|
||||
<ID>ComplexCondition:MimeTypesActivity.kt$MimeTypesActivity$mimetype != "image" && mimetype != "video" && mimetype != "audio" && mimetype != "text" && !extraAudioMimeTypes.contains(fullMimetype) && !extraDocumentMimeTypes.contains(fullMimetype) && !archiveMimeTypes.contains(fullMimetype)</ID>
|
||||
<ID>ComplexCondition:ReadTextActivity.kt$ReadTextActivity$requestCode == SELECT_SAVE_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null</ID>
|
||||
<ID>CyclomaticComplexMethod:DecompressActivity.kt$DecompressActivity$private fun decompressTo(destination: String)</ID>
|
||||
<ID>CyclomaticComplexMethod:ItemsAdapter.kt$ItemsAdapter$@SuppressLint("NewApi") private fun compressPaths( sourcePaths: List<String>, targetPath: String, password: String? = null ): Boolean</ID>
|
||||
<ID>CyclomaticComplexMethod:ItemsAdapter.kt$ItemsAdapter$override fun actionItemPressed(id: Int)</ID>
|
||||
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun setupOptionsMenu()</ID>
|
||||
<ID>CyclomaticComplexMethod:MimeTypesActivity.kt$MimeTypesActivity$private fun getProperFileDirItems(callback: (ArrayList<FileDirItem>) -> Unit)</ID>
|
||||
<ID>CyclomaticComplexMethod:StorageFragment.kt$StorageFragment$private fun getSizesByMimeType(volumeName: String): HashMap<String, Long></ID>
|
||||
<ID>EmptyCatchBlock:MimeTypesActivity.kt$MimeTypesActivity${ }</ID>
|
||||
<ID>EmptyCatchBlock:StorageFragment.kt$StorageFragment${ }</ID>
|
||||
<ID>EmptyFunctionBlock:DecompressItemsAdapter.kt$DecompressItemsAdapter${}</ID>
|
||||
<ID>EmptyFunctionBlock:MainActivity.kt$MainActivity.<no name provided>${}</ID>
|
||||
<ID>EmptyFunctionBlock:ManageFavoritesAdapter.kt$ManageFavoritesAdapter${}</ID>
|
||||
<ID>EmptyFunctionBlock:MimeTypesActivity.kt$MimeTypesActivity${}</ID>
|
||||
<ID>EmptyFunctionBlock:StorageFragment.kt$StorageFragment${}</ID>
|
||||
<ID>LargeClass:ItemsAdapter.kt$ItemsAdapter : MyRecyclerViewAdapterOnPopupTextUpdate</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:DecompressActivity.kt$DecompressActivity$while</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:StorageFragment.kt$StorageFragment$do</ID>
|
||||
<ID>MagicNumber:Config.kt$Config$1.2f</ID>
|
||||
<ID>MagicNumber:Config.kt$Config$4</ID>
|
||||
<ID>MagicNumber:Config.kt$Config$8</ID>
|
||||
<ID>MagicNumber:DecompressActivity.kt$DecompressActivity$1024</ID>
|
||||
<ID>MagicNumber:DecompressItemsAdapter.kt$DecompressItemsAdapter$0.8f</ID>
|
||||
<ID>MagicNumber:DecompressItemsAdapter.kt$DecompressItemsAdapter$180</ID>
|
||||
<ID>MagicNumber:ItemsAdapter.kt$ItemsAdapter$0.8f</ID>
|
||||
<ID>MagicNumber:ItemsAdapter.kt$ItemsAdapter$10</ID>
|
||||
<ID>MagicNumber:ItemsAdapter.kt$ItemsAdapter$180</ID>
|
||||
<ID>MagicNumber:ItemsAdapter.kt$ItemsAdapter$4</ID>
|
||||
<ID>MagicNumber:ItemsFragment.kt$ItemsFragment$3</ID>
|
||||
<ID>MagicNumber:ReadTextActivity.kt$ReadTextActivity$250</ID>
|
||||
<ID>MagicNumber:ReadTextActivity.kt$ReadTextActivity$50</ID>
|
||||
<ID>MagicNumber:RecentsFragment.kt$RecentsFragment$3</ID>
|
||||
<ID>MagicNumber:RecentsFragment.kt$RecentsFragment$50</ID>
|
||||
<ID>MagicNumber:RootHelpers.kt$RootHelpers.<no name provided>$5</ID>
|
||||
<ID>MagicNumber:StorageFragment.kt$StorageFragment$100000</ID>
|
||||
<ID>MagicNumber:StorageFragment.kt$StorageFragment$2000</ID>
|
||||
<ID>MagicNumber:StorageFragment.kt$StorageFragment$3</ID>
|
||||
<ID>MagicNumber:StorageFragment.kt$StorageFragment$4096L</ID>
|
||||
<ID>MaxLineLength:Activity.kt$fun</ID>
|
||||
<ID>MaxLineLength:ChangeViewTypeDialog.kt$ChangeViewTypeDialog$class</ID>
|
||||
<ID>MaxLineLength:ChangeViewTypeDialog.kt$ChangeViewTypeDialog$val</ID>
|
||||
<ID>MaxLineLength:CompressAsDialog.kt$CompressAsDialog$FilePickerDialog</ID>
|
||||
<ID>MaxLineLength:CompressAsDialog.kt$CompressAsDialog$class</ID>
|
||||
<ID>MaxLineLength:CompressAsDialog.kt$CompressAsDialog$val indexOfDot = if (filename.contains('.') && !activity.getIsPathDirectory(path)) filename.lastIndexOf(".") else filename.length</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(wasStorageAnalysisTabAdded) = prefs.edit().putBoolean(WAS_STORAGE_ANALYSIS_TAB_ADDED, wasStorageAnalysisTabAdded).apply()</ID>
|
||||
<ID>MaxLineLength:Context.kt$fun Context.isPathOnRoot(path: String)</ID>
|
||||
<ID>MaxLineLength:DecompressItemsAdapter.kt$DecompressItemsAdapter$class</ID>
|
||||
<ID>MaxLineLength:DecompressItemsAdapter.kt$DecompressItemsAdapter$val drawable = fileDrawables.getOrElse(fileName.substringAfterLast(".").lowercase(Locale.getDefault()), { fileDrawable })</ID>
|
||||
<ID>MaxLineLength:FavoritesActivity.kt$FavoritesActivity$FilePickerDialog</ID>
|
||||
<ID>MaxLineLength:FavoritesActivity.kt$FavoritesActivity$ManageFavoritesAdapter(this@FavoritesActivity, favorites, this@FavoritesActivity, manageFavoritesList) { }</ID>
|
||||
<ID>MaxLineLength:ItemsAdapter.kt$ItemsAdapter$}</ID>
|
||||
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$ItemsAdapter</ID>
|
||||
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$class</ID>
|
||||
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$context</ID>
|
||||
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$if</ID>
|
||||
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$private</ID>
|
||||
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$val sectionTitle = ListItem(it.path, context!!.humanizePath(it.path), true, 0, 0, 0, true, false)</ID>
|
||||
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$val sectionTitle = ListItem(parent, context!!.humanizePath(parent), false, 0, 0, 0, true, false)</ID>
|
||||
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment.<no name provided>$return</ID>
|
||||
<ID>MaxLineLength:ListItem.kt$ListItem$val mPath: String</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$// used at apps that have no file access at all, but need to work with files. For example Simple Calendar uses this at exporting events into a file</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.add_favorite).isVisible = currentFragment is ItemsFragment && !favorites.contains(currentFragment.currentPath)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.column_count).isVisible = currentViewType == VIEW_TYPE_GRID && currentFragment !is StorageFragment</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.go_home).isVisible = currentFragment is ItemsFragment && currentFragment.currentPath != config.homeFolder</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.remove_favorite).isVisible = currentFragment is ItemsFragment && favorites.contains(currentFragment.currentPath)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.set_as_home).isVisible = currentFragment is ItemsFragment && currentFragment.currentPath != config.homeFolder</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden && currentFragment !is StorageFragment</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden() && currentFragment !is StorageFragment</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.toggle_filename).isVisible = currentViewType == VIEW_TYPE_GRID && currentFragment !is StorageFragment</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$getStorageDirectories().firstOrNull { it.trimEnd('/') != internalStoragePath && it.trimEnd('/') != sdCardPath }</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$if</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun getInactiveTabIndexes(activeIndex: Int)</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$resultIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$val licenses = LICENSE_GLIDE or LICENSE_PATTERN or LICENSE_REPRINT or LICENSE_GESTURE_VIEWS or LICENSE_AUTOFITTEXTVIEW or LICENSE_ZIP4J</ID>
|
||||
<ID>MaxLineLength:MimeTypesActivity.kt$MimeTypesActivity$!extraAudioMimeTypes.contains(fullMimetype)</ID>
|
||||
<ID>MaxLineLength:MimeTypesActivity.kt$MimeTypesActivity$if</ID>
|
||||
<ID>MaxLineLength:MimeTypesActivity.kt$MimeTypesActivity$val fullMimetype = cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault()) ?: return@queryCursor</ID>
|
||||
<ID>MaxLineLength:MyViewPagerFragment.kt$MyViewPagerFragment$abstract</ID>
|
||||
<ID>MaxLineLength:MyViewPagerFragment.kt$MyViewPagerFragment$val fabIcon = context.resources.getColoredDrawableWithColor(iconId, context.getProperPrimaryColor().getContrastColor())</ID>
|
||||
<ID>MaxLineLength:ReadTextActivity.kt$ReadTextActivity$if</ID>
|
||||
<ID>MaxLineLength:ReadTextActivity.kt$ReadTextActivity$private</ID>
|
||||
<ID>MaxLineLength:RecentsFragment.kt$RecentsFragment$ItemsAdapter</ID>
|
||||
<ID>MaxLineLength:RecentsFragment.kt$RecentsFragment$binding.recentsSwipeRefresh.isEnabled = lastSearchedText.isEmpty() && activity?.config?.enablePullToRefresh != false</ID>
|
||||
<ID>MaxLineLength:RecentsFragment.kt$RecentsFragment$class</ID>
|
||||
<ID>MaxLineLength:RecentsFragment.kt$RecentsFragment$if</ID>
|
||||
<ID>MaxLineLength:RootHelpers.kt$RootHelpers$fun</ID>
|
||||
<ID>MaxLineLength:RootHelpers.kt$RootHelpers$private</ID>
|
||||
<ID>MaxLineLength:SaveAsActivity.kt$SaveAsActivity$FilePickerDialog</ID>
|
||||
<ID>MaxLineLength:SaveAsDialog.kt$SaveAsDialog$val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFilename)</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())</ID>
|
||||
<ID>NestedBlockDepth:DecompressActivity.kt$DecompressActivity$private fun decompressTo(destination: String)</ID>
|
||||
<ID>NestedBlockDepth:ItemsAdapter.kt$ItemsAdapter$@SuppressLint("NewApi") private fun compressPaths( sourcePaths: List<String>, targetPath: String, password: String? = null ): Boolean</ID>
|
||||
<ID>NestedBlockDepth:ItemsAdapter.kt$ItemsAdapter$private fun decompressPaths( paths: List<String>, conflictResolutions: LinkedHashMap<String, Int>, callback: (success: Boolean) -> Unit )</ID>
|
||||
<ID>NestedBlockDepth:ItemsAdapter.kt$ItemsAdapter$private fun setupView(binding: ItemViewBinding, listItem: ListItem)</ID>
|
||||
<ID>NestedBlockDepth:ItemsAdapter.kt$ItemsAdapter$private fun tryDecompressingPaths( sourcePaths: List<String>, callback: (success: Boolean) -> Unit )</ID>
|
||||
<ID>NestedBlockDepth:ItemsFragment.kt$ItemsFragment$private fun getRegularItemsOf(path: String, callback: (originalPath: String, items: ArrayList<ListItem>) -> Unit)</ID>
|
||||
<ID>NestedBlockDepth:ItemsFragment.kt$ItemsFragment$private fun searchFiles(text: String, path: String): ArrayList<ListItem></ID>
|
||||
<ID>NestedBlockDepth:RecentsFragment.kt$RecentsFragment$private fun getRecents(callback: (recents: ArrayList<ListItem>) -> Unit)</ID>
|
||||
<ID>NestedBlockDepth:StorageFragment.kt$StorageFragment$override fun setupFragment(activity: SimpleActivity)</ID>
|
||||
<ID>NestedBlockDepth:StorageFragment.kt$StorageFragment$private fun getAllFiles(volumeName: String): ArrayList<FileDirItem></ID>
|
||||
<ID>ReturnCount:MainActivity.kt$MainActivity$override fun onBackPressedCompat(): Boolean</ID>
|
||||
<ID>SwallowedException:ItemsAdapter.kt$ItemsAdapter$e: Exception</ID>
|
||||
<ID>SwallowedException:MimeTypesActivity.kt$MimeTypesActivity$e: Exception</ID>
|
||||
<ID>SwallowedException:StorageFragment.kt$StorageFragment$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DecompressActivity.kt$DecompressActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ItemsAdapter.kt$ItemsAdapter$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ItemsAdapter.kt$ItemsAdapter$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MimeTypesActivity.kt$MimeTypesActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ReadTextActivity.kt$ReadTextActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RecentsFragment.kt$RecentsFragment$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RootHelpers.kt$RootHelpers$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RootHelpers.kt$RootHelpers$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SaveAsActivity.kt$SaveAsActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:StorageFragment.kt$StorageFragment$e: Exception</ID>
|
||||
<ID>TooManyFunctions:DecompressActivity.kt$DecompressActivity : SimpleActivity</ID>
|
||||
<ID>TooManyFunctions:DecompressItemsAdapter.kt$DecompressItemsAdapter : MyRecyclerViewAdapter</ID>
|
||||
<ID>TooManyFunctions:ItemsAdapter.kt$ItemsAdapter : MyRecyclerViewAdapterOnPopupTextUpdate</ID>
|
||||
<ID>TooManyFunctions:ItemsFragment.kt$ItemsFragment : MyViewPagerFragmentItemOperationsListenerBreadcrumbsListener</ID>
|
||||
<ID>TooManyFunctions:MainActivity.kt$MainActivity : SimpleActivity</ID>
|
||||
<ID>TooManyFunctions:ManageFavoritesAdapter.kt$ManageFavoritesAdapter : MyRecyclerViewAdapter</ID>
|
||||
<ID>TooManyFunctions:MimeTypesActivity.kt$MimeTypesActivity : SimpleActivityItemOperationsListener</ID>
|
||||
<ID>TooManyFunctions:ReadTextActivity.kt$ReadTextActivity : SimpleActivity</ID>
|
||||
<ID>TooManyFunctions:RecentsFragment.kt$RecentsFragment : MyViewPagerFragmentItemOperationsListener</ID>
|
||||
<ID>TooManyFunctions:RootHelpers.kt$RootHelpers</ID>
|
||||
<ID>TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
|
||||
<ID>TooManyFunctions:StorageFragment.kt$StorageFragment : MyViewPagerFragmentItemOperationsListener</ID>
|
||||
<ID>VariableNaming:ItemsAdapter.kt$ItemsAdapter$val SAFPath = getFirstSelectedItemPath()</ID>
|
||||
<ID>VariableNaming:RecentsFragment.kt$RecentsFragment$private val RECENTS_LIMIT = 50</ID>
|
||||
<ID>VariableNaming:StorageFragment.kt$StorageFragment$private val SIZE_DIVIDER = 100000</ID>
|
||||
<ID>WildcardImport:ChangeSortingDialog.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:CompressAsDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:CreateNewItemDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:InsertFilenameDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ItemsFragment.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ItemsFragment.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:ManageFavoritesAdapter.kt$import android.view.*</ID>
|
||||
<ID>WildcardImport:MimeTypesActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:MimeTypesActivity.kt$import org.fossify.filemanager.helpers.*</ID>
|
||||
<ID>WildcardImport:MyViewPagerFragment.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ReadTextActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SaveAsActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SaveAsDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.helpers.*</ID>
|
||||
</CurrentIssues>
|
||||
</SmellBaseline>
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<bool name="show_donate_in_about">true</bool>
|
||||
<bool name="hide_google_relations">true</bool>
|
||||
<bool name="pretend_thank_you_installed">true</bool>
|
||||
<bool name="is_google_play_build">false</bool>
|
||||
</resources>
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<bool name="show_donate_in_about">false</bool>
|
||||
<bool name="hide_google_relations">true</bool>
|
||||
<bool name="hide_all_external_links">true</bool>
|
||||
<bool name="is_google_play_build">true</bool>
|
||||
</resources>
|
||||
@@ -22,7 +22,6 @@
|
||||
android:appCategory="productivity"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_launcher_name"
|
||||
android:localeConfig="@xml/locale_config"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:roundIcon="@mipmap/ic_launcher"
|
||||
android:theme="@style/AppTheme">
|
||||
@@ -97,6 +96,7 @@
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="text/*" />
|
||||
<data android:mimeType="application/json" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package org.fossify.filemanager
|
||||
|
||||
import android.app.Application
|
||||
import com.github.ajalt.reprint.core.Reprint
|
||||
import org.fossify.commons.extensions.checkUseEnglish
|
||||
import org.fossify.commons.FossifyApp
|
||||
|
||||
class App : FossifyApp() {
|
||||
override val isAppLockFeatureAvailable = true
|
||||
|
||||
class App : Application() {
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
checkUseEnglish()
|
||||
Reprint.initialize(this)
|
||||
}
|
||||
}
|
||||
@@ -8,14 +8,25 @@ import net.lingala.zip4j.io.inputstream.ZipInputStream
|
||||
import net.lingala.zip4j.model.LocalFileHeader
|
||||
import org.fossify.commons.dialogs.EnterPasswordDialog
|
||||
import org.fossify.commons.dialogs.FilePickerDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.extensions.createDirectorySync
|
||||
import org.fossify.commons.extensions.getDoesFilePathExist
|
||||
import org.fossify.commons.extensions.getFileOutputStreamSync
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getMimeType
|
||||
import org.fossify.commons.extensions.getParentPath
|
||||
import org.fossify.commons.extensions.getRealPathFromURI
|
||||
import org.fossify.commons.extensions.internalStoragePath
|
||||
import org.fossify.commons.extensions.isGone
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.extensions.viewBinding
|
||||
import org.fossify.commons.helpers.NavigationIcon
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isOreoPlus
|
||||
import org.fossify.filemanager.R
|
||||
import org.fossify.filemanager.adapters.DecompressItemsAdapter
|
||||
import org.fossify.filemanager.databinding.ActivityDecompressBinding
|
||||
import org.fossify.filemanager.extensions.config
|
||||
import org.fossify.filemanager.extensions.setLastModified
|
||||
import org.fossify.filemanager.models.ListItem
|
||||
import java.io.BufferedInputStream
|
||||
import java.io.File
|
||||
@@ -31,15 +42,15 @@ class DecompressActivity : SimpleActivity() {
|
||||
private var uri: Uri? = null
|
||||
private var password: String? = null
|
||||
private var passwordDialog: EnterPasswordDialog? = null
|
||||
private var filename = ""
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
isMaterialActivity = true
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(binding.root)
|
||||
setupOptionsMenu()
|
||||
binding.apply {
|
||||
updateMaterialActivityViews(decompressCoordinator, decompressList, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
setupMaterialScrollListener(decompressList, decompressToolbar)
|
||||
setupEdgeToEdge(padBottomSystem = listOf(decompressList))
|
||||
setupMaterialScrollListener(binding.decompressList, binding.decompressAppbar)
|
||||
}
|
||||
|
||||
uri = intent.data
|
||||
@@ -51,13 +62,14 @@ class DecompressActivity : SimpleActivity() {
|
||||
password = savedInstanceState?.getString(PASSWORD, null)
|
||||
|
||||
val realPath = getRealPathFromURI(uri!!)
|
||||
binding.decompressToolbar.title = realPath?.getFilenameFromPath() ?: Uri.decode(uri.toString().getFilenameFromPath())
|
||||
filename = realPath?.getFilenameFromPath() ?: Uri.decode(uri.toString().getFilenameFromPath())
|
||||
binding.decompressToolbar.title = filename
|
||||
setupFilesList()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setupToolbar(binding.decompressToolbar, NavigationIcon.Arrow)
|
||||
setupTopAppBar(binding.decompressAppbar, NavigationIcon.Arrow)
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
@@ -75,16 +87,18 @@ class DecompressActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
if (currentPath.isEmpty()) {
|
||||
super.onBackPressed()
|
||||
override fun onBackPressedCompat(): Boolean {
|
||||
return if (currentPath.isEmpty()) {
|
||||
false
|
||||
} else {
|
||||
val newPath = if (currentPath.contains("/")) currentPath.getParentPath() else ""
|
||||
updateCurrentPath(newPath)
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupFilesList() {
|
||||
allFiles.clear()
|
||||
fillAllListItems(uri!!) {
|
||||
updateCurrentPath("")
|
||||
}
|
||||
@@ -141,26 +155,34 @@ class DecompressActivity : SimpleActivity() {
|
||||
zipInputStream.setPassword(password?.toCharArray())
|
||||
}
|
||||
val buffer = ByteArray(1024)
|
||||
val foldersTimestamp = mutableListOf<Pair<File, LocalFileHeader>>()
|
||||
|
||||
zipInputStream.use {
|
||||
while (true) {
|
||||
val entry = zipInputStream.nextEntry ?: break
|
||||
val filename = title.toString().substringBeforeLast(".")
|
||||
val filename = filename.substringBeforeLast(".")
|
||||
val parent = "$destination/$filename"
|
||||
val newPath = "$parent/${entry.fileName.trimEnd('/')}"
|
||||
|
||||
|
||||
if (!getDoesFilePathExist(parent)) {
|
||||
if (!createDirectorySync(parent)) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if (entry.isDirectory) {
|
||||
val outputFile = File(newPath)
|
||||
|
||||
val isVulnerableForZipPathTraversal = !outputFile.canonicalPath.startsWith(parent)
|
||||
if (isVulnerableForZipPathTraversal) {
|
||||
continue
|
||||
}
|
||||
|
||||
val isVulnerableForZipPathTraversal = !File(newPath).canonicalPath.startsWith(parent)
|
||||
if (isVulnerableForZipPathTraversal) {
|
||||
if (entry.isDirectory) {
|
||||
if (!outputFile.exists()) {
|
||||
outputFile.mkdirs()
|
||||
}
|
||||
foldersTimestamp.add(Pair(outputFile, entry))
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -175,8 +197,11 @@ class DecompressActivity : SimpleActivity() {
|
||||
fos!!.write(buffer, 0, count)
|
||||
}
|
||||
fos!!.close()
|
||||
outputFile.setLastModified(entry)
|
||||
}
|
||||
for ((outputFile, entry) in foldersTimestamp.asReversed()) {
|
||||
outputFile.setLastModified(entry)
|
||||
}
|
||||
|
||||
toast(R.string.decompression_successful)
|
||||
finish()
|
||||
}
|
||||
@@ -247,7 +272,7 @@ class DecompressActivity : SimpleActivity() {
|
||||
passwordDialog = null
|
||||
}
|
||||
|
||||
val lastModified = if (isOreoPlus()) zipEntry.lastModifiedTime else 0
|
||||
val lastModified = zipEntry.lastModifiedTime
|
||||
val filename = zipEntry.fileName.removeSuffix("/")
|
||||
allFiles.add(
|
||||
ListItem(
|
||||
|
||||
@@ -18,20 +18,19 @@ class FavoritesActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
||||
private val binding by viewBinding(ActivityFavoritesBinding::inflate)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
isMaterialActivity = true
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(binding.root)
|
||||
setupOptionsMenu()
|
||||
updateFavorites()
|
||||
binding.apply {
|
||||
updateMaterialActivityViews(manageFavoritesCoordinator, manageFavoritesList, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
setupMaterialScrollListener(manageFavoritesList, manageFavoritesToolbar)
|
||||
setupEdgeToEdge(padBottomSystem = listOf(manageFavoritesList))
|
||||
setupMaterialScrollListener(binding.manageFavoritesList, binding.manageFavoritesAppbar)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setupToolbar(binding.manageFavoritesToolbar, NavigationIcon.Arrow)
|
||||
setupTopAppBar(binding.manageFavoritesAppbar, NavigationIcon.Arrow)
|
||||
}
|
||||
|
||||
private fun setupOptionsMenu() {
|
||||
|
||||
@@ -1,25 +1,58 @@
|
||||
package org.fossify.filemanager.activities
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.content.ClipData
|
||||
import android.content.Intent
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.media.RingtoneManager
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
import android.os.Handler
|
||||
import android.provider.Settings
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.stericson.RootTools.RootTools
|
||||
import me.grantland.widget.AutofitHelper
|
||||
import org.fossify.commons.dialogs.ConfirmationAdvancedDialog
|
||||
import org.fossify.commons.dialogs.RadioGroupDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.extensions.appLaunched
|
||||
import org.fossify.commons.extensions.appLockManager
|
||||
import org.fossify.commons.extensions.beGoneIf
|
||||
import org.fossify.commons.extensions.checkWhatsNew
|
||||
import org.fossify.commons.extensions.getBottomNavigationBackgroundColor
|
||||
import org.fossify.commons.extensions.getColoredDrawableWithColor
|
||||
import org.fossify.commons.extensions.getFilePublicUri
|
||||
import org.fossify.commons.extensions.getMimeType
|
||||
import org.fossify.commons.extensions.getProperBackgroundColor
|
||||
import org.fossify.commons.extensions.getProperTextColor
|
||||
import org.fossify.commons.extensions.getRealPathFromURI
|
||||
import org.fossify.commons.extensions.getStorageDirectories
|
||||
import org.fossify.commons.extensions.getTimeFormat
|
||||
import org.fossify.commons.extensions.handleHiddenFolderPasswordProtection
|
||||
import org.fossify.commons.extensions.hasOTGConnected
|
||||
import org.fossify.commons.extensions.hasPermission
|
||||
import org.fossify.commons.extensions.hideKeyboard
|
||||
import org.fossify.commons.extensions.humanizePath
|
||||
import org.fossify.commons.extensions.internalStoragePath
|
||||
import org.fossify.commons.extensions.isPathOnOTG
|
||||
import org.fossify.commons.extensions.isPathOnSD
|
||||
import org.fossify.commons.extensions.launchMoreAppsFromUsIntent
|
||||
import org.fossify.commons.extensions.onGlobalLayout
|
||||
import org.fossify.commons.extensions.onTabSelectionChanged
|
||||
import org.fossify.commons.extensions.sdCardPath
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.extensions.updateBottomTabItemColors
|
||||
import org.fossify.commons.extensions.viewBinding
|
||||
import org.fossify.commons.helpers.LICENSE_AUTOFITTEXTVIEW
|
||||
import org.fossify.commons.helpers.LICENSE_GESTURE_VIEWS
|
||||
import org.fossify.commons.helpers.LICENSE_GLIDE
|
||||
import org.fossify.commons.helpers.LICENSE_PATTERN
|
||||
import org.fossify.commons.helpers.LICENSE_REPRINT
|
||||
import org.fossify.commons.helpers.LICENSE_ZIP4J
|
||||
import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE
|
||||
import org.fossify.commons.helpers.TAB_FILES
|
||||
import org.fossify.commons.helpers.TAB_RECENT_FILES
|
||||
import org.fossify.commons.helpers.TAB_STORAGE_ANALYSIS
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_GRID
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.models.FAQItem
|
||||
import org.fossify.commons.models.RadioItem
|
||||
import org.fossify.commons.models.Release
|
||||
@@ -42,17 +75,16 @@ import org.fossify.filemanager.interfaces.ItemOperationsListener
|
||||
import java.io.File
|
||||
|
||||
class MainActivity : SimpleActivity() {
|
||||
override var isSearchBarEnabled = true
|
||||
|
||||
companion object {
|
||||
private const val BACK_PRESS_TIMEOUT = 5000
|
||||
private const val MANAGE_STORAGE_RC = 201
|
||||
private const val PICKED_PATH = "picked_path"
|
||||
}
|
||||
|
||||
private val binding by viewBinding(ActivityMainBinding::inflate)
|
||||
|
||||
private var wasBackJustPressed = false
|
||||
private var mIsPasswordProtectionPending = false
|
||||
private var mWasProtectionHandled = false
|
||||
private var mTabsToShow = ArrayList<Int>()
|
||||
|
||||
private var mStoredFontSize = 0
|
||||
@@ -61,7 +93,6 @@ class MainActivity : SimpleActivity() {
|
||||
private var mStoredShowTabs = 0
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
isMaterialActivity = true
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(binding.root)
|
||||
appLaunched(BuildConfig.APPLICATION_ID)
|
||||
@@ -69,7 +100,7 @@ class MainActivity : SimpleActivity() {
|
||||
refreshMenuItems()
|
||||
mTabsToShow = getTabsList()
|
||||
|
||||
if (!config.wasStorageAnalysisTabAdded && isOreoPlus()) {
|
||||
if (!config.wasStorageAnalysisTabAdded) {
|
||||
config.wasStorageAnalysisTabAdded = true
|
||||
if (config.showTabs and TAB_STORAGE_ANALYSIS == 0) {
|
||||
config.showTabs += TAB_STORAGE_ANALYSIS
|
||||
@@ -79,24 +110,15 @@ class MainActivity : SimpleActivity() {
|
||||
storeStateVariables()
|
||||
setupTabs()
|
||||
|
||||
updateMaterialActivityViews(binding.mainCoordinator, null, useTransparentNavigation = false, useTopSearchMenu = true)
|
||||
|
||||
mIsPasswordProtectionPending = config.isAppPasswordProtectionOn
|
||||
setupEdgeToEdge(padBottomImeAndSystem = listOf(binding.mainTabsHolder))
|
||||
|
||||
if (savedInstanceState == null) {
|
||||
handleAppPasswordProtection {
|
||||
mWasProtectionHandled = it
|
||||
if (it) {
|
||||
initFragments()
|
||||
mIsPasswordProtectionPending = false
|
||||
tryInitFileManager()
|
||||
checkWhatsNewDialog()
|
||||
checkIfRootAvailable()
|
||||
checkInvalidFavorites()
|
||||
} else {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
config.temporarilyShowHidden = false
|
||||
initFragments()
|
||||
tryInitFileManager()
|
||||
checkWhatsNewDialog()
|
||||
checkIfRootAvailable()
|
||||
checkInvalidFavorites()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +150,7 @@ class MainActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
if (binding.mainViewPager.adapter == null && mWasProtectionHandled) {
|
||||
if (binding.mainViewPager.adapter == null) {
|
||||
initFragments()
|
||||
}
|
||||
}
|
||||
@@ -139,17 +161,13 @@ class MainActivity : SimpleActivity() {
|
||||
config.lastUsedViewPagerPage = binding.mainViewPager.currentItem
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
config.temporarilyShowHidden = false
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
override fun onBackPressedCompat(): Boolean {
|
||||
val currentFragment = getCurrentFragment()
|
||||
if (binding.mainMenu.isSearchOpen) {
|
||||
binding.mainMenu.closeSearch()
|
||||
return true
|
||||
} else if (currentFragment is RecentsFragment || currentFragment is StorageFragment) {
|
||||
super.onBackPressed()
|
||||
return false
|
||||
} else if ((currentFragment as ItemsFragment).getBreadcrumbs().getItemCount() <= 1) {
|
||||
if (!wasBackJustPressed && config.pressBackTwice) {
|
||||
wasBackJustPressed = true
|
||||
@@ -157,12 +175,16 @@ class MainActivity : SimpleActivity() {
|
||||
Handler().postDelayed({
|
||||
wasBackJustPressed = false
|
||||
}, BACK_PRESS_TIMEOUT.toLong())
|
||||
return true
|
||||
} else {
|
||||
appLockManager.lock()
|
||||
finish()
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
currentFragment.getBreadcrumbs().removeBreadcrumb()
|
||||
openPath(currentFragment.getBreadcrumbs().getLastItem().path)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,7 +194,7 @@ class MainActivity : SimpleActivity() {
|
||||
val currentViewType = config.getFolderViewType(currentFragment.currentPath)
|
||||
val favorites = config.favorites
|
||||
|
||||
binding.mainMenu.getToolbar().menu.apply {
|
||||
binding.mainMenu.requireToolbar().menu.apply {
|
||||
findItem(R.id.sort).isVisible = currentFragment is ItemsFragment
|
||||
findItem(R.id.change_view_type).isVisible = currentFragment !is StorageFragment
|
||||
|
||||
@@ -189,7 +211,7 @@ class MainActivity : SimpleActivity() {
|
||||
|
||||
findItem(R.id.column_count).isVisible = currentViewType == VIEW_TYPE_GRID && currentFragment !is StorageFragment
|
||||
|
||||
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations)
|
||||
findItem(R.id.more_apps_from_us).isVisible = resources.getBoolean(R.bool.is_google_play_build)
|
||||
findItem(R.id.settings).isVisible = !isCreateDocumentIntent
|
||||
findItem(R.id.about).isVisible = !isCreateDocumentIntent
|
||||
}
|
||||
@@ -197,7 +219,7 @@ class MainActivity : SimpleActivity() {
|
||||
|
||||
private fun setupOptionsMenu() {
|
||||
binding.mainMenu.apply {
|
||||
getToolbar().inflateMenu(R.menu.menu)
|
||||
requireToolbar().inflateMenu(R.menu.menu)
|
||||
toggleHideOnScroll(false)
|
||||
setupMenu()
|
||||
|
||||
@@ -211,7 +233,7 @@ class MainActivity : SimpleActivity() {
|
||||
getCurrentFragment()?.searchQueryChanged(text)
|
||||
}
|
||||
|
||||
getToolbar().setOnMenuItemClickListener { menuItem ->
|
||||
requireToolbar().setOnMenuItemClickListener { menuItem ->
|
||||
if (getCurrentFragment() == null) {
|
||||
return@setOnMenuItemClickListener true
|
||||
}
|
||||
@@ -241,42 +263,15 @@ class MainActivity : SimpleActivity() {
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
outState.putString(PICKED_PATH, getItemsFragment()?.currentPath ?: "")
|
||||
outState.putBoolean(WAS_PROTECTION_HANDLED, mWasProtectionHandled)
|
||||
}
|
||||
|
||||
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
|
||||
super.onRestoreInstanceState(savedInstanceState)
|
||||
mWasProtectionHandled = savedInstanceState.getBoolean(WAS_PROTECTION_HANDLED, false)
|
||||
val path = savedInstanceState.getString(PICKED_PATH) ?: internalStoragePath
|
||||
|
||||
if (binding.mainViewPager.adapter == null) {
|
||||
binding.mainViewPager.onGlobalLayout {
|
||||
restorePath(path)
|
||||
}
|
||||
} else {
|
||||
restorePath(path)
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, resultData)
|
||||
isAskingPermissions = false
|
||||
if (requestCode == MANAGE_STORAGE_RC && isRPlus()) {
|
||||
actionOnPermission?.invoke(Environment.isExternalStorageManager())
|
||||
}
|
||||
}
|
||||
|
||||
private fun restorePath(path: String) {
|
||||
if (!mWasProtectionHandled) {
|
||||
handleAppPasswordProtection {
|
||||
mWasProtectionHandled = it
|
||||
if (it) {
|
||||
mIsPasswordProtectionPending = false
|
||||
openPath(path, true)
|
||||
} else {
|
||||
finish()
|
||||
}
|
||||
openPath(path, true)
|
||||
}
|
||||
} else {
|
||||
openPath(path, true)
|
||||
@@ -284,7 +279,6 @@ class MainActivity : SimpleActivity() {
|
||||
}
|
||||
|
||||
private fun updateMenuColors() {
|
||||
updateStatusbarColor(getProperBackgroundColor())
|
||||
binding.mainMenu.updateColors()
|
||||
}
|
||||
|
||||
@@ -316,38 +310,6 @@ class MainActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("InlinedApi")
|
||||
private fun handleStoragePermission(callback: (granted: Boolean) -> Unit) {
|
||||
actionOnPermission = null
|
||||
if (hasStoragePermission()) {
|
||||
callback(true)
|
||||
} else {
|
||||
if (isRPlus()) {
|
||||
ConfirmationAdvancedDialog(this, "", R.string.access_storage_prompt, R.string.ok, 0, false) { success ->
|
||||
if (success) {
|
||||
isAskingPermissions = true
|
||||
actionOnPermission = callback
|
||||
try {
|
||||
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
|
||||
intent.addCategory("android.intent.category.DEFAULT")
|
||||
intent.data = Uri.parse("package:$packageName")
|
||||
startActivityForResult(intent, MANAGE_STORAGE_RC)
|
||||
} catch (e: Exception) {
|
||||
showErrorToast(e)
|
||||
val intent = Intent()
|
||||
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
|
||||
startActivityForResult(intent, MANAGE_STORAGE_RC)
|
||||
}
|
||||
} else {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
handlePermission(PERMISSION_WRITE_STORAGE, callback)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun initFileManager(refreshRecents: Boolean) {
|
||||
if (intent.action == Intent.ACTION_VIEW && intent.data != null) {
|
||||
val data = intent.data
|
||||
@@ -404,7 +366,9 @@ class MainActivity : SimpleActivity() {
|
||||
private fun setupTabs() {
|
||||
binding.mainTabsHolder.removeAllTabs()
|
||||
val action = intent.action
|
||||
val isPickFileIntent = action == RingtoneManager.ACTION_RINGTONE_PICKER || action == Intent.ACTION_GET_CONTENT || action == Intent.ACTION_PICK
|
||||
val isPickFileIntent = action == RingtoneManager.ACTION_RINGTONE_PICKER
|
||||
|| action == Intent.ACTION_GET_CONTENT
|
||||
|| action == Intent.ACTION_PICK
|
||||
val isCreateDocumentIntent = action == Intent.ACTION_CREATE_DOCUMENT
|
||||
|
||||
if (isPickFileIntent) {
|
||||
@@ -457,7 +421,6 @@ class MainActivity : SimpleActivity() {
|
||||
}
|
||||
|
||||
val bottomBarColor = getBottomNavigationBackgroundColor()
|
||||
updateNavigationBarColor(bottomBarColor)
|
||||
mainTabsHolder.setBackgroundColor(bottomBarColor)
|
||||
}
|
||||
}
|
||||
@@ -494,10 +457,6 @@ class MainActivity : SimpleActivity() {
|
||||
}
|
||||
|
||||
private fun openPath(path: String, forceRefresh: Boolean = false) {
|
||||
if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
|
||||
return
|
||||
}
|
||||
|
||||
var newPath = path
|
||||
val file = File(path)
|
||||
if (config.OTGPath.isNotEmpty() && config.OTGPath == path.trimEnd('/')) {
|
||||
@@ -625,7 +584,7 @@ class MainActivity : SimpleActivity() {
|
||||
FAQItem(R.string.faq_9_title_commons, R.string.faq_9_text_commons)
|
||||
)
|
||||
|
||||
if (!resources.getBoolean(R.bool.hide_google_relations)) {
|
||||
if (resources.getBoolean(R.bool.is_google_play_build)) {
|
||||
faqItems.add(FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons))
|
||||
faqItems.add(FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons))
|
||||
faqItems.add(FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons))
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.fossify.filemanager.databinding.ActivityMimetypesBinding
|
||||
import org.fossify.filemanager.dialogs.ChangeSortingDialog
|
||||
import org.fossify.filemanager.dialogs.ChangeViewTypeDialog
|
||||
import org.fossify.filemanager.extensions.config
|
||||
import org.fossify.filemanager.extensions.isPathInHiddenFolder
|
||||
import org.fossify.filemanager.extensions.tryOpenPathIntent
|
||||
import org.fossify.filemanager.helpers.*
|
||||
import org.fossify.filemanager.interfaces.ItemOperationsListener
|
||||
@@ -43,14 +44,13 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
private var currentVolume = PRIMARY_VOLUME_NAME
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
isMaterialActivity = true
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(binding.root)
|
||||
setupOptionsMenu()
|
||||
refreshMenuItems()
|
||||
binding.apply {
|
||||
updateMaterialActivityViews(mimetypesCoordinator, mimetypesList, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
setupMaterialScrollListener(mimetypesList, mimetypesToolbar)
|
||||
setupEdgeToEdge(padBottomImeAndSystem = listOf(mimetypesList))
|
||||
setupMaterialScrollListener(binding.mimetypesList, binding.mimetypesAppbar)
|
||||
}
|
||||
|
||||
currentMimeType = intent.getStringExtra(SHOW_MIMETYPE) ?: return
|
||||
@@ -84,7 +84,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setupToolbar(binding.mimetypesToolbar, NavigationIcon.Arrow, searchMenuItem = searchMenuItem)
|
||||
setupTopAppBar(binding.mimetypesAppbar, NavigationIcon.Arrow, searchMenuItem = searchMenuItem)
|
||||
}
|
||||
|
||||
private fun refreshMenuItems() {
|
||||
@@ -133,10 +133,11 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
override fun selectedPaths(paths: ArrayList<String>) {}
|
||||
|
||||
fun searchQueryChanged(text: String) {
|
||||
val searchText = text.trim()
|
||||
lastSearchedText = searchText
|
||||
val normalizedText = text.normalizeString()
|
||||
val searchNormalizedText = normalizedText.trim()
|
||||
lastSearchedText = searchNormalizedText
|
||||
when {
|
||||
searchText.isEmpty() -> {
|
||||
searchNormalizedText.isEmpty() -> {
|
||||
binding.apply {
|
||||
mimetypesFastscroller.beVisible()
|
||||
getRecyclerAdapter()?.updateItems(storedItems)
|
||||
@@ -145,7 +146,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
}
|
||||
}
|
||||
|
||||
searchText.length == 1 -> {
|
||||
searchNormalizedText.length == 1 -> {
|
||||
binding.apply {
|
||||
mimetypesFastscroller.beGone()
|
||||
mimetypesPlaceholder.beVisible()
|
||||
@@ -155,11 +156,13 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
|
||||
else -> {
|
||||
ensureBackgroundThread {
|
||||
if (lastSearchedText != searchText) {
|
||||
if (lastSearchedText != searchNormalizedText) {
|
||||
return@ensureBackgroundThread
|
||||
}
|
||||
|
||||
val listItems = storedItems.filter { it.name.contains(searchText, true) } as ArrayList<ListItem>
|
||||
val listItems = storedItems.filter {
|
||||
it.name.normalizeString().contains(searchNormalizedText, true)
|
||||
} as ArrayList<ListItem>
|
||||
|
||||
runOnUiThread {
|
||||
getRecyclerAdapter()?.updateItems(listItems, text)
|
||||
@@ -285,7 +288,10 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
try {
|
||||
val fullMimetype = cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault()) ?: return@queryCursor
|
||||
val name = cursor.getStringValue(MediaStore.Files.FileColumns.DISPLAY_NAME)
|
||||
if (!showHidden && name.startsWith(".")) {
|
||||
val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA)
|
||||
|
||||
val isHiddenFile = name.startsWith(".")
|
||||
if (!showHidden && (isHiddenFile || path.isPathInHiddenFolder())) {
|
||||
return@queryCursor
|
||||
}
|
||||
|
||||
@@ -294,7 +300,6 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
return@queryCursor
|
||||
}
|
||||
|
||||
val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA)
|
||||
val lastModified = cursor.getLongValue(MediaStore.Files.FileColumns.DATE_MODIFIED) * 1000
|
||||
|
||||
val mimetype = fullMimetype.substringBefore("/")
|
||||
|
||||
@@ -7,6 +7,7 @@ import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.print.PrintAttributes
|
||||
import android.print.PrintManager
|
||||
import android.util.Base64
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.webkit.WebResourceRequest
|
||||
import android.webkit.WebView
|
||||
@@ -32,6 +33,7 @@ class ReadTextActivity : SimpleActivity() {
|
||||
companion object {
|
||||
private const val SELECT_SAVE_FILE_INTENT = 1
|
||||
private const val SELECT_SAVE_FILE_AND_EXIT_INTENT = 2
|
||||
private const val KEY_UNSAVED_TEXT = "KEY_UNSAVED_TEXT"
|
||||
}
|
||||
|
||||
private val binding by viewBinding(ActivityReadTextBinding::inflate)
|
||||
@@ -49,13 +51,12 @@ class ReadTextActivity : SimpleActivity() {
|
||||
private lateinit var searchClearBtn: ImageView
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
isMaterialActivity = true
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(binding.root)
|
||||
setupOptionsMenu()
|
||||
binding.apply {
|
||||
updateMaterialActivityViews(readTextCoordinator, readTextView, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
setupMaterialScrollListener(readTextHolder, readTextToolbar)
|
||||
setupEdgeToEdge(padBottomImeAndSystem = listOf(readTextView))
|
||||
setupMaterialScrollListener(binding.readTextHolder, binding.readTextAppbar)
|
||||
}
|
||||
|
||||
searchQueryET = findViewById(R.id.search_query)
|
||||
@@ -85,7 +86,7 @@ class ReadTextActivity : SimpleActivity() {
|
||||
|
||||
binding.readTextView.onGlobalLayout {
|
||||
ensureBackgroundThread {
|
||||
checkIntent(uri)
|
||||
checkIntent(uri, savedInstanceState)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,7 +95,14 @@ class ReadTextActivity : SimpleActivity() {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setupToolbar(binding.readTextToolbar, NavigationIcon.Arrow)
|
||||
setupTopAppBar(binding.readTextAppbar, NavigationIcon.Arrow)
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
if (originalText != binding.readTextView.text.toString()) {
|
||||
outState.putString(KEY_UNSAVED_TEXT, binding.readTextView.text.toString())
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||
@@ -111,22 +119,26 @@ class ReadTextActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
override fun onBackPressedCompat(): Boolean {
|
||||
val hasUnsavedChanges = originalText != binding.readTextView.text.toString()
|
||||
when {
|
||||
isSearchActive -> closeSearch()
|
||||
return when {
|
||||
isSearchActive -> {
|
||||
closeSearch()
|
||||
true
|
||||
}
|
||||
hasUnsavedChanges && System.currentTimeMillis() - lastSavePromptTS > SAVE_DISCARD_PROMPT_INTERVAL -> {
|
||||
lastSavePromptTS = System.currentTimeMillis()
|
||||
ConfirmationAdvancedDialog(this, "", R.string.save_before_closing, R.string.save, R.string.discard) {
|
||||
if (it) {
|
||||
saveText(true)
|
||||
} else {
|
||||
super.onBackPressed()
|
||||
performDefaultBack()
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onBackPressed()
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,6 +147,7 @@ class ReadTextActivity : SimpleActivity() {
|
||||
when (menuItem.itemId) {
|
||||
R.id.menu_search -> openSearch()
|
||||
R.id.menu_save -> saveText()
|
||||
R.id.menu_save_as -> saveAsText()
|
||||
R.id.menu_open_with -> openPath(intent.dataString!!, true)
|
||||
R.id.menu_print -> printText()
|
||||
else -> return@setOnMenuItemClickListener false
|
||||
@@ -156,10 +169,14 @@ class ReadTextActivity : SimpleActivity() {
|
||||
}, 250)
|
||||
}
|
||||
|
||||
private fun saveText(shouldExitAfterSaving: Boolean = false) {
|
||||
private fun updateFilePath() {
|
||||
if (filePath.isEmpty()) {
|
||||
filePath = getRealPathFromURI(intent.data!!) ?: ""
|
||||
}
|
||||
}
|
||||
|
||||
private fun saveAsText(shouldExitAfterSaving: Boolean = false) {
|
||||
updateFilePath()
|
||||
|
||||
if (filePath.isEmpty()) {
|
||||
SaveAsDialog(this, filePath, true) { _, filename ->
|
||||
@@ -173,6 +190,7 @@ class ReadTextActivity : SimpleActivity() {
|
||||
} else {
|
||||
SELECT_SAVE_FILE_INTENT
|
||||
}
|
||||
@Suppress("DEPRECATION")
|
||||
startActivityForResult(this, requestCode)
|
||||
}
|
||||
}
|
||||
@@ -191,6 +209,21 @@ class ReadTextActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun saveText(shouldExitAfterSaving: Boolean = false) {
|
||||
updateFilePath()
|
||||
|
||||
if (filePath.isEmpty()) {
|
||||
saveAsText(shouldExitAfterSaving)
|
||||
} else if (hasStoragePermission()) {
|
||||
val file = File(filePath)
|
||||
getFileOutputStream(file.toFileDirItem(this), true) {
|
||||
saveTextContent(it, shouldExitAfterSaving, true)
|
||||
}
|
||||
} else {
|
||||
toast(R.string.no_storage_permissions)
|
||||
}
|
||||
}
|
||||
|
||||
private fun saveTextContent(outputStream: OutputStream?, shouldExitAfterSaving: Boolean, shouldOverwriteOriginalText: Boolean) {
|
||||
if (outputStream != null) {
|
||||
val currentText = binding.readTextView.text.toString()
|
||||
@@ -203,7 +236,7 @@ class ReadTextActivity : SimpleActivity() {
|
||||
}
|
||||
|
||||
if (shouldExitAfterSaving) {
|
||||
super.onBackPressed()
|
||||
performDefaultBack()
|
||||
}
|
||||
} else {
|
||||
toast(R.string.unknown_error_occurred)
|
||||
@@ -221,7 +254,17 @@ class ReadTextActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
webView.loadData(binding.readTextView.text.toString(), "text/plain", "UTF-8")
|
||||
val text = binding.readTextView.text.toString()
|
||||
ensureBackgroundThread {
|
||||
try {
|
||||
val base64 = Base64.encodeToString(text.toByteArray(), Base64.DEFAULT)
|
||||
runOnUiThread {
|
||||
webView.loadData(base64, "text/plain", "base64")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
showErrorToast(e)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
showErrorToast(e)
|
||||
}
|
||||
@@ -241,7 +284,7 @@ class ReadTextActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkIntent(uri: Uri) {
|
||||
private fun checkIntent(uri: Uri, savedInstanceState: Bundle?) {
|
||||
originalText = if (uri.scheme == "file") {
|
||||
filePath = uri.path!!
|
||||
val file = File(filePath)
|
||||
@@ -270,7 +313,13 @@ class ReadTextActivity : SimpleActivity() {
|
||||
}
|
||||
|
||||
runOnUiThread {
|
||||
binding.readTextView.setText(originalText)
|
||||
var textToSet = originalText
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
textToSet = savedInstanceState.getString(KEY_UNSAVED_TEXT, originalText)
|
||||
}
|
||||
|
||||
binding.readTextView.setText(textToSet)
|
||||
if (originalText.isNotEmpty()) {
|
||||
hideKeyboard()
|
||||
} else {
|
||||
|
||||
@@ -18,7 +18,21 @@ class SaveAsActivity : SimpleActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(binding.root)
|
||||
tryInitFileManager()
|
||||
}
|
||||
|
||||
private fun tryInitFileManager() {
|
||||
handleStoragePermission { granted ->
|
||||
if (granted) {
|
||||
saveAsDialog()
|
||||
} else {
|
||||
toast(R.string.no_storage_permissions)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun saveAsDialog() {
|
||||
if (intent.action == Intent.ACTION_SEND && intent.extras?.containsKey(Intent.EXTRA_STREAM) == true) {
|
||||
FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden(), showFAB = true, showFavoritesButton = true) {
|
||||
val destination = it
|
||||
@@ -35,12 +49,16 @@ class SaveAsActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
val source = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
|
||||
val mimeType = source!!.toString().getMimeType()
|
||||
val source = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)!!
|
||||
val originalFilename = getFilenameFromContentUri(source)
|
||||
?: source.toString().getFilenameFromPath()
|
||||
val filename = sanitizeFilename(originalFilename)
|
||||
val mimeType = contentResolver.getType(source)
|
||||
?: intent.type?.takeIf { it != "*/*" }
|
||||
?: filename.getMimeType()
|
||||
val inputStream = contentResolver.openInputStream(source)
|
||||
val filename = source.toString().getFilenameFromPath()
|
||||
|
||||
val destinationPath = "$destination/$filename"
|
||||
val destinationPath = getAvailablePath("$destination/$filename")
|
||||
val outputStream = getFileOutputStreamSync(destinationPath, mimeType, null)!!
|
||||
inputStream!!.copyTo(outputStream)
|
||||
rescanPaths(arrayListOf(destinationPath))
|
||||
@@ -61,6 +79,37 @@ class SaveAsActivity : SimpleActivity() {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setupToolbar(binding.activitySaveAsToolbar, NavigationIcon.Arrow)
|
||||
setupTopAppBar(binding.activitySaveAsAppbar, NavigationIcon.Arrow)
|
||||
}
|
||||
|
||||
private fun sanitizeFilename(filename: String): String {
|
||||
return filename.replace("[/\\\\<>:\"|?*\u0000-\u001F]".toRegex(), "_")
|
||||
.takeIf { it.isNotBlank() } ?: "unnamed_file"
|
||||
}
|
||||
|
||||
private fun getAvailablePath(destinationPath: String): String {
|
||||
if (!getDoesFilePathExist(destinationPath)) {
|
||||
return destinationPath
|
||||
}
|
||||
|
||||
val file = File(destinationPath)
|
||||
return findAvailableName(file)
|
||||
}
|
||||
|
||||
private fun findAvailableName(file: File): String {
|
||||
val parent = file.parent ?: return file.absolutePath
|
||||
val name = file.nameWithoutExtension
|
||||
val ext = if (file.extension.isNotEmpty()) ".${file.extension}" else ""
|
||||
|
||||
var index = 1
|
||||
var newPath: String
|
||||
|
||||
do {
|
||||
newPath = "$parent/${name}_$index$ext"
|
||||
index++
|
||||
} while (getDoesFilePathExist(newPath))
|
||||
|
||||
return newPath
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,18 +21,17 @@ class SettingsActivity : SimpleActivity() {
|
||||
private val binding by viewBinding(ActivitySettingsBinding::inflate)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
isMaterialActivity = true
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(binding.root)
|
||||
binding.apply {
|
||||
updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
setupMaterialScrollListener(settingsNestedScrollview, settingsToolbar)
|
||||
setupEdgeToEdge(padBottomSystem = listOf(settingsNestedScrollview))
|
||||
setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsAppbar)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow)
|
||||
setupTopAppBar(binding.settingsAppbar, NavigationIcon.Arrow)
|
||||
|
||||
setupCustomizeColors()
|
||||
setupUseEnglish()
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
package org.fossify.filemanager.activities
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Intent
|
||||
import android.os.Environment
|
||||
import android.provider.Settings
|
||||
import org.fossify.commons.activities.BaseSimpleActivity
|
||||
import org.fossify.commons.dialogs.ConfirmationAdvancedDialog
|
||||
import org.fossify.commons.extensions.hasPermission
|
||||
import android.net.Uri
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE
|
||||
import org.fossify.commons.helpers.isRPlus
|
||||
import org.fossify.filemanager.R
|
||||
@@ -31,8 +37,23 @@ open class SimpleActivity : BaseSimpleActivity() {
|
||||
R.mipmap.ic_launcher_grey_black
|
||||
)
|
||||
|
||||
companion object {
|
||||
private const val MANAGE_STORAGE_RC = 201
|
||||
}
|
||||
|
||||
override fun getAppLauncherName() = getString(R.string.app_launcher_name)
|
||||
|
||||
override fun getRepositoryName() = "File-Manager"
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, resultData)
|
||||
isAskingPermissions = false
|
||||
if (requestCode == MANAGE_STORAGE_RC && isRPlus()) {
|
||||
actionOnPermission?.invoke(Environment.isExternalStorageManager())
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
fun hasStoragePermission(): Boolean {
|
||||
return if (isRPlus()) {
|
||||
@@ -41,4 +62,39 @@ open class SimpleActivity : BaseSimpleActivity() {
|
||||
hasPermission(PERMISSION_WRITE_STORAGE)
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("InlinedApi")
|
||||
fun handleStoragePermission(callback: (granted: Boolean) -> Unit) {
|
||||
actionOnPermission = null
|
||||
if (hasStoragePermission()) {
|
||||
callback(true)
|
||||
} else {
|
||||
if (isRPlus()) {
|
||||
ConfirmationAdvancedDialog(this, "", R.string.access_storage_prompt, R.string.ok, 0, false) { success ->
|
||||
if (success) {
|
||||
isAskingPermissions = true
|
||||
actionOnPermission = callback
|
||||
try {
|
||||
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
|
||||
intent.addCategory("android.intent.category.DEFAULT")
|
||||
intent.data = Uri.parse("package:$packageName")
|
||||
startActivityForResult(intent, MANAGE_STORAGE_RC)
|
||||
} catch (e: android.content.ActivityNotFoundException) {
|
||||
showErrorToast(e)
|
||||
val intent = Intent()
|
||||
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
|
||||
startActivityForResult(intent, MANAGE_STORAGE_RC)
|
||||
} catch (e: SecurityException) {
|
||||
showErrorToast(e)
|
||||
finish()
|
||||
}
|
||||
} else {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
handlePermission(PERMISSION_WRITE_STORAGE, callback)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -117,8 +117,8 @@ class DecompressItemsAdapter(activity: SimpleActivity, var listItems: MutableLis
|
||||
private fun getImagePathToLoad(path: String): Any {
|
||||
return if (path.endsWith(".apk", true)) {
|
||||
val packageInfo = activity.packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES)
|
||||
if (packageInfo != null) {
|
||||
val appInfo = packageInfo.applicationInfo
|
||||
val appInfo = packageInfo?.applicationInfo
|
||||
if (appInfo != null) {
|
||||
appInfo.sourceDir = path
|
||||
appInfo.publicSourceDir = path
|
||||
appInfo.loadIcon(activity.packageManager)
|
||||
|
||||
@@ -35,19 +35,82 @@ import net.lingala.zip4j.model.LocalFileHeader
|
||||
import net.lingala.zip4j.model.ZipParameters
|
||||
import net.lingala.zip4j.model.enums.EncryptionMethod
|
||||
import org.fossify.commons.adapters.MyRecyclerViewAdapter
|
||||
import org.fossify.commons.dialogs.*
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.dialogs.ConfirmationDialog
|
||||
import org.fossify.commons.dialogs.FilePickerDialog
|
||||
import org.fossify.commons.dialogs.PropertiesDialog
|
||||
import org.fossify.commons.dialogs.RadioGroupDialog
|
||||
import org.fossify.commons.dialogs.RenameDialog
|
||||
import org.fossify.commons.dialogs.RenameItemDialog
|
||||
import org.fossify.commons.dialogs.RenameItemsDialog
|
||||
import org.fossify.commons.extensions.applyColorFilter
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.beVisible
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.convertToBitmap
|
||||
import org.fossify.commons.extensions.copyToClipboard
|
||||
import org.fossify.commons.extensions.createDirectorySync
|
||||
import org.fossify.commons.extensions.deleteFile
|
||||
import org.fossify.commons.extensions.deleteFileBg
|
||||
import org.fossify.commons.extensions.deleteFolderBg
|
||||
import org.fossify.commons.extensions.formatDate
|
||||
import org.fossify.commons.extensions.formatSize
|
||||
import org.fossify.commons.extensions.getAndroidSAFFileItems
|
||||
import org.fossify.commons.extensions.getAndroidSAFUri
|
||||
import org.fossify.commons.extensions.getColoredDrawableWithColor
|
||||
import org.fossify.commons.extensions.getDefaultCopyDestinationPath
|
||||
import org.fossify.commons.extensions.getDocumentFile
|
||||
import org.fossify.commons.extensions.getDoesFilePathExist
|
||||
import org.fossify.commons.extensions.getFileCount
|
||||
import org.fossify.commons.extensions.getFileInputStreamSync
|
||||
import org.fossify.commons.extensions.getFileOutputStreamSync
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getIsPathDirectory
|
||||
import org.fossify.commons.extensions.getMimeType
|
||||
import org.fossify.commons.extensions.getParentPath
|
||||
import org.fossify.commons.extensions.getProperSize
|
||||
import org.fossify.commons.extensions.getTextSize
|
||||
import org.fossify.commons.extensions.getTimeFormat
|
||||
import org.fossify.commons.extensions.handleDeletePasswordProtection
|
||||
import org.fossify.commons.extensions.hasOTGConnected
|
||||
import org.fossify.commons.extensions.highlightTextPart
|
||||
import org.fossify.commons.extensions.isPathOnOTG
|
||||
import org.fossify.commons.extensions.isRestrictedSAFOnlyRoot
|
||||
import org.fossify.commons.extensions.relativizeWith
|
||||
import org.fossify.commons.extensions.setupViewBackground
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.toFileDirItem
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.helpers.CONFLICT_OVERWRITE
|
||||
import org.fossify.commons.helpers.CONFLICT_SKIP
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_LIST
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.getFilePlaceholderDrawables
|
||||
import org.fossify.commons.models.FileDirItem
|
||||
import org.fossify.commons.models.RadioItem
|
||||
import org.fossify.commons.views.MyRecyclerView
|
||||
import org.fossify.filemanager.R
|
||||
import org.fossify.filemanager.activities.SimpleActivity
|
||||
import org.fossify.filemanager.activities.SplashActivity
|
||||
import org.fossify.filemanager.databinding.*
|
||||
import org.fossify.filemanager.databinding.ItemDirGridBinding
|
||||
import org.fossify.filemanager.databinding.ItemEmptyBinding
|
||||
import org.fossify.filemanager.databinding.ItemFileDirListBinding
|
||||
import org.fossify.filemanager.databinding.ItemFileGridBinding
|
||||
import org.fossify.filemanager.databinding.ItemSectionBinding
|
||||
import org.fossify.filemanager.dialogs.CompressAsDialog
|
||||
import org.fossify.filemanager.extensions.*
|
||||
import org.fossify.filemanager.helpers.*
|
||||
import org.fossify.filemanager.extensions.config
|
||||
import org.fossify.filemanager.extensions.isPathOnRoot
|
||||
import org.fossify.filemanager.extensions.isZipFile
|
||||
import org.fossify.filemanager.extensions.setAs
|
||||
import org.fossify.filemanager.extensions.setLastModified
|
||||
import org.fossify.filemanager.extensions.sharePaths
|
||||
import org.fossify.filemanager.extensions.toggleItemVisibility
|
||||
import org.fossify.filemanager.extensions.tryOpenPathIntent
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_AUDIO
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_IMAGE
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_OTHER
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_TEXT
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_VIDEO
|
||||
import org.fossify.filemanager.helpers.RootHelpers
|
||||
import org.fossify.filemanager.interfaces.ItemOperationsListener
|
||||
import org.fossify.filemanager.models.ListItem
|
||||
import java.io.BufferedInputStream
|
||||
@@ -65,7 +128,8 @@ class ItemsAdapter(
|
||||
private val swipeRefreshLayout: SwipeRefreshLayout?,
|
||||
canHaveIndividualViewType: Boolean = true,
|
||||
itemClick: (Any) -> Unit,
|
||||
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick),
|
||||
RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||
|
||||
private lateinit var fileDrawable: Drawable
|
||||
private lateinit var folderDrawable: Drawable
|
||||
@@ -80,7 +144,9 @@ class ItemsAdapter(
|
||||
|
||||
private val config = activity.config
|
||||
private val viewType = if (canHaveIndividualViewType) {
|
||||
config.getFolderViewType(listItems.firstOrNull { !it.isSectionTitle }?.mPath?.getParentPath() ?: "")
|
||||
config.getFolderViewType(
|
||||
path = listItems.firstOrNull { !it.isSectionTitle }?.mPath?.getParentPath().orEmpty()
|
||||
)
|
||||
} else {
|
||||
config.viewType
|
||||
}
|
||||
@@ -106,13 +172,14 @@ class ItemsAdapter(
|
||||
|
||||
override fun prepareActionMode(menu: Menu) {
|
||||
menu.apply {
|
||||
findItem(R.id.cab_decompress).isVisible = getSelectedFileDirItems().map { it.path }.any { it.isZipFile() }
|
||||
findItem(R.id.cab_decompress).isVisible =
|
||||
getSelectedFileDirItems().map { it.path }.any { it.isZipFile() }
|
||||
findItem(R.id.cab_confirm_selection).isVisible = isPickMultipleIntent
|
||||
findItem(R.id.cab_copy_path).isVisible = isOneItemSelected()
|
||||
findItem(R.id.cab_open_with).isVisible = isOneFileSelected()
|
||||
findItem(R.id.cab_open_as).isVisible = isOneFileSelected()
|
||||
findItem(R.id.cab_set_as).isVisible = isOneFileSelected()
|
||||
findItem(R.id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected()
|
||||
findItem(R.id.cab_create_shortcut).isVisible = isOneItemSelected()
|
||||
|
||||
checkHideBtnVisibility(this)
|
||||
}
|
||||
@@ -144,13 +211,21 @@ class ItemsAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getSelectableItemCount() = listItems.filter { !it.isSectionTitle && !it.isGridTypeDivider }.size
|
||||
override fun getSelectableItemCount(): Int {
|
||||
return listItems.filter { !it.isSectionTitle && !it.isGridTypeDivider }.size
|
||||
}
|
||||
|
||||
override fun getIsItemSelectable(position: Int) = !listItems[position].isSectionTitle && !listItems[position].isGridTypeDivider
|
||||
override fun getIsItemSelectable(position: Int): Boolean {
|
||||
return !listItems[position].isSectionTitle && !listItems[position].isGridTypeDivider
|
||||
}
|
||||
|
||||
override fun getItemSelectionKey(position: Int) = listItems.getOrNull(position)?.path?.hashCode()
|
||||
override fun getItemSelectionKey(position: Int): Int? {
|
||||
return listItems.getOrNull(position)?.path?.hashCode()
|
||||
}
|
||||
|
||||
override fun getItemKeyPosition(key: Int) = listItems.indexOfFirst { it.path.hashCode() == key }
|
||||
override fun getItemKeyPosition(key: Int): Int {
|
||||
return listItems.indexOfFirst { it.path.hashCode() == key }
|
||||
}
|
||||
|
||||
override fun onActionModeCreated() {
|
||||
swipeRefreshLayout?.isRefreshing = false
|
||||
@@ -158,7 +233,7 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
override fun onActionModeDestroyed() {
|
||||
swipeRefreshLayout?.isEnabled = true
|
||||
swipeRefreshLayout?.isEnabled = config.enablePullToRefresh
|
||||
}
|
||||
|
||||
override fun getItemViewType(position: Int): Int {
|
||||
@@ -171,25 +246,37 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val binding = Binding.getByItemViewType(viewType, isListViewType).inflate(layoutInflater, parent, false)
|
||||
val binding = Binding.getByItemViewType(viewType, isListViewType)
|
||||
.inflate(layoutInflater, parent, false)
|
||||
|
||||
return createViewHolder(binding.root)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
|
||||
val fileDirItem = listItems[position]
|
||||
holder.bindView(fileDirItem, true, !fileDirItem.isSectionTitle) { itemView, layoutPosition ->
|
||||
holder.bindView(
|
||||
any = fileDirItem,
|
||||
allowSingleClick = true,
|
||||
allowLongClick = !fileDirItem.isSectionTitle
|
||||
) { itemView, layoutPosition ->
|
||||
val viewType = getItemViewType(position)
|
||||
setupView(Binding.getByItemViewType(viewType, isListViewType).bind(itemView), fileDirItem)
|
||||
setupView(
|
||||
binding = Binding.getByItemViewType(viewType, isListViewType).bind(itemView),
|
||||
listItem = fileDirItem
|
||||
)
|
||||
}
|
||||
bindViewHolder(holder)
|
||||
}
|
||||
|
||||
override fun getItemCount() = listItems.size
|
||||
|
||||
private fun getItemWithKey(key: Int): FileDirItem? = listItems.firstOrNull { it.path.hashCode() == key }
|
||||
private fun getItemWithKey(key: Int): FileDirItem? {
|
||||
return listItems.firstOrNull { it.path.hashCode() == key }
|
||||
}
|
||||
|
||||
private fun isOneFileSelected() = isOneItemSelected() && getItemWithKey(selectedKeys.first())?.isDirectory == false
|
||||
private fun isOneFileSelected(): Boolean {
|
||||
return isOneItemSelected() && getItemWithKey(selectedKeys.first())?.isDirectory == false
|
||||
}
|
||||
|
||||
private fun checkHideBtnVisibility(menu: Menu) {
|
||||
var hiddenCnt = 0
|
||||
@@ -208,7 +295,10 @@ class ItemsAdapter(
|
||||
|
||||
private fun confirmSelection() {
|
||||
if (selectedKeys.isNotEmpty()) {
|
||||
val paths = getSelectedFileDirItems().asSequence().filter { !it.isDirectory }.map { it.path }.toMutableList() as ArrayList<String>
|
||||
val paths = getSelectedFileDirItems()
|
||||
.asSequence()
|
||||
.filter { !it.isDirectory }.map { it.path }
|
||||
.toMutableList() as ArrayList<String>
|
||||
if (paths.isEmpty()) {
|
||||
finishActMode()
|
||||
} else {
|
||||
@@ -287,7 +377,11 @@ class ItemsAdapter(
|
||||
getShortcutImage(path, drawable) {
|
||||
val intent = Intent(activity, SplashActivity::class.java)
|
||||
intent.action = Intent.ACTION_VIEW
|
||||
intent.flags = intent.flags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY
|
||||
intent.flags =
|
||||
intent.flags or
|
||||
Intent.FLAG_ACTIVITY_NEW_TASK or
|
||||
Intent.FLAG_ACTIVITY_CLEAR_TASK or
|
||||
Intent.FLAG_ACTIVITY_NO_HISTORY
|
||||
intent.data = Uri.fromFile(File(path))
|
||||
|
||||
val shortcut = ShortcutInfo.Builder(activity, path)
|
||||
@@ -303,7 +397,8 @@ class ItemsAdapter(
|
||||
|
||||
private fun getShortcutImage(path: String, drawable: Drawable, callback: () -> Unit) {
|
||||
val appIconColor = baseConfig.appIconColor
|
||||
(drawable as LayerDrawable).findDrawableByLayerId(R.id.shortcut_folder_background).applyColorFilter(appIconColor)
|
||||
(drawable as LayerDrawable).findDrawableByLayerId(R.id.shortcut_folder_background)
|
||||
.applyColorFilter(appIconColor)
|
||||
if (activity.getIsPathDirectory(path)) {
|
||||
callback()
|
||||
} else {
|
||||
@@ -324,10 +419,15 @@ class ItemsAdapter(
|
||||
|
||||
try {
|
||||
val bitmap = builder.get()
|
||||
drawable.findDrawableByLayerId(R.id.shortcut_folder_background).applyColorFilter(0)
|
||||
drawable.findDrawableByLayerId(R.id.shortcut_folder_background)
|
||||
.applyColorFilter(0)
|
||||
drawable.setDrawableByLayerId(R.id.shortcut_folder_image, bitmap)
|
||||
} catch (e: Exception) {
|
||||
val fileIcon = fileDrawables.getOrElse(path.substringAfterLast(".").lowercase(Locale.getDefault()), { fileDrawable })
|
||||
val fileIcon = fileDrawables
|
||||
.getOrElse(
|
||||
key = path.substringAfterLast(".").lowercase(Locale.getDefault()),
|
||||
defaultValue = { fileDrawable }
|
||||
)
|
||||
drawable.setDrawableByLayerId(R.id.shortcut_folder_image, fileIcon)
|
||||
}
|
||||
|
||||
@@ -352,15 +452,19 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
activity.isPathOnOTG(path) -> {
|
||||
activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach {
|
||||
addFileUris(it.uri.toString(), paths)
|
||||
}
|
||||
activity.getDocumentFile(path)?.listFiles()
|
||||
?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }
|
||||
?.forEach {
|
||||
addFileUris(it.uri.toString(), paths)
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
File(path).listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }?.forEach {
|
||||
addFileUris(it.absolutePath, paths)
|
||||
}
|
||||
File(path).listFiles()
|
||||
?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }
|
||||
?.forEach {
|
||||
addFileUris(it.absolutePath, paths)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -419,11 +523,21 @@ class ItemsAdapter(
|
||||
if (activity.isPathOnRoot(it) || activity.isPathOnRoot(firstFile.path)) {
|
||||
copyMoveRootItems(files, it, isCopyOperation)
|
||||
} else {
|
||||
activity.copyMoveFilesTo(files, source, it, isCopyOperation, false, config.shouldShowHidden()) {
|
||||
activity.copyMoveFilesTo(
|
||||
fileDirItems = files,
|
||||
source = source,
|
||||
destination = it,
|
||||
isCopyOperation = isCopyOperation,
|
||||
copyPhotoVideoOnly = false,
|
||||
copyHidden = config.shouldShowHidden()
|
||||
) {
|
||||
if (!isCopyOperation) {
|
||||
files.forEach { sourceFileDir ->
|
||||
val sourcePath = sourceFileDir.path
|
||||
if (activity.isRestrictedSAFOnlyRoot(sourcePath) && activity.getDoesFilePathExist(sourcePath)) {
|
||||
if (
|
||||
activity.isRestrictedSAFOnlyRoot(sourcePath)
|
||||
&& activity.getDoesFilePathExist(sourcePath)
|
||||
) {
|
||||
activity.deleteFile(sourceFileDir, true) {
|
||||
listener?.refreshFragment()
|
||||
activity.runOnUiThread {
|
||||
@@ -432,8 +546,12 @@ class ItemsAdapter(
|
||||
}
|
||||
} else {
|
||||
val sourceFile = File(sourcePath)
|
||||
if (activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) &&
|
||||
sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0
|
||||
if (
|
||||
activity.getDoesFilePathExist(source)
|
||||
&& activity.getIsPathDirectory(source)
|
||||
&& sourceFile.list()?.isEmpty() == true
|
||||
&& sourceFile.getProperSize(true) == 0L
|
||||
&& sourceFile.getFileCount(true) == 0
|
||||
) {
|
||||
val sourceFolder = sourceFile.toFileDirItem(activity)
|
||||
activity.deleteFile(sourceFolder, true) {
|
||||
@@ -457,7 +575,11 @@ class ItemsAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
private fun copyMoveRootItems(files: ArrayList<FileDirItem>, destinationPath: String, isCopyOperation: Boolean) {
|
||||
private fun copyMoveRootItems(
|
||||
files: ArrayList<FileDirItem>,
|
||||
destinationPath: String,
|
||||
isCopyOperation: Boolean
|
||||
) {
|
||||
activity.toast(R.string.copying)
|
||||
ensureBackgroundThread {
|
||||
val fileCnt = files.size
|
||||
@@ -523,7 +645,11 @@ class ItemsAdapter(
|
||||
return@handleSAFDialog
|
||||
}
|
||||
|
||||
val paths = getSelectedFileDirItems().asSequence().map { it.path }.filter { it.isZipFile() }.toList()
|
||||
val paths = getSelectedFileDirItems()
|
||||
.asSequence()
|
||||
.map { it.path }
|
||||
.filter { it.isZipFile() }
|
||||
.toList()
|
||||
ensureBackgroundThread {
|
||||
tryDecompressingPaths(paths) { success ->
|
||||
activity.runOnUiThread {
|
||||
@@ -540,15 +666,28 @@ class ItemsAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
private fun tryDecompressingPaths(sourcePaths: List<String>, callback: (success: Boolean) -> Unit) {
|
||||
private fun tryDecompressingPaths(
|
||||
sourcePaths: List<String>,
|
||||
callback: (success: Boolean) -> Unit
|
||||
) {
|
||||
sourcePaths.forEach { path ->
|
||||
ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path))).use { zipInputStream ->
|
||||
try {
|
||||
val fileDirItems = ArrayList<FileDirItem>()
|
||||
var entry = zipInputStream.nextEntry
|
||||
while (entry != null) {
|
||||
val currPath = if (entry.isDirectory) path else "${path.getParentPath().trimEnd('/')}/${entry.fileName}"
|
||||
val fileDirItem = FileDirItem(currPath, entry.fileName, entry.isDirectory, 0, entry.uncompressedSize)
|
||||
val currPath = if (entry.isDirectory) {
|
||||
path
|
||||
} else {
|
||||
"${path.getParentPath().trimEnd('/')}/${entry.fileName}"
|
||||
}
|
||||
val fileDirItem = FileDirItem(
|
||||
path = currPath,
|
||||
name = entry.fileName,
|
||||
isDirectory = entry.isDirectory,
|
||||
children = 0,
|
||||
size = entry.uncompressedSize
|
||||
)
|
||||
fileDirItems.add(fileDirItem)
|
||||
entry = zipInputStream.nextEntry
|
||||
}
|
||||
@@ -573,9 +712,16 @@ class ItemsAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
private fun decompressPaths(paths: List<String>, conflictResolutions: LinkedHashMap<String, Int>, callback: (success: Boolean) -> Unit) {
|
||||
private fun decompressPaths(
|
||||
paths: List<String>,
|
||||
conflictResolutions: LinkedHashMap<String, Int>,
|
||||
callback: (success: Boolean) -> Unit
|
||||
) {
|
||||
paths.forEach { path ->
|
||||
val zipInputStream = ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path)))
|
||||
val zipInputStream =
|
||||
ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path)))
|
||||
|
||||
val foldersTimestamp = mutableListOf<Pair<File, LocalFileHeader>>()
|
||||
zipInputStream.use {
|
||||
try {
|
||||
var entry = zipInputStream.nextEntry
|
||||
@@ -588,11 +734,15 @@ class ItemsAdapter(
|
||||
val resolution = getConflictResolution(conflictResolutions, newPath)
|
||||
val doesPathExist = activity.getDoesFilePathExist(newPath)
|
||||
if (doesPathExist && resolution == CONFLICT_OVERWRITE) {
|
||||
val fileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), entry.isDirectory)
|
||||
val fileDirItem = FileDirItem(
|
||||
path = newPath,
|
||||
name = newPath.getFilenameFromPath(),
|
||||
isDirectory = entry.isDirectory
|
||||
)
|
||||
if (activity.getIsPathDirectory(path)) {
|
||||
activity.deleteFolderBg(fileDirItem, false) {
|
||||
if (it) {
|
||||
extractEntry(newPath, entry, zipInputStream)
|
||||
extractEntry(newPath, entry, zipInputStream, foldersTimestamp)
|
||||
} else {
|
||||
callback(false)
|
||||
}
|
||||
@@ -600,18 +750,21 @@ class ItemsAdapter(
|
||||
} else {
|
||||
activity.deleteFileBg(fileDirItem, false, false) {
|
||||
if (it) {
|
||||
extractEntry(newPath, entry, zipInputStream)
|
||||
extractEntry(newPath, entry, zipInputStream, foldersTimestamp)
|
||||
} else {
|
||||
callback(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!doesPathExist) {
|
||||
extractEntry(newPath, entry, zipInputStream)
|
||||
extractEntry(newPath, entry, zipInputStream, foldersTimestamp)
|
||||
}
|
||||
|
||||
entry = zipInputStream.nextEntry
|
||||
}
|
||||
for ((dir, header) in foldersTimestamp.asReversed()) {
|
||||
dir.setLastModified(header)
|
||||
}
|
||||
callback(true)
|
||||
} catch (e: Exception) {
|
||||
activity.showErrorToast(e)
|
||||
@@ -621,21 +774,33 @@ class ItemsAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
private fun extractEntry(newPath: String, entry: LocalFileHeader, zipInputStream: ZipInputStream) {
|
||||
private fun extractEntry(
|
||||
newPath: String,
|
||||
entry: LocalFileHeader,
|
||||
zipInputStream: ZipInputStream,
|
||||
foldersTimestamp: MutableList<Pair<File, LocalFileHeader>>
|
||||
) {
|
||||
if (entry.isDirectory) {
|
||||
if (!activity.createDirectorySync(newPath) && !activity.getDoesFilePathExist(newPath)) {
|
||||
val error = String.format(activity.getString(R.string.could_not_create_file), newPath)
|
||||
val error =
|
||||
String.format(activity.getString(R.string.could_not_create_file), newPath)
|
||||
activity.showErrorToast(error)
|
||||
} else {
|
||||
foldersTimestamp.add(Pair(File(newPath), entry))
|
||||
}
|
||||
} else {
|
||||
val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())
|
||||
if (fos != null) {
|
||||
zipInputStream.copyTo(fos)
|
||||
File(newPath).setLastModified(entry)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getConflictResolution(conflictResolutions: LinkedHashMap<String, Int>, path: String): Int {
|
||||
private fun getConflictResolution(
|
||||
conflictResolutions: LinkedHashMap<String, Int>,
|
||||
path: String
|
||||
): Int {
|
||||
return if (conflictResolutions.size == 1 && conflictResolutions.containsKey("")) {
|
||||
conflictResolutions[""]!!
|
||||
} else if (conflictResolutions.containsKey(path)) {
|
||||
@@ -646,15 +811,21 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
private fun compressPaths(sourcePaths: List<String>, targetPath: String, password: String? = null): Boolean {
|
||||
private fun compressPaths(
|
||||
sourcePaths: List<String>,
|
||||
targetPath: String,
|
||||
password: String? = null
|
||||
): Boolean {
|
||||
val queue = LinkedList<String>()
|
||||
val fos = activity.getFileOutputStreamSync(targetPath, "application/zip") ?: return false
|
||||
|
||||
val zout = password?.let { ZipOutputStream(fos, password.toCharArray()) } ?: ZipOutputStream(fos)
|
||||
val zout =
|
||||
password?.let { ZipOutputStream(fos, password.toCharArray()) } ?: ZipOutputStream(fos)
|
||||
var res: Closeable = fos
|
||||
|
||||
fun zipEntry(name: String) = ZipParameters().also {
|
||||
fun zipEntry(name: String, lastModified: Long) = ZipParameters().also {
|
||||
it.fileNameInZip = name
|
||||
it.lastModifiedFileTime = lastModified
|
||||
if (password != null) {
|
||||
it.isEncryptFiles = true
|
||||
it.encryptionMethod = EncryptionMethod.AES
|
||||
@@ -670,9 +841,11 @@ class ItemsAdapter(
|
||||
queue.push(mainFilePath)
|
||||
if (activity.getIsPathDirectory(mainFilePath)) {
|
||||
name = "${mainFilePath.getFilenameFromPath()}/"
|
||||
val dirModified = File(mainFilePath).lastModified()
|
||||
zout.putNextEntry(
|
||||
ZipParameters().also {
|
||||
it.fileNameInZip = name
|
||||
it.lastModifiedFileTime = dirModified
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -687,9 +860,9 @@ class ItemsAdapter(
|
||||
if (activity.getIsPathDirectory(file.path)) {
|
||||
queue.push(file.path)
|
||||
name = "${name.trimEnd('/')}/"
|
||||
zout.putNextEntry(zipEntry(name))
|
||||
zout.putNextEntry(zipEntry(name, file.modified))
|
||||
} else {
|
||||
zout.putNextEntry(zipEntry(name))
|
||||
zout.putNextEntry(zipEntry(name, file.modified))
|
||||
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
|
||||
zout.closeEntry()
|
||||
}
|
||||
@@ -702,9 +875,9 @@ class ItemsAdapter(
|
||||
if (activity.getIsPathDirectory(file.absolutePath)) {
|
||||
queue.push(file.absolutePath)
|
||||
name = "${name.trimEnd('/')}/"
|
||||
zout.putNextEntry(zipEntry(name))
|
||||
zout.putNextEntry(zipEntry(name, file.lastModified()))
|
||||
} else {
|
||||
zout.putNextEntry(zipEntry(name))
|
||||
zout.putNextEntry(zipEntry(name, file.lastModified()))
|
||||
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
|
||||
zout.closeEntry()
|
||||
}
|
||||
@@ -712,8 +885,14 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
} else {
|
||||
name = if (base == currentPath) currentPath.getFilenameFromPath() else mainFilePath.relativizeWith(base)
|
||||
zout.putNextEntry(zipEntry(name))
|
||||
name =
|
||||
if (base == currentPath) {
|
||||
currentPath.getFilenameFromPath()
|
||||
} else {
|
||||
mainFilePath.relativizeWith(base)
|
||||
}
|
||||
val fileModified = File(mainFilePath).lastModified()
|
||||
zout.putNextEntry(zipEntry(name, fileModified))
|
||||
activity.getFileInputStreamSync(mainFilePath)!!.copyTo(zout)
|
||||
zout.closeEntry()
|
||||
}
|
||||
@@ -787,7 +966,11 @@ class ItemsAdapter(
|
||||
|
||||
private fun getFirstSelectedItemPath() = getSelectedFileDirItems().first().path
|
||||
|
||||
private fun getSelectedFileDirItems() = listItems.filter { selectedKeys.contains(it.path.hashCode()) } as ArrayList<FileDirItem>
|
||||
private fun getSelectedFileDirItems(): ArrayList<FileDirItem> {
|
||||
return listItems.filter {
|
||||
selectedKeys.contains(it.path.hashCode())
|
||||
} as ArrayList<FileDirItem>
|
||||
}
|
||||
|
||||
fun updateItems(newItems: ArrayList<ListItem>, highlightText: String = "") {
|
||||
if (newItems.hashCode() != currentItemsHash) {
|
||||
@@ -833,7 +1016,8 @@ class ItemsAdapter(
|
||||
override fun onViewRecycled(holder: ViewHolder) {
|
||||
super.onViewRecycled(holder)
|
||||
if (!activity.isDestroyed && !activity.isFinishing) {
|
||||
val icon = Binding.getByItemViewType(holder.itemViewType, isListViewType).bind(holder.itemView).itemIcon
|
||||
val icon = Binding.getByItemViewType(holder.itemViewType, isListViewType)
|
||||
.bind(holder.itemView).itemIcon
|
||||
if (icon != null) {
|
||||
Glide.with(activity).clear(icon)
|
||||
}
|
||||
@@ -845,16 +1029,35 @@ class ItemsAdapter(
|
||||
binding.apply {
|
||||
if (listItem.isSectionTitle) {
|
||||
itemIcon?.setImageDrawable(folderDrawable)
|
||||
itemSection?.text = if (textToHighlight.isEmpty()) listItem.mName else listItem.mName.highlightTextPart(textToHighlight, properPrimaryColor)
|
||||
itemSection?.text =
|
||||
if (textToHighlight.isEmpty()) {
|
||||
listItem.mName
|
||||
} else {
|
||||
listItem.mName.highlightTextPart(
|
||||
textToHighlight = textToHighlight,
|
||||
color = properPrimaryColor
|
||||
)
|
||||
}
|
||||
itemSection?.setTextColor(textColor)
|
||||
itemSection?.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
|
||||
} else if (!listItem.isGridTypeDivider) {
|
||||
root.setupViewBackground(activity)
|
||||
itemFrame.isSelected = isSelected
|
||||
val fileName = listItem.name
|
||||
itemName?.text = if (textToHighlight.isEmpty()) fileName else fileName.highlightTextPart(textToHighlight, properPrimaryColor)
|
||||
itemName?.text =
|
||||
if (textToHighlight.isEmpty()) {
|
||||
fileName
|
||||
} else {
|
||||
fileName.highlightTextPart(
|
||||
textToHighlight = textToHighlight,
|
||||
color = properPrimaryColor
|
||||
)
|
||||
}
|
||||
itemName?.setTextColor(textColor)
|
||||
itemName?.setTextSize(TypedValue.COMPLEX_UNIT_PX, if (isListViewType) fontSize else smallerFontSize)
|
||||
itemName?.setTextSize(
|
||||
TypedValue.COMPLEX_UNIT_PX,
|
||||
if (isListViewType) fontSize else smallerFontSize
|
||||
)
|
||||
|
||||
itemDetails?.setTextColor(textColor)
|
||||
itemDetails?.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
|
||||
@@ -883,7 +1086,10 @@ class ItemsAdapter(
|
||||
itemDate?.beVisible()
|
||||
itemDate?.text = listItem.modified.formatDate(activity, dateFormat, timeFormat)
|
||||
|
||||
val drawable = fileDrawables.getOrElse(fileName.substringAfterLast(".").lowercase(Locale.getDefault()), { fileDrawable })
|
||||
val drawable = fileDrawables.getOrElse(
|
||||
key = fileName.substringAfterLast(".").lowercase(Locale.getDefault()),
|
||||
defaultValue = { fileDrawable }
|
||||
)
|
||||
val options = RequestOptions()
|
||||
.signature(listItem.getKey())
|
||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
@@ -908,14 +1114,18 @@ class ItemsAdapter(
|
||||
return activity.resources.getQuantityString(R.plurals.items, children, children)
|
||||
}
|
||||
|
||||
private fun getOTGPublicPath(itemToLoad: String) =
|
||||
"${baseConfig.OTGTreeUri}/document/${baseConfig.OTGPartition}%3A${itemToLoad.substring(baseConfig.OTGPath.length).replace("/", "%2F")}"
|
||||
private fun getOTGPublicPath(itemToLoad: String): String {
|
||||
return "${baseConfig.OTGTreeUri}/document/${baseConfig.OTGPartition}%3A${
|
||||
itemToLoad.substring(baseConfig.OTGPath.length).replace("/", "%2F")
|
||||
}"
|
||||
}
|
||||
|
||||
private fun getImagePathToLoad(path: String): Any {
|
||||
var itemToLoad = if (path.endsWith(".apk", true)) {
|
||||
val packageInfo = activity.packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES)
|
||||
if (packageInfo != null) {
|
||||
val appInfo = packageInfo.applicationInfo
|
||||
val packageInfo =
|
||||
activity.packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES)
|
||||
val appInfo = packageInfo?.applicationInfo
|
||||
if (appInfo != null) {
|
||||
appInfo.sourceDir = path
|
||||
appInfo.publicSourceDir = path
|
||||
appInfo.loadIcon(activity.packageManager)
|
||||
@@ -936,13 +1146,16 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
fun initDrawables() {
|
||||
folderDrawable = resources.getColoredDrawableWithColor(R.drawable.ic_folder_vector, properPrimaryColor)
|
||||
folderDrawable =
|
||||
resources.getColoredDrawableWithColor(R.drawable.ic_folder_vector, properPrimaryColor)
|
||||
folderDrawable.alpha = 180
|
||||
fileDrawable = resources.getDrawable(R.drawable.ic_file_generic)
|
||||
fileDrawables = getFilePlaceholderDrawables(activity)
|
||||
}
|
||||
|
||||
override fun onChange(position: Int) = listItems.getOrNull(position)?.getBubbleText(activity, dateFormat, timeFormat) ?: ""
|
||||
override fun onChange(position: Int): String {
|
||||
return listItems.getOrNull(position)?.getBubbleText(activity, dateFormat, timeFormat) ?: ""
|
||||
}
|
||||
|
||||
private sealed interface Binding {
|
||||
companion object {
|
||||
@@ -963,12 +1176,23 @@ class ItemsAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding
|
||||
fun inflate(
|
||||
layoutInflater: LayoutInflater,
|
||||
viewGroup: ViewGroup,
|
||||
attachToRoot: Boolean
|
||||
): ItemViewBinding
|
||||
|
||||
fun bind(view: View): ItemViewBinding
|
||||
|
||||
data object ItemSection : Binding {
|
||||
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
|
||||
return ItemSectionBindingAdapter(ItemSectionBinding.inflate(layoutInflater, viewGroup, attachToRoot))
|
||||
override fun inflate(
|
||||
layoutInflater: LayoutInflater,
|
||||
viewGroup: ViewGroup,
|
||||
attachToRoot: Boolean
|
||||
): ItemViewBinding {
|
||||
return ItemSectionBindingAdapter(
|
||||
ItemSectionBinding.inflate(layoutInflater, viewGroup, attachToRoot)
|
||||
)
|
||||
}
|
||||
|
||||
override fun bind(view: View): ItemViewBinding {
|
||||
@@ -977,8 +1201,14 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
data object ItemEmpty : Binding {
|
||||
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
|
||||
return ItemEmptyBindingAdapter(ItemEmptyBinding.inflate(layoutInflater, viewGroup, attachToRoot))
|
||||
override fun inflate(
|
||||
layoutInflater: LayoutInflater,
|
||||
viewGroup: ViewGroup,
|
||||
attachToRoot: Boolean
|
||||
): ItemViewBinding {
|
||||
return ItemEmptyBindingAdapter(
|
||||
ItemEmptyBinding.inflate(layoutInflater, viewGroup, attachToRoot)
|
||||
)
|
||||
}
|
||||
|
||||
override fun bind(view: View): ItemViewBinding {
|
||||
@@ -987,8 +1217,14 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
data object ItemFileDirList : Binding {
|
||||
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
|
||||
return ItemFileDirListBindingAdapter(ItemFileDirListBinding.inflate(layoutInflater, viewGroup, attachToRoot))
|
||||
override fun inflate(
|
||||
layoutInflater: LayoutInflater,
|
||||
viewGroup: ViewGroup,
|
||||
attachToRoot: Boolean
|
||||
): ItemViewBinding {
|
||||
return ItemFileDirListBindingAdapter(
|
||||
ItemFileDirListBinding.inflate(layoutInflater, viewGroup, attachToRoot)
|
||||
)
|
||||
}
|
||||
|
||||
override fun bind(view: View): ItemViewBinding {
|
||||
@@ -997,8 +1233,14 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
data object ItemDirGrid : Binding {
|
||||
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
|
||||
return ItemDirGridBindingAdapter(ItemDirGridBinding.inflate(layoutInflater, viewGroup, attachToRoot))
|
||||
override fun inflate(
|
||||
layoutInflater: LayoutInflater,
|
||||
viewGroup: ViewGroup,
|
||||
attachToRoot: Boolean
|
||||
): ItemViewBinding {
|
||||
return ItemDirGridBindingAdapter(
|
||||
ItemDirGridBinding.inflate(layoutInflater, viewGroup, attachToRoot)
|
||||
)
|
||||
}
|
||||
|
||||
override fun bind(view: View): ItemViewBinding {
|
||||
@@ -1007,8 +1249,14 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
data object ItemFileGrid : Binding {
|
||||
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
|
||||
return ItemFileGridBindingAdapter(ItemFileGridBinding.inflate(layoutInflater, viewGroup, attachToRoot))
|
||||
override fun inflate(
|
||||
layoutInflater: LayoutInflater,
|
||||
viewGroup: ViewGroup,
|
||||
attachToRoot: Boolean
|
||||
): ItemViewBinding {
|
||||
return ItemFileGridBindingAdapter(
|
||||
ItemFileGridBinding.inflate(layoutInflater, viewGroup, attachToRoot)
|
||||
)
|
||||
}
|
||||
|
||||
override fun bind(view: View): ItemViewBinding {
|
||||
@@ -1050,7 +1298,9 @@ class ItemsAdapter(
|
||||
override fun getRoot(): View = binding.root
|
||||
}
|
||||
|
||||
private class ItemFileDirListBindingAdapter(val binding: ItemFileDirListBinding) : ItemViewBinding {
|
||||
private class ItemFileDirListBindingAdapter(
|
||||
val binding: ItemFileDirListBinding
|
||||
) : ItemViewBinding {
|
||||
override val itemFrame: FrameLayout = binding.itemFrame
|
||||
override val itemName: TextView = binding.itemName
|
||||
override val itemIcon: ImageView = binding.itemIcon
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package org.fossify.filemanager.adapters
|
||||
|
||||
import android.view.*
|
||||
import android.widget.PopupMenu
|
||||
import androidx.appcompat.widget.PopupMenu
|
||||
import org.fossify.commons.activities.BaseSimpleActivity
|
||||
import org.fossify.commons.adapters.MyRecyclerViewAdapter
|
||||
import org.fossify.commons.extensions.getPopupMenuTheme
|
||||
|
||||
@@ -22,7 +22,8 @@ class ViewPagerAdapter(val activity: SimpleActivity, val tabsToShow: ArrayList<I
|
||||
|
||||
(view as MyViewPagerFragment<*>).apply {
|
||||
val isPickRingtoneIntent = activity.intent.action == RingtoneManager.ACTION_RINGTONE_PICKER
|
||||
val isGetContentIntent = activity.intent.action == Intent.ACTION_GET_CONTENT || activity.intent.action == Intent.ACTION_PICK
|
||||
val isGetContentIntent = activity.intent.action == Intent.ACTION_GET_CONTENT
|
||||
|| activity.intent.action == Intent.ACTION_PICK
|
||||
val isCreateDocumentIntent = activity.intent.action == Intent.ACTION_CREATE_DOCUMENT
|
||||
val allowPickingMultipleIntent = activity.intent.getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
|
||||
val getContentMimeType = if (isGetContentIntent) {
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
package org.fossify.filemanager.dialogs
|
||||
|
||||
import org.fossify.commons.activities.BaseSimpleActivity
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.getAlertDialogBuilder
|
||||
import org.fossify.commons.extensions.setupDialogStuff
|
||||
import org.fossify.commons.helpers.TAB_FILES
|
||||
import org.fossify.commons.helpers.TAB_RECENT_FILES
|
||||
import org.fossify.commons.helpers.TAB_STORAGE_ANALYSIS
|
||||
import org.fossify.commons.helpers.isOreoPlus
|
||||
import org.fossify.commons.views.MyAppCompatCheckbox
|
||||
import org.fossify.filemanager.R
|
||||
import org.fossify.filemanager.databinding.DialogManageVisibleTabsBinding
|
||||
@@ -25,10 +23,6 @@ class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
|
||||
put(TAB_STORAGE_ANALYSIS, R.id.manage_visible_tabs_storage_analysis)
|
||||
}
|
||||
|
||||
if (!isOreoPlus()) {
|
||||
binding.manageVisibleTabsStorageAnalysis.beGone()
|
||||
}
|
||||
|
||||
val showTabs = activity.config.showTabs
|
||||
for ((key, value) in tabs) {
|
||||
binding.root.findViewById<MyAppCompatCheckbox>(value).isChecked = showTabs and key != 0
|
||||
|
||||
@@ -2,15 +2,22 @@ package org.fossify.filemanager.extensions
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.view.View
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.FileProvider
|
||||
import org.fossify.commons.activities.BaseSimpleActivity
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.isNougatPlus
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getMimeTypeFromUri
|
||||
import org.fossify.commons.extensions.getParentPath
|
||||
import org.fossify.commons.extensions.launchActivityIntent
|
||||
import org.fossify.commons.extensions.openPathIntent
|
||||
import org.fossify.commons.extensions.renameFile
|
||||
import org.fossify.commons.extensions.setAsIntent
|
||||
import org.fossify.commons.extensions.sharePathsIntent
|
||||
import org.fossify.filemanager.BuildConfig
|
||||
import org.fossify.filemanager.helpers.*
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_AUDIO
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_DEFAULT
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_IMAGE
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_TEXT
|
||||
import org.fossify.filemanager.helpers.OPEN_AS_VIDEO
|
||||
import java.io.File
|
||||
|
||||
fun Activity.sharePaths(paths: ArrayList<String>) {
|
||||
@@ -19,11 +26,9 @@ fun Activity.sharePaths(paths: ArrayList<String>) {
|
||||
|
||||
fun Activity.tryOpenPathIntent(path: String, forceChooser: Boolean, openAsType: Int = OPEN_AS_DEFAULT, finishActivity: Boolean = false) {
|
||||
if (!forceChooser && path.endsWith(".apk", true)) {
|
||||
val uri = if (isNougatPlus()) {
|
||||
FileProvider.getUriForFile(this, "${BuildConfig.APPLICATION_ID}.provider", File(path))
|
||||
} else {
|
||||
Uri.fromFile(File(path))
|
||||
}
|
||||
val uri = FileProvider.getUriForFile(
|
||||
this, "${BuildConfig.APPLICATION_ID}.provider", File(path)
|
||||
)
|
||||
|
||||
Intent().apply {
|
||||
action = Intent.ACTION_VIEW
|
||||
@@ -78,27 +83,3 @@ fun BaseSimpleActivity.toggleItemVisibility(oldPath: String, hide: Boolean, call
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun AppCompatActivity.showSystemUI(toggleActionBarVisibility: Boolean) {
|
||||
if (toggleActionBarVisibility) {
|
||||
supportActionBar?.show()
|
||||
}
|
||||
|
||||
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
}
|
||||
|
||||
fun AppCompatActivity.hideSystemUI(toggleActionBarVisibility: Boolean) {
|
||||
if (toggleActionBarVisibility) {
|
||||
supportActionBar?.hide()
|
||||
}
|
||||
|
||||
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
|
||||
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
|
||||
View.SYSTEM_UI_FLAG_LOW_PROFILE or
|
||||
View.SYSTEM_UI_FLAG_FULLSCREEN or
|
||||
View.SYSTEM_UI_FLAG_IMMERSIVE
|
||||
}
|
||||
@@ -4,7 +4,6 @@ import android.content.Context
|
||||
import android.os.storage.StorageManager
|
||||
import org.fossify.commons.extensions.isPathOnOTG
|
||||
import org.fossify.commons.extensions.isPathOnSD
|
||||
import org.fossify.commons.helpers.isNougatPlus
|
||||
import org.fossify.filemanager.helpers.Config
|
||||
import org.fossify.filemanager.helpers.PRIMARY_VOLUME_NAME
|
||||
import java.util.Locale
|
||||
@@ -15,15 +14,13 @@ fun Context.isPathOnRoot(path: String) = !(path.startsWith(config.internalStorag
|
||||
|
||||
fun Context.getAllVolumeNames(): List<String> {
|
||||
val volumeNames = mutableListOf(PRIMARY_VOLUME_NAME)
|
||||
if (isNougatPlus()) {
|
||||
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
|
||||
getExternalFilesDirs(null)
|
||||
.mapNotNull { storageManager.getStorageVolume(it) }
|
||||
.filterNot { it.isPrimary }
|
||||
.mapNotNull { it.uuid?.lowercase(Locale.US) }
|
||||
.forEach {
|
||||
volumeNames.add(it)
|
||||
}
|
||||
}
|
||||
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
|
||||
getExternalFilesDirs(null)
|
||||
.mapNotNull { storageManager.getStorageVolume(it) }
|
||||
.filterNot { it.isPrimary }
|
||||
.mapNotNull { it.uuid?.lowercase(Locale.US) }
|
||||
.forEach {
|
||||
volumeNames.add(it)
|
||||
}
|
||||
return volumeNames
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package org.fossify.filemanager.extensions
|
||||
|
||||
import java.text.DecimalFormat
|
||||
|
||||
// use 1000 instead of 1024 at dividing
|
||||
fun Long.formatSizeThousand(): String {
|
||||
if (this <= 0) {
|
||||
return "0 B"
|
||||
}
|
||||
|
||||
val units = arrayOf("B", "kB", "MB", "GB", "TB")
|
||||
val digitGroups = (Math.log10(toDouble()) / Math.log10(1000.0)).toInt()
|
||||
return "${DecimalFormat("#,##0.#").format(this / Math.pow(1000.0, digitGroups.toDouble()))} ${units[digitGroups]}"
|
||||
}
|
||||
@@ -1,3 +1,15 @@
|
||||
package org.fossify.filemanager.extensions
|
||||
|
||||
fun String.isZipFile() = endsWith(".zip", true)
|
||||
|
||||
fun String.isPathInHiddenFolder(): Boolean {
|
||||
val parts = split("/")
|
||||
for (i in 1 until parts.size - 1) {
|
||||
val part = parts[i]
|
||||
val isHidden = part.startsWith(".") && part != "." && part != ".." && part.isNotEmpty()
|
||||
if (isHidden) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package org.fossify.filemanager.extensions
|
||||
|
||||
import net.lingala.zip4j.model.LocalFileHeader
|
||||
import java.io.File
|
||||
|
||||
fun File.setLastModified(localFileHeader: LocalFileHeader) {
|
||||
setLastModified(localFileHeader.lastModifiedOrCurrentTimeMillis)
|
||||
}
|
||||
|
||||
private val LocalFileHeader.lastModifiedOrCurrentTimeMillis
|
||||
get() = if (lastModifiedTimeEpoch == 0L) {
|
||||
System.currentTimeMillis()
|
||||
} else {
|
||||
lastModifiedTimeEpoch
|
||||
}
|
||||
@@ -186,7 +186,8 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
if (activity?.isDestroyed == false && activity?.isFinishing == false) {
|
||||
val config = context!!.config
|
||||
if (context.isRestrictedSAFOnlyRoot(path)) {
|
||||
activity?.handleAndroidSAFDialog(path) {
|
||||
activity?.runOnUiThread { hideProgressBar() }
|
||||
activity?.handleAndroidSAFDialog(path, openInSystemAppAllowed = true) {
|
||||
if (!it) {
|
||||
activity?.toast(R.string.no_storage_permissions)
|
||||
return@handleAndroidSAFDialog
|
||||
@@ -256,7 +257,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
}
|
||||
|
||||
var lastModified = lastModifieds.remove(curPath)
|
||||
val isDirectory = if (lastModified != null) false else file.isDirectory
|
||||
val isDirectory = file.isDirectory
|
||||
val children = if (isDirectory && getProperChildCount) file.getDirectChildrenCount(context, showHidden) else 0
|
||||
val size = if (isDirectory) {
|
||||
if (isSortingBySize) {
|
||||
@@ -376,6 +377,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
return files
|
||||
}
|
||||
|
||||
val normalizedText = text.normalizeString()
|
||||
val sorting = context!!.config.getFolderSorting(path)
|
||||
FileDirItem.sorting = context!!.config.getFolderSorting(currentPath)
|
||||
val isSortingBySize = sorting and SORT_BY_SIZE != 0
|
||||
@@ -385,7 +387,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
}
|
||||
|
||||
if (it.isDirectory) {
|
||||
if (it.name.contains(text, true)) {
|
||||
if (it.name.normalizeString().contains(normalizedText, true)) {
|
||||
val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false)
|
||||
if (fileDirItem != null) {
|
||||
files.add(fileDirItem)
|
||||
@@ -394,7 +396,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
|
||||
files.addAll(searchFiles(text, it.absolutePath))
|
||||
} else {
|
||||
if (it.name.contains(text, true)) {
|
||||
if (it.name.normalizeString().contains(normalizedText, true)) {
|
||||
val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false)
|
||||
if (fileDirItem != null) {
|
||||
files.add(fileDirItem)
|
||||
|
||||
@@ -6,11 +6,17 @@ import android.provider.MediaStore.Files
|
||||
import android.provider.MediaStore.Files.FileColumns
|
||||
import android.util.AttributeSet
|
||||
import androidx.core.os.bundleOf
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.extensions.areSystemAnimationsEnabled
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.getDoesFilePathExist
|
||||
import org.fossify.commons.extensions.getFilenameFromPath
|
||||
import org.fossify.commons.extensions.getLongValue
|
||||
import org.fossify.commons.extensions.getStringValue
|
||||
import org.fossify.commons.extensions.normalizeString
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_GRID
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_LIST
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.helpers.isOreoPlus
|
||||
import org.fossify.commons.models.FileDirItem
|
||||
import org.fossify.commons.views.MyGridLayoutManager
|
||||
import org.fossify.commons.views.MyRecyclerView
|
||||
@@ -19,6 +25,7 @@ import org.fossify.filemanager.activities.SimpleActivity
|
||||
import org.fossify.filemanager.adapters.ItemsAdapter
|
||||
import org.fossify.filemanager.databinding.RecentsFragmentBinding
|
||||
import org.fossify.filemanager.extensions.config
|
||||
import org.fossify.filemanager.extensions.isPathInHiddenFolder
|
||||
import org.fossify.filemanager.helpers.MAX_COLUMN_COUNT
|
||||
import org.fossify.filemanager.interfaces.ItemOperationsListener
|
||||
import org.fossify.filemanager.models.ListItem
|
||||
@@ -156,17 +163,13 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
)
|
||||
|
||||
try {
|
||||
if (isOreoPlus()) {
|
||||
val queryArgs = bundleOf(
|
||||
ContentResolver.QUERY_ARG_LIMIT to RECENTS_LIMIT,
|
||||
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(FileColumns.DATE_MODIFIED),
|
||||
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
|
||||
)
|
||||
context?.contentResolver?.query(uri, projection, queryArgs, null)
|
||||
} else {
|
||||
val sortOrder = "${FileColumns.DATE_MODIFIED} DESC LIMIT $RECENTS_LIMIT"
|
||||
context?.contentResolver?.query(uri, projection, null, null, sortOrder)
|
||||
}?.use { cursor ->
|
||||
val queryArgs = bundleOf(
|
||||
ContentResolver.QUERY_ARG_LIMIT to RECENTS_LIMIT,
|
||||
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(FileColumns.DATE_MODIFIED),
|
||||
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
|
||||
)
|
||||
|
||||
context?.contentResolver?.query(uri, projection, queryArgs, null)?.use { cursor ->
|
||||
if (cursor.moveToFirst()) {
|
||||
do {
|
||||
val path = cursor.getStringValue(FileColumns.DATA)
|
||||
@@ -177,9 +180,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
|
||||
val size = cursor.getLongValue(FileColumns.SIZE)
|
||||
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
|
||||
val fileDirItem = ListItem(path, name, false, 0, size, modified, false, false)
|
||||
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
|
||||
val isHiddenFile = name.startsWith(".")
|
||||
val shouldShow = showHidden || (!isHiddenFile && !path.isPathInHiddenFolder())
|
||||
if (shouldShow && activity?.getDoesFilePathExist(path) == true) {
|
||||
if (wantedMimeTypes.any { isProperMimeType(it, path, false) }) {
|
||||
val fileDirItem = ListItem(path, name, false, 0, size, modified, false, false)
|
||||
listItems.add(fileDirItem)
|
||||
}
|
||||
}
|
||||
@@ -241,7 +246,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
|
||||
override fun searchQueryChanged(text: String) {
|
||||
lastSearchedText = text
|
||||
val filtered = filesIgnoringSearch.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList<ListItem>
|
||||
val normalizedText = text.normalizeString()
|
||||
val filtered = filesIgnoringSearch.filter {
|
||||
it.mName.normalizeString().contains(normalizedText, true)
|
||||
}.toMutableList() as ArrayList<ListItem>
|
||||
|
||||
binding.apply {
|
||||
(recentsList.adapter as? ItemsAdapter)?.updateItems(filtered, text)
|
||||
recentsPlaceholder.beVisibleIf(filtered.isEmpty())
|
||||
|
||||
@@ -16,8 +16,27 @@ import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.os.bundleOf
|
||||
import androidx.core.view.children
|
||||
import androidx.core.view.isVisible
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.helpers.*
|
||||
import org.fossify.commons.extensions.adjustAlpha
|
||||
import org.fossify.commons.extensions.applyColorFilter
|
||||
import org.fossify.commons.extensions.beGone
|
||||
import org.fossify.commons.extensions.beVisible
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.fadeIn
|
||||
import org.fossify.commons.extensions.formatSize
|
||||
import org.fossify.commons.extensions.getIsPathDirectory
|
||||
import org.fossify.commons.extensions.getLongValue
|
||||
import org.fossify.commons.extensions.getProperBackgroundColor
|
||||
import org.fossify.commons.extensions.getProperPrimaryColor
|
||||
import org.fossify.commons.extensions.getStringValue
|
||||
import org.fossify.commons.extensions.normalizeString
|
||||
import org.fossify.commons.extensions.queryCursor
|
||||
import org.fossify.commons.extensions.showErrorToast
|
||||
import org.fossify.commons.extensions.updateTextColors
|
||||
import org.fossify.commons.helpers.LOWER_ALPHA
|
||||
import org.fossify.commons.helpers.SHORT_ANIMATION_DURATION
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_GRID
|
||||
import org.fossify.commons.helpers.VIEW_TYPE_LIST
|
||||
import org.fossify.commons.helpers.ensureBackgroundThread
|
||||
import org.fossify.commons.models.FileDirItem
|
||||
import org.fossify.commons.views.MyGridLayoutManager
|
||||
import org.fossify.filemanager.R
|
||||
@@ -27,15 +46,28 @@ import org.fossify.filemanager.adapters.ItemsAdapter
|
||||
import org.fossify.filemanager.databinding.ItemStorageVolumeBinding
|
||||
import org.fossify.filemanager.databinding.StorageFragmentBinding
|
||||
import org.fossify.filemanager.extensions.config
|
||||
import org.fossify.filemanager.extensions.formatSizeThousand
|
||||
import org.fossify.filemanager.extensions.getAllVolumeNames
|
||||
import org.fossify.filemanager.helpers.*
|
||||
import org.fossify.filemanager.helpers.ARCHIVES
|
||||
import org.fossify.filemanager.helpers.AUDIO
|
||||
import org.fossify.filemanager.helpers.DOCUMENTS
|
||||
import org.fossify.filemanager.helpers.IMAGES
|
||||
import org.fossify.filemanager.helpers.OTHERS
|
||||
import org.fossify.filemanager.helpers.PRIMARY_VOLUME_NAME
|
||||
import org.fossify.filemanager.helpers.SHOW_MIMETYPE
|
||||
import org.fossify.filemanager.helpers.VIDEOS
|
||||
import org.fossify.filemanager.helpers.VOLUME_NAME
|
||||
import org.fossify.filemanager.helpers.archiveMimeTypes
|
||||
import org.fossify.filemanager.helpers.extraAudioMimeTypes
|
||||
import org.fossify.filemanager.helpers.extraDocumentMimeTypes
|
||||
import org.fossify.filemanager.helpers.getListItemsFromFileDirItems
|
||||
import org.fossify.filemanager.interfaces.ItemOperationsListener
|
||||
import org.fossify.filemanager.models.ListItem
|
||||
import java.util.Locale
|
||||
|
||||
class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment<MyViewPagerFragment.StorageInnerBinding>(context, attributeSet),
|
||||
ItemOperationsListener {
|
||||
class StorageFragment(
|
||||
context: Context,
|
||||
attributeSet: AttributeSet
|
||||
) : MyViewPagerFragment<MyViewPagerFragment.StorageInnerBinding>(context, attributeSet), ItemOperationsListener {
|
||||
private val SIZE_DIVIDER = 100000
|
||||
private var allDeviceListItems = ArrayList<ListItem>()
|
||||
private var lastSearchedText = ""
|
||||
@@ -65,7 +97,6 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
}
|
||||
|
||||
totalSpace.text = String.format(context.getString(R.string.total_storage), "…")
|
||||
getSizes(volumeName)
|
||||
|
||||
if (volumeNames.size > 1) {
|
||||
root.children.forEach { it.beGone() }
|
||||
@@ -125,8 +156,7 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
val tealColor = context.resources.getColor(R.color.md_teal_700)
|
||||
val pinkColor = context.resources.getColor(R.color.md_pink_700)
|
||||
|
||||
volumes.entries.forEach { (it, volumeBinding) ->
|
||||
getSizes(it)
|
||||
volumes.values.forEach { volumeBinding ->
|
||||
volumeBinding.apply {
|
||||
mainStorageUsageProgressbar.setIndicatorColor(properPrimaryColor)
|
||||
mainStorageUsageProgressbar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA)
|
||||
@@ -173,10 +203,6 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
}
|
||||
|
||||
private fun getSizes(volumeName: String) {
|
||||
if (!isOreoPlus()) {
|
||||
return
|
||||
}
|
||||
|
||||
ensureBackgroundThread {
|
||||
val filesSize = getSizesByMimeType(volumeName)
|
||||
val fileSizeImages = filesSize[IMAGES]!!
|
||||
@@ -227,7 +253,8 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
try {
|
||||
context.queryCursor(uri, projection) { cursor ->
|
||||
try {
|
||||
val mimeType = cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault())
|
||||
val mimeType =
|
||||
cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault())
|
||||
val size = cursor.getLongValue(MediaStore.Files.FileColumns.SIZE)
|
||||
if (mimeType == null) {
|
||||
if (size > 0 && size != 4096L) {
|
||||
@@ -284,15 +311,11 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
if (storageVolume.isPrimary) {
|
||||
// internal storage
|
||||
volumeName = PRIMARY_VOLUME_NAME
|
||||
if (isOreoPlus()) {
|
||||
val storageStatsManager = context.getSystemService(AppCompatActivity.STORAGE_STATS_SERVICE) as StorageStatsManager
|
||||
val uuid = StorageManager.UUID_DEFAULT
|
||||
totalStorageSpace = storageStatsManager.getTotalBytes(uuid)
|
||||
freeStorageSpace = storageStatsManager.getFreeBytes(uuid)
|
||||
} else {
|
||||
totalStorageSpace = file.totalSpace
|
||||
freeStorageSpace = file.freeSpace
|
||||
}
|
||||
val storageStatsManager =
|
||||
context.getSystemService(AppCompatActivity.STORAGE_STATS_SERVICE) as StorageStatsManager
|
||||
val uuid = StorageManager.UUID_DEFAULT
|
||||
totalStorageSpace = storageStatsManager.getTotalBytes(uuid)
|
||||
freeStorageSpace = storageStatsManager.getFreeBytes(uuid)
|
||||
} else {
|
||||
volumeName = storageVolume.uuid!!.lowercase(Locale.US)
|
||||
totalStorageSpace = file.totalSpace
|
||||
@@ -302,24 +325,33 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
post {
|
||||
volumes[volumeName]?.apply {
|
||||
arrayOf(
|
||||
mainStorageUsageProgressbar, imagesProgressbar, videosProgressbar, audioProgressbar, documentsProgressbar,
|
||||
archivesProgressbar, othersProgressbar
|
||||
mainStorageUsageProgressbar,
|
||||
imagesProgressbar,
|
||||
videosProgressbar,
|
||||
audioProgressbar,
|
||||
documentsProgressbar,
|
||||
archivesProgressbar,
|
||||
othersProgressbar
|
||||
).forEach {
|
||||
it.max = (totalStorageSpace / SIZE_DIVIDER).toInt()
|
||||
}
|
||||
|
||||
mainStorageUsageProgressbar.progress = ((totalStorageSpace - freeStorageSpace) / SIZE_DIVIDER).toInt()
|
||||
mainStorageUsageProgressbar.progress =
|
||||
((totalStorageSpace - freeStorageSpace) / SIZE_DIVIDER).toInt()
|
||||
|
||||
mainStorageUsageProgressbar.beVisible()
|
||||
freeSpaceValue.text = freeStorageSpace.formatSizeThousand()
|
||||
totalSpace.text = String.format(context.getString(R.string.total_storage), totalStorageSpace.formatSizeThousand())
|
||||
freeSpaceValue.text = freeStorageSpace.formatSize()
|
||||
totalSpace.text =
|
||||
String.format(context.getString(R.string.total_storage), totalStorageSpace.formatSize())
|
||||
freeSpaceLabel.beVisible()
|
||||
getSizes(volumeName)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun searchQueryChanged(text: String) {
|
||||
val normalizedText = text.normalizeString()
|
||||
lastSearchedText = text
|
||||
binding.apply {
|
||||
if (text.isNotEmpty()) {
|
||||
@@ -344,8 +376,10 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
} else {
|
||||
showProgressBar()
|
||||
ensureBackgroundThread {
|
||||
val start = System.currentTimeMillis()
|
||||
val filtered = allDeviceListItems.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList<ListItem>
|
||||
val filtered = allDeviceListItems.filter {
|
||||
it.mName.normalizeString().contains(normalizedText, true)
|
||||
}.toMutableList() as ArrayList<ListItem>
|
||||
|
||||
if (lastSearchedText != text) {
|
||||
return@ensureBackgroundThread
|
||||
}
|
||||
@@ -405,16 +439,12 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
)
|
||||
|
||||
try {
|
||||
if (isOreoPlus()) {
|
||||
val queryArgs = bundleOf(
|
||||
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(MediaStore.Files.FileColumns.DATE_MODIFIED),
|
||||
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
|
||||
)
|
||||
context?.contentResolver?.query(uri, projection, queryArgs, null)
|
||||
} else {
|
||||
val sortOrder = "${MediaStore.Files.FileColumns.DATE_MODIFIED} DESC"
|
||||
context?.contentResolver?.query(uri, projection, null, null, sortOrder)
|
||||
}?.use { cursor ->
|
||||
val queryArgs = bundleOf(
|
||||
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(MediaStore.Files.FileColumns.DATE_MODIFIED),
|
||||
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
|
||||
)
|
||||
|
||||
context?.contentResolver?.query(uri, projection, queryArgs, null)?.use { cursor ->
|
||||
if (cursor.moveToFirst()) {
|
||||
do {
|
||||
try {
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package org.fossify.filemanager.views
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||
|
||||
class MySwipeRefreshLayout @JvmOverloads constructor(
|
||||
context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
) : SwipeRefreshLayout(context, attrs) {
|
||||
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
|
||||
// Setting "isEnabled = false" is recommended for users of this ViewGroup
|
||||
// who who are not interested in the pull to refresh functionality
|
||||
// Setting this easily avoids executing code needlessly before the check for "canChildScrollUp".
|
||||
if (!isEnabled) {
|
||||
return false
|
||||
}
|
||||
return super.onInterceptTouchEvent(ev)
|
||||
}
|
||||
|
||||
override fun onStartNestedScroll(child: View, target: View, nestedScrollAxes: Int): Boolean {
|
||||
// Ignoring nested scrolls from descendants.
|
||||
// Allowing descendants to trigger nested scrolls would defeat the purpose of this class
|
||||
// and result in pull to refresh to happen for all movements on the Y axis
|
||||
// (even as part of scale/quick scale gestures) while also doubling the throbber with the overscroll shadow.
|
||||
return if (isEnabled) {
|
||||
return false
|
||||
} else {
|
||||
super.onStartNestedScroll(child, target, nestedScrollAxes)
|
||||
}
|
||||
}
|
||||
|
||||
override fun canChildScrollUp(): Boolean {
|
||||
val directChild = getChildAt(0)
|
||||
return when (directChild) {
|
||||
is RecyclerViewFastScroller -> {
|
||||
val innerRecyclerView = directChild.getChildAt(0)
|
||||
innerRecyclerView?.canScrollVertically(-1) == true
|
||||
}
|
||||
else -> super.canChildScrollUp()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,22 +5,29 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/decompress_toolbar"
|
||||
<org.fossify.commons.views.MyAppBarLayout
|
||||
android:id="@+id/decompress_appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:menu="@menu/menu_decompress"
|
||||
app:title="@string/decompress"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/decompress_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:menu="@menu/menu_decompress"
|
||||
app:title="@string/decompress"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
|
||||
</org.fossify.commons.views.MyAppBarLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/decompress_wrapper"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="?attr/actionBarSize"
|
||||
android:fillViewport="true"
|
||||
android:scrollbars="none">
|
||||
android:scrollbars="none"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<org.fossify.commons.views.MyRecyclerView
|
||||
android:id="@+id/decompress_list"
|
||||
|
||||
@@ -6,22 +6,29 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/manage_favorites_toolbar"
|
||||
<org.fossify.commons.views.MyAppBarLayout
|
||||
android:id="@+id/manage_favorites_appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:menu="@menu/menu_favorites"
|
||||
app:title="@string/manage_favorites"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/manage_favorites_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:menu="@menu/menu_favorites"
|
||||
app:title="@string/manage_favorites"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
|
||||
</org.fossify.commons.views.MyAppBarLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/manage_favorites_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="?attr/actionBarSize"
|
||||
android:fillViewport="true"
|
||||
android:scrollbars="none">
|
||||
android:scrollbars="none"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<org.fossify.commons.views.MyRecyclerView
|
||||
android:id="@+id/manage_favorites_list"
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
android:id="@+id/main_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="?attr/actionBarSize">
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<org.fossify.commons.views.MyViewPager
|
||||
android:id="@+id/main_view_pager"
|
||||
|
||||
@@ -5,21 +5,28 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/mimetypes_toolbar"
|
||||
<org.fossify.commons.views.MyAppBarLayout
|
||||
android:id="@+id/mimetypes_appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:menu="@menu/menu_mimetypes"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/mimetypes_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:menu="@menu/menu_mimetypes"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
|
||||
</org.fossify.commons.views.MyAppBarLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/mimetypes_holder"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="?attr/actionBarSize"
|
||||
android:fillViewport="true"
|
||||
android:scrollbars="none">
|
||||
android:scrollbars="none"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<org.fossify.commons.views.MyTextView
|
||||
android:id="@+id/mimetypes_placeholder"
|
||||
|
||||
@@ -5,23 +5,30 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/read_text_toolbar"
|
||||
<org.fossify.commons.views.MyAppBarLayout
|
||||
android:id="@+id/read_text_appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:menu="@menu/menu_editor"
|
||||
app:title="@string/file_editor"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/read_text_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:menu="@menu/menu_editor"
|
||||
app:title="@string/file_editor"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
|
||||
</org.fossify.commons.views.MyAppBarLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/read_text_wrapper"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="?attr/actionBarSize"
|
||||
android:fillViewport="true"
|
||||
android:orientation="vertical"
|
||||
android:scrollbars="none">
|
||||
android:scrollbars="none"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<include
|
||||
android:id="@+id/search_wrapper"
|
||||
|
||||
@@ -5,18 +5,25 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/activity_save_as_toolbar"
|
||||
<org.fossify.commons.views.MyAppBarLayout
|
||||
android:id="@+id/activity_save_as_appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:title="@string/save_as"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/activity_save_as_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:title="@string/save_as"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
|
||||
</org.fossify.commons.views.MyAppBarLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/activity_save_as_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="?attr/actionBarSize" />
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
@@ -6,21 +6,28 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/settings_toolbar"
|
||||
<org.fossify.commons.views.MyAppBarLayout
|
||||
android:id="@+id/settings_appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:title="@string/settings"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/settings_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="@color/color_primary"
|
||||
app:title="@string/settings"
|
||||
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||
|
||||
</org.fossify.commons.views.MyAppBarLayout>
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/settings_nested_scrollview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="?attr/actionBarSize"
|
||||
android:fillViewport="true"
|
||||
android:scrollbars="none">
|
||||
android:scrollbars="none"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/settings_holder"
|
||||
@@ -63,15 +70,20 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/general_settings" />
|
||||
|
||||
<org.fossify.commons.views.PurchaseThankYouItem
|
||||
android:id="@+id/settings_purchase_thank_you_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_use_english_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_use_english"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/use_english_language" />
|
||||
@@ -171,13 +183,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_press_back_twice_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_press_back_twice"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/press_back_twice" />
|
||||
@@ -197,13 +209,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_show_hidden_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_show_hidden"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/show_hidden_items" />
|
||||
@@ -223,13 +235,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_enable_pull_to_refresh_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_enable_pull_to_refresh"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/enable_pull_to_refresh" />
|
||||
@@ -249,13 +261,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_keep_last_modified_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_keep_last_modified"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/keep_last_modified" />
|
||||
@@ -264,13 +276,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_skip_delete_confirmation_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_skip_delete_confirmation"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/skip_delete_confirmation" />
|
||||
@@ -290,13 +302,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_password_protection_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_password_protection"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/password_protect_hidden_items" />
|
||||
@@ -305,13 +317,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_app_password_protection_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_app_password_protection"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/password_protect_whole_app" />
|
||||
@@ -320,13 +332,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_file_deletion_password_protection_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_file_deletion_password_protection"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/password_protect_file_deletion" />
|
||||
@@ -335,13 +347,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_enable_root_access_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_enable_root_access"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/enable_root_access" />
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
android:textStyle="italic"
|
||||
android:visibility="gone" />
|
||||
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
<org.fossify.filemanager.views.MySwipeRefreshLayout
|
||||
android:id="@+id/items_swipe_refresh"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -90,7 +90,7 @@
|
||||
app:layoutManager="org.fossify.commons.views.MyGridLayoutManager" />
|
||||
|
||||
</com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
</org.fossify.filemanager.views.MySwipeRefreshLayout>
|
||||
</RelativeLayout>
|
||||
|
||||
<org.fossify.commons.views.MyFloatingActionButton
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
<org.fossify.filemanager.views.MySwipeRefreshLayout
|
||||
android:id="@+id/recents_swipe_refresh"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
@@ -37,5 +37,5 @@
|
||||
android:scrollbars="none"
|
||||
app:layoutManager="org.fossify.commons.views.MyGridLayoutManager" />
|
||||
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
</org.fossify.filemanager.views.MySwipeRefreshLayout>
|
||||
</org.fossify.filemanager.fragments.RecentsFragment>
|
||||
@@ -62,14 +62,14 @@
|
||||
android:id="@+id/settings"
|
||||
android:icon="@drawable/ic_settings_cog_vector"
|
||||
android:title="@string/settings"
|
||||
app:showAsAction="ifRoom" />
|
||||
app:showAsAction="never" />
|
||||
<item
|
||||
android:id="@+id/about"
|
||||
android:icon="@drawable/ic_info_vector"
|
||||
android:title="@string/about"
|
||||
app:showAsAction="ifRoom" />
|
||||
app:showAsAction="never" />
|
||||
<item
|
||||
android:id="@+id/more_apps_from_us"
|
||||
android:title="@string/more_apps_from_us"
|
||||
android:title="@string/more_fossify_apps"
|
||||
app:showAsAction="never" />
|
||||
</menu>
|
||||
@@ -11,13 +11,18 @@
|
||||
<item
|
||||
android:id="@+id/menu_save"
|
||||
android:icon="@drawable/ic_save_vector"
|
||||
android:title="@string/save_as"
|
||||
android:title="@string/save"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/menu_save_as"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/save_as"
|
||||
app:showAsAction="never" />
|
||||
<item
|
||||
android:id="@+id/menu_print"
|
||||
android:icon="@drawable/ic_print_vector"
|
||||
android:title="@string/print"
|
||||
app:showAsAction="always" />
|
||||
app:showAsAction="ifRoom" />
|
||||
<item
|
||||
android:id="@+id/menu_open_with"
|
||||
android:showAsAction="never"
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:id="@+id/menu_print"
|
||||
android:icon="@drawable/ic_print_vector"
|
||||
android:title="@string/print"
|
||||
app:showAsAction="always" />
|
||||
</menu>
|
||||
@@ -0,0 +1 @@
|
||||
unqualifiedResLocale=en-US
|
||||
@@ -1,37 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">مدير الملفات</string>
|
||||
<string name="press_back_again">اضغط مرة أخرى للخروج</string>
|
||||
<string name="go_to_home_folder">الذهاب الى الرئيسية</string>
|
||||
<string name="set_as_home_folder">تعيين كمجلد رئيسي</string>
|
||||
<string name="home_folder_updated">تم تحديث المجلد الرئيسي</string>
|
||||
<string name="copy_path">نسخ المسار الى الحافظة</string>
|
||||
<string name="path_copied">تم نسخ المسار</string>
|
||||
<string name="press_back_again">انقر مرة أخرى للخروج</string>
|
||||
<string name="go_to_home_folder">اذهب إلى المجلد المنزل</string>
|
||||
<string name="set_as_home_folder">عيّن كمجلد المنزل</string>
|
||||
<string name="home_folder_updated">حُدِّث مجلد المنزل</string>
|
||||
<string name="copy_path">انسخ المسار إلى الحافظة</string>
|
||||
<string name="path_copied">نُسخ المسار</string>
|
||||
<string name="select_audio_file">الرجاء تحديد ملف صوتي</string>
|
||||
<string name="search_folder">مجلد البحث</string>
|
||||
<string name="rooted_device_only">تعمل هذه العملية فقط على الأجهزة المتجذرة</string>
|
||||
<string name="recents">الأحدث</string>
|
||||
<string name="show_recents">إظهار الأحدث</string>
|
||||
<string name="invert_colors">عكس الألوان</string>
|
||||
<string name="compress">ضغط</string>
|
||||
<string name="show_recents">أظهر الأحدث</string>
|
||||
<string name="invert_colors">اعكس الألوان</string>
|
||||
<string name="compress">اضغط</string>
|
||||
<string name="decompress">فك الضغط</string>
|
||||
<string name="compress_as">ضغط كا</string>
|
||||
<string name="compressing">ضغط…</string>
|
||||
<string name="decompressing">فك الضغط…</string>
|
||||
<string name="compress_as">اضغط كَ</string>
|
||||
<string name="compressing">جار الضغط…</string>
|
||||
<string name="decompressing">جارِ فك الضغط…</string>
|
||||
<string name="compression_successful">نجح الضغط</string>
|
||||
<string name="decompression_successful">نجح التفكيك</string>
|
||||
<string name="compressing_failed">أخفق الضغط</string>
|
||||
<string name="decompressing_failed">أخفق إلغاء الضغط</string>
|
||||
<string name="manage_favorites">إدارة المفضلة</string>
|
||||
<string name="go_to_favorite">الذهاب الى المفضلة</string>
|
||||
<string name="decompression_successful">نجح فك ضغط</string>
|
||||
<string name="compressing_failed">فشل الضغط</string>
|
||||
<string name="decompressing_failed">فشل فك الضغط</string>
|
||||
<string name="manage_favorites">أدر المفضلة</string>
|
||||
<string name="go_to_favorite">اذهب الى المفضلة</string>
|
||||
<string name="favorites_activity_placeholder">يمكنك إضافة المجلدات المستخدمة بشكل متكرر إلى المفضلة لسهولة الوصول إليها من أي مكان.</string>
|
||||
<string name="file_editor">محرر الملفات</string>
|
||||
<string name="file_editor">محرّر الملفات</string>
|
||||
<string name="storage_analysis">تحليل التخزين</string>
|
||||
<string name="images">الصور</string>
|
||||
<string name="videos">الفيديوهات</string>
|
||||
<string name="archives">الأرشيف</string>
|
||||
<string name="others">الاخرين</string>
|
||||
<string name="others">الآخرين</string>
|
||||
<string name="total_storage">إجمالي مساحة التخزين: %s</string>
|
||||
<string name="enable_root_access">تفعيل الدخول الى مسار الروت</string>
|
||||
<string name="press_back_twice">تتطلب الضغط على رجوع مرتين لمغادرة التطبيق</string>
|
||||
<string name="enable_root_access">فعّل وصول الجذر (root)</string>
|
||||
<string name="press_back_twice">يتطلب النقر على رجوع مرتين لمغادرة التطبيق</string>
|
||||
<string name="audio">صوت</string>
|
||||
<string name="documents">المستندات</string>
|
||||
<string name="downloads">التنزيلات</string>
|
||||
<string name="storage_free">خالية</string>
|
||||
<string name="open_as">افتح كـ</string>
|
||||
<string name="image_file">ملف صورة</string>
|
||||
<string name="text_file">ملف نصي</string>
|
||||
<string name="audio_file">ملف صوتي</string>
|
||||
<string name="video_file">ملف فيديو</string>
|
||||
<string name="other_file">ملف آخر</string>
|
||||
</resources>
|
||||
@@ -1,2 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="audio">Audio</string>
|
||||
</resources>
|
||||
@@ -3,18 +3,18 @@
|
||||
<string name="app_launcher_name">Файлавы менеджар</string>
|
||||
<string name="press_back_again">Націсніце назад яшчэ раз, каб выйсці</string>
|
||||
<string name="go_to_home_folder">Перайдзіце ў хатнюю тэчку</string>
|
||||
<string name="set_as_home_folder">Усталяваць у якасці хатняй тэчкі</string>
|
||||
<string name="set_as_home_folder">Ўсталяваць ў якасці хатняй тэчкі</string>
|
||||
<string name="home_folder_updated">Хатняя папка абноўлена</string>
|
||||
<string name="copy_path">Капіяваць шлях у буфер абмену</string>
|
||||
<string name="copy_path">Скапіяваць шлях ў буфер абмену</string>
|
||||
<string name="path_copied">Шлях скапіяваны</string>
|
||||
<string name="select_audio_file">Выберыце аўдыяфайл</string>
|
||||
<string name="search_folder">Тэчка пошуку</string>
|
||||
<string name="rooted_device_only">Гэтая аперацыя працуе толькі на каранёвых прыладах</string>
|
||||
<string name="rooted_device_only">Гэтая каманда працуе толькі на прыладах з root-доступам</string>
|
||||
<string name="recents">Апошнія</string>
|
||||
<string name="show_recents">Паказаць апошнія</string>
|
||||
<string name="invert_colors">Інвертаваць колеры</string>
|
||||
<string name="open_as">Адкрыць як</string>
|
||||
<string name="text_file">Тэкст</string>
|
||||
<string name="text_file">Тэкставы файл</string>
|
||||
<string name="image_file">Выява</string>
|
||||
<string name="audio_file">Аўдыё</string>
|
||||
<string name="video_file">Відэа</string>
|
||||
@@ -40,8 +40,8 @@
|
||||
<string name="downloads">Спампоўкі</string>
|
||||
<string name="archives">Архівы</string>
|
||||
<string name="others">Іншае</string>
|
||||
<string name="storage_free">бясплатна</string>
|
||||
<string name="storage_free">свабодна</string>
|
||||
<string name="total_storage">Агульная памяць: %s</string>
|
||||
<string name="enable_root_access">Уключыць каранёвы доступ</string>
|
||||
<string name="enable_root_access">Ўключыць root-доступ</string>
|
||||
<string name="press_back_twice">Патрабуецца двойчы націснуць \"Назад\", каб выйсці з праграмы</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">Файлов Мениджър</string>
|
||||
<string name="app_launcher_name">Управление на файлове</string>
|
||||
<string name="press_back_again">Натиснете назад отново, за да излезете</string>
|
||||
<string name="go_to_home_folder">Към началната папка</string>
|
||||
<string name="set_as_home_folder">Задаване като начална папка</string>
|
||||
@@ -34,7 +34,7 @@
|
||||
<string name="file_editor">Файлов редактор</string>
|
||||
<string name="storage_analysis">Анализ на съхранението</string>
|
||||
<string name="images">Изображения</string>
|
||||
<string name="videos">Видеоклипове</string>
|
||||
<string name="videos">Видео</string>
|
||||
<string name="archives">Архиви</string>
|
||||
<string name="others">Други</string>
|
||||
<string name="total_storage">Общо място за съхранение: %s</string>
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="go_to_home_folder">راو و دوبلگه هووه</string>
|
||||
<string name="set_as_home_folder">سامووݩ و عونوان دوبلگه هووه</string>
|
||||
<string name="copy_path">لف گیری تور منه کیلیپ بورد</string>
|
||||
<string name="app_launcher_name">دؽوۉداری فایل</string>
|
||||
<string name="path_copied">تور لف گیری وابی</string>
|
||||
<string name="select_audio_file">فایل آرنگی ن پسند کۊنین</string>
|
||||
<string name="search_folder">پیتینیڌن دوبلگه</string>
|
||||
<string name="recents">دیندا</string>
|
||||
<string name="show_recents">نشووݩ داڌن مووردا دیندایی</string>
|
||||
<string name="invert_colors">چواسه کردن رنگا</string>
|
||||
<string name="open_as">گۊشیڌن و عونوان</string>
|
||||
<string name="text_file">فایل هؽلی</string>
|
||||
<string name="image_file">فایل شؽواتی</string>
|
||||
<string name="audio_file">فایل آرنگی</string>
|
||||
<string name="video_file">فایل ویدیویی</string>
|
||||
<string name="other_file">فایل دیری</string>
|
||||
<string name="press_back_again">سی و در زیڌن، ز نۊ دویمه وورگشتن ن بزنین</string>
|
||||
<string name="home_folder_updated">دوبلگه هووه ورۊ رسۊوی وابی</string>
|
||||
<string name="audio">دونگ</string>
|
||||
</resources>
|
||||
@@ -1,2 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="invert_colors">Tuginañ al livioù</string>
|
||||
<string name="open_as">Digeriñ evel</string>
|
||||
<string name="text_file">Restr testenn</string>
|
||||
<string name="image_file">Restr skeudenn</string>
|
||||
<string name="audio_file">Rest aodio</string>
|
||||
<string name="video_file">Restr video</string>
|
||||
<string name="other_file">Restr all</string>
|
||||
<string name="compress">Koazhañ</string>
|
||||
<string name="compress_as">Koazhañ evel</string>
|
||||
<string name="compressing">O koazhañ…</string>
|
||||
<string name="decompressing">O tigoazhañ…</string>
|
||||
<string name="decompress">Digoazhañ</string>
|
||||
<string name="decompression_successful">Digoazhet gant berzh</string>
|
||||
<string name="compression_successful">Koazhet gant berzh</string>
|
||||
<string name="compressing_failed">C\'hwitadenn war ar c\'hoazhañ</string>
|
||||
<string name="decompressing_failed">C\'hwitadenn war an digoazhañ</string>
|
||||
<string name="favorites_activity_placeholder">Gallout a rit ouzhpennañ teuliadoù arveret alies d\'ho sinedoù evit gallout mont eno adalek n\'eus forzh pelec\'h.</string>
|
||||
<string name="file_editor">Embanner restr</string>
|
||||
<string name="manage_favorites">Ardeiñ ar sinedoù</string>
|
||||
<string name="go_to_favorite">Mont d\'ar sined</string>
|
||||
<string name="images">Skeudennoù</string>
|
||||
<string name="audio">Aodio</string>
|
||||
<string name="documents">Teulioù</string>
|
||||
<string name="downloads">Pellgargadurioù</string>
|
||||
<string name="storage_analysis">Dezrann ar c\'hadaviñ</string>
|
||||
<string name="videos">Videoioù</string>
|
||||
<string name="archives">Dielloù</string>
|
||||
<string name="storage_free">dieub</string>
|
||||
<string name="others">Re all</string>
|
||||
<string name="total_storage">Kadaviñ hollek: %s</string>
|
||||
<string name="enable_root_access">Gweredekaat an haeziñ \"root\"</string>
|
||||
<string name="press_back_twice">Dav eo pouezañ War-gil div wech evit kuitaat an arload</string>
|
||||
<string name="app_launcher_name">Ardoer restroù</string>
|
||||
<string name="press_back_again">Pouezit war an afell War-gil en-dro evit kuitaat</string>
|
||||
<string name="go_to_home_folder">Mont d\'an teuliad degemer</string>
|
||||
<string name="copy_path">Eilañ an treug er golver</string>
|
||||
<string name="path_copied">Treug eilet</string>
|
||||
<string name="select_audio_file">Diuzit ur restr aodio</string>
|
||||
<string name="recents">Nevesañ</string>
|
||||
<string name="show_recents">Diskouez ar re nevesañ</string>
|
||||
<string name="set_as_home_folder">Despizañ evel teuliad degemer</string>
|
||||
<string name="home_folder_updated">Hizivaet eo bet an teuliad degemer</string>
|
||||
<string name="search_folder">Klask en teuliad</string>
|
||||
<string name="rooted_device_only">Mont a ra en-dro ar gwezhiadur-mañ war an trevnadoù rootet hepken</string>
|
||||
</resources>
|
||||
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">Gestor de fitxers</string>
|
||||
<string name="press_back_again">Premeu enrere de nou per sortir</string>
|
||||
<string name="press_back_again">Premeu enrere de nou per a sortir</string>
|
||||
<string name="go_to_home_folder">Ves a la carpeta d\'inici</string>
|
||||
<string name="set_as_home_folder">Estableix com a carpeta d\'inici</string>
|
||||
<string name="home_folder_updated">S\'ha actualitzat la carpeta d\'inici</string>
|
||||
<string name="copy_path">Copia el camí al porta-retalls</string>
|
||||
<string name="path_copied">S\'ha copiat el camí</string>
|
||||
<string name="path_copied">Ruta copiada</string>
|
||||
<string name="select_audio_file">Seleccioneu un fitxer d\'àudio</string>
|
||||
<string name="search_folder">Cerca carpeta</string>
|
||||
<string name="rooted_device_only">Aquesta operació només funciona en dispositius amb «root»</string>
|
||||
@@ -29,7 +29,7 @@
|
||||
<string name="decompressing_failed">Ha fallat la descompressió</string>
|
||||
<string name="manage_favorites">Gestiona els preferits</string>
|
||||
<string name="go_to_favorite">Ves als preferits</string>
|
||||
<string name="favorites_activity_placeholder">Podeu afegir carpetes que utilitzeu amb freqüència als preferits per accedir fàcilment des de qualsevol lloc.</string>
|
||||
<string name="favorites_activity_placeholder">Podeu afegir carpetes que utilitzeu amb freqüència als preferits per a accedir fàcilment des de qualsevol lloc.</string>
|
||||
<string name="file_editor">Editor de fitxers</string>
|
||||
<string name="storage_analysis">Anàlisi d\'emmagatzematge</string>
|
||||
<string name="images">Imatges</string>
|
||||
@@ -41,7 +41,7 @@
|
||||
<string name="storage_free">lliure</string>
|
||||
<string name="total_storage">Emmagatzematge total: %s</string>
|
||||
<string name="enable_root_access">Habilita l\'accés «root»</string>
|
||||
<string name="press_back_twice">Cal que premeu Enrere dues vegades per sortir de l\'aplicació</string>
|
||||
<string name="press_back_twice">Cal que premeu Enrere dues vegades per a sortir de l\'aplicació</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="recents">Recents</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -1,2 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="app_launcher_name">بەڕێوەبەری پەڕگە</string>
|
||||
<string name="press_back_again">بۆ دەرچوون دووبارە گەڕانەوە داگرە</string>
|
||||
<string name="recents">دوایین</string>
|
||||
<string name="open_as">کردنەوە وەک</string>
|
||||
<string name="text_file">پەڕگەی دەقی</string>
|
||||
<string name="image_file">پەڕگەی وێنەیی</string>
|
||||
<string name="audio_file">پەڕگەی دەنگی</string>
|
||||
<string name="video_file">پەڕگەی ڤیدیۆیی</string>
|
||||
<string name="other_file">پەڕگەی دیکە</string>
|
||||
<string name="compress">پەستان</string>
|
||||
<string name="decompress">شیتەڵکردنەوە</string>
|
||||
<string name="compress_as">بیپەستە وەک</string>
|
||||
<string name="compressing">دەیپەستێت…</string>
|
||||
<string name="decompressing">شیتەڵی دەکاتەوە…</string>
|
||||
<string name="compression_successful">پەستانەکە سەرکەوت</string>
|
||||
<string name="decompression_successful">شیتەڵکردنەوەکە سەرکەوت</string>
|
||||
<string name="file_editor">دەستکاریکەری پەڕگە</string>
|
||||
<string name="images">وێنەکان</string>
|
||||
<string name="videos">ڤیدیۆکان</string>
|
||||
<string name="audio">دەنگ</string>
|
||||
<string name="documents">بەڵگەنامەکان</string>
|
||||
<string name="downloads">داگیراوەکان</string>
|
||||
<string name="archives">ئەرشیفەکان</string>
|
||||
<string name="others">ئیتکە</string>
|
||||
<string name="storage_free">بەتاڵە</string>
|
||||
<string name="total_storage">سەرجەمی بیرگە: %s</string>
|
||||
</resources>
|
||||
@@ -37,7 +37,7 @@
|
||||
<string name="videos">Videa</string>
|
||||
<string name="audio">Zvuk</string>
|
||||
<string name="documents">Dokumenty</string>
|
||||
<string name="downloads">Stažené</string>
|
||||
<string name="downloads">Stahování</string>
|
||||
<string name="archives">Archivy</string>
|
||||
<string name="others">Ostatní</string>
|
||||
<string name="storage_free">volné</string>
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
<string name="go_to_home_folder">Gå til hjemmemappen</string>
|
||||
<string name="set_as_home_folder">Sæt som hjemmemappe</string>
|
||||
<string name="home_folder_updated">Hjemmemappe opdateret</string>
|
||||
<string name="copy_path">Kopier sti til udklipsholderen</string>
|
||||
<string name="copy_path">Kopiér sti til udklipsholder</string>
|
||||
<string name="path_copied">Sti kopieret</string>
|
||||
<string name="select_audio_file">Vælg en lydfil</string>
|
||||
<string name="search_folder">Søg i mappe</string>
|
||||
<string name="rooted_device_only">Denne funktion virker kun på rootede enheder</string>
|
||||
<string name="rooted_device_only">Denne handling virker kun på rootede enheder</string>
|
||||
<string name="recents">Seneste</string>
|
||||
<string name="show_recents">Vis seneste</string>
|
||||
<string name="invert_colors">Inverter farver</string>
|
||||
@@ -28,11 +28,11 @@
|
||||
<string name="decompression_successful">Dekomprimeret</string>
|
||||
<string name="compressing_failed">Komprimering mislykkedes</string>
|
||||
<string name="decompressing_failed">Dekomprimering mislykkedes</string>
|
||||
<string name="manage_favorites">Håndter favoritter</string>
|
||||
<string name="manage_favorites">Administrer favoritter</string>
|
||||
<string name="go_to_favorite">Gå til favorit</string>
|
||||
<string name="favorites_activity_placeholder">Du kan tilføje ofte benyttede mapper til favoritter, så du hurtigt kan finde dem igen.</string>
|
||||
<string name="favorites_activity_placeholder">Du kan føje ofte brugte mapper til favoritter for nem adgang overalt.</string>
|
||||
<string name="file_editor">Fileditor</string>
|
||||
<string name="storage_analysis">Lagersanalyse</string>
|
||||
<string name="storage_analysis">Lagringsanalyse</string>
|
||||
<string name="images">Billeder</string>
|
||||
<string name="videos">Videoer</string>
|
||||
<string name="audio">Lyd</string>
|
||||
@@ -42,6 +42,6 @@
|
||||
<string name="others">Andre</string>
|
||||
<string name="storage_free">fri</string>
|
||||
<string name="total_storage">Samlet lagerplads: %s</string>
|
||||
<string name="enable_root_access">Aktiver root-adgang</string>
|
||||
<string name="press_back_twice">Kræv to tryk på tilbage for at forlade appen</string>
|
||||
<string name="enable_root_access">Aktivér root-adgang</string>
|
||||
<string name="press_back_twice">Dobbelttryk på Tilbage for at afslutte appen</string>
|
||||
</resources>
|
||||
@@ -9,7 +9,7 @@
|
||||
<string name="path_copied">Η διαδρομή αντιγράφηκε</string>
|
||||
<string name="select_audio_file">Επιλέξτε ένα αρχείο ήχου</string>
|
||||
<string name="search_folder">Αναζήτηση φακέλου</string>
|
||||
<string name="rooted_device_only">Αυτό το χαρακτηριστικό λειτουργεί μόνο σε συσκευές με πρόσβαση στον ριζικό κατάλογο.</string>
|
||||
<string name="rooted_device_only">Αυτό το χαρακτηριστικό λειτουργεί μόνο σε συσκευές με πρόσβαση στον ριζικό κατάλογο</string>
|
||||
<string name="recents">Πρόσφατα</string>
|
||||
<string name="show_recents">Εμφάνιση προσφάτων</string>
|
||||
<string name="invert_colors">Αντιστροφή χρωμάτων</string>
|
||||
|
||||
@@ -1,2 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="app_launcher_name">File Manager</string>
|
||||
<string name="invert_colors">Invert colours</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="press_back_again">Press back again to exit</string>
|
||||
<string name="go_to_home_folder">Go to home folder</string>
|
||||
<string name="set_as_home_folder">Set as home folder</string>
|
||||
</resources>
|
||||
@@ -18,9 +18,30 @@
|
||||
<string name="decompressing_failed">Maldensigo malsukcesis</string>
|
||||
<string name="file_editor">Dosierredaktilo</string>
|
||||
<string name="images">Bildoj</string>
|
||||
<string name="videos">Filmoj</string>
|
||||
<string name="audio">Sonoj</string>
|
||||
<string name="videos">Filmetoj</string>
|
||||
<string name="audio">Sono</string>
|
||||
<string name="documents">Dokumentoj</string>
|
||||
<string name="downloads">Elŝutoj</string>
|
||||
<string name="others">Aliaj</string>
|
||||
<string name="select_audio_file">Bonvolu elekti sondosieron</string>
|
||||
<string name="invert_colors">Inversigi kolorojn</string>
|
||||
<string name="manage_favorites">Administri plej ŝatatajn</string>
|
||||
<string name="go_to_favorite">Iri al plej ŝatata</string>
|
||||
<string name="favorites_activity_placeholder">Vi povas aldoni ofte uzatajn dosierujojn al viaj plej ŝatataj por facile atingi ilin el ie ajn.</string>
|
||||
<string name="archives">Arkivoj</string>
|
||||
<string name="storage_free">libera</string>
|
||||
<string name="total_storage">Tuta memoro: %s</string>
|
||||
<string name="enable_root_access">Ŝalti ĉefuzantajn permesojn</string>
|
||||
<string name="press_back_again">Premu la revenobutonon denove por eliri</string>
|
||||
<string name="go_to_home_folder">Iri al la hejma dosierujo</string>
|
||||
<string name="set_as_home_folder">Difini kiel hejma dosierujo</string>
|
||||
<string name="home_folder_updated">Hejma dosierujo ĝisdatigita</string>
|
||||
<string name="copy_path">Kopii vojon al la tondujo</string>
|
||||
<string name="path_copied">Vojo kopiita</string>
|
||||
<string name="search_folder">Serĉi dosierujon</string>
|
||||
<string name="rooted_device_only">Ĉi tiu operacio funkcias nur sur aparatoj root-itaj</string>
|
||||
<string name="recents">Lastaj</string>
|
||||
<string name="show_recents">Montri lastajn</string>
|
||||
<string name="storage_analysis">Memora analizo</string>
|
||||
<string name="press_back_twice">Postuli premi la revenobutonon du fojojn por eliri el la aplikaĵo</string>
|
||||
</resources>
|
||||
@@ -1,2 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="app_launcher_name">Gestor de archivos</string>
|
||||
<string name="press_back_again">Presione hacia atrás nuevamente para salir</string>
|
||||
<string name="go_to_home_folder">Ir a la carpeta de inicio</string>
|
||||
</resources>
|
||||
@@ -9,7 +9,7 @@
|
||||
<string name="downloads">Deskargak</string>
|
||||
<string name="others">Bestelakoak</string>
|
||||
<string name="enable_root_access">Gaitu root sarbidea</string>
|
||||
<string name="press_back_twice">Eskatu Atzera bi aldiz sakatu aplikaziotik irteteko</string>
|
||||
<string name="press_back_twice">Sakatu Atzera bi aldiz sakatu aplikaziotik irteteko</string>
|
||||
<string name="image_file">Irudi-fitxategia</string>
|
||||
<string name="audio_file">Audio-fitxategia</string>
|
||||
<string name="compression_successful">Trinkotzea behar bezala burutu da</string>
|
||||
@@ -20,7 +20,7 @@
|
||||
<string name="path_copied">Bidea kopiatu da</string>
|
||||
<string name="select_audio_file">Hautatu audio-fitxategi bat</string>
|
||||
<string name="search_folder">Bilatu karpeta</string>
|
||||
<string name="rooted_device_only">Eragiketa honek ruteatutako gailuetan bakarrik funtzionatzen du</string>
|
||||
<string name="rooted_device_only">Eragiketa honek rooteatutako gailuetan bakarrik funtzionatzen du</string>
|
||||
<string name="recents">Azkenak</string>
|
||||
<string name="show_recents">Erakutsi azkenak</string>
|
||||
<string name="invert_colors">Alderantzikatu koloreak</string>
|
||||
@@ -44,4 +44,4 @@
|
||||
<string name="set_as_home_folder">Ezarri hasierako karpeta gisa</string>
|
||||
<string name="home_folder_updated">Hasierako karpeta eguneratu da</string>
|
||||
<string name="copy_path">Kopiatu bidea arbelean</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -1,5 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="images">تصاویر</string>
|
||||
<string name="audio">صدا</string>
|
||||
</resources>
|
||||
<string name="audio">صوت</string>
|
||||
<string name="app_launcher_name">مدیریت فایل ها</string>
|
||||
<string name="press_back_again">برای خروج دوباره بازگشت را بزنید</string>
|
||||
<string name="go_to_home_folder">رفتن به پوشهٔ خانه</string>
|
||||
<string name="set_as_home_folder">تنظیم به عنوان پوشهٔ خانه</string>
|
||||
<string name="home_folder_updated">پوشهٔ خانه بهروزرسانی شد</string>
|
||||
<string name="copy_path">رونوشت مسیر در کلیپبورد</string>
|
||||
<string name="path_copied">مسیر رونوشت شد</string>
|
||||
<string name="select_audio_file">لطفاً یک پرونده صوتی انتخاب کنید</string>
|
||||
<string name="search_folder">جستوجوی پوشه</string>
|
||||
<string name="rooted_device_only">این عملیات فقط روی دستگاههای روتشده کار میکند</string>
|
||||
<string name="recents">موارد اخیر</string>
|
||||
<string name="show_recents">نمایش موارد اخیر</string>
|
||||
<string name="invert_colors">وارون کردن رنگها</string>
|
||||
<string name="open_as">باز کردن به عنوان</string>
|
||||
<string name="text_file">پرونده متنی</string>
|
||||
<string name="image_file">پرونده تصویری</string>
|
||||
<string name="audio_file">پرونده صوتی</string>
|
||||
<string name="video_file">پرونده ویدیویی</string>
|
||||
<string name="other_file">پرونده دیگر</string>
|
||||
<string name="compress">فشردهسازی</string>
|
||||
<string name="decompress">خارجسازی از حالت فشرده</string>
|
||||
<string name="compress_as">فشردهسازی به عنوان</string>
|
||||
<string name="compressing">در حال فشردهسازی…</string>
|
||||
<string name="decompressing">در حال خارجسازی از حالت فشرده…</string>
|
||||
<string name="compression_successful">فشردهسازی موفقیتآمیز بود</string>
|
||||
<string name="decompression_successful">خارجسازی از حالت فشرده موفقیتآمیز بود</string>
|
||||
<string name="compressing_failed">فشردهسازی ناموفق بود</string>
|
||||
<string name="decompressing_failed">خارجسازی از حالت فشرده ناموفق بود</string>
|
||||
<string name="manage_favorites">مدیریت علاقهمندیها</string>
|
||||
<string name="go_to_favorite">رفتن به علاقهمندی</string>
|
||||
<string name="favorites_activity_placeholder">میتوانید پوشههای پرکاربرد را برای دسترسی آسان از هر جا به علاقهمندیها اضافه کنید.</string>
|
||||
<string name="file_editor">ویرایشگر پرونده</string>
|
||||
<string name="storage_analysis">تحلیل فضای ذخیرهسازی</string>
|
||||
<string name="videos">ویدیوها</string>
|
||||
<string name="documents">اسناد</string>
|
||||
<string name="downloads">دانلودها</string>
|
||||
<string name="archives">آرشیوها</string>
|
||||
<string name="others">سایر</string>
|
||||
<string name="storage_free">آزاد</string>
|
||||
<string name="total_storage">کل فضای ذخیرهسازی: %s</string>
|
||||
<string name="enable_root_access">فعالسازی دسترسی روت</string>
|
||||
<string name="press_back_twice">برای خروج از برنامه، دو بار دکمهٔ بازگشت را بزنید</string>
|
||||
</resources>
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="downloads">Lataukset</string>
|
||||
<string name="archives">Arkistot</string>
|
||||
<string name="others">Muut</string>
|
||||
<string name="storage_free">ilmainen</string>
|
||||
<string name="storage_free">vapaana</string>
|
||||
<string name="total_storage">Tallennustila: %s</string>
|
||||
<string name="enable_root_access">Ota käyttöön root-ominaisuudet</string>
|
||||
<string name="press_back_twice">Ota käyttöön sovelluksesta poistuminen kahdella takaisin-painikkeen painalluksella</string>
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
<string name="decompressing">Décompression…</string>
|
||||
<string name="compression_successful">Compression réussie</string>
|
||||
<string name="decompression_successful">Décompression réussie</string>
|
||||
<string name="compressing_failed">Compression ratée</string>
|
||||
<string name="decompressing_failed">Décompression ratée</string>
|
||||
<string name="compressing_failed">Échec de la compression</string>
|
||||
<string name="decompressing_failed">Échec de la décompression</string>
|
||||
<string name="manage_favorites">Gérer les favoris</string>
|
||||
<string name="go_to_favorite">Aller au favori</string>
|
||||
<string name="favorites_activity_placeholder">Vous pouvez ajouter des dossiers souvent utilisés comme favoris pour y avoir accès rapidement depuis n\'importe où.</string>
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">Bainisteoir Comhad</string>
|
||||
<string name="go_to_home_folder">Téigh go dtí an fillteán baile</string>
|
||||
<string name="home_folder_updated">Nuashonraíodh an fillteán baile</string>
|
||||
<string name="copy_path">Cóipeáil cosán chuig an ngearrthaisce</string>
|
||||
<string name="path_copied">Cóipeáladh an cosán</string>
|
||||
<string name="invert_colors">Inbhéartaigh dathanna</string>
|
||||
<string name="open_as">Oscail mar</string>
|
||||
<string name="video_file">Comhad físe</string>
|
||||
<string name="other_file">Comhad eile</string>
|
||||
<string name="compress">Comhbhrúigh</string>
|
||||
<string name="compress_as">Comhbhrúigh mar</string>
|
||||
<string name="decompressing">Ag dí-chomhbhrú…</string>
|
||||
<string name="decompression_successful">Dí-chomhbhrú rathúil</string>
|
||||
<string name="compressing_failed">Theip ar chomhbhrú</string>
|
||||
<string name="go_to_favorite">Téigh go dtí is fearr leat</string>
|
||||
<string name="file_editor">Eagarthóir Comhad</string>
|
||||
<string name="storage_analysis">Anailís stórála</string>
|
||||
<string name="images">Íomhánna</string>
|
||||
<string name="downloads">Íoslódálacha</string>
|
||||
<string name="archives">Cartlanna</string>
|
||||
<string name="others">Eile</string>
|
||||
<string name="storage_free">saor</string>
|
||||
<string name="total_storage">Stóras iomlán: %s</string>
|
||||
<string name="enable_root_access">Cumasaigh rochtain fréimhe</string>
|
||||
<string name="press_back_twice">A cheangal ar an cnaipe Ar ais faoi dhó a fhágáil ar an aip</string>
|
||||
<string name="press_back_again">Brúigh ar ais arís chun imeacht</string>
|
||||
<string name="select_audio_file">Roghnaigh comhad fuaime</string>
|
||||
<string name="search_folder">Cuardach fillteán</string>
|
||||
<string name="recents">Le déanaí</string>
|
||||
<string name="show_recents">Taispeáin nuashonruithe</string>
|
||||
<string name="set_as_home_folder">Socraigh mar fhillteán baile</string>
|
||||
<string name="image_file">Comhad íomhá</string>
|
||||
<string name="audio_file">Comhad fuaime</string>
|
||||
<string name="rooted_device_only">Ní oibríonn an oibríocht seo ach ar fheistí fréamhaithe</string>
|
||||
<string name="text_file">Comhad téacs</string>
|
||||
<string name="decompress">Dí-chomhbhrú</string>
|
||||
<string name="compressing">Ag comhbhrúite…</string>
|
||||
<string name="favorites_activity_placeholder">Is féidir leat fillteáin a úsáidtear go minic a chur le ceanáin ar mhaithe le rochtain éasca ó áit ar bith.</string>
|
||||
<string name="videos">Físeáin</string>
|
||||
<string name="documents">Doiciméid</string>
|
||||
<string name="compression_successful">Comhbhrú rathúil</string>
|
||||
<string name="decompressing_failed">Theip ar dhí-chomhbhrú</string>
|
||||
<string name="manage_favorites">Theip ar an dí-chomhbhrú</string>
|
||||
<string name="audio">Fuaime</string>
|
||||
</resources>
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">Xestor de ficheiros</string>
|
||||
<string name="press_back_again">Preme novamente para saír</string>
|
||||
<string name="go_to_home_folder">Ir para o cartafol persoal</string>
|
||||
<string name="set_as_home_folder">Poñer como predeterminado este cartafol persoal</string>
|
||||
<string name="home_folder_updated">Cartafol persoal actualizado</string>
|
||||
<string name="copy_path">Copiar ruta para a área de transferencia</string>
|
||||
<string name="app_launcher_name">Ficheiros</string>
|
||||
<string name="press_back_again">Preme outra vez para saír</string>
|
||||
<string name="go_to_home_folder">Ir ao cartafol de inicio</string>
|
||||
<string name="set_as_home_folder">Establecer como cartafol de inicio</string>
|
||||
<string name="home_folder_updated">Cartafol de inicio actualizado</string>
|
||||
<string name="copy_path">Copiar ruta ao portapapeis</string>
|
||||
<string name="path_copied">Copiouse a ruta</string>
|
||||
<string name="select_audio_file">Seleccione un ficheiro de audio</string>
|
||||
<string name="search_folder">Buscar cartafol</string>
|
||||
@@ -17,7 +17,7 @@
|
||||
<string name="text_file">Texto</string>
|
||||
<string name="image_file">Imaxe</string>
|
||||
<string name="video_file">Vídeo</string>
|
||||
<string name="other_file">Outro tipo de ficheiro</string>
|
||||
<string name="other_file">Outros ficheiros</string>
|
||||
<string name="compress">Comprimir</string>
|
||||
<string name="decompress">Descomprimir</string>
|
||||
<string name="compress_as">Comprimir como</string>
|
||||
@@ -31,17 +31,17 @@
|
||||
<string name="go_to_favorite">Ir a favorito</string>
|
||||
<string name="favorites_activity_placeholder">Pode adiccionar cartafoles como favoritos para un acesso mais rápido.</string>
|
||||
<string name="file_editor">Editor de ficheiros</string>
|
||||
<string name="storage_analysis">Análise do almacenamento</string>
|
||||
<string name="storage_analysis">Análise da almacenaxe</string>
|
||||
<string name="images">Imaxes</string>
|
||||
<string name="videos">Vídeos</string>
|
||||
<string name="archives">Arquivos</string>
|
||||
<string name="others">Outros</string>
|
||||
<string name="storage_free">ceibe</string>
|
||||
<string name="total_storage">Almacenamento total: %s</string>
|
||||
<string name="storage_free">libre</string>
|
||||
<string name="total_storage">Almacenaxe total: %s</string>
|
||||
<string name="enable_root_access">Activar acceso root</string>
|
||||
<string name="press_back_twice">Require premer Atrás dúas veces para saír da aplicación</string>
|
||||
<string name="audio_file">Ficheiro de audio</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documentos</string>
|
||||
<string name="downloads">Descargas</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -3,14 +3,14 @@
|
||||
<string name="app_launcher_name">Fájlkezelő</string>
|
||||
<string name="press_back_again">A kilépéshez nyomja meg újra a vissza gombot</string>
|
||||
<string name="go_to_home_folder">Ugrás a kezdőmappára</string>
|
||||
<string name="set_as_home_folder">Beállítás kezdőmappának</string>
|
||||
<string name="home_folder_updated">Kezdőmappa frissítve</string>
|
||||
<string name="set_as_home_folder">Beállítás főmappaként</string>
|
||||
<string name="home_folder_updated">Főmappa frissítve</string>
|
||||
<string name="copy_path">Útvonal vágólapra másolása</string>
|
||||
<string name="path_copied">Útvonal másolva</string>
|
||||
<string name="select_audio_file">Válasszon egy hangfájlt</string>
|
||||
<string name="select_audio_file">Kérem, válasszon egy hangfájlt</string>
|
||||
<string name="search_folder">Mappa keresése</string>
|
||||
<string name="rooted_device_only">Ez a művelet csak root jogosultságot támogató eszközökön működik</string>
|
||||
<string name="recents">Frissek</string>
|
||||
<string name="rooted_device_only">Ez a művelet csak root-olt eszközökön működik</string>
|
||||
<string name="recents">Legutóbbiak</string>
|
||||
<string name="show_recents">Frissek megjelenítése</string>
|
||||
<string name="invert_colors">Színek invertálása</string>
|
||||
<string name="open_as">Megnyitás másként</string>
|
||||
@@ -44,4 +44,4 @@
|
||||
<string name="total_storage">Összes tárhely: %s</string>
|
||||
<string name="enable_root_access">Root hozzáférés engedélyezése</string>
|
||||
<string name="press_back_twice">A Vissza gombot kétszer kelljen megnyomni az alkalmazásból történő kilépéshez</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -28,5 +28,5 @@
|
||||
<string name="go_to_favorite">Vader al favoritos</string>
|
||||
<string name="total_storage">Immagazinage total: %s</string>
|
||||
<string name="path_copied">Percurso copiate</string>
|
||||
<string name="select_audio_file">Selige un file de audio</string>
|
||||
<string name="select_audio_file">Selectionar un file de audio</string>
|
||||
</resources>
|
||||
@@ -6,18 +6,18 @@
|
||||
<string name="home_folder_updated">Folder beranda diperbarui</string>
|
||||
<string name="copy_path">Salin jalur ke papan klip</string>
|
||||
<string name="path_copied">Jalur disalin</string>
|
||||
<string name="select_audio_file">Silakan pilih berkas audio</string>
|
||||
<string name="select_audio_file">Silakan pilih file audio</string>
|
||||
<string name="search_folder">Cari folder</string>
|
||||
<string name="rooted_device_only">Tindakan ini hanya bekerja pada perangkat dengan akses root</string>
|
||||
<string name="recents">Terkini</string>
|
||||
<string name="show_recents">Tampilkan terkini</string>
|
||||
<string name="invert_colors">Invers warna</string>
|
||||
<string name="open_as">Buka sebagai</string>
|
||||
<string name="text_file">Berkas teks</string>
|
||||
<string name="image_file">Berkas gambar</string>
|
||||
<string name="audio_file">Berkas audio</string>
|
||||
<string name="video_file">Berkas video</string>
|
||||
<string name="other_file">Berkas lainnya</string>
|
||||
<string name="text_file">File teks</string>
|
||||
<string name="image_file">File gambar</string>
|
||||
<string name="audio_file">File audio</string>
|
||||
<string name="video_file">File video</string>
|
||||
<string name="other_file">File lainnya</string>
|
||||
<string name="compress">Kompres</string>
|
||||
<string name="decompress">Dekompres</string>
|
||||
<string name="compress_as">Kompres sebagai</string>
|
||||
@@ -30,7 +30,7 @@
|
||||
<string name="manage_favorites">Kelola favorit</string>
|
||||
<string name="go_to_favorite">Buka favorit</string>
|
||||
<string name="favorites_activity_placeholder">Anda bisa menambahkan folder yang sering digunakan ke favorit untuk kemudahan akses dari mana saja.</string>
|
||||
<string name="file_editor">Penyunting Berkas</string>
|
||||
<string name="file_editor">Penyunting File</string>
|
||||
<string name="storage_analysis">Analisis penyimpanan</string>
|
||||
<string name="images">Gambar</string>
|
||||
<string name="videos">Video</string>
|
||||
@@ -39,4 +39,9 @@
|
||||
<string name="total_storage">Total penyimpanan: %s</string>
|
||||
<string name="enable_root_access">Aktifkan akses root</string>
|
||||
<string name="press_back_twice">Wajib tekan tombol kembali dua kali untuk keluar aplikasi</string>
|
||||
</resources>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Dokumen</string>
|
||||
<string name="app_launcher_name">Pengelola File</string>
|
||||
<string name="downloads">Unduhan</string>
|
||||
<string name="storage_free">bebas</string>
|
||||
</resources>
|
||||
@@ -36,7 +36,7 @@
|
||||
<string name="images">Immagini</string>
|
||||
<string name="videos">Video</string>
|
||||
<string name="documents">Documenti</string>
|
||||
<string name="downloads">Scaricamenti</string>
|
||||
<string name="downloads">Scaricati</string>
|
||||
<string name="archives">Archivi</string>
|
||||
<string name="others">Altri</string>
|
||||
<string name="storage_free">libero</string>
|
||||
@@ -44,4 +44,4 @@
|
||||
<string name="enable_root_access">Abilita accesso root</string>
|
||||
<string name="press_back_twice">Richiedi di premere Indietro due volte per uscire dall\'app</string>
|
||||
<string name="audio">Audio</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -1,17 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">מנהל קבצים</string>
|
||||
<string name="press_back_again">לחץ שוב אחורה כדי לצאת</string>
|
||||
<string name="go_to_home_folder">עבור לתיקיית הבית</string>
|
||||
<string name="app_launcher_name">מנהל הקבצים</string>
|
||||
<string name="press_back_again">ליציאה יש ללחוץ אחורה פעם נוספת</string>
|
||||
<string name="go_to_home_folder">מעבר לתיקיית הבית</string>
|
||||
<string name="set_as_home_folder">הגדר כתיקיית בית</string>
|
||||
<string name="home_folder_updated">תיקיית הבית עודכנה</string>
|
||||
<string name="copy_path">העתק נתיב ללוח</string>
|
||||
<string name="path_copied">הנתיב הועתק</string>
|
||||
<string name="select_audio_file">אנא בחר קובץ שמע</string>
|
||||
<string name="search_folder">חיפוש תיקייה</string>
|
||||
<string name="rooted_device_only">פעולה זו פועלת רק במכשירים עם רוט</string>
|
||||
<string name="rooted_device_only">פעולה זו עובדת רק במכשירים עם רוט</string>
|
||||
<string name="recents">אחרונים</string>
|
||||
<string name="show_recents">הצג את האחרונים</string>
|
||||
<string name="show_recents">הצג אחרונים</string>
|
||||
<string name="invert_colors">הפוך צבעים</string>
|
||||
<string name="open_as">פתח כ</string>
|
||||
<string name="text_file">קובץ טקסט</string>
|
||||
@@ -19,29 +19,29 @@
|
||||
<string name="audio_file">קובץ שמע</string>
|
||||
<string name="video_file">קובץ וידיאו</string>
|
||||
<string name="other_file">קובץ אחר</string>
|
||||
<string name="compress">לדחוס</string>
|
||||
<string name="decompress">לבטל דחיסה</string>
|
||||
<string name="compress_as">דחוס כ</string>
|
||||
<string name="compress">דחיסה</string>
|
||||
<string name="decompress">חילוץ</string>
|
||||
<string name="compress_as">דחיסה כ</string>
|
||||
<string name="compressing">דוחס…</string>
|
||||
<string name="decompressing">משחרר דחיסה…</string>
|
||||
<string name="decompressing">מחלץ…</string>
|
||||
<string name="compression_successful">הדחיסה הצליחה</string>
|
||||
<string name="decompression_successful">שחרור הדחיסה הצליח</string>
|
||||
<string name="decompression_successful">החילוץ הצליח</string>
|
||||
<string name="compressing_failed">הדחיסה נכשלה</string>
|
||||
<string name="decompressing_failed">פעולת שחרור הדחיסה נכשל</string>
|
||||
<string name="decompressing_failed">החילוץ נכשל</string>
|
||||
<string name="manage_favorites">נהל מועדפים</string>
|
||||
<string name="go_to_favorite">עבור למועדפים</string>
|
||||
<string name="favorites_activity_placeholder">אתה יכול להוסיף תיקיות בשימוש תכוף למועדפים לגישה נוחה מכל מקום.</string>
|
||||
<string name="favorites_activity_placeholder">באפשרותך להוסיף תיקיות בשימוש תכוף למועדפים לגישה נוחה מכל מקום.</string>
|
||||
<string name="file_editor">עורך הקבצים</string>
|
||||
<string name="storage_analysis">ניתוח אחסון</string>
|
||||
<string name="images">תמונות</string>
|
||||
<string name="videos">וידיאו</string>
|
||||
<string name="videos">סרטונים</string>
|
||||
<string name="audio">שמע</string>
|
||||
<string name="documents">מסמכים</string>
|
||||
<string name="downloads">הורדות</string>
|
||||
<string name="archives">ארכיון</string>
|
||||
<string name="archives">ארכיונים</string>
|
||||
<string name="others">אחרים</string>
|
||||
<string name="storage_free">חינם</string>
|
||||
<string name="storage_free">חופשי</string>
|
||||
<string name="total_storage">שטח אחסון כולל: %s</string>
|
||||
<string name="enable_root_access">אפשר גישת שורש</string>
|
||||
<string name="press_back_twice">דרוש לחיצה על חזרה פעמיים כדי לצאת מהאפליקציה דרוש לחיצה על חזרה פעמיים כדי לצאת מהאפליקציה</string>
|
||||
<string name="press_back_twice">דרישת לחיצה כפולה על כפתור אחורה כדי לצאת מהאפליקציה</string>
|
||||
</resources>
|
||||
@@ -35,7 +35,7 @@
|
||||
<string name="storage_analysis">ストレージ解析</string>
|
||||
<string name="images">画像</string>
|
||||
<string name="videos">動画</string>
|
||||
<string name="audio">オーディオ</string>
|
||||
<string name="audio">音声</string>
|
||||
<string name="documents">ドキュメント</string>
|
||||
<string name="downloads">ダウンロード</string>
|
||||
<string name="archives">アーカイブ</string>
|
||||
@@ -44,4 +44,4 @@
|
||||
<string name="total_storage">合計ストレージ: %s</string>
|
||||
<string name="enable_root_access">ルートアクセスを有効にする</string>
|
||||
<string name="press_back_twice">戻るボタンを2回押してアプリを閉じる</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="images">Tugniwin</string>
|
||||
<string name="videos">Tividyutin</string>
|
||||
<string name="audio">Imesli</string>
|
||||
<string name="documents">Isemliyen</string>
|
||||
<string name="downloads">Isidar</string>
|
||||
<string name="archives">Iɣbaren</string>
|
||||
<string name="others">Wiyyaḍ</string>
|
||||
<string name="storage_free">i d-yeqqimen</string>
|
||||
<string name="app_launcher_name">Amsefrak n ifuyla</string>
|
||||
<string name="compress">Tussda</string>
|
||||
<string name="open_as">Ldi am</string>
|
||||
<string name="text_file">Afaylu aḍris</string>
|
||||
<string name="image_file">Afaylu n tugna</string>
|
||||
<string name="audio_file">Afaylu n imesli</string>
|
||||
<string name="video_file">Ifuyla n uvidyu</string>
|
||||
<string name="other_file">Afaylu nniḍen</string>
|
||||
<string name="compress_as">Ssed am</string>
|
||||
<string name="recents">N melmi kan</string>
|
||||
<string name="file_editor">Amaẓrag n ufaylu</string>
|
||||
<string name="go_to_home_folder">Ddu ar ukaram agejdan</string>
|
||||
<string name="home_folder_updated">Akaram agejdan yettwalqem</string>
|
||||
<string name="copy_path">Nɣel abrid ɣer tecfawt</string>
|
||||
<string name="search_folder">Nadi akaram</string>
|
||||
<string name="rooted_device_only">Tamhelt-a tetteddu kan deg yibenkan iẓaranen</string>
|
||||
<string name="show_recents">Sken ineggura</string>
|
||||
<string name="compressing">Asekkussem…</string>
|
||||
<string name="compression_successful">Asekkussem yedda akken iwata</string>
|
||||
<string name="decompression_successful">Tukksa n usekkusem tedda akken iwata</string>
|
||||
<string name="compressing_failed">Asekkussem ur yedda ara</string>
|
||||
<string name="favorites_activity_placeholder">Tzemreḍ ad ternuḍ ikaramen yettwasqedcen s waṭas ɣer unurifen i unekcum s wudem fessusen seg yal amḍiq.</string>
|
||||
<string name="storage_analysis">Aslaḍ n tkatut</string>
|
||||
<string name="decompress">Ssef</string>
|
||||
<string name="press_back_again">Sit tikkelt-nniḍen akken ad teffɣeḍ</string>
|
||||
<string name="set_as_home_folder">Sbadu d akaram agejdan</string>
|
||||
<string name="path_copied">Abrid yettwanɣel</string>
|
||||
<string name="select_audio_file">Ma ulac aɣilif, fren afaylu ameslaw</string>
|
||||
<string name="invert_colors">Tti initen</string>
|
||||
<string name="decompressing">Tukksa n usekkussem…</string>
|
||||
<string name="decompressing_failed">Tuccḍa deg tukksa n usekkussem</string>
|
||||
<string name="manage_favorites">Sefrek inurifen</string>
|
||||
<string name="go_to_favorite">Ddu ɣer unurif</string>
|
||||
<string name="total_storage">Amḍiq n usekles amatu: %s</string>
|
||||
<string name="enable_root_access">Rmed anekcum ɣer uẓar</string>
|
||||
<string name="press_back_twice">Yessefk ad tsiteḍ snat n tikkal akken ad teffɣeḍ seg usnas</string>
|
||||
</resources>
|
||||
@@ -1,13 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">파일 매니저</string>
|
||||
<string name="press_back_again">뒤로가기 버튼을 다시 누르면 종료됩니다.</string>
|
||||
<string name="press_back_again">뒤로가기 버튼을 다시 누르면 종료됩니다</string>
|
||||
<string name="go_to_home_folder">홈 폴더 이동</string>
|
||||
<string name="set_as_home_folder">홈 폴더 설정</string>
|
||||
<string name="home_folder_updated">홈 폴더 설정완료</string>
|
||||
<string name="copy_path">클립보드에 경로 복사</string>
|
||||
<string name="path_copied">클립보드에 복사됨</string>
|
||||
<string name="select_audio_file">오디도 파일을 선택하세요.</string>
|
||||
<string name="select_audio_file">오디도 파일을 선택하세요</string>
|
||||
<string name="search_folder">폴더 및 파일검색</string>
|
||||
<string name="compress">압축</string>
|
||||
<string name="decompress">압축 해제</string>
|
||||
@@ -23,4 +23,25 @@
|
||||
<string name="favorites_activity_placeholder">자주 사용하는 폴더를 즐겨찾기에 추가하여 어디서나 쉽게 접근 할 수 있습니다.</string>
|
||||
<string name="file_editor">텍스트 편집기</string>
|
||||
<string name="enable_root_access">루트 접근 활성화</string>
|
||||
<string name="images">사진</string>
|
||||
<string name="videos">동영상</string>
|
||||
<string name="invert_colors">색상 반전</string>
|
||||
<string name="image_file">사진 파일</string>
|
||||
<string name="audio_file">오디오 파일</string>
|
||||
<string name="open_as">다음으로 열기</string>
|
||||
<string name="text_file">텍스트 파일</string>
|
||||
<string name="video_file">비디오 파일</string>
|
||||
<string name="other_file">기타 파일</string>
|
||||
<string name="total_storage">전체 저장공간: %s</string>
|
||||
<string name="audio">오디오</string>
|
||||
<string name="storage_analysis">저장공간 분석</string>
|
||||
<string name="documents">문서</string>
|
||||
<string name="downloads">다운로드</string>
|
||||
<string name="archives">아카이브</string>
|
||||
<string name="others">기타</string>
|
||||
<string name="press_back_twice">뒤로 가기 버튼을 두 번 눌러 앱을 종료</string>
|
||||
<string name="rooted_device_only">이 작업은 루팅된 기기에서만 작동합니다</string>
|
||||
<string name="recents">최근 파일</string>
|
||||
<string name="show_recents">최근 파일 보기</string>
|
||||
<string name="storage_free">여유 공간</string>
|
||||
</resources>
|
||||
@@ -1,14 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">Failų tvarkytuvė</string>
|
||||
<string name="press_back_again">Paspauskite atgal dar kartą, norėdami išeiti</string>
|
||||
<string name="press_back_again">Dar kartą paspauskite atgal, kad išeitumėte</string>
|
||||
<string name="copy_path">Kopijuoti kelią į iškarpinę</string>
|
||||
<string name="path_copied">Kelias nukopijuotas</string>
|
||||
<string name="select_audio_file">Pasirinkite garso įrašo failą</string>
|
||||
<string name="search_folder">Ieškoti aplanke</string>
|
||||
<string name="search_folder">Ieškoti aplanką</string>
|
||||
<string name="open_as">Atverti kaip</string>
|
||||
<string name="text_file">Tekstinis failas</string>
|
||||
<string name="image_file">Paveikslo failas</string>
|
||||
<string name="image_file">Vaizdo failas</string>
|
||||
<string name="audio_file">Garso įrašo failas</string>
|
||||
<string name="video_file">Vaizdo įrašo failas</string>
|
||||
<string name="other_file">Kitas failas</string>
|
||||
@@ -19,16 +19,29 @@
|
||||
<string name="decompressing">Išskleidžiama…</string>
|
||||
<string name="compression_successful">Glaudinimas sėkmingas</string>
|
||||
<string name="decompression_successful">Išskleidimas sėkmingas</string>
|
||||
<string name="compressing_failed">Nepavyko glaudinti</string>
|
||||
<string name="decompressing_failed">Nepavyko išskleisti</string>
|
||||
<string name="file_editor">Failų redaktorius</string>
|
||||
<string name="compressing_failed">Glaudinimas nepavyko.</string>
|
||||
<string name="decompressing_failed">Išskleidimas nepavyko.</string>
|
||||
<string name="file_editor">Failų rengyklė</string>
|
||||
<string name="storage_analysis">Saugyklos analizė</string>
|
||||
<string name="images">Paveikslai</string>
|
||||
<string name="images">Vaizdai</string>
|
||||
<string name="videos">Vaizdo įrašai</string>
|
||||
<string name="audio">Garso įrašai</string>
|
||||
<string name="documents">Dokumentai</string>
|
||||
<string name="downloads">Atsiuntimai</string>
|
||||
<string name="downloads">Atsisiuntimai</string>
|
||||
<string name="archives">Archyvai</string>
|
||||
<string name="others">Kiti</string>
|
||||
<string name="storage_free">laisva</string>
|
||||
<string name="enable_root_access">Įjungti pagrindinį prieigą</string>
|
||||
<string name="total_storage">Bendra saugykla: %s</string>
|
||||
<string name="invert_colors">Invertuoti spalvas</string>
|
||||
<string name="rooted_device_only">Ši operacija veikia tik pagrindiniuose įrenginiuose.</string>
|
||||
<string name="recents">Naujausiai</string>
|
||||
<string name="show_recents">Rodyti naujausių</string>
|
||||
<string name="press_back_twice">Reikalauti dukart paspausti „Atgal“, kad palikti programėlę</string>
|
||||
<string name="manage_favorites">Tvarkyti mėgstamus</string>
|
||||
<string name="go_to_favorite">Eiti į mėgstamą</string>
|
||||
<string name="favorites_activity_placeholder">Dažnai naudojamus aplankus galite pridėti prie mėgstamų, kad juos būtų lengva pasiekti iš bet kur.</string>
|
||||
<string name="go_to_home_folder">Eiti į pagrindinį aplanką</string>
|
||||
<string name="set_as_home_folder">Nustatyti kaip pagrindinį aplanką</string>
|
||||
<string name="home_folder_updated">Pagrindinis aplankas atnaujintas</string>
|
||||
</resources>
|
||||
@@ -1,2 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="press_back_again">Притиснете назад уште еднаш за да излезете</string>
|
||||
<string name="app_launcher_name">Управител со датотеки</string>
|
||||
</resources>
|
||||
@@ -9,7 +9,7 @@
|
||||
<string name="path_copied">Bane kopiert</string>
|
||||
<string name="select_audio_file">Vennligst velg en lydfil</string>
|
||||
<string name="search_folder">Søk etter mappe</string>
|
||||
<string name="rooted_device_only">Denne handlingen fungerer bare på rootede enheter.</string>
|
||||
<string name="rooted_device_only">Denne handlingen fungerer bare på enheter med rot-tilgang</string>
|
||||
<string name="recents">Nylige</string>
|
||||
<string name="show_recents">Vis nylige</string>
|
||||
<string name="open_as">Åpne som</string>
|
||||
@@ -40,4 +40,8 @@
|
||||
<string name="storage_free">ledig</string>
|
||||
<string name="total_storage">Total lagring: %s</string>
|
||||
<string name="enable_root_access">Aktiver root-tilgang</string>
|
||||
<string name="invert_colors">Inverter farger</string>
|
||||
<string name="storage_analysis">Lagringsanalyse</string>
|
||||
<string name="others">Andre</string>
|
||||
<string name="press_back_twice">Trykk Tilbake to ganger for å avslutte appen</string>
|
||||
</resources>
|
||||
@@ -1,9 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_launcher_name">Bestandsbeheer</string>
|
||||
<string name="press_back_again">Druk nogmaals op terug om af te sluiten</string>
|
||||
<string name="press_back_again">Druk nogmaals op \'Terug\' om te sluiten</string>
|
||||
<string name="go_to_home_folder">Naar beginmap</string>
|
||||
<string name="set_as_home_folder">Als beginmap instellen</string>
|
||||
<string name="set_as_home_folder">Instellen als beginmap</string>
|
||||
<string name="home_folder_updated">Beginmap ingesteld</string>
|
||||
<string name="copy_path">Pad naar klembord kopiëren</string>
|
||||
<string name="path_copied">Pad gekopieerd</string>
|
||||
@@ -13,9 +13,9 @@
|
||||
<string name="recents">Recent geopend</string>
|
||||
<string name="show_recents">Recente items tonen</string>
|
||||
<string name="open_as">Openen als</string>
|
||||
<string name="text_file">Tekst</string>
|
||||
<string name="text_file">Tekstbestand</string>
|
||||
<string name="image_file">Afbeelding</string>
|
||||
<string name="audio_file">Geluid</string>
|
||||
<string name="audio_file">Geluidsbestand</string>
|
||||
<string name="video_file">Video</string>
|
||||
<string name="other_file">Overig</string>
|
||||
<string name="compress">Inpakken</string>
|
||||
@@ -33,14 +33,14 @@
|
||||
<string name="file_editor">Bewerken</string>
|
||||
<string name="storage_analysis">Opslaganalyse</string>
|
||||
<string name="images">Afbeeldingen</string>
|
||||
<string name="videos">Video</string>
|
||||
<string name="videos">Video\'s</string>
|
||||
<string name="documents">Documenten</string>
|
||||
<string name="archives">Archieven</string>
|
||||
<string name="others">Overig</string>
|
||||
<string name="storage_free">vrij</string>
|
||||
<string name="total_storage">Totale opslag: %s</string>
|
||||
<string name="enable_root_access">Root-toegang inschakelen</string>
|
||||
<string name="press_back_twice">Twee keer op de terugknop drukken om af te sluiten</string>
|
||||
<string name="press_back_twice">Twee keer op \'Terug\' drukken om de app te sluiten</string>
|
||||
<string name="audio">Geluid</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="invert_colors">Kleuren omdraaien</string>
|
||||
|
||||
@@ -1,2 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="app_launcher_name">Filbehandlar</string>
|
||||
<string name="open_as">Opne som</string>
|
||||
<string name="text_file">Tekstfil</string>
|
||||
<string name="audio">Ljod</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="search_folder">Cercar dins lo dossièr</string>
|
||||
<string name="invert_colors">Invertir las colors</string>
|
||||
<string name="images">Imatges</string>
|
||||
<string name="app_launcher_name">Gestionari de fichièrs</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Mostrar los recents</string>
|
||||
<string name="open_as">Dobrir coma</string>
|
||||
<string name="text_file">Fichièr tèxte</string>
|
||||
<string name="image_file">Fichièr imatge</string>
|
||||
<string name="audio_file">Fichièr àudio</string>
|
||||
<string name="video_file">Fichièr vidèo</string>
|
||||
<string name="other_file">Autre fichièr</string>
|
||||
<string name="decompress">Descompressar</string>
|
||||
<string name="compress_as">Compressar coma</string>
|
||||
<string name="compressing">Compression…</string>
|
||||
<string name="decompressing">Descompression…</string>
|
||||
<string name="compression_successful">Compression reüssida</string>
|
||||
<string name="go_to_favorite">Anar als favorits</string>
|
||||
<string name="file_editor">Editor de fichièrs</string>
|
||||
<string name="videos">Vidèos</string>
|
||||
<string name="audio">Àudio</string>
|
||||
<string name="downloads">Telecargaments</string>
|
||||
<string name="archives">Fichièrs</string>
|
||||
<string name="others">Autres</string>
|
||||
<string name="storage_free">disponible</string>
|
||||
<string name="total_storage">Emmagazinatge total : %s</string>
|
||||
<string name="enable_root_access">Activar l’accès root</string>
|
||||
<string name="press_back_again">Tocatz de nòu en rèire per sortir</string>
|
||||
<string name="go_to_home_folder">Anar al dossièr principal</string>
|
||||
<string name="set_as_home_folder">Definir coma dossièr principal</string>
|
||||
<string name="home_folder_updated">Dossièr per defaut actualizat</string>
|
||||
<string name="copy_path">Copiar l’emplaçament al quichapapièrs</string>
|
||||
<string name="path_copied">Emplaçament copiat</string>
|
||||
<string name="select_audio_file">Seleccionatz un fichièr àudio</string>
|
||||
<string name="compress">Compressar</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="rooted_device_only">Aquesta operacion fonciona sonque suls aparelhs rootats</string>
|
||||
<string name="decompression_successful">Descompression reüssida</string>
|
||||
<string name="compressing_failed">Fracàs de la compression</string>
|
||||
<string name="decompressing_failed">Fracàs de la descompression</string>
|
||||
<string name="manage_favorites">Gerir los favorits</string>
|
||||
<string name="storage_analysis">Analisi de l\'emmagazinatge</string>
|
||||
<string name="press_back_twice">Cal quichar dos còps la tòca Entrada per quitar l\'aplicacion</string>
|
||||
<string name="favorites_activity_placeholder">Podètz apondre los dossièrs utilizatq frequentament per i accedir de pertot.</string>
|
||||
</resources>
|
||||
Loaded 100 of 195 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user