2
0
Fork 1
mirror of https://github.com/FossifyOrg/Gallery.git synced 2025-04-17 00:44:00 +02:00

Compare commits

...

177 commits

Author SHA1 Message Date
Naveen Singh
a1c90a1bd7
Merge pull request from terofeev/fix-favorite-icon-placement-grid
Fix favorite icon placement on grids.
2025-04-04 21:59:52 +05:30
terofeev
c57f51984d Fix favorite icon placement on grids. 2025-04-04 18:38:38 +04:00
Naveen Singh
0a95620a11
Merge pull request from terofeev/redesign-favorite-icon-placement
Redesign favorite icon placement.
2025-04-04 17:58:25 +05:30
terofeev
50e7223b31 Redesign favorite icon placement. 2025-04-04 15:48:31 +04:00
Naveen Singh
f084cde44f
Use workflow templates for minimizer and no-response 2025-04-04 01:54:54 +05:30
Naveen Singh
5d108af0e7
Merge pull request from FossifyOrg/fix_search_dialog
Fix issue with physical keyboards in copy/move dialog
2025-04-02 20:25:33 +05:30
Naveen Singh
e6a90db721
Avoid consuming all key events
The dialog's key listener was consuming all key events and led to problems like https://github.com/FossifyOrg/Gallery/issues/128
2025-04-02 16:12:32 +05:30
Naveen Singh
5630a4ceb0
Remove invalid short description translations 2025-03-25 21:10:52 +05:30
Naveen Singh
28eed6bede
Remove title and changelog translations 2025-03-25 20:58:16 +05:30
Naveen Singh
496e37cbe0
Merge pull request from weblate/weblate-fossify-gallery
Translations update from Hosted Weblate
2025-03-25 20:43:37 +05:30
VfBFan
36c256d81e
Translated using Weblate (German)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/de/
2025-03-24 09:20:16 +01:00
elid
78366352a4
Translated using Weblate (Hebrew)
Currently translated at 90.9% (10 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/he/
2025-03-16 06:32:18 +01:00
elid
b53e560014
Translated using Weblate (Hebrew)
Currently translated at 72.4% (181 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/he/
2025-03-16 06:32:18 +01:00
LaKato
d0150cb20a
Translated using Weblate (Esperanto)
Currently translated at 18.1% (2 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/eo/
2025-03-15 21:36:51 +01:00
LaKato
019d76f9da
Translated using Weblate (Esperanto)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 20:01:08 +01:00
LaKato
74a6fb48c5
Translated using Weblate (Esperanto)
Currently translated at 97.2% (243 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 19:34:01 +01:00
LaKato
c847db9318
Translated using Weblate (Esperanto)
Currently translated at 96.0% (240 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 19:22:40 +01:00
LaKato
65736f1bd0
Translated using Weblate (Esperanto)
Currently translated at 95.6% (239 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 17:55:09 +01:00
LaKato
264b9d4b03
Translated using Weblate (Esperanto)
Currently translated at 89.2% (223 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 16:01:14 +01:00
LaKato
e5d6afe01e
Translated using Weblate (Esperanto)
Currently translated at 88.8% (222 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 15:29:26 +01:00
LaKato
4f44f1c4a7
Translated using Weblate (Esperanto)
Currently translated at 87.2% (218 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 15:11:49 +01:00
LaKato
c7ea06c74a
Translated using Weblate (French)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/fr/
2025-03-12 14:56:27 +01:00
LaKato
77b4b8eca4
Translated using Weblate (Spanish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/es/
2025-03-12 14:56:27 +01:00
LaKato
2dc750d3cb
Translated using Weblate (Esperanto)
Currently translated at 86.4% (216 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 14:56:27 +01:00
LaKato
0110ac699c
Translated using Weblate (French)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/fr/
2025-03-12 14:14:00 +01:00
LaKato
13515d9b5a
Translated using Weblate (Spanish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/es/
2025-03-12 14:14:00 +01:00
LaKato
4d279ce19f
Translated using Weblate (Esperanto)
Currently translated at 79.2% (198 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 14:14:00 +01:00
LaKato
1331e491b8
Translated using Weblate (Esperanto)
Currently translated at 76.4% (191 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 13:59:39 +01:00
LaKato
b2ccd654e8
Translated using Weblate (Esperanto)
Currently translated at 75.2% (188 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-12 03:21:44 +01:00
LaKato
df7244471d
Translated using Weblate (Esperanto)
Currently translated at 64.0% (160 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-11 19:12:37 +00:00
LaKato
6b2f32b602
Translated using Weblate (Esperanto)
Currently translated at 63.2% (158 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-11 19:12:37 +00:00
LaKato
c4bd3af2c3
Translated using Weblate (Esperanto)
Currently translated at 61.6% (154 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-11 19:12:36 +00:00
LaKato
ee7f5001ac
Translated using Weblate (Esperanto)
Currently translated at 58.8% (147 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-11 19:12:35 +00:00
LaKato
c4d7adfd6e
Translated using Weblate (Esperanto)
Currently translated at 56.8% (142 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-11 19:12:35 +00:00
Naveen Singh
52ca5a0a4d
Merge pull request from FossifyOrg/cleanup_code
Cleanup and format some code
2025-03-12 00:41:54 +05:30
Naveen Singh
54ace84249
Fix some lint errors 2025-03-11 21:37:13 +05:30
Naveen Singh
8347e680a8
Format some code
No functionality changes.
2025-03-11 21:36:02 +05:30
Naveen Singh
be9003788c
Merge identical when entries 2025-03-11 19:56:32 +05:30
Naveen Singh
2a78323e0f
Remove unreachable code
Sorting by path condition was duplicated.
2025-03-11 19:45:01 +05:30
Naveen Singh
f3b3edab29
Merge pull request from terofeev/sort-by-count
Add sort folders by count
2025-03-11 19:35:56 +05:30
Naveen Singh
23e374c882
Update commons (again)
Fixed jitpack build.
2025-03-11 19:34:41 +05:30
terofeev
047d0a6585 Update commons lib.
Remove temp code.
2025-03-10 11:55:09 +04:00
Naveen Singh
d2fa286676
Merge branch 'master' into sort-by-count 2025-03-10 00:11:33 +05:30
terofeev
140f876d13 Add sort by count. 2025-03-09 21:23:59 +04:00
Naveen Singh
6b0e90f425
Merge pull request from weblate/weblate-fossify-gallery
Translations update from Hosted Weblate
2025-03-09 08:17:03 +05:30
LaKato
fdc59d6836
Translated using Weblate (Esperanto)
Currently translated at 53.6% (134 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-08 04:02:44 +01:00
LaKato
f223d952ec
Translated using Weblate (Esperanto)
Currently translated at 41.6% (104 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-08 03:32:27 +01:00
LaKato
bd64d31bf5
Translated using Weblate (Esperanto)
Currently translated at 31.2% (78 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-08 03:25:47 +01:00
LaKato
b7f3ba98da
Translated using Weblate (Esperanto)
Currently translated at 30.8% (77 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-06 20:47:04 +01:00
LaKato
b902dbe067
Translated using Weblate (Esperanto)
Currently translated at 19.6% (49 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-06 20:12:29 +01:00
LaKato
d385477ce3
Translated using Weblate (Esperanto)
Currently translated at 12.0% (30 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-06 19:32:25 +01:00
LaKato
f4b1addb40
Translated using Weblate (Esperanto)
Currently translated at 11.6% (29 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-06 19:32:11 +01:00
LaKato
c7fddbc4a8
Translated using Weblate (Esperanto)
Currently translated at 10.4% (26 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-05 20:35:53 +01:00
LaKato
34ca91931f
Translated using Weblate (Esperanto)
Currently translated at 10.0% (25 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-05 20:35:53 +01:00
109247019824
e76f4a55f7
Translated using Weblate (Bulgarian)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/bg/
2025-03-05 20:35:53 +01:00
Mihai Pantazi
cba2e24a02
Translated using Weblate (Spanish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/es/
2025-03-05 20:35:53 +01:00
lantw44
b6b2e569c7
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/zh_Hant/
2025-03-05 20:35:53 +01:00
Bora Atıcı
0880552939
Translated using Weblate (Turkish)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/tr/
2025-03-05 20:35:53 +01:00
AP
04422a73bb
Translated using Weblate (Breton)
Currently translated at 0.8% (2 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/br/
2025-03-05 20:35:53 +01:00
LaKato
3e16e28417
Translated using Weblate (Esperanto)
Currently translated at 9.6% (24 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eo/
2025-03-05 20:35:52 +01:00
Sketch6580
36eaca6022
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/zh_Hans/
2025-03-05 20:35:52 +01:00
P.O
81c2d1a854
Translated using Weblate (Swedish)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/sv/
2025-03-05 20:35:52 +01:00
Josep M. Ferrer
a85af89a69
Translated using Weblate (Catalan)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/ca/
2025-03-05 20:35:52 +01:00
El Pirujo
ad03c24964
Translated using Weblate (Spanish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/es/
2025-03-05 20:35:52 +01:00
大王叫我来巡山
0da7bdebc1
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/zh_Hans/
2025-03-05 20:35:52 +01:00
Nicola Bortoletto
b84c3bc8d6
Translated using Weblate (Italian)
Currently translated at 63.6% (7 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/it/
2025-03-05 20:35:52 +01:00
BlackSpectrum
8b36ae72cf
Translated using Weblate (Gujarati)
Currently translated at 20.4% (51 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/gu/
2025-03-05 20:35:52 +01:00
BlackSpectrum
e135a09832
Translated using Weblate (Gujarati)
Currently translated at 3.2% (8 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/gu/
2025-03-05 20:35:52 +01:00
0-BlackSpectrum-0
c715157bc1
Added translation using Weblate (Gujarati) 2025-03-05 20:35:52 +01:00
FLVAL
8ce2262a38
Translated using Weblate (French)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/fr/
2025-03-05 20:35:52 +01:00
FLVAL
d7679c296a
Translated using Weblate (French)
Currently translated at 99.2% (248 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/fr/
2025-03-05 20:35:52 +01:00
NormalRandomPeople
26729b2a5f
Translated using Weblate (French)
Currently translated at 99.2% (248 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/fr/
2025-03-05 20:35:52 +01:00
VfBFan
43f94b2214
Translated using Weblate (German)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/de/
2025-03-05 20:35:52 +01:00
109247019824
b5d08f0948
Translated using Weblate (Bulgarian)
Currently translated at 90.9% (10 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/bg/
2025-03-05 20:35:52 +01:00
VfBFan
f90a009a17
Translated using Weblate (German)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/de/
2025-03-05 20:35:52 +01:00
109247019824
d489964799
Translated using Weblate (Bulgarian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/bg/
2025-03-05 20:35:52 +01:00
109247019824
95b6e10f19
Translated using Weblate (Bulgarian)
Currently translated at 97.2% (243 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/bg/
2025-03-05 20:35:52 +01:00
Naveen Singh
fbdfd05b80
Merge pull request from terofeev/dont-save-copy-after-edit-picture
Implement internal cropping instead of library's built-in function
2025-03-06 01:05:46 +05:30
terofeev
f196e111c7 Apply internal cropping when sharing an image 2025-02-08 13:36:58 +04:00
terofeev
6e5802f021 Implement internal cropping instead of library's built-in function 2025-02-07 18:30:12 +04:00
Naveen Singh
a948355d2e
Remove optional donation checklist item 2025-01-22 00:30:44 +05:30
Naveen Singh
8132d0dfb6
Fix typo in CONTRIBUTING.md 2025-01-21 14:00:22 +05:30
Naveen Singh
13cba41863
Fix typos in issue templates 2025-01-17 17:57:14 +05:30
Naveen Singh
ff2f42fffc
Merge pull request from weblate/weblate-fossify-gallery
Translations update from Hosted Weblate
2024-12-25 23:01:08 +05:30
Peter Dave Hello
42543cbfda
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 81.8% (9 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/zh_Hant/
2024-12-22 11:06:31 +01:00
teemue
f77ab15032
Translated using Weblate (Finnish)
Currently translated at 96.8% (242 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/fi/
2024-12-21 23:48:06 +01:00
fin-w
2493cba10f
Translated using Weblate (Welsh)
Currently translated at 70.8% (177 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/cy/
2024-12-21 17:04:26 +01:00
en2sv
df8525b588
Translated using Weblate (Swedish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/sv/
2024-12-10 22:00:34 +01:00
109247019824
a2029c7e8e
Translated using Weblate (Bulgarian)
Currently translated at 97.2% (243 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/bg/
2024-12-06 10:15:16 +01:00
en2sv
50edd42e7d
Translated using Weblate (Swedish)
Currently translated at 99.6% (249 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/sv/
2024-12-04 22:00:28 +00:00
Aindriú Mac Giolla Eoin
c4c1a9c9ff
Translated using Weblate (Irish)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/ga/
2024-12-03 18:00:31 +01:00
109247019824
9c6ff12dff
Translated using Weblate (Bulgarian)
Currently translated at 18.1% (2 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/bg/
2024-12-03 18:00:28 +01:00
109247019824
5e199f1af4
Translated using Weblate (Bulgarian)
Currently translated at 95.6% (239 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/bg/
2024-12-03 18:00:27 +01:00
109247019824
3b76c16d78
Translated using Weblate (Bulgarian)
Currently translated at 9.0% (1 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/bg/
2024-12-01 16:00:37 +01:00
109247019824
28a6748a53
Translated using Weblate (Bulgarian)
Currently translated at 95.6% (239 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/bg/
2024-12-01 16:00:36 +01:00
Aindriú Mac Giolla Eoin
5034000143
Translated using Weblate (Irish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/ga/
2024-11-25 17:00:22 +00:00
Aindriú Mac Giolla Eoin
ae159ece42
Added translation using Weblate (Irish) 2024-11-24 17:43:57 +01:00
Thiago Carmona
849a5d4478
Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.8% (247 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/pt_BR/
2024-11-24 02:00:31 +01:00
Guillaume
380ab1d3f4
Translated using Weblate (Dutch)
Currently translated at 18.1% (2 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/nl/
2024-11-18 07:53:15 +01:00
Dan
8259e41906
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/uk/
2024-11-18 07:53:14 +01:00
Small Town Guy
bd8e411e2a
Translated using Weblate (Indonesian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/id/
2024-11-18 07:53:13 +01:00
Sergio Marques
95deb1a1bf
Translated using Weblate (Portuguese)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/pt/
2024-11-18 07:53:12 +01:00
Tom Coutte
7c62c58f8d
Translated using Weblate (French)
Currently translated at 81.8% (9 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/fr/
2024-11-18 07:53:11 +01:00
Priit Jõerüüt
4bf0efb7c1
Translated using Weblate (Estonian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/et/
2024-11-18 07:53:10 +01:00
Mikel Larreategi
e81d17cda3
Translated using Weblate (Basque)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/eu/
2024-11-18 07:53:09 +01:00
en2sv
bcaf168409
Translated using Weblate (Swedish)
Currently translated at 97.6% (244 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/sv/
2024-11-18 07:53:08 +01:00
Sketch6580
af82aa174b
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/zh_Hans/
2024-11-18 07:53:07 +01:00
Sketch6580
ba4ff13e4e
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/zh_Hans/
2024-11-18 07:53:06 +01:00
josé m
a7884696ea
Translated using Weblate (Galician)
Currently translated at 63.6% (7 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/gl/
2024-11-18 07:53:04 +01:00
josé m
a40bb00f42
Translated using Weblate (Galician)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/gl/
2024-11-18 07:53:03 +01:00
Naveen Singh
c58f9f6752
Update no-response.yml 2024-11-18 12:21:36 +05:30
Naveen Singh
7eae0fb89a
Update no-response.yml 2024-11-17 23:44:47 +05:30
Naveen Singh
cc0198426c
Update image minimizer 2024-11-17 23:35:09 +05:30
Naveen Singh
2d4b8a82e8
Update image minimizer 2024-11-17 23:19:40 +05:30
Naveen Singh
694c3096e7
Update image minimizer 2024-11-17 22:42:38 +05:30
Naveen Singh
0fcda500bc
Update no-response.yml 2024-11-15 16:56:57 +05:30
Naveen Singh
18a2036226
Reduce no-response duration to 14 days 2024-10-26 03:53:08 +05:30
Naveen Singh
5054b37a96
Merge pull request from weblate/weblate-fossify-gallery
Translations update from Hosted Weblate
2024-10-16 20:22:49 -04:00
FLVAL
90469ffb17
Translated using Weblate (French)
Currently translated at 72.7% (8 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/fr/
2024-10-15 04:48:39 +02:00
FLVAL
c150678f45
Translated using Weblate (French)
Currently translated at 99.2% (248 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/fr/
2024-10-15 04:48:39 +02:00
Milo Ivir
4225254358
Translated using Weblate (Croatian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/hr/
2024-10-13 01:00:52 +02:00
Josep M. Ferrer
f6291f1cad
Translated using Weblate (Catalan)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/ca/
2024-10-08 19:15:37 +02:00
Igor Sorocean
c58630f39f
Translated using Weblate (Romanian)
Currently translated at 94.8% (237 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/ro/
2024-10-08 19:15:37 +02:00
Josep M. Ferrer
7e369795a9
Translated using Weblate (Catalan)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/ca/
2024-10-08 19:15:37 +02:00
gallegonovato
d3190924b5
Translated using Weblate (Spanish)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/es/
2024-10-06 19:15:44 +00:00
Giovanni Donisi
381b06b2d5
Translated using Weblate (Italian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/it/
2024-10-06 19:15:41 +00:00
Jeff Huang
c2b0219650
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/zh_Hant/
2024-10-03 04:15:43 +02:00
Suguru Hirahara
4e786d9209
Translated using Weblate (Japanese)
Currently translated at 94.8% (237 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/ja/
2024-10-03 04:15:42 +02:00
P.O
d88ddc22e7
Translated using Weblate (Swedish)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/sv/
2024-10-01 14:44:55 +00:00
Priit Jõerüüt
b4bed3ab4c
Translated using Weblate (Estonian)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/et/
2024-10-01 14:44:55 +00:00
Guillaume
c7d18b138e
Translated using Weblate (Dutch)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/nl/
2024-10-01 14:44:54 +00:00
Ghost of Sparta
087f4ff630
Translated using Weblate (Hungarian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/hu/
2024-10-01 14:44:54 +00:00
Priit Jõerüüt
424b7f0e6a
Translated using Weblate (Estonian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/et/
2024-10-01 14:44:53 +00:00
Sketch6580
3ce226af60
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 81.8% (9 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/zh_Hans/
2024-10-01 14:44:52 +00:00
gallegonovato
9760ba1885
Translated using Weblate (Spanish)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/es/
2024-10-01 14:44:52 +00:00
Fjuro
52d298e5a2
Translated using Weblate (Czech)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/cs/
2024-10-01 14:44:51 +00:00
VfBFan
b15807734a
Translated using Weblate (German)
Currently translated at 100.0% (11 of 11 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/de/
2024-10-01 14:44:51 +00:00
Sketch6580
0e08228d15
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/zh_Hans/
2024-10-01 14:44:50 +00:00
Dan
0ba8558358
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/uk/
2024-10-01 14:44:49 +00:00
Oğuz Ersen
8ed3657e9f
Translated using Weblate (Turkish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/tr/
2024-10-01 14:44:49 +00:00
solokot
c5958c0070
Translated using Weblate (Russian)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/ru/
2024-10-01 14:44:48 +00:00
Guillaume
5128602cf7
Translated using Weblate (Dutch)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/nl/
2024-10-01 14:44:48 +00:00
gallegonovato
3de6ef10da
Translated using Weblate (Spanish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/es/
2024-10-01 14:44:47 +00:00
VfBFan
a2be982104
Translated using Weblate (German)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/de/
2024-10-01 14:44:47 +00:00
Fjuro
58b93d55c6
Translated using Weblate (Czech)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/cs/
2024-10-01 14:44:46 +00:00
Naveen Singh
6a9cc42979
Update image-minimizer.js 2024-10-01 20:12:27 +05:30
Naveen Singh
4e479e5309
Update commons 2024-10-01 19:46:37 +05:30
Naveen Singh
f176fe2915
Bump minimum target version to Android 8 (API Level 26)
See https://github.com/orgs/FossifyOrg/discussions/241
2024-09-28 01:52:33 +05:30
Naveen Singh
08cc4fc39b
Update changelog 2024-09-28 00:42:29 +05:30
Naveen Singh
2d69922cfb
Update version to 1.2.1 (9) 2024-09-28 00:42:29 +05:30
Naveen Singh
54666d6b68
Update commons 2024-09-28 00:42:28 +05:30
Naveen Singh
f9111757e8
Merge pull request from weblate/weblate-fossify-gallery
Translations update from Hosted Weblate
2024-09-28 00:26:22 +05:30
Agnieszka C
4a14d03a2c
Translated using Weblate (Polish)
Currently translated at 100.0% (250 of 250 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/pl/
2024-09-27 20:49:22 +02:00
Ghost of Sparta
dd594a57b2
Translated using Weblate (Hungarian)
Currently translated at 100.0% (247 of 247 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/hu/
2024-09-27 20:49:21 +02:00
fin-w
d2faff3f2f
Translated using Weblate (Welsh)
Currently translated at 65.9% (163 of 247 strings)

Translation: Fossify/Gallery
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery/cy/
2024-09-27 20:49:20 +02:00
VfBFan
f9a723da40
Translated using Weblate (German)
Currently translated at 100.0% (10 of 10 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/de/
2024-09-27 20:49:19 +02:00
Josep M. Ferrer
a5f10c35bb
Translated using Weblate (Catalan)
Currently translated at 100.0% (10 of 10 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/ca/
2024-09-27 20:49:19 +02:00
ε
11beb4a626
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 20.0% (2 of 10 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/zh_Hant/
2024-09-27 20:49:18 +02:00
gallegonovato
f74a830454
Translated using Weblate (Spanish)
Currently translated at 100.0% (10 of 10 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/es/
2024-09-27 20:49:17 +02:00
Fjuro
c7867483ae
Translated using Weblate (Czech)
Currently translated at 100.0% (10 of 10 strings)

Translation: Fossify/Gallery metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/gallery-metadata/cs/
2024-09-27 20:49:16 +02:00
Naveen Singh
571866543d
Remove wildcard imports 2024-09-28 00:19:03 +05:30
Naveen Singh
1edcd5d161
Show user friendly error messages
See https://github.com/FossifyOrg/Gallery/issues/309
2024-09-27 23:16:18 +05:30
Naveen Singh
43eff348e6
Hide video preview on error 2024-09-27 22:39:05 +05:30
Naveen Singh
fafd6343d9
Rework the mute button logic
See https://github.com/FossifyOrg/Gallery/issues/171#issuecomment-2378649690

- Mute button is now completely unlinked from the system volume. The only way to unmute the player is to use the unmute button.
- Mute button state is now persisted.
2024-09-27 16:27:04 +05:30
Naveen Singh
6e98294147
Expand playback speed bottom sheet by default 2024-09-26 11:02:37 +05:30
Naveen Singh
2caa178417
Merge pull request from FossifyOrg/add_black_placeholders
Use black placeholder background for thumbnails
2024-09-26 09:51:54 +05:30
Naveen Singh
30663de8ae
Hardcode branch name in workflow 2024-09-26 09:39:37 +05:30
Naveen Singh
056032cb67
Use black placeholder for thumbnails
Using a black placeholder leads to clearer thumbnail and background separation on most themes.
2024-09-25 23:10:51 +05:30
Naveen Singh
9b93b62f00
Add back JPEG XL support
Closes https://github.com/FossifyOrg/Gallery/issues/3
2024-09-25 22:35:52 +05:30
Naveen Singh
8b65aec0f1
Merge pull request from esensar/ci
Add reusable workflows for PRs and testing builds
2024-09-25 22:21:27 +05:30
Ensar Sarajčić
d5e019ba00 Add reusable workflows for PRs and testing builds 2024-09-25 17:17:42 +02:00
Naveen Singh
4c2320d06a
Enable the loading indicator 2024-09-25 10:25:03 +05:30
Naveen Singh
654f0654a1
Show loading indicator only on initial load 2024-09-25 10:23:49 +05:30
Naveen Singh
45db8c19aa
Show loading indicator when loading many items 2024-09-24 22:19:41 +05:30
Naveen Singh
ff836d8c24
Rely solely on recyclerview for lazy loading
Closes https://github.com/FossifyOrg/Gallery/issues/136

- Remove manual lazy loading mechanism
- Disable cross fade when loading from cache
2024-09-24 21:53:01 +05:30
Naveen Singh
85f5f43b29
Drop JXL support (temporarily)
Closes https://github.com/FossifyOrg/Gallery/issues/301

Should be added back once https://github.com/awxkee/jxl-coder-glide/issues/4 is resolved.
2024-09-24 19:01:50 +05:30
Naveen Singh
ac8f912efb
Update android photo filters library 2024-09-23 01:11:53 +05:30
204 changed files with 9116 additions and 1367 deletions
.github
CHANGELOG.mdCONTRIBUTING.md
app
build.gradle.kts
fastlane/metadata/android

View file

@ -112,7 +112,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

View file

@ -20,14 +20,12 @@ body:
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/Gallery/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

View file

@ -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) ![ALT_TEXT](https://*.githubusercontent.com/<number>/<variousHexStringsAnd->.<fileExtension>)
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;
}
}

View file

@ -5,31 +5,11 @@ 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@v4
- uses: actions/setup-node@v4
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@v7
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:
FOSSIFYBOT_TOKEN: ${{ secrets.FOSSIFYBOT_TOKEN }}

View file

@ -1,25 +1,12 @@
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:
FOSSIFYBOT_TOKEN: ${{ secrets.FOSSIFYBOT_TOKEN }}

11
.github/workflows/pr.yml vendored Normal file
View file

@ -0,0 +1,11 @@
name: PR
on:
pull_request:
branches: [ master ]
jobs:
call-pr-workflow:
uses: FossifyOrg/.github/.github/workflows/pr.yml@main
with:
test_task: ":app:testFossDebugUnitTest"

10
.github/workflows/testing-build.yml vendored Normal file
View file

@ -0,0 +1,10 @@
name: Testing build (on PR)
on:
pull_request:
branches: [ master ]
types: [ labeled, opened, synchronize, reopened ]
jobs:
call-testing-build-workflow:
uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main

View file

@ -1,6 +1,20 @@
Changelog
==========
Version 1.2.1 *(2024-09-28)*
----------------------------
* Updated target Android version to 14
* Added option to control video playback speed
* Added option to mute videos
* Replaced checkboxes with switches
* Added error indicator for media load failures
* Improve scrolling performance and interface
* Improved app lock logic and interface
* Added initial support for JPEG XL format (increased app size)
* Other minor bug fixes and improvements
* Added more translations
Version 1.2.0 *(2024-09-21)*
----------------------------

View file

@ -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).

View file

@ -6,6 +6,7 @@ plugins {
alias(libs.plugins.android)
alias(libs.plugins.kotlinAndroid)
alias(libs.plugins.ksp)
alias(libs.plugins.detekt)
}
val keystorePropertiesFile: File = rootProject.file("keystore.properties")
@ -70,7 +71,7 @@ android {
}
compileOptions {
val currentJavaVersionFromLibs = JavaVersion.valueOf(libs.versions.app.build.javaVersion.get().toString())
val currentJavaVersionFromLibs = JavaVersion.valueOf(libs.versions.app.build.javaVersion.get())
sourceCompatibility = currentJavaVersionFromLibs
targetCompatibility = currentJavaVersionFromLibs
}
@ -87,7 +88,9 @@ android {
lint {
checkReleaseBuilds = false
abortOnError = false
abortOnError = true
warningsAsErrors = true
baseline = file("lint-baseline.xml")
}
packaging {
@ -104,6 +107,10 @@ android {
}
}
detekt {
baseline = file("detekt-baseline.xml")
}
dependencies {
implementation(libs.fossify.commons)
implementation(libs.android.image.cropper)
@ -112,7 +119,7 @@ dependencies {
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.media3.exoplayer)
implementation(libs.sanselan)
implementation(libs.imagefilters)
implementation(libs.androidphotofilters)
implementation(libs.androidsvg.aar)
implementation(libs.gestureviews)
implementation(libs.subsamplingscaleimageview)

824
app/detekt-baseline.xml Normal file
View file

@ -0,0 +1,824 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ComplexCondition:Activity.kt$(hide &amp;&amp; filename.startsWith('.')) || (!hide &amp;&amp; !filename.startsWith('.'))</ID>
<ID>ComplexCondition:Context.kt$animate &amp;&amp; roundCorners == ROUNDED_CORNERS_NONE &amp;&amp; (path.isGif() || path.isWebP())</ID>
<ID>ComplexCondition:DirectoryAdapter.kt$DirectoryAdapter$!config.useRecycleBin || config.tempSkipRecycleBin || (isOneItemSelected() &amp;&amp; fileDirItem.areFavorites())</ID>
<ID>ComplexCondition:MainActivity.kt$MainActivity$!config.wasOTGHandled &amp;&amp; hasPermission(getPermissionToRequest()) &amp;&amp; hasOTGConnected() &amp;&amp; config.OTGPath.isEmpty()</ID>
<ID>ComplexCondition:MainActivity.kt$MainActivity$(!defaultDir.exists() || !defaultDir.isDirectory) &amp;&amp; (config.defaultFolder != RECYCLE_BIN &amp;&amp; config.defaultFolder != FAVORITES)</ID>
<ID>ComplexCondition:MediaActivity.kt$MediaActivity$mMedia.isEmpty() || !isRandomSorting || (isRandomSorting &amp;&amp; !mWasFullscreenViewOpen)</ID>
<ID>ComplexCondition:MediaAdapter.kt$MediaAdapter$showFileTypes &amp;&amp; (medium.isGIF() || medium.isRaw() || medium.isSVG())</ID>
<ID>ComplexCondition:MediaFetcher.kt$MediaFetcher$!isImage &amp;&amp; !isVideo &amp;&amp; !isGif &amp;&amp; !isRaw &amp;&amp; !isSvg</ID>
<ID>ComplexCondition:MediaFetcher.kt$MediaFetcher$curPath != FAVORITES &amp;&amp; curPath != RECYCLE_BIN &amp;&amp; isRPlus() &amp;&amp; !isExternalStorageManager()</ID>
<ID>ComplexCondition:MediaFetcher.kt$MediaFetcher$currentGrouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || currentGrouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 || currentGrouping and GROUP_BY_DATE_TAKEN_DAILY != 0 || currentGrouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0</ID>
<ID>ComplexCondition:MediaFetcher.kt$MediaFetcher$isImage || isVideo || isGif || isRaw</ID>
<ID>ComplexCondition:MediaSideScroll.kt$MediaSideScroll$(percent == 100 &amp;&amp; event.rawY &gt; mLastTouchY) || (percent == -100 &amp;&amp; event.rawY &lt; mLastTouchY)</ID>
<ID>ComplexCondition:PhotoFragment.kt$PhotoFragment$isRPlus() &amp;&amp; !isExternalStorageManager() &amp;&amp; mMedium.path.startsWith("/storage/") &amp;&amp; mMedium.isHidden()</ID>
<ID>ComplexCondition:PhotoFragment.kt$PhotoFragment$mIsFragmentVisible &amp;&amp; context?.config?.allowZoomingImages == true &amp;&amp; (mMedium.isImage() || mMedium.isPortrait()) &amp;&amp; !mIsSubsamplingVisible</ID>
<ID>ComplexCondition:PhotoFragment.kt$PhotoFragment$mStoredShowExtendedDetails &amp;&amp; isVisible() &amp;&amp; context != null &amp;&amp; resources != null</ID>
<ID>ComplexCondition:PhotoVideoActivity.kt$PhotoVideoActivity$realPath != mUri.toString() &amp;&amp; realPath.isNotEmpty() &amp;&amp; mUri!!.authority != "mms" &amp;&amp; filename.contains('.') &amp;&amp; getDoesFilePathExist(realPath)</ID>
<ID>ComplexCondition:PicassoRegionDecoder.kt$PicassoRegionDecoder$(rect.width() &gt; rect.height() &amp;&amp; screenWidth &gt; screenHeight) || (rect.height() &gt; rect.width() &amp;&amp; screenHeight &gt; screenWidth)</ID>
<ID>ComplexCondition:SettingsActivity.kt$SettingsActivity$requestCode == PICK_IMPORT_SOURCE_INTENT &amp;&amp; resultCode == Activity.RESULT_OK &amp;&amp; resultData != null &amp;&amp; resultData.data != null</ID>
<ID>ComplexCondition:SettingsActivity.kt$SettingsActivity$requestCode == SELECT_EXPORT_FAVORITES_FILE_INTENT &amp;&amp; resultCode == Activity.RESULT_OK &amp;&amp; resultData != null &amp;&amp; resultData.data != null</ID>
<ID>ComplexCondition:SettingsActivity.kt$SettingsActivity$requestCode == SELECT_IMPORT_FAVORITES_FILE_INTENT &amp;&amp; resultCode == Activity.RESULT_OK &amp;&amp; resultData != null &amp;&amp; resultData.data != null</ID>
<ID>ComplexCondition:VideoFragment.kt$VideoFragment$activity == null || mConfig.openVideosOnSeparateScreen || mIsPanorama || mExoPlayer != null</ID>
<ID>ComplexCondition:VideoFragment.kt$VideoFragment$mStoredShowExtendedDetails &amp;&amp; isVisible() &amp;&amp; context != null &amp;&amp; resources != null</ID>
<ID>ComplexCondition:VideoFragment.kt$VideoFragment$mWasFragmentInit &amp;&amp; menuVisible &amp;&amp; mConfig.autoplayVideos &amp;&amp; !mConfig.openVideosOnSeparateScreen</ID>
<ID>ComplexCondition:VideoPlayerActivity.kt$VideoPlayerActivity$config.allowDownGesture &amp;&amp; !mIgnoreCloseDown &amp;&amp; Math.abs(diffY) &gt; Math.abs(diffX) &amp;&amp; diffY &lt; -mCloseDownThreshold &amp;&amp; downGestureDuration &lt; MAX_CLOSE_DOWN_GESTURE_DURATION &amp;&amp; binding.videoSurfaceFrame.controller.state.zoom == 1f</ID>
<ID>ComplexCondition:VideoPlayerActivity.kt$VideoPlayerActivity$mIsDragged || (Math.abs(diffX) &gt; mDragThreshold &amp;&amp; Math.abs(diffX) &gt; Math.abs(diffY)) &amp;&amp; binding.videoSurfaceFrame.controller.state.zoom == 1f</ID>
<ID>ComplexCondition:ViewPagerFragment.kt$ViewPagerFragment$!mIgnoreCloseDown &amp;&amp; (Math.abs(diffY) &gt; Math.abs(diffX)) &amp;&amp; (diffY &lt; -mCloseDownThreshold) &amp;&amp; downGestureDuration &lt; MAX_CLOSE_DOWN_GESTURE_DURATION &amp;&amp; context?.config?.allowDownGesture == true</ID>
<ID>CyclomaticComplexMethod:Activity.kt$fun AppCompatActivity.fixDateTaken( paths: ArrayList&lt;String&gt;, showToasts: Boolean, hasRescanned: Boolean = false, callback: (() -&gt; Unit)? = null )</ID>
<ID>CyclomaticComplexMethod:Context.kt$@Suppress("UNCHECKED_CAST") fun Context.getSortedDirectories(source: ArrayList&lt;Directory&gt;): ArrayList&lt;Directory&gt;</ID>
<ID>CyclomaticComplexMethod:Context.kt$fun Context.getCachedDirectories( getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, forceShowExcluded: Boolean = false, callback: (ArrayList&lt;Directory&gt;) -&gt; Unit, )</ID>
<ID>CyclomaticComplexMethod:Context.kt$fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList&lt;ThumbnailItem&gt;) -&gt; Unit)</ID>
<ID>CyclomaticComplexMethod:Context.kt$fun Context.getDirectParentSubfolders(dirs: ArrayList&lt;Directory&gt;, currentPathPrefix: String): ArrayList&lt;Directory&gt;</ID>
<ID>CyclomaticComplexMethod:DirectoryAdapter.kt$DirectoryAdapter$override fun actionItemPressed(id: Int)</ID>
<ID>CyclomaticComplexMethod:DirectoryAdapter.kt$DirectoryAdapter$private fun copyMoveTo(selectedPaths: Collection&lt;String&gt;, isCopyOperation: Boolean)</ID>
<ID>CyclomaticComplexMethod:DirectoryAdapter.kt$DirectoryAdapter$private fun setupView(view: View, directory: Directory, holder: ViewHolder)</ID>
<ID>CyclomaticComplexMethod:EditActivity.kt$EditActivity$private fun initEditActivity()</ID>
<ID>CyclomaticComplexMethod:EditActivity.kt$EditActivity$private fun updatePrimaryActionButtons()</ID>
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$override fun deleteFolders(folders: ArrayList&lt;File&gt;)</ID>
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun checkInvalidDirectories(dirs: ArrayList&lt;Directory&gt;)</ID>
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList&lt;Directory&gt;)</ID>
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun setupOptionsMenu()</ID>
<ID>CyclomaticComplexMethod:ManageBottomActionsDialog.kt$ManageBottomActionsDialog$private fun dialogConfirmed()</ID>
<ID>CyclomaticComplexMethod:MediaActivity.kt$MediaActivity$override fun onResume()</ID>
<ID>CyclomaticComplexMethod:MediaActivity.kt$MediaActivity$private fun setupOptionsMenu()</ID>
<ID>CyclomaticComplexMethod:MediaAdapter.kt$MediaAdapter$override fun actionItemPressed(id: Int)</ID>
<ID>CyclomaticComplexMethod:MediaAdapter.kt$MediaAdapter$private fun setupThumbnail(view: View, medium: Medium)</ID>
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$fun getAndroid11FolderMedia( isPickImage: Boolean, isPickVideo: Boolean, favoritePaths: ArrayList&lt;String&gt;, getFavoritePathsOnly: Boolean, getProperDateTaken: Boolean, dateTakens: HashMap&lt;String, Long&gt; ): HashMap&lt;String, ArrayList&lt;Medium&gt;&gt;</ID>
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$fun getFilesFrom( curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean, lastModifieds: HashMap&lt;String, Long&gt;, dateTakens: HashMap&lt;String, Long&gt;, android11Files: HashMap&lt;String, ArrayList&lt;Medium&gt;&gt;? ): ArrayList&lt;Medium&gt;</ID>
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$fun groupMedia(media: ArrayList&lt;Medium&gt;, path: String): ArrayList&lt;ThumbnailItem&gt;</ID>
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaInFolder( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean, lastModifieds: HashMap&lt;String, Long&gt;, dateTakens: HashMap&lt;String, Long&gt; ): ArrayList&lt;Medium&gt;</ID>
<ID>CyclomaticComplexMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaOnOTG( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean ): ArrayList&lt;Medium&gt;</ID>
<ID>CyclomaticComplexMethod:MediaSideScroll.kt$MediaSideScroll$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
<ID>CyclomaticComplexMethod:PhotoFragment.kt$PhotoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
<ID>CyclomaticComplexMethod:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
<ID>CyclomaticComplexMethod:PickDirectoryDialog.kt$PickDirectoryDialog$private fun gotDirectories(newDirs: ArrayList&lt;Directory&gt;)</ID>
<ID>CyclomaticComplexMethod:SettingsActivity.kt$SettingsActivity$private fun parseFile(inputStream: InputStream?)</ID>
<ID>CyclomaticComplexMethod:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet&lt;String&gt;, includedPaths: MutableSet&lt;String&gt;, showHidden: Boolean, folderNoMediaStatuses: HashMap&lt;String, Boolean&gt;, callback: (path: String, hasNoMedia: Boolean) -&gt; Unit ): Boolean</ID>
<ID>CyclomaticComplexMethod:VideoFragment.kt$VideoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
<ID>CyclomaticComplexMethod:VideoPlayerActivity.kt$VideoPlayerActivity$private fun handleEvent(event: MotionEvent)</ID>
<ID>CyclomaticComplexMethod:ViewPagerActivity.kt$ViewPagerActivity$fun refreshMenuItems()</ID>
<ID>CyclomaticComplexMethod:ViewPagerActivity.kt$ViewPagerActivity$private fun initContinue()</ID>
<ID>CyclomaticComplexMethod:ViewPagerActivity.kt$ViewPagerActivity$private fun setupOptionsMenu()</ID>
<ID>CyclomaticComplexMethod:ViewPagerFragment.kt$ViewPagerFragment$fun getMediumExtendedDetails(medium: Medium): String</ID>
<ID>EmptyCatchBlock:Activity.kt${ }</ID>
<ID>EmptyCatchBlock:Context.kt${ }</ID>
<ID>EmptyCatchBlock:EditActivity.kt$EditActivity${ }</ID>
<ID>EmptyCatchBlock:MainActivity.kt$MainActivity${ }</ID>
<ID>EmptyCatchBlock:MediaActivity.kt$MediaActivity${ }</ID>
<ID>EmptyCatchBlock:MediaFetcher.kt$MediaFetcher${ }</ID>
<ID>EmptyCatchBlock:MyWidgetProvider.kt$MyWidgetProvider${ }</ID>
<ID>EmptyCatchBlock:PhotoVideoActivity.kt$PhotoVideoActivity${ }</ID>
<ID>EmptyCatchBlock:ViewPagerActivity.kt$ViewPagerActivity${ }</ID>
<ID>EmptyFunctionBlock:App.kt$App.&lt;no name provided&gt;${}</ID>
<ID>EmptyFunctionBlock:DefaultPageTransformer.kt$DefaultPageTransformer${}</ID>
<ID>EmptyFunctionBlock:DirectoryAdapter.kt$DirectoryAdapter${}</ID>
<ID>EmptyFunctionBlock:ManageFoldersAdapter.kt$ManageFoldersAdapter${}</ID>
<ID>EmptyFunctionBlock:ManageHiddenFoldersAdapter.kt$ManageHiddenFoldersAdapter${}</ID>
<ID>EmptyFunctionBlock:MediaAdapter.kt$MediaAdapter${}</ID>
<ID>EmptyFunctionBlock:PhotoVideoActivity.kt$PhotoVideoActivity${}</ID>
<ID>EmptyFunctionBlock:RotateTransformation.kt$RotateTransformation${}</ID>
<ID>EmptyFunctionBlock:SearchActivity.kt$SearchActivity${}</ID>
<ID>EmptyFunctionBlock:VideoFragment.kt$VideoFragment${}</ID>
<ID>EmptyFunctionBlock:VideoPlayerActivity.kt$VideoPlayerActivity${}</ID>
<ID>EmptyFunctionBlock:ViewPagerActivity.kt$ViewPagerActivity${}</ID>
<ID>EmptyFunctionBlock:ViewPagerActivity.kt$ViewPagerActivity.&lt;no name provided&gt;${}</ID>
<ID>ForbiddenComment:Context.kt$// TODO: animate JXL</ID>
<ID>ForbiddenComment:PhotoFragment.kt$PhotoFragment$// TODO: Implement panorama using a FOSS library</ID>
<ID>ForbiddenComment:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$// TODO: Implement panorama using a FOSS library</ID>
<ID>ForbiddenComment:VideoFragment.kt$VideoFragment$// checkIfPanorama() TODO: Implement panorama using a FOSS library</ID>
<ID>ImplicitDefaultLocale:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$String.format("%.2f", value)</ID>
<ID>InstanceOfCheckForException:Activity.kt$e !is IOException</ID>
<ID>LargeClass:DirectoryAdapter.kt$DirectoryAdapter : MyRecyclerViewAdapterItemTouchHelperContractOnPopupTextUpdate</ID>
<ID>LargeClass:EditActivity.kt$EditActivity : SimpleActivityOnCropImageCompleteListener</ID>
<ID>LargeClass:MainActivity.kt$MainActivity : SimpleActivityDirectoryOperationsListener</ID>
<ID>LargeClass:MediaActivity.kt$MediaActivity : SimpleActivityMediaOperationsListener</ID>
<ID>LargeClass:MediaFetcher.kt$MediaFetcher</ID>
<ID>LargeClass:PhotoFragment.kt$PhotoFragment : ViewPagerFragment</ID>
<ID>LargeClass:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
<ID>LargeClass:VideoFragment.kt$VideoFragment : ViewPagerFragmentSurfaceTextureListenerOnSeekBarChangeListenerPlaybackSpeedListener</ID>
<ID>LargeClass:ViewPagerActivity.kt$ViewPagerActivity : SimpleActivityOnPageChangeListenerFragmentListener</ID>
<ID>LongMethod:Activity.kt$fun AppCompatActivity.fixDateTaken( paths: ArrayList&lt;String&gt;, showToasts: Boolean, hasRescanned: Boolean = false, callback: (() -&gt; Unit)? = null )</ID>
<ID>LongMethod:Activity.kt$fun BaseSimpleActivity.restoreRecycleBinPaths(paths: ArrayList&lt;String&gt;, callback: () -&gt; Unit)</ID>
<ID>LongMethod:Context.kt$@Suppress("UNCHECKED_CAST") fun Context.getSortedDirectories(source: ArrayList&lt;Directory&gt;): ArrayList&lt;Directory&gt;</ID>
<ID>LongMethod:Context.kt$fun Context.getCachedDirectories( getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, forceShowExcluded: Boolean = false, callback: (ArrayList&lt;Directory&gt;) -&gt; Unit, )</ID>
<ID>LongMethod:Context.kt$fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList&lt;ThumbnailItem&gt;) -&gt; Unit)</ID>
<ID>LongMethod:DirectoryAdapter.kt$DirectoryAdapter$private fun setupView(view: View, directory: Directory, holder: ViewHolder)</ID>
<ID>LongMethod:EditActivity.kt$EditActivity$private fun updatePrimaryActionButtons()</ID>
<ID>LongMethod:MainActivity.kt$MainActivity$override fun onCreate(savedInstanceState: Bundle?)</ID>
<ID>LongMethod:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList&lt;Directory&gt;)</ID>
<ID>LongMethod:MediaAdapter.kt$MediaAdapter$private fun setupThumbnail(view: View, medium: Medium)</ID>
<ID>LongMethod:MediaFetcher.kt$MediaFetcher$fun getAndroid11FolderMedia( isPickImage: Boolean, isPickVideo: Boolean, favoritePaths: ArrayList&lt;String&gt;, getFavoritePathsOnly: Boolean, getProperDateTaken: Boolean, dateTakens: HashMap&lt;String, Long&gt; ): HashMap&lt;String, ArrayList&lt;Medium&gt;&gt;</ID>
<ID>LongMethod:MediaFetcher.kt$MediaFetcher$private fun getMediaInFolder( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean, lastModifieds: HashMap&lt;String, Long&gt;, dateTakens: HashMap&lt;String, Long&gt; ): ArrayList&lt;Medium&gt;</ID>
<ID>LongMethod:PhotoFragment.kt$PhotoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
<ID>LongMethod:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
<ID>LongMethod:SettingsActivity.kt$SettingsActivity$private fun parseFile(inputStream: InputStream?)</ID>
<ID>LongMethod:SettingsActivity.kt$SettingsActivity$private fun setupExportSettings()</ID>
<ID>LongMethod:SettingsActivity.kt$SettingsActivity$private fun setupSettingItems()</ID>
<ID>LongMethod:VideoFragment.kt$VideoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
<ID>LongMethod:VideoPlayerActivity.kt$VideoPlayerActivity$private fun handleEvent(event: MotionEvent)</ID>
<ID>LongMethod:ViewPagerActivity.kt$ViewPagerActivity$private fun initBottomActionButtons()</ID>
<ID>LongMethod:ViewPagerActivity.kt$ViewPagerActivity$private fun initContinue()</ID>
<ID>LongParameterList:Context.kt$( path: String, curMedia: ArrayList&lt;Medium&gt;, albumCovers: ArrayList&lt;AlbumCover&gt;, hiddenString: String, includedFolders: MutableSet&lt;String&gt;, getProperFileSize: Boolean, noMediaFolders: ArrayList&lt;String&gt;, )</ID>
<ID>LongParameterList:Context.kt$( path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, crossFadeDuration: Int = THUMBNAIL_FADE_DURATION_MS, )</ID>
<ID>LongParameterList:Context.kt$( path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, skipMemoryCacheAtPaths: ArrayList&lt;String&gt;? = null, animate: Boolean = false, tryLoadingWithPicasso: Boolean = false, crossFadeDuration: Int = THUMBNAIL_FADE_DURATION_MS, onError: (() -&gt; Unit)? = null )</ID>
<ID>LongParameterList:Context.kt$( type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey, skipMemoryCacheAtPaths: ArrayList&lt;String&gt;? = null, onError: (() -&gt; Unit)? = null )</ID>
<ID>LongParameterList:Context.kt$(path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -&gt; Unit)</ID>
<ID>LongParameterList:DirectoryAdapter.kt$DirectoryAdapter$( activity: BaseSimpleActivity, var dirs: ArrayList&lt;Directory&gt;, val listener: DirectoryOperationsListener?, recyclerView: MyRecyclerView, val isPickIntent: Boolean, val swipeRefreshLayout: SwipeRefreshLayout? = null, itemClick: (Any) -&gt; Unit )</ID>
<ID>LongParameterList:DirectoryDao.kt$DirectoryDao$(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int, sortValue: String)</ID>
<ID>LongParameterList:MediaAdapter.kt$MediaAdapter$( activity: BaseSimpleActivity, var media: ArrayList&lt;ThumbnailItem&gt;, val listener: MediaOperationsListener?, val isAGetIntent: Boolean, val allowMultiplePicks: Boolean, val path: String, recyclerView: MyRecyclerView, itemClick: (Any) -&gt; Unit )</ID>
<ID>LongParameterList:MediaFetcher.kt$MediaFetcher$( curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean, lastModifieds: HashMap&lt;String, Long&gt;, dateTakens: HashMap&lt;String, Long&gt;, android11Files: HashMap&lt;String, ArrayList&lt;Medium&gt;&gt;? )</ID>
<ID>LongParameterList:MediaFetcher.kt$MediaFetcher$( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean )</ID>
<ID>LongParameterList:MediaFetcher.kt$MediaFetcher$( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean, lastModifieds: HashMap&lt;String, Long&gt;, dateTakens: HashMap&lt;String, Long&gt; )</ID>
<ID>LongParameterList:MediaFetcher.kt$MediaFetcher$( isPickImage: Boolean, isPickVideo: Boolean, favoritePaths: ArrayList&lt;String&gt;, getFavoritePathsOnly: Boolean, getProperDateTaken: Boolean, dateTakens: HashMap&lt;String, Long&gt; )</ID>
<ID>LongParameterList:MediaSideScroll.kt$MediaSideScroll$( activity: Activity, slideInfoView: TextView, isBrightness: Boolean, parentView: ViewGroup?, singleTap: (x: Float, y: Float) -&gt; Unit, doubleTap: ((x: Float, y: Float) -&gt; Unit)? = null )</ID>
<ID>LongParameterList:PickDirectoryDialog.kt$PickDirectoryDialog$( val activity: BaseSimpleActivity, val sourcePath: String, showOtherFolderButton: Boolean, val showFavoritesBin: Boolean, val isPickingCopyMoveDestination: Boolean, val isPickingFolderForWidget: Boolean, val callback: (path: String) -&gt; Unit )</ID>
<ID>LoopWithTooManyJumpStatements:Activity.kt$for</ID>
<ID>LoopWithTooManyJumpStatements:Context.kt$for</ID>
<ID>LoopWithTooManyJumpStatements:MediaFetcher.kt$MediaFetcher$for</ID>
<ID>LoopWithTooManyJumpStatements:String.kt$for</ID>
<ID>LoopWithTooManyJumpStatements:String.kt$while</ID>
<ID>MagicNumber:Activity.kt$10</ID>
<ID>MagicNumber:Activity.kt$1000</ID>
<ID>MagicNumber:Activity.kt$11</ID>
<ID>MagicNumber:Activity.kt$360</ID>
<ID>MagicNumber:Activity.kt$4</ID>
<ID>MagicNumber:Activity.kt$5</ID>
<ID>MagicNumber:Activity.kt$50</ID>
<ID>MagicNumber:Activity.kt$90</ID>
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$16</ID>
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$32</ID>
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$4</ID>
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$64</ID>
<ID>MagicNumber:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$8</ID>
<ID>MagicNumber:ChangeFolderThumbnailStyleDialog.kt$ChangeFolderThumbnailStyleDialog$36</ID>
<ID>MagicNumber:Config.kt$Config$0.05f</ID>
<ID>MagicNumber:Config.kt$Config$0.5f</ID>
<ID>MagicNumber:Config.kt$Config$50</ID>
<ID>MagicNumber:Context.kt$1000L</ID>
<ID>MagicNumber:Context.kt$1024</ID>
<ID>MagicNumber:Context.kt$50</ID>
<ID>MagicNumber:Context.kt$8</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$0.03f</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$100</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$100f</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$16f</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$180</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$3f</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$4f</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$90</ID>
<ID>MagicNumber:EditActivity.kt$EditActivity$9f</ID>
<ID>MagicNumber:EditorDrawCanvas.kt$EditorDrawCanvas$100f</ID>
<ID>MagicNumber:EditorDrawCanvas.kt$EditorDrawCanvas$40f</ID>
<ID>MagicNumber:FilterThumbnailsManager.kt$FilterThumbnailsManager$10</ID>
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$10</ID>
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$4</ID>
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$5</ID>
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$6</ID>
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$7</ID>
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$8</ID>
<ID>MagicNumber:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$9</ID>
<ID>MagicNumber:IsoTypeReader.kt$IsoTypeReader$32</ID>
<ID>MagicNumber:IsoTypeReader.kt$IsoTypeReader$4</ID>
<ID>MagicNumber:MainActivity.kt$MainActivity$1000</ID>
<ID>MagicNumber:MainActivity.kt$MainActivity$30</ID>
<ID>MagicNumber:MainActivity.kt$MainActivity$3000L</ID>
<ID>MagicNumber:MainActivity.kt$MainActivity$50</ID>
<ID>MagicNumber:MainActivity.kt$MainActivity$500</ID>
<ID>MagicNumber:MediaActivity.kt$MediaActivity$3000L</ID>
<ID>MagicNumber:MediaAdapter.kt$MediaAdapter$180</ID>
<ID>MagicNumber:MediaAdapter.kt$MediaAdapter$270</ID>
<ID>MagicNumber:MediaAdapter.kt$MediaAdapter$90</ID>
<ID>MagicNumber:MediaFetcher.kt$MediaFetcher$10</ID>
<ID>MagicNumber:MediaFetcher.kt$MediaFetcher$1000</ID>
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$100</ID>
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$1000L</ID>
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$100f</ID>
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$2.55</ID>
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$255f</ID>
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$3</ID>
<ID>MagicNumber:MediaSideScroll.kt$MediaSideScroll$70</ID>
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$16f</ID>
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$19f</ID>
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$3f</ID>
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$4f</ID>
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$5f</ID>
<ID>MagicNumber:OtherAspectRatioDialog.kt$OtherAspectRatioDialog$9f</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$0.01</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$100</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$100L</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$10f</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$180</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$270</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$300</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$360</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$400</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$4096</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$50</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$7</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment$90</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$270</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$360</ID>
<ID>MagicNumber:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$90</ID>
<ID>MagicNumber:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$0.05f</ID>
<ID>MagicNumber:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$0.25f</ID>
<ID>MagicNumber:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$100</ID>
<ID>MagicNumber:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$3f</ID>
<ID>MagicNumber:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$0.6f</ID>
<ID>MagicNumber:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$10</ID>
<ID>MagicNumber:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$100</ID>
<ID>MagicNumber:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$90</ID>
<ID>MagicNumber:SetWallpaperActivity.kt$SetWallpaperActivity$90</ID>
<ID>MagicNumber:VideoFragment.kt$VideoFragment$1000</ID>
<ID>MagicNumber:VideoFragment.kt$VideoFragment$1000L</ID>
<ID>MagicNumber:VideoFragment.kt$VideoFragment$1000f</ID>
<ID>MagicNumber:VideoFragment.kt$VideoFragment$7</ID>
<ID>MagicNumber:VideoFragment.kt$VideoFragment.&lt;no name provided&gt;$1000</ID>
<ID>MagicNumber:VideoFragment.kt$VideoFragment.&lt;no name provided&gt;$7</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$0.5</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$0.8</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$100</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$1000</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$1000L</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$1000f</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$100L</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$100f</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity$7</ID>
<ID>MagicNumber:VideoPlayerActivity.kt$VideoPlayerActivity.&lt;no name provided&gt;$1000</ID>
<ID>MagicNumber:ViewPagerActivity.kt$ViewPagerActivity$1000L</ID>
<ID>MagicNumber:ViewPagerActivity.kt$ViewPagerActivity$180</ID>
<ID>MagicNumber:ViewPagerActivity.kt$ViewPagerActivity$5</ID>
<ID>MagicNumber:ViewPagerActivity.kt$ViewPagerActivity$90</ID>
<ID>MagicNumber:ViewPagerFragment.kt$ViewPagerFragment$1000L</ID>
<ID>MagicNumber:ViewPagerFragment.kt$ViewPagerFragment$100f</ID>
<ID>MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$100</ID>
<ID>MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$100f</ID>
<ID>MagicNumber:WidgetConfigureActivity.kt$WidgetConfigureActivity$255f</ID>
<ID>MaxLineLength:Activity.kt$LICENSE_PICASSO</ID>
<ID>MaxLineLength:Activity.kt$copyMoveFilesTo(fileDirItems, source.trimEnd('/'), destination, isCopyOperation, true, config.shouldShowHidden, callback)</ID>
<ID>MaxLineLength:Activity.kt$faqItems.add(0, FAQItem(R.string.faq_16_title, "${getString(R.string.faq_16_text)} ${getString(R.string.faq_16_text_extra)}"))</ID>
<ID>MaxLineLength:Activity.kt$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_10_title_commons, org.fossify.commons.R.string.faq_10_text_commons))</ID>
<ID>MaxLineLength:Activity.kt$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_2_title_commons, org.fossify.commons.R.string.faq_2_text_commons))</ID>
<ID>MaxLineLength:Activity.kt$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_6_title_commons, org.fossify.commons.R.string.faq_6_text_commons))</ID>
<ID>MaxLineLength:Activity.kt$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_7_title_commons, org.fossify.commons.R.string.faq_7_text_commons))</ID>
<ID>MaxLineLength:Activity.kt$fun</ID>
<ID>MaxLineLength:Activity.kt$mediaDB.updateDeleted(destination.removePrefix(recycleBinPath), 0, "$RECYCLE_BIN${source.removePrefix(recycleBinPath)}")</ID>
<ID>MaxLineLength:Activity.kt$return (realDisplayMetrics.widthPixels - displayMetrics.widthPixels &gt; 0) || (realDisplayMetrics.heightPixels - displayMetrics.heightPixels &gt; 0)</ID>
<ID>MaxLineLength:Activity.kt$toast(if (didUpdateFile) R.string.dates_fixed_successfully else org.fossify.commons.R.string.unknown_error_occurred)</ID>
<ID>MaxLineLength:Activity.kt$val</ID>
<ID>MaxLineLength:Activity.kt$}</ID>
<ID>MaxLineLength:AllFilesPermissionDialog.kt$AllFilesPermissionDialog$val activity: BaseSimpleActivity</ID>
<ID>MaxLineLength:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$dialogFileStyleShowThumbnailFileTypesHolder.setOnClickListener { dialogFileStyleShowThumbnailFileTypes.toggle() }</ID>
<ID>MaxLineLength:ChangeFileThumbnailStyleDialog.kt$ChangeFileThumbnailStyleDialog$dialogFileStyleShowThumbnailVideoDurationHolder.setOnClickListener { dialogFileStyleShowThumbnailVideoDuration.toggle() }</ID>
<ID>MaxLineLength:ChangeFolderThumbnailStyleDialog.kt$ChangeFolderThumbnailStyleDialog$class</ID>
<ID>MaxLineLength:ChangeFolderThumbnailStyleDialog.kt$ChangeFolderThumbnailStyleDialog$val cornerRadius = root.resources.getDimension(org.fossify.commons.R.dimen.rounded_corner_radius_big).toInt()</ID>
<ID>MaxLineLength:ChangeFolderThumbnailStyleDialog.kt$ChangeFolderThumbnailStyleDialog$val useRoundedCornersLayout = binding.dialogRadioFolderStyle.checkedRadioButtonId == R.id.dialog_radio_folder_rounded_corners</ID>
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$binding.sortingDialogOrderDivider.beVisibleIf(binding.sortingDialogNumericSorting.isVisible() || binding.sortingDialogUseForThisFolder.isVisible())</ID>
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$sortingDialogNumericSorting.beVisibleIf(showFolderCheckbox &amp;&amp; (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))</ID>
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$sortingDialogOrderDivider.beVisibleIf(showFolderCheckbox || (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))</ID>
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$val hideSortOrder = checkedId == binding.sortingDialogRadioCustom.id || checkedId == binding.sortingDialogRadioRandom.id</ID>
<ID>MaxLineLength:ChangeSortingDialog.kt$ChangeSortingDialog$val isSortingByNameOrPath = checkedId == binding.sortingDialogRadioName.id || checkedId == binding.sortingDialogRadioPath.id</ID>
<ID>MaxLineLength:ChangeViewTypeDialog.kt$ChangeViewTypeDialog$class</ID>
<ID>MaxLineLength:ChangeViewTypeDialog.kt$ChangeViewTypeDialog$val</ID>
<ID>MaxLineLength:Config.kt$Config$fun getFolderViewType(path: String)</ID>
<ID>MaxLineLength:Config.kt$Config$fun getLastVideoPosition(path: String)</ID>
<ID>MaxLineLength:Config.kt$Config$set(allowRotatingWithGestures) = prefs.edit().putBoolean(ALLOW_ROTATING_WITH_GESTURES, allowRotatingWithGestures).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(avoidShowingAllFilesPrompt) = prefs.edit().putBoolean(AVOID_SHOWING_ALL_FILES_PROMPT, avoidShowingAllFilesPrompt).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(excludedFolders) = prefs.edit().remove(EXCLUDED_FOLDERS).putStringSet(EXCLUDED_FOLDERS, excludedFolders).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(includedFolders) = prefs.edit().remove(INCLUDED_FOLDERS).putStringSet(INCLUDED_FOLDERS, includedFolders).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(isExcludedPasswordProtectionOn) = prefs.edit().putBoolean(EXCLUDED_PASSWORD_PROTECTION, isExcludedPasswordProtectionOn).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(lastEditorCropAspectRatio) = prefs.edit().putInt(LAST_EDITOR_CROP_ASPECT_RATIO, lastEditorCropAspectRatio).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(lastEditorCropOtherAspectRatioX) = prefs.edit().putFloat(LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_X, lastEditorCropOtherAspectRatioX).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(lastEditorCropOtherAspectRatioY) = prefs.edit().putFloat(LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_Y, lastEditorCropOtherAspectRatioY).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(lastExportedFavoritesFolder) = prefs.edit().putString(LAST_EXPORTED_FAVORITES_FOLDER, lastExportedFavoritesFolder).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(openVideosOnSeparateScreen) = prefs.edit().putBoolean(OPEN_VIDEOS_ON_SEPARATE_SCREEN, openVideosOnSeparateScreen).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(searchAllFilesByDefault) = prefs.edit().putBoolean(SEARCH_ALL_FILES_BY_DEFAULT, searchAllFilesByDefault).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(showPermissionRationale) = prefs.edit().putBoolean(SHOW_PERMISSION_RATIONALE, showPermissionRationale).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(showRecycleBinAtFolders) = prefs.edit().putBoolean(SHOW_RECYCLE_BIN_AT_FOLDERS, showRecycleBinAtFolders).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(showThumbnailVideoDuration) = prefs.edit().putBoolean(SHOW_THUMBNAIL_VIDEO_DURATION, showThumbnailVideoDuration).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(tempSkipDeleteConfirmation) = prefs.edit().putBoolean(TEMP_SKIP_DELETE_CONFIRMATION, tempSkipDeleteConfirmation).apply()</ID>
<ID>MaxLineLength:Config.kt$Config$set(temporarilyShowExcluded) = prefs.edit().putBoolean(TEMPORARILY_SHOW_EXCLUDED, temporarilyShowExcluded).apply()</ID>
<ID>MaxLineLength:Constants.kt$const val DEFAULT_BOTTOM_ACTIONS = BOTTOM_ACTION_TOGGLE_FAVORITE or BOTTOM_ACTION_EDIT or BOTTOM_ACTION_SHARE or BOTTOM_ACTION_DELETE</ID>
<ID>MaxLineLength:Context.kt$// but /storage/emulated/0/Pictures is empty, still Pictures with the first folders thumbnails and proper other info</ID>
<ID>MaxLineLength:Context.kt$&lt;no name provided&gt;$override</ID>
<ID>MaxLineLength:Context.kt$AlphanumericComparator().compare(o1.sortValue.lowercase(Locale.getDefault()), o2.sortValue.lowercase(Locale.getDefault()))</ID>
<ID>MaxLineLength:Context.kt$GetMediaAsynctask</ID>
<ID>MaxLineLength:Context.kt$MultiTransformation(WebpDrawableTransformation(CenterCrop()), WebpDrawableTransformation(roundedCornersTransform))</ID>
<ID>MaxLineLength:Context.kt$allDirs.firstOrNull { parentDirs.firstOrNull { it.path.equals(currentPathPrefix, true) } == null &amp;&amp; it.path.equals(currentPathPrefix, true) }</ID>
<ID>MaxLineLength:Context.kt$dirsToCheck.filter { !it.areFavorites() &amp;&amp; !it.isRecycleBin() &amp;&amp; !getDoesFilePathExist(it.path, OTGPath) &amp;&amp; it.path != config.tempFolderPath }</ID>
<ID>MaxLineLength:Context.kt$fun</ID>
<ID>MaxLineLength:Context.kt$if</ID>
<ID>MaxLineLength:Context.kt$if (roundCorners == ROUNDED_CORNERS_SMALL) org.fossify.commons.R.dimen.rounded_corner_radius_small else org.fossify.commons.R.dimen.rounded_corner_radius_big</ID>
<ID>MaxLineLength:Context.kt$it.path</ID>
<ID>MaxLineLength:Context.kt$null</ID>
<ID>MaxLineLength:Context.kt$o1.sortValue.normalizeString().lowercase(Locale.getDefault()).compareTo(o2.sortValue.normalizeString().lowercase(Locale.getDefault()))</ID>
<ID>MaxLineLength:Context.kt$return</ID>
<ID>MaxLineLength:Context.kt$return Directory(null, path, thumbnail!!, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes, sortValue)</ID>
<ID>MaxLineLength:Context.kt$sorting and SORT_BY_DATE_MODIFIED != 0 -&gt; (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)</ID>
<ID>MaxLineLength:Context.kt$sorting and SORT_BY_SIZE != 0 -&gt; (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)</ID>
<ID>MaxLineLength:Context.kt$val</ID>
<ID>MaxLineLength:Context.kt$val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)</ID>
<ID>MaxLineLength:Context.kt$val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)</ID>
<ID>MaxLineLength:Context.kt$val lastModified = if (isSortingAscending) Math.min(firstItem.modified, lastItem.modified) else Math.max(firstItem.modified, lastItem.modified)</ID>
<ID>MaxLineLength:Context.kt$val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0, "")</ID>
<ID>MaxLineLength:Context.kt$}</ID>
<ID>MaxLineLength:CustomAspectRatioDialog.kt$CustomAspectRatioDialog$val activity: BaseSimpleActivity</ID>
<ID>MaxLineLength:DateTakensDao.kt$DateTakensDao$@Query("SELECT full_path, filename, parent_path, date_taken, last_fixed, last_modified FROM date_takens WHERE parent_path = :path COLLATE NOCASE")</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$(!isRPlus() || isExternalStorageManager()) &amp;&amp; selectedPaths.any { !it.doesThisOrParentHaveNoMedia(HashMap(), null) }</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$(!isRPlus() || isExternalStorageManager()) &amp;&amp; selectedPaths.any { it.doesThisOrParentHaveNoMedia(HashMap(), null) }</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract, RecyclerViewFastScroller.OnPopupTextUpdate</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$activity.directoryDB.updateDirectoryAfterRename(firstDir.tmb, firstDir.name, firstDir.path, sourcePath)</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$activity: BaseSimpleActivity</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$dirLocation.setImageResource(if (directory.location == LOCATION_SD) org.fossify.commons.R.drawable.ic_sd_card_vector else org.fossify.commons.R.drawable.ic_usb_vector)</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$dirThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$findItem(R.id.cab_empty_disable_recycle_bin).isVisible = isOneItemSelected &amp;&amp; selectedPaths.first() == RECYCLE_BIN</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$findItem(R.id.cab_rename).isVisible = !selectedPaths.contains(FAVORITES) &amp;&amp; !selectedPaths.contains(RECYCLE_BIN)</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$override fun onChange(position: Int)</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$paths.filter { config.isFolderProtected(it) &amp;&amp; config.getFolderProtectionType(it) == tabToShow &amp;&amp; config.getFolderProtectionHash(it) == hashToCheck }</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$private</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$private fun getAlbumCoversWithout(path: String)</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$selectedPaths.filter { it != FAVORITES &amp;&amp; it != RECYCLE_BIN &amp;&amp; (selectedPaths.size == 1 || !config.isFolderProtected(it)) }</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$val</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$val paths = getSelectedPaths().filter { !activity.isAStorageRootFolder(it) &amp;&amp; !config.isFolderProtected(it) } as ArrayList&lt;String&gt;</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$val removeDir = directory.path.doesThisOrParentHaveNoMedia(HashMap(), null) &amp;&amp; !includedFolders.contains(directory.path)</ID>
<ID>MaxLineLength:DirectoryAdapter.kt$DirectoryAdapter$val warning = resources.getQuantityString(org.fossify.commons.R.plurals.delete_warning, itemsCnt, itemsCnt)</ID>
<ID>MaxLineLength:DirectoryDao.kt$DirectoryDao$@Query("SELECT path, thumbnail, filename, media_count, last_modified, date_taken, size, location, media_types, sort_value FROM directories")</ID>
<ID>MaxLineLength:DirectoryDao.kt$DirectoryDao$@Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes, sort_value = :sortValue WHERE path = :path COLLATE NOCASE")</ID>
<ID>MaxLineLength:DirectoryDao.kt$DirectoryDao$@Query("UPDATE directories SET thumbnail = :thumbnail, filename = :name, path = :newPath WHERE path = :oldPath COLLATE NOCASE")</ID>
<ID>MaxLineLength:DirectoryDao.kt$DirectoryDao$fun</ID>
<ID>MaxLineLength:DirectoryItemBinding.kt$GridDirectoryItemRoundedCornersBinding$class</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$(binding.bottomEditorCropRotateActions.root.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1)</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$binding.bottomEditorDrawActions.bottomDrawWidth.setColors(getProperTextColor(), getProperPrimaryColor(), getProperBackgroundColor())</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$if</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$if (intent.extras?.containsKey(REAL_FILE_PATH) == true) intent.getStringExtra(REAL_FILE_PATH)?.getParentPath() else internalStoragePath</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true &amp;&amp; intent.extras!!.get(MediaStore.EXTRA_OUTPUT) is Uri -&gt; intent.extras!!.get(MediaStore.EXTRA_OUTPUT) as Uri</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$newPath = "$internalStoragePath/${getCurrentFormattedDateTime()}.${saveUri.toString().getFilenameExtension()}"</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$private fun getFiltersAdapter()</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$val layoutManager = binding.bottomEditorFilterActions.bottomActionsFilterList.layoutManager as LinearLayoutManager</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$val originalBitmap = Glide.with(applicationContext).asBitmap().load(uri).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity$}</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity.&lt;no name provided&gt;$if</ID>
<ID>MaxLineLength:EditActivity.kt$EditActivity.&lt;no name provided&gt;$override</ID>
<ID>MaxLineLength:ExcludeFolderDialog.kt$ExcludeFolderDialog$radioGroup!!.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))</ID>
<ID>MaxLineLength:ExcludeFolderDialog.kt$ExcludeFolderDialog$val path = if (alternativePaths.isEmpty()) selectedPaths[0] else alternativePaths[radioGroup!!.checkedRadioButtonId]</ID>
<ID>MaxLineLength:ExcludedFoldersActivity.kt$ExcludedFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:FavoritesDao.kt$FavoritesDao$@Query("SELECT favorites.full_path FROM favorites INNER JOIN media ON favorites.full_path = media.full_path WHERE media.deleted_ts = 0")</ID>
<ID>MaxLineLength:FavoritesDao.kt$FavoritesDao$@Query("UPDATE OR REPLACE favorites SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath COLLATE NOCASE")</ID>
<ID>MaxLineLength:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$database.execSQL("CREATE TABLE IF NOT EXISTS `date_takens` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `full_path` TEXT NOT NULL, `filename` TEXT NOT NULL, `parent_path` TEXT NOT NULL, `date_taken` INTEGER NOT NULL, `last_fixed` INTEGER NOT NULL)")</ID>
<ID>MaxLineLength:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$database.execSQL("CREATE TABLE IF NOT EXISTS `favorites` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `full_path` TEXT NOT NULL, `filename` TEXT NOT NULL, `parent_path` TEXT NOT NULL)")</ID>
<ID>MaxLineLength:GalleryDatabase.kt$GalleryDatabase.Companion.&lt;no name provided&gt;$database.execSQL("CREATE TABLE IF NOT EXISTS `widgets` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `widget_id` INTEGER NOT NULL, `folder_path` TEXT NOT NULL)")</ID>
<ID>MaxLineLength:GetMediaAsynctask.kt$GetMediaAsynctask$mPath</ID>
<ID>MaxLineLength:GetMediaAsynctask.kt$GetMediaAsynctask$val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN &amp;&amp; it != FAVORITES &amp;&amp; !context.config.isFolderProtected(it) }</ID>
<ID>MaxLineLength:GrantAllFilesDialog.kt$GrantAllFilesDialog$.</ID>
<ID>MaxLineLength:GridSpacingItemDecoration.kt$GridSpacingItemDecoration$override</ID>
<ID>MaxLineLength:HiddenFoldersActivity.kt$HiddenFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:IncludedFoldersActivity.kt$IncludedFoldersActivity$updateMaterialActivityViews(binding.manageFoldersCoordinator, binding.manageFoldersList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:InstantItemSwitch.kt$InstantItemSwitch$if</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$(binding.directoriesRefreshLayout.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.BELOW, R.id.directories_switch_searching)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$// exclude probably unwanted folders, for example facebook stickers are split between hundreds of separate folders like</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$// recyclerview sometimes becomes empty at init/update, triggering an invisible refresh like this seems to work fine</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$// update directories and media files in the local db, delete invalid items. Intentionally creating a new thread</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$binding.directoriesRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$dirsToShow</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) &amp;&amp; config.temporarilyShowHidden</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$folders.asSequence().filter { it.isDirectory }.map { FileDirItem(it.absolutePath, it.name, true) }.toMutableList() as ArrayList&lt;FileDirItem&gt;</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$folders.filter { !it.absolutePath.isDownloadsFolder() &amp;&amp; it.isDirectory &amp;&amp; it.toFileDirItem(this).getProperFileCount(this, true) == 0 }</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$getStorageDirectories().firstOrNull { it.trimEnd('/') != internalStoragePath &amp;&amp; it.trimEnd('/') != sdCardPath }</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$if</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$if (config.useRecycleBin &amp;&amp; !config.tempSkipRecycleBin) org.fossify.commons.R.plurals.moving_items_into_bin else org.fossify.commons.R.plurals.delete_items</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true &amp;&amp; intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$mIsThirdPartyIntent</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$private</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun isImageType(intent: Intent)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun isPickImageIntent(intent: Intent)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun isPickVideoIntent(intent: Intent)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$private fun isVideoType(intent: Intent)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$private var mOpenedSubfolders = arrayListOf("") // used at "Group direct subfolders" for navigating Up with the back button</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$resultData.extras?.containsKey(PICKED_PATHS) == true -&gt; fillPickedPaths(resultData, resultIntent)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$toast(String.format(getString(org.fossify.commons.R.string.deleting_folder), config.tempFolderPath), Toast.LENGTH_LONG)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$toast(String.format(getString(org.fossify.commons.R.string.deleting_folder), fileDirItems.first().name))</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$val android11Files = mLastMediaFetcher?.getAndroid11FolderMedia(getImagesOnly, getVideosOnly, favoritePaths, false, true, dateTakens)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$val filesToDelete = mediaDB.getOldRecycleBinItems(System.currentTimeMillis() - MONTH_MILLISECONDS)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)</ID>
<ID>MaxLineLength:ManageFoldersAdapter.kt$ManageFoldersAdapter$activity: BaseSimpleActivity</ID>
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)</ID>
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)</ID>
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) &amp;&amp; config.temporarilyShowHidden</ID>
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$this</ID>
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$updateMaterialActivityViews(binding.mediaCoordinator, binding.mediaGrid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true)</ID>
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$val deletingItems = resources.getQuantityString(org.fossify.commons.R.plurals.deleting_items, filtered.size, filtered.size)</ID>
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$val movingItems = resources.getQuantityString(org.fossify.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)</ID>
<ID>MaxLineLength:MediaActivity.kt$MediaActivity$val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$activity: BaseSimpleActivity</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$findItem(R.id.cab_confirm_selection).isVisible = isAGetIntent &amp;&amp; allowMultiplePicks &amp;&amp; selectedKeys.isNotEmpty()</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$findItem(R.id.cab_restore_recycle_bin_files).isVisible = selectedPaths.all { it.startsWith(activity.recycleBinPath) }</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$if (config.useRecycleBin &amp;&amp; !config.tempSkipRecycleBin &amp;&amp; !isRecycleBin) org.fossify.commons.R.string.move_to_recycle_bin_confirmation else org.fossify.commons.R.string.deletion_confirmation</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$mediumThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$menu.findItem(R.id.cab_add_to_favorites).isVisible = selectedItems.none { it.getIsInRecycleBin() } &amp;&amp; selectedItems.any { !it.isFavorite }</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$menu.findItem(R.id.cab_hide).isVisible = (!isRPlus() || isExternalStorageManager()) &amp;&amp; !isInRecycleBin &amp;&amp; selectedItems.any { !it.isHidden() }</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$menu.findItem(R.id.cab_remove_from_favorites).isVisible = selectedItems.none { it.getIsInRecycleBin() } &amp;&amp; selectedItems.any { it.isFavorite }</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$menu.findItem(R.id.cab_unhide).isVisible = (!isRPlus() || isExternalStorageManager()) &amp;&amp; !isInRecycleBin &amp;&amp; selectedItems.any { it.isHidden() }</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$private fun getItemWithKey(key: Int): Medium?</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$val SAFPath = selectedPaths.firstOrNull { activity.needsStupidWritePermissions(it) } ?: getFirstSelectedItemPath() ?: return</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$val deleteItemsString = resources.getQuantityString(org.fossify.commons.R.plurals.delete_items, itemsCnt, itemsCnt)</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$val isSDOrOtgRootFolder = activity.isAStorageRootFolder(firstPath.getParentPath()) &amp;&amp; !firstPath.startsWith(activity.internalStoragePath)</ID>
<ID>MaxLineLength:MediaAdapter.kt$MediaAdapter$val sdk30SAFPath = selectedPaths.firstOrNull { activity.isAccessibleWithSAFSdk30(it) } ?: getFirstSelectedItemPath() ?: return@handleSAFDialog</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$AlphanumericComparator().compare(o1.name.normalizeString().lowercase(Locale.getDefault()), o2.name.normalizeString().lowercase(Locale.getDefault()))</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$AlphanumericComparator().compare(o1.path.lowercase(Locale.getDefault()), o2.path.lowercase(Locale.getDefault()))</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$FAVORITES -&gt; favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toMutableList() as ArrayList&lt;File&gt;</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$Medium(null, filename, path, path.getParentPath(), lastModified, dateTaken, size, type, videoDuration, isFavorite, 0L, mediaStoreId)</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$curPath</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$curPath: String</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$favoritePaths</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", "${context.config.OTGPath}/")</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$getAndroid11FolderMedia(isPickImage, isPickVideo, favoritePaths, true, getProperDateTaken, dateTakens.clone() as HashMap&lt;String, Long&gt;)</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 || grouping and GROUP_BY_DATE_TAKEN_DAILY != 0</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0 || grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0 -&gt; formatDate(key, false)</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$it</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$lastModifieds: HashMap&lt;String, Long&gt;</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$o1.name.normalizeString().lowercase(Locale.getDefault()).compareTo(o2.name.normalizeString().lowercase(Locale.getDefault()))</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val cover = portraitFiles.firstOrNull { it.name.contains("cover", true) } ?: portraitFiles.firstOrNull()</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val files = getAndroid11FolderMedia(isPickImage, isPickVideo, favoritePaths, false, getProperDateTaken, dateTakens)</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val foldersToScan = config.everShownFolders.filter { it == FAVORITES || it == RECYCLE_BIN || context.getDoesFilePathExist(it, OTGPath) }.toHashSet()</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val medium = Medium(null, filename, path, file.parent, lastModified, dateTaken, size, type, videoDuration, isFavorite, 0L, 0L)</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type, videoDuration, isFavorite, 0L, 0L)</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia, favoritePaths, getVideoDurations)</ID>
<ID>MaxLineLength:MediaFetcher.kt$MediaFetcher$val videoDuration = Math.round(cursor.getIntValue(MediaStore.MediaColumns.DURATION) / 1000.toDouble()).toInt()</ID>
<ID>MaxLineLength:MediaSideScroll.kt$MediaSideScroll$activity: Activity</ID>
<ID>MaxLineLength:Medium.kt$Medium$fun isHeic()</ID>
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts, media_store_id FROM media WHERE deleted_ts != 0")</ID>
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts, media_store_id FROM media WHERE deleted_ts &lt; :timestmap AND deleted_ts != 0")</ID>
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts, media_store_id FROM media WHERE deleted_ts = 0 AND is_favorite = 1")</ID>
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, video_duration, is_favorite, deleted_ts, media_store_id FROM media WHERE deleted_ts = 0 AND parent_path = :path COLLATE NOCASE")</ID>
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("UPDATE OR REPLACE media SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath COLLATE NOCASE")</ID>
<ID>MaxLineLength:MediumDao.kt$MediumDao$@Query("UPDATE OR REPLACE media SET full_path = :newPath, deleted_ts = :deletedTS WHERE full_path = :oldPath COLLATE NOCASE")</ID>
<ID>MaxLineLength:MyPagerAdapter.kt$MyPagerAdapter$class</ID>
<ID>MaxLineLength:MyWidgetProvider.kt$MyWidgetProvider$override</ID>
<ID>MaxLineLength:MyWidgetProvider.kt$MyWidgetProvider$val pendingIntent = PendingIntent.getActivity(context, widget.widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:NewPhotoFetcher.kt$NewPhotoFetcher$if</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$if</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$mIsFullscreen = requireActivity().window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$orient = exif2.getTag(ExifInterface.TAG_ORIENTATION)?.getValueAsInt(defaultOrientation) ?: defaultOrientation</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$resources.getDimension(R.dimen.portrait_photos_stripe_height).toInt()</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$val actionsHeight = if (requireContext().config.bottomActions &amp;&amp; !mIsFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$val imageParser = JpegImageParser().getXmpXml(ByteSourceInputStream(it, mMedium.name), HashMap&lt;String, Any&gt;())</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$var bottomMargin = requireContext().navigationBarHeight + resources.getDimension(org.fossify.commons.R.dimen.normal_margin).toInt()</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment$var pathToLoad = if (getFilePathToShow().startsWith("content://")) getFilePathToShow() else "file://${getFilePathToShow()}"</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$binding.gesturesView.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || allowZoomingImages == false</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$override</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$setTextColor(if (context.config.blackBackground) Color.WHITE else context.getProperTextColor())</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$val useHeight = if (mImageOrientation == ORIENTATION_ROTATE_90 || mImageOrientation == ORIENTATION_ROTATE_270) sWidth else sHeight</ID>
<ID>MaxLineLength:PhotoFragment.kt$PhotoFragment.&lt;no name provided&gt;$val useWidth = if (mImageOrientation == ORIENTATION_ROTATE_90 || mImageOrientation == ORIENTATION_ROTATE_270) sHeight else sWidth</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.bottomEdit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 &amp;&amp; mMedium?.isImage() == true)</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.bottomSetAs.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0 &amp;&amp; mMedium?.isImage() == true)</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$binding.fragmentViewerToolbar.title = Html.fromHtml("&lt;font color='${Color.WHITE.toHex()}'&gt;${mMedium!!.name}&lt;/font&gt;")</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true &amp;&amp; mUri?.scheme == "file" &amp;&amp; visibleBottomActions and BOTTOM_ACTION_EDIT == 0</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" &amp;&amp; visibleBottomActions and BOTTOM_ACTION_PROPERTIES == 0</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$findItem(R.id.menu_set_as).isVisible = mMedium?.isImage() == true &amp;&amp; visibleBottomActions and BOTTOM_ACTION_SET_AS == 0</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$if</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$mMedium = Medium(null, filename, mUri.toString(), mUri!!.path!!.getParentPath(), 0, 0, file.length(), type, 0, false, 0L, 0)</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$navigationIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)</ID>
<ID>MaxLineLength:PhotoVideoActivity.kt$PhotoVideoActivity$val isFileFolderHidden = (File(realPath).isHidden || File(realPath.getParentPath(), NOMEDIA).exists() || realPath.contains("/."))</ID>
<ID>MaxLineLength:PicassoRegionDecoder.kt$PicassoRegionDecoder$if</ID>
<ID>MaxLineLength:PicassoRegionDecoder.kt$PicassoRegionDecoder$return bitmap ?: throw RuntimeException("Region decoder returned null bitmap - image format may not be supported")</ID>
<ID>MaxLineLength:PickDirectoryDialog.kt$PickDirectoryDialog$activity</ID>
<ID>MaxLineLength:PickDirectoryDialog.kt$PickDirectoryDialog$orientation = if (activity.config.scrollHorizontally &amp;&amp; isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL</ID>
<ID>MaxLineLength:PickDirectoryDialog.kt$PickDirectoryDialog$val</ID>
<ID>MaxLineLength:PickDirectoryDialog.kt$PickDirectoryDialog$}</ID>
<ID>MaxLineLength:PickMediumDialog.kt$PickMediumDialog$activity</ID>
<ID>MaxLineLength:PickMediumDialog.kt$PickMediumDialog$orientation = if (config.scrollHorizontally &amp;&amp; isGridViewType) RecyclerView.HORIZONTAL else RecyclerView.VERTICAL</ID>
<ID>MaxLineLength:PickMediumDialog.kt$PickMediumDialog$val</ID>
<ID>MaxLineLength:PickMediumDialog.kt$PickMediumDialog$val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)</ID>
<ID>MaxLineLength:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$val background = ResourcesCompat.getDrawable(resources, org.fossify.commons.R.drawable.bottom_sheet_bg, requireContext().theme)</ID>
<ID>MaxLineLength:PortraitPhotosAdapter.kt$PortraitPhotosAdapter$class</ID>
<ID>MaxLineLength:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$toast(resources.getQuantityString(R.plurals.failed_to_resize_images, failureCount, failureCount))</ID>
<ID>MaxLineLength:ResizeWithPathDialog.kt$ResizeWithPathDialog$class</ID>
<ID>MaxLineLength:ResizeWithPathDialog.kt$ResizeWithPathDialog$val title = String.format(activity.getString(org.fossify.commons.R.string.file_already_exists_overwrite), newFilename)</ID>
<ID>MaxLineLength:SaveAsDialog.kt$SaveAsDialog$val activity: BaseSimpleActivity</ID>
<ID>MaxLineLength:SaveAsDialog.kt$SaveAsDialog$val title = String.format(activity.getString(org.fossify.commons.R.string.file_already_exists_overwrite), newFilename)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$binding.searchGrid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$binding.searchGrid.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$updateMaterialActivityViews(binding.searchCoordinator, binding.searchGrid, useTransparentNavigation = true, useTopSearchMenu = true)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val decoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, true)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val deletingItems = resources.getQuantityString(org.fossify.commons.R.plurals.deleting_items, filtered.size, filtered.size)</ID>
<ID>MaxLineLength:SearchActivity.kt$SearchActivity$val movingItems = resources.getQuantityString(org.fossify.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)</ID>
<ID>MaxLineLength:SetWallpaperActivity.kt$SetWallpaperActivity$RadioItem(WallpaperManager.FLAG_SYSTEM or WallpaperManager.FLAG_LOCK, getString(R.string.home_and_lock_screen))</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$"${getString(R.string.manage_included_folders)} (${getString(org.fossify.commons.R.string.no_permission)})"</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$"${getString(org.fossify.commons.R.string.show_hidden_items)} (${getString(org.fossify.commons.R.string.no_permission)})"</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_X -&gt; config.lastEditorCropOtherAspectRatioX = value.toString().toFloat()</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_Y -&gt; config.lastEditorCropOtherAspectRatioY = value.toString().toFloat()</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$binding.settingsExcludedItemPasswordProtectionHolder.beGoneIf(binding.settingsHiddenItemPasswordProtectionHolder.isVisible())</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$binding.settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") &amp;&amp; !isTiramisuPlus())</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$if</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$org.fossify.commons.R.string.fingerprint_setup_successfully</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$toast(if (configValues.size &gt; 0) org.fossify.commons.R.string.settings_imported_successfully else org.fossify.commons.R.string.no_entries_for_importing)</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$toast(if (importedItems &gt; 0) org.fossify.commons.R.string.importing_successful else org.fossify.commons.R.string.no_entries_for_importing)</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$}</ID>
<ID>MaxLineLength:SlideshowDialog.kt$SlideshowDialog$intervalHint.hint = activity.getString(org.fossify.commons.R.string.seconds_raw).replaceFirstChar { it.uppercaseChar() }</ID>
<ID>MaxLineLength:String.kt$folderNoMediaStatuses.getOrElse("$this/$NOMEDIA") { false } || ((!isRPlus() || isExternalStorageManager()) &amp;&amp; File(this, NOMEDIA).exists())</ID>
<ID>MaxLineLength:String.kt$fun String.isDownloadsFolder()</ID>
<ID>MaxLineLength:String.kt$val noMediaExists = folderNoMediaStatuses.getOrElse(pathToCheck, { false }) || File(pathToCheck).exists()</ID>
<ID>MaxLineLength:SvgModule.kt$SvgModule$registry.register(SVG::class.java, PictureDrawable::class.java, SvgDrawableTranscoder()).append(InputStream::class.java, SVG::class.java, SvgDecoder())</ID>
<ID>MaxLineLength:SvgSoftwareLayerSetter.kt$SvgSoftwareLayerSetter$override</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$.</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(mConfig.playbackSpeed)}x"</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$class</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$if</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$mConfig = requireContext().config</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$mIsFullscreen = activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN</ID>
<ID>MaxLineLength:VideoFragment.kt$VideoFragment$val drawableId = if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$.</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(config.playbackSpeed)}x"</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_pause_outline_vector)</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_play_outline_vector)</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.videoBrightnessController</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$binding.videoVolumeController</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$if</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$navigationIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$open</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity$val drawableId = if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector</ID>
<ID>MaxLineLength:VideoPlayerActivity.kt$VideoPlayerActivity.&lt;no name provided&gt;$override</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$!currentMedium.isFavorite &amp;&amp; visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 &amp;&amp; !currentMedium.getIsInRecycleBin()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$(!isRPlus() || isExternalStorageManager()) &amp;&amp; !currentMedium.isHidden() &amp;&amp; visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 &amp;&amp; !currentMedium.getIsInRecycleBin()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$(!isRPlus() || isExternalStorageManager()) &amp;&amp; currentMedium.isHidden() &amp;&amp; visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 &amp;&amp; !currentMedium.getIsInRecycleBin()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$// show the selected image asap, while loading the rest in the background to allow swiping between them. Might be needed at third party intents</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$GetMediaAsynctask</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomChangeOrientation.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION != 0)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomChangeOrientation.setOnLongClickListener { toast(R.string.change_orientation); true }</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomEdit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 &amp;&amp; currentMedium?.isSVG() == false)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomFavorite.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE != 0 &amp;&amp; currentMedium?.getIsInRecycleBin() == false)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomProperties.setOnLongClickListener { toast(org.fossify.commons.R.string.properties); true }</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomRename.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RENAME != 0 &amp;&amp; currentMedium?.getIsInRecycleBin() == false)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomResize.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RESIZE != 0 &amp;&amp; currentMedium?.isImage() == true)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomRotate.beVisibleIf(config.visibleBottomActions and BOTTOM_ACTION_ROTATE != 0 &amp;&amp; getCurrentMedium()?.isImage() == true)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.bottomToggleFileVisibility.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$binding.bottomActions.root.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$currentMedium.isFavorite &amp;&amp; visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 &amp;&amp; !currentMedium.getIsInRecycleBin()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 &amp;&amp; visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_edit).isVisible = visibleBottomActions and BOTTOM_ACTION_EDIT == 0 &amp;&amp; !currentMedium.isSVG()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_rename).isVisible = visibleBottomActions and BOTTOM_ACTION_RENAME == 0 &amp;&amp; !currentMedium.getIsInRecycleBin()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_resize).isVisible = visibleBottomActions and BOTTOM_ACTION_RESIZE == 0 &amp;&amp; currentMedium.isImage()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() &amp;&amp; visibleBottomActions and BOTTOM_ACTION_ROTATE == 0</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$flipSides = orientation == ExifInterface.ORIENTATION_ROTATE_90 || orientation == ExifInterface.ORIENTATION_ROTATE_270</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$if (medium.isFavorite) org.fossify.commons.R.drawable.ic_star_vector else org.fossify.commons.R.drawable.ic_star_outline_vector</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$if (medium.isHidden()) org.fossify.commons.R.drawable.ic_unhide_vector else org.fossify.commons.R.drawable.ic_hide_vector</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$it.isImage() || it.isPortrait() || (config.slideshowIncludeVideos &amp;&amp; it.isVideo() || (config.slideshowIncludeGIFs &amp;&amp; it.isGIF()))</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$navigationIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$private</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$private fun getCurrentFragment()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$private fun getCurrentMedia()</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$toast(if (currentMedium?.isHidden() == true) org.fossify.commons.R.string.unhide else org.fossify.commons.R.string.hide); true</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$val isSDOrOtgRootFolder = isAStorageRootFolder(oldPath.getParentPath()) &amp;&amp; !oldPath.startsWith(internalStoragePath)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity$val medium = Medium(null, filename, mPath, parent, ts, ts, File(mPath).length(), type, duration, isFavorite, 0, 0L)</ID>
<ID>MaxLineLength:ViewPagerActivity.kt$ViewPagerActivity.&lt;no name provided&gt;$override</ID>
<ID>MaxLineLength:ViewPagerFragment.kt$ViewPagerFragment$context!!.getResolution(file.absolutePath)?.formatAsResolution().let { if (it?.isNotEmpty() == true) details.appendLine(it) }</ID>
<ID>MaxLineLength:ViewPagerFragment.kt$ViewPagerFragment$fun getPathToLoad(medium: Medium)</ID>
<ID>MaxLineLength:ViewPagerFragment.kt$ViewPagerFragment$if</ID>
<ID>MaxLineLength:WidgetConfigureActivity.kt$WidgetConfigureActivity$if</ID>
<ID>NestedBlockDepth:Context.kt$fun Context.getDirectParentSubfolders(dirs: ArrayList&lt;Directory&gt;, currentPathPrefix: String): ArrayList&lt;Directory&gt;</ID>
<ID>NestedBlockDepth:Context.kt$fun Context.getNoMediaFoldersSync(): ArrayList&lt;String&gt;</ID>
<ID>NestedBlockDepth:Context.kt$fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -&gt; Unit)</ID>
<ID>NestedBlockDepth:Context.kt$fun Context.updateSubfolderCounts(children: ArrayList&lt;Directory&gt;, parentDirs: ArrayList&lt;Directory&gt;)</ID>
<ID>NestedBlockDepth:EditActivity.kt$EditActivity$override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult)</ID>
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?)</ID>
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$private fun getFoldersWithMedia(path: String): HashSet&lt;String&gt;</ID>
<ID>NestedBlockDepth:MainActivity.kt$MainActivity$private fun gotDirectories(newDirs: ArrayList&lt;Directory&gt;)</ID>
<ID>NestedBlockDepth:MediaFetcher.kt$MediaFetcher$fun getFilesFrom( curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean, lastModifieds: HashMap&lt;String, Long&gt;, dateTakens: HashMap&lt;String, Long&gt;, android11Files: HashMap&lt;String, ArrayList&lt;Medium&gt;&gt;? ): ArrayList&lt;Medium&gt;</ID>
<ID>NestedBlockDepth:MediaFetcher.kt$MediaFetcher$private fun getLatestFileFolders(): LinkedHashSet&lt;String&gt;</ID>
<ID>NestedBlockDepth:MediaFetcher.kt$MediaFetcher$private fun getMediaInFolder( folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList&lt;String&gt;, getVideoDurations: Boolean, lastModifieds: HashMap&lt;String, Long&gt;, dateTakens: HashMap&lt;String, Long&gt; ): ArrayList&lt;Medium&gt;</ID>
<ID>NestedBlockDepth:MediaFetcher.kt$MediaFetcher$private fun parseCursor(cursor: Cursor): LinkedHashSet&lt;String&gt;</ID>
<ID>NestedBlockDepth:MediaSideScroll.kt$MediaSideScroll$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
<ID>NestedBlockDepth:PhotoFragment.kt$PhotoFragment$override fun fullscreenToggled(isFullscreen: Boolean)</ID>
<ID>NestedBlockDepth:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
<ID>NestedBlockDepth:SettingsActivity.kt$SettingsActivity$private fun parseFile(inputStream: InputStream?)</ID>
<ID>NestedBlockDepth:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet&lt;String&gt;, includedPaths: MutableSet&lt;String&gt;, showHidden: Boolean, folderNoMediaStatuses: HashMap&lt;String, Boolean&gt;, callback: (path: String, hasNoMedia: Boolean) -&gt; Unit ): Boolean</ID>
<ID>NestedBlockDepth:VideoPlayerActivity.kt$VideoPlayerActivity$private fun handleEvent(event: MotionEvent)</ID>
<ID>NestedBlockDepth:ViewPagerActivity.kt$ViewPagerActivity$private fun getPositionInList(items: MutableList&lt;Medium&gt;): Int</ID>
<ID>ReturnCount:Context.kt$@Suppress("UNCHECKED_CAST") fun Context.getSortedDirectories(source: ArrayList&lt;Directory&gt;): ArrayList&lt;Directory&gt;</ID>
<ID>ReturnCount:Context.kt$fun Context.getDirectorySortingValue(media: ArrayList&lt;Medium&gt;, path: String, name: String, size: Long): String</ID>
<ID>ReturnCount:ExcludeFolderDialog.kt$ExcludeFolderDialog$private fun getAlternativePathsList(): List&lt;String&gt;</ID>
<ID>ReturnCount:InstantItemSwitch.kt$InstantItemSwitch$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
<ID>ReturnCount:MediaFetcher.kt$MediaFetcher$fun groupMedia(media: ArrayList&lt;Medium&gt;, path: String): ArrayList&lt;ThumbnailItem&gt;</ID>
<ID>ReturnCount:MediaSideScroll.kt$MediaSideScroll$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
<ID>ReturnCount:PhotoFragment.kt$PhotoFragment$override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View</ID>
<ID>ReturnCount:PhotoVideoActivity.kt$PhotoVideoActivity$private fun checkIntent(savedInstanceState: Bundle? = null)</ID>
<ID>ReturnCount:String.kt$fun String.shouldFolderBeVisible( excludedPaths: MutableSet&lt;String&gt;, includedPaths: MutableSet&lt;String&gt;, showHidden: Boolean, folderNoMediaStatuses: HashMap&lt;String, Boolean&gt;, callback: (path: String, hasNoMedia: Boolean) -&gt; Unit ): Boolean</ID>
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun getPositionInList(items: MutableList&lt;Medium&gt;): Int</ID>
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun initViewPager(savedPath: String)</ID>
<ID>ReturnCount:ViewPagerActivity.kt$ViewPagerActivity$private fun isShowHiddenFlagNeeded(): Boolean</ID>
<ID>ReturnCount:ViewPagerFragment.kt$ViewPagerFragment$fun getMediumExtendedDetails(medium: Medium): String</ID>
<ID>SpreadOperator:Context.kt$(*mediaToDelete.toTypedArray())</ID>
<ID>SpreadOperator:MainActivity.kt$MainActivity$(*mediaToDelete.toTypedArray())</ID>
<ID>SwallowedException:Activity.kt$e: Exception</ID>
<ID>SwallowedException:Activity.kt$e: OutOfMemoryError</ID>
<ID>SwallowedException:Context.kt$e: Exception</ID>
<ID>SwallowedException:EditActivity.kt$EditActivity$e: Exception</ID>
<ID>SwallowedException:EditActivity.kt$EditActivity$e: OutOfMemoryError</ID>
<ID>SwallowedException:IsoTypeReader.kt$IsoTypeReader$e: UnsupportedEncodingException</ID>
<ID>SwallowedException:MainActivity.kt$MainActivity$e: Exception</ID>
<ID>SwallowedException:MediaActivity.kt$MediaActivity$e: Exception</ID>
<ID>SwallowedException:MediaFetcher.kt$MediaFetcher$e: Exception</ID>
<ID>SwallowedException:MediaSideScroll.kt$MediaSideScroll$e: Settings.SettingNotFoundException</ID>
<ID>SwallowedException:MyWidgetProvider.kt$MyWidgetProvider$e: Exception</ID>
<ID>SwallowedException:PhotoFragment.kt$PhotoFragment$e: Exception</ID>
<ID>SwallowedException:PhotoFragment.kt$PhotoFragment$e: OutOfMemoryError</ID>
<ID>SwallowedException:PhotoVideoActivity.kt$PhotoVideoActivity$e: Exception</ID>
<ID>SwallowedException:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$e: OutOfMemoryError</ID>
<ID>SwallowedException:SetWallpaperActivity.kt$SetWallpaperActivity$e: OutOfMemoryError</ID>
<ID>SwallowedException:SettingsActivity.kt$SettingsActivity$e: ActivityNotFoundException</ID>
<ID>SwallowedException:String.kt$e: IOException</ID>
<ID>SwallowedException:ViewPagerActivity.kt$ViewPagerActivity$e: ActivityNotFoundException</ID>
<ID>SwallowedException:ViewPagerActivity.kt$ViewPagerActivity$e: Exception</ID>
<ID>SwallowedException:ViewPagerActivity.kt$ViewPagerActivity.&lt;no name provided&gt;$e: Exception</ID>
<ID>SwallowedException:ViewPagerFragment.kt$ViewPagerFragment$e: Exception</ID>
<ID>TooGenericExceptionCaught:Activity.kt$e: Exception</ID>
<ID>TooGenericExceptionCaught:Context.kt$e: Exception</ID>
<ID>TooGenericExceptionCaught:DirectoryAdapter.kt$DirectoryAdapter$e: Exception</ID>
<ID>TooGenericExceptionCaught:EditActivity.kt$EditActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:MediaActivity.kt$MediaActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:MediaFetcher.kt$MediaFetcher$e: Exception</ID>
<ID>TooGenericExceptionCaught:MyWidgetProvider.kt$MyWidgetProvider$e: Exception</ID>
<ID>TooGenericExceptionCaught:PhotoFragment.kt$PhotoFragment$e: Exception</ID>
<ID>TooGenericExceptionCaught:PhotoVideoActivity.kt$PhotoVideoActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:ResizeMultipleImagesDialog.kt$ResizeMultipleImagesDialog$e: Exception</ID>
<ID>TooGenericExceptionCaught:SettingsActivity.kt$SettingsActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:VideoFragment.kt$VideoFragment$e: Exception</ID>
<ID>TooGenericExceptionCaught:VideoPlayerActivity.kt$VideoPlayerActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:ViewPagerActivity.kt$ViewPagerActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:ViewPagerActivity.kt$ViewPagerActivity.&lt;no name provided&gt;$e: Exception</ID>
<ID>TooGenericExceptionCaught:ViewPagerFragment.kt$ViewPagerFragment$e: Exception</ID>
<ID>TooGenericExceptionThrown:PicassoRegionDecoder.kt$PicassoRegionDecoder$throw RuntimeException("Region decoder returned null bitmap - image format may not be supported")</ID>
<ID>TooManyFunctions:Activity.kt$org.fossify.gallery.extensions.Activity.kt</ID>
<ID>TooManyFunctions:Config.kt$Config : BaseConfig</ID>
<ID>TooManyFunctions:Context.kt$org.fossify.gallery.extensions.Context.kt</ID>
<ID>TooManyFunctions:DirectoryAdapter.kt$DirectoryAdapter : MyRecyclerViewAdapterItemTouchHelperContractOnPopupTextUpdate</ID>
<ID>TooManyFunctions:EditActivity.kt$EditActivity : SimpleActivityOnCropImageCompleteListener</ID>
<ID>TooManyFunctions:EditorDrawCanvas.kt$EditorDrawCanvas : View</ID>
<ID>TooManyFunctions:MainActivity.kt$MainActivity : SimpleActivityDirectoryOperationsListener</ID>
<ID>TooManyFunctions:ManageFoldersAdapter.kt$ManageFoldersAdapter : MyRecyclerViewAdapter</ID>
<ID>TooManyFunctions:ManageHiddenFoldersAdapter.kt$ManageHiddenFoldersAdapter : MyRecyclerViewAdapter</ID>
<ID>TooManyFunctions:MediaActivity.kt$MediaActivity : SimpleActivityMediaOperationsListener</ID>
<ID>TooManyFunctions:MediaAdapter.kt$MediaAdapter : MyRecyclerViewAdapterOnPopupTextUpdate</ID>
<ID>TooManyFunctions:MediaFetcher.kt$MediaFetcher</ID>
<ID>TooManyFunctions:Medium.kt$Medium : SerializableThumbnailItem</ID>
<ID>TooManyFunctions:MediumDao.kt$MediumDao</ID>
<ID>TooManyFunctions:PhotoFragment.kt$PhotoFragment : ViewPagerFragment</ID>
<ID>TooManyFunctions:PhotoVideoActivity.kt$PhotoVideoActivity : SimpleActivityFragmentListener</ID>
<ID>TooManyFunctions:SearchActivity.kt$SearchActivity : SimpleActivityMediaOperationsListener</ID>
<ID>TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
<ID>TooManyFunctions:VideoFragment.kt$VideoFragment : ViewPagerFragmentSurfaceTextureListenerOnSeekBarChangeListenerPlaybackSpeedListener</ID>
<ID>TooManyFunctions:VideoPlayerActivity.kt$VideoPlayerActivity : SimpleActivityOnSeekBarChangeListenerSurfaceTextureListenerPlaybackSpeedListener</ID>
<ID>TooManyFunctions:ViewPagerActivity.kt$ViewPagerActivity : SimpleActivityOnPageChangeListenerFragmentListener</ID>
<ID>TooManyFunctions:WidgetConfigureActivity.kt$WidgetConfigureActivity : SimpleActivity</ID>
<ID>UnusedParameter:Activity.kt$toggleActionBarVisibility: Boolean</ID>
<ID>UnusedPrivateMember:PhotoFragment.kt$PhotoFragment$private fun checkIfPanorama()</ID>
<ID>UnusedPrivateMember:VideoFragment.kt$VideoFragment$private fun checkIfPanorama()</ID>
<ID>UnusedPrivateProperty:MyPagerAdapter.kt$MyPagerAdapter$pos</ID>
<ID>UnusedPrivateProperty:PhotoFragment.kt$PhotoFragment$i</ID>
<ID>UnusedPrivateProperty:String.kt$i</ID>
<ID>UtilityClassWithPublicConstructor:ExifInterface.kt$ExifInterfaceAttributes</ID>
<ID>VariableNaming:Activity.kt$val BATCH_SIZE = 50</ID>
<ID>VariableNaming:Activity.kt$val OTGPath = config.OTGPath</ID>
<ID>VariableNaming:Context.kt$val FILE_CHANNEL_CONTAINERS = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl")</ID>
<ID>VariableNaming:Context.kt$val OTGPath = config.OTGPath</ID>
<ID>VariableNaming:DirectoryAdapter.kt$DirectoryAdapter$val SAFPath = getFirstSelectedItemPath() ?: return</ID>
<ID>VariableNaming:MainActivity.kt$MainActivity$val OTGPath = config.OTGPath</ID>
<ID>VariableNaming:MediaActivity.kt$MediaActivity$private val LAST_MEDIA_CHECK_PERIOD = 3000L</ID>
<ID>VariableNaming:MediaAdapter.kt$MediaAdapter$private val ITEM_MEDIUM_PHOTO = 2</ID>
<ID>VariableNaming:MediaAdapter.kt$MediaAdapter$private val ITEM_MEDIUM_VIDEO_PORTRAIT = 1</ID>
<ID>VariableNaming:MediaAdapter.kt$MediaAdapter$private val ITEM_SECTION = 0</ID>
<ID>VariableNaming:MediaAdapter.kt$MediaAdapter$val SAFPath = selectedPaths.firstOrNull { activity.needsStupidWritePermissions(it) } ?: getFirstSelectedItemPath() ?: return</ID>
<ID>VariableNaming:MediaFetcher.kt$MediaFetcher$val OTGPath = config.OTGPath</ID>
<ID>VariableNaming:MediaFetcher.kt$MediaFetcher$val OTGPath = context.config.OTGPath</ID>
<ID>VariableNaming:MediaSideScroll.kt$MediaSideScroll$private val SLIDE_INFO_FADE_DELAY = 1000L</ID>
<ID>VariableNaming:PhotoFragment.kt$PhotoFragment$// devices with good displays, but the rest of the hardware not good enough for them private val WEIRD_DEVICES = arrayListOf( "motorola xt1685", "google nexus 5x" )</ID>
<ID>VariableNaming:PhotoFragment.kt$PhotoFragment$private val DEFAULT_DOUBLE_TAP_ZOOM = 2f</ID>
<ID>VariableNaming:PhotoFragment.kt$PhotoFragment$private val SAME_ASPECT_RATIO_THRESHOLD = 0.01</ID>
<ID>VariableNaming:PhotoFragment.kt$PhotoFragment$private val ZOOMABLE_VIEW_LOAD_DELAY = 100L</ID>
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val HALF_PROGRESS = MAX_PROGRESS / 2</ID>
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val MAX_PLAYBACK_SPEED = 3f</ID>
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val MAX_PROGRESS = (MAX_PLAYBACK_SPEED * 100 + MIN_PLAYBACK_SPEED * 100).toInt()</ID>
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val MIN_PLAYBACK_SPEED = 0.25f</ID>
<ID>VariableNaming:PlaybackSpeedFragment.kt$PlaybackSpeedFragment$private val STEP = 0.05f</ID>
<ID>VariableNaming:SetWallpaperActivity.kt$SetWallpaperActivity$private val PICK_IMAGE = 1</ID>
<ID>VariableNaming:SetWallpaperActivity.kt$SetWallpaperActivity$private val RATIO_LANDSCAPE = 1</ID>
<ID>VariableNaming:SetWallpaperActivity.kt$SetWallpaperActivity$private val RATIO_PORTRAIT = 0</ID>
<ID>VariableNaming:SetWallpaperActivity.kt$SetWallpaperActivity$private val RATIO_SQUARE = 2</ID>
<ID>VariableNaming:VideoFragment.kt$VideoFragment$private val PROGRESS = "progress"</ID>
<ID>VariableNaming:VideoPlayerActivity.kt$VideoPlayerActivity$private val PLAY_WHEN_READY_DRAG_DELAY = 100L</ID>
<ID>WildcardImport:Activity.kt$import java.io.*</ID>
<ID>WildcardImport:Activity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:Activity.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:ArrayList.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:ChangeFolderThumbnailStyleDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ChangeFolderThumbnailStyleDialog.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:ChangeGroupingDialog.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:ChangeSortingDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ChangeSortingDialog.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:Config.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:Constants.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.gallery.interfaces.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.gallery.models.*</ID>
<ID>WildcardImport:Directory.kt$import androidx.room.*</ID>
<ID>WildcardImport:Directory.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.commons.dialogs.*</ID>
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:DirectoryAdapter.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:EditActivity.kt$import java.io.*</ID>
<ID>WildcardImport:EditActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:EditActivity.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:EditorDrawCanvas.kt$import android.graphics.*</ID>
<ID>WildcardImport:ExcludedFoldersActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ExportFavoritesDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:FilterMediaDialog.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:GalleryDatabase.kt$import org.fossify.gallery.interfaces.*</ID>
<ID>WildcardImport:GalleryDatabase.kt$import org.fossify.gallery.models.*</ID>
<ID>WildcardImport:GetMediaAsynctask.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:MainActivity.kt$import java.io.*</ID>
<ID>WildcardImport:MainActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:MainActivity.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:MainActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:MainActivity.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:ManageBottomActionsDialog.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:ManageExtendedDetailsDialog.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:ManageFoldersAdapter.kt$import android.view.*</ID>
<ID>WildcardImport:MediaActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:MediaActivity.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:MediaActivity.kt$import org.fossify.gallery.dialogs.*</ID>
<ID>WildcardImport:MediaActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:MediaActivity.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.gallery.databinding.*</ID>
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:MediaAdapter.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:MediaFetcher.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:MediaFetcher.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:MediaFetcher.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:Medium.kt$import androidx.room.*</ID>
<ID>WildcardImport:Medium.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:Medium.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:Medium.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:MediumDao.kt$import androidx.room.*</ID>
<ID>WildcardImport:PhotoFragment.kt$import androidx.exifinterface.media.ExifInterface.*</ID>
<ID>WildcardImport:PhotoFragment.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:PhotoFragment.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:PhotoVideoActivity.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:PicassoRegionDecoder.kt$import android.graphics.*</ID>
<ID>WildcardImport:PicassoRoundedCornersTransformation.kt$import android.graphics.*</ID>
<ID>WildcardImport:PickDirectoryDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:PickDirectoryDialog.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:PlaybackSpeedFragment.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ResizeDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ResizeMultipleImagesDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ResizeWithPathDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SaveAsDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SearchActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SearchActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.dialogs.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.gallery.dialogs.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:SimpleActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:VideoFragment.kt$import android.view.*</ID>
<ID>WildcardImport:VideoFragment.kt$import androidx.media3.common.*</ID>
<ID>WildcardImport:VideoFragment.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:VideoFragment.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:VideoPlayerActivity.kt$import android.view.*</ID>
<ID>WildcardImport:VideoPlayerActivity.kt$import androidx.media3.common.*</ID>
<ID>WildcardImport:VideoPlayerActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:VideoPlayerActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:VideoPlayerActivity.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:ViewPagerActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ViewPagerActivity.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:ViewPagerActivity.kt$import org.fossify.gallery.extensions.*</ID>
<ID>WildcardImport:ViewPagerActivity.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:ViewPagerFragment.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ViewPagerFragment.kt$import org.fossify.gallery.helpers.*</ID>
<ID>WildcardImport:WidgetConfigureActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:WidgetConfigureActivity.kt$import org.fossify.gallery.extensions.*</ID>
</CurrentIssues>
</SmellBaseline>

5393
app/lint-baseline.xml Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,5 @@
package org.fossify.gallery.activities
import android.annotation.TargetApi
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
@ -8,13 +7,15 @@ import android.graphics.Bitmap.CompressFormat
import android.graphics.Color
import android.graphics.Point
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.provider.MediaStore
import android.view.View
import android.widget.ImageView
import android.widget.RelativeLayout
import androidx.core.view.isInvisible
import androidx.exifinterface.media.ExifInterface
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
@ -27,12 +28,12 @@ import com.bumptech.glide.request.target.Target
import com.canhub.cropper.CropImageView
import com.zomato.photofilters.FilterPack
import com.zomato.photofilters.imageprocessors.Filter
import kotlinx.coroutines.*
import org.fossify.commons.dialogs.ColorPickerDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.NavigationIcon
import org.fossify.commons.helpers.REAL_FILE_PATH
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isNougatPlus
import org.fossify.commons.models.FileDirItem
import org.fossify.gallery.BuildConfig
import org.fossify.gallery.R
@ -50,7 +51,7 @@ import org.fossify.gallery.models.FilterItem
import java.io.*
import kotlin.math.max
class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener {
class EditActivity : SimpleActivity() {
companion object {
init {
System.loadLibrary("NativeImageProcessor")
@ -90,6 +91,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private var oldExif: ExifInterface? = null
private var filterInitialBitmap: Bitmap? = null
private var originalUri: Uri? = null
private var bitmapCroppingJob: Job? = null
private val binding by viewBinding(ActivityEditBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
@ -254,7 +256,6 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
binding.editorDrawCanvas.beGone()
binding.cropImageView.apply {
beVisible()
setOnCropImageCompleteListener(this@EditActivity)
setImageUriAsync(uri)
guidelines = CropImageView.Guidelines.ON
@ -312,12 +313,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun saveImage() {
setOldExif()
if (binding.cropImageView.isVisible()) {
binding.cropImageView.croppedImageAsync()
cropImageAsync()
} else if (binding.editorDrawCanvas.isVisible()) {
val bitmap = binding.editorDrawCanvas.getBitmap()
if (saveUri.scheme == "file") {
@ -355,14 +355,31 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun setCropProgressBarVisibility(visible: Boolean) {
val progressBar: View? = binding.cropImageView.findViewById(com.canhub.cropper.R.id.CropProgressBar)
progressBar?.isInvisible = visible.not()
}
private fun cropImageAsync() {
setCropProgressBarVisibility(visible = true)
bitmapCroppingJob?.cancel()
bitmapCroppingJob = lifecycleScope.launch(CoroutineExceptionHandler { _, t ->
onCropImageComplete(bitmap = null, error = Exception(t))
}) {
val bitmap = withContext(Dispatchers.Default) {
binding.cropImageView.getCroppedImage()
}
onCropImageComplete(bitmap, null)
}.apply {
invokeOnCompletion { setCropProgressBarVisibility(visible = false) }
}
}
private fun setOldExif() {
var inputStream: InputStream? = null
try {
if (isNougatPlus()) {
inputStream = contentResolver.openInputStream(uri!!)
oldExif = ExifInterface(inputStream!!)
}
inputStream = contentResolver.openInputStream(uri!!)
oldExif = ExifInterface(inputStream!!)
} catch (e: Exception) {
} finally {
inputStream?.close()
@ -387,7 +404,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
binding.cropImageView.isVisible() -> {
isSharingBitmap = true
runOnUiThread {
binding.cropImageView.croppedImageAsync()
cropImageAsync()
}
}
@ -771,7 +788,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
ResizeDialog(this, point) {
resizeWidth = it.x
resizeHeight = it.y
binding.cropImageView.croppedImageAsync()
cropImageAsync()
}
}
@ -799,11 +816,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
}
override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) {
if (result.error == null && result.bitmap != null) {
private fun onCropImageComplete(bitmap: Bitmap?, error: Exception?) {
if (error == null && bitmap != null) {
setOldExif()
val bitmap = result.bitmap!!
if (isSharingBitmap) {
isSharingBitmap = false
shareBitmap(bitmap)
@ -850,7 +866,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
toast(R.string.unknown_file_location)
}
} else {
toast("${getString(R.string.image_editing_failed)}: ${result.error?.message}")
toast("${getString(R.string.image_editing_failed)}: ${error?.message}")
}
}
@ -904,7 +920,6 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun saveBitmap(file: File, bitmap: Bitmap, out: OutputStream, showSavingToast: Boolean) {
if (showSavingToast) {
toast(org.fossify.commons.R.string.saving)
@ -918,10 +933,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
try {
if (isNougatPlus()) {
val newExif = ExifInterface(file.absolutePath)
oldExif?.copyNonDimensionAttributesTo(newExif)
}
val newExif = ExifInterface(file.absolutePath)
oldExif?.copyNonDimensionAttributesTo(newExif)
} catch (e: Exception) {
}

View file

@ -1,6 +1,5 @@
package org.fossify.gallery.activities
import android.app.Activity
import android.content.ClipData
import android.content.Intent
import android.net.Uri
@ -16,8 +15,62 @@ import androidx.recyclerview.widget.RecyclerView
import org.fossify.commons.dialogs.CreateNewFolderDialog
import org.fossify.commons.dialogs.FilePickerDialog
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.areSystemAnimationsEnabled
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.checkWhatsNew
import org.fossify.commons.extensions.deleteFiles
import org.fossify.commons.extensions.getDoesFilePathExist
import org.fossify.commons.extensions.getFileCount
import org.fossify.commons.extensions.getFilePublicUri
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getLatestMediaByDateId
import org.fossify.commons.extensions.getLatestMediaId
import org.fossify.commons.extensions.getMimeType
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.getProperSize
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.getStorageDirectories
import org.fossify.commons.extensions.getTimeFormat
import org.fossify.commons.extensions.handleHiddenFolderPasswordProtection
import org.fossify.commons.extensions.handleLockedFolderOpening
import org.fossify.commons.extensions.hasAllPermissions
import org.fossify.commons.extensions.hasOTGConnected
import org.fossify.commons.extensions.hasPermission
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.internalStoragePath
import org.fossify.commons.extensions.isExternalStorageManager
import org.fossify.commons.extensions.isGif
import org.fossify.commons.extensions.isGone
import org.fossify.commons.extensions.isImageFast
import org.fossify.commons.extensions.isMediaFile
import org.fossify.commons.extensions.isPathOnOTG
import org.fossify.commons.extensions.isRawFast
import org.fossify.commons.extensions.isSvg
import org.fossify.commons.extensions.isVideoFast
import org.fossify.commons.extensions.launchMoreAppsFromUsIntent
import org.fossify.commons.extensions.recycleBinPath
import org.fossify.commons.extensions.sdCardPath
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toFileDirItem
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.underlineText
import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.DAY_SECONDS
import org.fossify.commons.helpers.FAVORITES
import org.fossify.commons.helpers.PERMISSION_READ_STORAGE
import org.fossify.commons.helpers.SORT_BY_DATE_MODIFIED
import org.fossify.commons.helpers.SORT_BY_DATE_TAKEN
import org.fossify.commons.helpers.SORT_BY_SIZE
import org.fossify.commons.helpers.SORT_USE_NUMERIC_VALUE
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.isRPlus
import org.fossify.commons.models.FileDirItem
import org.fossify.commons.models.RadioItem
import org.fossify.commons.models.Release
@ -32,13 +85,70 @@ import org.fossify.gallery.dialogs.ChangeSortingDialog
import org.fossify.gallery.dialogs.ChangeViewTypeDialog
import org.fossify.gallery.dialogs.FilterMediaDialog
import org.fossify.gallery.dialogs.GrantAllFilesDialog
import org.fossify.gallery.extensions.*
import org.fossify.gallery.helpers.*
import org.fossify.gallery.extensions.addTempFolderIfNeeded
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.createDirectoryFromMedia
import org.fossify.gallery.extensions.directoryDB
import org.fossify.gallery.extensions.getCachedDirectories
import org.fossify.gallery.extensions.getCachedMedia
import org.fossify.gallery.extensions.getDirectorySortingValue
import org.fossify.gallery.extensions.getDirsToShow
import org.fossify.gallery.extensions.getDistinctPath
import org.fossify.gallery.extensions.getFavoritePaths
import org.fossify.gallery.extensions.getNoMediaFoldersSync
import org.fossify.gallery.extensions.getOTGFolderChildrenNames
import org.fossify.gallery.extensions.getSortedDirectories
import org.fossify.gallery.extensions.handleExcludedFolderPasswordProtection
import org.fossify.gallery.extensions.handleMediaManagementPrompt
import org.fossify.gallery.extensions.isDownloadsFolder
import org.fossify.gallery.extensions.launchAbout
import org.fossify.gallery.extensions.launchCamera
import org.fossify.gallery.extensions.launchSettings
import org.fossify.gallery.extensions.mediaDB
import org.fossify.gallery.extensions.movePathsInRecycleBin
import org.fossify.gallery.extensions.movePinnedDirectoriesToFront
import org.fossify.gallery.extensions.openRecycleBin
import org.fossify.gallery.extensions.removeInvalidDBDirectories
import org.fossify.gallery.extensions.storeDirectoryItems
import org.fossify.gallery.extensions.tryDeleteFileDirItem
import org.fossify.gallery.extensions.updateDBDirectory
import org.fossify.gallery.extensions.updateWidgets
import org.fossify.gallery.helpers.DIRECTORY
import org.fossify.gallery.helpers.GET_ANY_INTENT
import org.fossify.gallery.helpers.GET_IMAGE_INTENT
import org.fossify.gallery.helpers.GET_VIDEO_INTENT
import org.fossify.gallery.helpers.GROUP_BY_DATE_TAKEN_DAILY
import org.fossify.gallery.helpers.GROUP_BY_DATE_TAKEN_MONTHLY
import org.fossify.gallery.helpers.GROUP_BY_LAST_MODIFIED_DAILY
import org.fossify.gallery.helpers.GROUP_BY_LAST_MODIFIED_MONTHLY
import org.fossify.gallery.helpers.GROUP_DESCENDING
import org.fossify.gallery.helpers.LOCATION_INTERNAL
import org.fossify.gallery.helpers.MAX_COLUMN_COUNT
import org.fossify.gallery.helpers.MONTH_MILLISECONDS
import org.fossify.gallery.helpers.MediaFetcher
import org.fossify.gallery.helpers.PICKED_PATHS
import org.fossify.gallery.helpers.RECYCLE_BIN
import org.fossify.gallery.helpers.SET_WALLPAPER_INTENT
import org.fossify.gallery.helpers.SHOW_ALL
import org.fossify.gallery.helpers.SHOW_TEMP_HIDDEN_DURATION
import org.fossify.gallery.helpers.SKIP_AUTHENTICATION
import org.fossify.gallery.helpers.TYPE_GIFS
import org.fossify.gallery.helpers.TYPE_IMAGES
import org.fossify.gallery.helpers.TYPE_RAWS
import org.fossify.gallery.helpers.TYPE_SVGS
import org.fossify.gallery.helpers.TYPE_VIDEOS
import org.fossify.gallery.helpers.getDefaultFileFilter
import org.fossify.gallery.helpers.getPermissionToRequest
import org.fossify.gallery.helpers.getPermissionsToRequest
import org.fossify.gallery.interfaces.DirectoryOperationsListener
import org.fossify.gallery.jobs.NewPhotoFetcher
import org.fossify.gallery.models.Directory
import org.fossify.gallery.models.Medium
import java.io.*
import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.InputStream
import java.io.OutputStream
class MainActivity : SimpleActivity(), DirectoryOperationsListener {
companion object {
@ -62,8 +172,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private var mWasMediaManagementPromptShown = false
private var mLatestMediaId = 0L
private var mLatestMediaDateId = 0L
private var mCurrentPathPrefix = "" // used at "Group direct subfolders" for navigation
private var mOpenedSubfolders = arrayListOf("") // used at "Group direct subfolders" for navigating Up with the back button
// used at "Group direct subfolders" for navigation
private var mCurrentPathPrefix = ""
// used at "Group direct subfolders" for navigating Up with the back button
private var mOpenedSubfolders = arrayListOf("")
private var mDateFormat = ""
private var mTimeFormat = ""
private var mLastMediaHandler = Handler()
@ -104,15 +219,19 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
mIsGetAnyContentIntent = isGetAnyContentIntent(intent)
mIsSetWallpaperIntent = isSetWallpaperIntent(intent)
mAllowPickingMultiple = intent.getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
mIsThirdPartyIntent = mIsPickImageIntent || mIsPickVideoIntent || mIsGetImageContentIntent || mIsGetVideoContentIntent ||
mIsGetAnyContentIntent || mIsSetWallpaperIntent
mIsThirdPartyIntent = mIsPickImageIntent
|| mIsPickVideoIntent
|| mIsGetImageContentIntent
|| mIsGetVideoContentIntent
|| mIsGetAnyContentIntent
|| mIsSetWallpaperIntent
setupOptionsMenu()
refreshMenuItems()
updateMaterialActivityViews(
binding.directoriesCoordinator,
binding.directoriesGrid,
mainCoordinatorLayout = binding.directoriesCoordinator,
nestedView = binding.directoriesGrid,
useTransparentNavigation = !config.scrollHorizontally,
useTopSearchMenu = true
)
@ -203,7 +322,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
getRecyclerAdapter()?.updatePrimaryColor()
}
val styleString = "${config.folderStyle}${config.showFolderMediaCount}${config.limitFolderTitle}"
val styleString =
"${config.folderStyle}${config.showFolderMediaCount}${config.limitFolderTitle}"
if (mStoredStyleString != styleString) {
setupAdapter(mDirs, forceRecreate = true)
}
@ -281,7 +401,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (mCurrentPathPrefix.isEmpty()) {
super.onBackPressed()
} else {
mOpenedSubfolders.removeLast()
mOpenedSubfolders.removeAt(mOpenedSubfolders.lastIndex)
mCurrentPathPrefix = mOpenedSubfolders.last()
setupAdapter(mDirs)
}
@ -292,17 +412,21 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (resultCode == Activity.RESULT_OK) {
if (resultCode == RESULT_OK) {
if (requestCode == PICK_MEDIA && resultData != null) {
val resultIntent = Intent()
var resultUri: Uri? = null
if (mIsThirdPartyIntent) {
when {
intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true && intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0 -> {
intent.extras?.containsKey(MediaStore.EXTRA_OUTPUT) == true
&& intent.flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0 -> {
resultUri = fillExtraOutput(resultData)
}
resultData.extras?.containsKey(PICKED_PATHS) == true -> fillPickedPaths(resultData, resultIntent)
resultData.extras?.containsKey(PICKED_PATHS) == true -> {
fillPickedPaths(resultData, resultIntent)
}
else -> fillIntentPath(resultData, resultIntent)
}
}
@ -312,10 +436,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
setResult(Activity.RESULT_OK, resultIntent)
setResult(RESULT_OK, resultIntent)
finish()
} else if (requestCode == PICK_WALLPAPER) {
setResult(Activity.RESULT_OK)
setResult(RESULT_OK)
finish()
}
}
@ -327,14 +451,17 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
binding.mainMenu.getToolbar().menu.apply {
findItem(R.id.column_count).isVisible = config.viewTypeFolders == VIEW_TYPE_GRID
findItem(R.id.set_as_default_folder).isVisible = !config.defaultFolder.isEmpty()
findItem(R.id.open_recycle_bin).isVisible = config.useRecycleBin && !config.showRecycleBinAtFolders
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)
findItem(R.id.open_recycle_bin).isVisible =
config.useRecycleBin && !config.showRecycleBinAtFolders
findItem(R.id.more_apps_from_us).isVisible =
!resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)
}
}
binding.mainMenu.getToolbar().menu.apply {
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
findItem(R.id.stop_showing_hidden).isVisible =
(!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
findItem(R.id.temporarily_show_excluded).isVisible = !config.temporarilyShowExcluded
findItem(R.id.stop_showing_excluded).isVisible = config.temporarilyShowExcluded
@ -360,7 +487,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
binding.mainMenu.onSearchTextChangedListener = { text ->
setupAdapter(mDirsIgnoringSearch, text)
binding.directoriesRefreshLayout.isEnabled = text.isEmpty() && config.enablePullToRefresh
binding.directoriesRefreshLayout.isEnabled =
text.isEmpty() && config.enablePullToRefresh
binding.directoriesSwitchSearching.beVisibleIf(text.isNotEmpty())
}
@ -407,11 +535,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun startNewPhotoFetcher() {
if (isNougatPlus()) {
val photoFetcher = NewPhotoFetcher()
if (!photoFetcher.isScheduled(applicationContext)) {
photoFetcher.scheduleJob(applicationContext)
}
val photoFetcher = NewPhotoFetcher()
if (!photoFetcher.isScheduled(applicationContext)) {
photoFetcher.scheduleJob(applicationContext)
}
}
@ -419,8 +545,17 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (config.tempFolderPath.isNotEmpty()) {
val newFolder = File(config.tempFolderPath)
if (getDoesFilePathExist(newFolder.absolutePath) && newFolder.isDirectory) {
if (newFolder.getProperSize(true) == 0L && newFolder.getFileCount(true) == 0 && newFolder.list()?.isEmpty() == true) {
toast(String.format(getString(org.fossify.commons.R.string.deleting_folder), config.tempFolderPath), Toast.LENGTH_LONG)
if (
newFolder.getProperSize(true) == 0L
&& newFolder.getFileCount(true) == 0
&& newFolder.list()?.isEmpty() == true
) {
toast(
String.format(
getString(org.fossify.commons.R.string.deleting_folder),
config.tempFolderPath
), Toast.LENGTH_LONG
)
tryDeleteFileDirItem(newFolder.toFileDirItem(applicationContext), true, true)
}
}
@ -431,7 +566,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun checkOTGPath() {
ensureBackgroundThread {
if (!config.wasOTGHandled && hasPermission(getPermissionToRequest()) && hasOTGConnected() && config.OTGPath.isEmpty()) {
getStorageDirectories().firstOrNull { it.trimEnd('/') != internalStoragePath && it.trimEnd('/') != sdCardPath }?.apply {
getStorageDirectories().firstOrNull {
it.trimEnd('/') != internalStoragePath
&& it.trimEnd('/') != sdCardPath
}?.apply {
config.wasOTGHandled = true
val otgPath = trimEnd('/')
config.OTGPath = otgPath
@ -459,7 +597,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun tryLoadGallery() {
// avoid calling anything right after granting the permission, it will be called from onResume()
val wasMissingPermission = config.appRunCount == 1 && !hasAllPermissions(getPermissionsToRequest())
val wasMissingPermission =
config.appRunCount == 1 && !hasAllPermissions(getPermissionsToRequest())
handleMediaPermissions {
if (wasMissingPermission) {
return@handleMediaPermissions
@ -598,23 +737,39 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
override fun deleteFolders(folders: ArrayList<File>) {
val fileDirItems =
folders.asSequence().filter { it.isDirectory }.map { FileDirItem(it.absolutePath, it.name, true) }.toMutableList() as ArrayList<FileDirItem>
val fileDirItems = folders
.asSequence()
.filter { it.isDirectory }
.map { FileDirItem(it.absolutePath, it.name, true) }
.toMutableList() as ArrayList<FileDirItem>
when {
fileDirItems.isEmpty() -> return
fileDirItems.size == 1 -> {
try {
toast(String.format(getString(org.fossify.commons.R.string.deleting_folder), fileDirItems.first().name))
toast(
String.format(
getString(org.fossify.commons.R.string.deleting_folder),
fileDirItems.first().name
)
)
} catch (e: Exception) {
showErrorToast(e)
}
}
else -> {
val baseString =
if (config.useRecycleBin && !config.tempSkipRecycleBin) org.fossify.commons.R.plurals.moving_items_into_bin else org.fossify.commons.R.plurals.delete_items
val deletingItems = resources.getQuantityString(baseString, fileDirItems.size, fileDirItems.size)
toast(deletingItems)
val baseString = if (config.useRecycleBin && !config.tempSkipRecycleBin) {
org.fossify.commons.R.plurals.moving_items_into_bin
} else {
org.fossify.commons.R.plurals.delete_items
}
toast(
msg = resources.getQuantityString(
baseString, fileDirItems.size, fileDirItems.size
)
)
}
}
@ -624,12 +779,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
fileDirItems.filter { it.isDirectory }.forEach {
val files = File(it.path).listFiles()
files?.filter {
it.absolutePath.isMediaFile() && (showHidden || !it.name.startsWith('.')) &&
((it.isImageFast() && filter and TYPE_IMAGES != 0) ||
(it.isVideoFast() && filter and TYPE_VIDEOS != 0) ||
(it.isGif() && filter and TYPE_GIFS != 0) ||
(it.isRawFast() && filter and TYPE_RAWS != 0) ||
(it.isSvg() && filter and TYPE_SVGS != 0))
it.absolutePath.isMediaFile()
&& (showHidden || !it.name.startsWith('.'))
&& ((it.isImageFast() && filter and TYPE_IMAGES != 0)
|| (it.isVideoFast() && filter and TYPE_VIDEOS != 0)
|| (it.isGif() && filter and TYPE_GIFS != 0)
|| (it.isRawFast() && filter and TYPE_RAWS != 0)
|| (it.isSvg() && filter and TYPE_SVGS != 0))
}?.mapTo(itemsToDelete) { it.toFileDirItem(applicationContext) }
}
@ -649,7 +805,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
private fun deleteFilteredFileDirItems(fileDirItems: ArrayList<FileDirItem>, folders: ArrayList<File>) {
private fun deleteFilteredFileDirItems(
fileDirItems: ArrayList<FileDirItem>,
folders: ArrayList<File>
) {
val OTGPath = config.OTGPath
deleteFiles(fileDirItems) {
runOnUiThread {
@ -662,7 +821,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
if (config.deleteEmptyFolders) {
folders.filter { !it.absolutePath.isDownloadsFolder() && it.isDirectory && it.toFileDirItem(this).getProperFileCount(this, true) == 0 }
folders.filter {
!it.absolutePath.isDownloadsFolder()
&& it.isDirectory
&& it.toFileDirItem(this).getProperFileCount(this, true) == 0
}
.forEach {
tryDeleteFileDirItem(it.toFileDirItem(this), true, true)
}
@ -678,7 +841,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
setupListLayoutManager()
}
(binding.directoriesRefreshLayout.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.BELOW, R.id.directories_switch_searching)
(binding.directoriesRefreshLayout.layoutParams as RelativeLayout.LayoutParams)
.addRule(RelativeLayout.BELOW, R.id.directories_switch_searching)
}
private fun setupGridLayoutManager() {
@ -686,11 +850,17 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
if (config.scrollHorizontally) {
layoutManager.orientation = RecyclerView.HORIZONTAL
binding.directoriesRefreshLayout.layoutParams =
RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
} else {
layoutManager.orientation = RecyclerView.VERTICAL
binding.directoriesRefreshLayout.layoutParams =
RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
}
layoutManager.spanCount = config.dirColumnCnt
@ -700,7 +870,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val layoutManager = binding.directoriesGrid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL
binding.directoriesRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.directoriesRefreshLayout.layoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
mZoomListener = null
}
@ -741,10 +914,18 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun changeColumnCount() {
val items = ArrayList<RadioItem>()
for (i in 1..MAX_COLUMN_COUNT) {
items.add(RadioItem(i, resources.getQuantityString(org.fossify.commons.R.plurals.column_counts, i, i)))
items.add(
RadioItem(
id = i,
title = resources.getQuantityString(
org.fossify.commons.R.plurals.column_counts, i, i
)
)
)
}
val currentColumnCount = (binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount
val currentColumnCount =
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount
RadioGroupDialog(this, items, currentColumnCount) {
val newColumnCount = it as Int
if (currentColumnCount != newColumnCount) {
@ -765,40 +946,69 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun columnCountChanged() {
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount = config.dirColumnCnt
(binding.directoriesGrid.layoutManager as MyGridLayoutManager).spanCount =
config.dirColumnCnt
refreshMenuItems()
getRecyclerAdapter()?.apply {
notifyItemRangeChanged(0, dirs.size)
}
}
private fun isPickImageIntent(intent: Intent) = isPickIntent(intent) && (hasImageContentData(intent) || isImageType(intent))
private fun isPickImageIntent(intent: Intent): Boolean {
return isPickIntent(intent) && (hasImageContentData(intent) || isImageType(intent))
}
private fun isPickVideoIntent(intent: Intent) = isPickIntent(intent) && (hasVideoContentData(intent) || isVideoType(intent))
private fun isPickVideoIntent(intent: Intent): Boolean {
return isPickIntent(intent) && (hasVideoContentData(intent) || isVideoType(intent))
}
private fun isPickIntent(intent: Intent) = intent.action == Intent.ACTION_PICK
private fun isPickIntent(intent: Intent): Boolean {
return intent.action == Intent.ACTION_PICK
}
private fun isGetContentIntent(intent: Intent) = intent.action == Intent.ACTION_GET_CONTENT && intent.type != null
private fun isGetContentIntent(intent: Intent): Boolean {
return intent.action == Intent.ACTION_GET_CONTENT && intent.type != null
}
private fun isGetImageContentIntent(intent: Intent) = isGetContentIntent(intent) &&
(intent.type!!.startsWith("image/") || intent.type == Images.Media.CONTENT_TYPE)
private fun isGetImageContentIntent(intent: Intent): Boolean {
return isGetContentIntent(intent)
&& (intent.type!!.startsWith("image/")
|| intent.type == Images.Media.CONTENT_TYPE)
}
private fun isGetVideoContentIntent(intent: Intent) = isGetContentIntent(intent) &&
(intent.type!!.startsWith("video/") || intent.type == Video.Media.CONTENT_TYPE)
private fun isGetVideoContentIntent(intent: Intent): Boolean {
return isGetContentIntent(intent)
&& (intent.type!!.startsWith("video/")
|| intent.type == Video.Media.CONTENT_TYPE)
}
private fun isGetAnyContentIntent(intent: Intent) = isGetContentIntent(intent) && intent.type == "*/*"
private fun isGetAnyContentIntent(intent: Intent): Boolean {
return isGetContentIntent(intent) && intent.type == "*/*"
}
private fun isSetWallpaperIntent(intent: Intent?) = intent?.action == Intent.ACTION_SET_WALLPAPER
private fun isSetWallpaperIntent(intent: Intent?): Boolean {
return intent?.action == Intent.ACTION_SET_WALLPAPER
}
private fun hasImageContentData(intent: Intent) = (intent.data == Images.Media.EXTERNAL_CONTENT_URI ||
intent.data == Images.Media.INTERNAL_CONTENT_URI)
private fun hasImageContentData(intent: Intent): Boolean {
return intent.data == Images.Media.EXTERNAL_CONTENT_URI
|| intent.data == Images.Media.INTERNAL_CONTENT_URI
}
private fun hasVideoContentData(intent: Intent) = (intent.data == Video.Media.EXTERNAL_CONTENT_URI ||
intent.data == Video.Media.INTERNAL_CONTENT_URI)
private fun hasVideoContentData(intent: Intent): Boolean {
return intent.data == Video.Media.EXTERNAL_CONTENT_URI
|| intent.data == Video.Media.INTERNAL_CONTENT_URI
}
private fun isImageType(intent: Intent) = (intent.type?.startsWith("image/") == true || intent.type == Images.Media.CONTENT_TYPE)
private fun isImageType(intent: Intent): Boolean {
return (intent.type?.startsWith("image/") == true
|| intent.type == Images.Media.CONTENT_TYPE)
}
private fun isVideoType(intent: Intent) = (intent.type?.startsWith("video/") == true || intent.type == Video.Media.CONTENT_TYPE)
private fun isVideoType(intent: Intent): Boolean {
return (intent.type?.startsWith("video/") == true
|| intent.type == Video.Media.CONTENT_TYPE)
}
private fun fillExtraOutput(resultData: Intent): Uri? {
val file = File(resultData.data!!.path!!)
@ -823,8 +1033,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun fillPickedPaths(resultData: Intent, resultIntent: Intent) {
val paths = resultData.extras!!.getStringArrayList(PICKED_PATHS)
val uris = paths!!.map { getFilePublicUri(File(it), BuildConfig.APPLICATION_ID) } as ArrayList
val clipData = ClipData("Attachment", arrayOf("image/*", "video/*"), ClipData.Item(uris.removeAt(0)))
val uris = paths!!
.map { getFilePublicUri(File(it), BuildConfig.APPLICATION_ID) } as ArrayList
val clipData = ClipData(
"Attachment",
arrayOf("image/*", "video/*"),
ClipData.Item(uris.removeAt(0))
)
uris.forEach {
clipData.addItem(ClipData.Item(it))
@ -878,7 +1093,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
// if hidden item showing is disabled but all Favorite items are hidden, hide the Favorites folder
if (!config.shouldShowHidden) {
val favoritesFolder = newDirs.firstOrNull { it.areFavorites() }
if (favoritesFolder != null && favoritesFolder.tmb.getFilenameFromPath().startsWith('.')) {
if (
favoritesFolder != null
&& favoritesFolder.tmb.getFilenameFromPath().startsWith('.')
) {
newDirs.remove(favoritesFolder)
}
}
@ -911,7 +1129,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val lastModifieds = mLastMediaFetcher!!.getLastModifieds()
val dateTakens = mLastMediaFetcher!!.getDateTakens()
if (config.showRecycleBinAtFolders && !config.showRecycleBinLast && !dirs.map { it.path }.contains(RECYCLE_BIN)) {
if (
config.showRecycleBinAtFolders
&& !config.showRecycleBinLast
&& !dirs.map { it.path }.contains(RECYCLE_BIN)
) {
try {
if (mediaDB.getDeletedMediaCount() > 0) {
val recycleBin = Directory().apply {
@ -939,7 +1161,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
// fetch files from MediaStore only, unless the app has the MANAGE_EXTERNAL_STORAGE permission on Android 11+
val android11Files = mLastMediaFetcher?.getAndroid11FolderMedia(getImagesOnly, getVideosOnly, favoritePaths, false, true, dateTakens)
val android11Files = mLastMediaFetcher?.getAndroid11FolderMedia(
isPickImage = getImagesOnly,
isPickVideo = getVideosOnly,
favoritePaths = favoritePaths,
getFavoritePathsOnly = false,
getProperDateTaken = true,
dateTakens = dateTakens
)
try {
for (directory in dirs) {
if (mShouldStopFetching || isDestroyed || isFinishing) {
@ -948,19 +1177,29 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val sorting = config.getFolderSorting(directory.path)
val grouping = config.getFolderGrouping(directory.path)
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
sorting and SORT_BY_DATE_TAKEN != 0 ||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|| sorting and SORT_BY_DATE_TAKEN != 0
|| grouping and GROUP_BY_DATE_TAKEN_DAILY != 0
|| grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val getProperLastModified =
config.directorySorting and SORT_BY_DATE_MODIFIED != 0
|| sorting and SORT_BY_DATE_MODIFIED != 0
|| grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0
|| grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val curMedia = mLastMediaFetcher!!.getFilesFrom(
directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified,
getProperFileSize, favoritePaths, false, lastModifieds, dateTakens, android11Files
curPath = directory.path,
isPickImage = getImagesOnly,
isPickVideo = getVideosOnly,
getProperDateTaken = getProperDateTaken,
getProperLastModified = getProperLastModified,
getProperFileSize = getProperFileSize,
favoritePaths = favoritePaths,
getVideoDurations = false,
lastModifieds = lastModifieds,
dateTakens = dateTakens,
android11Files = android11Files
)
val newDir = if (curMedia.isEmpty()) {
@ -969,7 +1208,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
directory
} else {
createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
createDirectoryFromMedia(
path = directory.path,
curMedia = curMedia,
albumCovers = albumCovers,
hiddenString = hiddenString,
includedFolders = includedFolders,
getProperFileSize = getProperFileSize,
noMediaFolders = noMediaFolders
)
}
// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed
@ -985,7 +1232,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
taken = newDir.taken
this@apply.size = newDir.size
types = newDir.types
sortValue = getDirectorySortingValue(curMedia, path, name, size)
sortValue = getDirectorySortingValue(curMedia, path, name, size, mediaCnt)
}
setupAdapter(dirs)
@ -1055,19 +1302,28 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val sorting = config.getFolderSorting(folder)
val grouping = config.getFolderGrouping(folder)
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
sorting and SORT_BY_DATE_TAKEN != 0 ||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|| sorting and SORT_BY_DATE_TAKEN != 0
|| grouping and GROUP_BY_DATE_TAKEN_DAILY != 0
|| grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0
|| sorting and SORT_BY_DATE_MODIFIED != 0
|| grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0
|| grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val newMedia = mLastMediaFetcher!!.getFilesFrom(
folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified,
getProperFileSize, favoritePaths, false, lastModifieds, dateTakens, android11Files
curPath = folder,
isPickImage = getImagesOnly,
isPickVideo = getVideosOnly,
getProperDateTaken = getProperDateTaken,
getProperLastModified = getProperLastModified,
getProperFileSize = getProperFileSize,
favoritePaths = favoritePaths,
getVideoDurations = false,
lastModifieds = lastModifieds,
dateTakens = dateTakens,
android11Files = android11Files
)
if (newMedia.isEmpty()) {
@ -1083,7 +1339,15 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
val newDir = createDirectoryFromMedia(
path = folder,
curMedia = newMedia,
albumCovers = albumCovers,
hiddenString = hiddenString,
includedFolders = includedFolders,
getProperFileSize = getProperFileSize,
noMediaFolders = noMediaFolders
)
dirs.add(newDir)
setupAdapter(dirs)
@ -1165,11 +1429,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
binding.directoriesEmptyPlaceholder2.beVisibleIf(dirs.isEmpty() && mLoadedInitialPhotos)
if (binding.mainMenu.isSearchOpen) {
binding.directoriesEmptyPlaceholder.text = getString(org.fossify.commons.R.string.no_items_found)
binding.directoriesEmptyPlaceholder.text =
getString(org.fossify.commons.R.string.no_items_found)
binding.directoriesEmptyPlaceholder2.beGone()
} else if (dirs.isEmpty() && config.filterMedia == getDefaultFileFilter()) {
if (isRPlus() && !isExternalStorageManager()) {
binding.directoriesEmptyPlaceholder.text = getString(org.fossify.commons.R.string.no_items_found)
binding.directoriesEmptyPlaceholder.text =
getString(org.fossify.commons.R.string.no_items_found)
binding.directoriesEmptyPlaceholder2.beGone()
} else {
binding.directoriesEmptyPlaceholder.text = getString(R.string.no_media_add_included)
@ -1183,7 +1449,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
} else {
binding.directoriesEmptyPlaceholder.text = getString(R.string.no_media_with_filters)
binding.directoriesEmptyPlaceholder2.text = getString(R.string.change_filters_underlined)
binding.directoriesEmptyPlaceholder2.text =
getString(R.string.change_filters_underlined)
binding.directoriesEmptyPlaceholder2.setOnClickListener {
showFilterMediaDialog()
@ -1194,11 +1461,22 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
binding.directoriesFastscroller.beVisibleIf(binding.directoriesEmptyPlaceholder.isGone())
}
private fun setupAdapter(dirs: ArrayList<Directory>, textToSearch: String = binding.mainMenu.getCurrentQuery(), forceRecreate: Boolean = false) {
private fun setupAdapter(
dirs: ArrayList<Directory>,
textToSearch: String = binding.mainMenu.getCurrentQuery(),
forceRecreate: Boolean = false
) {
val currAdapter = binding.directoriesGrid.adapter
val distinctDirs = dirs.distinctBy { it.path.getDistinctPath() }.toMutableList() as ArrayList<Directory>
val distinctDirs = dirs
.distinctBy { it.path.getDistinctPath() }
.toMutableList() as ArrayList<Directory>
val sortedDirs = getSortedDirectories(distinctDirs)
var dirsToShow = getDirsToShow(sortedDirs, mDirs, mCurrentPathPrefix).clone() as ArrayList<Directory>
var dirsToShow = getDirsToShow(
dirs = sortedDirs,
allDirs = mDirs,
currentPathPrefix = mCurrentPathPrefix
).clone() as ArrayList<Directory>
if (currAdapter == null || forceRecreate) {
mDirsIgnoringSearch = dirs
@ -1236,7 +1514,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
} else {
runOnUiThread {
if (textToSearch.isNotEmpty()) {
dirsToShow = dirsToShow.filter { it.name.contains(textToSearch, true) }.sortedBy { !it.name.startsWith(textToSearch, true) }
dirsToShow = dirsToShow
.filter { it.name.contains(textToSearch, true) }
.sortedBy { !it.name.startsWith(textToSearch, true) }
.toMutableList() as ArrayList
}
checkPlaceholderVisibility(dirsToShow)
@ -1252,7 +1532,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun setupScrollDirection() {
val scrollHorizontally = config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID
val scrollHorizontally =
config.scrollHorizontally && config.viewTypeFolders == VIEW_TYPE_GRID
binding.directoriesFastscroller.setScrollVertically(!scrollHorizontally)
}
@ -1271,8 +1552,12 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
val hasMediaFile = children?.any {
it != null && (it.isMediaFile() || (it.startsWith("img_", true) && File(it).isDirectory))
} ?: false
it != null && (
it.isMediaFile()
|| (it.startsWith("img_", true)
&& File(it).isDirectory)
)
} == true
if (!hasMediaFile) {
invalidDirs.add(it)
@ -1349,7 +1634,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
Handler().postDelayed({
ensureBackgroundThread {
try {
val filesToDelete = mediaDB.getOldRecycleBinItems(System.currentTimeMillis() - MONTH_MILLISECONDS)
val filesToDelete = mediaDB.getOldRecycleBinItems(
System.currentTimeMillis() - MONTH_MILLISECONDS
)
filesToDelete.forEach {
if (File(it.path.replaceFirst(RECYCLE_BIN, recycleBinPath)).delete()) {
mediaDB.deleteMediumPath(it.path)
@ -1371,7 +1658,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val internalPath = internalStoragePath
val checkedPaths = ArrayList<String>()
val oftenRepeatedPaths = ArrayList<String>()
val paths = mDirs.map { it.path.removePrefix(internalPath) }.toMutableList() as ArrayList<String>
val paths = mDirs
.map { it.path.removePrefix(internalPath) }
.toMutableList() as ArrayList<String>
paths.forEach {
val parts = it.split("/")
var currentString = ""

View file

@ -1,14 +1,13 @@
package org.fossify.gallery.activities
import android.app.Activity
import android.app.WallpaperManager
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.view.ViewGroup
import android.widget.RelativeLayout
import androidx.core.net.toUri
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
@ -17,8 +16,41 @@ import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import org.fossify.commons.dialogs.CreateNewFolderDialog
import org.fossify.commons.dialogs.RadioGroupDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.*
import org.fossify.commons.extensions.appLockManager
import org.fossify.commons.extensions.areSystemAnimationsEnabled
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.deleteFiles
import org.fossify.commons.extensions.getDoesFilePathExist
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getIsPathDirectory
import org.fossify.commons.extensions.getLatestMediaByDateId
import org.fossify.commons.extensions.getLatestMediaId
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.getTimeFormat
import org.fossify.commons.extensions.handleHiddenFolderPasswordProtection
import org.fossify.commons.extensions.handleLockedFolderOpening
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.isExternalStorageManager
import org.fossify.commons.extensions.isGone
import org.fossify.commons.extensions.isMediaFile
import org.fossify.commons.extensions.isVideoFast
import org.fossify.commons.extensions.isVisible
import org.fossify.commons.extensions.recycleBinPath
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.FAVORITES
import org.fossify.commons.helpers.IS_FROM_GALLERY
import org.fossify.commons.helpers.REQUEST_EDIT_IMAGE
import org.fossify.commons.helpers.SORT_BY_RANDOM
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.isRPlus
import org.fossify.commons.models.FileDirItem
import org.fossify.commons.models.RadioItem
import org.fossify.commons.views.MyGridLayoutManager
@ -28,9 +60,49 @@ import org.fossify.gallery.adapters.MediaAdapter
import org.fossify.gallery.asynctasks.GetMediaAsynctask
import org.fossify.gallery.databases.GalleryDatabase
import org.fossify.gallery.databinding.ActivityMediaBinding
import org.fossify.gallery.dialogs.*
import org.fossify.gallery.extensions.*
import org.fossify.gallery.helpers.*
import org.fossify.gallery.dialogs.ChangeGroupingDialog
import org.fossify.gallery.dialogs.ChangeSortingDialog
import org.fossify.gallery.dialogs.ChangeViewTypeDialog
import org.fossify.gallery.dialogs.FilterMediaDialog
import org.fossify.gallery.dialogs.GrantAllFilesDialog
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.deleteDBPath
import org.fossify.gallery.extensions.directoryDB
import org.fossify.gallery.extensions.emptyAndDisableTheRecycleBin
import org.fossify.gallery.extensions.emptyTheRecycleBin
import org.fossify.gallery.extensions.favoritesDB
import org.fossify.gallery.extensions.getCachedMedia
import org.fossify.gallery.extensions.getHumanizedFilename
import org.fossify.gallery.extensions.isDownloadsFolder
import org.fossify.gallery.extensions.launchAbout
import org.fossify.gallery.extensions.launchCamera
import org.fossify.gallery.extensions.launchSettings
import org.fossify.gallery.extensions.mediaDB
import org.fossify.gallery.extensions.movePathsInRecycleBin
import org.fossify.gallery.extensions.openPath
import org.fossify.gallery.extensions.openRecycleBin
import org.fossify.gallery.extensions.restoreRecycleBinPaths
import org.fossify.gallery.extensions.showRecycleBinEmptyingDialog
import org.fossify.gallery.extensions.tryDeleteFileDirItem
import org.fossify.gallery.extensions.updateWidgets
import org.fossify.gallery.helpers.DIRECTORY
import org.fossify.gallery.helpers.GET_ANY_INTENT
import org.fossify.gallery.helpers.GET_IMAGE_INTENT
import org.fossify.gallery.helpers.GET_VIDEO_INTENT
import org.fossify.gallery.helpers.GridSpacingItemDecoration
import org.fossify.gallery.helpers.IS_IN_RECYCLE_BIN
import org.fossify.gallery.helpers.MAX_COLUMN_COUNT
import org.fossify.gallery.helpers.MediaFetcher
import org.fossify.gallery.helpers.PATH
import org.fossify.gallery.helpers.PICKED_PATHS
import org.fossify.gallery.helpers.RECYCLE_BIN
import org.fossify.gallery.helpers.SET_WALLPAPER_INTENT
import org.fossify.gallery.helpers.SHOW_ALL
import org.fossify.gallery.helpers.SHOW_FAVORITES
import org.fossify.gallery.helpers.SHOW_RECYCLE_BIN
import org.fossify.gallery.helpers.SHOW_TEMP_HIDDEN_DURATION
import org.fossify.gallery.helpers.SKIP_AUTHENTICATION
import org.fossify.gallery.helpers.SLIDESHOW_START_ON_ENTER
import org.fossify.gallery.interfaces.MediaOperationsListener
import org.fossify.gallery.models.Medium
import org.fossify.gallery.models.ThumbnailItem
@ -49,6 +121,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private var mAllowPickingMultiple = false
private var mShowAll = false
private var mLoadedInitialPhotos = false
private var mShowLoadingIndicator = true
private var mWasFullscreenViewOpen = false
private var mLastSearchedText = ""
private var mLatestMediaId = 0L
@ -98,7 +171,12 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
setupOptionsMenu()
refreshMenuItems()
storeStateVariables()
updateMaterialActivityViews(binding.mediaCoordinator, binding.mediaGrid, useTransparentNavigation = !config.scrollHorizontally, useTopSearchMenu = true)
updateMaterialActivityViews(
mainCoordinatorLayout = binding.mediaCoordinator,
nestedView = binding.mediaGrid,
useTransparentNavigation = !config.scrollHorizontally,
useTopSearchMenu = true
)
if (mShowAll) {
registerFileUpdateListener()
@ -164,6 +242,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
timeFormat = getTimeFormat()
}
binding.loadingIndicator.setIndicatorColor(getProperPrimaryColor())
binding.mediaEmptyTextPlaceholder.setTextColor(getProperTextColor())
binding.mediaEmptyTextPlaceholder2.setTextColor(getProperPrimaryColor())
binding.mediaEmptyTextPlaceholder2.bringToFront()
@ -238,7 +317,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (requestCode == REQUEST_EDIT_IMAGE) {
if (resultCode == Activity.RESULT_OK && resultData != null) {
if (resultCode == RESULT_OK && resultData != null) {
mMedia.clear()
refreshItems()
}
@ -247,7 +326,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun refreshMenuItems() {
val isDefaultFolder = !config.defaultFolder.isEmpty() && File(config.defaultFolder).compareTo(File(mPath)) == 0
val isDefaultFolder = !config.defaultFolder.isEmpty()
&& File(config.defaultFolder).compareTo(File(mPath)) == 0
binding.mediaMenu.getToolbar().menu.apply {
findItem(R.id.group).isVisible = !config.scrollHorizontally
@ -259,11 +339,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
findItem(R.id.folder_view).isVisible = mShowAll
findItem(R.id.open_camera).isVisible = mShowAll
findItem(R.id.about).isVisible = mShowAll
findItem(R.id.create_new_folder).isVisible = !mShowAll && mPath != RECYCLE_BIN && mPath != FAVORITES
findItem(R.id.create_new_folder).isVisible =
!mShowAll && mPath != RECYCLE_BIN && mPath != FAVORITES
findItem(R.id.open_recycle_bin).isVisible = config.useRecycleBin && mPath != RECYCLE_BIN
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible = (!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
findItem(R.id.stop_showing_hidden).isVisible =
(!isRPlus() || isExternalStorageManager()) && config.temporarilyShowHidden
findItem(R.id.set_as_default_folder).isVisible = !isDefaultFolder
findItem(R.id.unset_as_default_folder).isVisible = isDefaultFolder
@ -350,12 +432,16 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun searchQueryChanged(text: String) {
ensureBackgroundThread {
try {
val filtered = mMedia.filter { it is Medium && it.name.contains(text, true) } as ArrayList
val filtered = mMedia
.filter { it is Medium && it.name.contains(text, true) } as ArrayList
filtered.sortBy { it is Medium && !it.name.startsWith(text, true) }
val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList<Medium>, mPath)
val grouped = MediaFetcher(applicationContext).groupMedia(
media = filtered as ArrayList<Medium>, path = mPath
)
runOnUiThread {
if (grouped.isEmpty()) {
binding.mediaEmptyTextPlaceholder.text = getString(org.fossify.commons.R.string.no_items_found)
binding.mediaEmptyTextPlaceholder.text =
getString(org.fossify.commons.R.string.no_items_found)
binding.mediaEmptyTextPlaceholder.beVisible()
binding.mediaFastscroller.beGone()
} else {
@ -394,6 +480,11 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
}
if (mShowLoadingIndicator) {
binding.loadingIndicator.show()
mShowLoadingIndicator = false
}
getMedia()
setupLayoutManager()
}
@ -410,8 +501,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
if (currAdapter == null) {
initZoomListener()
MediaAdapter(
this, mMedia.clone() as ArrayList<ThumbnailItem>, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent,
mAllowPickingMultiple, mPath, binding.mediaGrid
activity = this,
media = mMedia.clone() as ArrayList<ThumbnailItem>,
listener = this,
isAGetIntent = mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent,
allowMultiplePicks = mAllowPickingMultiple,
path = mPath,
recyclerView = binding.mediaGrid
) {
if (it is Medium && !isFinishing) {
itemClicked(it.path)
@ -578,7 +674,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun startAsyncTask() {
mCurrAsyncTask?.stopFetching()
mCurrAsyncTask = GetMediaAsynctask(applicationContext, mPath, mIsGetImageIntent, mIsGetVideoIntent, mShowAll) {
mCurrAsyncTask = GetMediaAsynctask(
context = applicationContext,
mPath = mPath,
isPickImage = mIsGetImageIntent,
isPickVideo = mIsGetVideoIntent,
showAll = mShowAll
) {
ensureBackgroundThread {
val oldMedia = mMedia.clone() as ArrayList<ThumbnailItem>
val newMedia = it
@ -587,14 +689,17 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
// remove cached files that are no longer valid for whatever reason
val newPaths = newMedia.mapNotNull { it as? Medium }.map { it.path }
oldMedia.mapNotNull { it as? Medium }.filter { !newPaths.contains(it.path) }.forEach {
if (mPath == FAVORITES && getDoesFilePathExist(it.path)) {
favoritesDB.deleteFavoritePath(it.path)
mediaDB.updateFavorite(it.path, false)
} else {
mediaDB.deleteMediumPath(it.path)
oldMedia
.mapNotNull { it as? Medium }
.filter { !newPaths.contains(it.path) }
.forEach {
if (mPath == FAVORITES && getDoesFilePathExist(it.path)) {
favoritesDB.deleteFavoritePath(it.path)
mediaDB.updateFavorite(it.path, false)
} else {
mediaDB.deleteMediumPath(it.path)
}
}
}
} catch (e: Exception) {
}
}
@ -604,7 +709,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
private fun isDirEmpty(): Boolean {
return if (mMedia.size <= 0 && config.filterMedia > 0) {
return if (mMedia.isEmpty() && config.filterMedia > 0) {
if (mPath != FAVORITES && mPath != RECYCLE_BIN) {
deleteDirectoryIfEmpty()
deleteDBDirectory()
@ -679,10 +784,16 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
if (config.scrollHorizontally) {
layoutManager.orientation = RecyclerView.HORIZONTAL
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
} else {
layoutManager.orientation = RecyclerView.VERTICAL
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
}
layoutManager.spanCount = config.mediaColumnCnt
@ -702,7 +813,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val layoutManager = binding.mediaGrid.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
layoutManager.orientation = RecyclerView.VERTICAL
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.mediaRefreshLayout.layoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
mZoomListener = null
}
@ -715,11 +829,19 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
var currentGridDecoration: GridSpacingItemDecoration? = null
if (binding.mediaGrid.itemDecorationCount > 0) {
currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration =
binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration.items = media
}
val newGridDecoration = GridSpacingItemDecoration(spanCount, spacing, config.scrollHorizontally, config.fileRoundedCorners, media, useGridPosition)
val newGridDecoration = GridSpacingItemDecoration(
spanCount = spanCount,
spacing = spacing,
isScrollingHorizontally = config.scrollHorizontally,
addSideSpacing = config.fileRoundedCorners,
items = media,
useGridPosition = useGridPosition
)
if (currentGridDecoration.toString() != newGridDecoration.toString()) {
if (currentGridDecoration != null) {
binding.mediaGrid.removeItemDecoration(currentGridDecoration)
@ -756,7 +878,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private fun changeColumnCount() {
val items = ArrayList<RadioItem>()
for (i in 1..MAX_COLUMN_COUNT) {
items.add(RadioItem(i, resources.getQuantityString(org.fossify.commons.R.plurals.column_counts, i, i)))
items.add(
RadioItem(
id = i,
title = resources.getQuantityString(
org.fossify.commons.R.plurals.column_counts, i, i
)
)
)
}
val currentColumnCount = (binding.mediaGrid.layoutManager as MyGridLayoutManager).spanCount
@ -808,10 +937,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
.load(File(path))
.apply(options)
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
override fun onResourceReady(
resource: Bitmap,
transition: Transition<in Bitmap>?
) {
try {
WallpaperManager.getInstance(applicationContext).setBitmap(resource)
setResult(Activity.RESULT_OK)
setResult(RESULT_OK)
} catch (ignored: IOException) {
}
@ -820,8 +952,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
})
} else if (mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent) {
Intent().apply {
data = Uri.parse(path)
setResult(Activity.RESULT_OK, this)
data = path.toUri()
setResult(RESULT_OK, this)
}
finish()
} else {
@ -858,6 +990,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mMedia = media
runOnUiThread {
binding.loadingIndicator.hide()
binding.mediaRefreshLayout.isRefreshing = false
binding.mediaEmptyTextPlaceholder.beVisibleIf(media.isEmpty() && !isFromCache)
binding.mediaEmptyTextPlaceholder2.beVisibleIf(media.isEmpty() && !isFromCache)
@ -872,7 +1005,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mLatestMediaId = getLatestMediaId()
mLatestMediaDateId = getLatestMediaByDateId()
if (!isFromCache) {
val mediaToInsert = (mMedia).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium }
val mediaToInsert = mMedia
.filter { it is Medium && it.deletedTS == 0L }.map { it as Medium }
Thread {
try {
mediaDB.insertAll(mediaToInsert)
@ -883,13 +1017,22 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
override fun tryDeleteFiles(fileDirItems: ArrayList<FileDirItem>, skipRecycleBin: Boolean) {
val filtered = fileDirItems.filter { !getIsPathDirectory(it.path) && it.path.isMediaFile() } as ArrayList
val filtered = fileDirItems
.filter { !getIsPathDirectory(it.path) && it.path.isMediaFile() } as ArrayList
if (filtered.isEmpty()) {
return
}
if (config.useRecycleBin && !skipRecycleBin && !filtered.first().path.startsWith(recycleBinPath)) {
val movingItems = resources.getQuantityString(org.fossify.commons.R.plurals.moving_items_into_bin, filtered.size, filtered.size)
if (
config.useRecycleBin
&& !skipRecycleBin
&& !filtered.first().path.startsWith(recycleBinPath)
) {
val movingItems = resources.getQuantityString(
org.fossify.commons.R.plurals.moving_items_into_bin,
filtered.size,
filtered.size
)
toast(movingItems)
movePathsInRecycleBin(filtered.map { it.path } as ArrayList<String>) {
@ -900,13 +1043,19 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
}
} else {
val deletingItems = resources.getQuantityString(org.fossify.commons.R.plurals.deleting_items, filtered.size, filtered.size)
val deletingItems = resources.getQuantityString(
org.fossify.commons.R.plurals.deleting_items,
filtered.size,
filtered.size
)
toast(deletingItems)
deleteFilteredFiles(filtered)
}
}
private fun shouldSkipAuthentication() = intent.getBooleanExtra(SKIP_AUTHENTICATION, false)
private fun shouldSkipAuthentication(): Boolean {
return intent.getBooleanExtra(SKIP_AUTHENTICATION, false)
}
private fun deleteFilteredFiles(filtered: ArrayList<FileDirItem>) {
deleteFiles(filtered) {
@ -941,7 +1090,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
override fun selectedPaths(paths: ArrayList<String>) {
Intent().apply {
putExtra(PICKED_PATHS, paths)
setResult(Activity.RESULT_OK, this)
setResult(RESULT_OK, this)
}
finish()
}
@ -957,7 +1106,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
}
if (binding.mediaGrid.itemDecorationCount > 0) {
val currentGridDecoration = binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
val currentGridDecoration =
binding.mediaGrid.getItemDecorationAt(0) as GridSpacingItemDecoration
currentGridDecoration.items = media
}
}

View file

@ -13,7 +13,6 @@ 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.isNougatPlus
import org.fossify.commons.models.RadioItem
import org.fossify.gallery.R
import org.fossify.gallery.databinding.ActivitySetWallpaperBinding
@ -127,18 +126,14 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
}
private fun confirmWallpaper() {
if (isNougatPlus()) {
val items = arrayListOf(
RadioItem(WallpaperManager.FLAG_SYSTEM, getString(R.string.home_screen)),
RadioItem(WallpaperManager.FLAG_LOCK, getString(R.string.lock_screen)),
RadioItem(WallpaperManager.FLAG_SYSTEM or WallpaperManager.FLAG_LOCK, getString(R.string.home_and_lock_screen))
)
val items = arrayListOf(
RadioItem(WallpaperManager.FLAG_SYSTEM, getString(R.string.home_screen)),
RadioItem(WallpaperManager.FLAG_LOCK, getString(R.string.lock_screen)),
RadioItem(WallpaperManager.FLAG_SYSTEM or WallpaperManager.FLAG_LOCK, getString(R.string.home_and_lock_screen))
)
RadioGroupDialog(this, items) {
wallpaperFlag = it as Int
binding.cropImageView.croppedImageAsync()
}
} else {
RadioGroupDialog(this, items) {
wallpaperFlag = it as Int
binding.cropImageView.croppedImageAsync()
}
}
@ -156,11 +151,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete
val wantedWidth = (bitmap.width * ratio).toInt()
try {
val scaledBitmap = Bitmap.createScaledBitmap(bitmap, wantedWidth, wantedHeight, true)
if (isNougatPlus()) {
wallpaperManager.setBitmap(scaledBitmap, null, true, wallpaperFlag)
} else {
wallpaperManager.setBitmap(scaledBitmap)
}
wallpaperManager.setBitmap(scaledBitmap, null, true, wallpaperFlag)
setResult(Activity.RESULT_OK)
} catch (e: OutOfMemoryError) {
toast(org.fossify.commons.R.string.out_of_memory_error)

View file

@ -59,6 +59,8 @@ open class SimpleActivity : BaseSimpleActivity() {
override fun getAppLauncherName() = getString(R.string.app_launcher_name)
override fun getRepositoryName() = "Gallery"
protected fun checkNotchSupport() {
if (isPiePlus()) {
val cutoutMode = when {

View file

@ -13,11 +13,21 @@ import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.util.DisplayMetrics
import android.view.*
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.Surface
import android.view.TextureView
import android.view.View
import android.view.WindowManager
import android.widget.RelativeLayout
import android.widget.SeekBar
import androidx.appcompat.content.res.AppCompatResources
import androidx.media3.common.*
import androidx.media3.common.AudioAttributes
import androidx.media3.common.C
import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import androidx.media3.common.VideoSize
import androidx.media3.common.util.UnstableApi
import androidx.media3.datasource.ContentDataSource
import androidx.media3.datasource.DataSource
@ -28,17 +38,56 @@ import androidx.media3.exoplayer.SeekParameters
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource
import org.fossify.commons.extensions.*
import org.fossify.commons.extensions.actionBarHeight
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.getColoredDrawableWithColor
import org.fossify.commons.extensions.getFilenameFromUri
import org.fossify.commons.extensions.getFormattedDuration
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.navigationBarHeight
import org.fossify.commons.extensions.navigationBarOnSide
import org.fossify.commons.extensions.navigationBarWidth
import org.fossify.commons.extensions.onGlobalLayout
import org.fossify.commons.extensions.portrait
import org.fossify.commons.extensions.setDrawablesRelativeWithIntrinsicBounds
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.statusBarHeight
import org.fossify.commons.extensions.updateTextColors
import org.fossify.commons.extensions.viewBinding
import org.fossify.gallery.R
import org.fossify.gallery.databinding.ActivityVideoPlayerBinding
import org.fossify.gallery.extensions.*
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.getFriendlyMessage
import org.fossify.gallery.extensions.hasNavBar
import org.fossify.gallery.extensions.hideSystemUI
import org.fossify.gallery.extensions.mute
import org.fossify.gallery.extensions.openPath
import org.fossify.gallery.extensions.shareMediumPath
import org.fossify.gallery.extensions.showSystemUI
import org.fossify.gallery.extensions.unmute
import org.fossify.gallery.fragments.PlaybackSpeedFragment
import org.fossify.gallery.helpers.*
import org.fossify.gallery.helpers.DRAG_THRESHOLD
import org.fossify.gallery.helpers.EXOPLAYER_MAX_BUFFER_MS
import org.fossify.gallery.helpers.EXOPLAYER_MIN_BUFFER_MS
import org.fossify.gallery.helpers.FAST_FORWARD_VIDEO_MS
import org.fossify.gallery.helpers.GO_TO_NEXT_ITEM
import org.fossify.gallery.helpers.GO_TO_PREV_ITEM
import org.fossify.gallery.helpers.HIDE_SYSTEM_UI_DELAY
import org.fossify.gallery.helpers.MAX_CLOSE_DOWN_GESTURE_DURATION
import org.fossify.gallery.helpers.ROTATE_BY_ASPECT_RATIO
import org.fossify.gallery.helpers.ROTATE_BY_DEVICE_ROTATION
import org.fossify.gallery.helpers.ROTATE_BY_SYSTEM_SETTING
import org.fossify.gallery.helpers.SHOW_NEXT_ITEM
import org.fossify.gallery.helpers.SHOW_PREV_ITEM
import org.fossify.gallery.interfaces.PlaybackSpeedListener
import java.text.DecimalFormat
@UnstableApi
open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener, TextureView.SurfaceTextureListener, PlaybackSpeedListener {
open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener,
TextureView.SurfaceTextureListener, PlaybackSpeedListener {
private val PLAY_WHEN_READY_DRAG_DELAY = 100L
private var mIsFullscreen = false
@ -61,7 +110,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
private var mVideoSize = Point(0, 0)
private var mTimerHandler = Handler()
private var mPlayWhenReadyHandler = Handler()
private var mVolumeController: VolumeController? = null
private var mIgnoreCloseDown = false
@ -119,16 +167,22 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
binding.bottomVideoTimeHolder.videoSeekbar.progress = 0
mTimerHandler.removeCallbacksAndMessages(null)
mPlayWhenReadyHandler.removeCallbacksAndMessages(null)
mVolumeController?.destroy()
}
}
private fun setupOptionsMenu() {
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin =
statusBarHeight
binding.videoToolbar.apply {
setTitleTextColor(Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_three_dots_vector, Color.WHITE)
navigationIcon = resources.getColoredDrawableWithColor(org.fossify.commons.R.drawable.ic_arrow_left_vector, Color.WHITE)
overflowIcon = resources.getColoredDrawableWithColor(
org.fossify.commons.R.drawable.ic_three_dots_vector,
Color.WHITE
)
navigationIcon = resources.getColoredDrawableWithColor(
org.fossify.commons.R.drawable.ic_arrow_left_vector,
Color.WHITE
)
}
updateMenuItemColors(binding.videoToolbar.menu, forceWhiteIcons = true)
@ -156,7 +210,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
}
binding.topShadow.layoutParams.height = statusBarHeight + actionBarHeight
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin = statusBarHeight
(binding.videoAppbar.layoutParams as RelativeLayout.LayoutParams).topMargin =
statusBarHeight
if (!portrait && navigationBarOnSide && navigationBarWidth > 0) {
binding.videoToolbar.setPadding(0, 0, navigationBarWidth, 0)
} else {
@ -189,22 +244,37 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
binding.bottomVideoTimeHolder.videoDuration.setOnClickListener { doSkip(true) }
binding.bottomVideoTimeHolder.videoTogglePlayPause.setOnClickListener { togglePlayPause() }
binding.bottomVideoTimeHolder.videoPlaybackSpeed.setOnClickListener { showPlaybackSpeedPicker() }
binding.bottomVideoTimeHolder.videoToggleMute.setOnClickListener { mVolumeController?.toggleMute() }
binding.bottomVideoTimeHolder.videoToggleMute.setOnClickListener {
config.muteVideos = !config.muteVideos
updatePlayerMuteState()
}
binding.videoSurfaceFrame.setOnClickListener { toggleFullscreen() }
binding.videoSurfaceFrame.controller.settings.swallowDoubleTaps = true
binding.bottomVideoTimeHolder.videoNextFile.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false))
binding.bottomVideoTimeHolder.videoNextFile.beVisibleIf(
intent.getBooleanExtra(
SHOW_NEXT_ITEM,
false
)
)
binding.bottomVideoTimeHolder.videoNextFile.setOnClickListener { handleNextFile() }
binding.bottomVideoTimeHolder.videoPrevFile.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false))
binding.bottomVideoTimeHolder.videoPrevFile.beVisibleIf(
intent.getBooleanExtra(
SHOW_PREV_ITEM,
false
)
)
binding.bottomVideoTimeHolder.videoPrevFile.setOnClickListener { handlePrevFile() }
val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent): Boolean {
handleDoubleTap(e.rawX)
return true
}
})
val gestureDetector =
GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent): Boolean {
handleDoubleTap(e.rawX)
return true
}
})
binding.videoSurfaceFrame.setOnTouchListener { view, event ->
handleEvent(event)
@ -216,17 +286,29 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
binding.videoSurface.surfaceTextureListener = this
if (config.allowVideoGestures) {
binding.videoBrightnessController.initialize(this, binding.slideInfo, true, binding.videoPlayerHolder, singleTap = { x, y ->
toggleFullscreen()
}, doubleTap = { x, y ->
doSkip(false)
})
binding.videoBrightnessController.initialize(
this,
binding.slideInfo,
true,
binding.videoPlayerHolder,
singleTap = { x, y ->
toggleFullscreen()
},
doubleTap = { x, y ->
doSkip(false)
})
binding.videoVolumeController.initialize(this, binding.slideInfo, false, binding.videoPlayerHolder, singleTap = { x, y ->
toggleFullscreen()
}, doubleTap = { x, y ->
doSkip(true)
})
binding.videoVolumeController.initialize(
this,
binding.slideInfo,
false,
binding.videoPlayerHolder,
singleTap = { x, y ->
toggleFullscreen()
},
doubleTap = { x, y ->
doSkip(true)
})
} else {
binding.videoBrightnessController.beGone()
binding.videoVolumeController.beGone()
@ -239,12 +321,6 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
}
mDragThreshold = DRAG_THRESHOLD * resources.displayMetrics.density
mVolumeController = VolumeController(this) { isMuted ->
val icon = if (isMuted) R.drawable.ic_vector_speaker_off else R.drawable.ic_vector_speaker_on
binding.bottomVideoTimeHolder.videoToggleMute.setImageDrawable(
AppCompatResources.getDrawable(this, icon)
)
}
}
private fun initExoPlayer() {
@ -261,7 +337,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
.createMediaSource(MediaItem.fromUri(fileDataSource.uri!!))
val loadControl = DefaultLoadControl.Builder()
.setBufferDurationsMs(EXOPLAYER_MIN_BUFFER_MS, EXOPLAYER_MAX_BUFFER_MS, EXOPLAYER_MIN_BUFFER_MS, EXOPLAYER_MIN_BUFFER_MS)
.setBufferDurationsMs(
EXOPLAYER_MIN_BUFFER_MS,
EXOPLAYER_MAX_BUFFER_MS,
EXOPLAYER_MIN_BUFFER_MS,
EXOPLAYER_MIN_BUFFER_MS
)
.setPrioritizeTimeOverSizeThresholds(true)
.build()
@ -285,11 +366,17 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
prepare()
initListeners()
}
updatePlayerMuteState()
}
private fun ExoPlayer.initListeners() {
addListener(object : Player.Listener {
override fun onPositionDiscontinuity(oldPosition: Player.PositionInfo, newPosition: Player.PositionInfo, @Player.DiscontinuityReason reason: Int) {
override fun onPositionDiscontinuity(
oldPosition: Player.PositionInfo,
newPosition: Player.PositionInfo,
@Player.DiscontinuityReason reason: Int
) {
// Reset progress views when video loops.
if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
binding.bottomVideoTimeHolder.videoSeekbar.progress = 0
@ -313,7 +400,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
override fun onPlayerErrorChanged(error: PlaybackException?) {
binding.errorMessageHolder.errorMessage.apply {
if (error != null) {
text = error.localizedMessage ?: getString(R.string.failed_to_load_media)
text = error.getFriendlyMessage(context)
setTextColor(if (context.config.blackBackground) Color.WHITE else context.getProperTextColor())
fadeIn()
} else {
@ -329,7 +416,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
binding.bottomVideoTimeHolder.videoTogglePlayPause.beVisible()
binding.bottomVideoTimeHolder.videoPlaybackSpeed.beVisible()
binding.bottomVideoTimeHolder.videoToggleMute.beVisible()
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(config.playbackSpeed)}x"
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text =
"${DecimalFormat("#.##").format(config.playbackSpeed)}x"
mDuration = (mExoPlayer!!.duration / 1000).toInt()
binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
@ -397,6 +485,21 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
}
}
private fun updatePlayerMuteState() {
val isMuted = config.muteVideos
val drawableId = if (isMuted) {
mExoPlayer?.mute()
R.drawable.ic_vector_speaker_off
} else {
mExoPlayer?.unmute()
R.drawable.ic_vector_speaker_on
}
binding.bottomVideoTimeHolder.videoToggleMute.setImageDrawable(
AppCompatResources.getDrawable(this, drawableId)
)
}
private fun setPosition(seconds: Int) {
mExoPlayer?.seekTo(seconds * 1000L)
binding.bottomVideoTimeHolder.videoSeekbar.progress = seconds
@ -417,7 +520,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
clearLastVideoSavedProgress()
mCurrTime = (mExoPlayer!!.duration / 1000).toInt()
binding.bottomVideoTimeHolder.videoSeekbar.progress = binding.bottomVideoTimeHolder.videoSeekbar.max
binding.bottomVideoTimeHolder.videoSeekbar.progress =
binding.bottomVideoTimeHolder.videoSeekbar.max
binding.bottomVideoTimeHolder.videoCurrTime.text = mDuration.getFormattedDuration()
pauseVideo()
}
@ -430,7 +534,10 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
private fun saveVideoProgress() {
if (!didVideoEnd()) {
config.saveLastVideoPosition(mUri.toString(), mExoPlayer!!.currentPosition.toInt() / 1000)
config.saveLastVideoPosition(
mUri.toString(),
mExoPlayer!!.currentPosition.toInt() / 1000
)
}
}
@ -476,11 +583,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
private fun changeOrientation() {
mIsOrientationLocked = true
requestedOrientation = if (resources.configuration.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
} else {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
requestedOrientation =
if (resources.configuration.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
} else {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}
private fun toggleFullscreen() {
@ -540,13 +648,20 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
if (isSlow != binding.bottomVideoTimeHolder.videoPlaybackSpeed.tag as? Boolean) {
binding.bottomVideoTimeHolder.videoPlaybackSpeed.tag = isSlow
val drawableId = if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector
val drawableId =
if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector
binding.bottomVideoTimeHolder.videoPlaybackSpeed
.setDrawablesRelativeWithIntrinsicBounds(AppCompatResources.getDrawable(this, drawableId))
.setDrawablesRelativeWithIntrinsicBounds(
AppCompatResources.getDrawable(
this,
drawableId
)
)
}
@SuppressLint("SetTextI18n")
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(speed)}x"
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text =
"${DecimalFormat("#.##").format(speed)}x"
mExoPlayer?.setPlaybackSpeed(speed)
}
@ -577,7 +692,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
if (mExoPlayer != null && !mIsDragged && mIsPlaying) {
mCurrTime = (mExoPlayer!!.currentPosition / 1000).toInt()
binding.bottomVideoTimeHolder.videoSeekbar.progress = mCurrTime
binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
binding.bottomVideoTimeHolder.videoCurrTime.text =
mCurrTime.getFormattedDuration()
}
mTimerHandler.postDelayed(this, 1000)
@ -591,9 +707,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
}
val curr = mExoPlayer!!.currentPosition
val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
val newProgress =
if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
val roundProgress = Math.round(newProgress / 1000f)
val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
val limitedProgress =
Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
setPosition(limitedProgress)
if (!mIsPlaying) {
togglePlayPause()
@ -614,7 +732,10 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
val diffX = event.rawX - mTouchDownX
val diffY = event.rawY - mTouchDownY
if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY)) && binding.videoSurfaceFrame.controller.state.zoom == 1f) {
if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(
diffY
)) && binding.videoSurfaceFrame.controller.state.zoom == 1f
) {
if (!mIsDragged) {
arrayOf(
binding.bottomVideoTimeHolder.videoCurrTime,
@ -631,7 +752,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen
val skipLength = (mDuration * 1000f) * (percent / 100f)
var newProgress = mProgressAtDown + skipLength
newProgress = Math.max(Math.min(mExoPlayer!!.duration.toFloat(), newProgress), 0f)
newProgress =
Math.max(Math.min(mExoPlayer!!.duration.toFloat(), newProgress), 0f)
val newSeconds = (newProgress / 1000).toInt()
setPosition(newSeconds)
resetPlayWhenReady()

View file

@ -189,7 +189,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 && !currentMedium.getIsInRecycleBin()
findItem(R.id.menu_restore_file).isVisible = currentMedium.path.startsWith(recycleBinPath)
findItem(R.id.menu_create_shortcut).isVisible = isOreoPlus()
findItem(R.id.menu_create_shortcut).isVisible = true
findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 && visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0
findItem(R.id.menu_change_orientation).icon = resources.getDrawable(getChangeOrientationIcon())
findItem(R.id.menu_rotate).setShowAsAction(
@ -402,7 +402,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
mIsFullScreen = if (isUpsideDownCakePlus()) {
visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE != 0
} else if (isNougatPlus() && isInMultiWindowMode) {
} else if (isInMultiWindowMode) {
visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE != 0
} else if (visibility and View.SYSTEM_UI_FLAG_LOW_PROFILE == 0) {
false
@ -756,10 +756,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
private fun createShortcut() {
if (!isOreoPlus()) {
return
}
val manager = getSystemService(ShortcutManager::class.java)
if (manager.isRequestPinShortcutSupported) {
val medium = getCurrentMedium() ?: return

View file

@ -5,7 +5,6 @@ import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Icon
import android.os.Build
import android.text.TextUtils
import android.view.Menu
import android.view.MotionEvent
@ -13,7 +12,6 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.RelativeLayout
import androidx.annotation.RequiresApi
import androidx.appcompat.content.res.AppCompatResources
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
@ -23,9 +21,43 @@ import com.google.gson.Gson
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import org.fossify.commons.activities.BaseSimpleActivity
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.FolderLockingNoticeDialog
import org.fossify.commons.dialogs.PropertiesDialog
import org.fossify.commons.dialogs.RenameItemDialog
import org.fossify.commons.dialogs.RenameItemsDialog
import org.fossify.commons.dialogs.SecurityDialog
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.containsNoMedia
import org.fossify.commons.extensions.convertToBitmap
import org.fossify.commons.extensions.doesThisOrParentHaveNoMedia
import org.fossify.commons.extensions.getContrastColor
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getTimeFormat
import org.fossify.commons.extensions.handleDeletePasswordProtection
import org.fossify.commons.extensions.handleLockedFolderOpening
import org.fossify.commons.extensions.isAStorageRootFolder
import org.fossify.commons.extensions.isExternalStorageManager
import org.fossify.commons.extensions.isGif
import org.fossify.commons.extensions.isImageFast
import org.fossify.commons.extensions.isMediaFile
import org.fossify.commons.extensions.isRawFast
import org.fossify.commons.extensions.isSvg
import org.fossify.commons.extensions.isVideoFast
import org.fossify.commons.extensions.isVisible
import org.fossify.commons.extensions.rescanPaths
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.FAVORITES
import org.fossify.commons.helpers.SHOW_ALL_TABS
import org.fossify.commons.helpers.SORT_BY_CUSTOM
import org.fossify.commons.helpers.VIEW_TYPE_LIST
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isRPlus
import org.fossify.commons.interfaces.ItemMoveCallback
import org.fossify.commons.interfaces.ItemTouchHelperContract
import org.fossify.commons.interfaces.StartReorderDragListener
@ -39,8 +71,38 @@ import org.fossify.gallery.databinding.DirectoryItemListBinding
import org.fossify.gallery.dialogs.ConfirmDeleteFolderDialog
import org.fossify.gallery.dialogs.ExcludeFolderDialog
import org.fossify.gallery.dialogs.PickMediumDialog
import org.fossify.gallery.extensions.*
import org.fossify.gallery.helpers.*
import org.fossify.gallery.extensions.addNoMedia
import org.fossify.gallery.extensions.checkAppendingHidden
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.directoryDB
import org.fossify.gallery.extensions.emptyAndDisableTheRecycleBin
import org.fossify.gallery.extensions.emptyTheRecycleBin
import org.fossify.gallery.extensions.favoritesDB
import org.fossify.gallery.extensions.fixDateTaken
import org.fossify.gallery.extensions.getShortcutImage
import org.fossify.gallery.extensions.isThisOrParentFolderHidden
import org.fossify.gallery.extensions.loadImage
import org.fossify.gallery.extensions.mediaDB
import org.fossify.gallery.extensions.removeNoMedia
import org.fossify.gallery.extensions.showRecycleBinEmptyingDialog
import org.fossify.gallery.extensions.tryCopyMoveFilesTo
import org.fossify.gallery.helpers.DIRECTORY
import org.fossify.gallery.helpers.FOLDER_MEDIA_CNT_BRACKETS
import org.fossify.gallery.helpers.FOLDER_MEDIA_CNT_LINE
import org.fossify.gallery.helpers.FOLDER_STYLE_ROUNDED_CORNERS
import org.fossify.gallery.helpers.FOLDER_STYLE_SQUARE
import org.fossify.gallery.helpers.LOCATION_INTERNAL
import org.fossify.gallery.helpers.LOCATION_SD
import org.fossify.gallery.helpers.PATH
import org.fossify.gallery.helpers.RECYCLE_BIN
import org.fossify.gallery.helpers.ROUNDED_CORNERS_BIG
import org.fossify.gallery.helpers.ROUNDED_CORNERS_NONE
import org.fossify.gallery.helpers.ROUNDED_CORNERS_SMALL
import org.fossify.gallery.helpers.TYPE_GIFS
import org.fossify.gallery.helpers.TYPE_IMAGES
import org.fossify.gallery.helpers.TYPE_RAWS
import org.fossify.gallery.helpers.TYPE_SVGS
import org.fossify.gallery.helpers.TYPE_VIDEOS
import org.fossify.gallery.interfaces.DirectoryOperationsListener
import org.fossify.gallery.models.AlbumCover
import org.fossify.gallery.models.Directory
@ -48,10 +110,16 @@ import java.io.File
import java.util.Collections
class DirectoryAdapter(
activity: BaseSimpleActivity, var dirs: ArrayList<Directory>, val listener: DirectoryOperationsListener?, recyclerView: MyRecyclerView,
val isPickIntent: Boolean, val swipeRefreshLayout: SwipeRefreshLayout? = null, itemClick: (Any) -> Unit
activity: BaseSimpleActivity,
var dirs: ArrayList<Directory>,
val listener: DirectoryOperationsListener?,
recyclerView: MyRecyclerView,
val isPickIntent: Boolean,
val swipeRefreshLayout: SwipeRefreshLayout? = null,
itemClick: (Any) -> Unit
) :
MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract, RecyclerViewFastScroller.OnPopupTextUpdate {
MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract,
RecyclerViewFastScroller.OnPopupTextUpdate {
private val config = activity.config
private val isListViewType = config.viewTypeFolders == VIEW_TYPE_LIST
@ -119,7 +187,7 @@ class DirectoryAdapter(
findItem(R.id.cab_empty_recycle_bin).isVisible = isOneItemSelected && selectedPaths.first() == RECYCLE_BIN
findItem(R.id.cab_empty_disable_recycle_bin).isVisible = isOneItemSelected && selectedPaths.first() == RECYCLE_BIN
findItem(R.id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected
findItem(R.id.cab_create_shortcut).isVisible = isOneItemSelected
checkHideBtnVisibility(this, selectedPaths)
checkPinBtnVisibility(this, selectedPaths)
@ -549,10 +617,6 @@ class DirectoryAdapter(
}
private fun tryCreateShortcut() {
if (!isOreoPlus()) {
return
}
activity.handleLockedFolderOpening(getFirstSelectedItemPath() ?: "") { success ->
if (success) {
createShortcut()
@ -560,7 +624,6 @@ class DirectoryAdapter(
}
}
@RequiresApi(Build.VERSION_CODES.O)
private fun createShortcut() {
val manager = activity.getSystemService(ShortcutManager::class.java)
if (manager.isRequestPinShortcutSupported) {
@ -821,6 +884,14 @@ class DirectoryAdapter(
else -> ROUNDED_CORNERS_BIG
}
dirThumbnail.setBackgroundResource(
when (roundedCorners) {
ROUNDED_CORNERS_SMALL -> R.drawable.placeholder_rounded_small
ROUNDED_CORNERS_BIG -> R.drawable.placeholder_rounded_big
else -> R.drawable.placeholder_square
}
)
activity.loadImage(
type = thumbnailType,
path = directory.tmb,

View file

@ -4,8 +4,6 @@ import android.content.Intent
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.graphics.drawable.Icon
import android.os.Handler
import android.os.Looper
import android.view.Menu
import android.view.View
import android.view.ViewGroup
@ -20,29 +18,92 @@ import org.fossify.commons.adapters.MyRecyclerViewAdapter
import org.fossify.commons.dialogs.PropertiesDialog
import org.fossify.commons.dialogs.RenameDialog
import org.fossify.commons.dialogs.RenameItemDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.*
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.formatSize
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getFormattedDuration
import org.fossify.commons.extensions.getOTGPublicPath
import org.fossify.commons.extensions.getParentPath
import org.fossify.commons.extensions.getTimeFormat
import org.fossify.commons.extensions.handleDeletePasswordProtection
import org.fossify.commons.extensions.hasOTGConnected
import org.fossify.commons.extensions.internalStoragePath
import org.fossify.commons.extensions.isAStorageRootFolder
import org.fossify.commons.extensions.isAccessibleWithSAFSdk30
import org.fossify.commons.extensions.isExternalStorageManager
import org.fossify.commons.extensions.isImageFast
import org.fossify.commons.extensions.isPathOnOTG
import org.fossify.commons.extensions.isRestrictedWithSAFSdk30
import org.fossify.commons.extensions.needsStupidWritePermissions
import org.fossify.commons.extensions.recycleBinPath
import org.fossify.commons.extensions.rescanPaths
import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.FAVORITES
import org.fossify.commons.helpers.VIEW_TYPE_LIST
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isRPlus
import org.fossify.commons.helpers.sumByLong
import org.fossify.commons.models.FileDirItem
import org.fossify.commons.views.MyRecyclerView
import org.fossify.gallery.R
import org.fossify.gallery.activities.ViewPagerActivity
import org.fossify.gallery.databinding.*
import org.fossify.gallery.databinding.PhotoItemGridBinding
import org.fossify.gallery.databinding.PhotoItemListBinding
import org.fossify.gallery.databinding.ThumbnailSectionBinding
import org.fossify.gallery.databinding.VideoItemGridBinding
import org.fossify.gallery.databinding.VideoItemListBinding
import org.fossify.gallery.dialogs.DeleteWithRememberDialog
import org.fossify.gallery.extensions.*
import org.fossify.gallery.helpers.*
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.fixDateTaken
import org.fossify.gallery.extensions.getShortcutImage
import org.fossify.gallery.extensions.handleMediaManagementPrompt
import org.fossify.gallery.extensions.launchResizeImageDialog
import org.fossify.gallery.extensions.launchResizeMultipleImagesDialog
import org.fossify.gallery.extensions.loadImage
import org.fossify.gallery.extensions.openEditor
import org.fossify.gallery.extensions.openPath
import org.fossify.gallery.extensions.rescanFolderMedia
import org.fossify.gallery.extensions.restoreRecycleBinPaths
import org.fossify.gallery.extensions.saveRotatedImageToFile
import org.fossify.gallery.extensions.setAs
import org.fossify.gallery.extensions.shareMediaPaths
import org.fossify.gallery.extensions.shareMediumPath
import org.fossify.gallery.extensions.toggleFileVisibility
import org.fossify.gallery.extensions.tryCopyMoveFilesTo
import org.fossify.gallery.extensions.updateDBMediaPath
import org.fossify.gallery.extensions.updateFavorite
import org.fossify.gallery.extensions.updateFavoritePaths
import org.fossify.gallery.helpers.PATH
import org.fossify.gallery.helpers.RECYCLE_BIN
import org.fossify.gallery.helpers.ROUNDED_CORNERS_BIG
import org.fossify.gallery.helpers.ROUNDED_CORNERS_NONE
import org.fossify.gallery.helpers.ROUNDED_CORNERS_SMALL
import org.fossify.gallery.helpers.SHOW_ALL
import org.fossify.gallery.helpers.SHOW_FAVORITES
import org.fossify.gallery.helpers.SHOW_RECYCLE_BIN
import org.fossify.gallery.helpers.TYPE_GIFS
import org.fossify.gallery.helpers.TYPE_RAWS
import org.fossify.gallery.interfaces.MediaOperationsListener
import org.fossify.gallery.models.Medium
import org.fossify.gallery.models.ThumbnailItem
import org.fossify.gallery.models.ThumbnailSection
class MediaAdapter(
activity: BaseSimpleActivity, var media: ArrayList<ThumbnailItem>, val listener: MediaOperationsListener?, val isAGetIntent: Boolean,
val allowMultiplePicks: Boolean, val path: String, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit
) :
MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
activity: BaseSimpleActivity,
var media: ArrayList<ThumbnailItem>,
val listener: MediaOperationsListener?,
val isAGetIntent: Boolean,
val allowMultiplePicks: Boolean,
val path: String,
recyclerView: MyRecyclerView,
itemClick: (Any) -> Unit
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick),
RecyclerViewFastScroller.OnPopupTextUpdate {
private val INSTANT_LOAD_DURATION = 2000L
private val IMAGE_LOAD_DELAY = 100L
private val ITEM_SECTION = 0
private val ITEM_MEDIUM_VIDEO_PORTRAIT = 1
private val ITEM_MEDIUM_PHOTO = 2
@ -50,10 +111,7 @@ class MediaAdapter(
private val config = activity.config
private val viewType = config.getFolderViewType(if (config.showAll) SHOW_ALL else path)
private val isListViewType = viewType == VIEW_TYPE_LIST
private var visibleItemPaths = ArrayList<String>()
private var rotatedImagePaths = ArrayList<String>()
private var loadImageInstantly = false
private var delayHandler = Handler(Looper.getMainLooper())
private var currentMediaHash = media.hashCode()
private val hasOTGConnected = activity.hasOTGConnected()
@ -69,7 +127,6 @@ class MediaAdapter(
init {
setupDragListener(true)
enableInstantLoad()
}
override fun getActionMenuId() = R.menu.cab_media
@ -97,10 +154,6 @@ class MediaAdapter(
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val tmbItem = media.getOrNull(position) ?: return
if (tmbItem is Medium) {
visibleItemPaths.add(tmbItem.path)
}
val allowLongPress = (!isAGetIntent || allowMultiplePicks) && tmbItem is Medium
holder.bindView(tmbItem, tmbItem is Medium, allowLongPress) { itemView, adapterPosition ->
if (tmbItem is Medium) {
@ -143,7 +196,7 @@ class MediaAdapter(
findItem(R.id.cab_resize).isVisible = canResize(selectedItems)
findItem(R.id.cab_confirm_selection).isVisible = isAGetIntent && allowMultiplePicks && selectedKeys.isNotEmpty()
findItem(R.id.cab_restore_recycle_bin_files).isVisible = selectedPaths.all { it.startsWith(activity.recycleBinPath) }
findItem(R.id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected
findItem(R.id.cab_create_shortcut).isVisible = isOneItemSelected
checkHideBtnVisibility(this, selectedItems)
checkFavoriteBtnVisibility(this, selectedItems)
@ -197,7 +250,6 @@ class MediaAdapter(
super.onViewRecycled(holder)
if (!activity.isDestroyed) {
val itemView = holder.itemView
visibleItemPaths.remove(itemView.allViews.firstOrNull { it.id == R.id.medium_name }?.tag)
val tmb = itemView.allViews.firstOrNull { it.id == R.id.medium_thumbnail }
if (tmb != null) {
Glide.with(activity).clear(tmb)
@ -254,7 +306,6 @@ class MediaAdapter(
activity.updateDBMediaPath(firstPath, it)
activity.runOnUiThread {
enableInstantLoad()
listener?.refreshItems()
finishActMode()
}
@ -262,7 +313,6 @@ class MediaAdapter(
}
} else {
RenameDialog(activity, getSelectedPaths(), true) {
enableInstantLoad()
listener?.refreshItems()
finishActMode()
}
@ -433,10 +483,6 @@ class MediaAdapter(
}
private fun createShortcut() {
if (!isOreoPlus()) {
return
}
val manager = activity.getSystemService(ShortcutManager::class.java)
if (manager.isRequestPinShortcutSupported) {
val path = getSelectedPaths().first()
@ -572,7 +618,6 @@ class MediaAdapter(
if (thumbnailItems.hashCode() != currentMediaHash) {
currentMediaHash = thumbnailItems.hashCode()
media = thumbnailItems
enableInstantLoad()
notifyDataSetChanged()
finishActMode()
}
@ -580,7 +625,6 @@ class MediaAdapter(
fun updateDisplayFilenames(displayFilenames: Boolean) {
this.displayFilenames = displayFilenames
enableInstantLoad()
notifyDataSetChanged()
}
@ -599,13 +643,6 @@ class MediaAdapter(
notifyDataSetChanged()
}
private fun enableInstantLoad() {
loadImageInstantly = true
delayHandler.postDelayed({
loadImageInstantly = false
}, INSTANT_LOAD_DURATION)
}
private fun setupThumbnail(view: View, medium: Medium) {
val isSelected = selectedKeys.contains(medium.path.hashCode())
bindItem(view, medium).apply {
@ -681,46 +718,29 @@ class MediaAdapter(
else -> ROUNDED_CORNERS_NONE
}
if (loadImageInstantly) {
activity.loadImage(
type = medium.type,
path = path,
target = mediumThumbnail,
horizontalScroll = scrollHorizontally,
animateGifs = animateGifs,
cropThumbnails = cropThumbnails,
roundCorners = roundedCorners,
signature = medium.getKey(),
skipMemoryCacheAtPaths = rotatedImagePaths,
onError = {
mediumThumbnail.scaleType = ImageView.ScaleType.CENTER
mediumThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))
}
)
} else {
mediumThumbnail.setImageDrawable(null)
mediumThumbnail.isHorizontalScrolling = scrollHorizontally
delayHandler.postDelayed({
val isVisible = visibleItemPaths.contains(medium.path)
if (isVisible) {
activity.loadImage(
type = medium.type,
path = path,
target = mediumThumbnail,
horizontalScroll = scrollHorizontally,
animateGifs = animateGifs,
cropThumbnails = cropThumbnails,
roundCorners = roundedCorners,
signature = medium.getKey(),
skipMemoryCacheAtPaths = rotatedImagePaths,
onError = {
mediumThumbnail.scaleType = ImageView.ScaleType.CENTER
mediumThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))
}
)
}
}, IMAGE_LOAD_DELAY)
}
mediumThumbnail.setBackgroundResource(
when (roundedCorners) {
ROUNDED_CORNERS_SMALL -> R.drawable.placeholder_rounded_small
ROUNDED_CORNERS_BIG -> R.drawable.placeholder_rounded_big
else -> R.drawable.placeholder_square
}
)
activity.loadImage(
type = medium.type,
path = path,
target = mediumThumbnail,
horizontalScroll = scrollHorizontally,
animateGifs = animateGifs,
cropThumbnails = cropThumbnails,
roundCorners = roundedCorners,
signature = medium.getKey(),
skipMemoryCacheAtPaths = rotatedImagePaths,
onError = {
mediumThumbnail.scaleType = ImageView.ScaleType.CENTER
mediumThumbnail.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_vector_warning_colored))
}
)
if (isListViewType) {
mediumName.setTextColor(textColor)

View file

@ -2,16 +2,32 @@ package org.fossify.gallery.dialogs
import android.content.DialogInterface
import org.fossify.commons.activities.BaseSimpleActivity
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.*
import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.getAlertDialogBuilder
import org.fossify.commons.extensions.isVisible
import org.fossify.commons.extensions.setupDialogStuff
import org.fossify.commons.helpers.SORT_BY_COUNT
import org.fossify.commons.helpers.SORT_BY_CUSTOM
import org.fossify.commons.helpers.SORT_BY_DATE_MODIFIED
import org.fossify.commons.helpers.SORT_BY_DATE_TAKEN
import org.fossify.commons.helpers.SORT_BY_NAME
import org.fossify.commons.helpers.SORT_BY_PATH
import org.fossify.commons.helpers.SORT_BY_RANDOM
import org.fossify.commons.helpers.SORT_BY_SIZE
import org.fossify.commons.helpers.SORT_DESCENDING
import org.fossify.commons.helpers.SORT_USE_NUMERIC_VALUE
import org.fossify.gallery.R
import org.fossify.gallery.databinding.DialogChangeSortingBinding
import org.fossify.gallery.extensions.config
import org.fossify.gallery.helpers.SHOW_ALL
class ChangeSortingDialog(
val activity: BaseSimpleActivity, val isDirectorySorting: Boolean, val showFolderCheckbox: Boolean,
val path: String = "", val callback: () -> Unit
val activity: BaseSimpleActivity,
val isDirectorySorting: Boolean,
val showFolderCheckbox: Boolean,
val path: String = "",
val callback: () -> Unit
) :
DialogInterface.OnClickListener {
private var currSorting = 0
@ -20,11 +36,24 @@ class ChangeSortingDialog(
private val binding: DialogChangeSortingBinding
init {
currSorting = if (isDirectorySorting) config.directorySorting else config.getFolderSorting(pathToUse)
binding = DialogChangeSortingBinding.inflate(activity.layoutInflater).apply {
sortingDialogOrderDivider.beVisibleIf(showFolderCheckbox || (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
currSorting = if (isDirectorySorting) {
config.directorySorting
} else {
config.getFolderSorting(pathToUse)
}
binding = DialogChangeSortingBinding.inflate(activity.layoutInflater).apply {
sortingDialogRadioNumberOfItems.beVisibleIf(isDirectorySorting)
sortingDialogOrderDivider.beVisibleIf(
beVisible = showFolderCheckbox
|| (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0)
)
sortingDialogNumericSorting.beVisibleIf(
beVisible = showFolderCheckbox
&& (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0)
)
sortingDialogNumericSorting.beVisibleIf(showFolderCheckbox && (currSorting and SORT_BY_NAME != 0 || currSorting and SORT_BY_PATH != 0))
sortingDialogNumericSorting.isChecked = currSorting and SORT_USE_NUMERIC_VALUE != 0
sortingDialogUseForThisFolder.beVisibleIf(showFolderCheckbox)
@ -47,11 +76,20 @@ class ChangeSortingDialog(
private fun setupSortRadio() {
val sortingRadio = binding.sortingDialogRadioSorting
sortingRadio.setOnCheckedChangeListener { _, checkedId ->
val isSortingByNameOrPath = checkedId == binding.sortingDialogRadioName.id || checkedId == binding.sortingDialogRadioPath.id
binding.sortingDialogNumericSorting.beVisibleIf(isSortingByNameOrPath)
binding.sortingDialogOrderDivider.beVisibleIf(binding.sortingDialogNumericSorting.isVisible() || binding.sortingDialogUseForThisFolder.isVisible())
val isSortingByNameOrPath =
checkedId == binding.sortingDialogRadioName.id
|| checkedId == binding.sortingDialogRadioPath.id
binding.sortingDialogNumericSorting.beVisibleIf(isSortingByNameOrPath)
binding.sortingDialogOrderDivider.beVisibleIf(
binding.sortingDialogNumericSorting.isVisible()
|| binding.sortingDialogUseForThisFolder.isVisible()
)
val hideSortOrder =
checkedId == binding.sortingDialogRadioCustom.id
|| checkedId == binding.sortingDialogRadioRandom.id
val hideSortOrder = checkedId == binding.sortingDialogRadioCustom.id || checkedId == binding.sortingDialogRadioRandom.id
binding.sortingDialogRadioOrder.beGoneIf(hideSortOrder)
binding.sortingDialogSortingDivider.beGoneIf(hideSortOrder)
}
@ -59,6 +97,7 @@ class ChangeSortingDialog(
val sortBtn = when {
currSorting and SORT_BY_PATH != 0 -> binding.sortingDialogRadioPath
currSorting and SORT_BY_SIZE != 0 -> binding.sortingDialogRadioSize
currSorting and SORT_BY_COUNT != 0 -> binding.sortingDialogRadioNumberOfItems
currSorting and SORT_BY_DATE_MODIFIED != 0 -> binding.sortingDialogRadioLastModified
currSorting and SORT_BY_DATE_TAKEN != 0 -> binding.sortingDialogRadioDateTaken
currSorting and SORT_BY_RANDOM != 0 -> binding.sortingDialogRadioRandom
@ -83,6 +122,7 @@ class ChangeSortingDialog(
R.id.sorting_dialog_radio_name -> SORT_BY_NAME
R.id.sorting_dialog_radio_path -> SORT_BY_PATH
R.id.sorting_dialog_radio_size -> SORT_BY_SIZE
R.id.sorting_dialog_radio_number_of_items -> SORT_BY_COUNT
R.id.sorting_dialog_radio_last_modified -> SORT_BY_DATE_MODIFIED
R.id.sorting_dialog_radio_random -> SORT_BY_RANDOM
R.id.sorting_dialog_radio_custom -> SORT_BY_CUSTOM

View file

@ -1,7 +1,8 @@
package org.fossify.gallery.dialogs
import android.graphics.Color
import android.view.KeyEvent
import android.view.KeyEvent.ACTION_UP
import android.view.KeyEvent.KEYCODE_BACK
import android.view.inputmethod.EditorInfo
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
@ -54,10 +55,12 @@ class PickDirectoryDialog(
.setPositiveButton(org.fossify.commons.R.string.ok, null)
.setNegativeButton(org.fossify.commons.R.string.cancel, null)
.setOnKeyListener { dialogInterface, i, keyEvent ->
if (keyEvent.action == KeyEvent.ACTION_UP && i == KeyEvent.KEYCODE_BACK) {
return@setOnKeyListener if (keyEvent.action == ACTION_UP && i == KEYCODE_BACK) {
backPressed()
true
} else {
false
}
true
}
if (showOtherFolderButton) {

View file

@ -1,6 +1,5 @@
package org.fossify.gallery.extensions
import android.annotation.TargetApi
import android.app.Activity
import android.content.ContentProviderOperation
import android.content.ContentValues
@ -12,7 +11,6 @@ import android.graphics.Point
import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.provider.MediaStore.Files
@ -689,7 +687,6 @@ fun BaseSimpleActivity.saveRotatedImageToFile(oldPath: String, newPath: String,
}
}
@TargetApi(Build.VERSION_CODES.N)
fun Activity.tryRotateByExif(path: String, degrees: Int, showToasts: Boolean, callback: () -> Unit): Boolean {
return try {
val file = File(path)
@ -830,10 +827,8 @@ fun BaseSimpleActivity.launchResizeImageDialog(path: String, callback: (() -> Un
fun BaseSimpleActivity.resizeImage(oldPath: String, newPath: String, size: Point, callback: (success: Boolean) -> Unit) {
var oldExif: ExifInterface? = null
if (isNougatPlus()) {
val inputStream = contentResolver.openInputStream(Uri.fromFile(File(oldPath)))
oldExif = ExifInterface(inputStream!!)
}
val inputStream = contentResolver.openInputStream(Uri.fromFile(File(oldPath)))
oldExif = ExifInterface(inputStream!!)
val newBitmap = Glide.with(applicationContext).asBitmap().load(oldPath).submit(size.x, size.y).get()
@ -845,10 +840,8 @@ fun BaseSimpleActivity.resizeImage(oldPath: String, newPath: String, size: Point
try {
newBitmap.compress(newFile.absolutePath.getCompressionFormat(), 90, out)
if (isNougatPlus()) {
val newExif = ExifInterface(newFile.absolutePath)
oldExif?.copyNonDimensionAttributesTo(newExif)
}
val newExif = ExifInterface(newFile.absolutePath)
oldExif.copyNonDimensionAttributesTo(newExif)
} catch (ignored: Exception) {
}
@ -907,10 +900,9 @@ fun Activity.getShortcutImage(tmb: String, drawable: Drawable, callback: () -> U
}
}
@TargetApi(Build.VERSION_CODES.N)
fun Activity.showFileOnMap(path: String) {
val exif = try {
if (path.startsWith("content://") && isNougatPlus()) {
if (path.startsWith("content://")) {
ExifInterface(contentResolver.openInputStream(Uri.parse(path))!!)
} else {
ExifInterface(path)

View file

@ -28,29 +28,96 @@ import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.FitCenter
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.signature.ObjectKey
import com.squareup.picasso.Picasso
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.*
import org.fossify.commons.extensions.doesThisOrParentHaveNoMedia
import org.fossify.commons.extensions.getDocumentFile
import org.fossify.commons.extensions.getDoesFilePathExist
import org.fossify.commons.extensions.getDuration
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getLongValue
import org.fossify.commons.extensions.getOTGPublicPath
import org.fossify.commons.extensions.getParentPath
import org.fossify.commons.extensions.getStringValue
import org.fossify.commons.extensions.humanizePath
import org.fossify.commons.extensions.internalStoragePath
import org.fossify.commons.extensions.isGif
import org.fossify.commons.extensions.isPathOnOTG
import org.fossify.commons.extensions.isPathOnSD
import org.fossify.commons.extensions.isPng
import org.fossify.commons.extensions.isPortrait
import org.fossify.commons.extensions.isRawFast
import org.fossify.commons.extensions.isSvg
import org.fossify.commons.extensions.isVideoFast
import org.fossify.commons.extensions.isWebP
import org.fossify.commons.extensions.normalizeString
import org.fossify.commons.extensions.otgPath
import org.fossify.commons.extensions.recycleBinPath
import org.fossify.commons.extensions.sdCardPath
import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.AlphanumericComparator
import org.fossify.commons.helpers.FAVORITES
import org.fossify.commons.helpers.NOMEDIA
import org.fossify.commons.helpers.SORT_BY_COUNT
import org.fossify.commons.helpers.SORT_BY_CUSTOM
import org.fossify.commons.helpers.SORT_BY_DATE_MODIFIED
import org.fossify.commons.helpers.SORT_BY_DATE_TAKEN
import org.fossify.commons.helpers.SORT_BY_NAME
import org.fossify.commons.helpers.SORT_BY_PATH
import org.fossify.commons.helpers.SORT_BY_RANDOM
import org.fossify.commons.helpers.SORT_BY_SIZE
import org.fossify.commons.helpers.SORT_DESCENDING
import org.fossify.commons.helpers.SORT_USE_NUMERIC_VALUE
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.sumByLong
import org.fossify.commons.views.MySquareImageView
import org.fossify.gallery.R
import org.fossify.gallery.asynctasks.GetMediaAsynctask
import org.fossify.gallery.databases.GalleryDatabase
import org.fossify.gallery.helpers.*
import org.fossify.gallery.interfaces.*
import org.fossify.gallery.models.*
import org.fossify.gallery.helpers.Config
import org.fossify.gallery.helpers.GROUP_BY_DATE_TAKEN_DAILY
import org.fossify.gallery.helpers.GROUP_BY_DATE_TAKEN_MONTHLY
import org.fossify.gallery.helpers.GROUP_BY_LAST_MODIFIED_DAILY
import org.fossify.gallery.helpers.GROUP_BY_LAST_MODIFIED_MONTHLY
import org.fossify.gallery.helpers.IsoTypeReader
import org.fossify.gallery.helpers.LOCATION_INTERNAL
import org.fossify.gallery.helpers.LOCATION_OTG
import org.fossify.gallery.helpers.LOCATION_SD
import org.fossify.gallery.helpers.MediaFetcher
import org.fossify.gallery.helpers.MyWidgetProvider
import org.fossify.gallery.helpers.PicassoRoundedCornersTransformation
import org.fossify.gallery.helpers.RECYCLE_BIN
import org.fossify.gallery.helpers.ROUNDED_CORNERS_NONE
import org.fossify.gallery.helpers.ROUNDED_CORNERS_SMALL
import org.fossify.gallery.helpers.SHOW_ALL
import org.fossify.gallery.helpers.THUMBNAIL_FADE_DURATION_MS
import org.fossify.gallery.helpers.TYPE_GIFS
import org.fossify.gallery.helpers.TYPE_IMAGES
import org.fossify.gallery.helpers.TYPE_PORTRAITS
import org.fossify.gallery.helpers.TYPE_RAWS
import org.fossify.gallery.helpers.TYPE_SVGS
import org.fossify.gallery.helpers.TYPE_VIDEOS
import org.fossify.gallery.interfaces.DateTakensDao
import org.fossify.gallery.interfaces.DirectoryDao
import org.fossify.gallery.interfaces.FavoritesDao
import org.fossify.gallery.interfaces.MediumDao
import org.fossify.gallery.interfaces.WidgetsDao
import org.fossify.gallery.models.AlbumCover
import org.fossify.gallery.models.Directory
import org.fossify.gallery.models.Favorite
import org.fossify.gallery.models.Medium
import org.fossify.gallery.models.ThumbnailItem
import org.fossify.gallery.svg.SvgSoftwareLayerSetter
import java.io.File
import java.io.FileInputStream
import java.nio.ByteBuffer
import java.nio.channels.FileChannel
import java.util.Locale
import kotlin.collections.set
import kotlin.math.max
import kotlin.math.min
val Context.audioManager get() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
@ -61,15 +128,19 @@ fun Context.getHumanizedFilename(path: String): String {
val Context.config: Config get() = Config.newInstance(applicationContext)
val Context.widgetsDB: WidgetsDao get() = GalleryDatabase.getInstance(applicationContext).WidgetsDao()
val Context.widgetsDB: WidgetsDao
get() = GalleryDatabase.getInstance(applicationContext).WidgetsDao()
val Context.mediaDB: MediumDao get() = GalleryDatabase.getInstance(applicationContext).MediumDao()
val Context.directoryDB: DirectoryDao get() = GalleryDatabase.getInstance(applicationContext).DirectoryDao()
val Context.directoryDB: DirectoryDao
get() = GalleryDatabase.getInstance(applicationContext).DirectoryDao()
val Context.favoritesDB: FavoritesDao get() = GalleryDatabase.getInstance(applicationContext).FavoritesDao()
val Context.favoritesDB: FavoritesDao
get() = GalleryDatabase.getInstance(applicationContext).FavoritesDao()
val Context.dateTakensDB: DateTakensDao get() = GalleryDatabase.getInstance(applicationContext).DateTakensDao()
val Context.dateTakensDB: DateTakensDao
get() = GalleryDatabase.getInstance(applicationContext).DateTakensDao()
val Context.recycleBin: File get() = filesDir
@ -125,7 +196,7 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
return newDirsOrdered
}
dirs.sortWith(Comparator { o1, o2 ->
dirs.sortWith { o1, o2 ->
o1 as Directory
o2 as Directory
@ -141,11 +212,12 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(
o1.sortValue.normalizeString().lowercase(Locale.getDefault()),
o2.sortValue.normalizeString().lowercase(Locale.getDefault())
string1 = o1.sortValue.normalizeString().lowercase(Locale.getDefault()),
string2 = o2.sortValue.normalizeString().lowercase(Locale.getDefault())
)
} else {
o1.sortValue.normalizeString().lowercase(Locale.getDefault()).compareTo(o2.sortValue.normalizeString().lowercase(Locale.getDefault()))
o1.sortValue.normalizeString().lowercase(Locale.getDefault())
.compareTo(o2.sortValue.normalizeString().lowercase(Locale.getDefault()))
}
}
@ -159,19 +231,17 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
}
if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.sortValue.lowercase(Locale.getDefault()), o2.sortValue.lowercase(Locale.getDefault()))
AlphanumericComparator().compare(
string1 = o1.sortValue.lowercase(Locale.getDefault()),
string2 = o2.sortValue.lowercase(Locale.getDefault())
)
} else {
o1.sortValue.lowercase(Locale.getDefault()).compareTo(o2.sortValue.lowercase(Locale.getDefault()))
o1.sortValue.lowercase(Locale.getDefault())
.compareTo(o2.sortValue.lowercase(Locale.getDefault()))
}
}
sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(
o1.sortValue.lowercase(Locale.getDefault()),
o2.sortValue.lowercase(Locale.getDefault())
)
sorting and SORT_BY_SIZE != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
sorting and SORT_BY_DATE_MODIFIED != 0 -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
// SORT_BY_SIZE, SORT_BY_COUNT, SORT_BY_DATE_MODIFIED are numerical
else -> (o1.sortValue.toLongOrNull() ?: 0).compareTo(o2.sortValue.toLongOrNull() ?: 0)
}
@ -179,12 +249,16 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
result *= -1
}
result
})
}
return movePinnedDirectoriesToFront(dirs)
}
fun Context.getDirsToShow(dirs: ArrayList<Directory>, allDirs: ArrayList<Directory>, currentPathPrefix: String): ArrayList<Directory> {
fun Context.getDirsToShow(
dirs: ArrayList<Directory>,
allDirs: ArrayList<Directory>,
currentPathPrefix: String
): ArrayList<Directory> {
return if (config.groupDirectSubfolders) {
dirs.forEach {
it.subfoldersCount = 0
@ -197,8 +271,12 @@ fun Context.getDirsToShow(dirs: ArrayList<Directory>, allDirs: ArrayList<Directo
// show the current folder as an available option too, not just subfolders
if (currentPathPrefix.isNotEmpty()) {
val currentFolder =
allDirs.firstOrNull { parentDirs.firstOrNull { it.path.equals(currentPathPrefix, true) } == null && it.path.equals(currentPathPrefix, true) }
val currentFolder = allDirs.firstOrNull {
parentDirs.firstOrNull {
it.path.equals(currentPathPrefix, true)
} == null && it.path.equals(currentPathPrefix, true)
}
currentFolder?.apply {
subfoldersCount = 1
parentDirs.add(this)
@ -235,17 +313,17 @@ private fun Context.addParentWithoutMediaFiles(into: ArrayList<Directory>, path:
}
val directory = Directory(
newDirId + 1,
path,
subDirs.first().tmb,
getFolderNameFromPath(path),
subDirs.sumOf { it.mediaCnt },
lastModified,
dateTaken,
subDirs.sumByLong { it.size },
getPathLocation(path),
mediaTypes,
""
id = newDirId + 1,
path = path,
tmb = subDirs.first().tmb,
name = getFolderNameFromPath(path),
mediaCnt = subDirs.sumOf { it.mediaCnt },
modified = lastModified,
taken = dateTaken,
size = subDirs.sumByLong { it.size },
location = getPathLocation(path),
types = mediaTypes,
sortValue = ""
)
directory.containsMediaFilesDirectly = false
@ -275,7 +353,10 @@ fun Context.fillWithSharedDirectParents(dirs: ArrayList<Directory>): ArrayList<D
return allDirs
}
fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPrefix: String): ArrayList<Directory> {
fun Context.getDirectParentSubfolders(
dirs: ArrayList<Directory>,
currentPathPrefix: String
): ArrayList<Directory> {
val folders = dirs.map { it.path }.sorted().toMutableSet() as HashSet<String>
val currentPaths = LinkedHashSet<String>()
val foldersWithoutMediaFiles = ArrayList<String>()
@ -295,15 +376,28 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
}
}
if (currentPathPrefix.isNotEmpty() && path.equals(currentPathPrefix, true) || File(path).parent.equals(currentPathPrefix, true)) {
if (
currentPathPrefix.isNotEmpty() &&
path.equals(currentPathPrefix, true)
|| File(path).parent.equals(currentPathPrefix, true)
) {
currentPaths.add(path)
} else if (folders.any { !it.equals(path, true) && (File(path).parent.equals(it, true) || File(it).parent.equals(File(path).parent, true)) }) {
} else if (
folders.any {
!it.equals(path, true) && (File(path).parent.equals(it, true)
|| File(it).parent.equals(File(path).parent, true))
}
) {
// if we have folders like
// /storage/emulated/0/Pictures/Images and
// /storage/emulated/0/Pictures/Screenshots,
// but /storage/emulated/0/Pictures is empty, still Pictures with the first folders thumbnails and proper other info
val parent = File(path).parent
if (parent != null && !folders.contains(parent) && dirs.none { it.path.equals(parent, true) }) {
if (
parent != null
&& !folders.contains(parent)
&& dirs.none { it.path.equals(parent, true) }
) {
currentPaths.add(parent)
if (addParentWithoutMediaFiles(dirs, parent)) {
foldersWithoutMediaFiles.add(parent)
@ -318,7 +412,11 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
currentPaths.forEach {
val path = it
currentPaths.forEach {
if (!foldersWithoutMediaFiles.contains(it) && !it.equals(path, true) && File(it).parent?.equals(path, true) == true) {
if (
!foldersWithoutMediaFiles.contains(it)
&& !it.equals(path, true)
&& File(it).parent?.equals(path, true) == true
) {
areDirectSubfoldersAvailable = true
}
}
@ -347,7 +445,10 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
}
}
fun Context.updateSubfolderCounts(children: ArrayList<Directory>, parentDirs: ArrayList<Directory>) {
fun Context.updateSubfolderCounts(
children: ArrayList<Directory>,
parentDirs: ArrayList<Directory>
) {
for (child in children) {
var longestSharedPath = ""
for (parentDir in parentDirs) {
@ -356,14 +457,21 @@ fun Context.updateSubfolderCounts(children: ArrayList<Directory>, parentDirs: Ar
continue
}
if (child.path.startsWith(parentDir.path, true) && parentDir.path.length > longestSharedPath.length) {
if (
child.path.startsWith(parentDir.path, true)
&& parentDir.path.length > longestSharedPath.length
) {
longestSharedPath = parentDir.path
}
}
// make sure we count only the proper direct subfolders, grouped the same way as on the main screen
parentDirs.firstOrNull { it.path == longestSharedPath }?.apply {
if (path.equals(child.path, true) || path.equals(File(child.path).parent, true) || children.any { it.path.equals(File(child.path).parent, true) }) {
if (
path.equals(child.path, true)
|| path.equals(File(child.path).parent, true)
|| children.any { it.path.equals(File(child.path).parent, true) }
) {
if (child.containsMediaFilesDirectly) {
subfoldersCount++
}
@ -399,7 +507,10 @@ fun Context.getNoMediaFoldersSync(): ArrayList<String> {
do {
val path = cursor.getStringValue(Files.FileColumns.DATA) ?: continue
val noMediaFile = File(path)
if (getDoesFilePathExist(noMediaFile.absolutePath, OTGPath) && noMediaFile.name == NOMEDIA) {
if (
getDoesFilePathExist(noMediaFile.absolutePath, OTGPath)
&& noMediaFile.name == NOMEDIA
) {
folders.add(noMediaFile.parent)
}
} while (cursor.moveToNext())
@ -420,7 +531,13 @@ fun Context.rescanFolderMedia(path: String) {
fun Context.rescanFolderMediaSync(path: String) {
getCachedMedia(path) { cached ->
GetMediaAsynctask(applicationContext, path, isPickImage = false, isPickVideo = false, showAll = false) { newMedia ->
GetMediaAsynctask(
context = applicationContext,
mPath = path,
isPickImage = false,
isPickVideo = false,
showAll = false
) { newMedia ->
ensureBackgroundThread {
val media = newMedia.filterIsInstance<Medium>() as ArrayList<Medium>
try {
@ -447,14 +564,22 @@ fun Context.storeDirectoryItems(items: ArrayList<Directory>) {
}
}
fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: MutableSet<String>, noMediaFolders: ArrayList<String>): String {
fun Context.checkAppendingHidden(
path: String,
hidden: String,
includedFolders: MutableSet<String>,
noMediaFolders: ArrayList<String>
): String {
val dirName = getFolderNameFromPath(path)
val folderNoMediaStatuses = HashMap<String, Boolean>()
noMediaFolders.forEach { folder ->
folderNoMediaStatuses["$folder/$NOMEDIA"] = true
}
return if (path.doesThisOrParentHaveNoMedia(folderNoMediaStatuses, null) && !path.isThisOrParentIncluded(includedFolders)) {
return if (
path.doesThisOrParentHaveNoMedia(folderNoMediaStatuses, null)
&& !path.isThisOrParentIncluded(includedFolders)
) {
"$dirName $hidden"
} else {
dirName
@ -512,7 +637,19 @@ fun Context.addTempFolderIfNeeded(dirs: ArrayList<Directory>): ArrayList<Directo
val tempFolderPath = config.tempFolderPath
return if (tempFolderPath.isNotEmpty()) {
val directories = ArrayList<Directory>()
val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0, "")
val newFolder = Directory(
id = null,
path = tempFolderPath,
tmb = "",
name = tempFolderPath.getFilenameFromPath(),
mediaCnt = 0,
modified = 0,
taken = 0,
size = 0L,
location = getPathLocation(tempFolderPath),
types = 0,
sortValue = ""
)
directories.add(newFolder)
directories.addAll(dirs)
directories
@ -551,7 +688,10 @@ fun Context.loadImageBase(
if (cropThumbnails) {
options.optionalTransform(CenterCrop())
options.optionalTransform(WebpDrawable::class.java, WebpDrawableTransformation(CenterCrop()))
options.optionalTransform(
WebpDrawable::class.java,
WebpDrawableTransformation(CenterCrop())
)
} else {
options.optionalTransform(FitCenter())
options.optionalTransform(WebpDrawable::class.java, WebpDrawableTransformation(FitCenter()))
@ -559,7 +699,6 @@ fun Context.loadImageBase(
// animation is only supported without rounded corners and the file must be a GIF or WEBP.
// Glide doesn't support animated AVIF: https://bumptech.github.io/glide/int/avif.html
// TODO: animate JXL
if (animate && roundCorners == ROUNDED_CORNERS_NONE && (path.isGif() || path.isWebP())) {
// this is required to make glide cache aware of changes
options.decode(Drawable::class.java)
@ -577,7 +716,10 @@ fun Context.loadImageBase(
options.optionalTransform(MultiTransformation(CenterCrop(), roundedCornersTransform))
options.optionalTransform(
WebpDrawable::class.java,
MultiTransformation(WebpDrawableTransformation(CenterCrop()), WebpDrawableTransformation(roundedCornersTransform))
MultiTransformation(
WebpDrawableTransformation(CenterCrop()),
WebpDrawableTransformation(roundedCornersTransform)
)
)
}
@ -586,10 +728,15 @@ fun Context.loadImageBase(
.load(path)
.apply(options)
.set(WebpDownsampler.USE_SYSTEM_DECODER, false) // CVE-2023-4863
.transition(DrawableTransitionOptions.withCrossFade(crossFadeDuration))
.transition(getOptionalCrossFadeTransition(crossFadeDuration))
builder = builder.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, targetBitmap: Target<Drawable>, isFirstResource: Boolean): Boolean {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
targetBitmap: Target<Drawable>,
isFirstResource: Boolean
): Boolean {
if (tryLoadingWithPicasso) {
tryLoadingWithPicasso(path, target, cropThumbnails, roundCorners, signature)
} else {
@ -619,7 +766,11 @@ fun Context.loadSVG(
signature: ObjectKey,
crossFadeDuration: Int = THUMBNAIL_FADE_DURATION_MS,
) {
target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER
target.scaleType = if (cropThumbnails) {
ImageView.ScaleType.CENTER_CROP
} else {
ImageView.ScaleType.FIT_CENTER
}
val options = RequestOptions().signature(signature)
var builder = Glide.with(applicationContext)
@ -627,11 +778,14 @@ fun Context.loadSVG(
.listener(SvgSoftwareLayerSetter())
.load(path)
.apply(options)
.transition(DrawableTransitionOptions.withCrossFade(crossFadeDuration))
.transition(getOptionalCrossFadeTransition(crossFadeDuration))
if (roundCorners != ROUNDED_CORNERS_NONE) {
val cornerSize =
if (roundCorners == ROUNDED_CORNERS_SMALL) org.fossify.commons.R.dimen.rounded_corner_radius_small else org.fossify.commons.R.dimen.rounded_corner_radius_big
val cornerSize = when (roundCorners) {
ROUNDED_CORNERS_SMALL -> org.fossify.commons.R.dimen.rounded_corner_radius_small
else -> org.fossify.commons.R.dimen.rounded_corner_radius_big
}
val cornerRadius = resources.getDimension(cornerSize).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
@ -640,7 +794,13 @@ fun Context.loadSVG(
}
// intended mostly for Android 11 issues, that fail loading PNG files bigger than 10 MB
fun Context.tryLoadingWithPicasso(path: String, view: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, signature: ObjectKey) {
fun Context.tryLoadingWithPicasso(
path: String,
view: MySquareImageView,
cropThumbnails: Boolean,
roundCorners: Int,
signature: ObjectKey
) {
var pathToLoad = "file://$path"
pathToLoad = pathToLoad.replace("%", "%25").replace("#", "%23")
@ -706,22 +866,27 @@ fun Context.getCachedDirectories(
}
var filteredDirectories = directories.filter {
it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNoMediaStatuses) { path, hasNoMedia ->
it.path.shouldFolderBeVisible(
excludedPaths = excludedPaths,
includedPaths = includedPaths,
showHidden = shouldShowHidden,
folderNoMediaStatuses = folderNoMediaStatuses
) { path, hasNoMedia ->
folderNoMediaStatuses[path] = hasNoMedia
}
} as ArrayList<Directory>
val filterMedia = config.filterMedia
val filterMedia = config.filterMedia
filteredDirectories = (when {
getVideosOnly -> filteredDirectories.filter { it.types and TYPE_VIDEOS != 0 }
getImagesOnly -> filteredDirectories.filter { it.types and TYPE_IMAGES != 0 }
else -> filteredDirectories.filter {
(filterMedia and TYPE_IMAGES != 0 && it.types and TYPE_IMAGES != 0) ||
(filterMedia and TYPE_VIDEOS != 0 && it.types and TYPE_VIDEOS != 0) ||
(filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0) ||
(filterMedia and TYPE_RAWS != 0 && it.types and TYPE_RAWS != 0) ||
(filterMedia and TYPE_SVGS != 0 && it.types and TYPE_SVGS != 0) ||
(filterMedia and TYPE_PORTRAITS != 0 && it.types and TYPE_PORTRAITS != 0)
(filterMedia and TYPE_IMAGES != 0 && it.types and TYPE_IMAGES != 0)
|| (filterMedia and TYPE_VIDEOS != 0 && it.types and TYPE_VIDEOS != 0)
|| (filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0)
|| (filterMedia and TYPE_RAWS != 0 && it.types and TYPE_RAWS != 0)
|| (filterMedia and TYPE_SVGS != 0 && it.types and TYPE_SVGS != 0)
|| (filterMedia and TYPE_PORTRAITS != 0 && it.types and TYPE_PORTRAITS != 0)
}
}) as ArrayList<Directory>
@ -752,10 +917,20 @@ fun Context.getCachedDirectories(
}
}
fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList<ThumbnailItem>) -> Unit) {
fun Context.getCachedMedia(
path: String,
getVideosOnly: Boolean = false,
getImagesOnly: Boolean = false,
callback: (ArrayList<ThumbnailItem>) -> Unit
) {
ensureBackgroundThread {
val mediaFetcher = MediaFetcher(this)
val foldersToScan = if (path.isEmpty()) mediaFetcher.getFoldersToScan() else arrayListOf(path)
val foldersToScan = if (path.isEmpty()) {
mediaFetcher.getFoldersToScan()
} else {
arrayListOf(path)
}
var media = ArrayList<Medium>()
if (path == FAVORITES) {
media.addAll(mediaDB.getFavorites())
@ -794,12 +969,12 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
getVideosOnly -> media.filter { it.type == TYPE_VIDEOS }
getImagesOnly -> media.filter { it.type == TYPE_IMAGES }
else -> media.filter {
(filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES) ||
(filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS) ||
(filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS) ||
(filterMedia and TYPE_RAWS != 0 && it.type == TYPE_RAWS) ||
(filterMedia and TYPE_SVGS != 0 && it.type == TYPE_SVGS) ||
(filterMedia and TYPE_PORTRAITS != 0 && it.type == TYPE_PORTRAITS)
(filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES)
|| (filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS)
|| (filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS)
|| (filterMedia and TYPE_RAWS != 0 && it.type == TYPE_RAWS)
|| (filterMedia and TYPE_SVGS != 0 && it.type == TYPE_SVGS)
|| (filterMedia and TYPE_PORTRAITS != 0 && it.type == TYPE_PORTRAITS)
}
}) as ArrayList<Medium>
@ -840,7 +1015,12 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag
fun Context.removeInvalidDBDirectories(dirs: ArrayList<Directory>? = null) {
val dirsToCheck = dirs ?: directoryDB.getAll()
val OTGPath = config.OTGPath
dirsToCheck.filter { !it.areFavorites() && !it.isRecycleBin() && !getDoesFilePathExist(it.path, OTGPath) && it.path != config.tempFolderPath }.forEach {
dirsToCheck.filter {
!it.areFavorites()
&& !it.isRecycleBin()
&& !getDoesFilePathExist(it.path, OTGPath)
&& it.path != config.tempFolderPath
}.forEach {
try {
directoryDB.deleteDirPath(it.path)
} catch (ignored: Exception) {
@ -861,14 +1041,14 @@ fun Context.updateDBMediaPath(oldPath: String, newPath: String) {
fun Context.updateDBDirectory(directory: Directory) {
try {
directoryDB.updateDirectory(
directory.path,
directory.tmb,
directory.mediaCnt,
directory.modified,
directory.taken,
directory.size,
directory.types,
directory.sortValue
path = directory.path,
thumbnail = directory.tmb,
mediaCnt = directory.mediaCnt,
lastModified = directory.modified,
dateTaken = directory.taken,
size = directory.size,
mediaTypes = directory.types,
sortValue = directory.sortValue
)
} catch (ignored: Exception) {
}
@ -876,7 +1056,9 @@ fun Context.updateDBDirectory(directory: Directory) {
fun Context.getOTGFolderChildren(path: String) = getDocumentFile(path)?.listFiles()
fun Context.getOTGFolderChildrenNames(path: String) = getOTGFolderChildren(path)?.map { it.name }?.toMutableList()
fun Context.getOTGFolderChildrenNames(path: String): MutableList<String?>? {
return getOTGFolderChildren(path)?.map { it.name }?.toMutableList()
}
fun Context.getFavoritePaths(): ArrayList<String> {
return try {
@ -886,7 +1068,9 @@ fun Context.getFavoritePaths(): ArrayList<String> {
}
}
fun Context.getFavoriteFromPath(path: String) = Favorite(null, path, path.getFilenameFromPath(), path.getParentPath())
fun Context.getFavoriteFromPath(path: String): Favorite {
return Favorite(null, path, path.getFilenameFromPath(), path.getParentPath())
}
fun Context.updateFavorite(path: String, isFavorite: Boolean) {
try {
@ -926,8 +1110,10 @@ fun Context.deleteMediumWithPath(path: String) {
}
fun Context.updateWidgets() {
val widgetIDs = AppWidgetManager.getInstance(applicationContext)?.getAppWidgetIds(ComponentName(applicationContext, MyWidgetProvider::class.java))
val widgetIDs = AppWidgetManager.getInstance(applicationContext)
?.getAppWidgetIds(ComponentName(applicationContext, MyWidgetProvider::class.java))
?: return
if (widgetIDs.isNotEmpty()) {
Intent(applicationContext, MyWidgetProvider::class.java).apply {
action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
@ -938,8 +1124,15 @@ fun Context.updateWidgets() {
}
// based on https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/google/code/mp4parser/example/PrintStructure.java
fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: Long, end: Long, callback: () -> Unit) {
val FILE_CHANNEL_CONTAINERS = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl")
fun Context.parseFileChannel(
path: String,
fc: FileChannel,
level: Int,
start: Long,
end: Long,
callback: () -> Unit
) {
val fileChannelContainers = arrayListOf("moov", "trak", "mdia", "minf", "udta", "stbl")
try {
var iteration = 0
var currEnd = end
@ -978,13 +1171,16 @@ fun Context.parseFileChannel(path: String, fc: FileChannel, level: Int, start: L
}
val xmlString = sb.toString().lowercase(Locale.getDefault())
if (xmlString.contains("gspherical:projectiontype>equirectangular") || xmlString.contains("gspherical:projectiontype=\"equirectangular\"")) {
if (
xmlString.contains("gspherical:projectiontype>equirectangular")
|| xmlString.contains("gspherical:projectiontype=\"equirectangular\"")
) {
callback.invoke()
}
return
}
if (FILE_CHANNEL_CONTAINERS.contains(type)) {
if (fileChannelContainers.contains(type)) {
parseFileChannel(path, fc, level + 1, begin + 8, newEnd, callback)
}
@ -1013,8 +1209,18 @@ fun Context.addPathToDB(path: String) {
val isFavorite = favoritesDB.isFavorite(path)
val videoDuration = if (type == TYPE_VIDEOS) getDuration(path) ?: 0 else 0
val medium = Medium(
null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(),
File(path).length(), type, videoDuration, isFavorite, 0L, 0L
id = null,
name = path.getFilenameFromPath(),
path = path,
parentPath = path.getParentPath(),
modified = System.currentTimeMillis(),
taken = System.currentTimeMillis(),
size = File(path).length(),
type = type,
videoDuration = videoDuration,
isFavorite = isFavorite,
deletedTS = 0L,
mediaStoreId = 0L
)
mediaDB.insert(medium)
@ -1056,20 +1262,50 @@ fun Context.createDirectoryFromMedia(
val firstItem = curMedia.firstOrNull() ?: defaultMedium
val lastItem = curMedia.lastOrNull() ?: defaultMedium
val dirName = checkAppendingHidden(path, hiddenString, includedFolders, noMediaFolders)
val lastModified = if (isSortingAscending) Math.min(firstItem.modified, lastItem.modified) else Math.max(firstItem.modified, lastItem.modified)
val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)
val lastModified = if (isSortingAscending) {
min(firstItem.modified, lastItem.modified)
} else {
max(firstItem.modified, lastItem.modified)
}
val dateTaken = if (isSortingAscending) {
min(firstItem.taken, lastItem.taken)
} else {
max(firstItem.taken, lastItem.taken)
}
val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L
val mediaTypes = curMedia.getDirMediaTypes()
val sortValue = getDirectorySortingValue(curMedia, path, dirName, size)
return Directory(null, path, thumbnail!!, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes, sortValue)
val count = curMedia.size
val sortValue = getDirectorySortingValue(curMedia, path, dirName, size, count)
return Directory(
id = null,
path = path,
tmb = thumbnail!!,
name = dirName,
mediaCnt = curMedia.size,
modified = lastModified,
taken = dateTaken,
size = size,
location = getPathLocation(path),
types = mediaTypes,
sortValue = sortValue
)
}
fun Context.getDirectorySortingValue(media: ArrayList<Medium>, path: String, name: String, size: Long): String {
fun Context.getDirectorySortingValue(
media: ArrayList<Medium>,
path: String,
name: String,
size: Long,
count: Int
): String {
val sorting = config.directorySorting
val sorted = when {
sorting and SORT_BY_NAME != 0 -> return name
sorting and SORT_BY_PATH != 0 -> return path
sorting and SORT_BY_SIZE != 0 -> return size.toString()
sorting and SORT_BY_COUNT != 0 -> return count.toString()
sorting and SORT_BY_DATE_MODIFIED != 0 -> media.sortedBy { it.modified }
sorting and SORT_BY_DATE_TAKEN != 0 -> media.sortedBy { it.taken }
else -> media
@ -1101,26 +1337,48 @@ fun Context.updateDirectoryPath(path: String) {
val sorting = config.getFolderSorting(path)
val grouping = config.getFolderGrouping(path)
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 ||
sorting and SORT_BY_DATE_TAKEN != 0 ||
grouping and GROUP_BY_DATE_TAKEN_DAILY != 0 ||
grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
|| sorting and SORT_BY_DATE_TAKEN != 0
|| grouping and GROUP_BY_DATE_TAKEN_DAILY != 0
|| grouping and GROUP_BY_DATE_TAKEN_MONTHLY != 0
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 ||
sorting and SORT_BY_DATE_MODIFIED != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0
|| sorting and SORT_BY_DATE_MODIFIED != 0
|| grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0
|| grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
val lastModifieds = if (getProperLastModified) mediaFetcher.getFolderLastModifieds(path) else HashMap()
val lastModifieds = if (getProperLastModified) {
mediaFetcher.getFolderLastModifieds(path)
} else {
HashMap()
}
val dateTakens = mediaFetcher.getFolderDateTakens(path)
val favoritePaths = getFavoritePaths()
val curMedia = mediaFetcher.getFilesFrom(
path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize,
favoritePaths, false, lastModifieds, dateTakens, null
curPath = path,
isPickImage = getImagesOnly,
isPickVideo = getVideosOnly,
getProperDateTaken = getProperDateTaken,
getProperLastModified = getProperLastModified,
getProperFileSize = getProperFileSize,
favoritePaths = favoritePaths,
getVideoDurations = false,
lastModifieds = lastModifieds,
dateTakens = dateTakens,
android11Files = null
)
val directory = createDirectoryFromMedia(
path = path,
curMedia = curMedia,
albumCovers = albumCovers,
hiddenString = hiddenString,
includedFolders = includedFolders,
getProperFileSize = getProperFileSize,
noMediaFolders = noMediaFolders
)
val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
updateDBDirectory(directory)
}

View file

@ -0,0 +1,19 @@
package org.fossify.gallery.extensions
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.transition.DrawableCrossFadeFactory
import com.bumptech.glide.request.transition.TransitionFactory
/**
* Cross fade transition option that disabled fading when loading from cache.
*/
fun getOptionalCrossFadeTransition(duration: Int): DrawableTransitionOptions {
return DrawableTransitionOptions.with(
TransitionFactory { dataSource, isFirstResource ->
if (dataSource == DataSource.RESOURCE_DISK_CACHE) return@TransitionFactory null
DrawableCrossFadeFactory.Builder(duration).build().build(dataSource, isFirstResource)
}
)
}

View file

@ -0,0 +1,41 @@
package org.fossify.gallery.extensions
import android.content.Context
import androidx.media3.common.PlaybackException
import androidx.media3.common.PlaybackException.ERROR_CODE_DECODER_INIT_FAILED
import androidx.media3.common.PlaybackException.ERROR_CODE_DECODING_FAILED
import androidx.media3.common.PlaybackException.ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES
import androidx.media3.common.PlaybackException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
import androidx.media3.common.PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED
import androidx.media3.common.PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED
import androidx.media3.common.PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED
import androidx.media3.common.PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED
import androidx.media3.common.Player
import org.fossify.gallery.R
fun Player.mute() {
volume = 0f
}
fun Player.unmute() {
volume = 1f
}
fun PlaybackException.getFriendlyMessage(context: Context): String {
val resource = when (errorCode) {
ERROR_CODE_PARSING_CONTAINER_MALFORMED,
ERROR_CODE_PARSING_MANIFEST_MALFORMED -> R.string.file_is_malformed_or_corrupted
ERROR_CODE_DECODER_INIT_FAILED,
ERROR_CODE_DECODING_FAILED,
ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES -> R.string.media_exceeds_device_capabilities
ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED,
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED,
ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED -> R.string.unsupported_format
else -> return localizedMessage ?: context.getString(R.string.failed_to_load_media)
}
return context.getString(resource)
}

View file

@ -6,6 +6,8 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.res.ResourcesCompat
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import org.fossify.commons.extensions.*
import org.fossify.commons.views.MySeekBar
@ -49,6 +51,7 @@ class PlaybackSpeedFragment : BottomSheetDialogFragment() {
initSeekbar(playbackSpeedSeekbar, playbackSpeedLabel, config)
}
(dialog as? BottomSheetDialog)?.behavior?.state = BottomSheetBehavior.STATE_EXPANDED
return binding.root
}

View file

@ -9,14 +9,26 @@ import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.util.DisplayMetrics
import android.view.*
import android.view.GestureDetector
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.Surface
import android.view.TextureView
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.SeekBar
import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.view.children
import androidx.media3.common.*
import androidx.media3.common.AudioAttributes
import androidx.media3.common.C
import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import androidx.media3.common.VideoSize
import androidx.media3.common.util.UnstableApi
import androidx.media3.datasource.ContentDataSource
import androidx.media3.datasource.DataSource
@ -29,15 +41,42 @@ import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource
import com.bumptech.glide.Glide
import org.fossify.commons.extensions.*
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.beInvisible
import org.fossify.commons.extensions.beInvisibleIf
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.fadeIn
import org.fossify.commons.extensions.getDuration
import org.fossify.commons.extensions.getFormattedDuration
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.getVideoResolution
import org.fossify.commons.extensions.isGone
import org.fossify.commons.extensions.isVisible
import org.fossify.commons.extensions.navigationBarHeight
import org.fossify.commons.extensions.navigationBarWidth
import org.fossify.commons.extensions.onGlobalLayout
import org.fossify.commons.extensions.realScreenSize
import org.fossify.commons.extensions.setDrawablesRelativeWithIntrinsicBounds
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.updateTextColors
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.gallery.R
import org.fossify.gallery.activities.VideoActivity
import org.fossify.gallery.databinding.PagerVideoItemBinding
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.getFriendlyMessage
import org.fossify.gallery.extensions.hasNavBar
import org.fossify.gallery.extensions.mute
import org.fossify.gallery.extensions.parseFileChannel
import org.fossify.gallery.helpers.*
import org.fossify.gallery.extensions.unmute
import org.fossify.gallery.helpers.Config
import org.fossify.gallery.helpers.EXOPLAYER_MAX_BUFFER_MS
import org.fossify.gallery.helpers.EXOPLAYER_MIN_BUFFER_MS
import org.fossify.gallery.helpers.FAST_FORWARD_VIDEO_MS
import org.fossify.gallery.helpers.MEDIUM
import org.fossify.gallery.helpers.SHOULD_INIT_FRAGMENT
import org.fossify.gallery.interfaces.PlaybackSpeedListener
import org.fossify.gallery.models.Medium
import org.fossify.gallery.views.MediaSideScroll
@ -46,7 +85,8 @@ import java.io.FileInputStream
import java.text.DecimalFormat
@UnstableApi
class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, SeekBar.OnSeekBarChangeListener, PlaybackSpeedListener {
class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener,
SeekBar.OnSeekBarChangeListener, PlaybackSpeedListener {
private val PROGRESS = "progress"
private var mIsFullscreen = false
@ -87,9 +127,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
private lateinit var mPlayPauseButton: ImageView
private lateinit var mSeekBar: SeekBar
private var mVolumeController: VolumeController? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val context = requireContext()
val activity = requireActivity()
val arguments = requireArguments()
@ -103,7 +145,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
videoHolder.setOnClickListener { toggleFullscreen() }
videoPreview.setOnClickListener { toggleFullscreen() }
bottomVideoTimeHolder.videoPlaybackSpeed.setOnClickListener { showPlaybackSpeedPicker() }
bottomVideoTimeHolder.videoToggleMute.setOnClickListener { mVolumeController?.toggleMute() }
bottomVideoTimeHolder.videoToggleMute.setOnClickListener {
mConfig.muteVideos = !mConfig.muteVideos
updatePlayerMuteState()
}
videoSurfaceFrame.controller.settings.swallowDoubleTaps = true
videoPlayOutline.setOnClickListener {
@ -131,29 +177,30 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
mTextureView = videoSurface
mTextureView.surfaceTextureListener = this@VideoFragment
val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
if (!mConfig.allowInstantChange) {
toggleFullscreen()
val gestureDetector =
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
if (!mConfig.allowInstantChange) {
toggleFullscreen()
return true
}
val viewWidth = root.width
val instantWidth = viewWidth / 7
val clickedX = e.rawX
when {
clickedX <= instantWidth -> listener?.goToPrevItem()
clickedX >= viewWidth - instantWidth -> listener?.goToNextItem()
else -> toggleFullscreen()
}
return true
}
val viewWidth = root.width
val instantWidth = viewWidth / 7
val clickedX = e.rawX
when {
clickedX <= instantWidth -> listener?.goToPrevItem()
clickedX >= viewWidth - instantWidth -> listener?.goToNextItem()
else -> toggleFullscreen()
override fun onDoubleTap(e: MotionEvent): Boolean {
handleDoubleTap(e.rawX)
return true
}
return true
}
override fun onDoubleTap(e: MotionEvent): Boolean {
handleDoubleTap(e.rawX)
return true
}
})
})
videoPreview.setOnTouchListener { view, event ->
handleEvent(event)
@ -183,7 +230,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
mIsFragmentVisible = true
}
mIsFullscreen = activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
mIsFullscreen =
activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
initTimeHolder()
// checkIfPanorama() TODO: Implement panorama using a FOSS library
@ -213,25 +261,37 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
setVideoSize()
binding.apply {
mBrightnessSideScroll.initialize(activity, slideInfo, true, container, singleTap = { x, y ->
if (mConfig.allowInstantChange) {
listener?.goToPrevItem()
} else {
toggleFullscreen()
}
}, doubleTap = { x, y ->
doSkip(false)
})
mBrightnessSideScroll.initialize(
activity,
slideInfo,
true,
container,
singleTap = { x, y ->
if (mConfig.allowInstantChange) {
listener?.goToPrevItem()
} else {
toggleFullscreen()
}
},
doubleTap = { x, y ->
doSkip(false)
})
mVolumeSideScroll.initialize(activity, slideInfo, false, container, singleTap = { x, y ->
if (mConfig.allowInstantChange) {
listener?.goToNextItem()
} else {
toggleFullscreen()
}
}, doubleTap = { x, y ->
doSkip(true)
})
mVolumeSideScroll.initialize(
activity,
slideInfo,
false,
container,
singleTap = { x, y ->
if (mConfig.allowInstantChange) {
listener?.goToNextItem()
} else {
toggleFullscreen()
}
},
doubleTap = { x, y ->
doSkip(true)
})
videoSurface.onGlobalLayout {
if (mIsFragmentVisible && mConfig.autoplayVideos && !mConfig.openVideosOnSeparateScreen) {
@ -246,19 +306,13 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
restoreLastVideoSavedPosition()
}
mVolumeController = VolumeController(context) { isMuted ->
val icon = if (isMuted) R.drawable.ic_vector_speaker_off else R.drawable.ic_vector_speaker_on
binding.bottomVideoTimeHolder.videoToggleMute.setImageDrawable(
AppCompatResources.getDrawable(context, icon)
)
}
return mView
}
override fun onResume() {
super.onResume()
mConfig = requireContext().config // make sure we get a new config, in case the user changed something in the app settings
mConfig =
requireContext().config // make sure we get a new config, in case the user changed something in the app settings
requireActivity().updateTextColors(binding.videoHolder)
val allowVideoGestures = mConfig.allowVideoGestures
mTextureView.beGoneIf(mConfig.openVideosOnSeparateScreen || mIsPanorama)
@ -328,7 +382,10 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
private fun saveVideoProgress() {
if (!videoEnded()) {
if (mExoPlayer != null) {
mConfig.saveLastVideoPosition(mMedium.path, mExoPlayer!!.currentPosition.toInt() / 1000)
mConfig.saveLastVideoPosition(
mMedium.path,
mExoPlayer!!.currentPosition.toInt() / 1000
)
} else {
mConfig.saveLastVideoPosition(mMedium.path, mPositionAtPause.toInt() / 1000)
}
@ -394,7 +451,12 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
mPlayOnPrepared = true
val loadControl = DefaultLoadControl.Builder()
.setBufferDurationsMs(EXOPLAYER_MIN_BUFFER_MS, EXOPLAYER_MAX_BUFFER_MS, EXOPLAYER_MIN_BUFFER_MS, EXOPLAYER_MIN_BUFFER_MS)
.setBufferDurationsMs(
EXOPLAYER_MIN_BUFFER_MS,
EXOPLAYER_MAX_BUFFER_MS,
EXOPLAYER_MIN_BUFFER_MS,
EXOPLAYER_MIN_BUFFER_MS
)
.setPrioritizeTimeOverSizeThresholds(true)
.build()
@ -423,6 +485,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
initListeners()
}
updatePlayerMuteState()
}
private fun ExoPlayer.initListeners() {
@ -455,8 +519,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
override fun onPlayerErrorChanged(error: PlaybackException?) {
binding.errorMessageHolder.errorMessage.apply {
if (error != null) {
binding.videoPreview.beGone()
binding.videoPlayOutline.beGone()
text = error.localizedMessage ?: getString(R.string.failed_to_load_media)
text = error.getFriendlyMessage(context)
setTextColor(if (context.config.blackBackground) Color.WHITE else context.getProperTextColor())
fadeIn()
} else {
@ -574,7 +639,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
private fun showPlaybackSpeedPicker() {
val fragment = PlaybackSpeedFragment()
childFragmentManager.beginTransaction().add(fragment, fragment::class.java.simpleName).commit()
childFragmentManager.beginTransaction().add(fragment, fragment::class.java.simpleName)
.commit()
fragment.setListener(this)
}
@ -583,19 +649,28 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
if (isSlow != binding.bottomVideoTimeHolder.videoPlaybackSpeed.tag as? Boolean) {
binding.bottomVideoTimeHolder.videoPlaybackSpeed.tag = isSlow
val drawableId = if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector
val drawableId =
if (isSlow) R.drawable.ic_playback_speed_slow_vector else R.drawable.ic_playback_speed_vector
binding.bottomVideoTimeHolder.videoPlaybackSpeed
.setDrawablesRelativeWithIntrinsicBounds(AppCompatResources.getDrawable(requireContext(), drawableId))
.setDrawablesRelativeWithIntrinsicBounds(
AppCompatResources.getDrawable(
requireContext(),
drawableId
)
)
}
@SuppressLint("SetTextI18n")
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(speed)}x"
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text =
"${DecimalFormat("#.##").format(speed)}x"
mExoPlayer?.setPlaybackSpeed(speed)
}
private fun getExtendedDetailsY(height: Int): Float {
val smallMargin = context?.resources?.getDimension(org.fossify.commons.R.dimen.small_margin) ?: return 0f
val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else requireContext().navigationBarHeight
val smallMargin =
context?.resources?.getDimension(org.fossify.commons.R.dimen.small_margin) ?: return 0f
val fullscreenOffset =
smallMargin + if (mIsFullscreen) 0 else requireContext().navigationBarHeight
var actionsHeight = 0f
if (!mIsFullscreen) {
if (binding.bottomVideoTimeHolder.root.children.any { isVisible }) {
@ -627,9 +702,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
}
val curr = mExoPlayer!!.currentPosition
val newProgress = if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
val newProgress =
if (forward) curr + FAST_FORWARD_VIDEO_MS else curr - FAST_FORWARD_VIDEO_MS
val roundProgress = Math.round(newProgress / 1000f)
val limitedProgress = Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
val limitedProgress =
Math.max(Math.min(mExoPlayer!!.duration.toInt() / 1000, roundProgress), 0)
setPosition(limitedProgress)
if (!mIsPlaying) {
togglePlayPause()
@ -692,6 +769,22 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
}
}
private fun updatePlayerMuteState() {
val context = context ?: return
val isMuted = mConfig.muteVideos
val drawableId = if (isMuted) {
mExoPlayer?.mute()
R.drawable.ic_vector_speaker_off
} else {
mExoPlayer?.unmute()
R.drawable.ic_vector_speaker_on
}
binding.bottomVideoTimeHolder.videoToggleMute.setImageDrawable(
AppCompatResources.getDrawable(context, drawableId)
)
}
fun playVideo() {
if (mExoPlayer == null) {
initExoPlayer()
@ -722,7 +815,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
mPlayPauseButton.beVisible()
binding.bottomVideoTimeHolder.videoToggleMute.beVisible()
binding.bottomVideoTimeHolder.videoPlaybackSpeed.beVisible()
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text = "${DecimalFormat("#.##").format(mConfig.playbackSpeed)}x"
binding.bottomVideoTimeHolder.videoPlaybackSpeed.text =
"${DecimalFormat("#.##").format(mConfig.playbackSpeed)}x"
}
mWasVideoStarted = true
@ -822,7 +916,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
private fun cleanup() {
pauseVideo()
releaseExoPlayer()
mVolumeController?.destroy()
if (mWasFragmentInit) {
mCurrTimeView.text = 0.getFormattedDuration()

View file

@ -205,6 +205,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(LOOP_VIDEOS, false)
set(loop) = prefs.edit().putBoolean(LOOP_VIDEOS, loop).apply()
var muteVideos: Boolean
get() = prefs.getBoolean(MUTE_VIDEOS, false)
set(muteVideos) = prefs.edit().putBoolean(MUTE_VIDEOS, muteVideos).apply()
var openVideosOnSeparateScreen: Boolean
get() = prefs.getBoolean(OPEN_VIDEOS_ON_SEPARATE_SCREEN, false)
set(openVideosOnSeparateScreen) = prefs.edit().putBoolean(OPEN_VIDEOS_ON_SEPARATE_SCREEN, openVideosOnSeparateScreen).apply()

View file

@ -16,6 +16,7 @@ const val IS_THIRD_PARTY_INTENT = "is_third_party_intent"
const val AUTOPLAY_VIDEOS = "autoplay_videos"
const val REMEMBER_LAST_VIDEO_POSITION = "remember_last_video_position"
const val LOOP_VIDEOS = "loop_videos"
const val MUTE_VIDEOS = "mute_videos"
const val OPEN_VIDEOS_ON_SEPARATE_SCREEN = "open_videos_on_separate_screen"
const val ANIMATE_GIFS = "animate_gifs"
const val MAX_BRIGHTNESS = "max_brightness"

View file

@ -13,7 +13,7 @@ class FilterThumbnailsManager {
fun processThumbs(): ArrayList<FilterItem> {
for (filterItem in filterThumbnails) {
filterItem.bitmap = filterItem.filter.processFilter(Bitmap.createBitmap(filterItem.bitmap))
filterItem.bitmap = filterItem.filter.processFilter(Bitmap.createBitmap(filterItem.bitmap))!!
processedThumbnails.add(filterItem)
}
return processedThumbnails

View file

@ -1,58 +0,0 @@
package org.fossify.gallery.helpers
import android.content.Context
import android.database.ContentObserver
import android.media.AudioManager
import android.os.Handler
import android.os.Looper
import android.provider.Settings
import org.fossify.gallery.extensions.audioManager
class VolumeController(
private val context: Context,
private val streamType: Int = AudioManager.STREAM_MUSIC,
private val onVolumeChanged: (isMuted: Boolean) -> Unit
) {
private var audioManager = context.audioManager
private var savedVolume = audioManager.getStreamMaxVolume(streamType)
private val currentVolume: Int
get() = audioManager.getStreamVolume(streamType)
private val volumeObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
onVolumeChanged(isMuted())
}
}
init {
context.contentResolver.registerContentObserver(Settings.System.CONTENT_URI, true, volumeObserver)
onVolumeChanged(isMuted())
}
private fun isMuted() = currentVolume == 0
private fun mute() {
savedVolume = audioManager.getStreamVolume(streamType)
audioManager.setStreamVolume(streamType, 0, 0)
}
private fun unmute() {
audioManager.setStreamVolume(streamType, savedVolume, 0)
}
fun toggleMute() {
if (isMuted()) {
unmute()
onVolumeChanged(false)
} else {
mute()
onVolumeChanged(true)
}
}
fun destroy() {
context.contentResolver.unregisterContentObserver(volumeObserver)
}
}

View file

@ -1,6 +1,5 @@
package org.fossify.gallery.jobs
import android.annotation.TargetApi
import android.app.job.JobInfo
import android.app.job.JobInfo.TriggerContentUri
import android.app.job.JobParameters
@ -10,7 +9,6 @@ import android.content.ComponentName
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Handler
import android.provider.MediaStore
import android.provider.MediaStore.Images
@ -22,7 +20,6 @@ import org.fossify.gallery.extensions.addPathToDB
import org.fossify.gallery.extensions.updateDirectoryPath
// based on https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri)
@TargetApi(Build.VERSION_CODES.N)
class NewPhotoFetcher : JobService() {
companion object {
const val PHOTO_VIDEO_CONTENT_JOB = 1

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/md_grey_black" />
<corners android:radius="@dimen/rounded_corner_radius_big" />
</shape>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/md_grey_black" />
<corners android:radius="@dimen/rounded_corner_radius_small" />
</shape>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/md_grey_black" />
</shape>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/media_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -10,6 +11,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/loading_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
android:visibility="gone"
app:hideAnimationBehavior="inward"
app:showAnimationBehavior="outward"
app:showDelay="500"
tools:visibility="visible" />
<RelativeLayout
android:id="@+id/media_holder"
android:layout_width="match_parent"

View file

@ -37,6 +37,12 @@
android:layout_height="wrap_content"
android:text="@string/size" />
<org.fossify.commons.views.MyCompatRadioButton
android:id="@+id/sorting_dialog_radio_number_of_items"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/number_of_items" />
<org.fossify.commons.views.MyCompatRadioButton
android:id="@+id/sorting_dialog_radio_last_modified"
android:layout_width="match_parent"

View file

@ -28,24 +28,10 @@
android:textSize="@dimen/bigger_text_size"
android:visibility="gone" />
<ImageView
android:id="@+id/favorite"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_black_background"
android:gravity="end"
android:padding="@dimen/small_margin"
android:src="@drawable/ic_star_vector"
android:visibility="gone" />
<ImageView
android:id="@+id/medium_check"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignEnd="@+id/medium_name"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_margin="@dimen/medium_margin"
@ -53,26 +39,42 @@
android:contentDescription="@null"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_check_vector"
android:visibility="gone" />
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/medium_name"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/medium_thumbnail"
android:layout_alignEnd="@+id/medium_thumbnail"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient_background"
android:ellipsize="end"
android:gravity="bottom"
android:maxLines="3"
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:shadowColor="@color/default_background_color"
android:shadowRadius="4"
android:textColor="@android:color/white"
android:textSize="@dimen/smaller_text_size"
tools:text="My photo" />
android:layout_alignBottom="@id/medium_thumbnail"
android:orientation="vertical"
android:gravity="end">
<ImageView
android:id="@+id/favorite"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_margin="@dimen/smaller_margin"
android:background="@drawable/circle_black_background"
android:padding="@dimen/small_margin"
android:src="@drawable/ic_star_vector"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/medium_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/gradient_background"
android:ellipsize="end"
android:gravity="bottom"
android:maxLines="3"
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:shadowColor="@color/default_background_color"
android:shadowRadius="4"
android:textColor="@android:color/white"
android:textSize="@dimen/smaller_text_size"
tools:text="My photo" />
</LinearLayout>
</RelativeLayout>

View file

@ -23,14 +23,14 @@
android:id="@+id/favorite"
android:layout_width="@dimen/favorite_list_icon_size"
android:layout_height="@dimen/favorite_list_icon_size"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_margin="@dimen/smaller_margin"
android:layout_alignEnd="@id/medium_thumbnail"
android:layout_alignBottom="@id/medium_thumbnail"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_black_background"
android:gravity="end"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_star_vector"
android:visibility="gone" />
android:visibility="gone"
tools:visibility="visible" />
<ImageView
android:id="@+id/medium_check"

View file

@ -13,20 +13,6 @@
android:layout_height="match_parent"
tools:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/favorite"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_black_background"
android:gravity="end"
android:padding="@dimen/small_margin"
android:src="@drawable/ic_star_vector"
android:visibility="gone"
tools:visibility="visible" />
<RelativeLayout
android:id="@+id/play_icon_holder"
android:layout_width="wrap_content"
@ -69,7 +55,6 @@
android:id="@+id/medium_check"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_alignEnd="@+id/medium_name"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_margin="@dimen/medium_margin"
@ -80,24 +65,39 @@
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/medium_name"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/medium_thumbnail"
android:layout_alignEnd="@+id/medium_thumbnail"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient_background"
android:ellipsize="end"
android:gravity="bottom"
android:maxLines="3"
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:shadowColor="@color/default_background_color"
android:shadowRadius="4"
android:textColor="@android:color/white"
android:textSize="@dimen/smaller_text_size"
tools:text="My photo" />
android:layout_alignBottom="@id/medium_thumbnail"
android:orientation="vertical"
android:gravity="end">
<ImageView
android:id="@+id/favorite"
android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size"
android:layout_margin="@dimen/smaller_margin"
android:background="@drawable/circle_black_background"
android:padding="@dimen/small_margin"
android:src="@drawable/ic_star_vector"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/medium_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/gradient_background"
android:ellipsize="end"
android:gravity="bottom"
android:maxLines="3"
android:paddingLeft="@dimen/small_margin"
android:paddingRight="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:shadowColor="@color/default_background_color"
android:shadowRadius="4"
android:textColor="@android:color/white"
android:textSize="@dimen/smaller_text_size"
tools:text="My photo" />
</LinearLayout>
</RelativeLayout>

View file

@ -22,11 +22,10 @@
android:id="@+id/favorite"
android:layout_width="@dimen/favorite_list_icon_size"
android:layout_height="@dimen/favorite_list_icon_size"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_margin="@dimen/smaller_margin"
android:layout_alignEnd="@id/medium_thumbnail"
android:layout_alignBottom="@id/medium_thumbnail"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/circle_black_background"
android:gravity="end"
android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_star_vector"
android:visibility="gone"

View file

@ -5,62 +5,60 @@
<string name="open_camera">Камера</string>
<string name="hidden">(скрито)</string>
<string name="excluded">(изключено)</string>
<string name="pin_folder">Закачете папката</string>
<string name="unpin_folder">Откачете папката</string>
<string name="pin_to_the_top">Закачете отгоре</string>
<string name="show_all">Покажете съдържанието на всички папки</string>
<string name="pin_folder">Закачане на папката</string>
<string name="unpin_folder">Премахване от закачените</string>
<string name="pin_to_the_top">Закачане най-горе</string>
<string name="show_all">Показване на всички медийни файлове</string>
<string name="all_folders">Всички папки</string>
<string name="folder_view">Папки</string>
<string name="folder_view">Показване на папки</string>
<string name="other_folder">Избор на папка</string>
<string name="show_on_map">Показване на картата</string>
<string name="unknown_location">Неизвестно местоположение</string>
<string name="volume">Сила на звука</string>
<string name="brightness">Осветеност</string>
<string name="lock_orientation">Блокиране на ориентацията</string>
<string name="unlock_orientation">Разблокиране на ориентацията</string>
<string name="brightness">Яркост</string>
<string name="lock_orientation">Заключване на ориентацията</string>
<string name="unlock_orientation">Отключване на ориентацията</string>
<string name="change_orientation">Промяна на ориентацията</string>
<string name="force_portrait">Портрет</string>
<string name="force_landscape">Албум</string>
<string name="force_landscape">Пейзаж</string>
<string name="use_default_orientation">Използване на основната ориентация</string>
<string name="fix_date_taken">Поправка на датата на заснемане</string>
<string name="fixing">Поправяне…</string>
<string name="dates_fixed_successfully">Датата е успешно поправена</string>
<string name="no_date_takens_found">Не са открити стойности за дата на заснемане</string>
<string name="share_resized">Споделете преоразмерена версия</string>
<string name="dates_fixed_successfully">Датата е поправена</string>
<string name="no_date_takens_found">Липсва дата на заснемане</string>
<string name="share_resized">Споделяне на преоразмерен вариант</string>
<string name="switch_to_file_search">Превключване към търсене на файлове във всички видими папки</string>
<string name="set_as_default_folder">Задаване като основна папка</string>
<string name="unset_as_default_folder">Отхвърляне като основна папка</string>
<string name="reorder_by_dragging">Пренаредете папките с влачене</string>
<string name="reorder_by_dragging_pro">Пренаредете папките с влачене (Pro)</string>
<string name="restore_to_path">Възстановяване в \'%s\'</string>
<string name="filter_media">Филтър на медия</string>
<string name="set_as_default_folder">Задаване като подразбирана папка</string>
<string name="unset_as_default_folder">Нулиране на подразбираната папка</string>
<string name="reorder_by_dragging">Подреждане на папките с влачене</string>
<string name="reorder_by_dragging_pro">Подреждане на папките с влачене (про)</string>
<string name="restore_to_path">Възстановяване в „%s“</string>
<string name="filter_media">Филтриране</string>
<string name="images">Изображения</string>
<string name="videos">Видеоклипове</string>
<string name="videos">Видео</string>
<string name="gifs">GIF</string>
<string name="raw_images">RAW</string>
<string name="svgs">SVG</string>
<string name="portraits">Портрети</string>
<string name="no_media_with_filters">С избраните филтри не са открити медийни файлове.</string>
<string name="change_filters_underlined"><u>Смени филтрите</u></string>
<string name="hide_folder_description">Тази функция скрива папката чрез добавяне на \'.nomedia\' файл в нея; това също ще скрие и папките в нея. Можете да ги видите чрез превключване на \'Показване на скритите елементи\' в настройките. Напред\?</string>
<string name="exclude_folder_parent">Вместо това, изключване на папката от горното ниво\?</string>
<string name="no_media_with_filters">На зададените филтри не отговарят файлове.</string>
<string name="change_filters_underlined"><u>Променяне на филтрите</u></string>
<string name="hide_folder_description">По този начин ще бъде добавен файл „.nomedia“, който скрива папката и нейното съдържание от приложението. Можете да прегледате скритото съдържание като изберете „Показване на скрити елементи“ от настройките. Продължаване?</string>
<string name="exclude_folder_parent">Изключване на родителската папката?</string>
<string name="hidden_folders">Скрити папки</string>
<string name="manage_hidden_folders">Управление на скритите папки</string>
<string name="hidden_folders_placeholder">Изглежда нямате папки скрити чрез \'.nomedia\' файл.</string>
<string name="hidden_all_files">Трябва да предоставите на приложението достъп до всички файлове, за да видите скритите файлове, в противен случай то не може да работи.</string>
<string name="cant_unhide_folder">Ако папка или една от нейните родителски папки има точка преди името си, тя е скрита и не може да бъде разкрита по този начин. Трябва да премахнете точката, като я преименувате.</string>
<string name="manage_hidden_folders">Управление на скрити папки</string>
<string name="hidden_folders_placeholder">Изглежда нямате папки скрити чрез „.nomedia“.</string>
<string name="hidden_all_files">За да виждате скритите файлове, трябва да разрешите на приложението достъп до всички файлове.</string>
<string name="cant_unhide_folder">Ако папка или една от нейните родителски папки има точка пред името, тя е скрита и не може да бъде показана по този начин. Трябва да премахнете точката, като преименувате папката.</string>
<string name="include_folders">Включени папки</string>
<string name="manage_included_folders">Управление на включените папки</string>
<string name="add_folder">Добавяне на папка</string>
<string name="included_activity_placeholder">Ако имате папки с медия, които обаче не са били автоматично разпознати от програмата, може да ги добавите въчно тук.
\n
\nДобавянето на елементи тук няма да изключи никакви други папки.</string>
<string name="no_media_add_included">Не са открити медийни файлове. Можете да го поправите чрез ръчно добавяне на папки с медия.</string>
<string name="included_activity_placeholder">Ако има папки с медия, които обаче не са били автоматично разпознати от приложението, може да ги добавите ръчно тук.\n\nДобавянето на елементи тук няма да изключи други папки.</string>
<string name="no_media_add_included">Не са открити медийни файлове. Можете ръчно да добавите папки с медия.</string>
<string name="resize_and_save">Преоразмеряване на избраното и запазване</string>
<string name="width">Широчина</string>
<string name="width">Ширина</string>
<string name="height">Височина</string>
<string name="keep_aspect_ratio">Запазете съотношението на страните</string>
<string name="invalid_values">Моля въведете валидна резолюция</string>
<string name="keep_aspect_ratio">Запазване съотнош. на страните</string>
<string name="invalid_values">Въведете действителна разделителна способност</string>
<string name="resize_multiple_images">Преоразмеряване на няколко изображения</string>
<string name="resize_factor">Коефициент на преоразмеряване</string>
<string name="resize_factor_info">Преоразмерете изображенията до дадения процент, стойността трябва да е в рамките на 10 и 90.</string>
@ -69,7 +67,7 @@
<item quantity="one">Преоразмеряването неуспешно за %d изображение</item>
<item quantity="other">Преоразмеряването неуспешно за %d изображения</item>
</plurals>
<string name="images_resized_successfully">Изображенията са преоразмерени успешно</string>
<string name="images_resized_successfully">Изображенията са преоразмерени</string>
<string name="editor">Редактор</string>
<string name="basic_editor">Базов редактор</string>
<string name="advanced_editor">Разширен редактор</string>
@ -83,18 +81,18 @@
<string name="file_edited_successfully">Успешна редакция на файла</string>
<string name="image_edited_successfully">Успешна редакция на изображението</string>
<string name="video_edited_successfully">Успешна редакция на видеото</string>
<string name="edit_image_with">Редакция на изображението с:</string>
<string name="edit_video_with">Редакция на видеото с:</string>
<string name="no_image_editor_found">Не е открита програма за редактиране на изображения</string>
<string name="no_video_editor_found">Не е открита програма за редактиране на видео</string>
<string name="edit_image_with">Редакция на изображението от:</string>
<string name="edit_video_with">Редакция на видеото от:</string>
<string name="no_image_editor_found">Не е открито приложение за работа с изображения</string>
<string name="no_video_editor_found">Не е открито приложение за работа с видео</string>
<string name="unknown_file_location">Неизвестно местоположение на файл</string>
<string name="error_saving_file">Неуспешно презаписване на изходния файл</string>
<string name="rotate_left">Завъртане наляво</string>
<string name="rotate_right">Завъртане надясно</string>
<string name="rotate_one_eighty">Завъртане на 180º</string>
<string name="transform">Трансформирай</string>
<string name="crop">Изрежи</string>
<string name="draw">Рисувай</string>
<string name="transform">Трансформиране</string>
<string name="crop">Изрязване</string>
<string name="draw">Рисуване</string>
<string name="flip">Oбръщане</string>
<string name="flip_horizontally">Хоризонтално обръщане</string>
<string name="flip_vertically">Вертикално обръщане</string>
@ -102,123 +100,123 @@
<string name="other_aspect_ratio">Друго</string>
<string name="set_as_wallpaper">Задаване като тапет</string>
<string name="set_as_wallpaper_failed">Неуспешно задаване като тапет</string>
<string name="set_as_wallpaper_with">Задаване като тапет с:</string>
<string name="set_as_wallpaper_with">Задаване като тапет от:</string>
<string name="setting_wallpaper">Задаване на тапет…</string>
<string name="wallpaper_set_successfully">Успешно задаване на тапет</string>
<string name="portrait_aspect_ratio">Портретен формат</string>
<string name="landscape_aspect_ratio">Албумен формат</string>
<string name="wallpaper_set_successfully">Тапетът е зададен</string>
<string name="portrait_aspect_ratio">Портретен изглед</string>
<string name="landscape_aspect_ratio">Пейзажен изглед</string>
<string name="home_screen">Начален екран</string>
<string name="lock_screen">Заключен екран</string>
<string name="home_and_lock_screen">Начален и заключен екран</string>
<string name="allow_changing_aspect_ratio">Разрешаване на промяна на съотношението на страните</string>
<string name="slideshow">Слайдшоу</string>
<string name="interval">Интервал</string>
<string name="include_photos">Добавяне на снимки</string>
<string name="include_videos">Добавяне на видео</string>
<string name="include_gifs">Добавяне на GIF</string>
<string name="include_photos">Снимки</string>
<string name="include_videos">Видео</string>
<string name="include_gifs">GIF</string>
<string name="random_order">Случаен ред</string>
<string name="move_backwards">Движение назад</string>
<string name="loop_slideshow">Цикличност на слайдшоу</string>
<string name="animation">Анимация</string>
<string name="no_animation">Няма</string>
<string name="move_backwards">В обратен ред</string>
<string name="loop_slideshow">Повтаряне отначало</string>
<string name="animation">Вид на анимацията</string>
<string name="no_animation">Без анимация</string>
<string name="fade">Избледняване</string>
<string name="slide">Плъзгане</string>
<string name="slideshow_ended">Край на слайдшоу</string>
<string name="no_media_for_slideshow">Не са открити медийни файлове за слайдшоу</string>
<string name="group_direct_subfolders">Групиране на вътрешни папки</string>
<string name="group_by">Групиране чрез</string>
<string name="do_not_group_files">Без групиране на файлове</string>
<string name="group_direct_subfolders">Групиране по вложени папки</string>
<string name="group_by">Групиране по…</string>
<string name="do_not_group_files">Без групиране</string>
<string name="by_folder">Папка</string>
<string name="by_last_modified">Последно изменение</string>
<string name="by_last_modified_daily">Последно изменение (дневно)</string>
<string name="by_last_modified_monthly">Последно изменение (месечно)</string>
<string name="by_last_modified">Дата на промяна</string>
<string name="by_last_modified_daily">ПослДата на промяна (ден)</string>
<string name="by_last_modified_monthly">Дата на промяна (месец)</string>
<string name="by_date_taken">Дата на заснемане</string>
<string name="by_date_taken_daily">Дата на заснемане (дневно)</string>
<string name="by_date_taken_monthly">Дата на заснемане (месечно)</string>
<string name="by_date_taken_daily">Дата на заснемане (ден)</string>
<string name="by_date_taken_monthly">Дата на заснемане (месец)</string>
<string name="by_file_type">Вид на файла</string>
<string name="by_extension">Разширение</string>
<string name="show_file_count_section_header">Показване на броя файлове в хедърите на разделите</string>
<string name="grouping_and_sorting">Обърнете внимание, че групирането и сортирането са 2 независими полета</string>
<string name="show_file_count_section_header">Показване на броя файлове в заглавките на разделите</string>
<string name="grouping_and_sorting">Обърнете внимание, че групирането и сортирането са две независими полета</string>
<string name="folder_on_widget">Папка показана на приспособлението:</string>
<string name="show_folder_name">Покажи името на папката</string>
<string name="autoplay_videos">Автоматично стартиране на видео</string>
<string name="remember_last_video_position">Запомняне на последната времева позиция на видеото</string>
<string name="loop_videos">Цикличност на видеото</string>
<string name="animate_gifs">Анимиране на миниатюрните GIF изображения</string>
<string name="max_brightness">Максимална осветеност при гледане на цял екран</string>
<string name="crop_thumbnails">Отрязване на миниатюрните изображения на квадрати</string>
<string name="show_thumbnail_video_duration">Показване на дължината на видеото</string>
<string name="screen_rotation_by">Завъртане на медията на цял екран с</string>
<string name="screen_rotation_system_setting">Системна настройка</string>
<string name="screen_rotation_device_rotation">Завъртане на устройството</string>
<string name="screen_rotation_aspect_ratio">По размера на изображението</string>
<string name="black_background_at_fullscreen">Черен фон при медия на цял екран</string>
<string name="scroll_thumbnails_horizontally">Хоризонтално превъртане на миниатюрните изображения</string>
<string name="hide_system_ui_at_fullscreen">Автоматично скриване на системния интерфейс при гледане на цял екран</string>
<string name="delete_empty_folders">Изтриване на празни папки след делене на тяхното съдържание</string>
<string name="allow_photo_gestures">Позволете контролиране на осветеността на изображенията с вертикални жестове</string>
<string name="allow_video_gestures">Позволете контролиране на звука и осветеността на видеото с вертикални жестове</string>
<string name="show_media_count">Показване на количеството на файловете в папките</string>
<string name="show_extended_details">Показване на сведения за файла при гледане на цял екран</string>
<string name="show_folder_name">Показване имената на папките</string>
<string name="autoplay_videos">втоматично възпроизвеждане на видео</string>
<string name="remember_last_video_position">Запомняне на времето във видеото</string>
<string name="loop_videos">Повтаряне отначало</string>
<string name="animate_gifs">Анимиране на миниатюрите на GIF</string>
<string name="max_brightness">Максимална яркост при преглед на цял екран</string>
<string name="crop_thumbnails">Изрязване на миниатюрите до квадрати</string>
<string name="show_thumbnail_video_duration">Показване дължината на видеото</string>
<string name="screen_rotation_by">Завъртане при преглед на цял екран</string>
<string name="screen_rotation_system_setting">Според системата</string>
<string name="screen_rotation_device_rotation">При завъртане на устройството</string>
<string name="screen_rotation_aspect_ratio">Според размера на изображението</string>
<string name="black_background_at_fullscreen">Черен фон при преглед на цял екран</string>
<string name="scroll_thumbnails_horizontally">Хоризонтално прелистване на миниатюрите</string>
<string name="hide_system_ui_at_fullscreen">Без системен интерфейс при преглед на цял екран</string>
<string name="delete_empty_folders">Премахване на празните папки при премахване на съдържание</string>
<string name="allow_photo_gestures">Управление на яркостта при преглед с вертикални жестове</string>
<string name="allow_video_gestures">Управление на яркостта и звука при преглед с вертикални жестове</string>
<string name="show_media_count">Показване на броя файлове в папките</string>
<string name="show_extended_details">Показване на сведения за файла при преглед на цял екран</string>
<string name="manage_extended_details">Управление на сведенията за файла</string>
<string name="one_finger_zoom">Увеличаване на мащаба с един пръст при гледане на цял екран</string>
<string name="allow_instant_change">Моментална смяна на медията чрез кликване отстрани на екрана</string>
<string name="one_finger_zoom">Мащабиране с един пръст при преглед на цял екран</string>
<string name="allow_instant_change">Смяна на медията чрез докосване страните на екрана</string>
<string name="allow_deep_zooming_images">Пълна промяна на мащаба на изображенията</string>
<string name="hide_extended_details">Скриване на сведения за файла когато е скрита информацията за състоянието</string>
<string name="show_at_bottom">Показване на някои бутони за действия в долната част екрана</string>
<string name="show_recycle_bin">Показване на кошче на екрана с папките</string>
<string name="hide_extended_details">Без сведения за файла при скрита лента за състоянието</string>
<string name="show_at_bottom">Показване на бутони в долната част екрана</string>
<string name="show_recycle_bin">Показване на кошчето редом с папките</string>
<string name="deep_zoomable_images">Промяна мащаба на изображения</string>
<string name="show_highest_quality">Показване на изображения с най-високото възможно качество</string>
<string name="show_recycle_bin_last">Показване на кошчето като последен елемент на главния екран</string>
<string name="allow_down_gesture">Излизане от режим на цял екран с жест надолу</string>
<string name="show_highest_quality">Показване на изображенията в най-високото качество</string>
<string name="show_recycle_bin_last">Кошчето да е последен елемент на главния екран</string>
<string name="allow_down_gesture">Излизане от цял екран с дърпане надолу</string>
<string name="allow_one_to_one_zoom">Мащабиране 1:1 с две двойни потупвания</string>
<string name="open_videos_on_separate_screen">Отваряне на видео на отделен екран с нов хоризонтален жест</string>
<string name="show_notch">Показване на етикет, ако е наличен</string>
<string name="show_notch">Показване на прорез на екрана, ако е наличен</string>
<string name="allow_rotating_gestures">Завъртане на изображения с жестове</string>
<string name="file_loading_priority">Приоритет на зареждане на файлове</string>
<string name="speed">Скорост</string>
<string name="compromise">Компромис</string>
<string name="avoid_showing_invalid_files">Показване само на валидни файлове</string>
<string name="show_image_file_types">Показване на вида на файла на изображението</string>
<string name="allow_zooming_videos">Увеличаване мащаба на видеото с двойно тупване</string>
<string name="folder_thumbnail_style">Стил на папката на миниатюрните изображения</string>
<string name="file_thumbnail_style">Стил на файла на миниатюрното изображение</string>
<string name="mark_favorite_items">Отбелязване на любими елементи</string>
<string name="thumbnail_spacing">Празно пространство между миниатюрните изображения</string>
<string name="show_file_count_line">Показване на брояча на отделна линия</string>
<string name="show_file_count_brackets">Показване на броя файлове в скоби</string>
<string name="avoid_showing_invalid_files">Пропускане на файловете с грешки</string>
<string name="show_image_file_types">Показване на вида на файла на изображенията</string>
<string name="allow_zooming_videos">Увеличаване мащаба на видеото с двойно потупване</string>
<string name="folder_thumbnail_style">Вид на миниатюрите на папки</string>
<string name="file_thumbnail_style">Вид на миниатюрите на файлове</string>
<string name="mark_favorite_items">Отбелязване на избраните елементи</string>
<string name="thumbnail_spacing">Пространство между миниатюрите</string>
<string name="show_file_count_line">Показване броя файлове на отделен ред</string>
<string name="show_file_count_brackets">Показване броя файлове в скоби</string>
<string name="show_file_count_none">Без показване на броя файлове</string>
<string name="limit_folder_title">Ограничаване на заглавията на папките до един ред</string>
<string name="square">Квадрат</string>
<string name="square">Квадратни</string>
<string name="rounded_corners">Заоблени ъгли</string>
<string name="export_favorite_paths">Експортиране на любимите</string>
<string name="import_favorite_paths">Импортиране на любими</string>
<string name="paths_imported_successfully">Пътищата са импортирани успешно</string>
<string name="media_management_prompt">За да работят надеждно всички операции, моля задайте това приложение да управлява медията в настройките на вашето устройство.</string>
<string name="password_protect_excluded">Защита на изключена папка с парола</string>
<string name="export_favorite_paths">Изнасяне на избраните</string>
<string name="import_favorite_paths">Внасяне на избраните</string>
<string name="paths_imported_successfully">Пътищата са внесени</string>
<string name="media_management_prompt">За да работят надеждно всички действия, задайте приложението да управлява медията в настройките на устройството.</string>
<string name="password_protect_excluded">Защита с парола изключените папки</string>
<string name="media_management_manual">Нещо се обърка, моля, влезте в Настройки на вашето устройство - Приложения - Достъп до специални приложения - Приложения за управление на медии и разрешете на това приложение да управлява медиите.</string>
<string name="media_management_note">Ако пренасочването не работи, моля, влезте в Настройки на вашето устройство - Приложения - Достъп до специални приложения - Приложения за управление на медии и разрешете на това приложение да управлява медиите.</string>
<string name="media_management_alternative">Ако не искате да го направите, можете също да отидете в Настройки на вашето устройство - Приложения - Специален достъп до приложения - Приложения за управление на медии и да разрешите на това приложение да управлява медии.</string>
<string name="alternative_media_access">Като алтернатива можете да разрешите достъп само до медийни файлове. В този случай обаче няма да можете да работите със скрити файлове.</string>
<string name="media_only">Само медия</string>
<string name="all_files">Всички файлове</string>
<string name="search_all_files">Търсете всички файлове вместо папки на главния екран</string>
<string name="show_all_folders">Показване на бутон на менюто за бързо превключване на Показване на съдържанието на всички папки</string>
<string name="search_all_files">Търсене на файлове, не само папки от главния екран</string>
<string name="show_all_folders">Показване на бутон, превключващ „Показване на всички медийни файлове“</string>
<string name="thumbnails">Миниатюри</string>
<string name="fullscreen_media">Медия на цял екран</string>
<string name="fullscreen_media">Преглед на цял екран</string>
<string name="extended_details">Подробности</string>
<string name="bottom_actions">Действия от долния край на екрана</string>
<string name="manage_bottom_actions">Управление на видимите действия в долния край на екрана</string>
<string name="manage_bottom_actions">Управление на бутоните в долния край на екрана</string>
<string name="toggle_favorite">Превключване на любимите</string>
<string name="toggle_file_visibility">Превключване на видимост на файл</string>
<string name="faq_2_title">Заключих програмата с парола, но я забравих. Какво мога да направя\?</string>
<string name="faq_2_text">Можете да разрешите проблема по два начина. Можете или да преинсталирате програмата, или да намерите програмата в настройките на вашето устройство и да изберете \"Изчистване на данните\". Това ще нулира всички ваши настройки, няма да изтрие никакви медийни файлове.</string>
<string name="toggle_file_visibility">Превключване видимостта на файловете</string>
<string name="faq_2_title">Заключих приложението с парола, но я забравих. Какво мога да направя?</string>
<string name="faq_2_text">Можете да разрешите проблема по два начина. Можете или да преинсталирате приложението, или да го намерите в настройките на устройството и да изберете „Изчистване на данните“. По този начин ще нулирате настройките му, но няма да засегне медийните файлове.</string>
<string name="faq_4_title">Как мога да превъртя напред видео\?</string>
<string name="faq_5_title">Каква е разликата между скриване и изключване на папка\?</string>
<string name="faq_3_title">Как мога да накарам някой албум да се показва винаги отгоре\?</string>
<string name="faq_3_title">Как да накарам даден албум да се показва винаги отгоре?</string>
<string name="faq_4_text">Можете да тупнете отстрани на екрана или да тупнете върху текстовете за текуща или максимална продължителност близо до полето за търсене. Ако включите отварянето на видео на отделен екран в настройките на приложението, можете също да използвате хоризонтални жестове.</string>
<string name="faq_3_text">Можете да натиснете дълго избрания албум и да изберете \"Закачване\" в менюто с действията, това ще го закачи отгоре. Можете да закачите множество папки, като закачените папки ще бъдат сортирани с основния начин за сортиране.</string>
<string name="faq_6_title">Защо се показват папки с музикални албуми или стикери\?</string>
<string name="faq_3_text">Можете да задържите върху албума и да изберете „Закачане“ от менюто. По този начин ожете да закачите множество папки, които ще бъдат сортирани по подразбирания признак.</string>
<string name="faq_6_title">Защо се показват папки с обложки на музикални албуми?</string>
<string name="faq_6_text">Може да видите да се показват някои необичайни албуми. Можете да ги изключите като ги натиснете продължително и после изберете Изключване. В следващия диалог можете да изберете папката от по-горно ниво, като има вероятност това да скрие и други свързани албуми.</string>
<string name="faq_7_title">Папка с изображения не се показва, или не показва всички елементи. Какво мога да направя\?</string>
<string name="faq_7_text">Може да има множество причини за това, но решението е лесно. Просто идете в Настройки -&gt; Управление на Включените Папки, изберете Плюс и навигирайте до исканата папка.</string>
@ -227,12 +225,12 @@
<string name="faq_10_title">Мога ли да изрязвам изображения с това приложение\?</string>
<string name="faq_10_text">Да, можете да изрежете изображения в редактора, като плъзкате ъглите на изображението. Можете да стигнете до редактора като натиснете продължително миниатюра на изображение и изберете Редактиране, или изберете Редактиране от изгледа на цял екран.</string>
<string name="faq_11_title">Мога ли да групирам миниатюри на медийни файлове\?</string>
<string name="faq_11_text">Разбира се, просто използвайте елемента от менюто „Групиране по“, докато сте в изгледа с миниатюри. Можете да групирате файлове по множество критерии, включително Дата на заснемане. Ако използвате функцията „Показване на съдържанието на всички папки“, можете да ги групирате и по папки.</string>
<string name="faq_11_text">Разбира се, просто използвайте елемента от менюто „Групиране по“, докато сте в изгледа с миниатюри. Можете да групирате файлове по множество критерии, включително Дата на заснемане. Ако е отметнато „Показване на съдържанието на всички папки“, можете да ги групирате и по папки.</string>
<string name="faq_12_title">Сортирането по дата на заснемане изглежда не работи правилно, как мога да го поправя\?</string>
<string name="faq_12_text">Най-вероятно е причинено от копирането на файлове от някъде. Можете да го поправите, като изберете миниатюрите на файла и изберете \"Поправяне стойност на датата на заснемане\".</string>
<string name="faq_13_title">Виждам някои цветни ленти на изображенията. Как мога да подобря качеството\?</string>
<string name="faq_13_text">Настоящото решение за показване на изображения работи добре в по-голямата част от случаите, но ако искате още по-добро качество на изображението, можете да активирате „Показване на изображения с възможно най-високо качество“ в настройките на приложението, в секцията „Изображения с дълбоко мащабиране“ .</string>
<string name="faq_14_title">Скрих файл/папка. Как мога да горазкрия\?</string>
<string name="faq_13_text">Настоящото решение за показване на изображения работи добре в по-голямата част от случаите, но ако искате още по-добро качество на изображението, можете да включите „Показване на изображения с възможно най-високо качество“ от настройките, в секцията „Изображения с дълбоко мащабиране“ .</string>
<string name="faq_14_title">Скрих файл/папка. Как мога да говидя?</string>
<string name="faq_14_text">Можете или да натиснете елемента от менюто „Временно показване на скрити елементи“ на главния екран, или да превключите „Показване на скрити елементи“ в настройките на приложението, за да видите скрития елемент. Ако искате да го покажете, просто го натиснете дълго и изберете „Показване“. Папките се скриват чрез добавяне на скрит \".nomedia\" файл в тях, можете да изтриете файла и с всеки файлов мениджър. Имайте предвид, че скриването работи рекурсивно, така че ако скриете папка, всички подпапки също ще станат скрити. Така че, за да разкриете подпапките, трябва да разкриете родителската папка.</string>
<string name="faq_15_title">Защо приложението заема толкова много място\?</string>
<string name="faq_15_text">Кешът на приложението може да отнеме до 250 MB, което гарантира по-бързо зареждане на изображението. Ако приложението заема още повече място, най-вероятно това е причинено от това, че имате елементи в кошчето. Тези файлове се броят към размера на приложението. Можете да изчистите кошчето, като го отворите и изтриете всички файлове или от настройките на приложението. Всеки файл в кошчето се изтрива автоматично след 30 дни.</string>
@ -242,5 +240,17 @@
<string name="faq_17_title">Защо вече не мога да добавя липсващи папки\?</string>
<string name="faq_17_text">Това спря да работи поради системните промени, които дойдоха и с Android 11, приложението вече не може да преглежда истински папки, разчита на така наречения MediaStore при извличане на данни.</string>
<string name="faq_18_title">Защо виждам реклами по време на възпроизвеждане на видео\?</string>
<string name="faq_18_text">Приложенията ни нямат никакви реклами. Ако ги видите по време на възпроизвеждане на видео, явно използвате видеоплейър от други приложения. Опитайте да намерите подразбирания видеоплейър в настройките на устройството, след което направете „Изчистване на настройките по подразбиране“ върху него. Следващия път, когато извикате някакъв видеоплейър, ще видите диалог за избор на приложение, където можете да изберете кое приложение искате да използвате.</string>
<string name="faq_18_text">Приложенията ни нямат реклами. Ако видите реклама по време на възпроизвеждане на видео, явно използвате видеоплейър от други приложения. Опитайте да намерите подразбирания видеоплейър в настройките на устройството, след което направете „Изчистване на настройките по подразбиране“ върху него. Следващия път, когато извикате някакъв видеоплейър, ще видите диалог за избор на приложение, където можете да изберете кое приложение искате да използвате.</string>
<string name="wallpaper">Тапет</string>
<string name="full_storage_permission_required">За да може да покаже всички снимки и видеофайлове Fossify Gallery се нуждае от пълен достъп.</string>
<string name="playback_speed">Скорост на възпроизвеждане</string>
<string name="failed_to_load_media">Файлът с медия не може да бъде зяреден.</string>
<string name="file_is_malformed_or_corrupted">Файлът е с неправилен формат или е повреден.</string>
<string name="media_exceeds_device_capabilities">Файлът надхвърля възможностите на устройството.</string>
<string name="unsupported_format">Неподдържан формат.</string>
<string name="exclude_folder_description">По този начин ще изключите избраните папки и тяхното съдържание само от Fossify Gallery. Управлението на изключени папки се намира в настройките.</string>
<string name="excluded_activity_placeholder">Изключването на папките ще скрие тях и вложените папки, само от Fossify Gallery в други приложения папките ще бъдат видими.\n\nАко искате да ги скриете и от тях, използвайте Скриване.</string>
<string name="faq_1_title">Как да направя Fossify Gallery подразбираната галерия на устройството?</string>
<string name="faq_5_text">Изключването предотвратява показването на папката само във Fossify Gallery, докато скриването работи на ниво система и скрива папката и от други галерии. Това става чрез създаване на празен файл с име „nomedia“ в дадената папка, който след това можете да премахнете с всяко приложение за работа с файлове. Имайте предвид, че някои устройства не позволяват скриване на папките Камера, Екранни снимки, Изтегляния и подобни.</string>
<string name="faq_1_text">Първо трябва да намерите галерията по подразбиране в настройките, секция Приложения, потърсете бутон, който казва нещо като „Отваряне по подразбиране“, докоснете го, след това изберете „Изчистване на настройките по подразбиране“. Следващия път, когато отворите изображение или видеоклип, трябва да видите инструмент за избор на приложение, там можете да изберете Fossify Gallery и да направите приложението подразбирано.</string>
</resources>

View file

@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="videos">Videoioù</string>
<string name="images">Skeudennoù</string>
</resources>

View file

@ -230,7 +230,7 @@
<string name="faq_12_title">L\'ordenació per la data de presa no sembla funcionar correctament, com puc solucionar-ho\?</string>
<string name="faq_12_text">Probablement, els fitxers s\'han copiat des de qualsevol lloc. Podeu arreglar-ho seleccionant les miniatures de fitxer i seleccionant «Corregeix el valor de la data de presa».</string>
<string name="faq_13_title">Veig algunes bandes de colors a les imatges. Com puc millorar la qualitat\?</string>
<string name="faq_13_text">La solució actual per mostrar imatges funciona bé en la gran majoria dels casos, però si voleu obtenir una qualitat d\'imatge millor, podeu activar «Mostra les imatges amb la màxima qualitat possible» a la configuració de l\'aplicació, a la secció «Imatges ampliables profundament».</string>
<string name="faq_13_text">La solució actual per a mostrar imatges funciona bé en la gran majoria dels casos, però si voleu obtenir una qualitat d\'imatge millor, podeu activar «Mostra les imatges amb la màxima qualitat possible» a la configuració de l\'aplicació, a la secció «Imatges ampliables profundament».</string>
<string name="faq_14_title">He ocultat un fitxer/carpeta. Com puc mostrar-ho\?</string>
<string name="faq_14_text">Podeu prémer l\'element de menú «Mostra temporalment els elements ocults» a la pantalla principal o canviar «Mostra els elements ocults» a la configuració de l\'aplicació per a veure l\'element ocult. Si el voleu mostrar, premeu-lo i seleccioneu «Mostra». Les carpetes s\'oculten afegint un fitxer «.nomedia» ocult en elles, també podeu eliminar el fitxer amb qualsevol gestor de fitxers. Tingueu en compte que l\'ocultació funciona recursivament, així que si oculteu una carpeta, totes les subcarpetes també esdevindran ocultes. Per tant, per a fer visibles les subcarpetes cal mostrar la carpeta superior.</string>
<string name="faq_15_title">Per què l\'aplicació ocupa tant espai\?</string>
@ -245,14 +245,17 @@
<string name="faq_1_title">Com puc fer que la Fossify Gallery sigui la galeria predeterminada del dispositiu?</string>
<string name="editor">Editor</string>
<string name="wallpaper">Fons de pantalla</string>
<string name="faq_5_text">Exclou impedeix mostrar la carpeta només a Fossify Gallery, mentre que Oculta funciona a nivell del sistema i també oculta la carpeta d\'altres galeries. Funciona creant un fitxer «.nomedia» buit a la carpeta indicada, que després podreu eliminar amb qualsevol gestor de fitxers. Tingueu en compte que alguns dispositius no permeten amagar carpetes com ara Camera/Càmera, Screenshots/Captures de pantalla o Downloads/Descàrregues.</string>
<string name="faq_5_text">Exclou impedeix mostrar la carpeta només a Fossify Gallery, mentre que Oculta funciona en l\'àmbit del sistema i també oculta la carpeta d\'altres galeries. Funciona creant un fitxer «.nomedia» buit a la carpeta indicada, que després podreu eliminar amb qualsevol gestor de fitxers. Tingueu en compte que alguns dispositius no permeten amagar carpetes com ara Camera/Càmera, Screenshots/Captures de pantalla o Downloads/Descàrregues.</string>
<string name="exclude_folder_description">Això exclourà la selecció juntament amb les seves subcarpetes només de la Fossify Gallery. Podeu gestionar les carpetes excloses a la configuració.</string>
<string name="excluded_activity_placeholder">L\'exclusió de les carpetes es farà juntament amb les seves subcarpetes amagades només a la Fossify Gallery, però encara seran visibles en les altres aplicacions.
\n
\nSi també voleu amagar-les de les altres apps, utilitzeu la funció Amagar.</string>
<string name="faq_1_text">Primer heu de trobar la galeria predeterminada a la secció d\'Aplicacions de la configuració del dispositiu, busqueu un botó que digui alguna cosa com «Obre per defecte», feu-hi clic i seleccioneu «Neteja els valors per defecte». La pròxima vegada que intenteu obrir una imatge o un vídeo veureu un selector d\'aplicacions, on podreu seleccionar Fossify Gallery i convertir-la en l\'aplicació predeterminada.</string>
<string name="interval">Interval</string>
<string name="full_storage_permission_required">La Fossify Gallery necessita d\'accés complet accés a totes les vostres fotografies i vídeos. Aneu a Configuració &gt; Permisos &gt; Fotos i vídeos &gt; Permet-ho tot.</string>
<string name="full_storage_permission_required">La Fossify Gallery necessita accés complet a totes les vostres fotografies i vídeos. Aneu a Configuració &gt; Permisos &gt; Fotos i vídeos &gt; Permet-ho tot.</string>
<string name="playback_speed">Velocitat de reproducció</string>
<string name="failed_to_load_media">Ha fallat en carregar elements multimèdia.</string>
</resources>
<string name="media_exceeds_device_capabilities">Els elements multimèdia excedeixen les capacitats del dispositiu.</string>
<string name="file_is_malformed_or_corrupted">El fitxer està malmès o s\'ha corromput.</string>
<string name="unsupported_format">Format no admès.</string>
</resources>

View file

@ -255,4 +255,7 @@
<string name="full_storage_permission_required">Galerie Fossify potřebuje plný přístup ke zobrazení všech vašich fotek a videí. Přejděte do Nastavení &gt; Oprávnění &gt; Fotky a videa &gt; Povolit vše.</string>
<string name="playback_speed">Rychlost přehrávání</string>
<string name="failed_to_load_media">Nepodařilo se načíst média.</string>
<string name="media_exceeds_device_capabilities">Média přesahují schopnosti zařízení.</string>
<string name="file_is_malformed_or_corrupted">Soubor je poškozen.</string>
<string name="unsupported_format">Nepodporovaný formát.</string>
</resources>

View file

@ -6,7 +6,7 @@
<string name="open_camera">Agor y camera</string>
<string name="hidden">(cudd)</string>
<string name="show_all">Dangos cynnwys o bob ffolder</string>
<string name="excluded">(wedi\'i allgáu)</string>
<string name="excluded">(wedi\'i eithrio)</string>
<string name="pin_folder">Pinio\'r ffolder</string>
<string name="unpin_folder">Dadbinio\'r ffolder</string>
<string name="all_folders">Pob ffolder</string>
@ -134,8 +134,47 @@
<string name="slideshow_ended">Daeth y sleidsioe i ben</string>
<string name="do_not_group_files">Peidio â grwpio ffeiliau</string>
<string name="show_thumbnail_video_duration">Dangos hyd fideo</string>
<string name="deep_zoomable_images">Galluogi chwyddo dwfn ar ddelweddau</string>
<string name="deep_zoomable_images">Chwyddo delwedd dwfn</string>
<string name="show_highest_quality">Dangos delweddau yn yr ansawdd uchaf posibl</string>
<string name="mark_favorite_items">Dynodi ffefrynnau</string>
<string name="thumbnail_spacing">Bylchiad rhwng cryno-luniau</string>
<string name="image_edited_successfully">Wedi golygu\'r delwedd yn llwyddiannus</string>
<string name="video_edited_successfully">Wedi golygu\'r fideo\'n llwyddiannus</string>
<string name="no_image_editor_found">Ni chanfuwyd golygydd delwedd</string>
<string name="no_video_editor_found">Ni chanfuwyd golygydd fideo</string>
<string name="unknown_file_location">Lleoliad ffeil anhysbys</string>
<string name="wallpaper_set_successfully">Wedi gosod y papur wal yn llwyddiannus</string>
<string name="portrait_aspect_ratio">Cymhareb agwedd portread</string>
<string name="landscape_aspect_ratio">Cymhareb agwedd tirlun</string>
<string name="screen_rotation_by">Troi cyfryngau sgrin lawn yn ôl</string>
<string name="exclude_folder_parent">Eithrio rhiant yn hytrach?</string>
<string name="animate_gifs">Animeiddio GIFs mewn cryno-luniau</string>
<string name="allow_deep_zooming_images">Galluogi chwyddo dwfn ar ddelweddau</string>
<string name="folder_thumbnail_style">Arddull cryno-lun ffolder</string>
<string name="show_file_count_none">Peidio â dangos cyfanswm ffeiliau</string>
<string name="failed_to_load_media">Wedi methu â llwytho cyfryngau</string>
<string name="file_edited_successfully">Wedi golygu\'r ffeil yn llwyddiannus</string>
<string name="group_direct_subfolders">Grwpio is-ffolderi uniongyrchol</string>
<string name="autoplay_videos">Chwarae fideos yn awtomatig</string>
<string name="show_notch">Dangos notch os yw ar gael</string>
<string name="file_loading_priority">Blaenoriaeth llwytho ffeiliau</string>
<string name="show_image_file_types">Dangos estyniadau ffeil ar ddelweddau</string>
<string name="file_thumbnail_style">Arddull cryno-lun ffeil</string>
<string name="reorder_by_dragging">Aildrefnu ffolderi drwy lusgo</string>
<string name="paths_imported_successfully">Wedi mewnforio\'r llwybrau\'n llwyddiannus</string>
<string name="toggle_file_visibility">Newid gwelededd y ffeil</string>
<string name="no_media_with_filters">Ni chanfuwyd unrhyw ffeiliau cyfryngau gyda\'r hidlyddion a ddewiswyd.</string>
<string name="show_media_count">Dangos nifer y cyfryngau mewn ffolderi ar y prif olyg</string>
<string name="allow_changing_aspect_ratio">Caniatáu i newid cymhareb yr agwedd</string>
<string name="by_last_modified">Wedi\'i addasu yn ddiwethaf</string>
<string name="by_last_modified_daily">Wedi\'i addasu yn ddiwethaf (dyddiol)</string>
<string name="folder_on_widget">Ffolder sydd yn cael ei ddangos ar y teclyn:</string>
<string name="by_last_modified_monthly">Wedi\'i addasu yn ddiwethaf (misol)</string>
<string name="show_file_count_section_header">Dangos nifer y ffeiliau mewn penawdau</string>
<string name="show_at_bottom">Dangos rhai botymau gweithredu ar waelod y sgrin</string>
<string name="unsupported_format">Fformat heb ei cefnogi.</string>
<string name="show_file_count_brackets">Dangos nifer y ffeiliau mewn cromfach</string>
<string name="allow_down_gesture">Caniatáu cau\'r olyg sgrin lawn gydag ystum i lawr</string>
<string name="avoid_showing_invalid_files">Osgoi dangos ffeiliau annilys</string>
<string name="show_file_count_line">Dangos nifer y ffeiliau ar ei linell ei hunan</string>
</resources>

View file

@ -228,7 +228,7 @@
<string name="faq_13_title">Ich sehe Banding (streifiger Farbverlauf) auf den Bildern. Wie kann ich die Qualität verbessern\?</string>
<string name="faq_13_text">Die jetzige Methode für die Anzeige von Bildern funktioniert in den allermeisten Fällen gut, aber für eine noch bessere Bildqualität kann die Einstellung „Bilder in der höchstmöglichen Qualität zeigen“ im Menü unter „Stark vergrößerbare Bilder“ gesetzt werden.</string>
<string name="faq_14_title">Ich habe eine versteckte Datei bzw. einen versteckten Ordner. Wie kann ich diese/n sichtbar stellen\?</string>
<string name="faq_14_text">Man kann entweder auf den Menüpunkt „Ausgeblendete Elemente vorübergehend anzeigen“ auf dem Hauptbildschirm drücken oder „Versteckte Elemente anzeigen“ in den Einstellungen einschalten, um das ausgeblendete Element zu sehen. Um es dauerhaft wieder einzublenden, drückt man einfach lange darauf und wählt „Nicht verstecken“. Ordner werden durch Hinzufügen einer versteckten .nomedia-Datei ausgeblendet; man kann die Datei auch mit einem beliebigen Dateiverwaltungsprogramm löschen. Bitte beachten, dass das Verstecken rekursiv funktioniert, d. h. wenn man einen Ordner versteckt, werden auch alle Unterordner versteckt. Um die Unterordner wieder sichtbar zu machen, muss man also den übergeordneten Ordner sichtbar machen.</string>
<string name="faq_14_text">Man kann entweder auf den Menüpunkt „Ausgeblendete Elemente vorübergehend anzeigen“ auf dem Hauptbildschirm drücken oder „Versteckte Elemente anzeigen“ in den Einstellungen einschalten, um das ausgeblendete Element zu sehen. Um es dauerhaft wieder einzublenden, drückt man einfach lange darauf und wählt „Nicht verstecken“. Ordner werden durch Hinzufügen einer versteckten .nomedia-Datei ausgeblendet; man kann die Datei auch mit einem beliebigen Dateiverwaltungsprogramm löschen. Bitte beachten, dass das Verstecken rekursiv funktioniert, d. h. wenn man einen Ordner versteckt, werden auch alle Unterordner versteckt. Um die Unterordner wieder sichtbar zu machen, muss man also den übergeordneten Ordner sichtbar machen.</string>
<string name="faq_15_title">Warum beansprucht die App so viel Speicherplatz\?</string>
<string name="faq_15_text">Der App-Cache kann bis zu 250 MB groß werden, er sorgt für ein schnelleres Laden der Bilder. Wenn die App darüber hinaus Speicherplatz beansprucht, liegt das wahrscheinlich an Dateien im Papierkorb. Diese Dateien werden dem Speicherplatz der App zugerechnet. Man kann den Papierkorb leeren, indem man ihn öffnet und alle Dateien darin löscht, oder den entsprechenden Menüeintrag in den Einstellungen wählt. Jede Datei im Papierkorb wird nach 30 Tagen automatisch gelöscht.</string>
<string name="faq_16_title">Was ist mit dem Ausblenden von Dateien und Ordnern passiert und warum kann ich versteckte Elemente nicht mehr sehen\?</string>
@ -254,4 +254,7 @@
<string name="playback_speed">Wiedergabegeschwindigkeit</string>
<string name="full_storage_permission_required">Fossify Gallery benötigt vollen Zugriff, um alle Fotos und Videos anzuzeigen. Gehe zu Einstellungen &gt; Berechtigungen &gt; Fotos und Videos &gt; Zugelassen.</string>
<string name="failed_to_load_media">Medien konnten nicht geladen werden.</string>
<string name="unsupported_format">Nicht unterstütztes Format.</string>
<string name="file_is_malformed_or_corrupted">Datei ist fehlerhaft oder beschädigt.</string>
<string name="media_exceeds_device_capabilities">Medien überschreiten die Gerätekapazitäten.</string>
</resources>

View file

@ -16,11 +16,241 @@
<string name="lock_orientation">Ŝlosi orientiĝon</string>
<string name="unlock_orientation">Malŝlosi orientiĝon</string>
<string name="change_orientation">Ŝanĝi orientiĝon</string>
<string name="fixing">Riparante</string>
<string name="fixing">Korektado</string>
<string name="images">Bildoj</string>
<string name="videos">Filmoj</string>
<string name="videos">Filmetoj</string>
<string name="gifs">GIF-filmetoj</string>
<string name="raw_images">RAW-bildoj</string>
<string name="svgs">SVG-bildoj</string>
<string name="portraits">Portretoj</string>
<string name="thumbnails">Bildetoj</string>
<string name="toggle_favorite">Baskuligi plej ŝatatan</string>
<string name="playback_speed">Legada rapideco</string>
<string name="excluded">(ekskluzivita)</string>
<string name="show_all">Montri enhavon de ĉiuj dosierujoj</string>
<string name="folder_view">Ŝanĝiĝi al dosieruja vido</string>
<string name="force_portrait">Ĉiam uzi vertikalan orientiĝon</string>
<string name="full_storage_permission_required">Fossify Galerio bezonas tutan atingon por montri viajn fotojn kaj filmetojn. Iru al Agordoj &gt; Permesoj &gt; Fotoj kaj filmetoj &gt; Permesi ĉion.</string>
<string name="use_default_orientation">Uzi defaŭltan orientiĝon</string>
<string name="no_date_takens_found">Neniu prenodato estis trovita</string>
<string name="force_landscape">Ĉiam uzi horizontalan orientiĝon</string>
<string name="fix_date_taken">Korekti prenodaton</string>
<string name="dates_fixed_successfully">Datoj sukcese korektitaj</string>
<string name="share_resized">Kunhavigi regrandigitan version</string>
<string name="exclude_folder_parent">Anstataŭe ekskluzivi patron?</string>
<string name="no_media_with_filters">Neniu aŭdvidaĵo estis trovita kun la elektitaj filtroj.</string>
<string name="change_filters_underlined"><u>Ŝanĝi filtrojn</u></string>
<string name="switch_to_file_search">Ŝanĝiĝi al serĉo je ĉiuj videblaj dosierujoj</string>
<string name="set_as_default_folder">Difini kiel defaŭlta dosierujo</string>
<string name="unset_as_default_folder">Maldifini kiel defaŭlta dosierujo</string>
<string name="reorder_by_dragging">Reordigi dosierujojn per treni</string>
<string name="reorder_by_dragging_pro">Reordigi dosierujojn per treni (Pro)</string>
<string name="restore_to_path">Restaŭrado al \"%s\"</string>
<string name="filter_media">Filtri aŭdvidaĵojn</string>
<string name="hide_folder_description">Ĉi tiu funkcio kaŝas dosierujon per aldoni al ĝi dosieron nomitan \".nomedia\", kaj ankaŭ kaŝas ĉiujn subdosierujojn. Vi povos vidi ilin per baskuligi la opcion \"Montri kaŝitajn elementojn\" en la agordoj. Ĉu vi ŝatus adi?</string>
<string name="exclude_folder_description">Tio ĉi ekskluzivos la elekton kaj ĝiajn subdosierujojn el nur Fossify Galario. Vi povas administri ekskluzivitajn dosierujojn en la agordoj.</string>
<string name="keep_aspect_ratio">Gardi bildformaton</string>
<string name="invalid_values">Bonvolu enigi validan distingivon</string>
<string name="resize_multiple_images">Regrandigi multajn bildojn</string>
<string name="resize_factor">Regrandiga faktoro</string>
<string name="included_activity_placeholder">Se vi havas dosierujojn kun aŭdvidaĵoj kiuj ne estis rekonataj pro la aplikaĵo, vi povas permane aldoni ilin ĉi tie.\n\nAldoni elementojn ĉi tie ne ekskluzivos iun ajn alian dosierujon.</string>
<string name="resize_factor_error">Enigu nombron inter 10 kaj 90</string>
<string name="hidden_folders">Kaŝitaj dosierujoj</string>
<string name="hidden_folders_placeholder">Ŝajnas, ke vi havas neniun kaŝitan dosierujon kun \".nomedia\"-dosiero.</string>
<string name="manage_included_folders">Administri inkluzivitajn dosierujojn</string>
<string name="resize_and_save">Regrandigi elekton kaj konservi</string>
<string name="width">Larĝo</string>
<string name="height">Alto</string>
<string name="resize_factor_info">Regrandigi bildojn al donata procento, kiu devas esti inter 10 kaj 90.</string>
<string name="basic_editor">Simple redaktilo</string>
<string name="manage_hidden_folders">Administri kaŝitajn dosierujojn</string>
<string name="advanced_editor">Altnivela redaktilo</string>
<string name="rotate">Turni</string>
<string name="invalid_image_path">Nevalida vojo de bildo</string>
<string name="excluded_activity_placeholder">Ekskluzivi dosierujojn kaŝos ilin kaj iliajn subdosierujojn nur en Fossify Galerio, sed ili restos videble en aliaj aplikaĵoj.\n\nSe vi ankaŭ volas kaŝi ilin en aliaj aplikaĵoj, uzu la funkcion Kaŝi.</string>
<string name="hidden_all_files">Endas koncedi al la aplikaĵo atingon al ĉiuj dosieroj por vidi kaŝitajn dosierojn, aŭ ĝi ne funkcios.</string>
<string name="cant_unhide_folder">Se dosierujo aŭ ties patro havas punkton antaŭ sia nomo, ĝi estas kaŝita kaj ne povas esti malkaŝita ĉi tiel. Vi devas forigi la punkton per renomi ĝin.</string>
<string name="include_folders">Inkluzivitaj dosierujoj</string>
<string name="add_folder">Aldoni dosierujon</string>
<string name="no_media_add_included">Neniu aŭdvidaĵa dosiero estis trovita. Vi povas tion solvi per aldoni permane dosierujojn kun aŭdvidaĵoj.</string>
<string name="invalid_video_path">Nevalida vojo de filmeto</string>
<string name="images_resized_successfully">Bildoj sukcese regrandigitaj</string>
<string name="editor">Redaktilo</string>
<plurals name="failed_to_resize_images">
<item quantity="one">Malsukcesis regrandigi %d bildon</item>
<item quantity="other">Malsukcesis regrandigi %d bildojn</item>
</plurals>
<string name="image_editing_failed">Malsukcesis la redakto de bildo</string>
<string name="image_editing_cancelled">Redakto de bildo nuligita</string>
<string name="video_editing_cancelled">Redakto de filmeto nuligita</string>
<string name="error_saving_file">Ne povis superskribi la fontan dosieron</string>
<string name="transform">Transformi</string>
<string name="draw">Desegni</string>
<string name="flip">Renversi</string>
<string name="set_as_wallpaper_failed">Malsukcesis difini kiel ekranfono</string>
<string name="free_aspect_ratio">Libera</string>
<string name="other_aspect_ratio">Alia</string>
<string name="wallpaper">Ekranfono</string>
<string name="set_as_wallpaper">Difini kiel ekranfono</string>
<string name="flip_vertically">Renversi vertikale</string>
<string name="flip_horizontally">Renversi horizontale</string>
<string name="video_editing_failed">Malsukcesis la redakto de filmeto</string>
<string name="file_edited_successfully">Dosiero sukcese redaktita</string>
<string name="edit_video_with">Redakti filmeton per:</string>
<string name="no_image_editor_found">Neniu bildoredaktilo estis trovita</string>
<string name="no_video_editor_found">Neniu filmoredaktilo estis trovita</string>
<string name="unknown_file_location">Nekonata dosierloko</string>
<string name="image_edited_successfully">Bildo sukcese redaktita</string>
<string name="video_edited_successfully">Filmeto sukcese redaktita</string>
<string name="edit_image_with">Redakti bildon per:</string>
<string name="rotate_right">Turni dekstre</string>
<string name="rotate_one_eighty">Turni 180°</string>
<string name="crop">Tondi</string>
<string name="rotate_left">Turni maldekstre</string>
<string name="portrait_aspect_ratio">Vertikala bildformato</string>
<string name="set_as_wallpaper_with">Difini kiel ekranfono kun:</string>
<string name="lock_screen">Ŝlosekrano</string>
<string name="allow_changing_aspect_ratio">Permesi ŝanĝi bildformaton</string>
<string name="home_and_lock_screen">Hejma kaj ŝlosa ekranoj</string>
<string name="include_photos">Inkluzivi fotojn</string>
<string name="include_videos">Inkluzivi filmetojn</string>
<string name="include_gifs">Inkluzivi GIF-bildojn</string>
<string name="setting_wallpaper">Difinado kiel ekranfono…</string>
<string name="slideshow">Bildserio</string>
<string name="move_backwards">Moviĝi malantaŭe</string>
<string name="animation">Animacio</string>
<string name="loop_slideshow">Ripeti bildserion</string>
<string name="by_last_modified_daily">Laste modifita (tage)</string>
<string name="landscape_aspect_ratio">Horizontala bildformato</string>
<string name="wallpaper_set_successfully">Ekranfono sukcese difinita</string>
<string name="home_screen">Hejmekrano</string>
<string name="interval">Intervalo</string>
<string name="fade">Dissolvo</string>
<string name="by_folder">Dosierujo</string>
<string name="random_order">Hazarda ordo</string>
<string name="no_animation">Neniu</string>
<string name="by_last_modified">Laste modifita</string>
<string name="by_last_modified_monthly">Laste modifita (monate)</string>
<string name="slide">Glito</string>
<string name="no_media_for_slideshow">Neniu aŭdvidaĵo por la bildserio estis trovita</string>
<string name="group_direct_subfolders">Grupigi rektajn subdosierujojn</string>
<string name="group_by">Grupigi laŭ</string>
<string name="slideshow_ended">La bildserio finiĝis</string>
<string name="do_not_group_files">Ne grupigi dosierojn</string>
<string name="by_file_type">Dosiertipo</string>
<string name="by_date_taken">Kreodato</string>
<string name="by_date_taken_daily">Kreodato (tage)</string>
<string name="by_date_taken_monthly">Kreodato (monate)</string>
<string name="by_extension">Dosiersufikso</string>
<string name="grouping_and_sorting">Bonvolu rimarki, ke grupigado kaj ordigado estas du apartaj kampoj</string>
<string name="folder_on_widget">Dosierujo montrita en la fenestraĵo:</string>
<string name="show_file_count_section_header">Montri nombron de dosieroj en sekciokapoj</string>
<string name="autoplay_videos">Aŭtomate legi filmetojn</string>
<string name="remember_last_video_position">Memori lastan pozicion de legado de filmeto</string>
<string name="loop_videos">Ripeti filmetojn</string>
<string name="animate_gifs">Ŝalti animacion de GIF-aj bildetoj</string>
<string name="show_folder_name">Montri nomon de dosierujo</string>
<string name="max_brightness">Maksimuma heleco dum montrado de plenekranaj aŭdvidaĵoj</string>
<string name="crop_thumbnails">Kvadrate tondi bildetojn</string>
<string name="screen_rotation_device_rotation">Orientiĝo de aparato</string>
<string name="screen_rotation_aspect_ratio">Bildformato</string>
<string name="screen_rotation_by">Turni plenekranajn aŭdvidaĵojn laŭ</string>
<string name="screen_rotation_system_setting">Sistema agordo</string>
<string name="show_thumbnail_video_duration">Montri daŭrojn de filmetoj</string>
<string name="delete_empty_folders">Forigi malplenajn dosierujojn post forigi ilian enhavon</string>
<string name="black_background_at_fullscreen">Nigra fono por plenekranaj aŭdvidaĵoj</string>
<string name="scroll_thumbnails_horizontally">Rulumi bildetojn horizontale</string>
<string name="hide_system_ui_at_fullscreen">Aŭtomate kaŝi sisteman interfacon por plenekranaj aŭdvidaĵoj</string>
<string name="allow_photo_gestures">Permesi regi fotan helecon per vertikalaj moviĝoj</string>
<string name="allow_video_gestures">Permesi regi filmetajn sonfortecon kaj helecon per vertikalaj moviĝoj</string>
<string name="show_image_file_types">Montri dosiertipojn de bildoj</string>
<string name="thumbnail_spacing">Interspaco de bildetoj</string>
<string name="mark_favorite_items">Marki plej ŝatatajn elementojn</string>
<string name="show_file_count_line">Montri nombron de dosieroj en aparta linio</string>
<string name="show_recycle_bin">Montri rubujojn sur la ekrano de dosierujoj</string>
<string name="one_finger_zoom">Permesi zomadon per unu fingro por plenekranaj aŭdvidaĵoj</string>
<string name="allow_instant_change">Permesi tuje ŝanĝi aŭdvidaĵojn per alklaki flankojn de la ekrano</string>
<string name="allow_one_to_one_zoom">Permesi 1:1-an zomon per duobla frapeto</string>
<string name="open_videos_on_separate_screen">Ĉiam malfermi filmetojn sur alia ekrano per novaj horizontalaj moviĝoj</string>
<string name="file_loading_priority">Prioritato de ŝargo de dosieroj</string>
<string name="speed">Rapido</string>
<string name="compromise">Kompromiso</string>
<string name="show_extended_details">Montri pliajn detalojn sur plenekranaj aŭdvidaĵoj</string>
<string name="manage_extended_details">Administri pliajn detalojn</string>
<string name="show_media_count">Montri nombron de aŭdvidaĵoj en dosieroj en la ĉefa vido</string>
<string name="show_at_bottom">Montri kelkajn butonojn de akcio je la malsupro de la ekrano</string>
<string name="allow_deep_zooming_images">Permesi profundan zomadon de bildoj</string>
<string name="deep_zoomable_images">Profunde zomeblaj bildoj</string>
<string name="show_highest_quality">Montri bildojn kun laŭeble plej alta kvalito</string>
<string name="show_recycle_bin_last">Montri rubujon kiel lasta elemento sur la ĉefa ekrano</string>
<string name="show_notch">Montri noĉon se disponebla</string>
<string name="allow_rotating_gestures">Permesi turni bildojn per moviĝoj</string>
<string name="avoid_showing_invalid_files">Eviti montri nevalidajn dosierojn</string>
<string name="allow_zooming_videos">Permesi zomi sur filmetoj per duobla frapeto</string>
<string name="folder_thumbnail_style">Stilo de dosierujaj bildetoj</string>
<string name="file_thumbnail_style">Stiloj de dosieraj bildetoj</string>
<string name="hide_extended_details">Kaŝi pliajn detalojn kiam la stata breto estas kaŝita</string>
<string name="allow_down_gesture">Permesi fermi plenekranan vidon per malsupra moviĝo</string>
<string name="show_file_count_brackets">Montri nombron de dosieroj inter krampoj</string>
<string name="show_file_count_none">Ne montri nombron de dosieroj</string>
<string name="limit_folder_title">Limi longajn nomojn de dosierujoj al unu linio</string>
<string name="import_favorite_paths">Importi plej ŝatatajn</string>
<string name="export_favorite_paths">Eksporti plej ŝatatajn</string>
<string name="square">Kvadrato</string>
<string name="rounded_corners">Rondaj anguloj</string>
<string name="media_management_prompt">Por certigi, ke ĉiuj operacioj sur dosieroj ĝuste funkcias, bonvolu igi tiun ĉi aplikaĵon aplikaĵo de administrado de aŭdvidaĵoj en viaj aparataj agordoj.</string>
<string name="paths_imported_successfully">Vojoj sukcese importitaj</string>
<string name="password_protect_excluded">Protekti per pasvorto videblecon de ekskluzivitaj dosierujoj</string>
<string name="all_files">Ĉiuj dosieroj</string>
<string name="media_management_note">Se la alidirekto ne funkcias, bonvolu iri al viaj aparataj Agordoj - Aplikaĵoj - Specialaj permesoj de aplikaĵoj - Aplikaĵoj de administrado de aŭdvidaĵoj kaj permesi, ke tiu ĉi aplikaĵo administru aŭdvidaĵojn.</string>
<string name="extended_details">Pliaj detaloj</string>
<string name="bottom_actions">Malsupraj akcioj</string>
<string name="manage_bottom_actions">Administri videblajn malsuprajn akciojn</string>
<string name="failed_to_load_media">Malsukceso de ŝargi aŭdvidaĵo.</string>
<string name="file_is_malformed_or_corrupted">La dosiero estas misformita aŭ difektita.</string>
<string name="media_exceeds_device_capabilities">La aŭdvidaĵo superas la kapablojn de la aparato.</string>
<string name="unsupported_format">Nesubtenita dosiertipo.</string>
<string name="media_only">Nur aŭdvidaĵoj</string>
<string name="media_management_manual">Io malĝustas. Bonvolu iri al viaj aparataj Agordoj - Aplikaĵoj - Specialaj permesoj de aplikaĵoj - Aplikaĵoj de administrado de aŭdvidaĵoj kaj permesi, ke tiu ĉi aplikaĵo administru aŭdvidaĵojn.</string>
<string name="alternative_media_access">Alia, vi povas permesi atingon nur al aŭdvidaĵaj dosieroj. Tiukaze, vi tamen ne povos interagi kun kaŝitaj dosieroj.</string>
<string name="search_all_files">Serĉi ĉiujn dosierojn anstataŭ dosierujojn je la ĉefekrano</string>
<string name="show_all_folders">Montri menubutonon por rapide baskuligi \"Montri enhavon de ĉiuj dosierujoj\"</string>
<string name="toggle_file_visibility">Baskuligi videblecon de dosieroj</string>
<string name="faq_1_title">Kiel mi povas igi Fossify Galerio la defaŭlta aparata galerio?</string>
<string name="media_management_alternative">Se vi ne volas tion fari, vi ankaŭ povus iri al viaj aparataj Agordoj - Aplikaĵoj - Specialaj permesoj de aplikaĵoj - Aplikaĵoj de administrado de aŭdvidaĵoj kaj permesi, ke tiu ĉi aplikaĵo administru aŭdvidaĵoj.</string>
<string name="fullscreen_media">Plenekranaj aŭdvidaĵoj</string>
<string name="faq_2_title">Mi ŝlosis la aplikaĵon per pasvorto, sed mi forgesis ĝin. Kion mi povas fari?</string>
<string name="faq_1_text">Unue, vi devas trovi la aktualan defaŭltan galerion en la sekcio de aplikaĵoj de viaj aparataj agordoj. Serĉu butonon kiu ion diras kiel \"Malfermi defaŭlte\", alklaku ĝin, kaj elektu \"Forviŝi defaŭltojn\". La sekvan fojon, ke vi provas malfermi bildon aŭ filmeton, vi devus vidi elektilon de aplikaĵoj kie vi povas elekti Fossify Galerio kaj igi ĝin la defaŭlta aplikaĵo.</string>
<string name="faq_4_title">Kiel mi povas plirapidigi filmetojn?</string>
<string name="faq_3_title">Kiel mi povas igi, ke albumo ĉiam aperu je la supro?</string>
<string name="faq_3_text">Vi povas longe premi la deziratan albumon kaj elekti la pinglan bildsimbolon en la meno de akcioj por alpingli ĝin al la supro. Ankaŭ eblas alpingli plurajn dosierujoj, kaj la alpinglitaj elementoj estos ordigitaj laŭ la defaŭlta ordigoreĝimo.</string>
<string name="faq_2_text">Estas du eblaj solvoj. Aŭ vi povas reinstali la aplikaĵon, aŭ vi povas trovi la aplikaĵon en viaj aparataj agordoj aj elekti \"forviŝi datumojn\". Tio rekomencigos ĉiujn viajn agordojn sen forigi iun ajn dosieron.</string>
<string name="faq_4_text">Vi povas aŭ duoble frapeti la flankon de la ekrano aŭ frapeti la tekston de aktuala aŭ maksimuma daŭroj proksime de la serĉobreto. Se vi ŝaltas la malfermadon de filmetoj en alia ekrano en la aplikaĵaj agordoj, vi ankaŭ povas uzi horizontalajn moviĝojn.</string>
<string name="faq_10_title">Ĉu mi povas tondi bildojn helpe de tiu ĉi aplikaĵo?</string>
<string name="faq_11_text">Kompreneble, nur uzi la opcion \"Grupigi laŭ\" en la bildeta vido. Eblas grupigi dosierojn laŭ pluraj kriterioj kiel prenodato. Se vi uzas la funkcion \"Montri enhavon de ĉiuj dosierujoj\", vi ankaŭ povas grupigi ilin laŭ dosierujoj.</string>
<string name="faq_5_title">Kio estas la diferenco inter kaŝi kaj ekskluzivi dosierujon?</string>
<string name="faq_13_text">La nuna solvo por montri bildojn kutime funkcias bone, sed se vi volas eĉ pli bonan kvaliton de bildoj, vi povas ŝalti \"Montri bildojn kun laŭeble plej alta kvalito\" en la aplikaĵaj agordoj en la sekcio \"Profunde zomeblaj bildoj\".</string>
<string name="faq_7_title">Dosierujo kun bildoj ne aperas aŭ ne montras ĉiujn bildojn. Kion mi povas fari?</string>
<string name="faq_8_title">Kion mi faras se mi nur volas, ke kelkaj specifaj dosierujoj aperu?</string>
<string name="faq_6_text">Eblas, ke kelkaj nekutimaj albumoj aperas. Vi povas facile ekskluzivi ilin per longe premi ilin kaj elekti Ekskluzivi. Tiam vi povas elekti la patran dosierujon, kaj tio ankaŭ verŝajne evitos, ke aliaj rilataj albumoj aperu.</string>
<string name="faq_6_title">Kial aperas dosierujoj kun albumartoj aŭ glumarkoj?</string>
<string name="faq_5_text">Ekskluzivi evitas montri la dosierujon nur en Fossify Galerio, kaj kaŝi funkcias tutsisteme por ankaŭ kaŝi la dosierujon el aliaj galerioj. Ĝi tion faras per krei malplenan dosieron \".nomedia\" en la dosierujo, kiun oni ankaŭ povas forigi per iu ajn dosieradministrilo. Rimarku, ke kelkaj aparatoj ne permesas kaŝi dosierujojn kiel Kamerao, Ekrankopioj kaj Elŝutoj.</string>
<string name="faq_10_text">Jes, vi povas tondi bildojn en la redaktilo per treni la angulojn de la bildo. Vi povas atingi la redaktilon per aŭ longe premi bildeton kaj elekti Redakti aŭ elekti Redakti el la plenekrana vido.</string>
<string name="faq_7_text">Estas pluraj eblaj kaŭzoj, sed facilas solvi ĝin. Nur iru al Agordoj -&gt; Administri inkluzivitajn dosierujojn, frapetu la + kaj iru al la dezirata dosierujo.</string>
<string name="faq_11_title">Ĉu eblas iel grupigi bildetojn de aŭdvidaĵaj dosierujoj?</string>
<string name="faq_12_title">Ordigi laŭ prenodato ne ŝajnas ĝuste funkcii. Kiel mi povas tion korekti?</string>
<string name="faq_8_text">Aldoni dosierujon al la inkluzivitaj dosierujoj nenion ajn aŭtomate ekskluzivas. Tio kion vi povas fari estas iri al Agordoj -&gt; Administri ekskluzivitajn dosierujojn, ekskluzivi la radikan dosierujon \"/\" kaj aldoni la deziratajn dosierujojn je Agordoj -&gt; Administri inkluzivitajn dosierujojn. Tiel, nur la elektitaj dosierujoj videblos, ĉar ekskluzivi kaj inkluzivi estas rikuraj, kaj dosierujoj kiuj estas samtempe ekskluzivitaj kaj inkluzivitaj aperas en la aplikaĵo.</string>
<string name="faq_13_title">Mi vidas striojn de koloroj en la bildoj. Kiel mi povas plibonigi la kvaliton?</string>
<string name="faq_12_text">Verŝajne estas ĉar la dosieroj estis kopiitaj el alia loko. Vi povas tion korekti per elekti la bildetojn de la dosieroj kaj elekti \"Korekti prenodaton\".</string>
<string name="faq_14_title">Mi kaŝis dosier(uj)on. Kiel mi povas malkaŝi ĝin?</string>
<string name="faq_14_text">Vi povas aŭ elekti \"Dume montri kaŝitajn elementojn\" je la ĉefekrano aŭ baskuligi \"Montri kaŝitajn elementojn\" en la aplikaĵaj agordoj por vidi la kaŝitan elementon. Se vi volas malkaŝi ĝin, nur longe premu ĝin kaj elektu \"Malkaŝi\". Dosierujoj estas kaŝitaj per aldoni kaŝitan dosieron \".nomedia\" al ili, do vi ankaŭ povus forigi tiun dosieron helpe de iu ajn dosieradministrilo. Tamen rimarku, ke la kaŝado estas rikura, do se vi kaŝas dosierujon, ĉiuj subdosierujoj ankaŭ estos kaŝitaj. Do, por malkaŝi subdosierujojn, endas malkaŝi la patran dosierujon.</string>
<string name="faq_15_text">La aplikaĵa kaŝmemoro povas okupi ĝis 250 MB por ebligi pli rapidan ŝargadon de bildoj. Se la aplikaĵo okupas eĉ pli da spaco, verŝajne estas pro elementoj en la rubujo. Tiuj dosieroj estas inkluzivitaj en la grandeco de la aplikaĵo. Vi povas forviŝi la rubujon per malfermi ĝin kaj forigi ĉiujn dosierojn aŭ el la aplikaĵaj agordoj. Ĉiu dosiero en la rubujo estas aŭtomate forigita post 30 tagoj.</string>
<string name="faq_15_title">Kial la aplikaĵo okupas tiom da spaco?</string>
<string name="faq_17_text">Tio ankaŭ ĉesis funkcii pro la sistemaj ŝanĝoj de Android 11. La aplikaĵo ne plu kapablas atingi verajn dosierujojn, sed dependas de la nomata MediaStore por ricevi datumojn.</string>
<string name="faq_16_text_extra">Aŭ vi povas koncedi al tiu ĉi galerio atingon al ĉiuj dosieroj per viaj aparataj agordoj, kiu permesos al ni montri kaŝitajn elementojn kaj pli ĝenerale igos pli fidebla dosierajn operaciojn.</string>
<string name="faq_16_title">Kio okazis al la kaŝado de dosier(uj)oj kaj kial mi ne plu povas vidi kaŝitajn elementojn?</string>
<string name="faq_16_text">Ekde Android 11, pro sistemaj limigoj, ne plu eblas (mal)kaŝi dosier(uj)ojn aŭ vidi kaŝitajn elementojn en galeriaj aplikaĵoj. Por tio endos iu dosieradministrilo.</string>
<string name="faq_17_title">Kial mi ne plu povas inkluzivi mankantajn dosierujojn?</string>
<string name="faq_18_title">Kial mi vidas reklamojn dum la legado de filmetoj?</string>
<string name="faq_18_text">Niaj aplikaĵoj enhavas neniun ajn reklamon. Se vi vidas reklamojn dum la legado de filmetoj, tio devas signifi, ke vi uzas la legilon de iu alia aplikaĵo. Provu trovi vian defaŭltan legilon de filmetoj en la aparataj agordoj kaj elekti \"Forviŝi defaŭltojn\". La sekva fojo, ke vi malfermos iun filmeton, vi vidos elektilon de aplikaĵoj kie vi povas elekti la aplikaĵon kiun vi volas uzi.</string>
</resources>

View file

@ -3,7 +3,7 @@
<string name="app_launcher_name">Galería</string>
<string name="edit">Editar</string>
<string name="open_camera">Abrir la cámara</string>
<string name="hidden">(Oculto)</string>
<string name="hidden">(oculto)</string>
<string name="excluded">(no incluido)</string>
<string name="pin_folder">Fijar carpeta</string>
<string name="unpin_folder">No fijar carpeta</string>
@ -22,7 +22,7 @@
<string name="force_portrait">Forzar retrato</string>
<string name="force_landscape">Forzar paisaje</string>
<string name="use_default_orientation">Usar la orientación por defecto</string>
<string name="fix_date_taken">Fijar la fecha toma</string>
<string name="fix_date_taken">Arreglar fecha de la toma</string>
<string name="fixing">Fijando…</string>
<string name="dates_fixed_successfully">Fecha fijada correctamente</string>
<string name="no_date_takens_found">No se han encontrado valores de fechas tomadas</string>
@ -196,9 +196,9 @@
<string name="paths_imported_successfully">Rutas importadas correctamente</string>
<string name="media_management_prompt">Para asegurarse de que todas las operaciones en ficheros funcionan de forma segura, por favor haga esta aplicación una aplicación de manejo de medios en los ajustes de su dispositivo.</string>
<string name="password_protect_excluded">Proteger con contraseña la visibilidad de las carpetas excluidas</string>
<string name="media_management_manual">Algo ha ido mal, por favor vaya a los Ajustes de su dispositivo - Aplicaciones - Acceso a aplicaciones especiales - Aplicaciones de gestión de medios y permita que esta aplicación gestione los medios.</string>
<string name="media_management_note">Si la redirección no funciona, ve a los Ajustes de tu dispositivo - Aplicaciones - Acceso a aplicaciones especiales - Aplicaciones de gestión de medios y permite que esta aplicación gestione los medios.</string>
<string name="media_management_alternative">Si no quieres hacerlo, también puedes ir a los Ajustes de tu dispositivo - Aplicaciones - Acceso a aplicaciones especiales - Aplicaciones de gestión de medios y permitir que esta aplicación gestione los medios.</string>
<string name="media_management_manual">Algo ha ido mal, por favor vaya a los Ajustes de su dispositivo - Aplicaciones - Acceso especial de aplicaciones - Aplicaciones de gestión de multimedia y permita que esta aplicación gestione los medios.</string>
<string name="media_management_note">Si la redirección no funciona, ve a los Ajustes de tu dispositivo - Aplicaciones - Acceso especial de aplicaciones - Aplicaciones de gestión de multimedia y permite que esta aplicación gestione los medios.</string>
<string name="media_management_alternative">Si no quieres hacerlo, también puedes ir a los Ajustes de tu dispositivo - Aplicaciones - Acceso especial de aplicaciones - Aplicaciones de gestión de multimedia y permitir que esta aplicación gestione los medios.</string>
<string name="alternative_media_access">Alternativamente, puede permitir el acceso a los archivos multimedia solamente. Sin embargo, en ese caso no podrá trabajar con los archivos ocultos.</string>
<string name="media_only">Sólo archivos multimedia</string>
<string name="all_files">Todos los archivos</string>
@ -229,7 +229,7 @@
<string name="faq_11_title">¿Puedo de alguna manera agrupar miniaturas de archivos multimedia\?</string>
<string name="faq_11_text">Claro, solo use el elemento de menú \"Agrupar por \" mientras esté en la vista de miniaturas. Puede agrupar archivos según varios criterios, incluida la Fecha de toma. Si usa la función \"Mostrar todo el contenido de las carpetas\" también puede agruparlas por carpetas.</string>
<string name="faq_12_title">La ordenación por fecha tomada no parece funcionar correctamente, ¿cómo puedo solucionarlo\?</string>
<string name="faq_12_text">Lo más probable es que sea causado por los archivos que se copian de algún lugar. Puede solucionarlo seleccionando las miniaturas de archivo y seleccionando \"Fijar fecha de toma\".</string>
<string name="faq_12_text">Lo más probable es que sea causado por los archivos que se copian de algún lugar. Puedes arreglarlo seleccionando las miniaturas de archivo y seleccionando \"Arreglar fecha de la toma\".</string>
<string name="faq_13_title">Veo algunas bandas de color en las imágenes. ¿Cómo puedo mejorar la calidad\?</string>
<string name="faq_13_text">La solución actual para mostrar imágenes funciona bien en la gran mayoría de los casos, pero si desea una calidad de imagen aún mejor, puede habilitar \"Mostrar imágenes con la mayor calidad posible\" en la configuración de la aplicación, en la sección \"Imágenes ampliables con zoom\".</string>
<string name="faq_14_title">He ocultado un archivo/carpeta. ¿Cómo puedo desocultarlo\?</string>
@ -255,4 +255,7 @@
<string name="full_storage_permission_required">La galería de Fossify necesita acceso total para mostrar todas tus fotos y videos. Ve a Configuración &gt; Permisos &gt; Fotos y videos &gt; Permitir todo.</string>
<string name="playback_speed">Velocidad de reproducción</string>
<string name="failed_to_load_media">Error al cargar el medio.</string>
</resources>
<string name="media_exceeds_device_capabilities">Los medios superan las capacidades del dispositivo.</string>
<string name="file_is_malformed_or_corrupted">El archivo está malformado o dañado.</string>
<string name="unsupported_format">Formato no soportado.</string>
</resources>

View file

@ -227,7 +227,7 @@
<string name="faq_10_title">Kas ma saan selle rakendusega pilte kärpida\?</string>
<string name="faq_10_text">Jah, sa saad pilte redaktoris kärpida, lohistades pildi nurki. Redaktorisse pääseb, kui vajutate pikalt pildi pisipildile ja valite käsu Edit või valite täisekraani vaates käsu Edit.</string>
<string name="faq_11_title">Kas ma saan kuidagi rühmitada meediafailide pisipilte\?</string>
<string name="faq_11_text">Muidugi, kasutage pisipiltide vaates lihtsalt menüüelementi \"Group by\". Saate grupeerida faile mitme kriteeriumi, sealhulgas pildistamise kuupäeva järgi. Kui kasutate funktsiooni \"Show all folders content\" saate neid kaustade järgi rühmitada.</string>
<string name="faq_11_text">Muidugi, kasuta pisipiltide vaates lihtsalt menüüvalikut „Rühmituse alus“. Saad grupeerida faile mitme kriteeriumi, sealhulgas pildistamise kuupäeva järgi. Kui kasutad funktsiooni „Näita kõikide kaustade sisu“ saad neid kaustade järgi rühmitada.</string>
<string name="faq_12_title">Sorteerimine võetud kuupäeva järgi ei tundu korralikult toimivat, kuidas seda parandada\?</string>
<string name="faq_12_text">Tõenäoliselt on selle põhjuseks kuskilt kopeeritud failid. Saate selle parandada, valides faili pisipildid ja valides \"Fix Date Taken väärtus\".</string>
<string name="faq_13_title">Ma näen piltidel mõningaid värviribasid. Kuidas ma saan kvaliteeti parandada\?</string>
@ -254,4 +254,7 @@
<string name="full_storage_permission_required">Fossify Galerii vajab kõikide sinu fotode ja videote näitamiseks täisõigusi. Ava Seadistused &gt; Õigused &gt; Fotod ja videod &gt; Luba kõik.</string>
<string name="playback_speed">Taasesituse kiirus</string>
<string name="failed_to_load_media">Meedia laadimine ei õnnestunud.</string>
<string name="media_exceeds_device_capabilities">Meedia ületab selle seadme suutlikkuse.</string>
<string name="unsupported_format">Vorming pole toetatud.</string>
<string name="file_is_malformed_or_corrupted">Fail on kas vigasena loodud või hiljem katki läinud.</string>
</resources>

View file

@ -254,4 +254,7 @@
<string name="full_storage_permission_required">Fossify Galeriak baimen guztiak behar ditu zure argazki eta bideo guztiak erakusteko. Joan Ezarpenak &gt; Baimenak &gt; Argazki eta bideaok &gt; Baimendu guztia aukerara.</string>
<string name="failed_to_load_media">Errorea gertatu da fitxategia kargatzean.</string>
<string name="playback_speed">Jotzeko abiadura</string>
<string name="file_is_malformed_or_corrupted">Fitxategia ez da zuzena edo kaltetuta dago.</string>
<string name="media_exceeds_device_capabilities">Mediek gailuaren ezaugarriak gainditzen dituzte.</string>
<string name="unsupported_format">Fitxategi ezin da erakutsi.</string>
</resources>

View file

@ -244,4 +244,7 @@
<string name="faq_18_title">Miksi näen mainoksia videon toiston aikana\?</string>
<string name="faq_18_text">Sovelluksissamme ei ole lainkaan mainoksia. Jos näet niitä videon toiston aikana, sinun täytyy käyttää jotain muuta sovellusta videosoittimena. Yritä etsiä oletusarvoinen videosoittimesi laitteen asetuksista ja tee sitten ”Tyhjenä oletusasetukset” sille. Seuraavan kerran, kun kutsut jonkin videon aikomuksen, näet sovelluksen valintakehotuksen, jossa voit valita, mitä sovellusta haluat käyttää.</string>
<string name="wallpaper">Taustakuva</string>
<string name="playback_speed">Toistonopeus</string>
<string name="failed_to_load_media">Median lataus epäonnistui.</string>
<string name="file_is_malformed_or_corrupted">Tiedosto on epäkelpo tai korruptoitunut.</string>
</resources>

View file

@ -197,9 +197,9 @@
<string name="paths_imported_successfully">Favoris importés</string>
<string name="media_management_prompt">Pour vous assurer que toutes les opérations de fichiers fonctionnent de manière fiable, veuillez faire de cette application l\'application de gestion des médias dans les paramètres de votre appareil.</string>
<string name="password_protect_excluded">Protection par mot de passe de la visibilité des dossiers exclus</string>
<string name="media_management_manual">Quelque chose s\'est mal passé, veuillez aller dans les paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autorisez cette application à gérer les médias.</string>
<string name="media_management_note">Si la redirection ne fonctionne pas, allez dans les paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autorisez cette application à gérer les médias.</string>
<string name="media_management_alternative">Si vous ne voulez pas le faire, vous pouvez aussi aller dans les Paramètres de votre appareil - Applis - Accès aux applications spéciales - Applis de gestion des médias et autoriser cette application à gérer les médias.</string>
<string name="media_management_manual">Quelque chose s\'est mal passé, veuillez aller dans les paramètres de votre appareil - Applis - Accès spécial des applis - Applis de gestion des fichiers multimédias et autorisez cette application à gérer les médias.</string>
<string name="media_management_note">Si la redirection ne fonctionne pas, allez dans les paramètres de votre appareil - Applis - Accès spécial des applis - Applis de gestion des fichiers multimédias et autorisez cette application à gérer les médias.</string>
<string name="media_management_alternative">Si vous ne voulez pas le faire, vous pouvez aussi aller dans les Paramètres de votre appareil - Applis - Accès spécial des applis - Applis de gestion des fichiers multimédias et autoriser cette application à gérer les médias.</string>
<string name="alternative_media_access">Vous pouvez également n\'autoriser que l\'accès aux fichiers multimédias. Dans ce cas, vous ne pourrez cependant pas travailler avec les fichiers cachés.</string>
<string name="media_only">Médias uniquement</string>
<string name="all_files">Tous les fichiers</string>
@ -213,7 +213,7 @@
<string name="toggle_favorite">Activer/désactiver le favori</string>
<string name="toggle_file_visibility">Visibilité du fichier</string>
<string name="faq_1_title">Comment puis-je faire de Fossify Gallery la galerie par défaut?</string>
<string name="faq_1_text">D\'abord, vous devez trouver la galerie actuellement par défaut dans la section Applis de vos paramètres de périphérique, cherchez un bouton qui dit quelque chose comme « Ouvrir par défaut », cliquez dessus, puis sélectionnez « Par défaut de clavier ». La prochaine fois que vous tenterez d\'ouvrir une image ou une vidéo, vous devriez voir un récupérateur d\'application, où vous pouvez sélectionner Fossify Gallery et en faire l\'application par défaut.</string>
<string name="faq_1_text">D\'abord, vous devez trouver la galerie actuellement par défaut dans la section Applications de vos paramètres de périphérique, cherchez un bouton qui dit quelque chose comme \"Ouvrir par défaut\", cliquez dessus, puis sélectionnez \"Effacer les valeurs par défaut\". La prochaine fois que vous tenterez d\'ouvrir une image ou une vidéo, vous devriez voir apparaître un sélecteur d\'application, où vous pouvez sélectionner Fossify Gallery et en faire l\'application par défaut.</string>
<string name="faq_2_title">J\'ai verrouillé l\'application avec un mot de passe et je ne m\'en rappelle plus. Que faire \?</string>
<string name="faq_2_text">Il y a deux façons de procéder. Soit vous réinstallez l\'application, soit vous recherchez l\'application dans les paramètres de l\'appareil et appuyez sur "Supprimer les données". Ceci réinitialisera seulement les paramètres de l\'application et ne supprimera pas vos fichiers.</string>
<string name="faq_3_title">Comment faire pour qu\'un dossier soit toujours affiché tout en haut \?</string>
@ -221,7 +221,7 @@
<string name="faq_4_title">Comment avancer rapidement dans les vidéos \?</string>
<string name="faq_4_text">Appuyez deux fois sur le côté de l\'écran, ou appuyez sur la valeur de durée actuelle ou maximale près de la barre de recherche. Si vous activez l\'ouverture des vidéos sur un écran séparé dans les paramètres de l\'application, vous pouvez également utiliser des gestes horizontaux.</string>
<string name="faq_5_title">Quelle est la différence entre le masquage et l\'exclusion d\'un dossier?</string>
<string name="faq_5_text">Exclure empêche l\'affichage du dossier seulement dans la galerie Fossify, tandis que Masquer fonctionne selon le système et il cache le dossier d\'autres galeries aussi. Il fonctionne en créant un fichier vide « .nomedia » dans le dossier donné, que vous pouvez ensuite supprimer avec n\'importe quel gestionnaire de fichier aussi. Notez que certains appareils ne permettent pas de cacher des dossiers comme Appareil photo, Captures d\'écran et Téléchargements.</string>
<string name="faq_5_text">Exclure empêche l\'affichage du dossier seulement dans la galerie Fossify, tandis que Masquer fonctionne selon le système et cache le dossier d\'autres galeries également. Il fonctionne en créant un fichier vide \".nomedia\" dans le dossier donné, que vous pouvez ensuite supprimer avec n\'importe quel gestionnaire de fichier aussi. Notez que certains appareils ne permettent pas de cacher des dossiers comme Appareil photo, Captures d\'écran et Téléchargements.</string>
<string name="faq_6_title">Pourquoi des dossiers avec des pochettes d\'albums musicaux ou des miniatures d\'images sont affichés?</string>
<string name="faq_6_text">Il est possible que des dossiers qui ne devraient pas être affichés le soient. Vous pouvez les exclure facilement en les sélectionnant par un appui prolongé, puis en choisissant l\'option "Exclure le dossier", après quoi vous pouvez aussi sélectionner le dossier parent, ce qui devrait éviter l\'apparition de dossiers similaires.</string>
<string name="faq_7_title">Un dossier avec des images n\'apparaît pas. Que faire \?</string>
@ -252,4 +252,10 @@
<string name="portraits">Portraits</string>
<string name="by_extension">Extension</string>
<string name="animation">Animation</string>
</resources>
<string name="full_storage_permission_required">La Galerie Fossify a besoin d\'un accès complet pour afficher toutes vos photos et vidéos. Allez dans Paramètres &gt; Autorisations &gt; Photos et vidéos &gt; Autoriser tout.</string>
<string name="file_is_malformed_or_corrupted">Le fichier est altéré ou corrompu.</string>
<string name="media_exceeds_device_capabilities">Le support dépasse les capacités de l\'appareil.</string>
<string name="unsupported_format">Format non pris en charge.</string>
<string name="playback_speed">Vitesse de lecture</string>
<string name="failed_to_load_media">Échec de chargement du média.</string>
</resources>

View file

@ -0,0 +1,259 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="other_folder">Fillteán eile</string>
<string name="show_on_map">Taispeáin ar an léarscáil</string>
<string name="unknown_location">Suíomh anaithnid</string>
<string name="unset_as_default_folder">Díshocraigh mar fhillteán réamhshocraithe</string>
<string name="reorder_by_dragging">Athordaigh fillteáin trí tharraingt</string>
<string name="reorder_by_dragging_pro">Athordaigh fillteáin trí tharraingt (Pro)</string>
<string name="full_storage_permission_required">Teastaíonn rochtain iomlán ó Ghailearaí Fossify chun do ghrianghraif agus físeáin go léir a thaispeáint. Téigh go Socruithe &gt; Ceadanna &gt; Grianghraif agus físeáin &gt; Ceadaigh gach rud.</string>
<string name="change_filters_underlined"><u>Athraigh na scagairí</u></string>
<string name="exclude_folder_parent">Tuismitheoir a eisiamh ina ionad?</string>
<string name="excluded_activity_placeholder">Gan fillteáin a áireamh, beidh siad mar aon lena bhfofhillteáin i bhfolach díreach i nGailearaí Fossify, beidh siad fós le feiceáil in iarratais eile.\n\nMás mian leat iad a cheilt ó fheidhmchláir eile freisin, bain úsáid as an bhfeidhm Folaigh.</string>
<string name="hidden_folders">Fillteáin fholaithe</string>
<string name="height">Airde</string>
<string name="keep_aspect_ratio">Coinnigh cóimheas treoíochta</string>
<plurals name="failed_to_resize_images">
<item quantity="one">Theip ar athrú méide %d íomhá</item>
<item quantity="two">Theip ar athrú méide %d íomhánna</item>
<item quantity="few">Theip ar athrú méide %d íomhánna</item>
<item quantity="many">Theip ar athrú méide %d íomhánna</item>
<item quantity="other">Theip ar athrú méide %d íomhánna</item>
</plurals>
<string name="basic_editor">Eagarthóir Bunúsach</string>
<string name="advanced_editor">Ard-Eagarthóir</string>
<string name="rotate">Rothlaigh</string>
<string name="invalid_image_path">Conair neamhbhailí íomhá</string>
<string name="invalid_video_path">Conair neamhbhailí físe</string>
<string name="video_editing_cancelled">Eagarthóireacht físe curtha ar ceal</string>
<string name="file_edited_successfully">D\' éirigh le heagarthóireachta an chomhaid</string>
<string name="image_edited_successfully">D\' éirigh le híomhá a chur in eagar</string>
<string name="rotate_left">Rothlaigh ar chlé</string>
<string name="rotate_right">Rothlaigh ar dheis</string>
<string name="animation">Beochan</string>
<string name="no_animation">Ceann ar bith</string>
<string name="group_direct_subfolders">Fofhillteáin dhíreacha grúpa</string>
<string name="group_by">Grúpa de réir</string>
<string name="screen_rotation_device_rotation">Rothlú an ghléis</string>
<string name="screen_rotation_aspect_ratio">Cóimheas treoíochta</string>
<string name="show_notch">Taispeáin nóta má tá sé ar fáil</string>
<string name="square">Cearnóg</string>
<string name="media_management_prompt">Chun a chinntiú go n-oibríonn gach oibríocht comhad go hiontaofa, déan feidhmchlár bainistíochta Meán den aip seo i socruithe do ghléis.</string>
<string name="failed_to_load_media">Theip ar luchtú na meán.</string>
<string name="faq_2_text">Is féidir leat é a réiteach ar bhealaí 2. Is féidir leat an feidhmchlár a athshuiteáil, nó an aip a aimsiú i socruithe do ghléis agus \"Glan sonraí\" a roghnú. Athshocróidh sé do shocruithe go léir, ní bhainfidh sé aon chomhaid meán.</string>
<string name="faq_8_title">Cad a tharlaíonn más mian liom ach cúpla fillteán ar leith le feiceáil?</string>
<string name="faq_10_title">An féidir liom íomhánna a bharrú leis an aip seo?</string>
<string name="faq_7_text">Is féidir go mbeadh cúiseanna éagsúla leis sin, ach tá sé éasca é a réiteach. Just dul i Socruithe -&gt; Bainistigh Fillteáin Áirithe, roghnaigh Plus agus nascleanúint chuig an bhfillteán riachtanach.</string>
<string name="faq_10_text">Sea, is féidir leat íomhánna barr san eagarthóir, trí na coirnéil íomhá a tharraingt. Is féidir leat dul chuig an eagarthóir trí mhionsamhail íomhá a bhrú le fada agus Edit a roghnú, nó Edit a roghnú ón amharc lánscáileáin.</string>
<string name="faq_13_text">Oibríonn an réiteach reatha chun íomhánna a thaispeáint go breá i bhformhór mór na gcásanna, ach más mian leat cáilíocht íomhá níos fearr fós, is féidir leat an \"Taispeáin íomhánna sa chaighdeán is airde is féidir\" a chumasú ag socruithe an fheidhmchláir, sa rannán \"Íomhánna domhain zúmáilte\".</string>
<string name="faq_14_title">Tá comhad/fillteán curtha i bhfolach agam. Conas is féidir liom é a unhide?</string>
<string name="faq_15_title">Cén fáth a dtógann an aip an oiread sin spáis?</string>
<string name="faq_18_text">Níl aon fhógraí ar bith ag ár n-aipeanna. Má fheiceann tú iad le linn athsheinm físe, ní mór duit a bheith ag baint úsáide as roinnt seinnteoir físe apps eile. Bain triail as do sheinnteoir físe réamhshocraithe a aimsiú i socruithe an ghléis, ansin déan \"Réamhshocruithe soiléire\" air. An chéad uair eile a agraíonn tú roinnt rún físe feicfidh tú leid roghnóir feidhmchláir, áit ar féidir leat an aip is mian leat a úsáid a roghnú.</string>
<string name="open_camera">Oscail ceamara</string>
<string name="hidden">(folaithe)</string>
<string name="app_launcher_name">Gailearaí</string>
<string name="edit">Cuir in eagar</string>
<string name="excluded">(eisiata)</string>
<string name="pin_folder">Fillteán bioráin</string>
<string name="unpin_folder">Díphionnáil fillteán</string>
<string name="pin_to_the_top">Bioráin go dtí an barr</string>
<string name="show_all">Taispeáin inneachar gach fillteáin</string>
<string name="all_folders">Gach fillteán</string>
<string name="folder_view">Athraigh go hamharc an fhillteáin</string>
<string name="volume">Imleabhar</string>
<string name="brightness">Gile</string>
<string name="lock_orientation">Cuir treoshuíomh faoi ghlas</string>
<string name="unlock_orientation">Díghlasáil treoshuíomh</string>
<string name="change_orientation">Athraigh treoshuíomh</string>
<string name="force_portrait">Fórsáil portráid</string>
<string name="force_landscape">Fórsa tírdhreach</string>
<string name="use_default_orientation">Úsáid treoshuíomh réamhshocraithe</string>
<string name="fixing">Ag socrú…</string>
<string name="dates_fixed_successfully">Dátaí socraithe go rathúil</string>
<string name="no_date_takens_found">Gan Dáta Aimsíodh luachanna glactha</string>
<string name="fix_date_taken">Deisigh Dáta Luach glactha</string>
<string name="share_resized">Comhroinn leagan athraithe</string>
<string name="switch_to_file_search">Athraigh go cuardach comhad i ngach fillteán infheicthe</string>
<string name="set_as_default_folder">Socraigh mar fhillteán réamhshocraithe</string>
<string name="restore_to_path">Ag aischur go \'%s\'</string>
<string name="filter_media">Scag meáin</string>
<string name="images">Íomhánna</string>
<string name="videos">Físeáin</string>
<string name="gifs">GIFanna</string>
<string name="raw_images">Íomhánna RAW</string>
<string name="svgs">SVGanna</string>
<string name="portraits">Portráidí</string>
<string name="no_media_with_filters">Níor aimsíodh aon chomhaid meán leis na scagairí roghnaithe.</string>
<string name="exclude_folder_description">Ní fhágfaidh sé seo an roghnú mar aon lena fofhillteáin ó Ghailearaí Fossify amháin. Is féidir leat fillteáin eisiata a bhainistiú i Socruithe.</string>
<string name="manage_hidden_folders">Bainistigh fillteáin fholaithe</string>
<string name="hidden_folders_placeholder">Dealraíonn sé cosúil nach bhfuil aon fillteáin i bhfolach le comhad \".nomedia\".</string>
<string name="hide_folder_description">Folaíonn an fheidhm seo an fillteán trí chomhad \'.nomedia\' a chur isteach ann, cuirfidh sé gach fofhillteán i bhfolach freisin. Is féidir leat iad a fheiceáil tríd an rogha \'Taispeáin míreanna folaithe\' a chlibeáil in Socruithe. Lean ar aghaidh?</string>
<string name="hidden_all_files">Caithfidh tú rochtain a thabhairt don aip All Files chun comhaid fholaithe a fheiceáil, rud eile nach féidir leis oibriú.</string>
<string name="cant_unhide_folder">Má tá ponc ag fillteán nó ceann dá mháthairfhillteáin roimh a ainm, tá sé i bhfolach agus ní féidir é a unhidden mar seo. Caithfidh tú an ponc a bhaint trí é a athainmniú.</string>
<string name="include_folders">Fillteáin san áireamh</string>
<string name="manage_included_folders">Bainistigh fillteáin san áireamh</string>
<string name="add_folder">Cuir fillteán leis</string>
<string name="included_activity_placeholder">Má tá roinnt fillteáin agat ina bhfuil meáin, ach nár aithin an aip iad, is féidir leat iad a chur leis de láimh anseo.\n\nMá chuirtear roinnt míreanna anseo, ní chuirfear aon fhillteán eile as an áireamh.</string>
<string name="no_media_add_included">Níor aimsíodh aon chomhaid meán. Is féidir leat é a réiteach trí na fillteáin ina bhfuil comhaid meán a chur leis de láimh.</string>
<string name="resize_and_save">Athraigh méid an roghnaithe agus sábháil</string>
<string name="width">Leithead</string>
<string name="invalid_values">Iontráil taifeach bailí le do thoil</string>
<string name="resize_multiple_images">Athraigh méid na n-íomhánna iomadúla</string>
<string name="resize_factor">Athraigh méid an fhachtóra</string>
<string name="resize_factor_info">Athraigh méid na n-íomhánna go dtí an céatadán áirithe, ní mór luach a bheith laistigh de 10 agus 90.</string>
<string name="resize_factor_error">Iontráil uimhir idir 10 agus 90</string>
<string name="images_resized_successfully">D\' éirigh le híomhánna a athrú</string>
<string name="editor">Eagarthóir</string>
<string name="image_editing_failed">Theip ar eagarthóireacht íomhánna</string>
<string name="video_editing_failed">Theip ar eagarthóireacht físe</string>
<string name="image_editing_cancelled">Cealaíodh eagarthóireacht íomhánna</string>
<string name="video_edited_successfully">D\' éirigh leis an bhfíseán a chur in eagar</string>
<string name="edit_image_with">Cuir íomhá in eagar le:</string>
<string name="edit_video_with">Cuir físeán in eagar le:</string>
<string name="no_image_editor_found">Níor aimsíodh eagarthóir íomhá ar bith</string>
<string name="no_video_editor_found">Níor aimsíodh eagarthóir físe ar bith</string>
<string name="unknown_file_location">Suíomh anaithnid an chomhaid</string>
<string name="error_saving_file">Níorbh fhéidir an comhad foinseach a fhorscríobh</string>
<string name="rotate_one_eighty">Rothlaigh faoi 180º</string>
<string name="transform">Trasfhoirmigh</string>
<string name="crop">Bearr</string>
<string name="draw">Tarraing</string>
<string name="flip">Smeach</string>
<string name="set_as_wallpaper">Socraigh mar Chúlbhrat</string>
<string name="set_as_wallpaper_failed">Theip ar shocrú mar chúlbhrat</string>
<string name="set_as_wallpaper_with">Socraigh mar pháipéar balla le:</string>
<string name="setting_wallpaper">Cúlbhrat á shocrú…</string>
<string name="flip_horizontally">Smeach go cothrománach</string>
<string name="flip_vertically">Smeach go hingearach</string>
<string name="free_aspect_ratio">Saor in aisce</string>
<string name="other_aspect_ratio">Eile</string>
<string name="wallpaper_set_successfully">D\' éirigh le socrú cúlbhrat</string>
<string name="portrait_aspect_ratio">Cóimheas treoíochta portráide</string>
<string name="wallpaper">Cúlbhrat</string>
<string name="landscape_aspect_ratio">Cóimheas treoíochta tírdhreacha</string>
<string name="home_screen">Scáileán baile</string>
<string name="lock_screen">Cuir an scáileán faoi ghlas</string>
<string name="home_and_lock_screen">Baile agus glasáil scáileán</string>
<string name="allow_changing_aspect_ratio">Ceadaigh an cóimheas treoíochta a athrú</string>
<string name="slideshow">Taispeántas Sleamhnán</string>
<string name="interval">Eatramh</string>
<string name="include_photos">Cuir grianghraif san áireamh</string>
<string name="include_videos">Cuir físeáin san áireamh</string>
<string name="include_gifs">Cuir GIFanna san áireamh</string>
<string name="random_order">Ord randamach</string>
<string name="move_backwards">Bog siar</string>
<string name="loop_slideshow">Taispeántas sleamhnán lúibe</string>
<string name="fade">Céimnigh</string>
<string name="slide">Sleamhnán</string>
<string name="slideshow_ended">Chríochnaigh an taispeántas sleamhnán</string>
<string name="no_media_for_slideshow">Níor aimsíodh aon mheán don taispeántas sleamhnán</string>
<string name="do_not_group_files">Ná grúpáil comhaid</string>
<string name="by_folder">Fillteán</string>
<string name="by_last_modified">Mionathraithe go deireanach</string>
<string name="by_last_modified_daily">Mionathraithe go deireanach (laethúil)</string>
<string name="by_last_modified_monthly">Mionathraithe go deireanach (míosúil)</string>
<string name="by_date_taken">Dáta a glacadh</string>
<string name="by_date_taken_daily">Dáta tógtha (laethúil)</string>
<string name="by_date_taken_monthly">Dáta tógtha (míosúil)</string>
<string name="by_file_type">Cineál comhaid</string>
<string name="by_extension">Síneadh</string>
<string name="show_file_count_section_header">Taispeáin líon na gcomhad ag ceanntásca rannáin</string>
<string name="grouping_and_sorting">Tabhair do d\'aire gur 2 réimse neamhspleácha iad grúpáil agus sórtáil</string>
<string name="folder_on_widget">Fillteán a thaispeántar ar an ngiuirléid:</string>
<string name="show_folder_name">Taispeáin ainm an fhillteáin</string>
<string name="autoplay_videos">Seinn físeáin go huathoibríoch</string>
<string name="remember_last_video_position">Cuimhnigh ar an suíomh athsheinm físe deireanach</string>
<string name="loop_videos">Físeáin lúb</string>
<string name="animate_gifs">Beochan GIFanna ag mionsamhlacha</string>
<string name="max_brightness">Max gile agus tú ag féachaint ar mheáin lánscáileáin</string>
<string name="crop_thumbnails">Mionsamhlacha barr i gcearnóga</string>
<string name="show_thumbnail_video_duration">Taispeáin fad an fhíseáin</string>
<string name="screen_rotation_by">Rothlaigh meáin lánscáileáin de réir</string>
<string name="screen_rotation_system_setting">Socrú córais</string>
<string name="black_background_at_fullscreen">Cúlra dubh ag na meáin lánscáileáin</string>
<string name="scroll_thumbnails_horizontally">Scrollaigh mionsamhlacha go cothrománach</string>
<string name="show_extended_details">Taispeáin sonraí breisithe thar mheáin lánscáileáin</string>
<string name="manage_extended_details">Bainistigh sonraí breisithe</string>
<string name="hide_system_ui_at_fullscreen">Folaigh Chomhéadain an chórais go huathoibríoch ag meáin lánscáileáin</string>
<string name="delete_empty_folders">Scrios fillteáin fholmha tar éis a n-inneachar a scriosadh</string>
<string name="allow_photo_gestures">Ceadaigh gile grianghraf a rialú le gothaí ingearacha</string>
<string name="allow_video_gestures">Ceadaigh toirt físe agus gile a rialú le gothaí ingearacha</string>
<string name="playback_speed">Luas athsheinm</string>
<string name="show_media_count">Taispeáin líon na meán fillteáin ar an bpríomhamharc</string>
<string name="one_finger_zoom">Ceadaigh zúmáil méar amháin ag meáin lánscáileáin</string>
<string name="allow_instant_change">Ceadaigh meáin a athrú láithreach trí chliceáil ar thaobhanna scáileáin</string>
<string name="allow_deep_zooming_images">Ceadaigh íomhánna zúmála doimhne</string>
<string name="hide_extended_details">Folaigh sonraí breisithe nuair atá an barra stádais i bhfolach</string>
<string name="show_at_bottom">Taispeáin roinnt cnaipí aicsin ag bun an scáileáin</string>
<string name="show_recycle_bin">Taispeáin an bosca athchúrsála ag scáileán na bhfillteán</string>
<string name="deep_zoomable_images">Íomhánna domhain zúmáilte</string>
<string name="show_highest_quality">Taispeáin íomhánna den chaighdeán is airde is féidir</string>
<string name="show_recycle_bin_last">Taispeáin an bosca athchúrsála mar an mhír dheireanach ar an bpríomhscáileán</string>
<string name="allow_down_gesture">Ceadaigh an t-amharc lánscáileáin a dhúnadh le gotha síos</string>
<string name="allow_one_to_one_zoom">Ceadaigh zúmáil isteach 1:1 le dhá sconna dúbailte</string>
<string name="open_videos_on_separate_screen">Oscail físeáin i gcónaí ar scáileán ar leith le gothaí cothrománacha nua</string>
<string name="allow_rotating_gestures">Ceadaigh íomhánna rothlacha le gothaí</string>
<string name="folder_thumbnail_style">Stíl mhionsamhlacha fillteáin</string>
<string name="file_thumbnail_style">Stíl mhionsamhlacha an chomhaid</string>
<string name="mark_favorite_items">Marcáil na míreanna is fearr leat</string>
<string name="thumbnail_spacing">Spásáil mionsamhlacha</string>
<string name="show_file_count_line">Taispeáin líon na gcomhad ar líne ar leith</string>
<string name="show_file_count_brackets">Taispeáin líon na gcomhad idir lúibíní</string>
<string name="show_file_count_none">Ná taispeáin líon na gcomhad</string>
<string name="limit_folder_title">Cuir teorainn le teidil fillteáin fhada go líne 1</string>
<string name="rounded_corners">Cúinní cruinn</string>
<string name="export_favorite_paths">Easpórtáil ceanáin</string>
<string name="file_loading_priority">Tosaíocht luchtaithe comhad</string>
<string name="speed">Luas</string>
<string name="compromise">Comhréiteach</string>
<string name="avoid_showing_invalid_files">Seachain comhaid neamhbhailí a thaispeáint</string>
<string name="show_image_file_types">Taispeáin cineálacha comhaid íomhá</string>
<string name="allow_zooming_videos">Ceadaigh físeáin zúmála le cnagadh dúbailte orthu</string>
<string name="import_favorite_paths">Iompórtáil ceanáin</string>
<string name="paths_imported_successfully">D\' éirigh le cosáin a iompórtáladh</string>
<string name="password_protect_excluded">Pasfhocal a chosaint infheictheacht fillteán eisiata</string>
<string name="media_management_manual">Chuaigh rud éigin mícheart, téigh isteach i Socruithe do ghléis - Feidhmchláir - Rochtain speisialta ar fheidhmchláir - Feidhmchláir bhainistíochta meán agus lig don aip seo na meáin a bhainistiú.</string>
<string name="media_management_note">Mura n-oibríonn an atreorú, téigh isteach i Socruithe do ghléis - Feidhmchláir - Rochtain speisialta ar fheidhmchláir - Feidhmchláir bhainistíochta meán agus lig don aip seo na meáin a bhainistiú.</string>
<string name="media_management_alternative">Mura mian leat é a dhéanamh, is féidir leat dul isteach i Socruithe do ghléis - Feidhmchláir - Rochtain speisialta ar fheidhmchláir - Feidhmchláir bhainistíochta meán agus ligean don aip seo na meáin a bhainistiú.</string>
<string name="alternative_media_access">De rogha air sin, is féidir leat rochtain a fháil ar chomhaid meán amháin. Sa chás sin ní bheidh tú in ann oibriú le comhaid i bhfolach áfach.</string>
<string name="media_only">Na Meáin amháin</string>
<string name="all_files">Gach comhad</string>
<string name="search_all_files">Cuardaigh gach comhad in ionad fillteáin ar an bpríomhscáileán</string>
<string name="show_all_folders">Taispeáin cnaipe roghchláir le haghaidh toggling Taispeáin Gach Fillteán Ábhar go tapa</string>
<string name="thumbnails">Mionsamhlacha</string>
<string name="fullscreen_media">Meáin lánscáileáin</string>
<string name="extended_details">Sonraí breisithe</string>
<string name="bottom_actions">Gníomhartha bun</string>
<string name="manage_bottom_actions">Bainistigh gníomhartha bun infheicthe</string>
<string name="toggle_file_visibility">Scoránaigh infheictheacht an chomhaid</string>
<string name="file_is_malformed_or_corrupted">Tá an comhad míchumtha nó truaillithe.</string>
<string name="unsupported_format">Formáid gan tacaíocht.</string>
<string name="faq_1_title">Conas is féidir liom gailearaí gléas réamhshocraithe a dhéanamh de Ghailearaí Fossify?</string>
<string name="media_exceeds_device_capabilities">Sáraíonn na meáin cumais an ghléis.</string>
<string name="faq_1_text">Ar dtús caithfidh tú an gailearaí réamhshocraithe atá ann faoi láthair a aimsiú sa rannán Apps de do shocruithe gléis, cuardaigh cnaipe a deir rud éigin cosúil le \"Oscail de réir réamhshocraithe\", cliceáil air, ansin roghnaigh \"Réamhshocruithe soiléire\". An chéad uair eile a dhéanfaidh tú iarracht íomhá nó físeán a oscailt ba chóir duit roghnóir feidhmchláir a fheiceáil, áit ar féidir leat Gailearaí Fossify a roghnú agus an feidhmchlár réamhshocraithe a dhéanamh de.</string>
<string name="faq_2_title">Chuir mé an aip faoi ghlas le pasfhocal, ach rinne mé dearmad air. Céard is féidir liom a dhéanamh?</string>
<string name="faq_3_title">Conas is féidir liom albam a dhéanamh i gcónaí ag an mbarr?</string>
<string name="faq_3_text">Is féidir leat an t-albam atá ag teastáil a bhrú le fada agus an deilbhín Pin a roghnú ag an roghchlár gníomhartha, a chuirfidh go dtí an barr é. Is féidir leat bioráin fillteáin il freisin, beidh míreanna pinned a shórtáil ag an modh sórtála réamhshocraithe.</string>
<string name="faq_4_title">Conas is féidir liom físeáin a chur ar aghaidh go tapa?</string>
<string name="faq_4_text">Is féidir leat é a dhéanamh trí thaobh an scáileáin a chnagadh faoi dhó, nó trí na téacsanna reatha nó uastréimhse a thapáil in aice leis an mbarra lorga. Má chumasaíonn tú físeáin a oscailt ar scáileán ar leith i socruithe na haipe, is féidir leat gothaí cothrománacha a úsáid freisin.</string>
<string name="faq_5_title">Cad é an difríocht idir fillteán a chur i bhfolach agus gan é a áireamh?</string>
<string name="faq_5_text">Ná cuir cosc ar an bhfillteán a thaispeáint ach amháin i nGailearaí Fossify, agus oibríonn Hide córas-ciallmhar agus folaíonn sé an fillteán ó ghailearaithe eile freisin. Oibríonn sé trí chomhad folamh \".nomedia\" a chruthú san fhillteán a thugtar, ar féidir leat a bhaint ansin le haon bhainisteoir comhad freisin. Tabhair faoi deara nach gceadaíonn roinnt feistí fillteáin a chur i bhfolach cosúil le Ceamara, Screenshots agus Íoslódálacha.</string>
<string name="faq_6_title">Cén fáth a dtaispeánann fillteáin le healaín chlúdaigh ceoil nó greamáin?</string>
<string name="faq_6_text">D\'fhéadfadh sé tarlú go bhfeicfidh tú roinnt albam neamhghnách á dtaispeáint. Is féidir leat iad a eisiamh go héasca trí iad a bhrú fada agus Eisiamh a roghnú. Sa chéad dialóg eile is féidir leat an máthairfhillteán a roghnú ansin, seans maith go gcuirfidh sé cosc ar na halbaim ghaolmhara eile a thaispeáint freisin.</string>
<string name="faq_7_title">Níl fillteán le híomhánna á thaispeáint, nó ní thaispeánann sé gach mír. Céard is féidir liom a dhéanamh?</string>
<string name="faq_11_title">An féidir liom mionsamhlacha comhaid meán a ghrúpáil ar bhealach?</string>
<string name="faq_11_text">Cinnte, bain úsáid as an mír roghchláir \"Grúpa de réir\" agus tú ag amharc mionsamhlacha. Is féidir leat comhaid a ghrúpáil de réir critéir éagsúla, lena n-áirítear Dáta Tógtha. Má úsáideann tú an fheidhm \"Taispeáin ábhar gach fillteán\" is féidir leat iad a ghrúpáil le fillteáin freisin.</string>
<string name="faq_12_title">Ní sórtáil de réir Dáta Tógtha cosúil a bheith ag obair i gceart, conas is féidir liom é a shocrú?</string>
<string name="faq_12_text">Is dócha gurb iad na comhaid atá á gcóipeáil ó áit éigin is cúis leis. Is féidir leat é a shocrú trí mhionsamhlacha an chomhaid a roghnú agus \"Fix Date Taken value\" a roghnú.</string>
<string name="faq_13_title">Feicim roinnt bandáil datha ar na híomhánna. Conas is féidir liom an caighdeán a fheabhsú?</string>
<string name="faq_14_text">Is féidir leat an mhír roghchláir \"Taispeáin míreanna folaithe go sealadach\" a bhrú ag an bpríomhscáileán, nó scoránaigh \"Taispeáin míreanna i bhfolach\" i socruithe an fheidhmchláir chun an mhír fholaithe a fheiceáil. Más mian leat é a unhide, brúigh ach fada é agus roghnaigh \"Unhide\". Tá fillteáin i bhfolach trí chomhad \".nomedia\" i bhfolach a chur isteach iontu, is féidir leat an comhad a scriosadh le haon bhainisteoir comhad freisin. Tabhair faoi deara go n-oibríonn hiding go hathchúrsach áfach, mar sin má cheilt tú fillteán, beidh gach fofhillteán i bhfolach freisin. Mar sin, chun unhiding na fofhillteáin a bhfuil tú a unhide an máthairfhillteán.</string>
<string name="faq_16_title">Cad a tharla do chomhad agus fillteán i bhfolach agus cén fáth nach féidir liom míreanna i bhfolach a fheiceáil níos mó?</string>
<string name="faq_15_text">Is féidir le taisce app suas le 250MB a ghlacadh, cinntíonn sé luchtú íomhá níos tapúla. Má tá níos mó spáis á thógáil ag an aip, is dóichí gurb é is cúis leis ná go bhfuil míreanna agat sa Bhosca Athchúrsála. Áirítear na comhaid sin ar mhéid an fheidhmchláir. Is féidir leat an bosca athchúrsála a ghlanadh trína oscailt agus gach comhad a scriosadh, nó ó shocruithe na haipe. Scriostar gach comhad sa bhosca bruscair go huathoibríoch tar éis 30 lá.</string>
<string name="faq_16_text">Ag tosú le Android 11 ní féidir leat comhaid nó fillteáin a cheilt nó a cheilt níos mó, ní féidir leat na cinn i bhfolach a fheiceáil in aipeanna gailearaí mar gheall ar shrianta córais ach an oiread. Beidh ort bainisteoir comhad éigin a úsáid chuige sin.</string>
<string name="faq_16_text_extra">Nó is féidir leat rochtain a thabhairt don ghailearaí seo ar Gach Comhad trí do shocruithe gléis, rud a ligfidh dúinn míreanna folaithe a thaispeáint agus oibríochtaí comhaid a dhéanamh níos iontaofa go ginearálta.</string>
<string name="faq_17_title">Cén fáth nach féidir liom fillteáin atá ar iarraidh a chur san áireamh níos mó?</string>
<string name="faq_17_text">Stop sé sin ag obair mar gheall ar na hathruithe córais a tháinig le Android 11 freisin, ní féidir leis an aip fillteáin fíor a bhrabhsáil níos mó, braitheann sé ar an MediaStore mar a thugtar air ag fáil sonraí.</string>
<string name="faq_18_title">Cén fáth a bhfeicim fógraí le linn athsheinm físe?</string>
<string name="faq_8_text">Má chuirtear fillteán leis na Fillteáin Áirithe, ní fhágann sin rud ar bith as an áireamh go huathoibríoch. Cad is féidir leat a dhéanamh ná dul i Socruithe -&gt; Bainistigh Fillteáin Eisiata, eisiamh an fillteán fréimhe \"/\", ansin cuir na fillteáin atá ag teastáil ag Socruithe -&gt; Bainistigh Fillteáin Áirithe. Ní dhéanfaidh sé sin ach na fillteáin roghnaithe a fheiceáil, mar go bhfuil an dá eisiamh agus lena n-áirítear athfhillteach agus má tá fillteán eisiata agus san áireamh, beidh sé a thaispeáint suas.</string>
<string name="toggle_favorite">Scoránaigh is fearr leat</string>
</resources>

View file

@ -40,11 +40,9 @@
<string name="no_media_with_filters">Non se atopou multimedia do tipo indicado polo filtro.</string>
<string name="change_filters_underlined"><u>Cambiar filtro</u></string>
<string name="hide_folder_description">Esta función oculta o cartafol engadíndolle ficheiro \'.nomedia\', tamén ocultará os subcartafoles. Podes velos premendo a opción \'Mostrar elementos ocultos\' nos Axustes. Continuar?</string>
<string name="exclude_folder_description">Isto só excluirá de Galería Fossify a selección e os seus subcartafoles. Podes xestionar os cartafoles excluídos nos Axustes.</string>
<string name="exclude_folder_description">Isto só excluirá de Fossify Gallery a selección e os seus subcartafoles. Podes xestionar os cartafoles excluídos nos Axustes.</string>
<string name="exclude_folder_parent">Excluír o cartafol pai no seu lugar\?</string>
<string name="excluded_activity_placeholder">Ao excluír un cartafol xunto cos seus cartafoles farás que non sexan visibles só en Galería Fossify, serán aínda visibles noutras aplicacións.
\n
\nSe queres ocultalos tamén doutras apps, usa a función Ocultar.</string>
<string name="excluded_activity_placeholder">Ao excluír un cartafol xunto cos seus cartafoles farás que non sexan visibles só en Fossify Gallery, serán aínda visibles noutras aplicacións.\n\nSe queres ocultalos tamén doutras apps, usa a función Ocultar.</string>
<string name="hidden_folders">Cartafoles ocultos</string>
<string name="manage_hidden_folders">Xestionar cartafoles ocultos</string>
<string name="hidden_folders_placeholder">Semella que non tes ningún cartafol oculto cun ficheiro \".nomedia\".</string>
@ -212,8 +210,8 @@
<string name="manage_bottom_actions">Xestionar accións visibles do fondo</string>
<string name="toggle_favorite">Engadir como favorito</string>
<string name="toggle_file_visibility">Alternar visibilidade do ficheiro</string>
<string name="faq_1_title">Como fago para que Galería Fossify sexa a galería por defecto no móbil?</string>
<string name="faq_1_text">Primeiro tes que atopar a galería predeterminada actual na sección Aplicacións nos axustes do teu dispositivo, busca un botón que poña algo como \"Abrir por defecto\", preme nel, marca \"Restablecer predeterminada\". A próxima vez que intentes abrir unha imaxe ou vídeo deberás escoller a aplicación para abrila, e aí podes elixir Galería Fossify e poñela como app predeterminada.</string>
<string name="faq_1_title">Como facer que Fossify Gallery sexa a galería predeterminada no móbil?</string>
<string name="faq_1_text">Primeiro tes que atopar a galería predeterminada actual na sección Aplicacións nos axustes do teu dispositivo, busca un botón que poña algo como \"Abrir por defecto\", preme nel, marca \"Restablecer predeterminada\". A próxima vez que intentes abrir unha imaxe ou vídeo deberás escoller a aplicación para abrila, e aí podes elixir Fossify Gallery e poñela como app predeterminada.</string>
<string name="faq_2_title">Protexín a aplicación cun contrasinal, pero esquecino. Que podo facer?</string>
<string name="faq_2_text">Podes solucionalo de dous xeitos. Ou ben reinstalar a aplicación ou buscar a aplicación nos axustes do dispositivo e escoller \"Limpar datos\". Restablecerá todos os seus axustes, mais non eliminará ficheiros de medios.</string>
<string name="faq_3_title">Como podo facer que un álbum apareza sempre arriba de todo\?</string>
@ -221,7 +219,7 @@
<string name="faq_4_title">Como podo aumentala velocidade da reprodución do vídeo\?</string>
<string name="faq_4_text">Pode facelo tocando dúas veces o lateral da pantalla, ou tocando os textos de duración máxima ou actual preto da barra de avance. Se activa abrir os vídeos nunha pantalla separada, tamén pode usar xestos horizontais.</string>
<string name="faq_5_title">Cal é a diferenza entre ocultar e excluír un cartafol?</string>
<string name="faq_5_text">A exclusión só evita que se mostre o cartafol en Galería Fossify, mentras Ocultar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Funciona creando un ficheiro baleiro \".nomedia\" no cartafol dado, que podes eliminar posteriormente desde calquera xestor de ficheiros. Ten en conta que algúns dispositivos non permiten ocultar cartafoles, como a Cámara, Captura de Pantall ou Descargas.</string>
<string name="faq_5_text">A exclusión só evita que se mostre o cartafol en Fossify Gallery, mentras Ocultar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Funciona creando un ficheiro baleiro \".nomedia\" no cartafol dado, que podes eliminar posteriormente desde calquera xestor de ficheiros. Ten en conta que algúns dispositivos non permiten ocultar cartafoles, como a Cámara, Captura de Pantall ou Descargas.</string>
<string name="faq_6_title">Por que aparecen cartafoles de música con portadas ou pegatinas\?</string>
<string name="faq_6_text">Pode acontecer que vexa que aparecen álbumes raros. Pode excluílos con facilidade mantendo premidos e escollendo Excluír. No seguinte diálogo pode escoller o cartafol pai, esto probablemente agoche outros álbumes relacionados.</string>
<string name="faq_7_title">Un cartafol con imaxes non aparece, que podo facer\?</string>
@ -251,4 +249,10 @@
<string name="svgs">SVGs</string>
<string name="editor">Editor</string>
<string name="gifs">GIFs</string>
<string name="playback_speed">Velocidade de reprodución</string>
<string name="full_storage_permission_required">Fossify Gallery precisa acceso completo para poder mostrar todas as fotos e vídeos. Vai a Axustes &gt; Permisos &gt; Fotos e Vídeos &gt; Permitir todo.</string>
<string name="file_is_malformed_or_corrupted">O ficheiro está corrupto ou mal formado.</string>
<string name="media_exceeds_device_capabilities">O multimedia supera as capacidades do dispositivo.</string>
<string name="unsupported_format">Formato non compatible.</string>
<string name="failed_to_load_media">Fallou a carga do multimedia.</string>
</resources>

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">ગેલેરી</string>
<string name="edit">ફેરફાર કરો</string>
<string name="open_camera">કેમેરા ખોલો</string>
<string name="hidden">(ચૂપૈલું)</string>
<string name="excluded">(બાકાત)</string>
<string name="pin_folder">ફોલ્ડર પિન કરો</string>
<string name="unpin_folder">ફોલ્ડર નું પિન કાઢી નાંખો</string>
<string name="pin_to_the_top">એકદમ ઉપર પિન કરો</string>
<string name="set_as_default_folder">આને ડિફૌલ્ટ ફોલ્ડર મા સેટ કરો</string>
<string name="lock_orientation">સ્ક્રીન ફેરવો નઈ</string>
<string name="reorder_by_dragging_pro">ફોલ્ડરો નો ક્રમ એને ખેંચીને બદલો (પ્રો)</string>
<string name="full_storage_permission_required">ફોસિફાઈ ગેલેરી ને ફોટા અને વિડિયો દેખાડવા માટે પૂરી અનુમતિ જોડે. તો સેટિંગ &gt; પરવાંગી &gt; ફોટો અને વિડિયો &gt; બધાને મંજૂરી આપો.</string>
<string name="videos">વિડિયો</string>
<string name="resize_and_save">સિલેક્ટ કરેલા ની સાઈઝ બદલો અને સાચવો</string>
<string name="resize_factor_error">૧૦ થી ૯૦ વચ્ચે ના અંક નાખો</string>
<string name="folder_view">ફોલ્ડર વ્યુ મા બદલો</string>
<string name="unlock_orientation">સ્ક્રીન ફેરવી સકો</string>
<string name="hidden_folders">છુપાઈલા ફોલ્ડરો</string>
<string name="show_folder_name">ફોલ્ડર ઓ નું નામ દેખાળો</string>
<string name="force_landscape">આદિ સ્ક્રીન રાખો</string>
<string name="dates_fixed_successfully">તારીખ સુધારવાનું સફળ થયું</string>
<string name="show_all">બધા ફોલ્ડર ની વસ્તુઓ દેખાડો</string>
<string name="all_folders">બધા ફોલ્ડરો</string>
<string name="other_folder">બીજા ફોલ્ડરો</string>
<string name="show_on_map">નકશા પર દેખાડો</string>
<string name="unknown_location">સ્થાન અજ્ઞાત છે</string>
<string name="volume">અવાજ</string>
<string name="brightness">પ્રકાશ</string>
<string name="change_orientation">સ્ક્રીન ફેરવો</string>
<string name="force_portrait">ઉભી સ્ક્રીન રાખો</string>
<string name="use_default_orientation">ફોન ના રીતે સ્ક્રીન ફેરવો</string>
<string name="fixing">સુધરે છે…</string>
<string name="share_resized">સાઇઝ બદલેલી આવૃત્તિ શૈર કરો</string>
<string name="reorder_by_dragging">ફોલ્ડરો નો ક્રમ એને ખેંચીને બદલો</string>
<string name="restore_to_path">\'%s\' પર પુનઃસ્થાપિત કરી રહ્યું છે</string>
<string name="filter_media">મીડિયા ફિલ્ટર કરો</string>
<string name="images">ફોટા</string>
<string name="gifs">જીયાઇએફો</string>
<string name="no_media_with_filters">પસંદ કરેલા ફિલ્ટર થી કઈ ના મળ્યું.</string>
<string name="change_filters_underlined"><u>ફિલ્ટર બદલો</u></string>
<string name="manage_hidden_folders">છુપાઈલા ફોલ્ડરો મેનેજ કરો</string>
<string name="manage_included_folders">સમાવિષ્ટ ફોલ્ડરો મેનેજ કરો</string>
<string name="add_folder">ફોલ્ડર જોડો</string>
<string name="width">પહોળાઈ</string>
<string name="height">લંબાઈ</string>
<string name="keep_aspect_ratio">પહોળાઈ ને લંબાઈ એક સરખી રાખો</string>
<string name="editor">ફેરફાર કરતા</string>
<string name="rotate">ફેરવો</string>
<string name="image_editing_failed">ફોટો ફેરફાર સફળ ના થયું</string>
<string name="include_folders">સમાવિષ્ટ ફોલ્ડરો</string>
<string name="unset_as_default_folder">સેટ ડિફૌલ્ટ ફોલ્ડર કદી દો</string>
</resources>

View file

@ -252,4 +252,10 @@
<string name="slide">Prijelaz</string>
<string name="faq_1_text">Najprije moraš pronaći trenutačno zadanu galeriju u odjeljku aplikacija u postavkama tvog uređaja. Potraži gumb koji kaže nešto poput „Standardno otvori”, pritisni ga, a zatim odaberi „Očisti standardne postavke“. Kada sljedeći put pokušaš otvoriti sliku ili video vidjet ćeš birač aplikacija, gdje možeš odabrati aplikaciju „Fossify galerija” i postaviti je kao standardnu aplikaciju.</string>
<string name="faq_5_text">Opcija „Isključi” sprječava prikazivanje mape samo u Fossify galeriji, dok opcija „Sakrij” funkcionira za cijeli sustav te skriva mapu i od drugih galerija. Radi tako što stvara praznu datoteku „.nomedia” u zadnoj mapi, koju zatim možeš ukloniti s bilo kojim upravljačem datoteka. Imaj na umu da neki uređaji ne dopuštaju skrivanje mapa kao što su Kamera, Slike ekrana i Preuzimanja.</string>
<string name="full_storage_permission_required">Fossify galerija treba puni pristup za prikaz svih tvojih fotografija i videa. Idi na Postavke &gt; Dozvole &gt; Fotografije i videa &gt; Dozvoli sve.</string>
<string name="playback_speed">Brzina reprodukcije</string>
<string name="unsupported_format">Nepodržan format.</string>
<string name="file_is_malformed_or_corrupted">Datoteka je neispravna ili oštećena.</string>
<string name="media_exceeds_device_capabilities">Medij premašuje mogućnosti uređaja.</string>
<string name="failed_to_load_media">Neuspjelo učitavanje medija.</string>
</resources>

View file

@ -253,4 +253,8 @@
<string name="faq_1_text">Először meg kell találnia az aktuálisan alapértelmezett galériát az Alkalmazások részében az eszközbeállítások között, keressen egy gombot, amely olyasmit ír, hogy \"Alapértelmezés szerinti megnyitás\", kattintson rá, majd válassza ki az \"Alapértelmezések törlése\" lehetőséget. Amikor legközelebb megpróbál megnyitni egy képet vagy videót, látnia kell egy alkalmazásválasztót, ahol kiválaszthatja a Fossify Galériát, és beállíthatja alapértelmezett alkalmazásnak.</string>
<string name="full_storage_permission_required">A Fossify Galéria teljes hozzáférést igényel az összes fénykép és videó megjelenítéséhez. Válassza a Beállítások &gt; Engedélyek &gt; Fényképek és videók &gt; Mindent engedélyez.</string>
<string name="playback_speed">Lejátszási sebesség</string>
<string name="failed_to_load_media">A média betöltése sikertelen.</string>
<string name="media_exceeds_device_capabilities">A médiafájl meghaladja az eszköz képességeit.</string>
<string name="file_is_malformed_or_corrupted">Hibás vagy sérült fájl.</string>
<string name="unsupported_format">Nem támogatott formátum.</string>
</resources>

View file

@ -142,17 +142,17 @@
<string name="show_media_count">Tampilkan jumlah media di tampilan utama</string>
<string name="show_extended_details">Tampilkan detail tambahan saat layar penuh</string>
<string name="manage_extended_details">Kelola detail tambahan</string>
<string name="one_finger_zoom">Izinkan zum dengan satu jari di layar penuh</string>
<string name="one_finger_zoom">Izinkan zoom dengan satu jari di layar penuh</string>
<string name="allow_instant_change">Izinkan mengganti media dengan mengklik sisi layar</string>
<string name="allow_deep_zooming_images">Izinkan zum gambar lebih dalam</string>
<string name="allow_deep_zooming_images">Izinkan zoom gambar lebih dalam</string>
<string name="hide_extended_details">Sembunyikan detail tambahan ketika bilah status disembunyikan</string>
<string name="show_at_bottom">Tampilkan tombol tindakan di layar bagian bawah</string>
<string name="show_recycle_bin">Tampilkan Keranjang Sampah di layar folder</string>
<string name="deep_zoomable_images">Zum gambar mendalam</string>
<string name="deep_zoomable_images">Zoom gambar mendalam</string>
<string name="show_highest_quality">Tampilkan gambar dalam kualitas tertinggi</string>
<string name="show_recycle_bin_last">Tampilkan Keranjang Sampah sebagai item terakhir di layar utama</string>
<string name="allow_down_gesture">Izinkan keluar dari layar penuh dengan menggeser ke bawah</string>
<string name="allow_one_to_one_zoom">Izinkan zum 1:1 dengan dua kali ketuk</string>
<string name="allow_one_to_one_zoom">Izinkan zoom 1:1 dengan dua kali ketuk</string>
<string name="open_videos_on_separate_screen">Selalu buka video pada layar terpisah dengan gestur horizontal baru</string>
<string name="show_notch">Tampilkan notch jika tersedia</string>
<string name="allow_rotating_gestures">Izinkan memutar gambar dengan gestur</string>
@ -161,13 +161,13 @@
<string name="compromise">Kompromi</string>
<string name="avoid_showing_invalid_files">Hindari menampilkan file yang tidak valid</string>
<string name="show_image_file_types">Tampilkan jenis file gambar</string>
<string name="allow_zooming_videos">Perbolehkan perbesaran video dengan menekan dua kali</string>
<string name="allow_zooming_videos">Perbolehkan zoom video dengan mengetuk dua kali</string>
<string name="folder_thumbnail_style">Gaya thumbnail folder</string>
<string name="file_thumbnail_style">Gaya thumbnail file</string>
<string name="mark_favorite_items">Tandai item favorit</string>
<string name="thumbnail_spacing">Spasi thumbnail</string>
<string name="show_file_count_line">Tampilkan jumlah file di baris terpisah</string>
<string name="show_file_count_brackets">Tampilkah jumlah file di kotak</string>
<string name="show_file_count_brackets">Tampilkah jumlah file di dalam kurung</string>
<string name="show_file_count_none">Jangan tampilkan jumlah file</string>
<string name="limit_folder_title">Batasi judul folder panjang ke 1 baris</string>
<string name="square">Kotak</string>
@ -180,7 +180,7 @@
<string name="media_management_manual">Ada yang salah, silakan menuju ke Pengaturan - Aplikasi - Akses aplikasi khusus - Aplikasi manajemen media dan perbolehkan aplikasi ini untuk mengelola media.</string>
<string name="media_management_note">Jika perubahan arah tidak bekerja, silakan menuju ke Pengaturan - Aplikasi - Akses aplikasi khusus - Aplikasi manajemen media dan perbolehkan aplikasi ini untuk mengelola media.</string>
<string name="media_management_alternative">Jika Anda tidak ingin melakukannya, Anda juga dapat menuju ke Pengaturan - Aplikasi - Akses aplikasi khusus - Aplikasi manajemen media dan perbolehkan aplikasi ini untuk mengelola media.</string>
<string name="alternative_media_access">Secara alternatif, Anda dapat memperbolehkan mengakses file media saja. Jika demikian, Anda tidak akan dapat melakukan apa pun dengan file tersembunyi.</string>
<string name="alternative_media_access">Sebagai alternatif, Anda dapat memperbolehkan mengakses file media saja. Jika demikian, Anda tidak akan dapat melakukan apa pun dengan file tersembunyi.</string>
<string name="media_only">Hanya media</string>
<string name="all_files">Semua file</string>
<string name="search_all_files">Cari semua file daripada folder di layar utama</string>
@ -212,9 +212,9 @@
<string name="faq_12_title">Tidak bisa mengurutkan berdasarkan Tanggal Diambil, bagaimana cara memperbaikinya\?</string>
<string name="faq_12_text">Itu umumnya disebabkan karena file yang disalin dari tempat lain. Anda bisa memperbaikinya dengan memilih file thumbnail dan pilih \"Perbaiki Tanggal Diambil\".</string>
<string name="faq_13_title">Saya melihat beberapa pita warna pada gambar. Bagaimana saya meningkatkan kualitasnya\?</string>
<string name="faq_13_text">Solusi saat ini untuk menampilkan gambar berfungsi dengan baik dalam sebagian besar kasus, namun jika anda ingin kualitas gambar yang lebih baik, anda bisa mengaktifkan \"Tampilkan gambar dalam kualitas tertinggi\" di pengaturan aplikasi, pada bagian \"Zum gambar mendalam\".</string>
<string name="faq_13_text">Solusi saat ini untuk menampilkan gambar berfungsi baik dalam sebagian besar kasus, namun jika anda ingin kualitas gambar yang lebih baik, anda bisa mengaktifkan \"Tampilkan gambar dalam kualitas tertinggi\" di pengaturan aplikasi, pada bagian \"Zoom gambar mendalam\".</string>
<string name="faq_14_title">Saya punya file/folder tersembunyi. Bagaimana cara memunculkannya?</string>
<string name="faq_14_text">Anda bisa memilih menu \"Tampilkan sementara file tersembunyi\" di layar utama, atau \"Tampilkan file tersembunyi\" di pengaturan aplikasi untuk menampilkannya. Jika anda tidak ingin menyembunyikannya, tekan lama dan pilih \"Jangan sembunyikan\". Folder disembunyikan dengan cara menambahkan file bertajuk \".nomedia\" di dalamnya, dan Anda bisa menghapus file tersebut dengan aplikasi pengelola file. Peelu diingat bahwa proses penyembunyikan file bekerja secara beruntun, jadi jika Anda menyembunyikan sebuah folder, seluruh subfoldernya juga akan disembunyikan. Jadi untuk memunculkan subfolder, Anda harus memunculkan folder induknya.</string>
<string name="faq_14_text">Anda bisa memilih menu \"Tampilkan sementara file tersembunyi\" di layar utama, atau \"Tampilkan file tersembunyi\" di pengaturan aplikasi untuk menampilkannya. Jika Anda tidak ingin menyembunyikannya, tekan lama dan pilih \"Jangan sembunyikan\". Folder disembunyikan dengan cara menambahkan file bernama \".nomedia\" di dalamnya, dan Anda bisa menghapus file tersebut dengan aplikasi pengelola file. Peelu diingat bahwa proses penyembunyikan file bekerja secara beruntun, jadi jika Anda menyembunyikan sebuah folder, seluruh subfoldernya juga akan disembunyikan. Jadi untuk memunculkan subfolder, Anda harus memunculkan folder induknya.</string>
<string name="faq_15_title">Kenapa aplikasi menggunakan sangat banyak ruang kosong\?</string>
<string name="faq_15_text">Cache aplikasi bisa mencapai 250MB, ini untuk menjamin pemuatan gambar yang lebih cepat. Jika aplikasi menggunakan lebih banyak lagi ruang kosong, sangat memungkinkan anda memiliki item di dalam Keranjang Sampah. File tersebut akan menambah ukuran aplikasi. Anda bisa mengosongkan Keranjang sampah dengan cara membukanya dan menghapus semua file, atau dari pengaturan aplikasi. Semua file di dalam keranjang sampah akan dihapus secara otomatis setelah 30 hari.</string>
<string name="faq_16_title">Apa yang terjadi pada penyembunyian file dan folder, dan mengapa saya tidak bisa melihat item yang tersembunyi lagi\?</string>
@ -250,4 +250,10 @@
<string name="slide">Geser</string>
<string name="by_folder">Folder</string>
<string name="cant_unhide_folder">Jika folder atau salah satu folder induknya memiliki titik di depan namanya, maka folder tersebut tersembunyi dan tidak dapat dimunculkan seperti ini. Anda harus menghapus titik dengan mengganti namanya.</string>
<string name="full_storage_permission_required">Fossify Gallery perlu akses penuh untuk menampilkan semua foto dan video. Buka Pengaturan &gt; Izin &gt; Foto dan video &gt; Izinkan semua.</string>
<string name="playback_speed">Kecepatan pemutaran</string>
<string name="file_is_malformed_or_corrupted">File rusak atau korup.</string>
<string name="media_exceeds_device_capabilities">Media melebihi kemampuan perangkat.</string>
<string name="unsupported_format">Format tidak didukung.</string>
<string name="failed_to_load_media">Gagal memuat media.</string>
</resources>

View file

@ -255,4 +255,7 @@
<string name="full_storage_permission_required">Galleria Fossify ha bisogno dell\'accesso completo per visualizzare tutte le foto e i video. Vai su Impostazioni &gt; Autorizzazioni &gt; Foto e video &gt; Consenti tutti.</string>
<string name="playback_speed">Velocità di riproduzione</string>
<string name="failed_to_load_media">Impossibile caricare i media.</string>
<string name="file_is_malformed_or_corrupted">Il file è malformato o corrotto.</string>
<string name="media_exceeds_device_capabilities">Il media supera le capacità del dispositivo.</string>
<string name="unsupported_format">Formato non supportato.</string>
</resources>

View file

@ -182,4 +182,5 @@
<string name="manage_bottom_actions">נהל פעולות תחתונות גלויות</string>
<string name="toggle_favorite">החלף מועדף</string>
<string name="toggle_file_visibility">החלף את נראות הקובץ</string>
<string name="hidden_all_files">אתה צריך להעניק לאפליקציה גישה לכל הקבצים כדי לראות קבצים מוסתרים, אחרת זה לא יכול לעבוד.</string>
</resources>

View file

@ -212,10 +212,10 @@
<string name="faq_7_text">理由はいくつかありますが、解決は簡単です。[設定] → [追加フォルダーの管理] に移動して、プラスボタン(+ボタン)を押し、表示したいフォルダーを選択して追加します。</string>
<string name="faq_8_title">特定のフォルダーのみ表示にしたい場合はどうすればいいですか?</string>
<string name="faq_8_text">追加フォルダーにフォルダーを追加しても、自動的に除外されるわけではありません。[設定] → [除外フォルダーの管理] に移動し、ルートフォルダーを除外し、 [設定] → [追加フォルダーの管理] で目的のフォルダーを追加すれば可能です。除外と包含は両方再帰的なので、フォルダーが含まれており除外もされている場合、選択したフォルダーのみ表示されるようになります。</string>
<string name="faq_10_title">このアプリで画像のトリミングは出来ますか?</string>
<string name="faq_10_text">はい、「編集」で画像をトリミング出来ます。編集画面で画像の隅をドラッグしてください。「編集」は、画像のサムネイルを長押しして編集を選択するか、全画面表示で編集を選択することにより出来ます。</string>
<string name="faq_10_title">このアプリで画像をトリミングできますか?</string>
<string name="faq_10_text">はい、エディターで画像をトリミングできます。編集画面で画像の隅をドラッグしてください。エディターは、画像のサムネイルを長押しして編集を選択するか、全画面表示で編集を選択すると開けます。</string>
<string name="faq_11_title">どうすればメディアファイルのサムネイルをグループ化できますか?</string>
<string name="faq_11_text">サムネイル表示中に「グループ分け」メニューを使用してください。撮影日を含めた、複数の条件でグループ化することが出来ます。「すべてを表示」機能を使えば、フォルダーごとにグループ化することも出来ます。</string>
<string name="faq_11_text">サムネイル表示中に「グループ分け」メニューを使用してください。撮影日を含めた、複数の条件でグループ化できます。「すべてを表示」機能を使えば、フォルダーごとにグループ化することもできます。</string>
<string name="faq_12_title">撮影日による並べ替えがうまく機能しないようです。どうすれば直せますか?</string>
<string name="faq_12_text">おそらく、ファイルがコピーされたものであることが原因でしょう。ファイルサムネイルを選択し、「撮影日の値を修正」を選択することにより直せます。</string>
<string name="faq_13_title">画像にバンディング(濃淡の縞模様)が見られます。どうすれば画質を上げられますか?</string>
@ -243,4 +243,5 @@
</plurals>
<string name="images_resized_successfully">画像のサイズを変更しました</string>
<string name="wallpaper">壁紙</string>
<string name="exclude_folder_description">選択したフォルダーとその子フォルダーをFossifyギャラリーから除外します。除外したフォルダーは設定画面で管理できます。</string>
</resources>

View file

@ -254,4 +254,7 @@
<string name="full_storage_permission_required">Fossify Galerij heeft volledige toegang nodig al je foto\'s en video\'s te kunnen tonen. Ga naar de app-instellingen &gt; Rechten &gt; Foto\'s en video\'s &gt; Alles toestaan.</string>
<string name="playback_speed">Afspeelsnelheid</string>
<string name="failed_to_load_media">Fout bij het laden van het bestand.</string>
<string name="file_is_malformed_or_corrupted">Bestand is onvolledig of beschadigd.</string>
<string name="unsupported_format">Niet-ondersteund formaat.</string>
<string name="media_exceeds_device_capabilities">Dit apparaat kan deze video niet afspelen.</string>
</resources>

View file

@ -256,4 +256,7 @@
<string name="full_storage_permission_required">Fossify Gallery potrzebuje pełnego dostępu, aby wyświetlać wszystkie Twoje zdjęcia i wideo. Przejdź do Ustawień &gt; Uprawnienia &gt; Zdjęcia i filmy &gt; Zezwalaj.</string>
<string name="playback_speed">Prędkość odtwarzania</string>
<string name="failed_to_load_media">Nie udało się załadować multimediów.</string>
<string name="media_exceeds_device_capabilities">Plik przekracza możliwości urządzenia.</string>
<string name="unsupported_format">Nieobsługiwany format.</string>
<string name="file_is_malformed_or_corrupted">Plik jest wadliwy lub uszkodzony.</string>
</resources>

View file

@ -252,4 +252,7 @@
<string name="svgs">SVGs</string>
<string name="volume">Volume</string>
<string name="editor">Editor</string>
<string name="unsupported_format">Formato não suportado.</string>
<string name="media_exceeds_device_capabilities">A mídia excede as capacidades do dispositivo.</string>
<string name="failed_to_load_media">Falha ao carregar mídia.</string>
</resources>

View file

@ -5,12 +5,12 @@
<string name="open_camera">Abrir câmara</string>
<string name="hidden">(oculta)</string>
<string name="excluded">(excluída)</string>
<string name="pin_folder">Fixar pasta</string>
<string name="pin_folder">Afixar pasta</string>
<string name="unpin_folder">Desafixar pasta</string>
<string name="pin_to_the_top">Fixar no topo</string>
<string name="show_all">Mostrar conteúdo de todas as pastas</string>
<string name="all_folders">Todas as pastas</string>
<string name="folder_view">Alternar para a vista de pastas</string>
<string name="folder_view">Trocar para vista de pastas</string>
<string name="other_folder">Outra pasta</string>
<string name="show_on_map">Mostrar no mapa</string>
<string name="unknown_location">Localização desconhecida</string>
@ -24,7 +24,7 @@
<string name="fix_date_taken">Corrigir data de captura</string>
<string name="fixing">A corrigir…</string>
<string name="dates_fixed_successfully">Dados corrigidos com sucesso</string>
<string name="no_date_takens_found">Não foram encontrados dados para a data de captura</string>
<string name="no_date_takens_found">Data de captura não encontrada</string>
<string name="share_resized">Partilhar foto redimensionada</string>
<string name="switch_to_file_search">Trocar para pesquisa de ficheiros em todas as pastas visíveis</string>
<string name="set_as_default_folder">Utilizar como pasta padrão</string>
@ -41,7 +41,7 @@
<string name="portraits">Retratos</string>
<string name="no_media_with_filters">Não foram encontrados ficheiros que cumpram os requisitos.</string>
<string name="change_filters_underlined"><u>Alterar filtros</u></string>
<string name="hide_folder_description">Esta função oculta a pasta, adicionando-lhe um ficheiro \'.nomedia\' e ocultará também todas as subpastas nela existentes. Pode ver as pastas com a opção \'Mostrar pastas ocultas\'. Continuar\?</string>
<string name="hide_folder_description">Esta função oculta a pasta, adicionando-lhe um ficheiro \'.nomedia\' e ocultará também todas as sub-pastas existentes. Pode ver as pastas com a opção \'Mostrar pastas ocultas\'. Continuar?</string>
<string name="exclude_folder_parent">Excluir antes a pasta superior\?</string>
<string name="hidden_folders">Pastas ocultas</string>
<string name="manage_hidden_folders">Gerir pastas ocultas</string>
@ -122,7 +122,7 @@
<string name="slide">Deslizar</string>
<string name="slideshow_ended">Apresentação terminada</string>
<string name="no_media_for_slideshow">Não foram encontrados ficheiros para a apresentação</string>
<string name="group_direct_subfolders">Agrupar subpastas</string>
<string name="group_direct_subfolders">Agrupar sub-pastas</string>
<string name="group_by">Agrupar por</string>
<string name="do_not_group_files">Não agrupar ficheiros</string>
<string name="by_folder">Pasta</string>
@ -134,7 +134,7 @@
<string name="by_date_taken_monthly">Tirada em (por mês)</string>
<string name="by_file_type">Tipo de ficheiro</string>
<string name="by_extension">Extensão</string>
<string name="show_file_count_section_header">Mostrar contagem no título da secção</string>
<string name="show_file_count_section_header">Mostrar número de ficheiros no título da secção</string>
<string name="grouping_and_sorting">Tenha em atenção de que agrupamento e ordenação são campos independentes</string>
<string name="folder_on_widget">Pasta mostrada no widget:</string>
<string name="show_folder_name">Mostrar nome da pasta</string>
@ -176,7 +176,7 @@
<string name="speed">Velocidade</string>
<string name="compromise">Qualidade</string>
<string name="avoid_showing_invalid_files">Não mostrar ficheiros inválidos</string>
<string name="show_image_file_types">Mostrar o tipo da imagem</string>
<string name="show_image_file_types">Mostrar tipo de imagem</string>
<string name="allow_zooming_videos">Permitir ampliação de vídeos com dois toques</string>
<string name="folder_thumbnail_style">Estilo de miniatura das pastas</string>
<string name="file_thumbnail_style">Estilo de miniaturas dos ficheiros</string>
@ -208,14 +208,14 @@
<string name="manage_bottom_actions">Gerir exibição dos botões de ação</string>
<string name="toggle_favorite">Alternar favorito</string>
<string name="toggle_file_visibility">Alternar visibilidade dos ficheiros</string>
<string name="faq_2_title">Bloqueei a aplicação com uma palavra-passe mas agora esqueci-me dela. O que posso fazer\?</string>
<string name="faq_2_text">Existem duas soluções. Reinstala a aplicação ou, nas Definições do sistema &gt; Gerir aplicações &gt; Informações da aplicação, seleccone Limpar dados. Reiniciará assim todas as suas definições na aplicação mas não apagará os seus ficheiros multimedia.</string>
<string name="faq_2_title">Bloqueei a aplicação com palavra-passe mas agora esqueci-me dela. O que posso fazer?</string>
<string name="faq_2_text">Existem duas soluções. Reinstale a aplicação ou nas Definiçõe &gt; Gerir aplicações &gt; Informações da aplicação, selecione Limpar dados. Reiniciará assim todas as suas definições na aplicação mas não apagará os seus ficheiros multimedia.</string>
<string name="faq_3_title">Como posso fazer para que um álbum seja sempre mostrado no topo\?</string>
<string name="faq_3_text">Prima longamente o álbum, seleccione Fixar no topo a partir do menu e será apresentado no topo. Pode também fixar diversas pastas em simultâneo. A ordem de apresentação é a da ordenação padrão.</string>
<string name="faq_4_title">Como posso fazer avançar rápido os videos\?</string>
<string name="faq_3_text">Prima longamente no álbum e seleccione Fixar no topo. Pode também afixar diversas pastas em simultâneo. A ordem de apresentação é a da ordenação padrão.</string>
<string name="faq_4_title">Como posso avançar rapidamente os videos?</string>
<string name="faq_4_text">Dando dois toques nas margens ecrã ou então dando um toque em cima da indicação de duração junto à barra de pesquisa. E, se a opção de abrir videos noutro ecrã estiver habilitada, pode também fazê-lo por gestos.</string>
<string name="faq_5_title">Qual a diferença entre ocultar e excluir uma pasta\?</string>
<string name="faq_6_title">Porque são apresentadas capas de albuns ou stickers\?</string>
<string name="faq_6_title">Porque são mostradas as pastas com imagens de álbuns ou stickers?</string>
<string name="faq_6_text">Pode dar-se o caso de alguns items invulgares aparecerem. Consegue exclui-los premindo longamente e seleccionando Excluir. Na caixa de diálogo seguinte, escolha a pasta superior na hierarquia. Provavelmente, isso irá impedir que outros itens semelhantes sejam apresentados também.</string>
<string name="faq_7_title">Uma pasta com imagens não é apresentada ou não mostra todos os itens lá contidos. O que posso fazer\?</string>
<string name="faq_7_text">Pode haver diversos motivos mas a solução é simples. Em Definições&gt; Gerir Pastas Incluídas, seleccione \'+\' e siga até à pasta pretendida.</string>
@ -240,19 +240,20 @@
<string name="faq_17_text">Isso parou de funcionar devido às mudanças no sistema que vieram com o Android 11, o aplicativo não pode mais navegar em pastas reais, ele depende do chamado MediaStore para buscar dados.</string>
<string name="faq_18_title">Por que vejo anúncios durante a reprodução de vídeo\?</string>
<string name="faq_18_text">As nossas aplicações não têm anúncios. Se você vê-os durante a reprodução de um vídeo, deve estar a usar outra aplicação . Tente encontrar o reprodutor de vídeo padrão nas definições do dispositivo e, em seguida, faça um \"Limpar dados\". Da próxima vez quiser reproduzir um vídeo, surgirá uma opção para escolher a aplicação utilizada.</string>
<string name="faq_1_text">Primeiro, tens que encontrar a galeria padrão no menu de Aplicações nas Definições do teu dispositivo, procura por uma opção que diga algo como \"Abrir como padrão\", clica nesta opção e seleciona \"Remover padrões\". Da próxima vez que tentares abrir uma imagem ou um vídeo, deves aparecer um selecionador de aplicações onde podes escolher a Galeria Fossify e torna-la a aplicação de galeria padrão.</string>
<string name="faq_1_text">Primeiro, tem que encontrar a galeria padrão na secção Aplicações das Definições do dispositivo, procure por uma opção que diga algo como \"Abrir como padrão\", toque nesta opção e selecione \"Limpar predefinições\". Da próxima vez que tentar abrir uma imagem ou vídeo, deve aparecer um seletor de aplicações, no qual pode escolher Galeria Fossify paia utilizar por omissão.</string>
<string name="editor">Editor</string>
<string name="exclude_folder_description">Isto excluirá a seleção juntamente com as suas sub-pastas apenas da Galeria Fossify. Podes gerir as pastas excluídas na Preferências.</string>
<string name="excluded_activity_placeholder">Excluir pastas vai escondê-las juntamente com as suas sub-pastas apenas na Galeria Fossify, elas continuaram visíveis noutras aplicações.
\n
\nSe quiseres escondê-las igualmente noutras aplicações, usa a função Hide.</string>
<string name="cant_unhide_folder">Se uma pasta ou alguma das pastas que contêm esta tiver um ponto antes do seu nome, esta pasta está escondida e não pode ser revelada desta forma. Tens que remover o ponto dando um novo nome à pasta.</string>
<string name="exclude_folder_description">Isto excluirá a seleção juntamente com as suas sub-pastas apenas da Galeria Fossify. Pode gerir as pastas excluídas na Definições.</string>
<string name="excluded_activity_placeholder">Excluir pastas oculta a pasta e as sub-pastas na Galeria Fossify. No entanto , as pastas serão mostradas nas outras aplicações.\n\nSe quiser ocultar globalmente, utilize a função Ocultar.</string>
<string name="cant_unhide_folder">Se uma pasta ou alguma das pastas superiores tiverem um ficheiro .nomedia, esta pasta estará oculta e não pode ser mostrada desta forma. Tem que eliminar o ficheiro primeiro.</string>
<string name="resize_factor_info">Redimensionar as imagens por um dada percentagem, o valor deve ser entre 10 e 90.</string>
<string name="faq_1_title">Como posso tornar a Galeria Fossify a galeria padrão do meu dispositivo?</string>
<string name="faq_5_text">Excluir esconde a pasta apenas na Galeria Fossify, enquanto que a função Hide funciona em todos o sistema e esconde a pasta igualmente noutras aplicações. Esta opção cria um ficheiro vazio \".nomedia\" na pasta em questão, o qual pode ser removido com um gestor de ficheiros. Repara que alguns dispositivos não permite esconder ficheiros com as pastas Camera, Captura de Ecra e Transferências.</string>
<string name="faq_5_text">Excluir oculta a pasta na Galeria Fossify mas a função Ocultar funciona globalmente e esconde a pasta de todas as aplicações. Esta opção cria um ficheiro \".nomedia\" na pasta, o qual pode ser eliminado com um gestor de ficheiros. Tenha em atenção de que alguns dispositivos não permitem esconder algumas pastas tais como, por exemplo, as pastas Camera, Screenshot e Downloads.</string>
<string name="volume">Volume</string>
<string name="wallpaper">Papel de Parede</string>
<string name="failed_to_load_media">Erro ao carregar os dados.</string>
<string name="playback_speed">Velocidade de reprodução</string>
<string name="full_storage_permission_required">Fossify Gallery precisa de acessso total para mostrar as fotos e os vídeos. Aceda a Definições &gt; Permissões &gt; Fotos e vídeos &gt; Permitir.</string>
<string name="full_storage_permission_required">Fossify Gallery precisa de acesso total para mostrar as fotos e os vídeos. Aceda a Definições &gt; Permissões &gt; Fotos e vídeos &gt; Permitir.</string>
<string name="file_is_malformed_or_corrupted">Ficheiro inválido ou danificado.</string>
<string name="media_exceeds_device_capabilities">O ficheiro excede as capacidades do dispositivo.</string>
<string name="unsupported_format">Formato não suportado.</string>
</resources>

View file

@ -236,4 +236,8 @@
<string name="faq_1_title">Cum pot face ca Galeria Fossify să fie galeria implicită a dispozitivului?</string>
<string name="crop">Decupare</string>
<string name="slide">Glisare</string>
<string name="hidden_all_files">Trebuie să acorzi aplicației acces la Toate fișierele pentru a vedea fișierele ascunse, altfel nu poate funcționa.</string>
<string name="excluded_activity_placeholder">Excluderea dosarelor se va face împreună cu sub-dosarele lor ascunse doar în Fossify Gallery, ele vor fi în continuare vizibile în alte aplicații.\n\nDacă dorești să le ascunzi și de alte aplicații, utilizează funcția Ascundere.</string>
<string name="cant_unhide_folder">Dacă un dosar sau unul dintre dosarele părinte are un punct înaintea numelui său, acesta este ascuns și nu poate fi dezvăluit astfel. Trebuie să elimini punctul redenumindu-l.</string>
<string name="full_storage_permission_required">Fossify Gallery are nevoie de acces complet pentru a fișa toate fotografiile și videoclipurile. Accesează Setări &gt; Permisiuni &gt; Fotografii și videoclipuri &gt; Permite toate.</string>
</resources>

View file

@ -256,4 +256,7 @@
<string name="playback_speed">Скорость воспроизведения</string>
<string name="failed_to_load_media">Невозможно загрузить медиафайлы.</string>
<string name="full_storage_permission_required">Fossify Gallery необходим полный доступ для отображения всех ваших фотографий и видео. Откройте \"Настройки\" → \"Разрешения\" → \"Фото и видео\" → \"Разрешить все\".</string>
<string name="unsupported_format">Неподдерживаемый формат.</string>
<string name="file_is_malformed_or_corrupted">Файл имеет неправильный формат или повреждён.</string>
<string name="media_exceeds_device_capabilities">Медиафайл превосходит возможности устройства.</string>
</resources>

View file

@ -4,7 +4,7 @@
<string name="edit">Redigera</string>
<string name="open_camera">Öppna kameran</string>
<string name="hidden">(dold)</string>
<string name="excluded">(exkluderad)</string>
<string name="excluded">(utesluten)</string>
<string name="pin_folder">Fäst mapp</string>
<string name="unpin_folder">Lossa mapp</string>
<string name="pin_to_the_top">Fäst högst upp</string>
@ -32,7 +32,7 @@
<string name="unset_as_default_folder">Ta bort som standardmapp</string>
<string name="reorder_by_dragging">Ändra mappordning genom att dra</string>
<string name="reorder_by_dragging_pro">Ändra mappordning genom att dra (Pro)</string>
<string name="restore_to_path">Återställ till \'%s\'</string>
<string name="restore_to_path">Återställer till \'%s\'</string>
<string name="filter_media">Filtrera media</string>
<string name="images">Bilder</string>
<string name="videos">Videor</string>
@ -175,7 +175,7 @@
<string name="open_videos_on_separate_screen">Öppna alltid videor i en separat vy med nya horisontella gester</string>
<string name="show_notch">Visa notch om tillgängligt</string>
<string name="allow_rotating_gestures">Tillåt bildrotation med gester</string>
<string name="file_loading_priority">Filladdningsprioritet</string>
<string name="file_loading_priority">Filinläsningsprioritet</string>
<string name="speed">Hastighet</string>
<string name="compromise">Kompromiss</string>
<string name="avoid_showing_invalid_files">Undvik att visa ogiltiga filer</string>
@ -245,10 +245,14 @@
<string name="faq_18_title">Varför ser jag annonser under videouppspelning\?</string>
<string name="faq_18_text">Våra appar har inga som helst annonser. Om du ser dem under videouppspelning använder du någon annan videospelare. Försök att hitta din standardvideospelare i enhetsinställningarna och gör sedan en \"Rensa standardinställningar\" på den. Nästa gång du vill öppna en video kommer du att se ett appväljarfönster, där du kan välja vilken app du vill använda.</string>
<string name="wallpaper">Bakgrund</string>
<string name="excluded_activity_placeholder">Att exkludera mappar kommer göra de och deras undermappar dolda i Fossify Gallery, de kommer dock fortfarande vara synliga i andra appar.
\n
\nOn du vill dölja de från andra appar, använd Döljfunktionen.</string>
<string name="exclude_folder_description">Detta kommer att bara exkludera de valda mapparna och deras undermappar från Fossify Gallery. Du kan hantera exkludeerade mappar i Inställningar.</string>
<string name="excluded_activity_placeholder">Att utesluta mappar döljer bara dem och deras undermappar i Fossify Gallery, de kommer fortfarande vara synliga i andra appar.\n\nOm du vill dölja dem från andra appar också använder du funktionen Dölj.</string>
<string name="exclude_folder_description">Detta utesluter bara de valda mapparna och deras undermappar från Fossify Gallery. Du kan hantera uteslutna mappar i Inställningar.</string>
<string name="faq_1_text">Först måste du hitta din enhets standardgalleri app i appsektionen i enhetsinställningarna. Leta efter en knapp som säger \"Systemstandard\", tryck på den och välj sedan rensa inställningar. Nästa gång du öppnar en bild eller videofil bör du se en appväljare där du kan väljs Fossify Galleri som göra den till systemstandard.</string>
<string name="faq_5_text">Uteslut förhindrar att mappen endast visas i Fossify Gallery, medan Dölj fungerar på systemnivå och den döljer även mappen för andra gallerier. Det fungerar genom att skapa en tom \".nomedia\"-fil i den givna mappen, som du sedan kan ta bort med vilken filhanterare som helst. Observera att vissa enheter inte tillåter att dölja mappar som Kamera, Skärmdumpar och Nedladdningar.</string>
<string name="playback_speed">Uppspelningshastighet</string>
<string name="failed_to_load_media">Det gick inte att läsa in media.</string>
<string name="file_is_malformed_or_corrupted">Filen är felformaterad eller skadad.</string>
<string name="media_exceeds_device_capabilities">Media överskrider enhetens funktioner.</string>
<string name="unsupported_format">Formatet stöds inte.</string>
<string name="full_storage_permission_required">Fossify Gallery behöver fullständig åtkomst för att visa alla dina foton och videor. Gå till Inställningar &gt; Behörigheter &gt; Foton och videor &gt; Tillåt alla.</string>
</resources>

View file

@ -254,4 +254,7 @@
<string name="full_storage_permission_required">Fossify Galeri tüm fotoğraf ve videolarınızı görüntülemek için tam erişime ihtiyaç duyar. Ayarlar &gt; İzinler &gt; Fotoğraf ve videolar &gt; Tümüne izin ver bölümüne gidin.</string>
<string name="playback_speed">Oynatma hızı</string>
<string name="failed_to_load_media">Medya yüklenemedi.</string>
<string name="file_is_malformed_or_corrupted">Dosya hatalı biçimlendirilmiş veya bozuk.</string>
<string name="media_exceeds_device_capabilities">Medya aygıt kapasitesini aşıyor.</string>
<string name="unsupported_format">Desteklenmeyen biçim.</string>
</resources>

View file

@ -256,4 +256,7 @@
<string name="full_storage_permission_required">Галерея Fossify потребує повного доступу, щоб показувати всі ваші фотографії та відео. Перейдіть до Налаштування &gt; Дозволи &gt; Фото та відео &gt; Дозволити все.</string>
<string name="playback_speed">Швидкість відтворення</string>
<string name="failed_to_load_media">Не вдалося завантажити медіа.</string>
<string name="media_exceeds_device_capabilities">Файл перевищує місткість пристрою.</string>
<string name="unsupported_format">Непідтримуваний формат.</string>
<string name="file_is_malformed_or_corrupted">Файл неправильно сформовано або пошкоджено.</string>
</resources>

View file

@ -34,7 +34,7 @@
<string name="reorder_by_dragging_pro">通过拖动重新排列文件夹 (专业版)</string>
<string name="restore_to_path">还原到“%s”</string>
<string name="filter_media">过滤显示的文件</string>
<string name="images"></string>
<string name="images"></string>
<string name="videos">视频</string>
<string name="gifs">GIF</string>
<string name="raw_images">RAW 图像</string>
@ -143,7 +143,7 @@
<string name="by_extension">扩展名</string>
<string name="show_file_count_section_header">在栏目标题上显示文件数</string>
<string name="grouping_and_sorting">请注意:分组和排序是两种相互独立的文件组织方式</string>
<string name="folder_on_widget">显示在件中的文件夹:</string>
<string name="folder_on_widget">显示在件中的文件夹:</string>
<string name="show_folder_name">显示文件夹名称</string>
<string name="autoplay_videos">自动播放视频</string>
<string name="remember_last_video_position">记住视频上一次播放时的位置</string>
@ -253,4 +253,7 @@
<string name="full_storage_permission_required">Fossify 图库需要完全访问权限才能显示您的所有照片和视频。前往“设置”&gt;“权限”&gt;“照片和视频”&gt;“全部允许”。</string>
<string name="playback_speed">播放速度</string>
<string name="failed_to_load_media">加载媒体失败。</string>
</resources>
<string name="unsupported_format">不支持的格式。</string>
<string name="file_is_malformed_or_corrupted">文件格式错误或已损坏。</string>
<string name="media_exceeds_device_capabilities">媒体超出了设备容量。</string>
</resources>

View file

@ -52,9 +52,7 @@
<string name="include_folders">包含資料夾</string>
<string name="manage_included_folders">管理包含的資料夾</string>
<string name="add_folder">新增資料夾</string>
<string name="included_activity_placeholder">如要新增包含媒體文件但未被應用程式辨識的資料夾,可在此處手動新增。
\n
\n新增項目不會排除其他資料夾。</string>
<string name="included_activity_placeholder">如要新增包含媒體檔案但未被應用程式辨識的資料夾,可在此處手動新增。 \n \n新增項目不會排除其他資料夾。</string>
<string name="no_media_add_included">未發現媒體檔案。您可以手動加入包含媒體檔案的資料夾來解決。</string>
<string name="resize_and_save">調整選取項目尺寸並儲存</string>
<string name="width">寬度</string>
@ -210,8 +208,8 @@
<string name="manage_bottom_actions">管理要顯示的底部操作</string>
<string name="toggle_favorite">切換我的最愛</string>
<string name="toggle_file_visibility">檔案顯示</string>
<string name="faq_2_title">用密碼把這個 APP 上鎖後忘記密碼該怎麼辦?</string>
<string name="faq_2_text">有兩種解決方法。一是重新安裝本 APP。一是在裝置的設定中找到本 APP然後按「清除資料」或「清除儲存空間」等類似的字眼APP 的設定將會被重設,但不會移除任何媒體檔案。</string>
<string name="faq_2_title">用密碼把這個 app 上鎖後忘記密碼該怎麼辦?</string>
<string name="faq_2_text">有兩種解決方法。一是重新安裝本 app。一是在裝置的設定中找到本 app然後按「清除資料」或「清除儲存空間」等類似的字眼app 的設定將會被重設,但不會移除任何媒體檔案。</string>
<string name="faq_3_title">如何使某個相簿顯示在最頂端?</string>
<string name="faq_3_text">長按該相簿,接著按圖釘圖示或選單中的「釘選在頂端」。您可以同時釘選數個相簿,它們將會依照預設排序方式排序。</string>
<string name="faq_4_title">如何快轉影片?</string>
@ -223,7 +221,7 @@
<string name="faq_7_text">可能有很多種原因,但解法很簡單。前往「設定」 -&gt; 「管理包含資料夾」、按加號(+)、選擇該資料夾即可。</string>
<string name="faq_8_title">如果只想顯示特定資料夾呢?</string>
<string name="faq_8_text">如果只將某資料夾加入至「包含資料夾」的話,其他的資料夾並不會被自動排除。請前往「設定」-&gt;「管理排除資料夾」、將根資料夾「/」排除,並在「設定」-&gt;「管理包含資料夾」中加入欲顯示的資料夾。 這樣就只會顯示所選的資料夾,因為排除與包含都是遞迴的,所以若某資料夾同時被包含及排除,其將會顯示。</string>
<string name="faq_10_title">這個 APP 可以裁剪圖片嗎?</string>
<string name="faq_10_title">這個 app 可以裁剪圖片嗎?</string>
<string name="faq_10_text">可以,在編輯工具中拖動圖片的角落即可裁剪圖片。對縮圖長按並選擇編輯,或者在全螢幕檢視時選擇編輯皆可進入編輯工具。</string>
<string name="faq_11_title">有辦法分類縮圖嗎?</string>
<string name="faq_11_text">可以,在檢視縮圖時使用選單中的「分組方式」即可,有多種分類方式可供選擇,包含拍攝日期等。若使用了「資料夾內容全部顯示」功能,則也可以依資料夾來分類。</string>
@ -233,7 +231,7 @@
<string name="faq_13_text">目前顯示圖片的方式在大多數情況下都能正常運作,但若想要更好的畫質,可以啟用「設定」-&gt;「可強制放大的圖片」段落中的「以最高品質顯示圖片」。</string>
<string name="faq_14_title">如何取消隱藏檔案/資料夾?</string>
<string name="faq_14_text">按主畫面選單中的「暫時顯示隱藏的檔案」或設定中的「顯示隱藏的項目」就能看到隱藏的項目。若要取消隱藏,長按並選擇「取消隱藏」即可。資料夾隱藏的原理是在其內新增一個「.nomedia」檔案因此可用任意檔案管理器將其刪除。檔案資料夾是以遞迴的方式被隱藏的因此若某資料夾被隱藏其子資料夾也會被隱藏。若要取消隱藏子資料夾其上層資料夾需先被取消隱藏。</string>
<string name="faq_15_title">這個 APP 怎麼佔用了這麼多空間?</string>
<string name="faq_15_title">這個 app 怎麼佔用了這麼多空間?</string>
<string name="faq_15_text">應用程式快取可協助圖片載入更快,最高僅佔 250 MB。如果此應用程式佔用超過 250 MB 空間,可能是回收桶中的檔案仍在佔用空間。您可刪除回收桶中的所有檔案,或在設定中快速清除。檔案進入回收桶的 30 天後將自動刪除。</string>
<string name="faq_16_title">檔案/資料夾隱藏怎麼了?為什麼我看不到隱藏的項目了?</string>
<string name="faq_16_text">自 Android 11 開始,因系統限制,無法隱藏或解除隱藏檔案或資料夾,也無法在相簿 app 中看到已隱藏的項目。請使用檔案管理程式達成上述操作。</string>
@ -253,4 +251,7 @@
<string name="full_storage_permission_required">Fossify 圖庫需要完整存取權限才能顯示您所有的照片與影片。請到「設定」→「隱私權」→「應用程式權限」→「相片和影片」→「一律全部允許」。</string>
<string name="playback_speed">播放速度</string>
<string name="failed_to_load_media">載入媒體失敗。</string>
</resources>
<string name="file_is_malformed_or_corrupted">檔案格式錯誤或損毀。</string>
<string name="media_exceeds_device_capabilities">媒體超出裝置的播放能力。</string>
<string name="unsupported_format">不支援的格式。</string>
</resources>

View file

@ -34,7 +34,6 @@
<string name="reorder_by_dragging_pro">Reorder folders by dragging (Pro)</string>
<string name="restore_to_path">Restoring to \'%s\'</string>
<string name="full_storage_permission_required">Fossify Gallery needs full access to display all your photos and videos. Go to Settings > Permissions > Photos and videos > Allow all.</string>
<string name="failed_to_load_media">Failed to load media.</string>
<!-- Filter -->
<string name="filter_media">Filter media</string>
@ -242,6 +241,12 @@
<string name="toggle_favorite">Toggle favorite</string>
<string name="toggle_file_visibility">Toggle file visibility</string>
<!-- Errors -->
<string name="failed_to_load_media">Failed to load media.</string>
<string name="file_is_malformed_or_corrupted">File is malformed or corrupted.</string>
<string name="media_exceeds_device_capabilities">Media exceeds device capabilities.</string>
<string name="unsupported_format">Unsupported format.</string>
<!-- FAQ -->
<string name="faq_1_title">How can I make Fossify Gallery the default device gallery?</string>
<string name="faq_1_text">First you have to find the currently default gallery in the Apps section of your device settings, look for a button that says something like \"Open by default\", click on it, then select \"Clear defaults\".

View file

@ -2,4 +2,5 @@ plugins {
alias(libs.plugins.android).apply(false)
alias(libs.plugins.kotlinAndroid).apply(false)
alias(libs.plugins.ksp).apply(false)
alias(libs.plugins.detekt).apply(false)
}

View file

@ -0,0 +1,27 @@
Разкрийте спомени, не лични данни. Fossify Gallery е страхотно приложение за снимки и видеоклипове мощно и напълно поверително. Без реклами, без излишни права само безпроблемно изживяване, създадено за вас.
🖼️ ФОТО РЕДАКТИРАНЕ НА ВЪРХА НА ПРЪСТИТЕ ВИ
Подобрете снимките си с обикновен, но мощен редактор за снимки. Изрязвайте, преоразмерявайте, завъртайте, обръщайте, рисувайте и прилагайте зашеметяващи филтри, всичко това без компромис с поверителността. Вземете контрола върху спомените си както никога досега.
🌐 ПОВЕРИТЕЛНОСТТА НА ПЪРВО МЯСТО, ВИНАГИ
Вашата поверителност е от значение. Забравете за жадните за данни корпорации. Fossify Gallery ви дава контрол. Премахнете описателните данни на EXIF като GPS координати и данни за камерата, за да останат спомените ви само ваши.
🔒 ВЪРХОВНА СИГУРНОСТ
Защитете спомените си с ПИН, шаблон или пръстов отпечатък. Заключете конкретни снимки, видеоклипове или цялото приложение вие решавате кой има достъп. Спокойствието е гарантирано.
🔄 ЛЕСНО ВЪЗСТАНОВЯВАНЕ
Дишайте спокойно грешки се случват! Вграденото кошче на Fossify Gallery ви позволява да възстановите изтрити снимки и видеа за секунди. Никакви изгубени съкровища, само чисто облекчение.
🎨 ВАШАТА ГАЛЕРИЯ, ВАШИЯТ СТИЛ
Персонализирайте визията, усещането и функциите според вашия стил. От теми на интерфейса до функционални бутони Fossify Gallery ви дава свободата да творите.
📷 СВОБОДА НА ФОРМАТИТЕ
JPEG, JPEG XL, PNG, MP4, MKV, RAW, SVG, GIF, видеа и още покриваме всичките ви спомени, независимо от форма̀та. Без ограничения, само безкрайни възможности.
✨ МАТЕРИАЛЕН ДИЗАЙН С ДИНАМИЧНИ ТЕМИ
Насладете се на интуитивен материален дизайн с динамични теми. Искате повече? Разгледайте персонализираните теми и направете галерията си наистина единствена.
Разгледайте още приложения на Fossify: https://www.fossify.org
Отворен изходен код: https://www.github.com/FossifyOrg
Присъединете се към общността в Reddit: https://www.reddit.com/r/Fossify
Свържете се в Telegram: https://t.me/Fossify

View file

@ -0,0 +1 @@
Галерия с редактор на снимки. Свободна, поверителна, без реклами, без уловки.

View file

@ -1 +0,0 @@
Фосифай Галерия

View file

@ -1 +0,0 @@
* S'han afegit algunes traduccions, s'ha corregit l'enllaç a la política de privadesa.

View file

@ -1,2 +0,0 @@
* S'ha corregit el zoom en les imatges d'alta resolució
* S'han afegit algunes traduccions

View file

@ -1,2 +0,0 @@
* S'ha eliminat la biblioteca propietària de panorames
* S'han afegit algunes traduccions

View file

@ -1,2 +0,0 @@
* S'ha eliminat el missatge d'aplicació falsa en fer servir l'editor.
* S'han afegit algunes traduccions

View file

@ -1,6 +0,0 @@
* S'ha corregit una fallada en reproduir vídeos.
* S'ha corregit la presentació de diapositives a l'Android 14.
* S'ha afegit suport per a AVIF.
* S'ha corregit el restabliment de la posició després de girar el dispositiu.
* S'han corregit les captures de pantalla d'ampliació quan s'ha activat un zoom d'un a doble toc.
* S'han afegit traduccions

View file

@ -1,2 +0,0 @@
* S'han corregit les miniatures negres de diverses imatges.
* S'han afegit diverses traduccions

View file

@ -16,7 +16,7 @@ Respireu, hi ha accidents! La paperera de reciclatge integrada de la Galeria Fos
Personalitzeu l'aspecte, el comportament i la funcionalitat perquè coincideixi amb el vostre estil. Des de temes d'interfície d'usuari fins a botons de funció, la Fossify Gallery us dona la llibertat creativa que anheleu.
📷 LLIBERTAT DE FORMATS UNIVERSALS:
JPEG, PNG, MP4, MKV, RAW, SVG, GIF, vídeos i més. Tenim els vostres records coberts, en qualsevol format que trieu. Sense restriccions, només possibilitats il·limitades.
JPEG, JPEG XL, PNG, MP4, MKV, RAW, SVG, GIF, vídeos i més. Tenim els vostres records coberts, en qualsevol format que trieu. Sense restriccions, només possibilitats il·limitades.
✨ MATERIAL DESIGN AMB TEMES DINÀMICS:
Experimenteu la bellesa del «material design» intuïtiu amb temes dinàmics. En voleu més? Submergiu-vos en els temes personalitzats i feu que la galeria sigui realment única.

View file

@ -1 +0,0 @@
Fossify Gallery

View file

@ -1 +0,0 @@
* Added some translations, fixed privacy policy link.

View file

@ -1,2 +0,0 @@
* Fixed zooming in high-res images
* Added some translations

View file

@ -1,2 +0,0 @@
* Removed proprietary panorama library
* Added some translations

View file

@ -1,2 +0,0 @@
* Removed fake app message when using the editor.
* Added some translations

View file

@ -1,6 +0,0 @@
* Opraven pád při přehrávání videa.
* Opravena prezentace na Androidu 14.
* Přidána podpora pro AVIF.
* Opraveno obnovení pozice po otočení zařízení.
* Opraveno zvětšování snímků obrazovky při zapnutém přiblížení jedním až dvěma klepnutími.
* Přidány některé překlady

View file

@ -1,2 +0,0 @@
* Opraveny černé náhledy u některých obrázků.
* Přidány překlady

View file

@ -1 +0,0 @@
Galerie Fossify

View file

@ -1 +0,0 @@
Galleri med fotoredigering. Ingen reklamer, Open Source, Privat. Ingen bindinger.

View file

@ -1 +0,0 @@
Fossify Galleri

View file

@ -1 +0,0 @@
* Einige Übersetzungen hinzugefügt, Link zur Datenschutzrichtlinie korrigiert.

View file

@ -1,2 +0,0 @@
* Das Zoomen in hochauflösenden Bildern korrigiert.
* Einige Übersetzungen hinzugefügt

View file

@ -1,2 +0,0 @@
* Proprietäre Panorama-Bibliothek entfernt
* Einige Übersetzungen hinzugefügt

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