259 Commits
Author SHA1 Message Date
fossifybot[bot] c55d685022 chore(release): v1.3.1 (9) (#284)
Co-authored-by: fossifybot[bot] <212866877+fossifybot[bot]@users.noreply.github.com>
2025-10-09 22:05:39 +05:30
Naveen Singh 1e2e304f70 chore(deps): bump org.fossify.commons to 5.3.0 (#288) 2025-10-09 21:29:59 +05:30
cat e0b1e884ce chore(l10n): update Danish translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/da/
Via: Weblate
2025-10-09 21:26:14 +05:30
hosêyň abāspanā dfd73bddd0 chore(l10n): update Luri (Bakhtiari) translations
Currently translated at 6.8% (3 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/bqi/
Via: Weblate
2025-10-09 21:26:14 +05:30
cat a88355c9ad chore(l10n): update Danish translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/da/
Via: Weblate
2025-10-09 21:26:14 +05:30
Dan e6593a5c6b chore(l10n): update Ukrainian translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/uk/
Via: Weblate
2025-10-09 21:26:14 +05:30
hosêyň abāspanā 880f383e76 feat(l10n): add Luri (Bakhtiari) translations
Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/bqi/
Via: Weblate
2025-10-09 21:26:14 +05:30
Naveen Singh ab31c828a1 fix: filter out files from hidden folders in storage (#283)
Refs: https://github.com/FossifyOrg/File-Manager/issues/217, https://github.com/FossifyOrg/File-Manager/issues/33
2025-10-02 12:10:47 +05:30
fossifybot[bot] f71a4b7f55 chore: update lint baselines (#282)
Co-authored-by: fossifybot[bot] <212866877+fossifybot[bot]@users.noreply.github.com>
2025-10-01 09:13:51 +05:30
fossifybot[bot] c2482ee5dc chore(release): v1.3.0 (8) (#269) 2025-09-30 15:14:23 +05:30
alanfox2000software de5b6da9d5 chore(l10n): update Chinese (Traditional Han script, Hong Kong) translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/zh_Hant_HK/
Via: Weblate
2025-09-30 15:02:49 +05:30
alanfox2000software 4812bc8d4b chore(l10n): update Chinese (Traditional Han script) translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/zh_Hant/
Via: Weblate
2025-09-30 15:02:49 +05:30
alanfox2000software 3ec4591b58 chore(l10n): update Chinese (Traditional Han script) translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/zh_Hant/
Via: Weblate
2025-09-30 15:02:49 +05:30
alanfox2000software d11a710106 chore(l10n): update Chinese (Traditional Han script, Hong Kong) translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/zh_Hant_HK/
Via: Weblate
2025-09-30 15:02:49 +05:30
alanfox2000software 2cf0fdf7d1 chore(l10n): update Chinese (Traditional Han script) translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/zh_Hant/
Via: Weblate
2025-09-30 15:02:49 +05:30
ovl-1 25fe232c27 chore(l10n): update Norwegian Bokmål translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/nb_NO/
Via: Weblate
2025-09-30 15:02:49 +05:30
IgorTrp f733553ff3 chore(l10n): update Serbian translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/sr/
Via: Weblate
2025-09-30 15:02:49 +05:30
JanandJan Guegel 5b278f6e4a fix: filter out files from hidden folders in recents (#279)
* fix catch files in hidden folders in recent tab

Signed-off-by: Jan Guegel <jan@guegel.eu>

* adjust changelog

Signed-off-by: Jan Guegel <jan@guegel.eu>

* include getDoesFilePathExist check, just to be sure

Signed-off-by: Jan Guegel <jan@guegel.eu>

* apply Code Review suggestions

---------

Signed-off-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Jan Guegel <jan@guegel.eu>

Refs: https://github.com/FossifyOrg/File-Manager/issues/217
2025-09-30 14:58:54 +05:30
fec28af74f fix: search now ignores accents and diacritics (#274)
* compare normalized search and items to ignore accents and diacritics

* Update CHANGELOG.md

* compare normalized search and items to ignore accents and diacritics

* Update CHANGELOG.md

* fix change print enconding to base64 #104

Signed-off-by: Jan Guegel <jan@guegel.eu>

* ops.. wrong branch..

Signed-off-by: Jan Guegel <jan@guegel.eu>

* Update CHANGELOG.md

* Update CHANGELOG.md

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* use normalizeString() from commons libs

Signed-off-by: Jan Guegel <jan@guegel.eu>

* use normalizeString() from commons libs also for recentsfragmen

Signed-off-by: Jan Guegel <jan@guegel.eu>

* Apply suggestions from code review

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* use normalizeString() for StorageFragment

Signed-off-by: Jan Guegel <jan@guegel.eu>

* fix last usage of contains() without normalizeString in search context
fix missing expection toast

Signed-off-by: Jan Guegel <jan@guegel.eu>

* remove Toast from loop

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

---------

Signed-off-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

Refs: https://github.com/FossifyOrg/File-Manager/issues/95
2025-09-30 14:53:51 +05:30
dependabot[bot] eb4d38d25a chore(deps): bump org.fossify:commons from 5.1.1 to 5.2.0 (#278)
Bumps org.fossify:commons from 5.1.1 to 5.2.0.

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 5.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-30 10:14:04 +05:30
JanandJan Guegel 8647071c66 feat: add save as in menu in text editor (#277)
* add save as in menu
rename saveText to saveAsText()
add new save() without confirmation

Signed-off-by: Jan Guegel <jan@guegel.eu>

* fix icon of new menuItem to ic_save_vector

Signed-off-by: Jan Guegel <jan@guegel.eu>

* apply CodeReview input
getFilePath to updateFilePath
menuItem SaveAs never displayed with icon
backButtonPressed now uses Save without confirmation

Signed-off-by: Jan Guegel <jan@guegel.eu>

* fix catch filePath.isEmpty() by opening SaveAs Dialog

Signed-off-by: Jan Guegel <jan@guegel.eu>

---------

Signed-off-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Jan Guegel <jan@guegel.eu>

Refs: https://github.com/FossifyOrg/File-Manager/issues/224
2025-09-29 21:14:02 +05:30
630d7b2cea fix: avoid truncated prints (#275)
* fix change print enconding to base64 #104

Signed-off-by: Jan Guegel <jan@guegel.eu>

* Update CHANGELOG.md

* Update CHANGELOG.md

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* use ensureBackgroundThread to avoid ANR on large files

Signed-off-by: Jan Guegel <jan@guegel.eu>

---------

Signed-off-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>
2025-09-28 13:17:40 +05:30
223e644f36 fix: request permission in SaveAsActivity on first-run (#271)
* Fix "Replace characters on save as function, FileNotFoundException" #250

* Update CHANGELOG.md

update changelog

* Update app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* Update CHANGELOG.md

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* Update CHANGELOG.md

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* Merge branch 'FossifyOrg:main' into main

Signed-off-by: Jan Guegel <jan@guegel.eu>

* Update CHANGELOG.md

* fix PR Feedback

Signed-off-by: Jan Guegel <jan@guegel.eu>

* fix duplicated code by moving it to SimpleActivity.kt

Signed-off-by: Jan Guegel <jan@guegel.eu>

* moved handleStoragePermissions() to SimpleActivity.kt from MainActivity.kt
introduced tryInitFileManager() to SaveAsActivity.kt
removed const MANAGE_STORAGE_RC from MainActivity.kt

Signed-off-by: Jan Guegel <jan@guegel.eu>

* adjusted toast in try catch in storage permission action

Signed-off-by: Jan Guegel <jan@guegel.eu>

* catch ActivityNotFoundException with fallback of SecurityException

Signed-off-by: Jan Guegel <jan@guegel.eu>

* Apply suggestions from code review

thanks for the feedback!

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* remove indent

Signed-off-by: Jan Guegel <jan@guegel.eu>

* adjust changelog

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

---------

Signed-off-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

Refs: https://github.com/FossifyOrg/File-Manager/issues/85
2025-09-27 13:15:56 +05:30
055bfbd3b8 fix: sanitize filenames before saving (#270)
* Fix "Replace characters on save as function, FileNotFoundException" #250

* Update CHANGELOG.md

update changelog

* Update app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* Update CHANGELOG.md

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* Update CHANGELOG.md

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

---------

Co-authored-by: Jan Guegel <jan@guegel.eu>
Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

Refs: https://github.com/FossifyOrg/File-Manager/issues/250
2025-09-26 12:28:58 +05:30
Naveen Singh ceb7a5f2a2 fix: update changelog and commons (#268)
* fix: update changelog

* chore(deps): bump org.fossify:commons to 5.1.0

* chore(deps): update commons again
2025-09-25 20:50:02 +05:30
dependabot[bot] 20aee9162d chore(deps): bump rexml from 3.4.1 to 3.4.2 (#264)
Bumps [rexml](https://github.com/ruby/rexml) from 3.4.1 to 3.4.2.
- [Release notes](https://github.com/ruby/rexml/releases)
- [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/rexml/compare/v3.4.1...v3.4.2)

---
updated-dependencies:
- dependency-name: rexml
  dependency-version: 3.4.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 10:31:36 +05:30
fossifybot[bot]andNaveen Singh 7a5f797a2a chore(release): v1.2.3 (7) (#262)
* chore(release): v1.2.3 (7)

* docs: remove translations entry

Removed outdated changelog entries and clarified fixes.

* docs: remove translations entry

---------

Co-authored-by: fossifybot[bot] <212866877+fossifybot[bot]@users.noreply.github.com>
Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>
2025-09-17 10:38:43 +05:30
dependabot[bot] 10a83a18b1 chore(deps): bump org.jetbrains.kotlin.android from 2.2.10 to 2.2.20 (#263)
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 2.2.10 to 2.2.20.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.2.10...v2.2.20)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-version: 2.2.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-16 16:04:46 +05:30
Naveen Singh fb3384fb08 fix: trust the system to check whether a file is a directory (#261)
Condition was originally introduced in 12b96e159d

Refs: https://github.com/FossifyOrg/File-Manager/issues/80
2025-09-15 10:33:51 +05:30
Naveen Singh 666c8d8c53 docs: fix broken discussion links in issue templates (#260) 2025-09-11 18:37:27 +05:30
Naveen Singh 8c711104ed chore(release): v1.2.2 (6) (#259) 2025-09-01 20:07:22 +05:30
fossifybot[bot] e7186a9c79 chore(release): v1.2.1 (5) (#254)
Co-authored-by: fossifybot[bot] <212866877+fossifybot[bot]@users.noreply.github.com>
2025-09-01 13:45:22 +00:00
dependabot[bot] 55eff8a6ae chore(deps): bump org.fossify:commons from 5.0.0 to 5.0.2 (#258)
Bumps [org.fossify:commons](https://github.com/FossifyOrg/commons) from 5.0.0 to 5.0.2.
- [Commits](https://github.com/FossifyOrg/commons/compare/5.0.0...5.0.2)

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 5.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-01 19:11:16 +05:30
Matheus Campos 8b76e7f28a chore(l10n): update Spanish (American) translations
Currently translated at 6.8% (3 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/es_US/
Via: Weblate
2025-09-01 19:04:31 +05:30
GaucovyAero 0bee809420 chore(l10n): update Slovak translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/sk/
Via: Weblate
2025-09-01 19:04:31 +05:30
Kfir Pshititsky 2b51c3f2fa chore(l10n): update Hebrew translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/he/
Via: Weblate
2025-09-01 19:04:31 +05:30
Kfir Pshititsky 1b03d62494 chore(l10n): update Hebrew translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/he/
Via: Weblate
2025-09-01 19:04:31 +05:30
fossifybot[bot] e9ecfe53a4 chore: update lint baselines (#256)
Co-authored-by: fossifybot[bot] <212866877+fossifybot[bot]@users.noreply.github.com>
2025-09-01 10:01:03 +05:30
Naveen Singh da8202ee2d fix: set progress after computing total size (#253)
Refs: https://github.com/FossifyOrg/File-Manager/issues/251
2025-08-26 02:26:13 +05:30
Naveen Singh 31d4fdbf4f refactor(settings): remove color customization lock and add thank you button (#252) 2025-08-25 04:02:37 +05:30
Naveen Singh f68fe061e0 chore(deps): downgrade com.android.application from 8.12.0 to 8.11.1 (#249) 2025-08-22 04:57:19 +05:30
Naveen Singh f24a8089d2 docs: redirect questions to general discussions (#247) 2025-08-20 16:16:40 +05:30
dependabot[bot] 1571214647 chore(deps): bump org.jetbrains.kotlin.android from 2.2.0 to 2.2.10 (#246)
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 2.2.0 to 2.2.10.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.2.0...v2.2.10)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-version: 2.2.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-18 22:39:18 +05:30
dependabot[bot] 5da4a63e8d chore(deps): bump org.fossify:commons from 4.3.0 to 4.4.2 (#243)
Bumps [org.fossify:commons](https://github.com/FossifyOrg/commons) from 4.3.0 to 4.4.2.
- [Commits](https://github.com/FossifyOrg/commons/compare/4.3.0...4.4.2)

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 4.4.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-09 22:57:58 +05:30
dependabot[bot] aeb8977a77 chore(deps): bump io.nlopez.compose.rules:detekt from 0.4.25 to 0.4.27 (#244)
Bumps [io.nlopez.compose.rules:detekt](https://github.com/mrmans0n/compose-rules) from 0.4.25 to 0.4.27.
- [Release notes](https://github.com/mrmans0n/compose-rules/releases)
- [Commits](https://github.com/mrmans0n/compose-rules/compare/v0.4.25...v0.4.27)

---
updated-dependencies:
- dependency-name: io.nlopez.compose.rules:detekt
  dependency-version: 0.4.27
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-09 22:55:05 +05:30
dependabot[bot] 0b93fcbb3e chore(deps): bump com.android.application from 8.11.1 to 8.12.0 (#245)
Bumps com.android.application from 8.11.1 to 8.12.0.

---
updated-dependencies:
- dependency-name: com.android.application
  dependency-version: 8.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-09 22:51:12 +05:30
fossifybot[bot] 39f9b00f6a chore: update lint baselines (#242)
Co-authored-by: fossifybot[bot] <212866877+fossifybot[bot]@users.noreply.github.com>
2025-08-01 09:16:47 +05:30
dependabot[bot] cfc1a89300 chore(deps): bump io.nlopez.compose.rules:detekt from 0.4.22 to 0.4.25 (#238)
Bumps [io.nlopez.compose.rules:detekt](https://github.com/mrmans0n/compose-rules) from 0.4.22 to 0.4.25.
- [Release notes](https://github.com/mrmans0n/compose-rules/releases)
- [Commits](https://github.com/mrmans0n/compose-rules/compare/v0.4.22...v0.4.25)

---
updated-dependencies:
- dependency-name: io.nlopez.compose.rules:detekt
  dependency-version: 0.4.25
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 22:42:18 +05:30
dependabot[bot] 5e8cd437d2 chore(deps): bump org.fossify:commons from 4.2.0 to 4.3.0 (#234)
Bumps [org.fossify:commons](https://github.com/FossifyOrg/commons) from 4.2.0 to 4.3.0.
- [Commits](https://github.com/FossifyOrg/commons/compare/4.2.0...4.3.0)

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-14 23:44:40 +05:30
dependabot[bot] 3832e9db5d chore(deps): bump com.android.application from 8.11.0 to 8.11.1 (#233)
Bumps com.android.application from 8.11.0 to 8.11.1.

---
updated-dependencies:
- dependency-name: com.android.application
  dependency-version: 8.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-14 22:45:52 +05:30
fossifybot[bot] 1f61e17fd3 chore(release): v1.2.0 (4) (#210)
Co-authored-by: fossifybot[bot] <212866877+fossifybot[bot]@users.noreply.github.com>
2025-07-12 16:56:47 +05:30
Quentin PAGÈS 259d185b95 chore(l10n): update Occitan translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/oc/
Via: Weblate
2025-07-12 16:12:30 +05:30
Quentin PAGÈS c69d10b8fe chore(l10n): update French translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/fr/
Via: Weblate
2025-07-12 16:12:30 +05:30
Quentin PAGÈS 21637a6d8a chore(l10n): update Occitan translations
Currently translated at 81.8% (36 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/oc/
Via: Weblate
2025-07-12 16:12:30 +05:30
Ismail Choudhury ac4be152ed chore(l10n): update English (United Kingdom) translations
Currently translated at 2.2% (1 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/en_GB/
Via: Weblate
2025-07-12 16:12:30 +05:30
Quentin PAGÈS e52a9bc776 feat(l10n): add Occitan translations
Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/oc/
Via: Weblate
2025-07-12 16:12:30 +05:30
jonnysemon 1066344336 chore(l10n): update Arabic translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/ar/
Via: Weblate
2025-07-12 16:12:30 +05:30
jonnysemon d8500c0c2a chore(l10n): update Arabic translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ar/
Via: Weblate
2025-07-12 16:12:30 +05:30
AND 81276fe6c0 chore(l10n): update Macedonian translations
Currently translated at 4.5% (2 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/mk/
Via: Weblate
2025-07-12 16:12:30 +05:30
Naveen Singh 70ad7a07bc chore(l10n): update Portuguese (Brazil) translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/pt_BR/
Via: Weblate
2025-07-12 16:12:30 +05:30
Petri Hämäläinen ec0f0f7893 chore(l10n): update Finnish translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/fi/
Via: Weblate
2025-07-12 16:12:30 +05:30
Oasis Tri c2953276e2 chore(l10n): update French translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/fr/
Via: Weblate
2025-07-12 16:12:30 +05:30
elid 0b208bf63b chore(l10n): update Hebrew translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/he/
Via: Weblate
2025-07-12 16:12:30 +05:30
Naveen Singh 141010a523 fix: save timestamp when compressing items (#232)
* fix: save timestamp when compressing items

See: https://github.com/FossifyOrg/File-Manager/issues/189

* style: reformat code

* chore: update baselines

* docs: update changelog
2025-07-12 15:58:50 +05:30
dependabot[bot]andNaveen Singh 8d2a67dc50 chore(deps): bump com.android.application from 8.10.1 to 8.11.0 (#223)
* chore(deps): bump com.android.application from 8.10.1 to 8.11.0

Bumps com.android.application from 8.10.1 to 8.11.0.

---
updated-dependencies:
- dependency-name: com.android.application
  dependency-version: 8.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(deps): update gradle wrapper

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Naveen Singh <snaveen935@gmail.com>
2025-07-07 20:11:36 +05:30
dependabot[bot] 0172a2517b chore(deps): bump org.fossify:commons from 4.1.0 to 4.2.0 (#230)
Bumps org.fossify:commons from 4.1.0 to 4.2.0.

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-04 21:19:27 +05:30
Naveen Singh 986d7d5215 feat: handle ACTION_OPEN_DOCUMENT intent (#229)
See: https://github.com/FossifyOrg/File-Manager/issues/213
2025-07-04 20:36:50 +05:30
Naveen Singh 769c0dbb6a chore: ignore extra translations and update detekt rules
* chore: ignore extra translations in lint

Extra translations are removed automatically by Weblate

* chore: update detekt rules

More compose-friendly

* chore: update lint baselines
2025-07-03 21:16:27 +05:30
dependabot[bot] 7d1f4c5eed chore(deps): bump org.fossify:commons from 4.0.0 to 4.1.0 (#222)
Bumps [org.fossify:commons](https://github.com/FossifyOrg/commons) from 4.0.0 to 4.1.0.
- [Commits](https://github.com/FossifyOrg/commons/compare/4.0.0...4.1.0)

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-01 17:26:22 +05:30
Naveen Singh 1d16ff7505 chore(deps): bump RootTools to 965c154e20 (#227) 2025-07-01 17:17:20 +05:30
Naveen Singh e2b73dd6e7 chore(deps): switch to naveensingh/RootShell (#226)
Just another ancient relic that needed resurrection.
2025-07-01 16:56:57 +05:30
dependabot[bot]andNaveen Singh 24122e36f8 chore(deps): bump org.fossify:commons from 3.0.5 to 4.0.0 (#215)
* chore(deps): bump org.fossify:commons from 3.0.5 to 4.0.0

Bumps [org.fossify:commons](https://github.com/FossifyOrg/commons) from 3.0.5 to 4.0.0.
- [Commits](https://github.com/FossifyOrg/commons/compare/3.0.5...4.0.0)

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix(i18n): generate locale config automatically

One can be maintained in-app if missing translations become a problem.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Naveen Singh <snaveen935@gmail.com>
2025-06-25 15:45:35 +05:30
dependabot[bot] 9ad80710e8 chore(deps): bump org.jetbrains.kotlin.android from 2.1.21 to 2.2.0 (#216)
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 2.1.21 to 2.2.0.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v2.2.0/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.1.21...v2.2.0)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-24 16:35:58 +05:30
Naveen Singh 6c87991332 chore: update lint rules and baselines (#218) 2025-06-24 16:08:05 +05:30
dependabot[bot] 467021f8c1 chore(deps): bump org.fossify:commons from 3.0.3 to 3.0.5 (#212)
Bumps [org.fossify:commons](https://github.com/FossifyOrg/commons) from 3.0.3 to 3.0.5.
- [Commits](https://github.com/FossifyOrg/commons/compare/3.0.3...3.0.5)

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 3.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-17 19:07:39 +05:30
dependabot[bot] 96c6e28800 chore(deps): bump fastlane from 2.227.2 to 2.228.0 (#211)
Bumps [fastlane](https://github.com/fastlane/fastlane) from 2.227.2 to 2.228.0.
- [Release notes](https://github.com/fastlane/fastlane/releases)
- [Changelog](https://github.com/fastlane/fastlane/blob/master/CHANGELOG.latest.md)
- [Commits](https://github.com/fastlane/fastlane/compare/fastlane/2.227.2...fastlane/2.228.0)

---
updated-dependencies:
- dependency-name: fastlane
  dependency-version: 2.228.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-16 20:46:38 +05:30
Naveen Singh 21e2ab1510 docs(changelog): add translations entry (#209) 2025-06-09 20:08:15 +05:30
Naveen Singh 9ffeb94a35 ci: add fastlane metadata validation and update release trigger
* ci: auto trigger release pull requests when on changelog update

* chore: add code owners

* ci: add fastlane metadata validation
2025-06-09 14:48:47 +05:30
dependabot[bot] 5738639e97 chore(deps): bump org.fossify:commons from 3.0.0 to 3.0.3 (#204)
Bumps org.fossify:commons from 3.0.0 to 3.0.3.

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-07 15:18:28 +05:30
Naveen Singh 32aeae6b38 ci: update release workflows 2025-06-06 20:43:23 +05:30
elid 416cf9675a chore(l10n): update Hebrew translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/he/
Via: Weblate
2025-06-06 18:43:17 +05:30
mastoduy 4e0b5ba7b6 chore(l10n): update Vietnamese translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/vi/
Via: Weblate
2025-06-06 18:43:17 +05:30
mastoduy d3fe0f8bc4 chore(l10n): update Vietnamese translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/vi/
Via: Weblate
2025-06-06 18:43:17 +05:30
Vaclovas Intas 8151b2dd00 chore(l10n): update Lithuanian translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/lt/
Via: Weblate
2025-06-06 18:43:17 +05:30
elid f9f37718de chore(l10n): update Hebrew translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/he/
Via: Weblate
2025-06-06 18:43:17 +05:30
Bora Atıcı ba605b59e3 chore(l10n): update Turkish translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/tr/
Via: Weblate
2025-06-06 18:43:17 +05:30
abdelbasset jabrane bd7d2204ee chore(l10n): update Arabic translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ar/
Via: Weblate
2025-06-06 18:43:17 +05:30
dependabot[bot] d8720bb355 chore(deps): bump org.fossify:commons from 2.0.1 to 3.0.0 (#203)
Bumps org.fossify:commons from 2.0.1 to 3.0.0.

---
updated-dependencies:
- dependency-name: org.fossify:commons
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-02 19:42:12 +05:30
dependabot[bot] f23a4925a7 chore(deps): bump com.android.application from 8.10.0 to 8.10.1 (#198)
Bumps com.android.application from 8.10.0 to 8.10.1.

---
updated-dependencies:
- dependency-name: com.android.application
  dependency-version: 8.10.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-29 12:42:09 +05:30
Naveen Singh 30dd2397a2 ci(dependabot): add jitpack registry for gradle 2025-05-29 11:47:39 +05:30
Flavio F. M 9dad0da353 chore(l10n): update Portuguese (Brazil) translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/pt_BR/
Via: Weblate
2025-05-26 15:15:51 +05:30
109247019824 6f96f85d1a chore(l10n): update Bulgarian translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/bg/
Via: Weblate
2025-05-26 15:15:51 +05:30
Yurt Page 27acc647d8 chore(l10n): update Russian translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/ru/
Via: Weblate
2025-05-26 15:15:51 +05:30
Yurt Page f3c01f4846 chore(l10n): update Russian translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ru/
Via: Weblate
2025-05-26 15:15:51 +05:30
elid 33b783bf3c chore(l10n): update Hebrew translations
Currently translated at 100.0% (2 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/he/
Via: Weblate
2025-05-26 15:15:51 +05:30
elid 45f9b5c261 chore(l10n): update Hebrew translations
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/he/
Via: Weblate
2025-05-26 15:15:51 +05:30
Naveen Singh ea082d2dd1 build: move app version to gradle.properties (#193) 2025-05-26 14:16:19 +05:30
Timur Erofeev ef23996ced fix: preserve timestamps when decompressing ZIP files
* Preserve modified date when unzip files.

* Preserve modified date when unzip files via actions menu

- Additionally handle the case with 0 last modified time.
2025-05-25 07:50:35 +05:30
Naveen Singh 68aec3ac61 ci: use fossifybot github app token 2025-05-22 19:34:56 +05:30
dependabot[bot] 93893ce919 chore(deps): bump io.gitlab.arturbosch.detekt from 1.23.3 to 1.23.8 (#161)
Bumps [io.gitlab.arturbosch.detekt](https://github.com/detekt/detekt) from 1.23.3 to 1.23.8.
- [Release notes](https://github.com/detekt/detekt/releases)
- [Commits](https://github.com/detekt/detekt/compare/v1.23.3...v1.23.8)

---
updated-dependencies:
- dependency-name: io.gitlab.arturbosch.detekt
  dependency-version: 1.23.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-22 09:21:38 +05:30
dependabot[bot]andNaveen Singh 222995b4b6 chore(deps): bump org.jetbrains.kotlin.android from 1.9.25 to 2.1.21 (#175)
* chore(deps): bump org.jetbrains.kotlin.android from 1.9.25 to 2.1.21

Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.9.25 to 2.1.21.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.25...v2.1.21)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-version: 2.1.21
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* build: update archives name property to use archivesBaseName

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Naveen Singh <snaveen935@gmail.com>
2025-05-22 09:21:20 +05:30
Naveen Singh 626497acc5 chore(release): remove invalid metadata (#183) 2025-05-21 14:38:09 +05:30
Naveen Singh cb1cd83f50 chore(release): bump app version to 1.1.0 (3) (#182) 2025-05-21 14:24:42 +05:30
elid 0548e07f21 chore(l10n): update Hebrew translations
Currently translated at 50.0% (1 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/he/
Via: Weblate
2025-05-21 14:18:47 +05:30
Naveen Singh 94924bd19c chore(deps): bump org.fossify.commons to 2.0.1 (#181) 2025-05-21 14:02:25 +05:30
19f0a2ad35 fix: resolve proper filename when saving a shared file (#86)
* Fix filename when saving a shared file

Previously, the code used the last path component of the content URI,
but that isn't necessarily the filename -- it can be a numeric ID.

Switch to the helper function getFilenameFromContentUri(), which uses
ContentResolver to read the DISPLAY_NAME column. (If that fails, we
fall back to the last component of the content URI as before, because
we don't have anything better to use.)

Also improve the way the MIME type is determined. Previously it was
just based on the file extension. Switch to first query the
ContentResolver, then try the type of the Intent (which is supposed to
be set to the MIME type of the data for ACTION_SEND, but may be set to
"*/*" if the type is unknown), and only then fall back to using the
file extension.

Fixes #37.

* style: shorten lines

---------

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>
Co-authored-by: Naveen Singh <snaveen935@gmail.com>
2025-05-21 12:03:10 +05:30
97dcf30b47 fix: save state when rotating screen (#111)
* Fixed Text File Editor losing unsaved changes when rotating screen

* style: replace state variable with constant

---------

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>
Co-authored-by: Naveen Singh <snaveen935@gmail.com>
2025-05-21 11:45:09 +05:30
Agnieszka CandNaveen Singh 5dae7f82f5 fix: allow editing JSON files (#105)
Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>
2025-05-21 10:50:54 +05:30
dependabot[bot] b302495c30 chore(deps): bump com.alexvasilkov:gesture-views from 2.5.2 to 2.8.3 (#159)
Bumps [com.alexvasilkov:gesture-views](https://github.com/alexvasilkov/GestureViews) from 2.5.2 to 2.8.3.
- [Release notes](https://github.com/alexvasilkov/GestureViews/releases)
- [Commits](https://github.com/alexvasilkov/GestureViews/compare/v2.5.2...v2.8.3)

---
updated-dependencies:
- dependency-name: com.alexvasilkov:gesture-views
  dependency-version: 2.8.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 19:21:24 +05:30
dependabot[bot] 747d4b5b43 chore(deps): bump androidx.documentfile:documentfile from 1.0.1 to 1.1.0 (#166)
Bumps androidx.documentfile:documentfile from 1.0.1 to 1.1.0.

---
updated-dependencies:
- dependency-name: androidx.documentfile:documentfile
  dependency-version: 1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 19:04:53 +05:30
dependabot[bot] 1f8f779ed1 chore(deps): bump com.android.application from 8.9.2 to 8.10.0 (#164)
Bumps com.android.application from 8.9.2 to 8.10.0.

---
updated-dependencies:
- dependency-name: com.android.application
  dependency-version: 8.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 19:04:27 +05:30
68c00dc3c0 fix(ui): prevent SwipeRefreshLayout from intercepting child touch events (#173)
* Fix accidental rendering of swipe refresh indicator.

* Fix scroll up in Files tab.

* Update app/src/main/kotlin/org/fossify/filemanager/views/MySwipeRefreshLayout.kt

Fix grammar after copy paste.

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>

* docs(changelog): add links

---------

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>
Co-authored-by: Naveen Singh <snaveen935@gmail.com>
2025-05-20 19:02:15 +05:30
Naveen Singh 2fe8b22fd4 fix: enable pull-to-refresh based on preference (#177)
See: https://github.com/FossifyOrg/File-Manager/issues/136
2025-05-20 09:27:29 +05:30
Naveen Singh 2c0e31cdcf docs(templates): remove local PR template 2025-05-15 00:49:02 +05:30
Agnieszka C 8df0412e11 fix: use zip file name when decompressing directory (#120) 2025-05-14 23:22:18 +05:30
Agnieszka C 25cfd43655 fix: restore temporarilyShowHidden flag on startup (#169) 2025-05-14 23:12:48 +05:30
Naveen Singh 73e9080b67 feat(ui): replace checkboxes with material switches (#170)
* feat(ui): replace checkboxes with material switches

See: https://github.com/orgs/FossifyOrg/discussions/78

* docs(changelog): replace checkboxes with switches
2025-05-14 16:55:46 +05:30
Naveen Singh 581d56ffdc ci: add release commenter and pr labeler workflows 2025-05-13 18:01:05 +05:30
dependabot[bot] c1f7169332 chore(deps): bump fastlane-plugin-fossify from 1.0.0 to 1.0.2 (#167)
Bumps fastlane-plugin-fossify from 1.0.0 to 1.0.2.

---
updated-dependencies:
- dependency-name: fastlane-plugin-fossify
  dependency-version: 1.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-12 19:44:15 +05:30
Naveen Singh 482cfeda68 ci: update dependabot config to handle github actions 2025-05-07 18:17:23 +05:30
Naveen Singh d76a33730f ci: update dependabot config to handle github actions (#163) 2025-05-07 17:49:51 +05:30
abdelbasset jabrane 6e97c28536 Translated using Weblate (Arabic)
Currently translated at 79.5% (35 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ar/
2025-05-07 08:42:15 +05:30
LucasMZ 699e3ec836 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/pt_BR/
2025-05-07 08:42:15 +05:30
solokot 31e7920991 Translated using Weblate (Russian)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ru/
2025-05-07 08:42:15 +05:30
Romeostar 991a99a46e Translated using Weblate (Russian)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ru/
2025-05-07 08:42:15 +05:30
Roman 72cd81e24c Translated using Weblate (Russian)
Currently translated at 50.0% (1 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/ru/
2025-05-07 08:42:15 +05:30
Roman bdc8d9c6ab Translated using Weblate (Russian)
Currently translated at 50.0% (1 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/ru/
2025-05-07 08:42:15 +05:30
cat 6a786d5f25 Translated using Weblate (Danish)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/da/
2025-05-07 08:42:15 +05:30
LaKato e1ca6d77f4 Translated using Weblate (Esperanto)
Currently translated at 50.0% (1 of 2 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/eo/
2025-05-07 08:42:15 +05:30
dependabot[bot] 97db302e2e chore(deps): bump fastlane from 2.227.1 to 2.227.2 (#160)
Bumps [fastlane](https://github.com/fastlane/fastlane) from 2.227.1 to 2.227.2.
- [Release notes](https://github.com/fastlane/fastlane/releases)
- [Changelog](https://github.com/fastlane/fastlane/blob/master/CHANGELOG.latest.md)
- [Commits](https://github.com/fastlane/fastlane/compare/fastlane/2.227.1...fastlane/2.227.2)

---
updated-dependencies:
- dependency-name: fastlane
  dependency-version: 2.227.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-06 05:26:14 -04:00
dependabot[bot] ea767df3c0 chore(deps): bump com.android.application from 8.9.0 to 8.9.2 (#162)
Bumps com.android.application from 8.9.0 to 8.9.2.

---
updated-dependencies:
- dependency-name: com.android.application
  dependency-version: 8.9.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-06 05:25:53 -04:00
Naveen Singh d0f7e96a84 ci: add dependabot config 2025-05-05 19:45:16 +05:30
Naveen Singh 5bbe0b59e0 build: allow builds without signing configuration 2025-05-05 19:45:16 +05:30
Naveen Singh 00dd6f4500 ci: setup release workflow 2025-05-05 19:45:16 +05:30
Naveen Singh 9f81ce77c2 style: reformat changelogs as per Keep a Changelog 2025-05-05 19:45:16 +05:30
Naveen Singh 742d63af2b build: use env variables for release signing fallback 2025-05-05 19:45:16 +05:30
Naveen Singh df9249f989 refactor(build): rename prepaid product flavor to gplay 2025-05-05 19:45:16 +05:30
Naveen Singh 0490de7627 chore: setup fastlane 2025-05-05 19:45:16 +05:30
Naveen Singh a0c87edc3e Merge pull request #152 from papjul/open_data_obb_system_app
Open data/obb folder in system app on Android 14+
2025-04-06 17:56:40 +05:30
Naveen Singh 127a820c25 Merge branch 'master' into open_data_obb_system_app 2025-04-06 17:38:24 +05:30
Julien Papasian be63e6f9a8 Open data/obb folder in system app on Android 14+ 2025-04-06 13:47:36 +02:00
Naveen Singh 55cc3bb441 Use workflow templates for minimizer and no-response 2025-04-04 01:54:54 +05:30
Naveen Singh 8daff3f0db Escape apostrophe properly (again) 2025-03-30 17:25:12 +05:30
Naveen Singh 3aef65fa37 Escape apostrophe properly 2025-03-30 17:04:17 +05:30
Naveen Singh 645d5d1943 Remove invalid short description translations 2025-03-25 21:10:52 +05:30
Naveen Singh 3fe891a821 Remove title and changelog translations 2025-03-25 20:58:17 +05:30
Naveen Singh 80793f1a0e Merge pull request #147 from weblate/weblate-fossify-file-manager
Translations update from Hosted Weblate
2025-03-25 20:43:28 +05:30
Gwenn M d856a9cebd Translated using Weblate (Breton)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/br/
2025-03-24 17:07:28 +01:00
elid 2fce420cd1 Translated using Weblate (Hebrew)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/he/
2025-03-16 10:47:10 +01:00
Guillaume 447769190b Translated using Weblate (Dutch)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/nl/
2025-03-13 23:38:16 +01:00
Naveen Singh e89e5b3a17 Merge pull request #109 from Stephan-P/patch-1
Update strings.xml
2025-03-12 19:29:50 +05:30
Naveen Singh fcdf530ffa Merge pull request #137 from weblate/weblate-fossify-file-manager
Translations update from Hosted Weblate
2025-03-12 19:29:43 +05:30
LaKato ba339261f7 Translated using Weblate (Esperanto)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/eo/
2025-03-12 11:57:34 +01:00
LaKato 11c7a6dd5a Translated using Weblate (Esperanto)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/eo/
2025-03-12 11:57:33 +01:00
AP 1d9404f7fa Translated using Weblate (Breton)
Currently translated at 56.8% (25 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/br/
2025-03-12 11:57:32 +01:00
Sketch6580 a91f7a2df8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/zh_Hans/
2025-03-12 11:57:31 +01:00
Alioc 0332a63ee4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/zh_Hans/
2025-03-12 11:57:30 +01:00
Roman 20b9776364 Translated using Weblate (Russian)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/ru/
2025-03-12 11:57:29 +01:00
P.O 47849e1d07 Translated using Weblate (Swedish)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/sv/
2025-03-12 11:57:28 +01:00
LaKato e4ee20c5fb Translated using Weblate (Esperanto)
Currently translated at 52.2% (23 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/eo/
2025-03-12 11:57:27 +01:00
Nicola Bortoletto 88ed94ddae Translated using Weblate (Italian)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/it/
2025-03-12 11:57:26 +01:00
gfbdrgng 827cd9114a Translated using Weblate (Russian)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/ru/
2025-03-12 11:57:25 +01:00
FLVAL 6fd361eb14 Translated using Weblate (French)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/fr/
2025-03-12 11:57:24 +01:00
VfBFan f153ffa8e1 Translated using Weblate (German)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/de/
2025-03-12 11:57:23 +01:00
Naveen Singh 1383a26ef7 Merge pull request #146 from FossifyOrg/update_deps
Update AGP and dependencies
2025-03-12 16:27:10 +05:30
Naveen Singh 4f92ddbc1c Update ancient gradle scripts 2025-03-12 16:13:59 +05:30
Naveen Singh 4d5720d2d1 Update AGP to 8.9.0 2025-03-12 15:07:06 +05:30
Naveen Singh f0925f7945 Update kotlin 2025-03-12 14:58:23 +05:30
Naveen Singh 0e7f0b40a1 Remove unused pdf viewer menu 2025-03-12 14:58:23 +05:30
Naveen Singh 8b6fc1cc46 Move actions back into the option menu 2025-03-12 14:58:23 +05:30
Naveen Singh 1cbeab42ea Disable language splits
See https://github.com/FossifyOrg/General-Discussion/issues/242
2025-03-12 14:58:23 +05:30
Naveen Singh 69f29435c3 Update prepaid flavor config 2025-03-12 14:58:22 +05:30
Naveen Singh b5e8d10af2 Remove support for Android and older versions
See https://github.com/orgs/FossifyOrg/discussions/241
2025-03-12 14:16:10 +05:30
Naveen Singh 395b183b77 Setup full screen app lock 2025-03-12 14:09:11 +05:30
Naveen Singh 3722501aea Update commons 2025-03-12 13:23:01 +05:30
Naveen Singh 1500f45593 Update AGP 2025-03-12 13:18:58 +05:30
Naveen Singh 0aa27861e7 Switch to forked RootTools library
Closes https://github.com/FossifyOrg/File-Manager/issues/143
2025-03-12 03:58:32 +05:30
Naveen Singh 98383895c5 Remove optional donation checklist item 2025-01-22 00:30:44 +05:30
Naveen Singh a1bb523e8d Fix typo in CONTRIBUTING.md 2025-01-21 14:00:23 +05:30
Naveen Singh cd6db6d71a Fix typos in issue templates 2025-01-17 17:57:15 +05:30
Naveen Singh 42a34f3d1c Merge pull request #129 from weblate/weblate-fossify-file-manager
Translations update from Hosted Weblate
2024-12-25 23:09:17 +05:30
Peter Dave Hello 2c6b98e22e Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 60.0% (3 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/zh_Hant/
2024-12-22 11:06:30 +01:00
eduver badf7ccd21 Translated using Weblate (Interlingua)
Currently translated at 65.9% (29 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ia/
2024-12-17 07:03:01 +01:00
mastoduy 67788e7d4b Translated using Weblate (Vietnamese)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/vi/
2024-12-08 11:00:24 +00:00
mastoduy b118080dc9 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/vi/
2024-12-08 11:00:22 +00:00
Alexander Gabilondo 1c049561fb Translated using Weblate (Basque)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/eu/
2024-12-06 10:15:15 +01:00
109247019824 cb29636dd0 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/bg/
2024-12-02 10:09:25 +01:00
109247019824 2b7246bbf4 Translated using Weblate (Bulgarian)
Currently translated at 40.0% (2 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/bg/
2024-12-01 16:00:28 +01:00
Aindriú Mac Giolla Eoin e156413e42 Translated using Weblate (Irish)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ga/
2024-11-24 16:00:48 +00:00
Aindriú Mac Giolla Eoin 7268af9d6c Added translation using Weblate (Irish) 2024-11-23 16:22:48 +01:00
Thiago Carmona 08dd3dc171 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/pt_BR/
2024-11-23 16:22:36 +01:00
Naveen Singh 1ef3d26025 Update no-response.yml 2024-11-18 12:21:37 +05:30
Naveen Singh a35fb3e847 Merge pull request #112 from weblate/weblate-fossify-file-manager
Translations update from Hosted Weblate
2024-11-18 00:03:42 +05:30
Dan 074700bf77 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/uk/
2024-11-17 19:16:03 +01:00
Alberto d850827ce7 Translated using Weblate (Italian)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/it/
2024-11-17 19:16:01 +01:00
Sergio Marques 61c3e8884b Translated using Weblate (Portuguese)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/pt/
2024-11-17 19:16:01 +01:00
Fjuro f0fa5a87ae Translated using Weblate (Czech)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/cs/
2024-11-17 19:15:59 +01:00
josé m c240674079 Translated using Weblate (Galician)
Currently translated at 60.0% (3 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/gl/
2024-11-17 19:15:58 +01:00
Yeasin Hossain cbd8d60ff6 Translated using Weblate (Bengali (Bangladesh))
Currently translated at 20.0% (1 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/bn_BD/
2024-11-17 19:15:57 +01:00
Dan 34aa03a7e0 Translated using Weblate (Ukrainian)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/uk/
2024-11-17 19:15:56 +01:00
Suguru Hirahara dc34c03368 Translated using Weblate (Japanese)
Currently translated at 40.0% (2 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/ja/
2024-11-17 19:15:55 +01:00
Suguru Hirahara b55a9df5ab Translated using Weblate (Japanese)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ja/
2024-11-17 19:15:53 +01:00
Sketch6580 8219d1f56f Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/zh_Hans/
2024-11-17 19:15:52 +01:00
Sérgio Marques ae15e123fe Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/pt_PT/
2024-11-17 19:15:51 +01:00
Jeff Huang a6e14aa641 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/zh_Hant/
2024-11-17 19:15:50 +01:00
Sketch6580 4c930e0944 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/zh_Hans/
2024-11-17 19:15:48 +01:00
Andrea Andre 8651f32b72 Translated using Weblate (Romanian)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/ro/
2024-11-17 19:15:47 +01:00
Pander c9fb0f523d Translated using Weblate (Dutch)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/nl/
2024-11-17 19:15:46 +01:00
Naveen Singh bcc92b1483 Update no-response.yml 2024-11-17 23:44:48 +05:30
Naveen Singh 901f3bb877 Update image minimizer 2024-11-17 23:35:09 +05:30
Naveen Singh 36f5af651a Update image minimizer 2024-11-17 23:19:40 +05:30
Naveen Singh 6751fda69f Update image minimizer 2024-11-17 22:42:38 +05:30
Naveen Singh bf322c6ad8 Update no-response.yml 2024-11-15 16:56:57 +05:30
Naveen Singh 591d693ae6 Reduce no-response duration to 14 days 2024-10-26 03:53:08 +05:30
Naveen Singh 8ea493739e Update image-minimizer.js 2024-10-01 20:12:27 +05:30
Naveen Singh 0722176c87 Merge pull request #121 from esensar/ci
Add reusable workflows for PRs and testing builds
2024-09-28 16:31:03 +05:30
Ensar Sarajčić a19efbda60 Add reusable workflows for PRs and testing builds 2024-09-28 12:40:20 +02:00
Naveen Singh 4ed7c97044 Bump GH actions 2024-07-24 16:11:54 +05:30
Naveen Singh cec9ee04df Merge pull request #69 from weblate/weblate-fossify-file-manager
Translations update from Hosted Weblate
2024-07-18 12:56:21 -04:00
Ricky From Hong Kong 1effc571e5 Translated using Weblate (Chinese (Traditional, Hong Kong))
Currently translated at 2.2% (1 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/zh_Hant_HK/
2024-07-12 10:09:19 +02:00
Andrea Andre a6d53c8207 Translated using Weblate (Romanian)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ro/
2024-07-10 21:09:11 +02:00
Andrea Andre e70f6305d2 Translated using Weblate (Italian)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/it/
2024-07-10 21:09:11 +02:00
Alexander Gabilondo 0ca9a84b5d Translated using Weblate (Basque)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/eu/
2024-07-09 17:09:15 +02:00
김수빈 506a60fad6 Translated using Weblate (Korean)
Currently translated at 97.7% (43 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ko/
2024-06-23 15:09:10 +02:00
김수빈 f9103a602d Translated using Weblate (Korean)
Currently translated at 56.8% (25 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ko/
2024-06-22 06:09:11 +00:00
Stephan Paternotte 0cddc4a903 Update strings.xml
Two corrections: Tap 'back' twice doesn't exit the app, but rather closes it.
2024-06-15 14:38:23 +02:00
josé m f5b3f0f461 Translated using Weblate (Galician)
Currently translated at 60.0% (3 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/gl/
2024-05-25 05:09:16 +02:00
josé m caec5063bf Translated using Weblate (Galician)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/gl/
2024-05-25 05:09:14 +02:00
Dan bad5451789 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/uk/
2024-05-22 23:02:07 +02:00
Alexander Gabilondo 0ba8d43538 Translated using Weblate (Basque)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/eu/
2024-05-19 19:01:50 +00:00
Alexander Gabilondo 47e4ef1ff0 Translated using Weblate (Basque)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/eu/
2024-05-19 19:01:48 +00:00
Umut Solmz e59e396f8d Translated using Weblate (Turkish)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/tr/
2024-05-14 16:01:50 +02:00
Umut Solmz f445fe4c9d Translated using Weblate (Turkish)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/tr/
2024-05-14 16:01:48 +02:00
Jeroen 541f5eff81 Translated using Weblate (Dutch)
Currently translated at 60.0% (3 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/nl/
2024-05-10 12:23:57 +02:00
Guillaume e4f6317a79 Translated using Weblate (Dutch)
Currently translated at 60.0% (3 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/nl/
2024-05-10 12:23:56 +02:00
Alexander Gabilondo 38e22d4b86 Translated using Weblate (Basque)
Currently translated at 20.0% (1 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/eu/
2024-05-10 12:23:55 +02:00
Guillaume 3aa6d20005 Translated using Weblate (Dutch)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/nl/
2024-05-10 12:23:54 +02:00
Jeroen 3e92e44e52 Translated using Weblate (Dutch)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/nl/
2024-05-10 12:23:53 +02:00
Koshan Othman 4b0c8adfdc Translated using Weblate (Kurdish (Central))
Currently translated at 2.2% (1 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ckb/
2024-05-05 22:07:09 +02:00
Tyson Tan 0f682cc286 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/zh_Hans/
2024-04-24 05:07:09 +02:00
Azizov Aga afd13dd28f Translated using Weblate (Azerbaijani)
Currently translated at 20.0% (1 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/az/
2024-04-13 23:01:51 +02:00
lucasmz 9f3a16e1b5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.7% (43 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/pt_BR/
2024-04-13 23:01:50 +02:00
GuitarBilly 7552c26f20 Translated using Weblate (Dutch)
Currently translated at 60.0% (3 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/nl/
2024-04-09 16:14:30 +02:00
BT-7274 005aa67f40 Translated using Weblate (Chinese (Traditional))
Currently translated at 86.3% (38 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/zh_Hant/
2024-04-04 18:35:04 +02:00
Priit Jõerüüt aebc59facd Translated using Weblate (Estonian)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/et/
2024-04-02 13:01:49 +02:00
Макар Разин 1179d0fa00 Translated using Weblate (Belarusian)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/be/
2024-04-01 01:23:56 +02:00
OuHaich Cubensis 439b5faaf9 Translated using Weblate (French)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/fr/
2024-03-28 18:02:05 +01:00
Josep M. Ferrer 4da76fb249 Translated using Weblate (Catalan)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/ca/
2024-03-27 14:02:00 +01:00
antodc b739866d05 Translated using Weblate (Italian)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/it/
2024-03-23 11:52:41 +01:00
Argo Carpathians b11df5fe5f Translated using Weblate (Indonesian)
Currently translated at 100.0% (44 of 44 strings)

Translation: Fossify/File-Manager
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager/id/
2024-03-21 00:16:27 +01:00
P.O 31e0f90f75 Translated using Weblate (Swedish)
Currently translated at 80.0% (4 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/sv/
2024-03-19 16:02:52 +01:00
Guillaume 4c6d009373 Translated using Weblate (Dutch)
Currently translated at 40.0% (2 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/nl/
2024-03-19 00:58:29 +01:00
Fjuro db9f44d189 Translated using Weblate (Czech)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/cs/
2024-03-18 10:51:43 +01:00
VfBFan 0261280eff Translated using Weblate (German)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/de/
2024-03-18 10:51:43 +01:00
gallegonovato 302af120f5 Translated using Weblate (Spanish)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/es/
2024-03-18 09:49:39 +01:00
Scrambled777 117c07c231 Translated using Weblate (Hindi)
Currently translated at 100.0% (5 of 5 strings)

Translation: Fossify/File-Manager metadata
Translate-URL: https://hosted.weblate.org/projects/fossify/file-manager-metadata/hi/
2024-03-18 09:49:39 +01:00
Naveen 666bfb6b5c Exclude dependency info from APKs
Because this info is encrypted and only readable by Google. It serves no purpose in foss releases.

See FossifyOrg/Phone#43 for more info. Also: https://github.com/FossifyOrg/File-Manager/discussions/71
2024-03-18 14:19:25 +05:30
Naveen 007a481aa3 Delete empty files 2024-03-18 02:24:36 +05:30
Naveen d96a148404 Remove short descriptions longer than 80 characters
Short descriptions should be limited to 80 characters: https://github.com/FossifyOrg/Calendar/discussions/177
2024-03-18 02:17:26 +05:30
163 changed files with 3986 additions and 1040 deletions

No files matched your search

+2
View File
@@ -0,0 +1,2 @@
# Auto-generated file. DO NOT EDIT.
1.3.1
+2 -5
View File
@@ -18,7 +18,7 @@ body:
required: true
- label: "I made sure that there are **no existing issues** - [open](https://github.com/FossifyOrg/File-Manager/issues) or [closed](https://github.com/FossifyOrg/File-Manager/issues?q=is%3Aissue+is%3Aclosed) - to which I could contribute my information."
required: true
- label: "I made sure that there are **no existing discussions** - [open](https://github.com/FossifyOrg/File-Manager/discussions) or [closed](https://github.com/FossifyOrg/File-Manager/discussions?discussions_q=is%3Aclosed) - to which I could contribute my information."
- label: "I made sure that there are **no existing discussions** - [open](https://github.com/orgs/FossifyOrg/discussions?discussions_q=is:open+label:filemanager) or [closed](https://github.com/orgs/FossifyOrg/discussions?discussions_q=is:closed+label:filemanager) - to which I could contribute my information."
required: true
- label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed."
required: true
@@ -77,9 +77,6 @@ body:
What did you do for the bug to show up?
If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug.
⚠️ Please **DO NOT** add links to SimpleMobileTools issues as they can be deleted at any time. Instead, copy-paste any useful information or instructions manually.
placeholder: |
1. Go to '...'
2. Click on '....'
@@ -112,7 +109,7 @@ body:
description: |
A picture or video is worth a thousand words.
If applicable, drag and drop screenshots or a screen recording to help explain your problem. If your file is too big for Github to accept, try to compress it (ZIP file), or feel free to paste a link to an image/video hoster here instead.
If applicable, drag and drop screenshots or a screen recording to help explain your problem. If your file is too big for Github to accept, try to compress it (ZIP file), or feel free to paste a link to an image/video instead.
- type: textarea
id: additional-information
+1 -1
View File
@@ -1,5 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Questions
url: https://github.com/FossifyOrg/File-Manager/discussions
url: https://github.com/orgs/FossifyOrg/discussions
about: Please ask and answer questions here.
+2 -6
View File
@@ -16,18 +16,16 @@ body:
options:
- label: "I made sure that there are **no existing issues** - [open](https://github.com/FossifyOrg/File-Manager/issues) or [closed](https://github.com/FossifyOrg/File-Manager/issues?q=is%3Aissue+is%3Aclosed) - to which I could contribute my information."
required: true
- label: "I made sure that there are **no existing discussions** - [open](https://github.com/FossifyOrg/File-Manager/discussions) or [closed](https://github.com/FossifyOrg/File-Manager/discussions?discussions_q=is%3Aclosed) - to which I could contribute my information."
- label: "I made sure that there are **no existing discussions** - [open](https://github.com/orgs/FossifyOrg/discussions?discussions_q=is:open+label:filemanager) or [closed](https://github.com/orgs/FossifyOrg/discussions?discussions_q=is:closed+label:filemanager) - to which I could contribute my information."
required: true
- label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed."
required: true
- label: "**I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise.**"
- label: "**I have taken the time to fill in all the required details. I understand that the request will be dismissed otherwise.**"
required: true
- label: "This issue contains only one feature request."
required: true
- label: "I have read and understood the [contribution guidelines](https://github.com/FossifyOrg/File-Manager/blob/master/CONTRIBUTING.md)."
required: true
- label: "I optionally [donated](https://fossify.org/donate) to support the Fossify mission."
required: false
- type: textarea
id: feature-description
@@ -35,8 +33,6 @@ body:
label: Feature description
description: |
Explain how you want the app's look or behavior to change to suit your needs.
⚠️ Please **DO NOT** add links to SimpleMobileTools issues as they can be deleted at any time. Instead, copy-paste any useful information manually.
validations:
required: true
-28
View File
@@ -1,28 +0,0 @@
<!-- Hey there. Thank you so much for improving Fossify. Please consider filling out the details :)-->
#### What is it?
- [ ] Bugfix
- [ ] Feature
- [ ] Codebase improvement
#### Description of the changes in your PR
<!-- Bullet points are preferred. The following is an example -->
- Updated colors
- Update strings
- Added documentation
#### Before/After Screenshots/Screen Record
<!-- If your PR changes the app's UI in any way, consider including screenshots or a video showing exactly what changed, so that developers and users can pinpoint it easily. Delete this if it doesn't apply to your PR.-->
- Before:
- After:
#### Fixes the following issue(s)
<!-- Prefix issues with "Fixes" so that GitHub closes them when the PR is merged (note that each "Fixes #" should be in its own item). Also add any other relevant links. -->
- Fixes #
#### Relies on the following changes
<!-- Delete this if it doesn't apply to your PR. -->
-
#### Acknowledgement
- [ ] I read the [contribution guidelines](https://github.com/FossifyOrg/File-Manager/blob/master/CONTRIBUTING.md).
+46
View File
@@ -0,0 +1,46 @@
version: 2
registries:
maven-google:
type: maven-repository
url: "https://dl.google.com/dl/android/maven2/"
maven-central:
type: maven-repository
url: "https://repo.maven.apache.org/maven2"
jitpack:
type: maven-repository
url: "https://jitpack.io"
updates:
- package-ecosystem: "bundler"
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "chore"
prefix-development: "chore"
include: "scope"
- package-ecosystem: "gradle"
directory: "/"
registries:
- maven-central
- maven-google
- jitpack
schedule:
interval: "weekly"
commit-message:
prefix: "chore"
prefix-development: "chore"
include: "scope"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "chore"
prefix-development: "chore"
include: "scope"
-148
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;
}
}
+4 -25
View File
@@ -5,31 +5,10 @@ on:
types: [created, edited]
issues:
types: [opened, edited]
pull_request:
pull_request_target:
types: [opened, edited]
permissions:
issues: write
pull-requests: write
jobs:
try-minimize:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- name: Install probe-image-size
run: npm i probe-image-size@7.2.3 --ignore-scripts
- name: Minimize simple images
uses: actions/github-script@v6
timeout-minutes: 3
with:
script: |
const script = require('.github/workflows/image-minimizer.js');
await script({github, context});
call-image-minimizer-workflow:
uses: FossifyOrg/.github/.github/workflows/image-minimizer.yml@main
secrets: inherit
+6 -20
View File
@@ -1,25 +1,11 @@
name: no-response
name: No Response
# Both `issue_comment` and `scheduled` event types are required for this Action
# to work properly.
on:
issue_comment:
types: [created]
schedule:
# Run daily at midnight.
- cron: '0 0 * * *'
permissions:
issues: write
pull-requests: write
- cron: "0 12 * * *" # Runs daily at noon
workflow_dispatch:
jobs:
noResponse:
runs-on: ubuntu-latest
steps:
- uses: lee-dohm/no-response@v0.5.0
with:
token: ${{ github.token }}
# Number of days of inactivity before an issue is closed for lack of response.
daysUntilClose: 30
responseRequiredLabel: waiting for author
call-no-response-workflow:
uses: FossifyOrg/.github/.github/workflows/no-response.yml@main
secrets: inherit
+10
View File
@@ -0,0 +1,10 @@
name: PR Labeler
on:
pull_request_target:
types: [opened]
jobs:
call-pr-labeler-workflow:
uses: FossifyOrg/.github/.github/workflows/pr-labeler.yml@main
secrets: inherit
+9
View File
@@ -0,0 +1,9 @@
name: PR
on:
pull_request:
branches: [ main ]
jobs:
call-pr-workflow:
uses: FossifyOrg/.github/.github/workflows/pr.yml@main
+15
View File
@@ -0,0 +1,15 @@
name: Prepare Release PR
on:
repository_dispatch:
types: [prepare-release]
workflow_dispatch:
push:
branches: [main]
paths:
- "CHANGELOG.md"
jobs:
call-release-pr:
uses: FossifyOrg/.github/.github/workflows/prepare-release-pr.yml@main
secrets: inherit
+17
View File
@@ -0,0 +1,17 @@
name: Release
on:
push:
branches: [ main ]
paths:
- ".fossify/release-marker.txt"
jobs:
call-release-workflow:
name: Release
uses: FossifyOrg/.github/.github/workflows/release.yml@main
with:
track: ${{ vars.GPLAY_TRACK || 'beta' }}
rollout: ${{ vars.GPLAY_ROLLOUT || '0.05' }}
validate_only: ${{ vars.GPLAY_DRY_RUN == 'true' }}
secrets: inherit
+10
View File
@@ -0,0 +1,10 @@
name: Testing build (on PR)
on:
pull_request:
branches: [ main ]
types: [ labeled, opened, synchronize, reopened ]
jobs:
call-testing-build-workflow:
uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main
@@ -0,0 +1,11 @@
name: Update lint baselines
on:
workflow_dispatch:
schedule:
- cron: "0 0 1 * *"
jobs:
update-lint-baselines:
uses: FossifyOrg/.github/.github/workflows/update-lint-baselines.yml@main
secrets: inherit
@@ -0,0 +1,15 @@
name: Fastlane metadata validation
on:
push:
branches: [main]
paths:
- "fastlane/**"
pull_request:
branches: [main]
paths:
- "fastlane/**"
jobs:
validate:
uses: FossifyOrg/.github/.github/workflows/validate-fastlane-metadata.yml@main
+2 -2
View File
@@ -9,5 +9,5 @@
keystore.jks
keystore.properties
fastlane/fastlane.json
Gemfile
Gemfile.lock
fastlane/report.xml
.kotlin/
+109 -14
View File
@@ -1,18 +1,113 @@
Changelog
==========
# Changelog
All notable changes to this project will be documented in this file.
Version 1.0.1 *(2024-03-17)*
----------------------------
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
* Folders now use primary/accent color.
* Addressed unnecessary delays when renaming files.
* Enhanced search performance in the text editor.
* Fixed unresponsive behavior when viewing contents of a zip file.
* Disabled the use of invalid characters such as `/` for batch file renaming.
* Fixed invisible sort menu when viewing storage summary.
* Added some translations.
## [Unreleased]
Version 1.0.0 *(2024-01-07)*
----------------------------
## [1.3.1] - 2025-10-02
### Changed
- Updated translations
* Initial release
### Fixed
- Fixed files from hidden folders showing up in storage tab browser ([#217])
## [1.3.0] - 2025-09-30
### Added
- Added a separate "Save as" option in the text editor ([#224])
### Changed
- Save button now overwrites files directly in the text editor ([#224])
- Search now ignores accents and diacritics ([#95])
- Updated translations
### Fixed
- Fixed folders showing up incorrectly as files in copy/move dialog ([#267])
- Fixed error when saving files with unsupported characters ([#250])
- Fixed missing permission prompt on initial "Save as" launch ([#85])
- Fixed printing text files containing a "#" ([#104])
- Fixed files in hidden folders showing up in recent tab ([#217])
## [1.2.3] - 2025-09-15
### Fixed
- Fixed folders showing up incorrectly as files in some cases ([#80])
## [1.2.2] - 2025-09-01
### Changed
- Updated translations
### Fixed
- Fixed empty storage usage bars on initial load ([#251])
## [1.2.0] - 2025-07-12
### Changed
- Updated translations
### Fixed
- File modification time is now preserved when compressing/decompressing files ([#176])
## [1.1.0] - 2025-05-21
### Added
- Added SHA-1 and SHA-256 hashes to file properties ([#149])
### Changed
- Replaced checkboxes with switches
- Updated translations
### Removed
- Dropped support for Android 7 and older versions
### Fixed
- Files saved via `Save As` option are now named properly ([#37])
- Decompressed folders are now named properly ([#120])
- Text editor no longer resets on device rotation ([#106])
- JSON files can now be edited in-app ([#105])
- Fixed accidental rendering of pull-to-refresh indicator ([#27])
- Pull-to-refresh setting is now applied as expected ([#136])
- Fixed invisible content when using app lock ([#150])
## [1.0.1] - 2024-03-17
### Changed
- Folders now use primary/accent color.
- Enhanced search performance in the text editor.
- Added some translations.
### Fixed
- Addressed unnecessary delays when renaming files.
- Fixed unresponsive behavior when viewing contents of a zip file.
- Disabled the use of invalid characters such as `/` for batch file renaming.
- Fixed invisible sort menu when viewing storage summary.
## [1.0.0] - 2024-01-07
### Added
- Initial release
[#27]: https://github.com/FossifyOrg/File-Manager/issues/27
[#37]: https://github.com/FossifyOrg/File-Manager/issues/37
[#80]: https://github.com/FossifyOrg/File-Manager/issues/80
[#85]: https://github.com/FossifyOrg/File-Manager/issues/85
[#95]: https://github.com/FossifyOrg/File-Manager/issues/95
[#104]: https://github.com/FossifyOrg/File-Manager/issues/104
[#105]: https://github.com/FossifyOrg/File-Manager/issues/105
[#106]: https://github.com/FossifyOrg/File-Manager/issues/106
[#120]: https://github.com/FossifyOrg/File-Manager/issues/120
[#136]: https://github.com/FossifyOrg/File-Manager/issues/136
[#149]: https://github.com/FossifyOrg/File-Manager/issues/149
[#150]: https://github.com/FossifyOrg/File-Manager/issues/150
[#176]: https://github.com/FossifyOrg/File-Manager/issues/176
[#217]: https://github.com/FossifyOrg/File-Manager/issues/217
[#224]: https://github.com/FossifyOrg/File-Manager/issues/224
[#250]: https://github.com/FossifyOrg/File-Manager/issues/250
[#251]: https://github.com/FossifyOrg/File-Manager/issues/251
[#267]: https://github.com/FossifyOrg/File-Manager/issues/267
[Unreleased]: https://github.com/FossifyOrg/File-Manager/compare/1.3.1...HEAD
[1.3.1]: https://github.com/FossifyOrg/File-Manager/compare/1.3.0...1.3.1
[1.3.0]: https://github.com/FossifyOrg/File-Manager/compare/1.2.3...1.3.0
[1.2.3]: https://github.com/FossifyOrg/File-Manager/compare/1.2.2...1.2.3
[1.2.2]: https://github.com/FossifyOrg/File-Manager/compare/1.2.0...1.2.2
[1.2.0]: https://github.com/FossifyOrg/File-Manager/compare/1.1.0...1.2.0
[1.1.0]: https://github.com/FossifyOrg/File-Manager/compare/1.0.1...1.1.0
[1.0.1]: https://github.com/FossifyOrg/File-Manager/compare/1.0.0...1.0.1
[1.0.0]: https://github.com/FossifyOrg/File-Manager/releases/tag/1.0.0
+1
View File
@@ -0,0 +1 @@
* @naveensingh
+1 -1
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).
+4
View File
@@ -0,0 +1,4 @@
source "https://rubygems.org"
gem "fastlane"
gem "fastlane-plugin-fossify", "~> 1.0"
+231
View File
@@ -0,0 +1,231 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.7)
base64
nkf
rexml
abbrev (0.1.2)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
aws-partitions (1.1116.0)
aws-sdk-core (3.225.2)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-kms (1.105.0)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.189.1)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.3.0)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
declarative (0.0.20)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.6.20240107)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.112.0)
faraday (1.10.4)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0)
faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.0)
faraday-patron (~> 1.0)
faraday-rack (~> 1.0)
faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.7)
faraday (>= 0.8.0)
http-cookie (~> 1.0.0)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.1.0)
multipart-post (~> 2.0)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.0)
fastlane (2.228.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
colored (~> 1.2)
commander (~> 4.6)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (>= 0.1.1, < 1.0.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.5)
simctl (~> 1.6.3)
terminal-notifier (>= 2.0.0, < 3.0.0)
terminal-table (~> 3)
tty-screen (>= 0.6.3, < 1.0.0)
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.1)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-plugin-fossify (1.0.2)
abbrev
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.3)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
mini_mime (~> 1.0)
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
rexml
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.8.0)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.5.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.31.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.12.2)
jwt (2.10.1)
base64
logger (1.7.0)
mini_magick (4.13.2)
mini_mime (1.1.5)
multi_json (1.15.0)
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
naturally (2.3.0)
nkf (0.2.0)
optparse (0.6.0)
os (1.1.4)
plist (3.7.2)
public_suffix (6.0.2)
rake (13.3.0)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.4.2)
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
security (0.1.5)
signet (0.20.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.10)
CFPropertyList
naturally
sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
xcodeproj (1.27.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
xcpretty (0.4.1)
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
PLATFORMS
ruby
x86_64-linux
DEPENDENCIES
fastlane
fastlane-plugin-fossify (~> 1.0)
BUNDLED WITH
2.6.8
+1 -1
View File
@@ -1,3 +1,3 @@
/build
/foss/
/prepaid/
/gplay/
+56 -11
View File
@@ -1,4 +1,4 @@
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.konan.properties.Properties
import java.io.FileInputStream
@@ -6,6 +6,7 @@ import java.io.FileInputStream
plugins {
alias(libs.plugins.android)
alias(libs.plugins.kotlinAndroid)
alias(libs.plugins.detekt)
}
val keystorePropertiesFile: File = rootProject.file("keystore.properties")
@@ -14,18 +15,25 @@ if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
fun hasSigningVars(): Boolean {
return providers.environmentVariable("SIGNING_KEY_ALIAS").orNull != null
&& providers.environmentVariable("SIGNING_KEY_PASSWORD").orNull != null
&& providers.environmentVariable("SIGNING_STORE_FILE").orNull != null
&& providers.environmentVariable("SIGNING_STORE_PASSWORD").orNull != null
}
android {
compileSdk = project.libs.versions.app.build.compileSDKVersion.get().toInt()
defaultConfig {
applicationId = libs.versions.app.version.appId.get()
applicationId = project.property("APP_ID").toString()
minSdk = project.libs.versions.app.build.minimumSDK.get().toInt()
targetSdk = project.libs.versions.app.build.targetSDK.get().toInt()
versionName = project.libs.versions.app.version.versionName.get()
versionCode = project.libs.versions.app.version.versionCode.get().toInt()
archivesName.set("file-manager-$versionCode")
versionName = project.property("VERSION_NAME").toString()
versionCode = project.property("VERSION_CODE").toString().toInt()
multiDexEnabled = true
vectorDrawables.useSupportLibrary = true
setProperty("archivesBaseName", "file-manager-$versionCode")
}
signingConfigs {
@@ -36,6 +44,15 @@ android {
storeFile = file(keystoreProperties.getProperty("storeFile"))
storePassword = keystoreProperties.getProperty("storePassword")
}
} else if (hasSigningVars()) {
register("release") {
keyAlias = providers.environmentVariable("SIGNING_KEY_ALIAS").get()
keyPassword = providers.environmentVariable("SIGNING_KEY_PASSWORD").get()
storeFile = file(providers.environmentVariable("SIGNING_STORE_FILE").get())
storePassword = providers.environmentVariable("SIGNING_STORE_PASSWORD").get()
}
} else {
logger.warn("Warning: No signing config found. Build will be unsigned.")
}
}
@@ -54,7 +71,7 @@ android {
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
if (keystorePropertiesFile.exists()) {
if (keystorePropertiesFile.exists() || hasSigningVars()) {
signingConfig = signingConfigs.getByName("release")
}
}
@@ -64,7 +81,7 @@ android {
productFlavors {
register("core")
register("foss")
register("prepaid")
register("gplay")
}
sourceSets {
@@ -77,16 +94,43 @@ android {
targetCompatibility = currentJavaVersionFromLibs
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = project.libs.versions.app.build.kotlinJVMTarget.get()
dependenciesInfo {
includeInApk = false
}
namespace = libs.versions.app.version.appId.get()
androidResources {
@Suppress("UnstableApiUsage")
generateLocaleConfig = true
}
tasks.withType<KotlinCompile> {
compilerOptions.jvmTarget.set(
JvmTarget.fromTarget(project.libs.versions.app.build.kotlinJVMTarget.get())
)
}
namespace = project.property("APP_ID").toString()
lint {
checkReleaseBuilds = false
abortOnError = false
abortOnError = true
warningsAsErrors = false
baseline = file("lint-baseline.xml")
lintConfig = rootProject.file("lint.xml")
}
bundle {
language {
enableSplit = false
}
}
}
detekt {
baseline = file("detekt-baseline.xml")
config.setFrom("$rootDir/detekt.yml")
buildUponDefaultConfig = true
allRules = false
}
dependencies {
@@ -98,4 +142,5 @@ dependencies {
implementation(libs.gestureviews)
implementation(libs.autofittextview)
implementation(libs.zip4j)
detektPlugins(libs.compose.detekt)
}
+166
View File
@@ -0,0 +1,166 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>ComplexCondition:Activity.kt$(hide &amp;&amp; filename.startsWith('.')) || (!hide &amp;&amp; !filename.startsWith('.'))</ID>
<ID>ComplexCondition:ItemsAdapter.kt$ItemsAdapter$activity.getDoesFilePathExist(source) &amp;&amp; activity.getIsPathDirectory(source) &amp;&amp; sourceFile.list()?.isEmpty() == true &amp;&amp; sourceFile.getProperSize(true) == 0L &amp;&amp; sourceFile.getFileCount(true) == 0</ID>
<ID>ComplexCondition:ItemsAdapter.kt$ItemsAdapter$hasOTGConnected &amp;&amp; itemToLoad is String &amp;&amp; activity.isPathOnOTG(itemToLoad) &amp;&amp; baseConfig.OTGTreeUri.isNotEmpty() &amp;&amp; baseConfig.OTGPartition.isNotEmpty()</ID>
<ID>ComplexCondition:MainActivity.kt$MainActivity$!config.wasOTGHandled &amp;&amp; hasPermission(PERMISSION_WRITE_STORAGE) &amp;&amp; hasOTGConnected() &amp;&amp; config.OTGPath.isEmpty()</ID>
<ID>ComplexCondition:MimeTypesActivity.kt$MimeTypesActivity$mimetype != "image" &amp;&amp; mimetype != "video" &amp;&amp; mimetype != "audio" &amp;&amp; mimetype != "text" &amp;&amp; !extraAudioMimeTypes.contains(fullMimetype) &amp;&amp; !extraDocumentMimeTypes.contains(fullMimetype) &amp;&amp; !archiveMimeTypes.contains(fullMimetype)</ID>
<ID>ComplexCondition:ReadTextActivity.kt$ReadTextActivity$requestCode == SELECT_SAVE_FILE_INTENT &amp;&amp; resultCode == Activity.RESULT_OK &amp;&amp; resultData != null &amp;&amp; resultData.data != null</ID>
<ID>CyclomaticComplexMethod:DecompressActivity.kt$DecompressActivity$private fun decompressTo(destination: String)</ID>
<ID>CyclomaticComplexMethod:ItemsAdapter.kt$ItemsAdapter$@SuppressLint("NewApi") private fun compressPaths( sourcePaths: List&lt;String&gt;, targetPath: String, password: String? = null ): Boolean</ID>
<ID>CyclomaticComplexMethod:ItemsAdapter.kt$ItemsAdapter$override fun actionItemPressed(id: Int)</ID>
<ID>CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun setupOptionsMenu()</ID>
<ID>CyclomaticComplexMethod:MimeTypesActivity.kt$MimeTypesActivity$private fun getProperFileDirItems(callback: (ArrayList&lt;FileDirItem&gt;) -&gt; Unit)</ID>
<ID>CyclomaticComplexMethod:StorageFragment.kt$StorageFragment$private fun getSizesByMimeType(volumeName: String): HashMap&lt;String, Long&gt;</ID>
<ID>EmptyCatchBlock:MimeTypesActivity.kt$MimeTypesActivity${ }</ID>
<ID>EmptyCatchBlock:StorageFragment.kt$StorageFragment${ }</ID>
<ID>EmptyFunctionBlock:DecompressItemsAdapter.kt$DecompressItemsAdapter${}</ID>
<ID>EmptyFunctionBlock:MainActivity.kt$MainActivity.&lt;no name provided&gt;${}</ID>
<ID>EmptyFunctionBlock:ManageFavoritesAdapter.kt$ManageFavoritesAdapter${}</ID>
<ID>EmptyFunctionBlock:MimeTypesActivity.kt$MimeTypesActivity${}</ID>
<ID>EmptyFunctionBlock:StorageFragment.kt$StorageFragment${}</ID>
<ID>LargeClass:ItemsAdapter.kt$ItemsAdapter : MyRecyclerViewAdapterOnPopupTextUpdate</ID>
<ID>LoopWithTooManyJumpStatements:DecompressActivity.kt$DecompressActivity$while</ID>
<ID>LoopWithTooManyJumpStatements:StorageFragment.kt$StorageFragment$do</ID>
<ID>MagicNumber:Config.kt$Config$1.2f</ID>
<ID>MagicNumber:Config.kt$Config$4</ID>
<ID>MagicNumber:Config.kt$Config$8</ID>
<ID>MagicNumber:DecompressActivity.kt$DecompressActivity$1024</ID>
<ID>MagicNumber:DecompressItemsAdapter.kt$DecompressItemsAdapter$0.8f</ID>
<ID>MagicNumber:DecompressItemsAdapter.kt$DecompressItemsAdapter$180</ID>
<ID>MagicNumber:ItemsAdapter.kt$ItemsAdapter$0.8f</ID>
<ID>MagicNumber:ItemsAdapter.kt$ItemsAdapter$10</ID>
<ID>MagicNumber:ItemsAdapter.kt$ItemsAdapter$180</ID>
<ID>MagicNumber:ItemsAdapter.kt$ItemsAdapter$4</ID>
<ID>MagicNumber:ItemsFragment.kt$ItemsFragment$3</ID>
<ID>MagicNumber:ReadTextActivity.kt$ReadTextActivity$250</ID>
<ID>MagicNumber:ReadTextActivity.kt$ReadTextActivity$50</ID>
<ID>MagicNumber:RecentsFragment.kt$RecentsFragment$3</ID>
<ID>MagicNumber:RecentsFragment.kt$RecentsFragment$50</ID>
<ID>MagicNumber:RootHelpers.kt$RootHelpers.&lt;no name provided&gt;$5</ID>
<ID>MagicNumber:StorageFragment.kt$StorageFragment$100000</ID>
<ID>MagicNumber:StorageFragment.kt$StorageFragment$2000</ID>
<ID>MagicNumber:StorageFragment.kt$StorageFragment$3</ID>
<ID>MagicNumber:StorageFragment.kt$StorageFragment$4096L</ID>
<ID>MaxLineLength:Activity.kt$fun</ID>
<ID>MaxLineLength:ChangeViewTypeDialog.kt$ChangeViewTypeDialog$class</ID>
<ID>MaxLineLength:ChangeViewTypeDialog.kt$ChangeViewTypeDialog$val</ID>
<ID>MaxLineLength:CompressAsDialog.kt$CompressAsDialog$FilePickerDialog</ID>
<ID>MaxLineLength:CompressAsDialog.kt$CompressAsDialog$class</ID>
<ID>MaxLineLength:CompressAsDialog.kt$CompressAsDialog$val indexOfDot = if (filename.contains('.') &amp;&amp; !activity.getIsPathDirectory(path)) filename.lastIndexOf(".") else filename.length</ID>
<ID>MaxLineLength:Config.kt$Config$set(wasStorageAnalysisTabAdded) = prefs.edit().putBoolean(WAS_STORAGE_ANALYSIS_TAB_ADDED, wasStorageAnalysisTabAdded).apply()</ID>
<ID>MaxLineLength:Context.kt$fun Context.isPathOnRoot(path: String)</ID>
<ID>MaxLineLength:DecompressActivity.kt$DecompressActivity$updateMaterialActivityViews(decompressCoordinator, decompressList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:DecompressItemsAdapter.kt$DecompressItemsAdapter$class</ID>
<ID>MaxLineLength:DecompressItemsAdapter.kt$DecompressItemsAdapter$val drawable = fileDrawables.getOrElse(fileName.substringAfterLast(".").lowercase(Locale.getDefault()), { fileDrawable })</ID>
<ID>MaxLineLength:FavoritesActivity.kt$FavoritesActivity$FilePickerDialog</ID>
<ID>MaxLineLength:FavoritesActivity.kt$FavoritesActivity$ManageFavoritesAdapter(this@FavoritesActivity, favorites, this@FavoritesActivity, manageFavoritesList) { }</ID>
<ID>MaxLineLength:FavoritesActivity.kt$FavoritesActivity$updateMaterialActivityViews(manageFavoritesCoordinator, manageFavoritesList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:ItemsAdapter.kt$ItemsAdapter$}</ID>
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$ItemsAdapter</ID>
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$class</ID>
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$context</ID>
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$if</ID>
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$private</ID>
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$val sectionTitle = ListItem(it.path, context!!.humanizePath(it.path), true, 0, 0, 0, true, false)</ID>
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment$val sectionTitle = ListItem(parent, context!!.humanizePath(parent), false, 0, 0, 0, true, false)</ID>
<ID>MaxLineLength:ItemsFragment.kt$ItemsFragment.&lt;no name provided&gt;$return</ID>
<ID>MaxLineLength:ListItem.kt$ListItem$val mPath: String</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$// used at apps that have no file access at all, but need to work with files. For example Simple Calendar uses this at exporting events into a file</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.add_favorite).isVisible = currentFragment is ItemsFragment &amp;&amp; !favorites.contains(currentFragment.currentPath)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.column_count).isVisible = currentViewType == VIEW_TYPE_GRID &amp;&amp; currentFragment !is StorageFragment</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.go_home).isVisible = currentFragment is ItemsFragment &amp;&amp; currentFragment.currentPath != config.homeFolder</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.remove_favorite).isVisible = currentFragment is ItemsFragment &amp;&amp; favorites.contains(currentFragment.currentPath)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.set_as_home).isVisible = currentFragment is ItemsFragment &amp;&amp; currentFragment.currentPath != config.homeFolder</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden &amp;&amp; currentFragment !is StorageFragment</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden() &amp;&amp; currentFragment !is StorageFragment</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.toggle_filename).isVisible = currentViewType == VIEW_TYPE_GRID &amp;&amp; currentFragment !is StorageFragment</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$private fun getInactiveTabIndexes(activeIndex: Int)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$resultIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$updateMaterialActivityViews(binding.mainCoordinator, null, useTransparentNavigation = false, useTopSearchMenu = true)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$val licenses = LICENSE_GLIDE or LICENSE_PATTERN or LICENSE_REPRINT or LICENSE_GESTURE_VIEWS or LICENSE_AUTOFITTEXTVIEW or LICENSE_ZIP4J</ID>
<ID>MaxLineLength:MimeTypesActivity.kt$MimeTypesActivity$!extraAudioMimeTypes.contains(fullMimetype)</ID>
<ID>MaxLineLength:MimeTypesActivity.kt$MimeTypesActivity$if</ID>
<ID>MaxLineLength:MimeTypesActivity.kt$MimeTypesActivity$updateMaterialActivityViews(mimetypesCoordinator, mimetypesList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:MimeTypesActivity.kt$MimeTypesActivity$val fullMimetype = cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault()) ?: return@queryCursor</ID>
<ID>MaxLineLength:MyViewPagerFragment.kt$MyViewPagerFragment$abstract</ID>
<ID>MaxLineLength:MyViewPagerFragment.kt$MyViewPagerFragment$val fabIcon = context.resources.getColoredDrawableWithColor(iconId, context.getProperPrimaryColor().getContrastColor())</ID>
<ID>MaxLineLength:ReadTextActivity.kt$ReadTextActivity$if</ID>
<ID>MaxLineLength:ReadTextActivity.kt$ReadTextActivity$private</ID>
<ID>MaxLineLength:ReadTextActivity.kt$ReadTextActivity$updateMaterialActivityViews(readTextCoordinator, readTextView, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:RecentsFragment.kt$RecentsFragment$ItemsAdapter</ID>
<ID>MaxLineLength:RecentsFragment.kt$RecentsFragment$binding.recentsSwipeRefresh.isEnabled = lastSearchedText.isEmpty() &amp;&amp; activity?.config?.enablePullToRefresh != false</ID>
<ID>MaxLineLength:RecentsFragment.kt$RecentsFragment$class</ID>
<ID>MaxLineLength:RecentsFragment.kt$RecentsFragment$if</ID>
<ID>MaxLineLength:RootHelpers.kt$RootHelpers$fun</ID>
<ID>MaxLineLength:RootHelpers.kt$RootHelpers$private</ID>
<ID>MaxLineLength:SaveAsActivity.kt$SaveAsActivity$FilePickerDialog</ID>
<ID>MaxLineLength:SaveAsDialog.kt$SaveAsDialog$val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFilename)</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") &amp;&amp; !isTiramisuPlus())</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:StorageFragment.kt$StorageFragment$class</ID>
<ID>MaxLineLength:StorageFragment.kt$StorageFragment$mainStorageUsageProgressbar</ID>
<ID>MaxLineLength:StorageFragment.kt$StorageFragment$mainStorageUsageProgressbar.progress = ((totalStorageSpace - freeStorageSpace) / SIZE_DIVIDER).toInt()</ID>
<ID>MaxLineLength:StorageFragment.kt$StorageFragment$totalSpace.text = String.format(context.getString(R.string.total_storage), totalStorageSpace.formatSizeThousand())</ID>
<ID>MaxLineLength:StorageFragment.kt$StorageFragment$val mimeType = cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault())</ID>
<ID>MaxLineLength:StorageFragment.kt$StorageFragment$val storageStatsManager = context.getSystemService(AppCompatActivity.STORAGE_STATS_SERVICE) as StorageStatsManager</ID>
<ID>NestedBlockDepth:DecompressActivity.kt$DecompressActivity$private fun decompressTo(destination: String)</ID>
<ID>NestedBlockDepth:ItemsAdapter.kt$ItemsAdapter$@SuppressLint("NewApi") private fun compressPaths( sourcePaths: List&lt;String&gt;, targetPath: String, password: String? = null ): Boolean</ID>
<ID>NestedBlockDepth:ItemsAdapter.kt$ItemsAdapter$private fun decompressPaths( paths: List&lt;String&gt;, conflictResolutions: LinkedHashMap&lt;String, Int&gt;, callback: (success: Boolean) -&gt; Unit )</ID>
<ID>NestedBlockDepth:ItemsAdapter.kt$ItemsAdapter$private fun setupView(binding: ItemViewBinding, listItem: ListItem)</ID>
<ID>NestedBlockDepth:ItemsAdapter.kt$ItemsAdapter$private fun tryDecompressingPaths( sourcePaths: List&lt;String&gt;, callback: (success: Boolean) -&gt; Unit )</ID>
<ID>NestedBlockDepth:ItemsFragment.kt$ItemsFragment$private fun getRegularItemsOf(path: String, callback: (originalPath: String, items: ArrayList&lt;ListItem&gt;) -&gt; Unit)</ID>
<ID>NestedBlockDepth:ItemsFragment.kt$ItemsFragment$private fun searchFiles(text: String, path: String): ArrayList&lt;ListItem&gt;</ID>
<ID>NestedBlockDepth:RecentsFragment.kt$RecentsFragment$private fun getRecents(callback: (recents: ArrayList&lt;ListItem&gt;) -&gt; Unit)</ID>
<ID>NestedBlockDepth:StorageFragment.kt$StorageFragment$override fun setupFragment(activity: SimpleActivity)</ID>
<ID>NestedBlockDepth:StorageFragment.kt$StorageFragment$private fun getAllFiles(volumeName: String): ArrayList&lt;FileDirItem&gt;</ID>
<ID>ReturnCount:ItemsAdapter.kt$ItemsAdapter$@SuppressLint("NewApi") private fun compressPaths( sourcePaths: List&lt;String&gt;, targetPath: String, password: String? = null ): Boolean</ID>
<ID>SwallowedException:ItemsAdapter.kt$ItemsAdapter$e: Exception</ID>
<ID>SwallowedException:MimeTypesActivity.kt$MimeTypesActivity$e: Exception</ID>
<ID>SwallowedException:StorageFragment.kt$StorageFragment$e: Exception</ID>
<ID>TooGenericExceptionCaught:DecompressActivity.kt$DecompressActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:ItemsAdapter.kt$ItemsAdapter$e: Exception</ID>
<ID>TooGenericExceptionCaught:ItemsAdapter.kt$ItemsAdapter$exception: Exception</ID>
<ID>TooGenericExceptionCaught:MimeTypesActivity.kt$MimeTypesActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:ReadTextActivity.kt$ReadTextActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:RecentsFragment.kt$RecentsFragment$e: Exception</ID>
<ID>TooGenericExceptionCaught:RootHelpers.kt$RootHelpers$e: Exception</ID>
<ID>TooGenericExceptionCaught:RootHelpers.kt$RootHelpers$exception: Exception</ID>
<ID>TooGenericExceptionCaught:SaveAsActivity.kt$SaveAsActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:StorageFragment.kt$StorageFragment$e: Exception</ID>
<ID>TooManyFunctions:DecompressActivity.kt$DecompressActivity : SimpleActivity</ID>
<ID>TooManyFunctions:DecompressItemsAdapter.kt$DecompressItemsAdapter : MyRecyclerViewAdapter</ID>
<ID>TooManyFunctions:ItemsAdapter.kt$ItemsAdapter : MyRecyclerViewAdapterOnPopupTextUpdate</ID>
<ID>TooManyFunctions:ItemsFragment.kt$ItemsFragment : MyViewPagerFragmentItemOperationsListenerBreadcrumbsListener</ID>
<ID>TooManyFunctions:MainActivity.kt$MainActivity : SimpleActivity</ID>
<ID>TooManyFunctions:ManageFavoritesAdapter.kt$ManageFavoritesAdapter : MyRecyclerViewAdapter</ID>
<ID>TooManyFunctions:MimeTypesActivity.kt$MimeTypesActivity : SimpleActivityItemOperationsListener</ID>
<ID>TooManyFunctions:ReadTextActivity.kt$ReadTextActivity : SimpleActivity</ID>
<ID>TooManyFunctions:RecentsFragment.kt$RecentsFragment : MyViewPagerFragmentItemOperationsListener</ID>
<ID>TooManyFunctions:RootHelpers.kt$RootHelpers</ID>
<ID>TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
<ID>TooManyFunctions:StorageFragment.kt$StorageFragment : MyViewPagerFragmentItemOperationsListener</ID>
<ID>VariableNaming:ItemsAdapter.kt$ItemsAdapter$val SAFPath = getFirstSelectedItemPath()</ID>
<ID>VariableNaming:RecentsFragment.kt$RecentsFragment$private val RECENTS_LIMIT = 50</ID>
<ID>VariableNaming:StorageFragment.kt$StorageFragment$private val SIZE_DIVIDER = 100000</ID>
<ID>WildcardImport:ChangeSortingDialog.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:CompressAsDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:CreateNewItemDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:InsertFilenameDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ItemsFragment.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ItemsFragment.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:ManageFavoritesAdapter.kt$import android.view.*</ID>
<ID>WildcardImport:MimeTypesActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:MimeTypesActivity.kt$import org.fossify.filemanager.helpers.*</ID>
<ID>WildcardImport:MyViewPagerFragment.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:ReadTextActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SaveAsActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SaveAsDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.helpers.*</ID>
</CurrentIssues>
</SmellBaseline>
File diff suppressed because it is too large. Load diff
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="show_donate_in_about">false</bool>
<bool name="hide_google_relations">true</bool>
<bool name="hide_all_external_links">true</bool>
<bool name="hide_google_relations">false</bool>
</resources>
+9 -1
View File
@@ -22,7 +22,6 @@
android:appCategory="productivity"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_launcher_name"
android:localeConfig="@xml/locale_config"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher"
android:theme="@style/AppTheme">
@@ -61,6 +60,14 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<data android:mimeType="*/*" />
<category android:name="android.intent.category.OPENABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.RINGTONE_PICKER" />
<category android:name="android.intent.category.DEFAULT" />
@@ -97,6 +104,7 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
<data android:mimeType="application/json" />
</intent-filter>
</activity>
@@ -1,13 +1,13 @@
package org.fossify.filemanager
import android.app.Application
import com.github.ajalt.reprint.core.Reprint
import org.fossify.commons.extensions.checkUseEnglish
import org.fossify.commons.FossifyApp
class App : FossifyApp() {
override val isAppLockFeatureAvailable = true
class App : Application() {
override fun onCreate() {
super.onCreate()
checkUseEnglish()
Reprint.initialize(this)
}
}
@@ -8,14 +8,25 @@ import net.lingala.zip4j.io.inputstream.ZipInputStream
import net.lingala.zip4j.model.LocalFileHeader
import org.fossify.commons.dialogs.EnterPasswordDialog
import org.fossify.commons.dialogs.FilePickerDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.extensions.createDirectorySync
import org.fossify.commons.extensions.getDoesFilePathExist
import org.fossify.commons.extensions.getFileOutputStreamSync
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getMimeType
import org.fossify.commons.extensions.getParentPath
import org.fossify.commons.extensions.getRealPathFromURI
import org.fossify.commons.extensions.internalStoragePath
import org.fossify.commons.extensions.isGone
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.NavigationIcon
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isOreoPlus
import org.fossify.filemanager.R
import org.fossify.filemanager.adapters.DecompressItemsAdapter
import org.fossify.filemanager.databinding.ActivityDecompressBinding
import org.fossify.filemanager.extensions.config
import org.fossify.filemanager.extensions.setLastModified
import org.fossify.filemanager.models.ListItem
import java.io.BufferedInputStream
import java.io.File
@@ -31,6 +42,7 @@ class DecompressActivity : SimpleActivity() {
private var uri: Uri? = null
private var password: String? = null
private var passwordDialog: EnterPasswordDialog? = null
private var filename = ""
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
@@ -51,7 +63,8 @@ class DecompressActivity : SimpleActivity() {
password = savedInstanceState?.getString(PASSWORD, null)
val realPath = getRealPathFromURI(uri!!)
binding.decompressToolbar.title = realPath?.getFilenameFromPath() ?: Uri.decode(uri.toString().getFilenameFromPath())
filename = realPath?.getFilenameFromPath() ?: Uri.decode(uri.toString().getFilenameFromPath())
binding.decompressToolbar.title = filename
setupFilesList()
}
@@ -145,7 +158,7 @@ class DecompressActivity : SimpleActivity() {
zipInputStream.use {
while (true) {
val entry = zipInputStream.nextEntry ?: break
val filename = title.toString().substringBeforeLast(".")
val filename = filename.substringBeforeLast(".")
val parent = "$destination/$filename"
val newPath = "$parent/${entry.fileName.trimEnd('/')}"
@@ -159,7 +172,9 @@ class DecompressActivity : SimpleActivity() {
continue
}
val isVulnerableForZipPathTraversal = !File(newPath).canonicalPath.startsWith(parent)
val outputFile = File(newPath)
val isVulnerableForZipPathTraversal = !outputFile.canonicalPath.startsWith(parent)
if (isVulnerableForZipPathTraversal) {
continue
}
@@ -175,6 +190,7 @@ class DecompressActivity : SimpleActivity() {
fos!!.write(buffer, 0, count)
}
fos!!.close()
outputFile.setLastModified(entry)
}
toast(R.string.decompression_successful)
@@ -247,7 +263,7 @@ class DecompressActivity : SimpleActivity() {
passwordDialog = null
}
val lastModified = if (isOreoPlus()) zipEntry.lastModifiedTime else 0
val lastModified = zipEntry.lastModifiedTime
val filename = zipEntry.fileName.removeSuffix("/")
allFiles.add(
ListItem(
@@ -1,25 +1,58 @@
package org.fossify.filemanager.activities
import android.annotation.SuppressLint
import android.app.Activity
import android.content.ClipData
import android.content.Intent
import android.graphics.drawable.Drawable
import android.media.RingtoneManager
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.os.Handler
import android.provider.Settings
import android.widget.ImageView
import android.widget.TextView
import androidx.viewpager.widget.ViewPager
import com.stericson.RootTools.RootTools
import me.grantland.widget.AutofitHelper
import org.fossify.commons.dialogs.ConfirmationAdvancedDialog
import org.fossify.commons.dialogs.RadioGroupDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.*
import org.fossify.commons.extensions.appLaunched
import org.fossify.commons.extensions.appLockManager
import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.checkWhatsNew
import org.fossify.commons.extensions.getBottomNavigationBackgroundColor
import org.fossify.commons.extensions.getColoredDrawableWithColor
import org.fossify.commons.extensions.getFilePublicUri
import org.fossify.commons.extensions.getMimeType
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.getRealPathFromURI
import org.fossify.commons.extensions.getStorageDirectories
import org.fossify.commons.extensions.getTimeFormat
import org.fossify.commons.extensions.handleHiddenFolderPasswordProtection
import org.fossify.commons.extensions.hasOTGConnected
import org.fossify.commons.extensions.hasPermission
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.humanizePath
import org.fossify.commons.extensions.internalStoragePath
import org.fossify.commons.extensions.isPathOnOTG
import org.fossify.commons.extensions.isPathOnSD
import org.fossify.commons.extensions.launchMoreAppsFromUsIntent
import org.fossify.commons.extensions.onGlobalLayout
import org.fossify.commons.extensions.onTabSelectionChanged
import org.fossify.commons.extensions.sdCardPath
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.updateBottomTabItemColors
import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.LICENSE_AUTOFITTEXTVIEW
import org.fossify.commons.helpers.LICENSE_GESTURE_VIEWS
import org.fossify.commons.helpers.LICENSE_GLIDE
import org.fossify.commons.helpers.LICENSE_PATTERN
import org.fossify.commons.helpers.LICENSE_REPRINT
import org.fossify.commons.helpers.LICENSE_ZIP4J
import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE
import org.fossify.commons.helpers.TAB_FILES
import org.fossify.commons.helpers.TAB_RECENT_FILES
import org.fossify.commons.helpers.TAB_STORAGE_ANALYSIS
import org.fossify.commons.helpers.VIEW_TYPE_GRID
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.models.FAQItem
import org.fossify.commons.models.RadioItem
import org.fossify.commons.models.Release
@@ -44,15 +77,12 @@ import java.io.File
class MainActivity : SimpleActivity() {
companion object {
private const val BACK_PRESS_TIMEOUT = 5000
private const val MANAGE_STORAGE_RC = 201
private const val PICKED_PATH = "picked_path"
}
private val binding by viewBinding(ActivityMainBinding::inflate)
private var wasBackJustPressed = false
private var mIsPasswordProtectionPending = false
private var mWasProtectionHandled = false
private var mTabsToShow = ArrayList<Int>()
private var mStoredFontSize = 0
@@ -69,7 +99,7 @@ class MainActivity : SimpleActivity() {
refreshMenuItems()
mTabsToShow = getTabsList()
if (!config.wasStorageAnalysisTabAdded && isOreoPlus()) {
if (!config.wasStorageAnalysisTabAdded) {
config.wasStorageAnalysisTabAdded = true
if (config.showTabs and TAB_STORAGE_ANALYSIS == 0) {
config.showTabs += TAB_STORAGE_ANALYSIS
@@ -81,22 +111,13 @@ class MainActivity : SimpleActivity() {
updateMaterialActivityViews(binding.mainCoordinator, null, useTransparentNavigation = false, useTopSearchMenu = true)
mIsPasswordProtectionPending = config.isAppPasswordProtectionOn
if (savedInstanceState == null) {
handleAppPasswordProtection {
mWasProtectionHandled = it
if (it) {
initFragments()
mIsPasswordProtectionPending = false
tryInitFileManager()
checkWhatsNewDialog()
checkIfRootAvailable()
checkInvalidFavorites()
} else {
finish()
}
}
config.temporarilyShowHidden = false
initFragments()
tryInitFileManager()
checkWhatsNewDialog()
checkIfRootAvailable()
checkInvalidFavorites()
}
}
@@ -128,7 +149,7 @@ class MainActivity : SimpleActivity() {
}
}
if (binding.mainViewPager.adapter == null && mWasProtectionHandled) {
if (binding.mainViewPager.adapter == null) {
initFragments()
}
}
@@ -139,11 +160,6 @@ class MainActivity : SimpleActivity() {
config.lastUsedViewPagerPage = binding.mainViewPager.currentItem
}
override fun onDestroy() {
super.onDestroy()
config.temporarilyShowHidden = false
}
override fun onBackPressed() {
val currentFragment = getCurrentFragment()
if (binding.mainMenu.isSearchOpen) {
@@ -158,6 +174,7 @@ class MainActivity : SimpleActivity() {
wasBackJustPressed = false
}, BACK_PRESS_TIMEOUT.toLong())
} else {
appLockManager.lock()
finish()
}
} else {
@@ -241,42 +258,15 @@ class MainActivity : SimpleActivity() {
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString(PICKED_PATH, getItemsFragment()?.currentPath ?: "")
outState.putBoolean(WAS_PROTECTION_HANDLED, mWasProtectionHandled)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
mWasProtectionHandled = savedInstanceState.getBoolean(WAS_PROTECTION_HANDLED, false)
val path = savedInstanceState.getString(PICKED_PATH) ?: internalStoragePath
if (binding.mainViewPager.adapter == null) {
binding.mainViewPager.onGlobalLayout {
restorePath(path)
}
} else {
restorePath(path)
}
}
@SuppressLint("NewApi")
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
isAskingPermissions = false
if (requestCode == MANAGE_STORAGE_RC && isRPlus()) {
actionOnPermission?.invoke(Environment.isExternalStorageManager())
}
}
private fun restorePath(path: String) {
if (!mWasProtectionHandled) {
handleAppPasswordProtection {
mWasProtectionHandled = it
if (it) {
mIsPasswordProtectionPending = false
openPath(path, true)
} else {
finish()
}
openPath(path, true)
}
} else {
openPath(path, true)
@@ -316,38 +306,6 @@ class MainActivity : SimpleActivity() {
}
}
@SuppressLint("InlinedApi")
private fun handleStoragePermission(callback: (granted: Boolean) -> Unit) {
actionOnPermission = null
if (hasStoragePermission()) {
callback(true)
} else {
if (isRPlus()) {
ConfirmationAdvancedDialog(this, "", R.string.access_storage_prompt, R.string.ok, 0, false) { success ->
if (success) {
isAskingPermissions = true
actionOnPermission = callback
try {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:$packageName")
startActivityForResult(intent, MANAGE_STORAGE_RC)
} catch (e: Exception) {
showErrorToast(e)
val intent = Intent()
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
startActivityForResult(intent, MANAGE_STORAGE_RC)
}
} else {
finish()
}
}
} else {
handlePermission(PERMISSION_WRITE_STORAGE, callback)
}
}
}
private fun initFileManager(refreshRecents: Boolean) {
if (intent.action == Intent.ACTION_VIEW && intent.data != null) {
val data = intent.data
@@ -404,7 +362,10 @@ class MainActivity : SimpleActivity() {
private fun setupTabs() {
binding.mainTabsHolder.removeAllTabs()
val action = intent.action
val isPickFileIntent = action == RingtoneManager.ACTION_RINGTONE_PICKER || action == Intent.ACTION_GET_CONTENT || action == Intent.ACTION_PICK
val isPickFileIntent = action == RingtoneManager.ACTION_RINGTONE_PICKER
|| action == Intent.ACTION_GET_CONTENT
|| action == Intent.ACTION_PICK
|| action == Intent.ACTION_OPEN_DOCUMENT
val isCreateDocumentIntent = action == Intent.ACTION_CREATE_DOCUMENT
if (isPickFileIntent) {
@@ -494,10 +455,6 @@ class MainActivity : SimpleActivity() {
}
private fun openPath(path: String, forceRefresh: Boolean = false) {
if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
return
}
var newPath = path
val file = File(path)
if (config.OTGPath.isNotEmpty() && config.OTGPath == path.trimEnd('/')) {
@@ -25,6 +25,7 @@ import org.fossify.filemanager.databinding.ActivityMimetypesBinding
import org.fossify.filemanager.dialogs.ChangeSortingDialog
import org.fossify.filemanager.dialogs.ChangeViewTypeDialog
import org.fossify.filemanager.extensions.config
import org.fossify.filemanager.extensions.isPathInHiddenFolder
import org.fossify.filemanager.extensions.tryOpenPathIntent
import org.fossify.filemanager.helpers.*
import org.fossify.filemanager.interfaces.ItemOperationsListener
@@ -133,10 +134,11 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
override fun selectedPaths(paths: ArrayList<String>) {}
fun searchQueryChanged(text: String) {
val searchText = text.trim()
lastSearchedText = searchText
val normalizedText = text.normalizeString()
val searchNormalizedText = normalizedText.trim()
lastSearchedText = searchNormalizedText
when {
searchText.isEmpty() -> {
searchNormalizedText.isEmpty() -> {
binding.apply {
mimetypesFastscroller.beVisible()
getRecyclerAdapter()?.updateItems(storedItems)
@@ -145,7 +147,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
}
}
searchText.length == 1 -> {
searchNormalizedText.length == 1 -> {
binding.apply {
mimetypesFastscroller.beGone()
mimetypesPlaceholder.beVisible()
@@ -155,11 +157,13 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
else -> {
ensureBackgroundThread {
if (lastSearchedText != searchText) {
if (lastSearchedText != searchNormalizedText) {
return@ensureBackgroundThread
}
val listItems = storedItems.filter { it.name.contains(searchText, true) } as ArrayList<ListItem>
val listItems = storedItems.filter {
it.name.normalizeString().contains(searchNormalizedText, true)
} as ArrayList<ListItem>
runOnUiThread {
getRecyclerAdapter()?.updateItems(listItems, text)
@@ -285,7 +289,10 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
try {
val fullMimetype = cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault()) ?: return@queryCursor
val name = cursor.getStringValue(MediaStore.Files.FileColumns.DISPLAY_NAME)
if (!showHidden && name.startsWith(".")) {
val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA)
val isHiddenFile = name.startsWith(".")
if (!showHidden && (isHiddenFile || path.isPathInHiddenFolder())) {
return@queryCursor
}
@@ -294,7 +301,6 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
return@queryCursor
}
val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA)
val lastModified = cursor.getLongValue(MediaStore.Files.FileColumns.DATE_MODIFIED) * 1000
val mimetype = fullMimetype.substringBefore("/")
@@ -7,6 +7,7 @@ import android.net.Uri
import android.os.Bundle
import android.print.PrintAttributes
import android.print.PrintManager
import android.util.Base64
import android.view.inputmethod.EditorInfo
import android.webkit.WebResourceRequest
import android.webkit.WebView
@@ -32,6 +33,7 @@ class ReadTextActivity : SimpleActivity() {
companion object {
private const val SELECT_SAVE_FILE_INTENT = 1
private const val SELECT_SAVE_FILE_AND_EXIT_INTENT = 2
private const val KEY_UNSAVED_TEXT = "KEY_UNSAVED_TEXT"
}
private val binding by viewBinding(ActivityReadTextBinding::inflate)
@@ -85,7 +87,7 @@ class ReadTextActivity : SimpleActivity() {
binding.readTextView.onGlobalLayout {
ensureBackgroundThread {
checkIntent(uri)
checkIntent(uri, savedInstanceState)
}
}
@@ -97,6 +99,13 @@ class ReadTextActivity : SimpleActivity() {
setupToolbar(binding.readTextToolbar, NavigationIcon.Arrow)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
if (originalText != binding.readTextView.text.toString()) {
outState.putString(KEY_UNSAVED_TEXT, binding.readTextView.text.toString())
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == SELECT_SAVE_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
@@ -135,6 +144,7 @@ class ReadTextActivity : SimpleActivity() {
when (menuItem.itemId) {
R.id.menu_search -> openSearch()
R.id.menu_save -> saveText()
R.id.menu_save_as -> saveAsText()
R.id.menu_open_with -> openPath(intent.dataString!!, true)
R.id.menu_print -> printText()
else -> return@setOnMenuItemClickListener false
@@ -156,10 +166,14 @@ class ReadTextActivity : SimpleActivity() {
}, 250)
}
private fun saveText(shouldExitAfterSaving: Boolean = false) {
private fun updateFilePath() {
if (filePath.isEmpty()) {
filePath = getRealPathFromURI(intent.data!!) ?: ""
}
}
private fun saveAsText(shouldExitAfterSaving: Boolean = false) {
updateFilePath()
if (filePath.isEmpty()) {
SaveAsDialog(this, filePath, true) { _, filename ->
@@ -173,6 +187,7 @@ class ReadTextActivity : SimpleActivity() {
} else {
SELECT_SAVE_FILE_INTENT
}
@Suppress("DEPRECATION")
startActivityForResult(this, requestCode)
}
}
@@ -191,6 +206,21 @@ class ReadTextActivity : SimpleActivity() {
}
}
private fun saveText(shouldExitAfterSaving: Boolean = false) {
updateFilePath()
if (filePath.isEmpty()) {
saveAsText(shouldExitAfterSaving)
} else if (hasStoragePermission()) {
val file = File(filePath)
getFileOutputStream(file.toFileDirItem(this), true) {
saveTextContent(it, shouldExitAfterSaving, true)
}
} else {
toast(R.string.no_storage_permissions)
}
}
private fun saveTextContent(outputStream: OutputStream?, shouldExitAfterSaving: Boolean, shouldOverwriteOriginalText: Boolean) {
if (outputStream != null) {
val currentText = binding.readTextView.text.toString()
@@ -221,7 +251,17 @@ class ReadTextActivity : SimpleActivity() {
}
}
webView.loadData(binding.readTextView.text.toString(), "text/plain", "UTF-8")
val text = binding.readTextView.text.toString()
ensureBackgroundThread {
try {
val base64 = Base64.encodeToString(text.toByteArray(), Base64.DEFAULT)
runOnUiThread {
webView.loadData(base64, "text/plain", "base64")
}
} catch (e: Exception) {
showErrorToast(e)
}
}
} catch (e: Exception) {
showErrorToast(e)
}
@@ -241,7 +281,7 @@ class ReadTextActivity : SimpleActivity() {
}
}
private fun checkIntent(uri: Uri) {
private fun checkIntent(uri: Uri, savedInstanceState: Bundle?) {
originalText = if (uri.scheme == "file") {
filePath = uri.path!!
val file = File(filePath)
@@ -270,7 +310,13 @@ class ReadTextActivity : SimpleActivity() {
}
runOnUiThread {
binding.readTextView.setText(originalText)
var textToSet = originalText
if (savedInstanceState != null) {
textToSet = savedInstanceState.getString(KEY_UNSAVED_TEXT, originalText)
}
binding.readTextView.setText(textToSet)
if (originalText.isNotEmpty()) {
hideKeyboard()
} else {
@@ -18,7 +18,21 @@ class SaveAsActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
tryInitFileManager()
}
private fun tryInitFileManager() {
handleStoragePermission { granted ->
if (granted) {
saveAsDialog()
} else {
toast(R.string.no_storage_permissions)
finish()
}
}
}
private fun saveAsDialog() {
if (intent.action == Intent.ACTION_SEND && intent.extras?.containsKey(Intent.EXTRA_STREAM) == true) {
FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden(), showFAB = true, showFavoritesButton = true) {
val destination = it
@@ -35,10 +49,14 @@ class SaveAsActivity : SimpleActivity() {
}
}
val source = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
val mimeType = source!!.toString().getMimeType()
val source = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)!!
val originalFilename = getFilenameFromContentUri(source)
?: source.toString().getFilenameFromPath()
val filename = sanitizeFilename(originalFilename)
val mimeType = contentResolver.getType(source)
?: intent.type?.takeIf { it != "*/*" }
?: filename.getMimeType()
val inputStream = contentResolver.openInputStream(source)
val filename = source.toString().getFilenameFromPath()
val destinationPath = "$destination/$filename"
val outputStream = getFileOutputStreamSync(destinationPath, mimeType, null)!!
@@ -63,4 +81,9 @@ class SaveAsActivity : SimpleActivity() {
super.onResume()
setupToolbar(binding.activitySaveAsToolbar, NavigationIcon.Arrow)
}
private fun sanitizeFilename(filename: String): String {
return filename.replace("[/\\\\<>:\"|?*\u0000-\u001F]".toRegex(), "_")
.takeIf { it.isNotBlank() } ?: "unnamed_file"
}
}
@@ -1,9 +1,15 @@
package org.fossify.filemanager.activities
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Environment
import android.provider.Settings
import org.fossify.commons.activities.BaseSimpleActivity
import org.fossify.commons.dialogs.ConfirmationAdvancedDialog
import org.fossify.commons.extensions.hasPermission
import android.net.Uri
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE
import org.fossify.commons.helpers.isRPlus
import org.fossify.filemanager.R
@@ -31,8 +37,23 @@ open class SimpleActivity : BaseSimpleActivity() {
R.mipmap.ic_launcher_grey_black
)
companion object {
private const val MANAGE_STORAGE_RC = 201
}
override fun getAppLauncherName() = getString(R.string.app_launcher_name)
override fun getRepositoryName() = "File-Manager"
@SuppressLint("NewApi")
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
isAskingPermissions = false
if (requestCode == MANAGE_STORAGE_RC && isRPlus()) {
actionOnPermission?.invoke(Environment.isExternalStorageManager())
}
}
@SuppressLint("NewApi")
fun hasStoragePermission(): Boolean {
return if (isRPlus()) {
@@ -41,4 +62,39 @@ open class SimpleActivity : BaseSimpleActivity() {
hasPermission(PERMISSION_WRITE_STORAGE)
}
}
@SuppressLint("InlinedApi")
fun handleStoragePermission(callback: (granted: Boolean) -> Unit) {
actionOnPermission = null
if (hasStoragePermission()) {
callback(true)
} else {
if (isRPlus()) {
ConfirmationAdvancedDialog(this, "", R.string.access_storage_prompt, R.string.ok, 0, false) { success ->
if (success) {
isAskingPermissions = true
actionOnPermission = callback
try {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:$packageName")
startActivityForResult(intent, MANAGE_STORAGE_RC)
} catch (e: android.content.ActivityNotFoundException) {
showErrorToast(e)
val intent = Intent()
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
startActivityForResult(intent, MANAGE_STORAGE_RC)
} catch (e: SecurityException) {
showErrorToast(e)
finish()
}
} else {
finish()
}
}
} else {
handlePermission(PERMISSION_WRITE_STORAGE, callback)
}
}
}
}
@@ -35,19 +35,82 @@ import net.lingala.zip4j.model.LocalFileHeader
import net.lingala.zip4j.model.ZipParameters
import net.lingala.zip4j.model.enums.EncryptionMethod
import org.fossify.commons.adapters.MyRecyclerViewAdapter
import org.fossify.commons.dialogs.*
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.*
import org.fossify.commons.dialogs.ConfirmationDialog
import org.fossify.commons.dialogs.FilePickerDialog
import org.fossify.commons.dialogs.PropertiesDialog
import org.fossify.commons.dialogs.RadioGroupDialog
import org.fossify.commons.dialogs.RenameDialog
import org.fossify.commons.dialogs.RenameItemDialog
import org.fossify.commons.dialogs.RenameItemsDialog
import org.fossify.commons.extensions.applyColorFilter
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.convertToBitmap
import org.fossify.commons.extensions.copyToClipboard
import org.fossify.commons.extensions.createDirectorySync
import org.fossify.commons.extensions.deleteFile
import org.fossify.commons.extensions.deleteFileBg
import org.fossify.commons.extensions.deleteFolderBg
import org.fossify.commons.extensions.formatDate
import org.fossify.commons.extensions.formatSize
import org.fossify.commons.extensions.getAndroidSAFFileItems
import org.fossify.commons.extensions.getAndroidSAFUri
import org.fossify.commons.extensions.getColoredDrawableWithColor
import org.fossify.commons.extensions.getDefaultCopyDestinationPath
import org.fossify.commons.extensions.getDocumentFile
import org.fossify.commons.extensions.getDoesFilePathExist
import org.fossify.commons.extensions.getFileCount
import org.fossify.commons.extensions.getFileInputStreamSync
import org.fossify.commons.extensions.getFileOutputStreamSync
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getIsPathDirectory
import org.fossify.commons.extensions.getMimeType
import org.fossify.commons.extensions.getParentPath
import org.fossify.commons.extensions.getProperSize
import org.fossify.commons.extensions.getTextSize
import org.fossify.commons.extensions.getTimeFormat
import org.fossify.commons.extensions.handleDeletePasswordProtection
import org.fossify.commons.extensions.hasOTGConnected
import org.fossify.commons.extensions.highlightTextPart
import org.fossify.commons.extensions.isPathOnOTG
import org.fossify.commons.extensions.isRestrictedSAFOnlyRoot
import org.fossify.commons.extensions.relativizeWith
import org.fossify.commons.extensions.setupViewBackground
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toFileDirItem
import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.CONFLICT_OVERWRITE
import org.fossify.commons.helpers.CONFLICT_SKIP
import org.fossify.commons.helpers.VIEW_TYPE_LIST
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.getFilePlaceholderDrawables
import org.fossify.commons.models.FileDirItem
import org.fossify.commons.models.RadioItem
import org.fossify.commons.views.MyRecyclerView
import org.fossify.filemanager.R
import org.fossify.filemanager.activities.SimpleActivity
import org.fossify.filemanager.activities.SplashActivity
import org.fossify.filemanager.databinding.*
import org.fossify.filemanager.databinding.ItemDirGridBinding
import org.fossify.filemanager.databinding.ItemEmptyBinding
import org.fossify.filemanager.databinding.ItemFileDirListBinding
import org.fossify.filemanager.databinding.ItemFileGridBinding
import org.fossify.filemanager.databinding.ItemSectionBinding
import org.fossify.filemanager.dialogs.CompressAsDialog
import org.fossify.filemanager.extensions.*
import org.fossify.filemanager.helpers.*
import org.fossify.filemanager.extensions.config
import org.fossify.filemanager.extensions.isPathOnRoot
import org.fossify.filemanager.extensions.isZipFile
import org.fossify.filemanager.extensions.setAs
import org.fossify.filemanager.extensions.setLastModified
import org.fossify.filemanager.extensions.sharePaths
import org.fossify.filemanager.extensions.toggleItemVisibility
import org.fossify.filemanager.extensions.tryOpenPathIntent
import org.fossify.filemanager.helpers.OPEN_AS_AUDIO
import org.fossify.filemanager.helpers.OPEN_AS_IMAGE
import org.fossify.filemanager.helpers.OPEN_AS_OTHER
import org.fossify.filemanager.helpers.OPEN_AS_TEXT
import org.fossify.filemanager.helpers.OPEN_AS_VIDEO
import org.fossify.filemanager.helpers.RootHelpers
import org.fossify.filemanager.interfaces.ItemOperationsListener
import org.fossify.filemanager.models.ListItem
import java.io.BufferedInputStream
@@ -65,7 +128,8 @@ class ItemsAdapter(
private val swipeRefreshLayout: SwipeRefreshLayout?,
canHaveIndividualViewType: Boolean = true,
itemClick: (Any) -> Unit,
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick),
RecyclerViewFastScroller.OnPopupTextUpdate {
private lateinit var fileDrawable: Drawable
private lateinit var folderDrawable: Drawable
@@ -80,7 +144,9 @@ class ItemsAdapter(
private val config = activity.config
private val viewType = if (canHaveIndividualViewType) {
config.getFolderViewType(listItems.firstOrNull { !it.isSectionTitle }?.mPath?.getParentPath() ?: "")
config.getFolderViewType(
path = listItems.firstOrNull { !it.isSectionTitle }?.mPath?.getParentPath().orEmpty()
)
} else {
config.viewType
}
@@ -106,13 +172,14 @@ class ItemsAdapter(
override fun prepareActionMode(menu: Menu) {
menu.apply {
findItem(R.id.cab_decompress).isVisible = getSelectedFileDirItems().map { it.path }.any { it.isZipFile() }
findItem(R.id.cab_decompress).isVisible =
getSelectedFileDirItems().map { it.path }.any { it.isZipFile() }
findItem(R.id.cab_confirm_selection).isVisible = isPickMultipleIntent
findItem(R.id.cab_copy_path).isVisible = isOneItemSelected()
findItem(R.id.cab_open_with).isVisible = isOneFileSelected()
findItem(R.id.cab_open_as).isVisible = isOneFileSelected()
findItem(R.id.cab_set_as).isVisible = isOneFileSelected()
findItem(R.id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected()
findItem(R.id.cab_create_shortcut).isVisible = isOneItemSelected()
checkHideBtnVisibility(this)
}
@@ -144,13 +211,21 @@ class ItemsAdapter(
}
}
override fun getSelectableItemCount() = listItems.filter { !it.isSectionTitle && !it.isGridTypeDivider }.size
override fun getSelectableItemCount(): Int {
return listItems.filter { !it.isSectionTitle && !it.isGridTypeDivider }.size
}
override fun getIsItemSelectable(position: Int) = !listItems[position].isSectionTitle && !listItems[position].isGridTypeDivider
override fun getIsItemSelectable(position: Int): Boolean {
return !listItems[position].isSectionTitle && !listItems[position].isGridTypeDivider
}
override fun getItemSelectionKey(position: Int) = listItems.getOrNull(position)?.path?.hashCode()
override fun getItemSelectionKey(position: Int): Int? {
return listItems.getOrNull(position)?.path?.hashCode()
}
override fun getItemKeyPosition(key: Int) = listItems.indexOfFirst { it.path.hashCode() == key }
override fun getItemKeyPosition(key: Int): Int {
return listItems.indexOfFirst { it.path.hashCode() == key }
}
override fun onActionModeCreated() {
swipeRefreshLayout?.isRefreshing = false
@@ -158,7 +233,7 @@ class ItemsAdapter(
}
override fun onActionModeDestroyed() {
swipeRefreshLayout?.isEnabled = true
swipeRefreshLayout?.isEnabled = config.enablePullToRefresh
}
override fun getItemViewType(position: Int): Int {
@@ -171,25 +246,37 @@ class ItemsAdapter(
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = Binding.getByItemViewType(viewType, isListViewType).inflate(layoutInflater, parent, false)
val binding = Binding.getByItemViewType(viewType, isListViewType)
.inflate(layoutInflater, parent, false)
return createViewHolder(binding.root)
}
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val fileDirItem = listItems[position]
holder.bindView(fileDirItem, true, !fileDirItem.isSectionTitle) { itemView, layoutPosition ->
holder.bindView(
any = fileDirItem,
allowSingleClick = true,
allowLongClick = !fileDirItem.isSectionTitle
) { itemView, layoutPosition ->
val viewType = getItemViewType(position)
setupView(Binding.getByItemViewType(viewType, isListViewType).bind(itemView), fileDirItem)
setupView(
binding = Binding.getByItemViewType(viewType, isListViewType).bind(itemView),
listItem = fileDirItem
)
}
bindViewHolder(holder)
}
override fun getItemCount() = listItems.size
private fun getItemWithKey(key: Int): FileDirItem? = listItems.firstOrNull { it.path.hashCode() == key }
private fun getItemWithKey(key: Int): FileDirItem? {
return listItems.firstOrNull { it.path.hashCode() == key }
}
private fun isOneFileSelected() = isOneItemSelected() && getItemWithKey(selectedKeys.first())?.isDirectory == false
private fun isOneFileSelected(): Boolean {
return isOneItemSelected() && getItemWithKey(selectedKeys.first())?.isDirectory == false
}
private fun checkHideBtnVisibility(menu: Menu) {
var hiddenCnt = 0
@@ -208,7 +295,10 @@ class ItemsAdapter(
private fun confirmSelection() {
if (selectedKeys.isNotEmpty()) {
val paths = getSelectedFileDirItems().asSequence().filter { !it.isDirectory }.map { it.path }.toMutableList() as ArrayList<String>
val paths = getSelectedFileDirItems()
.asSequence()
.filter { !it.isDirectory }.map { it.path }
.toMutableList() as ArrayList<String>
if (paths.isEmpty()) {
finishActMode()
} else {
@@ -287,7 +377,11 @@ class ItemsAdapter(
getShortcutImage(path, drawable) {
val intent = Intent(activity, SplashActivity::class.java)
intent.action = Intent.ACTION_VIEW
intent.flags = intent.flags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY
intent.flags =
intent.flags or
Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TASK or
Intent.FLAG_ACTIVITY_NO_HISTORY
intent.data = Uri.fromFile(File(path))
val shortcut = ShortcutInfo.Builder(activity, path)
@@ -303,7 +397,8 @@ class ItemsAdapter(
private fun getShortcutImage(path: String, drawable: Drawable, callback: () -> Unit) {
val appIconColor = baseConfig.appIconColor
(drawable as LayerDrawable).findDrawableByLayerId(R.id.shortcut_folder_background).applyColorFilter(appIconColor)
(drawable as LayerDrawable).findDrawableByLayerId(R.id.shortcut_folder_background)
.applyColorFilter(appIconColor)
if (activity.getIsPathDirectory(path)) {
callback()
} else {
@@ -324,10 +419,15 @@ class ItemsAdapter(
try {
val bitmap = builder.get()
drawable.findDrawableByLayerId(R.id.shortcut_folder_background).applyColorFilter(0)
drawable.findDrawableByLayerId(R.id.shortcut_folder_background)
.applyColorFilter(0)
drawable.setDrawableByLayerId(R.id.shortcut_folder_image, bitmap)
} catch (e: Exception) {
val fileIcon = fileDrawables.getOrElse(path.substringAfterLast(".").lowercase(Locale.getDefault()), { fileDrawable })
val fileIcon = fileDrawables
.getOrElse(
key = path.substringAfterLast(".").lowercase(Locale.getDefault()),
defaultValue = { fileDrawable }
)
drawable.setDrawableByLayerId(R.id.shortcut_folder_image, fileIcon)
}
@@ -352,15 +452,19 @@ class ItemsAdapter(
}
activity.isPathOnOTG(path) -> {
activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach {
addFileUris(it.uri.toString(), paths)
}
activity.getDocumentFile(path)?.listFiles()
?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }
?.forEach {
addFileUris(it.uri.toString(), paths)
}
}
else -> {
File(path).listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }?.forEach {
addFileUris(it.absolutePath, paths)
}
File(path).listFiles()
?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }
?.forEach {
addFileUris(it.absolutePath, paths)
}
}
}
} else {
@@ -419,11 +523,21 @@ class ItemsAdapter(
if (activity.isPathOnRoot(it) || activity.isPathOnRoot(firstFile.path)) {
copyMoveRootItems(files, it, isCopyOperation)
} else {
activity.copyMoveFilesTo(files, source, it, isCopyOperation, false, config.shouldShowHidden()) {
activity.copyMoveFilesTo(
fileDirItems = files,
source = source,
destination = it,
isCopyOperation = isCopyOperation,
copyPhotoVideoOnly = false,
copyHidden = config.shouldShowHidden()
) {
if (!isCopyOperation) {
files.forEach { sourceFileDir ->
val sourcePath = sourceFileDir.path
if (activity.isRestrictedSAFOnlyRoot(sourcePath) && activity.getDoesFilePathExist(sourcePath)) {
if (
activity.isRestrictedSAFOnlyRoot(sourcePath)
&& activity.getDoesFilePathExist(sourcePath)
) {
activity.deleteFile(sourceFileDir, true) {
listener?.refreshFragment()
activity.runOnUiThread {
@@ -432,8 +546,12 @@ class ItemsAdapter(
}
} else {
val sourceFile = File(sourcePath)
if (activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) &&
sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0
if (
activity.getDoesFilePathExist(source)
&& activity.getIsPathDirectory(source)
&& sourceFile.list()?.isEmpty() == true
&& sourceFile.getProperSize(true) == 0L
&& sourceFile.getFileCount(true) == 0
) {
val sourceFolder = sourceFile.toFileDirItem(activity)
activity.deleteFile(sourceFolder, true) {
@@ -457,7 +575,11 @@ class ItemsAdapter(
}
}
private fun copyMoveRootItems(files: ArrayList<FileDirItem>, destinationPath: String, isCopyOperation: Boolean) {
private fun copyMoveRootItems(
files: ArrayList<FileDirItem>,
destinationPath: String,
isCopyOperation: Boolean
) {
activity.toast(R.string.copying)
ensureBackgroundThread {
val fileCnt = files.size
@@ -523,7 +645,11 @@ class ItemsAdapter(
return@handleSAFDialog
}
val paths = getSelectedFileDirItems().asSequence().map { it.path }.filter { it.isZipFile() }.toList()
val paths = getSelectedFileDirItems()
.asSequence()
.map { it.path }
.filter { it.isZipFile() }
.toList()
ensureBackgroundThread {
tryDecompressingPaths(paths) { success ->
activity.runOnUiThread {
@@ -540,15 +666,28 @@ class ItemsAdapter(
}
}
private fun tryDecompressingPaths(sourcePaths: List<String>, callback: (success: Boolean) -> Unit) {
private fun tryDecompressingPaths(
sourcePaths: List<String>,
callback: (success: Boolean) -> Unit
) {
sourcePaths.forEach { path ->
ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path))).use { zipInputStream ->
try {
val fileDirItems = ArrayList<FileDirItem>()
var entry = zipInputStream.nextEntry
while (entry != null) {
val currPath = if (entry.isDirectory) path else "${path.getParentPath().trimEnd('/')}/${entry.fileName}"
val fileDirItem = FileDirItem(currPath, entry.fileName, entry.isDirectory, 0, entry.uncompressedSize)
val currPath = if (entry.isDirectory) {
path
} else {
"${path.getParentPath().trimEnd('/')}/${entry.fileName}"
}
val fileDirItem = FileDirItem(
path = currPath,
name = entry.fileName,
isDirectory = entry.isDirectory,
children = 0,
size = entry.uncompressedSize
)
fileDirItems.add(fileDirItem)
entry = zipInputStream.nextEntry
}
@@ -573,9 +712,14 @@ class ItemsAdapter(
}
}
private fun decompressPaths(paths: List<String>, conflictResolutions: LinkedHashMap<String, Int>, callback: (success: Boolean) -> Unit) {
private fun decompressPaths(
paths: List<String>,
conflictResolutions: LinkedHashMap<String, Int>,
callback: (success: Boolean) -> Unit
) {
paths.forEach { path ->
val zipInputStream = ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path)))
val zipInputStream =
ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path)))
zipInputStream.use {
try {
var entry = zipInputStream.nextEntry
@@ -588,7 +732,11 @@ class ItemsAdapter(
val resolution = getConflictResolution(conflictResolutions, newPath)
val doesPathExist = activity.getDoesFilePathExist(newPath)
if (doesPathExist && resolution == CONFLICT_OVERWRITE) {
val fileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), entry.isDirectory)
val fileDirItem = FileDirItem(
path = newPath,
name = newPath.getFilenameFromPath(),
isDirectory = entry.isDirectory
)
if (activity.getIsPathDirectory(path)) {
activity.deleteFolderBg(fileDirItem, false) {
if (it) {
@@ -621,21 +769,30 @@ class ItemsAdapter(
}
}
private fun extractEntry(newPath: String, entry: LocalFileHeader, zipInputStream: ZipInputStream) {
private fun extractEntry(
newPath: String,
entry: LocalFileHeader,
zipInputStream: ZipInputStream
) {
if (entry.isDirectory) {
if (!activity.createDirectorySync(newPath) && !activity.getDoesFilePathExist(newPath)) {
val error = String.format(activity.getString(R.string.could_not_create_file), newPath)
val error =
String.format(activity.getString(R.string.could_not_create_file), newPath)
activity.showErrorToast(error)
}
} else {
val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())
if (fos != null) {
zipInputStream.copyTo(fos)
File(newPath).setLastModified(entry)
}
}
}
private fun getConflictResolution(conflictResolutions: LinkedHashMap<String, Int>, path: String): Int {
private fun getConflictResolution(
conflictResolutions: LinkedHashMap<String, Int>,
path: String
): Int {
return if (conflictResolutions.size == 1 && conflictResolutions.containsKey("")) {
conflictResolutions[""]!!
} else if (conflictResolutions.containsKey(path)) {
@@ -646,15 +803,21 @@ class ItemsAdapter(
}
@SuppressLint("NewApi")
private fun compressPaths(sourcePaths: List<String>, targetPath: String, password: String? = null): Boolean {
private fun compressPaths(
sourcePaths: List<String>,
targetPath: String,
password: String? = null
): Boolean {
val queue = LinkedList<String>()
val fos = activity.getFileOutputStreamSync(targetPath, "application/zip") ?: return false
val zout = password?.let { ZipOutputStream(fos, password.toCharArray()) } ?: ZipOutputStream(fos)
val zout =
password?.let { ZipOutputStream(fos, password.toCharArray()) } ?: ZipOutputStream(fos)
var res: Closeable = fos
fun zipEntry(name: String) = ZipParameters().also {
fun zipEntry(name: String, lastModified: Long) = ZipParameters().also {
it.fileNameInZip = name
it.lastModifiedFileTime = lastModified
if (password != null) {
it.isEncryptFiles = true
it.encryptionMethod = EncryptionMethod.AES
@@ -670,9 +833,11 @@ class ItemsAdapter(
queue.push(mainFilePath)
if (activity.getIsPathDirectory(mainFilePath)) {
name = "${mainFilePath.getFilenameFromPath()}/"
val dirModified = File(mainFilePath).lastModified()
zout.putNextEntry(
ZipParameters().also {
it.fileNameInZip = name
it.lastModifiedFileTime = dirModified
}
)
}
@@ -687,9 +852,9 @@ class ItemsAdapter(
if (activity.getIsPathDirectory(file.path)) {
queue.push(file.path)
name = "${name.trimEnd('/')}/"
zout.putNextEntry(zipEntry(name))
zout.putNextEntry(zipEntry(name, file.modified))
} else {
zout.putNextEntry(zipEntry(name))
zout.putNextEntry(zipEntry(name, file.modified))
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
zout.closeEntry()
}
@@ -702,9 +867,9 @@ class ItemsAdapter(
if (activity.getIsPathDirectory(file.absolutePath)) {
queue.push(file.absolutePath)
name = "${name.trimEnd('/')}/"
zout.putNextEntry(zipEntry(name))
zout.putNextEntry(zipEntry(name, file.lastModified()))
} else {
zout.putNextEntry(zipEntry(name))
zout.putNextEntry(zipEntry(name, file.lastModified()))
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
zout.closeEntry()
}
@@ -712,8 +877,14 @@ class ItemsAdapter(
}
} else {
name = if (base == currentPath) currentPath.getFilenameFromPath() else mainFilePath.relativizeWith(base)
zout.putNextEntry(zipEntry(name))
name =
if (base == currentPath) {
currentPath.getFilenameFromPath()
} else {
mainFilePath.relativizeWith(base)
}
val fileModified = File(mainFilePath).lastModified()
zout.putNextEntry(zipEntry(name, fileModified))
activity.getFileInputStreamSync(mainFilePath)!!.copyTo(zout)
zout.closeEntry()
}
@@ -787,7 +958,11 @@ class ItemsAdapter(
private fun getFirstSelectedItemPath() = getSelectedFileDirItems().first().path
private fun getSelectedFileDirItems() = listItems.filter { selectedKeys.contains(it.path.hashCode()) } as ArrayList<FileDirItem>
private fun getSelectedFileDirItems(): ArrayList<FileDirItem> {
return listItems.filter {
selectedKeys.contains(it.path.hashCode())
} as ArrayList<FileDirItem>
}
fun updateItems(newItems: ArrayList<ListItem>, highlightText: String = "") {
if (newItems.hashCode() != currentItemsHash) {
@@ -833,7 +1008,8 @@ class ItemsAdapter(
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
if (!activity.isDestroyed && !activity.isFinishing) {
val icon = Binding.getByItemViewType(holder.itemViewType, isListViewType).bind(holder.itemView).itemIcon
val icon = Binding.getByItemViewType(holder.itemViewType, isListViewType)
.bind(holder.itemView).itemIcon
if (icon != null) {
Glide.with(activity).clear(icon)
}
@@ -845,16 +1021,35 @@ class ItemsAdapter(
binding.apply {
if (listItem.isSectionTitle) {
itemIcon?.setImageDrawable(folderDrawable)
itemSection?.text = if (textToHighlight.isEmpty()) listItem.mName else listItem.mName.highlightTextPart(textToHighlight, properPrimaryColor)
itemSection?.text =
if (textToHighlight.isEmpty()) {
listItem.mName
} else {
listItem.mName.highlightTextPart(
textToHighlight = textToHighlight,
color = properPrimaryColor
)
}
itemSection?.setTextColor(textColor)
itemSection?.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
} else if (!listItem.isGridTypeDivider) {
root.setupViewBackground(activity)
itemFrame.isSelected = isSelected
val fileName = listItem.name
itemName?.text = if (textToHighlight.isEmpty()) fileName else fileName.highlightTextPart(textToHighlight, properPrimaryColor)
itemName?.text =
if (textToHighlight.isEmpty()) {
fileName
} else {
fileName.highlightTextPart(
textToHighlight = textToHighlight,
color = properPrimaryColor
)
}
itemName?.setTextColor(textColor)
itemName?.setTextSize(TypedValue.COMPLEX_UNIT_PX, if (isListViewType) fontSize else smallerFontSize)
itemName?.setTextSize(
TypedValue.COMPLEX_UNIT_PX,
if (isListViewType) fontSize else smallerFontSize
)
itemDetails?.setTextColor(textColor)
itemDetails?.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
@@ -883,7 +1078,10 @@ class ItemsAdapter(
itemDate?.beVisible()
itemDate?.text = listItem.modified.formatDate(activity, dateFormat, timeFormat)
val drawable = fileDrawables.getOrElse(fileName.substringAfterLast(".").lowercase(Locale.getDefault()), { fileDrawable })
val drawable = fileDrawables.getOrElse(
key = fileName.substringAfterLast(".").lowercase(Locale.getDefault()),
defaultValue = { fileDrawable }
)
val options = RequestOptions()
.signature(listItem.getKey())
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
@@ -908,12 +1106,16 @@ class ItemsAdapter(
return activity.resources.getQuantityString(R.plurals.items, children, children)
}
private fun getOTGPublicPath(itemToLoad: String) =
"${baseConfig.OTGTreeUri}/document/${baseConfig.OTGPartition}%3A${itemToLoad.substring(baseConfig.OTGPath.length).replace("/", "%2F")}"
private fun getOTGPublicPath(itemToLoad: String): String {
return "${baseConfig.OTGTreeUri}/document/${baseConfig.OTGPartition}%3A${
itemToLoad.substring(baseConfig.OTGPath.length).replace("/", "%2F")
}"
}
private fun getImagePathToLoad(path: String): Any {
var itemToLoad = if (path.endsWith(".apk", true)) {
val packageInfo = activity.packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES)
val packageInfo =
activity.packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES)
if (packageInfo != null) {
val appInfo = packageInfo.applicationInfo
appInfo.sourceDir = path
@@ -936,13 +1138,16 @@ class ItemsAdapter(
}
fun initDrawables() {
folderDrawable = resources.getColoredDrawableWithColor(R.drawable.ic_folder_vector, properPrimaryColor)
folderDrawable =
resources.getColoredDrawableWithColor(R.drawable.ic_folder_vector, properPrimaryColor)
folderDrawable.alpha = 180
fileDrawable = resources.getDrawable(R.drawable.ic_file_generic)
fileDrawables = getFilePlaceholderDrawables(activity)
}
override fun onChange(position: Int) = listItems.getOrNull(position)?.getBubbleText(activity, dateFormat, timeFormat) ?: ""
override fun onChange(position: Int): String {
return listItems.getOrNull(position)?.getBubbleText(activity, dateFormat, timeFormat) ?: ""
}
private sealed interface Binding {
companion object {
@@ -963,12 +1168,23 @@ class ItemsAdapter(
}
}
fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding
fun inflate(
layoutInflater: LayoutInflater,
viewGroup: ViewGroup,
attachToRoot: Boolean
): ItemViewBinding
fun bind(view: View): ItemViewBinding
data object ItemSection : Binding {
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
return ItemSectionBindingAdapter(ItemSectionBinding.inflate(layoutInflater, viewGroup, attachToRoot))
override fun inflate(
layoutInflater: LayoutInflater,
viewGroup: ViewGroup,
attachToRoot: Boolean
): ItemViewBinding {
return ItemSectionBindingAdapter(
ItemSectionBinding.inflate(layoutInflater, viewGroup, attachToRoot)
)
}
override fun bind(view: View): ItemViewBinding {
@@ -977,8 +1193,14 @@ class ItemsAdapter(
}
data object ItemEmpty : Binding {
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
return ItemEmptyBindingAdapter(ItemEmptyBinding.inflate(layoutInflater, viewGroup, attachToRoot))
override fun inflate(
layoutInflater: LayoutInflater,
viewGroup: ViewGroup,
attachToRoot: Boolean
): ItemViewBinding {
return ItemEmptyBindingAdapter(
ItemEmptyBinding.inflate(layoutInflater, viewGroup, attachToRoot)
)
}
override fun bind(view: View): ItemViewBinding {
@@ -987,8 +1209,14 @@ class ItemsAdapter(
}
data object ItemFileDirList : Binding {
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
return ItemFileDirListBindingAdapter(ItemFileDirListBinding.inflate(layoutInflater, viewGroup, attachToRoot))
override fun inflate(
layoutInflater: LayoutInflater,
viewGroup: ViewGroup,
attachToRoot: Boolean
): ItemViewBinding {
return ItemFileDirListBindingAdapter(
ItemFileDirListBinding.inflate(layoutInflater, viewGroup, attachToRoot)
)
}
override fun bind(view: View): ItemViewBinding {
@@ -997,8 +1225,14 @@ class ItemsAdapter(
}
data object ItemDirGrid : Binding {
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
return ItemDirGridBindingAdapter(ItemDirGridBinding.inflate(layoutInflater, viewGroup, attachToRoot))
override fun inflate(
layoutInflater: LayoutInflater,
viewGroup: ViewGroup,
attachToRoot: Boolean
): ItemViewBinding {
return ItemDirGridBindingAdapter(
ItemDirGridBinding.inflate(layoutInflater, viewGroup, attachToRoot)
)
}
override fun bind(view: View): ItemViewBinding {
@@ -1007,8 +1241,14 @@ class ItemsAdapter(
}
data object ItemFileGrid : Binding {
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
return ItemFileGridBindingAdapter(ItemFileGridBinding.inflate(layoutInflater, viewGroup, attachToRoot))
override fun inflate(
layoutInflater: LayoutInflater,
viewGroup: ViewGroup,
attachToRoot: Boolean
): ItemViewBinding {
return ItemFileGridBindingAdapter(
ItemFileGridBinding.inflate(layoutInflater, viewGroup, attachToRoot)
)
}
override fun bind(view: View): ItemViewBinding {
@@ -1050,7 +1290,9 @@ class ItemsAdapter(
override fun getRoot(): View = binding.root
}
private class ItemFileDirListBindingAdapter(val binding: ItemFileDirListBinding) : ItemViewBinding {
private class ItemFileDirListBindingAdapter(
val binding: ItemFileDirListBinding
) : ItemViewBinding {
override val itemFrame: FrameLayout = binding.itemFrame
override val itemName: TextView = binding.itemName
override val itemIcon: ImageView = binding.itemIcon
@@ -22,7 +22,9 @@ class ViewPagerAdapter(val activity: SimpleActivity, val tabsToShow: ArrayList<I
(view as MyViewPagerFragment<*>).apply {
val isPickRingtoneIntent = activity.intent.action == RingtoneManager.ACTION_RINGTONE_PICKER
val isGetContentIntent = activity.intent.action == Intent.ACTION_GET_CONTENT || activity.intent.action == Intent.ACTION_PICK
val isGetContentIntent = activity.intent.action == Intent.ACTION_GET_CONTENT
|| activity.intent.action == Intent.ACTION_PICK
|| activity.intent.action == Intent.ACTION_OPEN_DOCUMENT
val isCreateDocumentIntent = activity.intent.action == Intent.ACTION_CREATE_DOCUMENT
val allowPickingMultipleIntent = activity.intent.getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
val getContentMimeType = if (isGetContentIntent) {
@@ -1,13 +1,11 @@
package org.fossify.filemanager.dialogs
import org.fossify.commons.activities.BaseSimpleActivity
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.getAlertDialogBuilder
import org.fossify.commons.extensions.setupDialogStuff
import org.fossify.commons.helpers.TAB_FILES
import org.fossify.commons.helpers.TAB_RECENT_FILES
import org.fossify.commons.helpers.TAB_STORAGE_ANALYSIS
import org.fossify.commons.helpers.isOreoPlus
import org.fossify.commons.views.MyAppCompatCheckbox
import org.fossify.filemanager.R
import org.fossify.filemanager.databinding.DialogManageVisibleTabsBinding
@@ -25,10 +23,6 @@ class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
put(TAB_STORAGE_ANALYSIS, R.id.manage_visible_tabs_storage_analysis)
}
if (!isOreoPlus()) {
binding.manageVisibleTabsStorageAnalysis.beGone()
}
val showTabs = activity.config.showTabs
for ((key, value) in tabs) {
binding.root.findViewById<MyAppCompatCheckbox>(value).isChecked = showTabs and key != 0
@@ -2,15 +2,24 @@ package org.fossify.filemanager.extensions
import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import org.fossify.commons.activities.BaseSimpleActivity
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.isNougatPlus
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getMimeTypeFromUri
import org.fossify.commons.extensions.getParentPath
import org.fossify.commons.extensions.launchActivityIntent
import org.fossify.commons.extensions.openPathIntent
import org.fossify.commons.extensions.renameFile
import org.fossify.commons.extensions.setAsIntent
import org.fossify.commons.extensions.sharePathsIntent
import org.fossify.filemanager.BuildConfig
import org.fossify.filemanager.helpers.*
import org.fossify.filemanager.helpers.OPEN_AS_AUDIO
import org.fossify.filemanager.helpers.OPEN_AS_DEFAULT
import org.fossify.filemanager.helpers.OPEN_AS_IMAGE
import org.fossify.filemanager.helpers.OPEN_AS_TEXT
import org.fossify.filemanager.helpers.OPEN_AS_VIDEO
import java.io.File
fun Activity.sharePaths(paths: ArrayList<String>) {
@@ -19,11 +28,9 @@ fun Activity.sharePaths(paths: ArrayList<String>) {
fun Activity.tryOpenPathIntent(path: String, forceChooser: Boolean, openAsType: Int = OPEN_AS_DEFAULT, finishActivity: Boolean = false) {
if (!forceChooser && path.endsWith(".apk", true)) {
val uri = if (isNougatPlus()) {
FileProvider.getUriForFile(this, "${BuildConfig.APPLICATION_ID}.provider", File(path))
} else {
Uri.fromFile(File(path))
}
val uri = FileProvider.getUriForFile(
this, "${BuildConfig.APPLICATION_ID}.provider", File(path)
)
Intent().apply {
action = Intent.ACTION_VIEW
@@ -4,7 +4,6 @@ import android.content.Context
import android.os.storage.StorageManager
import org.fossify.commons.extensions.isPathOnOTG
import org.fossify.commons.extensions.isPathOnSD
import org.fossify.commons.helpers.isNougatPlus
import org.fossify.filemanager.helpers.Config
import org.fossify.filemanager.helpers.PRIMARY_VOLUME_NAME
import java.util.Locale
@@ -15,15 +14,13 @@ fun Context.isPathOnRoot(path: String) = !(path.startsWith(config.internalStorag
fun Context.getAllVolumeNames(): List<String> {
val volumeNames = mutableListOf(PRIMARY_VOLUME_NAME)
if (isNougatPlus()) {
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
getExternalFilesDirs(null)
.mapNotNull { storageManager.getStorageVolume(it) }
.filterNot { it.isPrimary }
.mapNotNull { it.uuid?.lowercase(Locale.US) }
.forEach {
volumeNames.add(it)
}
}
val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
getExternalFilesDirs(null)
.mapNotNull { storageManager.getStorageVolume(it) }
.filterNot { it.isPrimary }
.mapNotNull { it.uuid?.lowercase(Locale.US) }
.forEach {
volumeNames.add(it)
}
return volumeNames
}
@@ -1,3 +1,15 @@
package org.fossify.filemanager.extensions
fun String.isZipFile() = endsWith(".zip", true)
fun String.isPathInHiddenFolder(): Boolean {
val parts = split("/")
for (i in 1 until parts.size - 1) {
val part = parts[i]
val isHidden = part.startsWith(".") && part != "." && part != ".." && part.isNotEmpty()
if (isHidden) {
return true
}
}
return false
}
@@ -0,0 +1,15 @@
package org.fossify.filemanager.extensions
import net.lingala.zip4j.model.LocalFileHeader
import java.io.File
fun File.setLastModified(localFileHeader: LocalFileHeader) {
setLastModified(localFileHeader.lastModifiedOrCurrentTimeMillis)
}
private val LocalFileHeader.lastModifiedOrCurrentTimeMillis
get() = if (lastModifiedTimeEpoch == 0L) {
System.currentTimeMillis()
} else {
lastModifiedTimeEpoch
}
@@ -186,7 +186,8 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
if (activity?.isDestroyed == false && activity?.isFinishing == false) {
val config = context!!.config
if (context.isRestrictedSAFOnlyRoot(path)) {
activity?.handleAndroidSAFDialog(path) {
activity?.runOnUiThread { hideProgressBar() }
activity?.handleAndroidSAFDialog(path, openInSystemAppAllowed = true) {
if (!it) {
activity?.toast(R.string.no_storage_permissions)
return@handleAndroidSAFDialog
@@ -256,7 +257,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
}
var lastModified = lastModifieds.remove(curPath)
val isDirectory = if (lastModified != null) false else file.isDirectory
val isDirectory = file.isDirectory
val children = if (isDirectory && getProperChildCount) file.getDirectChildrenCount(context, showHidden) else 0
val size = if (isDirectory) {
if (isSortingBySize) {
@@ -376,6 +377,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
return files
}
val normalizedText = text.normalizeString()
val sorting = context!!.config.getFolderSorting(path)
FileDirItem.sorting = context!!.config.getFolderSorting(currentPath)
val isSortingBySize = sorting and SORT_BY_SIZE != 0
@@ -385,7 +387,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
}
if (it.isDirectory) {
if (it.name.contains(text, true)) {
if (it.name.normalizeString().contains(normalizedText, true)) {
val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false)
if (fileDirItem != null) {
files.add(fileDirItem)
@@ -394,7 +396,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
files.addAll(searchFiles(text, it.absolutePath))
} else {
if (it.name.contains(text, true)) {
if (it.name.normalizeString().contains(normalizedText, true)) {
val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false)
if (fileDirItem != null) {
files.add(fileDirItem)
@@ -6,11 +6,17 @@ import android.provider.MediaStore.Files
import android.provider.MediaStore.Files.FileColumns
import android.util.AttributeSet
import androidx.core.os.bundleOf
import org.fossify.commons.extensions.*
import org.fossify.commons.extensions.areSystemAnimationsEnabled
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.getDoesFilePathExist
import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getLongValue
import org.fossify.commons.extensions.getStringValue
import org.fossify.commons.extensions.normalizeString
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.helpers.VIEW_TYPE_GRID
import org.fossify.commons.helpers.VIEW_TYPE_LIST
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isOreoPlus
import org.fossify.commons.models.FileDirItem
import org.fossify.commons.views.MyGridLayoutManager
import org.fossify.commons.views.MyRecyclerView
@@ -19,6 +25,7 @@ import org.fossify.filemanager.activities.SimpleActivity
import org.fossify.filemanager.adapters.ItemsAdapter
import org.fossify.filemanager.databinding.RecentsFragmentBinding
import org.fossify.filemanager.extensions.config
import org.fossify.filemanager.extensions.isPathInHiddenFolder
import org.fossify.filemanager.helpers.MAX_COLUMN_COUNT
import org.fossify.filemanager.interfaces.ItemOperationsListener
import org.fossify.filemanager.models.ListItem
@@ -156,17 +163,13 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
)
try {
if (isOreoPlus()) {
val queryArgs = bundleOf(
ContentResolver.QUERY_ARG_LIMIT to RECENTS_LIMIT,
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(FileColumns.DATE_MODIFIED),
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
context?.contentResolver?.query(uri, projection, queryArgs, null)
} else {
val sortOrder = "${FileColumns.DATE_MODIFIED} DESC LIMIT $RECENTS_LIMIT"
context?.contentResolver?.query(uri, projection, null, null, sortOrder)
}?.use { cursor ->
val queryArgs = bundleOf(
ContentResolver.QUERY_ARG_LIMIT to RECENTS_LIMIT,
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(FileColumns.DATE_MODIFIED),
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
context?.contentResolver?.query(uri, projection, queryArgs, null)?.use { cursor ->
if (cursor.moveToFirst()) {
do {
val path = cursor.getStringValue(FileColumns.DATA)
@@ -177,9 +180,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
val size = cursor.getLongValue(FileColumns.SIZE)
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
val fileDirItem = ListItem(path, name, false, 0, size, modified, false, false)
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
val isHiddenFile = name.startsWith(".")
val shouldShow = showHidden || (!isHiddenFile && !path.isPathInHiddenFolder())
if (shouldShow && activity?.getDoesFilePathExist(path) == true) {
if (wantedMimeTypes.any { isProperMimeType(it, path, false) }) {
val fileDirItem = ListItem(path, name, false, 0, size, modified, false, false)
listItems.add(fileDirItem)
}
}
@@ -241,7 +246,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
override fun searchQueryChanged(text: String) {
lastSearchedText = text
val filtered = filesIgnoringSearch.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList<ListItem>
val normalizedText = text.normalizeString()
val filtered = filesIgnoringSearch.filter {
it.mName.normalizeString().contains(normalizedText, true)
}.toMutableList() as ArrayList<ListItem>
binding.apply {
(recentsList.adapter as? ItemsAdapter)?.updateItems(filtered, text)
recentsPlaceholder.beVisibleIf(filtered.isEmpty())
@@ -16,8 +16,27 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.os.bundleOf
import androidx.core.view.children
import androidx.core.view.isVisible
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.*
import org.fossify.commons.extensions.adjustAlpha
import org.fossify.commons.extensions.applyColorFilter
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.fadeIn
import org.fossify.commons.extensions.formatSize
import org.fossify.commons.extensions.getIsPathDirectory
import org.fossify.commons.extensions.getLongValue
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.getStringValue
import org.fossify.commons.extensions.normalizeString
import org.fossify.commons.extensions.queryCursor
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.updateTextColors
import org.fossify.commons.helpers.LOWER_ALPHA
import org.fossify.commons.helpers.SHORT_ANIMATION_DURATION
import org.fossify.commons.helpers.VIEW_TYPE_GRID
import org.fossify.commons.helpers.VIEW_TYPE_LIST
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.models.FileDirItem
import org.fossify.commons.views.MyGridLayoutManager
import org.fossify.filemanager.R
@@ -29,7 +48,19 @@ import org.fossify.filemanager.databinding.StorageFragmentBinding
import org.fossify.filemanager.extensions.config
import org.fossify.filemanager.extensions.formatSizeThousand
import org.fossify.filemanager.extensions.getAllVolumeNames
import org.fossify.filemanager.helpers.*
import org.fossify.filemanager.helpers.ARCHIVES
import org.fossify.filemanager.helpers.AUDIO
import org.fossify.filemanager.helpers.DOCUMENTS
import org.fossify.filemanager.helpers.IMAGES
import org.fossify.filemanager.helpers.OTHERS
import org.fossify.filemanager.helpers.PRIMARY_VOLUME_NAME
import org.fossify.filemanager.helpers.SHOW_MIMETYPE
import org.fossify.filemanager.helpers.VIDEOS
import org.fossify.filemanager.helpers.VOLUME_NAME
import org.fossify.filemanager.helpers.archiveMimeTypes
import org.fossify.filemanager.helpers.extraAudioMimeTypes
import org.fossify.filemanager.helpers.extraDocumentMimeTypes
import org.fossify.filemanager.helpers.getListItemsFromFileDirItems
import org.fossify.filemanager.interfaces.ItemOperationsListener
import org.fossify.filemanager.models.ListItem
import java.util.Locale
@@ -65,7 +96,6 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
}
totalSpace.text = String.format(context.getString(R.string.total_storage), "…")
getSizes(volumeName)
if (volumeNames.size > 1) {
root.children.forEach { it.beGone() }
@@ -125,8 +155,7 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
val tealColor = context.resources.getColor(R.color.md_teal_700)
val pinkColor = context.resources.getColor(R.color.md_pink_700)
volumes.entries.forEach { (it, volumeBinding) ->
getSizes(it)
volumes.values.forEach { volumeBinding ->
volumeBinding.apply {
mainStorageUsageProgressbar.setIndicatorColor(properPrimaryColor)
mainStorageUsageProgressbar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA)
@@ -173,10 +202,6 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
}
private fun getSizes(volumeName: String) {
if (!isOreoPlus()) {
return
}
ensureBackgroundThread {
val filesSize = getSizesByMimeType(volumeName)
val fileSizeImages = filesSize[IMAGES]!!
@@ -284,15 +309,10 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
if (storageVolume.isPrimary) {
// internal storage
volumeName = PRIMARY_VOLUME_NAME
if (isOreoPlus()) {
val storageStatsManager = context.getSystemService(AppCompatActivity.STORAGE_STATS_SERVICE) as StorageStatsManager
val uuid = StorageManager.UUID_DEFAULT
totalStorageSpace = storageStatsManager.getTotalBytes(uuid)
freeStorageSpace = storageStatsManager.getFreeBytes(uuid)
} else {
totalStorageSpace = file.totalSpace
freeStorageSpace = file.freeSpace
}
val storageStatsManager = context.getSystemService(AppCompatActivity.STORAGE_STATS_SERVICE) as StorageStatsManager
val uuid = StorageManager.UUID_DEFAULT
totalStorageSpace = storageStatsManager.getTotalBytes(uuid)
freeStorageSpace = storageStatsManager.getFreeBytes(uuid)
} else {
volumeName = storageVolume.uuid!!.lowercase(Locale.US)
totalStorageSpace = file.totalSpace
@@ -314,12 +334,14 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
freeSpaceValue.text = freeStorageSpace.formatSizeThousand()
totalSpace.text = String.format(context.getString(R.string.total_storage), totalStorageSpace.formatSizeThousand())
freeSpaceLabel.beVisible()
getSizes(volumeName)
}
}
}
}
override fun searchQueryChanged(text: String) {
val normalizedText = text.normalizeString()
lastSearchedText = text
binding.apply {
if (text.isNotEmpty()) {
@@ -344,8 +366,10 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
} else {
showProgressBar()
ensureBackgroundThread {
val start = System.currentTimeMillis()
val filtered = allDeviceListItems.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList<ListItem>
val filtered = allDeviceListItems.filter {
it.mName.normalizeString().contains(normalizedText, true)
}.toMutableList() as ArrayList<ListItem>
if (lastSearchedText != text) {
return@ensureBackgroundThread
}
@@ -405,16 +429,12 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
)
try {
if (isOreoPlus()) {
val queryArgs = bundleOf(
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(MediaStore.Files.FileColumns.DATE_MODIFIED),
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
context?.contentResolver?.query(uri, projection, queryArgs, null)
} else {
val sortOrder = "${MediaStore.Files.FileColumns.DATE_MODIFIED} DESC"
context?.contentResolver?.query(uri, projection, null, null, sortOrder)
}?.use { cursor ->
val queryArgs = bundleOf(
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(MediaStore.Files.FileColumns.DATE_MODIFIED),
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
context?.contentResolver?.query(uri, projection, queryArgs, null)?.use { cursor ->
if (cursor.moveToFirst()) {
do {
try {
@@ -0,0 +1,46 @@
package org.fossify.filemanager.views
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
class MySwipeRefreshLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
) : SwipeRefreshLayout(context, attrs) {
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
// Setting "isEnabled = false" is recommended for users of this ViewGroup
// who who are not interested in the pull to refresh functionality
// Setting this easily avoids executing code needlessly before the check for "canChildScrollUp".
if (!isEnabled) {
return false
}
return super.onInterceptTouchEvent(ev)
}
override fun onStartNestedScroll(child: View, target: View, nestedScrollAxes: Int): Boolean {
// Ignoring nested scrolls from descendants.
// Allowing descendants to trigger nested scrolls would defeat the purpose of this class
// and result in pull to refresh to happen for all movements on the Y axis
// (even as part of scale/quick scale gestures) while also doubling the throbber with the overscroll shadow.
return if (isEnabled) {
return false
} else {
super.onStartNestedScroll(child, target, nestedScrollAxes)
}
}
override fun canChildScrollUp(): Boolean {
val directChild = getChildAt(0)
return when (directChild) {
is RecyclerViewFastScroller -> {
val innerRecyclerView = directChild.getChildAt(0)
innerRecyclerView?.canScrollVertically(-1) == true
}
else -> super.canChildScrollUp()
}
}
}
+35 -30
View File
@@ -63,15 +63,20 @@
android:layout_height="wrap_content"
android:text="@string/general_settings" />
<org.fossify.commons.views.PurchaseThankYouItem
android:id="@+id/settings_purchase_thank_you_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<RelativeLayout
android:id="@+id/settings_use_english_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_use_english"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/use_english_language" />
@@ -171,13 +176,13 @@
<RelativeLayout
android:id="@+id/settings_press_back_twice_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_press_back_twice"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/press_back_twice" />
@@ -197,13 +202,13 @@
<RelativeLayout
android:id="@+id/settings_show_hidden_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_show_hidden"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_hidden_items" />
@@ -223,13 +228,13 @@
<RelativeLayout
android:id="@+id/settings_enable_pull_to_refresh_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_enable_pull_to_refresh"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/enable_pull_to_refresh" />
@@ -249,13 +254,13 @@
<RelativeLayout
android:id="@+id/settings_keep_last_modified_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_keep_last_modified"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/keep_last_modified" />
@@ -264,13 +269,13 @@
<RelativeLayout
android:id="@+id/settings_skip_delete_confirmation_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_skip_delete_confirmation"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/skip_delete_confirmation" />
@@ -290,13 +295,13 @@
<RelativeLayout
android:id="@+id/settings_password_protection_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_password_protection"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/password_protect_hidden_items" />
@@ -305,13 +310,13 @@
<RelativeLayout
android:id="@+id/settings_app_password_protection_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_app_password_protection"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/password_protect_whole_app" />
@@ -320,13 +325,13 @@
<RelativeLayout
android:id="@+id/settings_file_deletion_password_protection_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_file_deletion_password_protection"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/password_protect_file_deletion" />
@@ -335,13 +340,13 @@
<RelativeLayout
android:id="@+id/settings_enable_root_access_holder"
style="@style/SettingsHolderCheckboxStyle"
style="@style/SettingsHolderSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyAppCompatCheckbox
<org.fossify.commons.views.MyMaterialSwitch
android:id="@+id/settings_enable_root_access"
style="@style/SettingsCheckboxStyle"
style="@style/SettingsSwitchStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/enable_root_access" />
+2 -2
View File
@@ -68,7 +68,7 @@
android:textStyle="italic"
android:visibility="gone" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
<org.fossify.filemanager.views.MySwipeRefreshLayout
android:id="@+id/items_swipe_refresh"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -90,7 +90,7 @@
app:layoutManager="org.fossify.commons.views.MyGridLayoutManager" />
</com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</org.fossify.filemanager.views.MySwipeRefreshLayout>
</RelativeLayout>
<org.fossify.commons.views.MyFloatingActionButton
+2 -2
View File
@@ -22,7 +22,7 @@
android:visibility="gone"
tools:visibility="visible" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
<org.fossify.filemanager.views.MySwipeRefreshLayout
android:id="@+id/recents_swipe_refresh"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -37,5 +37,5 @@
android:scrollbars="none"
app:layoutManager="org.fossify.commons.views.MyGridLayoutManager" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</org.fossify.filemanager.views.MySwipeRefreshLayout>
</org.fossify.filemanager.fragments.RecentsFragment>
+3 -3
View File
@@ -62,14 +62,14 @@
android:id="@+id/settings"
android:icon="@drawable/ic_settings_cog_vector"
android:title="@string/settings"
app:showAsAction="ifRoom" />
app:showAsAction="never" />
<item
android:id="@+id/about"
android:icon="@drawable/ic_info_vector"
android:title="@string/about"
app:showAsAction="ifRoom" />
app:showAsAction="never" />
<item
android:id="@+id/more_apps_from_us"
android:title="@string/more_apps_from_us"
android:title="@string/more_fossify_apps"
app:showAsAction="never" />
</menu>
+7 -2
View File
@@ -11,13 +11,18 @@
<item
android:id="@+id/menu_save"
android:icon="@drawable/ic_save_vector"
android:title="@string/save_as"
android:title="@string/save"
app:showAsAction="always" />
<item
android:id="@+id/menu_save_as"
android:showAsAction="never"
android:title="@string/save_as"
app:showAsAction="never" />
<item
android:id="@+id/menu_print"
android:icon="@drawable/ic_print_vector"
android:title="@string/print"
app:showAsAction="always" />
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_open_with"
android:showAsAction="never"
@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_print"
android:icon="@drawable/ic_print_vector"
android:title="@string/print"
app:showAsAction="always" />
</menu>
+1
View File
@@ -0,0 +1 @@
unqualifiedResLocale=en-US
+30 -20
View File
@@ -2,36 +2,46 @@
<resources>
<string name="app_launcher_name">مدير الملفات</string>
<string name="press_back_again">اضغط مرة أخرى للخروج</string>
<string name="go_to_home_folder">الذهاب الى الرئيسية</string>
<string name="set_as_home_folder">تعيين كمجلد رئيسي</string>
<string name="home_folder_updated">تم تحديث المجلد الرئيسي</string>
<string name="copy_path">نسخ المسار الى الحافظة</string>
<string name="path_copied">تم نسخ المسار</string>
<string name="go_to_home_folder">اذهب إلى المجلد المنزل</string>
<string name="set_as_home_folder">عيّن كمجلد المنزل</string>
<string name="home_folder_updated">حُدِّث مجلد المنزل</string>
<string name="copy_path">انسخ المسار إلى الحافظة</string>
<string name="path_copied">نُسخ المسار</string>
<string name="select_audio_file">الرجاء تحديد ملف صوتي</string>
<string name="search_folder">مجلد البحث</string>
<string name="rooted_device_only">تعمل هذه العملية فقط على الأجهزة المتجذرة</string>
<string name="recents">الأحدث</string>
<string name="show_recents">إظهار الأحدث</string>
<string name="invert_colors">عكس الألوان</string>
<string name="compress">ضغط</string>
<string name="show_recents">أظهر الأحدث</string>
<string name="invert_colors">اعكس الألوان</string>
<string name="compress">اضغط</string>
<string name="decompress">فك الضغط</string>
<string name="compress_as">ضغط كا</string>
<string name="compressing">ضغط…</string>
<string name="decompressing">فك الضغط…</string>
<string name="compress_as">اضغط كَ</string>
<string name="compressing">جار الضغط…</string>
<string name="decompressing">جارِ فك الضغط…</string>
<string name="compression_successful">نجح الضغط</string>
<string name="decompression_successful">نجح التفكيك</string>
<string name="compressing_failed">أخفق الضغط</string>
<string name="decompressing_failed">أخفق إلغاء الضغط</string>
<string name="manage_favorites">إدارة المفضلة</string>
<string name="go_to_favorite">الذهاب الى المفضلة</string>
<string name="decompression_successful">نجح فك ضغط</string>
<string name="compressing_failed">فشل الضغط</string>
<string name="decompressing_failed">فشل فك الضغط</string>
<string name="manage_favorites">أدر المفضلة</string>
<string name="go_to_favorite">اذهب الى المفضلة</string>
<string name="favorites_activity_placeholder">يمكنك إضافة المجلدات المستخدمة بشكل متكرر إلى المفضلة لسهولة الوصول إليها من أي مكان.</string>
<string name="file_editor">محرر الملفات</string>
<string name="file_editor">محرّر الملفات</string>
<string name="storage_analysis">تحليل التخزين</string>
<string name="images">الصور</string>
<string name="videos">الفيديوهات</string>
<string name="archives">الأرشيف</string>
<string name="others">الاخرين</string>
<string name="others">الآخرين</string>
<string name="total_storage">إجمالي مساحة التخزين: %s</string>
<string name="enable_root_access">تفعيل الدخول الى مسار الروت</string>
<string name="press_back_twice">تتطلب الضغط على رجوع مرتين لمغادرة التطبيق</string>
<string name="enable_root_access">فعّل وصول الجذر (root)</string>
<string name="press_back_twice">يتطلب النقر على رجوع مرتين لمغادرة التطبيق</string>
<string name="audio">صوت</string>
<string name="documents">المستندات</string>
<string name="downloads">التنزيلات</string>
<string name="storage_free">خالية</string>
<string name="open_as">افتح كـ</string>
<string name="image_file">ملف صورة</string>
<string name="text_file">ملف نصي</string>
<string name="audio_file">ملف صوتي</string>
<string name="video_file">ملف فيديو</string>
<string name="other_file">ملف آخر</string>
</resources>
+7 -7
View File
@@ -3,18 +3,18 @@
<string name="app_launcher_name">Файлавы менеджар</string>
<string name="press_back_again">Націсніце назад яшчэ раз, каб выйсці</string>
<string name="go_to_home_folder">Перайдзіце ў хатнюю тэчку</string>
<string name="set_as_home_folder">Усталяваць у якасці хатняй тэчкі</string>
<string name="set_as_home_folder">Ўсталяваць ў якасці хатняй тэчкі</string>
<string name="home_folder_updated">Хатняя папка абноўлена</string>
<string name="copy_path">Капіяваць шлях у буфер абмену</string>
<string name="copy_path">Скапіяваць шлях ў буфер абмену</string>
<string name="path_copied">Шлях скапіяваны</string>
<string name="select_audio_file">Выберыце аўдыяфайл</string>
<string name="search_folder">Тэчка пошуку</string>
<string name="rooted_device_only">Гэтая аперацыя працуе толькі на каранёвых прыладах</string>
<string name="rooted_device_only">Гэтая каманда працуе толькі на прыладах з root-доступам</string>
<string name="recents">Апошнія</string>
<string name="show_recents">Паказаць апошнія</string>
<string name="invert_colors">Інвертаваць колеры</string>
<string name="open_as">Адкрыць як</string>
<string name="text_file">Тэкст</string>
<string name="text_file">Тэкставы файл</string>
<string name="image_file">Выява</string>
<string name="audio_file">Аўдыё</string>
<string name="video_file">Відэа</string>
@@ -40,8 +40,8 @@
<string name="downloads">Спампоўкі</string>
<string name="archives">Архівы</string>
<string name="others">Іншае</string>
<string name="storage_free">бясплатна</string>
<string name="storage_free">свабодна</string>
<string name="total_storage">Агульная памяць: %s</string>
<string name="enable_root_access">Уключыць каранёвы доступ</string>
<string name="enable_root_access">Ўключыць root-доступ</string>
<string name="press_back_twice">Патрабуецца двойчы націснуць \"Назад\", каб выйсці з праграмы</string>
</resources>
</resources>
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Файлов Мениджър</string>
<string name="app_launcher_name">Управление на файлове</string>
<string name="press_back_again">Натиснете назад отново, за да излезете</string>
<string name="go_to_home_folder">Към началната папка</string>
<string name="set_as_home_folder">Задаване като начална папка</string>
@@ -34,7 +34,7 @@
<string name="file_editor">Файлов редактор</string>
<string name="storage_analysis">Анализ на съхранението</string>
<string name="images">Изображения</string>
<string name="videos">Видеоклипове</string>
<string name="videos">Видео</string>
<string name="archives">Архиви</string>
<string name="others">Други</string>
<string name="total_storage">Общо място за съхранение: %s</string>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="go_to_home_folder">راو و دوبلگه هووه</string>
<string name="set_as_home_folder">سامووݩ و عونوان دوبلگه هووه</string>
<string name="copy_path">لف گیری تور منه کیلیپ بورد</string>
</resources>
+46 -1
View File
@@ -1,2 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="invert_colors">Tuginañ al livioù</string>
<string name="open_as">Digeriñ evel</string>
<string name="text_file">Restr testenn</string>
<string name="image_file">Restr skeudenn</string>
<string name="audio_file">Rest aodio</string>
<string name="video_file">Restr video</string>
<string name="other_file">Restr all</string>
<string name="compress">Koazhañ</string>
<string name="compress_as">Koazhañ evel</string>
<string name="compressing">O koazhañ…</string>
<string name="decompressing">O tigoazhañ…</string>
<string name="decompress">Digoazhañ</string>
<string name="decompression_successful">Digoazhet gant berzh</string>
<string name="compression_successful">Koazhet gant berzh</string>
<string name="compressing_failed">C\'hwitadenn war ar c\'hoazhañ</string>
<string name="decompressing_failed">C\'hwitadenn war an digoazhañ</string>
<string name="favorites_activity_placeholder">Gallout a rit ouzhpennañ teuliadoù arveret alies d\'ho sinedoù evit gallout mont eno adalek n\'eus forzh pelec\'h.</string>
<string name="file_editor">Embanner restr</string>
<string name="manage_favorites">Ardeiñ ar sinedoù</string>
<string name="go_to_favorite">Mont d\'ar sined</string>
<string name="images">Skeudennoù</string>
<string name="audio">Aodio</string>
<string name="documents">Teulioù</string>
<string name="downloads">Pellgargadurioù</string>
<string name="storage_analysis">Dezrann ar c\'hadaviñ</string>
<string name="videos">Videoioù</string>
<string name="archives">Dielloù</string>
<string name="storage_free">dieub</string>
<string name="others">Re all</string>
<string name="total_storage">Kadaviñ hollek: %s</string>
<string name="enable_root_access">Gweredekaat an haeziñ \"root\"</string>
<string name="press_back_twice">Dav eo pouezañ War-gil div wech evit kuitaat an arload</string>
<string name="app_launcher_name">Ardoer restroù</string>
<string name="press_back_again">Pouezit war an afell War-gil en-dro evit kuitaat</string>
<string name="go_to_home_folder">Mont d\'an teuliad degemer</string>
<string name="copy_path">Eilañ an treug er golver</string>
<string name="path_copied">Treug eilet</string>
<string name="select_audio_file">Diuzit ur restr aodio</string>
<string name="recents">Nevesañ</string>
<string name="show_recents">Diskouez ar re nevesañ</string>
<string name="set_as_home_folder">Despizañ evel teuliad degemer</string>
<string name="home_folder_updated">Hizivaet eo bet an teuliad degemer</string>
<string name="search_folder">Klask en teuliad</string>
<string name="rooted_device_only">Mont a ra en-dro ar gwezhiadur-mañ war an trevnadoù rootet hepken</string>
</resources>
+3 -3
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Gestor de fitxers</string>
<string name="press_back_again">Premeu enrere de nou per sortir</string>
<string name="press_back_again">Premeu enrere de nou per a sortir</string>
<string name="go_to_home_folder">Ves a la carpeta d\'inici</string>
<string name="set_as_home_folder">Estableix com a carpeta d\'inici</string>
<string name="home_folder_updated">S\'ha actualitzat la carpeta d\'inici</string>
@@ -29,7 +29,7 @@
<string name="decompressing_failed">Ha fallat la descompressió</string>
<string name="manage_favorites">Gestiona els preferits</string>
<string name="go_to_favorite">Ves als preferits</string>
<string name="favorites_activity_placeholder">Podeu afegir carpetes que utilitzeu amb freqüència als preferits per accedir fàcilment des de qualsevol lloc.</string>
<string name="favorites_activity_placeholder">Podeu afegir carpetes que utilitzeu amb freqüència als preferits per a accedir fàcilment des de qualsevol lloc.</string>
<string name="file_editor">Editor de fitxers</string>
<string name="storage_analysis">Anàlisi d\'emmagatzematge</string>
<string name="images">Imatges</string>
@@ -41,7 +41,7 @@
<string name="storage_free">lliure</string>
<string name="total_storage">Emmagatzematge total: %s</string>
<string name="enable_root_access">Habilita l\'accés «root»</string>
<string name="press_back_twice">Cal que premeu Enrere dues vegades per sortir de l\'aplicació</string>
<string name="press_back_twice">Cal que premeu Enrere dues vegades per a sortir de l\'aplicació</string>
<string name="documents">Documents</string>
<string name="recents">Recents</string>
</resources>
+3 -1
View File
@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_launcher_name">بەڕێوەبەری فایل</string>
</resources>
+7 -7
View File
@@ -5,11 +5,11 @@
<string name="go_to_home_folder">Gå til hjemmemappen</string>
<string name="set_as_home_folder">Sæt som hjemmemappe</string>
<string name="home_folder_updated">Hjemmemappe opdateret</string>
<string name="copy_path">Kopier sti til udklipsholderen</string>
<string name="copy_path">Kopiér sti til udklipsholder</string>
<string name="path_copied">Sti kopieret</string>
<string name="select_audio_file">Vælg en lydfil</string>
<string name="search_folder">Søg i mappe</string>
<string name="rooted_device_only">Denne funktion virker kun på rootede enheder</string>
<string name="rooted_device_only">Denne handling virker kun på rootede enheder</string>
<string name="recents">Seneste</string>
<string name="show_recents">Vis seneste</string>
<string name="invert_colors">Inverter farver</string>
@@ -28,11 +28,11 @@
<string name="decompression_successful">Dekomprimeret</string>
<string name="compressing_failed">Komprimering mislykkedes</string>
<string name="decompressing_failed">Dekomprimering mislykkedes</string>
<string name="manage_favorites">Håndter favoritter</string>
<string name="manage_favorites">Administrer favoritter</string>
<string name="go_to_favorite">Gå til favorit</string>
<string name="favorites_activity_placeholder">Du kan tilføje ofte benyttede mapper til favoritter, så du hurtigt kan finde dem igen.</string>
<string name="favorites_activity_placeholder">Du kan føje ofte brugte mapper til favoritter for nem adgang overalt.</string>
<string name="file_editor">Fileditor</string>
<string name="storage_analysis">Lagersanalyse</string>
<string name="storage_analysis">Lagringsanalyse</string>
<string name="images">Billeder</string>
<string name="videos">Videoer</string>
<string name="audio">Lyd</string>
@@ -42,6 +42,6 @@
<string name="others">Andre</string>
<string name="storage_free">fri</string>
<string name="total_storage">Samlet lagerplads: %s</string>
<string name="enable_root_access">Aktiver root-adgang</string>
<string name="press_back_twice">Kræv to tryk på tilbage for at forlade appen</string>
<string name="enable_root_access">Aktivér root-adgang</string>
<string name="press_back_twice">Dobbelttryk på Tilbage for at afslutte appen</string>
</resources>
+3 -1
View File
@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_launcher_name">File Manager</string>
</resources>
+23 -2
View File
@@ -18,9 +18,30 @@
<string name="decompressing_failed">Maldensigo malsukcesis</string>
<string name="file_editor">Dosierredaktilo</string>
<string name="images">Bildoj</string>
<string name="videos">Filmoj</string>
<string name="audio">Sonoj</string>
<string name="videos">Filmetoj</string>
<string name="audio">Sono</string>
<string name="documents">Dokumentoj</string>
<string name="downloads">Elŝutoj</string>
<string name="others">Aliaj</string>
<string name="select_audio_file">Bonvolu elekti sondosieron</string>
<string name="invert_colors">Inversigi kolorojn</string>
<string name="manage_favorites">Administri plej ŝatatajn</string>
<string name="go_to_favorite">Iri al plej ŝatata</string>
<string name="favorites_activity_placeholder">Vi povas aldoni ofte uzatajn dosierujojn al viaj plej ŝatataj por facile atingi ilin el ie ajn.</string>
<string name="archives">Arkivoj</string>
<string name="storage_free">libera</string>
<string name="total_storage">Tuta memoro: %s</string>
<string name="enable_root_access">Ŝalti ĉefuzantajn permesojn</string>
<string name="press_back_again">Premu la revenobutonon denove por eliri</string>
<string name="go_to_home_folder">Iri al la hejma dosierujo</string>
<string name="set_as_home_folder">Difini kiel hejma dosierujo</string>
<string name="home_folder_updated">Hejma dosierujo ĝisdatigita</string>
<string name="copy_path">Kopii vojon al la tondujo</string>
<string name="path_copied">Vojo kopiita</string>
<string name="search_folder">Serĉi dosierujon</string>
<string name="rooted_device_only">Ĉi tiu operacio funkcias nur sur aparatoj root-itaj</string>
<string name="recents">Lastaj</string>
<string name="show_recents">Montri lastajn</string>
<string name="storage_analysis">Memora analizo</string>
<string name="press_back_twice">Postuli premi la revenobutonon du fojojn por eliri el la aplikaĵo</string>
</resources>
+5 -1
View File
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_launcher_name">Gestor de archivos</string>
<string name="press_back_again">Presione hacia atrás nuevamente para salir</string>
<string name="go_to_home_folder">Ir a la carpeta de inicio</string>
</resources>
+3 -3
View File
@@ -9,7 +9,7 @@
<string name="downloads">Deskargak</string>
<string name="others">Bestelakoak</string>
<string name="enable_root_access">Gaitu root sarbidea</string>
<string name="press_back_twice">Eskatu Atzera bi aldiz sakatu aplikaziotik irteteko</string>
<string name="press_back_twice">Sakatu Atzera bi aldiz sakatu aplikaziotik irteteko</string>
<string name="image_file">Irudi-fitxategia</string>
<string name="audio_file">Audio-fitxategia</string>
<string name="compression_successful">Trinkotzea behar bezala burutu da</string>
@@ -20,7 +20,7 @@
<string name="path_copied">Bidea kopiatu da</string>
<string name="select_audio_file">Hautatu audio-fitxategi bat</string>
<string name="search_folder">Bilatu karpeta</string>
<string name="rooted_device_only">Eragiketa honek ruteatutako gailuetan bakarrik funtzionatzen du</string>
<string name="rooted_device_only">Eragiketa honek rooteatutako gailuetan bakarrik funtzionatzen du</string>
<string name="recents">Azkenak</string>
<string name="show_recents">Erakutsi azkenak</string>
<string name="invert_colors">Alderantzikatu koloreak</string>
@@ -44,4 +44,4 @@
<string name="set_as_home_folder">Ezarri hasierako karpeta gisa</string>
<string name="home_folder_updated">Hasierako karpeta eguneratu da</string>
<string name="copy_path">Kopiatu bidea arbelean</string>
</resources>
</resources>
+1 -1
View File
@@ -39,7 +39,7 @@
<string name="downloads">Lataukset</string>
<string name="archives">Arkistot</string>
<string name="others">Muut</string>
<string name="storage_free">ilmainen</string>
<string name="storage_free">vapaana</string>
<string name="total_storage">Tallennustila: %s</string>
<string name="enable_root_access">Ota käyttöön root-ominaisuudet</string>
<string name="press_back_twice">Ota käyttöön sovelluksesta poistuminen kahdella takaisin-painikkeen painalluksella</string>
+2 -2
View File
@@ -26,8 +26,8 @@
<string name="decompressing">Décompression…</string>
<string name="compression_successful">Compression réussie</string>
<string name="decompression_successful">Décompression réussie</string>
<string name="compressing_failed">Compression ratée</string>
<string name="decompressing_failed">Décompression ratée</string>
<string name="compressing_failed">Échec de la compression</string>
<string name="decompressing_failed">Échec de la décompression</string>
<string name="manage_favorites">Gérer les favoris</string>
<string name="go_to_favorite">Aller au favori</string>
<string name="favorites_activity_placeholder">Vous pouvez ajouter des dossiers souvent utilisés comme favoris pour y avoir accès rapidement depuis n\'importe où.</string>
+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Bainisteoir Comhad</string>
<string name="go_to_home_folder">Téigh go dtí an fillteán baile</string>
<string name="home_folder_updated">Nuashonraíodh an fillteán baile</string>
<string name="copy_path">Cóipeáil cosán chuig an ngearrthaisce</string>
<string name="path_copied">Cóipeáladh an cosán</string>
<string name="invert_colors">Inbhéartaigh dathanna</string>
<string name="open_as">Oscail mar</string>
<string name="video_file">Comhad físe</string>
<string name="other_file">Comhad eile</string>
<string name="compress">Comhbhrúigh</string>
<string name="compress_as">Comhbhrúigh mar</string>
<string name="decompressing">Ag dí-chomhbhrú…</string>
<string name="decompression_successful">Dí-chomhbhrú rathúil</string>
<string name="compressing_failed">Theip ar chomhbhrú</string>
<string name="go_to_favorite">Téigh go dtí is fearr leat</string>
<string name="file_editor">Eagarthóir Comhad</string>
<string name="storage_analysis">Anailís stórála</string>
<string name="images">Íomhánna</string>
<string name="downloads">Íoslódálacha</string>
<string name="archives">Cartlanna</string>
<string name="others">Eile</string>
<string name="storage_free">saor</string>
<string name="total_storage">Stóras iomlán: %s</string>
<string name="enable_root_access">Cumasaigh rochtain fréimhe</string>
<string name="press_back_twice">A cheangal ar an cnaipe Ar ais faoi dhó a fhágáil ar an aip</string>
<string name="press_back_again">Brúigh ar ais arís chun imeacht</string>
<string name="select_audio_file">Roghnaigh comhad fuaime</string>
<string name="search_folder">Cuardach fillteán</string>
<string name="recents">Le déanaí</string>
<string name="show_recents">Taispeáin nuashonruithe</string>
<string name="set_as_home_folder">Socraigh mar fhillteán baile</string>
<string name="image_file">Comhad íomhá</string>
<string name="audio_file">Comhad fuaime</string>
<string name="rooted_device_only">Ní oibríonn an oibríocht seo ach ar fheistí fréamhaithe</string>
<string name="text_file">Comhad téacs</string>
<string name="decompress">Dí-chomhbhrú</string>
<string name="compressing">Ag comhbhrúite…</string>
<string name="favorites_activity_placeholder">Is féidir leat fillteáin a úsáidtear go minic a chur le ceanáin ar mhaithe le rochtain éasca ó áit ar bith.</string>
<string name="videos">Físeáin</string>
<string name="documents">Doiciméid</string>
<string name="compression_successful">Comhbhrú rathúil</string>
<string name="decompressing_failed">Theip ar dhí-chomhbhrú</string>
<string name="manage_favorites">Theip ar an dí-chomhbhrú</string>
<string name="audio">Fuaime</string>
</resources>
+11 -11
View File
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Xestor de ficheiros</string>
<string name="press_back_again">Preme novamente para saír</string>
<string name="go_to_home_folder">Ir para o cartafol persoal</string>
<string name="set_as_home_folder">Poñer como predeterminado este cartafol persoal</string>
<string name="home_folder_updated">Cartafol persoal actualizado</string>
<string name="copy_path">Copiar ruta para a área de transferencia</string>
<string name="app_launcher_name">Ficheiros</string>
<string name="press_back_again">Preme outra vez para saír</string>
<string name="go_to_home_folder">Ir ao cartafol de inicio</string>
<string name="set_as_home_folder">Establecer como cartafol de inicio</string>
<string name="home_folder_updated">Cartafol de inicio actualizado</string>
<string name="copy_path">Copiar ruta ao portapapeis</string>
<string name="path_copied">Copiouse a ruta</string>
<string name="select_audio_file">Seleccione un ficheiro de audio</string>
<string name="search_folder">Buscar cartafol</string>
@@ -17,7 +17,7 @@
<string name="text_file">Texto</string>
<string name="image_file">Imaxe</string>
<string name="video_file">Vídeo</string>
<string name="other_file">Outro tipo de ficheiro</string>
<string name="other_file">Outros ficheiros</string>
<string name="compress">Comprimir</string>
<string name="decompress">Descomprimir</string>
<string name="compress_as">Comprimir como</string>
@@ -31,17 +31,17 @@
<string name="go_to_favorite">Ir a favorito</string>
<string name="favorites_activity_placeholder">Pode adiccionar cartafoles como favoritos para un acesso mais rápido.</string>
<string name="file_editor">Editor de ficheiros</string>
<string name="storage_analysis">Análise do almacenamento</string>
<string name="storage_analysis">Análise da almacenaxe</string>
<string name="images">Imaxes</string>
<string name="videos">Vídeos</string>
<string name="archives">Arquivos</string>
<string name="others">Outros</string>
<string name="storage_free">ceibe</string>
<string name="total_storage">Almacenamento total: %s</string>
<string name="storage_free">libre</string>
<string name="total_storage">Almacenaxe total: %s</string>
<string name="enable_root_access">Activar acceso root</string>
<string name="press_back_twice">Require premer Atrás dúas veces para saír da aplicación</string>
<string name="audio_file">Ficheiro de audio</string>
<string name="audio">Audio</string>
<string name="documents">Documentos</string>
<string name="downloads">Descargas</string>
</resources>
</resources>
+1 -1
View File
@@ -28,5 +28,5 @@
<string name="go_to_favorite">Vader al favoritos</string>
<string name="total_storage">Immagazinage total: %s</string>
<string name="path_copied">Percurso copiate</string>
<string name="select_audio_file">Selige un file de audio</string>
<string name="select_audio_file">Selectionar un file de audio</string>
</resources>
+13 -8
View File
@@ -6,18 +6,18 @@
<string name="home_folder_updated">Folder beranda diperbarui</string>
<string name="copy_path">Salin jalur ke papan klip</string>
<string name="path_copied">Jalur disalin</string>
<string name="select_audio_file">Silakan pilih berkas audio</string>
<string name="select_audio_file">Silakan pilih file audio</string>
<string name="search_folder">Cari folder</string>
<string name="rooted_device_only">Tindakan ini hanya bekerja pada perangkat dengan akses root</string>
<string name="recents">Terkini</string>
<string name="show_recents">Tampilkan terkini</string>
<string name="invert_colors">Invers warna</string>
<string name="open_as">Buka sebagai</string>
<string name="text_file">Berkas teks</string>
<string name="image_file">Berkas gambar</string>
<string name="audio_file">Berkas audio</string>
<string name="video_file">Berkas video</string>
<string name="other_file">Berkas lainnya</string>
<string name="text_file">File teks</string>
<string name="image_file">File gambar</string>
<string name="audio_file">File audio</string>
<string name="video_file">File video</string>
<string name="other_file">File lainnya</string>
<string name="compress">Kompres</string>
<string name="decompress">Dekompres</string>
<string name="compress_as">Kompres sebagai</string>
@@ -30,7 +30,7 @@
<string name="manage_favorites">Kelola favorit</string>
<string name="go_to_favorite">Buka favorit</string>
<string name="favorites_activity_placeholder">Anda bisa menambahkan folder yang sering digunakan ke favorit untuk kemudahan akses dari mana saja.</string>
<string name="file_editor">Penyunting Berkas</string>
<string name="file_editor">Penyunting File</string>
<string name="storage_analysis">Analisis penyimpanan</string>
<string name="images">Gambar</string>
<string name="videos">Video</string>
@@ -39,4 +39,9 @@
<string name="total_storage">Total penyimpanan: %s</string>
<string name="enable_root_access">Aktifkan akses root</string>
<string name="press_back_twice">Wajib tekan tombol kembali dua kali untuk keluar aplikasi</string>
</resources>
<string name="audio">Audio</string>
<string name="documents">Dokumen</string>
<string name="app_launcher_name">Pengelola File</string>
<string name="downloads">Unduhan</string>
<string name="storage_free">bebas</string>
</resources>
+2 -2
View File
@@ -36,7 +36,7 @@
<string name="images">Immagini</string>
<string name="videos">Video</string>
<string name="documents">Documenti</string>
<string name="downloads">Scaricamenti</string>
<string name="downloads">Scaricati</string>
<string name="archives">Archivi</string>
<string name="others">Altri</string>
<string name="storage_free">libero</string>
@@ -44,4 +44,4 @@
<string name="enable_root_access">Abilita accesso root</string>
<string name="press_back_twice">Richiedi di premere Indietro due volte per uscire dall\'app</string>
<string name="audio">Audio</string>
</resources>
</resources>
+15 -15
View File
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">מנהל קבצים</string>
<string name="press_back_again">לחץ שוב אחורה כדי לצאת</string>
<string name="go_to_home_folder">עבור לתיקיית הבית</string>
<string name="app_launcher_name">מנהל הקבצים</string>
<string name="press_back_again">ליציאה יש ללחוץ אחורה פעם נוספת</string>
<string name="go_to_home_folder">מעבר לתיקיית הבית</string>
<string name="set_as_home_folder">הגדר כתיקיית בית</string>
<string name="home_folder_updated">תיקיית הבית עודכנה</string>
<string name="copy_path">העתק נתיב ללוח</string>
<string name="path_copied">הנתיב הועתק</string>
<string name="select_audio_file">אנא בחר קובץ שמע</string>
<string name="search_folder">‪חיפוש תיקייה</string>
<string name="rooted_device_only">פעולה זו פועלת רק במכשירים עם רוט</string>
<string name="rooted_device_only">פעולה זו עובדת רק במכשירים עם רוט</string>
<string name="recents">אחרונים</string>
<string name="show_recents">הצג את האחרונים</string>
<string name="show_recents">הצג אחרונים</string>
<string name="invert_colors">הפוך צבעים</string>
<string name="open_as">פתח כ</string>
<string name="text_file">קובץ טקסט</string>
@@ -19,29 +19,29 @@
<string name="audio_file">קובץ שמע</string>
<string name="video_file">קובץ וידיאו</string>
<string name="other_file">קובץ אחר</string>
<string name="compress">לדחוס</string>
<string name="decompress">לבטל דחיסה</string>
<string name="compress_as">דחוס כ</string>
<string name="compress">דחיסה</string>
<string name="decompress">חילוץ</string>
<string name="compress_as">דחיסה כ</string>
<string name="compressing">דוחס…</string>
<string name="decompressing">משחרר דחיסה…</string>
<string name="decompressing">מחלץ…</string>
<string name="compression_successful">הדחיסה הצליחה</string>
<string name="decompression_successful">שחרור הדחיסה הצליח</string>
<string name="decompression_successful">החילוץ הצליח</string>
<string name="compressing_failed">הדחיסה נכשלה</string>
<string name="decompressing_failed">פעולת שחרור הדחיסה נכשל</string>
<string name="decompressing_failed">החילוץ נכשל</string>
<string name="manage_favorites">נהל מועדפים</string>
<string name="go_to_favorite">עבור למועדפים</string>
<string name="favorites_activity_placeholder">‪אתה יכול להוסיף תיקיות בשימוש תכוף למועדפים לגישה נוחה מכל מקום.</string>
<string name="favorites_activity_placeholder">באפשרותך להוסיף תיקיות בשימוש תכוף למועדפים לגישה נוחה מכל מקום.</string>
<string name="file_editor">עורך הקבצים</string>
<string name="storage_analysis">ניתוח אחסון</string>
<string name="images">תמונות</string>
<string name="videos">וידיאו</string>
<string name="videos">סרטונים</string>
<string name="audio">שמע</string>
<string name="documents">מסמכים</string>
<string name="downloads">הורדות</string>
<string name="archives">ארכיון</string>
<string name="others">אחרים</string>
<string name="storage_free">חינם</string>
<string name="storage_free">חופשי</string>
<string name="total_storage">שטח אחסון כולל: %s</string>
<string name="enable_root_access">אפשר גישת שורש</string>
<string name="press_back_twice">דרוש לחיצה על חזרה פעמיים כדי לצאת מהאפליקציה דרוש לחיצה על חזרה פעמיים כדי לצאת מהאפליקציה</string>
<string name="press_back_twice">דרישת לחיצה כפולה על כפתור אחורה כדי לצאת מהאפליקציה</string>
</resources>
+2 -2
View File
@@ -35,7 +35,7 @@
<string name="storage_analysis">ストレージ解析</string>
<string name="images">画像</string>
<string name="videos">動画</string>
<string name="audio">オーディオ</string>
<string name="audio">音声</string>
<string name="documents">ドキュメント</string>
<string name="downloads">ダウンロード</string>
<string name="archives">アーカイブ</string>
@@ -44,4 +44,4 @@
<string name="total_storage">合計ストレージ: %s</string>
<string name="enable_root_access">ルートアクセスを有効にする</string>
<string name="press_back_twice">戻るボタンを2回押してアプリを閉じる</string>
</resources>
</resources>
+23 -3
View File
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">파일 매니저</string>
<string name="press_back_again">뒤로가기 버튼을 다시 누르면 종료됩니다.</string>
<string name="press_back_again">뒤로가기 버튼을 다시 누르면 종료됩니다</string>
<string name="go_to_home_folder">홈 폴더 이동</string>
<string name="set_as_home_folder">홈 폴더 설정</string>
<string name="home_folder_updated">홈 폴더 설정완료</string>
<string name="copy_path">클립보드에 경로 복사</string>
<string name="path_copied">클립보드에 복사됨</string>
<string name="select_audio_file">오디도 파일을 선택하세요.</string>
<string name="select_audio_file">오디도 파일을 선택하세요</string>
<string name="search_folder">폴더 및 파일검색</string>
<string name="compress">압축</string>
<string name="decompress">압축 해제</string>
@@ -23,4 +23,24 @@
<string name="favorites_activity_placeholder">자주 사용하는 폴더를 즐겨찾기에 추가하여 어디서나 쉽게 접근 할 수 있습니다.</string>
<string name="file_editor">텍스트 편집기</string>
<string name="enable_root_access">루트 접근 활성화</string>
</resources>
<string name="images">사진</string>
<string name="videos">동영상</string>
<string name="invert_colors">색상 반전</string>
<string name="image_file">사진 파일</string>
<string name="audio_file">오디오 파일</string>
<string name="open_as">다음으로 열기</string>
<string name="text_file">텍스트 파일</string>
<string name="video_file">비디오 파일</string>
<string name="other_file">기타 파일</string>
<string name="total_storage">전체 저장공간: %s</string>
<string name="audio">음성</string>
<string name="storage_analysis">저장공간 분석</string>
<string name="documents">문서</string>
<string name="downloads">다운로드</string>
<string name="archives">아카이브</string>
<string name="others">기타</string>
<string name="press_back_twice">뒤로 가기 버튼을 두 번 눌러 앱을 종료</string>
<string name="rooted_device_only">이 작업은 루팅된 기기에서만 작동합니다</string>
<string name="recents">최근 파일</string>
<string name="show_recents">최근 파일 보기</string>
</resources>
+21 -8
View File
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Failų tvarkytuvė</string>
<string name="press_back_again">Paspauskite atgal dar kartą, norėdami išeiti</string>
<string name="press_back_again">Dar kartą paspauskite atgal, kad išeitumėte</string>
<string name="copy_path">Kopijuoti kelią į iškarpinę</string>
<string name="path_copied">Kelias nukopijuotas</string>
<string name="select_audio_file">Pasirinkite garso įrašo failą</string>
<string name="search_folder">Ieškoti aplanke</string>
<string name="search_folder">Ieškoti aplanką</string>
<string name="open_as">Atverti kaip</string>
<string name="text_file">Tekstinis failas</string>
<string name="image_file">Paveikslo failas</string>
<string name="image_file">Vaizdo failas</string>
<string name="audio_file">Garso įrašo failas</string>
<string name="video_file">Vaizdo įrašo failas</string>
<string name="other_file">Kitas failas</string>
@@ -19,16 +19,29 @@
<string name="decompressing">Išskleidžiama…</string>
<string name="compression_successful">Glaudinimas sėkmingas</string>
<string name="decompression_successful">Išskleidimas sėkmingas</string>
<string name="compressing_failed">Nepavyko glaudinti</string>
<string name="decompressing_failed">Nepavyko išskleisti</string>
<string name="file_editor">Failų redaktorius</string>
<string name="compressing_failed">Glaudinimas nepavyko.</string>
<string name="decompressing_failed">Išskleidimas nepavyko.</string>
<string name="file_editor">Failų rengyklė</string>
<string name="storage_analysis">Saugyklos analizė</string>
<string name="images">Paveikslai</string>
<string name="images">Vaizdai</string>
<string name="videos">Vaizdo įrašai</string>
<string name="audio">Garso įrašai</string>
<string name="documents">Dokumentai</string>
<string name="downloads">Atsiuntimai</string>
<string name="downloads">Atsisiuntimai</string>
<string name="archives">Archyvai</string>
<string name="others">Kiti</string>
<string name="storage_free">laisva</string>
<string name="enable_root_access">Įjungti pagrindinį prieigą</string>
<string name="total_storage">Bendra saugykla: %s</string>
<string name="invert_colors">Invertuoti spalvas</string>
<string name="rooted_device_only">Ši operacija veikia tik pagrindiniuose įrenginiuose.</string>
<string name="recents">Naujausiai</string>
<string name="show_recents">Rodyti naujausių</string>
<string name="press_back_twice">Reikalauti dukart paspausti „Atgal“, kad palikti programėlę</string>
<string name="manage_favorites">Tvarkyti mėgstamus</string>
<string name="go_to_favorite">Eiti į mėgstamą</string>
<string name="favorites_activity_placeholder">Dažnai naudojamus aplankus galite pridėti prie mėgstamų, kad juos būtų lengva pasiekti iš bet kur.</string>
<string name="go_to_home_folder">Eiti į pagrindinį aplanką</string>
<string name="set_as_home_folder">Nustatyti kaip pagrindinį aplanką</string>
<string name="home_folder_updated">Pagrindinis aplankas atnaujintas</string>
</resources>
+4 -1
View File
@@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="press_back_again">Притиснете назад уште еднаш за да излезете</string>
<string name="app_launcher_name">Управител со датотеки</string>
</resources>
+5 -1
View File
@@ -9,7 +9,7 @@
<string name="path_copied">Bane kopiert</string>
<string name="select_audio_file">Vennligst velg en lydfil</string>
<string name="search_folder">Søk etter mappe</string>
<string name="rooted_device_only">Denne handlingen fungerer bare på rootede enheter.</string>
<string name="rooted_device_only">Denne handlingen fungerer bare på enheter med rot-tilgang</string>
<string name="recents">Nylige</string>
<string name="show_recents">Vis nylige</string>
<string name="open_as">Åpne som</string>
@@ -40,4 +40,8 @@
<string name="storage_free">ledig</string>
<string name="total_storage">Total lagring: %s</string>
<string name="enable_root_access">Aktiver root-tilgang</string>
<string name="invert_colors">Inverter farger</string>
<string name="storage_analysis">Lagringsanalyse</string>
<string name="others">Andre</string>
<string name="press_back_twice">Trykk Tilbake to ganger for å avslutte appen</string>
</resources>
+6 -6
View File
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Bestandsbeheer</string>
<string name="press_back_again">Druk nogmaals op terug om af te sluiten</string>
<string name="press_back_again">Druk nogmaals op \'Terug\' om te sluiten</string>
<string name="go_to_home_folder">Naar beginmap</string>
<string name="set_as_home_folder">Als beginmap instellen</string>
<string name="set_as_home_folder">Instellen als beginmap</string>
<string name="home_folder_updated">Beginmap ingesteld</string>
<string name="copy_path">Pad naar klembord kopiëren</string>
<string name="path_copied">Pad gekopieerd</string>
@@ -13,9 +13,9 @@
<string name="recents">Recent geopend</string>
<string name="show_recents">Recente items tonen</string>
<string name="open_as">Openen als</string>
<string name="text_file">Tekst</string>
<string name="text_file">Tekstbestand</string>
<string name="image_file">Afbeelding</string>
<string name="audio_file">Geluid</string>
<string name="audio_file">Geluidsbestand</string>
<string name="video_file">Video</string>
<string name="other_file">Overig</string>
<string name="compress">Inpakken</string>
@@ -33,14 +33,14 @@
<string name="file_editor">Bewerken</string>
<string name="storage_analysis">Opslaganalyse</string>
<string name="images">Afbeeldingen</string>
<string name="videos">Video</string>
<string name="videos">Video\'s</string>
<string name="documents">Documenten</string>
<string name="archives">Archieven</string>
<string name="others">Overig</string>
<string name="storage_free">vrij</string>
<string name="total_storage">Totale opslag: %s</string>
<string name="enable_root_access">Root-toegang inschakelen</string>
<string name="press_back_twice">Twee keer op de terugknop drukken om af te sluiten</string>
<string name="press_back_twice">Twee keer op \'Terug\' drukken om de app te sluiten</string>
<string name="audio">Geluid</string>
<string name="downloads">Downloads</string>
<string name="invert_colors">Kleuren omdraaien</string>
+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="search_folder">Cercar dins lo dossièr</string>
<string name="invert_colors">Invertir las colors</string>
<string name="images">Imatges</string>
<string name="app_launcher_name">Gestionari de fichièrs</string>
<string name="recents">Recents</string>
<string name="show_recents">Mostrar los recents</string>
<string name="open_as">Dobrir coma</string>
<string name="text_file">Fichièr tèxte</string>
<string name="image_file">Fichièr imatge</string>
<string name="audio_file">Fichièr àudio</string>
<string name="video_file">Fichièr vidèo</string>
<string name="other_file">Autre fichièr</string>
<string name="decompress">Descompressar</string>
<string name="compress_as">Compressar coma</string>
<string name="compressing">Compression…</string>
<string name="decompressing">Descompression…</string>
<string name="compression_successful">Compression reüssida</string>
<string name="go_to_favorite">Anar als favorits</string>
<string name="file_editor">Editor de fichièrs</string>
<string name="videos">Vidèos</string>
<string name="audio">Àudio</string>
<string name="downloads">Telecargaments</string>
<string name="archives">Fichièrs</string>
<string name="others">Autres</string>
<string name="storage_free">disponible</string>
<string name="total_storage">Emmagazinatge total : %s</string>
<string name="enable_root_access">Activar l’accès root</string>
<string name="press_back_again">Tocatz de nòu en rèire per sortir</string>
<string name="go_to_home_folder">Anar al dossièr principal</string>
<string name="set_as_home_folder">Definir coma dossièr principal</string>
<string name="home_folder_updated">Dossièr per defaut actualizat</string>
<string name="copy_path">Copiar l’emplaçament al quichapapièrs</string>
<string name="path_copied">Emplaçament copiat</string>
<string name="select_audio_file">Seleccionatz un fichièr àudio</string>
<string name="compress">Compressar</string>
<string name="documents">Documents</string>
<string name="rooted_device_only">Aquesta operacion fonciona sonque suls aparelhs rootats</string>
<string name="decompression_successful">Descompression reüssida</string>
<string name="compressing_failed">Fracàs de la compression</string>
<string name="decompressing_failed">Fracàs de la descompression</string>
<string name="manage_favorites">Gerir los favorits</string>
<string name="storage_analysis">Analisi de l\'emmagazinatge</string>
<string name="press_back_twice">Cal quichar dos còps la tòca Entrada per quitar l\'aplicacion</string>
<string name="favorites_activity_placeholder">Podètz apondre los dossièrs utilizatq frequentament per i accedir de pertot.</string>
</resources>
+3 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Gerenciador de Arquivos Fossify</string>
<string name="app_launcher_name">Gerenciador de Arquivos</string>
<string name="press_back_again">Aperte novamente o botão Voltar para sair</string>
<string name="go_to_home_folder">Ir para Pasta Principal</string>
<string name="set_as_home_folder">Definir como Pasta Principal</string>
@@ -43,4 +43,5 @@
<string name="press_back_twice">Pressione o botão "voltar" duas vezes para sair do app</string>
<string name="audio">Áudio</string>
<string name="documents">Documentos</string>
</resources>
<string name="downloads">Downloads</string>
</resources>
+32 -17
View File
@@ -3,30 +3,45 @@
<string name="images">Imagens</string>
<string name="videos">Vídeos</string>
<string name="open_as">Abrir como</string>
<string name="audio_file">Ficheiro de áudio</string>
<string name="other_file">Outro ficheiro</string>
<string name="file_editor">Editor de ficheiro</string>
<string name="audio_file">Áudio</string>
<string name="other_file">Outro tipo</string>
<string name="file_editor">Editor de ficheiros</string>
<string name="manage_favorites">Gerir favoritos</string>
<string name="audio">Áudio</string>
<string name="documents">Documentos</string>
<string name="image_file">Ficheiro de imagem</string>
<string name="video_file">Ficheiro de vídeo</string>
<string name="press_back_twice">Necessita de clicar duas vezes no retroceder para sair da aplicação</string>
<string name="downloads">Downloads</string>
<string name="storage_analysis">Análises de armazenamento</string>
<string name="image_file">Imagem</string>
<string name="video_file">Vídeo</string>
<string name="press_back_twice">Premir duas vezes a tecla Back para sair da aplicação</string>
<string name="downloads">Descargas</string>
<string name="storage_analysis">Análise ao armazenamento</string>
<string name="archives">Arquivos</string>
<string name="others">Outros</string>
<string name="rooted_device_only">Esta operação está apenas disponível em dispositivos rooted</string>
<string name="rooted_device_only">Esta operação apenas funciona em dispositivos com root</string>
<string name="recents">Recentes</string>
<string name="total_storage">Armazenamento total: %s</string>
<string name="storage_free">grátis</string>
<string name="search_folder">Procurar pasta</string>
<string name="storage_free">livre</string>
<string name="search_folder">Pesquisar pasta</string>
<string name="app_launcher_name">Gestor de ficheiros</string>
<string name="press_back_again">Clique retroceder novamente para sair</string>
<string name="go_to_home_folder">Vá para a pasta inicial</string>
<string name="set_as_home_folder">Configurar como pasta inicial</string>
<string name="home_folder_updated">Pasta inicial atualizada</string>
<string name="select_audio_file">Por favor, selecione um ficheiro de áudio</string>
<string name="press_back_again">Prima novamente para sair</string>
<string name="go_to_home_folder">Ir para a pasta pessoal</string>
<string name="set_as_home_folder">Definir como pasta pessoal</string>
<string name="home_folder_updated">Pasta pessoal atualizada</string>
<string name="select_audio_file">Selecione um ficheiro de áudio</string>
<string name="show_recents">Mostrar recentes</string>
<string name="invert_colors">Inverter cores</string>
<string name="invert_colors">Inverter Cores</string>
<string name="compressing_failed">Falha ao compactar</string>
<string name="decompress">Descompactar</string>
<string name="compression_successful">Compactação terminada</string>
<string name="decompression_successful">Descompactação terminada</string>
<string name="go_to_favorite">Ir para favorito</string>
<string name="favorites_activity_placeholder">Pode adicionar pastas como favoritos para um acesso mais rápido.</string>
<string name="compress_as">Compactar como</string>
<string name="compressing">A compactar…</string>
<string name="decompressing">A descompactar…</string>
<string name="compress">Compactar</string>
<string name="decompressing_failed">Falha ao descompactar</string>
<string name="enable_root_access">Conceder acesso root</string>
<string name="copy_path">Copiar caminho para a área de transferência</string>
<string name="path_copied">Caminho copiado</string>
<string name="text_file">Texto</string>
</resources>
+2 -2
View File
@@ -43,5 +43,5 @@
<string name="storage_free">livre</string>
<string name="total_storage">Armazenamento total: %s</string>
<string name="enable_root_access">Conceder acesso root</string>
<string name="press_back_twice">Premir duas vezes a tecla Back para sair da aplicação</string>
</resources>
<string name="press_back_twice">Toque duas vezes na tecla Back para sair da aplicação</string>
</resources>
+25 -25
View File
@@ -1,47 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Manager de fișiere</string>
<string name="press_back_again">Apăsaţi din nou pe înapoi pentru a ieși</string>
<string name="go_to_home_folder">Mergeţi la dosarul principal</string>
<string name="set_as_home_folder">Setaţi ca dosar principal</string>
<string name="app_launcher_name">Fișiere</string>
<string name="press_back_again">Apasă din nou pe înapoi pentru a închide</string>
<string name="go_to_home_folder">Du-te la dosarul principal</string>
<string name="set_as_home_folder">Alege ca dosar principal</string>
<string name="home_folder_updated">Dosarul principal actualizat</string>
<string name="copy_path">Copiaţi calea în clipboard</string>
<string name="copy_path">Copiază calea în memorie</string>
<string name="path_copied">Cale copiată</string>
<string name="select_audio_file">Vă rugăm să selectați un fișier audio</string>
<string name="search_folder">Căutați în dosar</string>
<string name="rooted_device_only">Această operațiune funcționează numai pe dispozitivele înrădăcinate</string>
<string name="select_audio_file">Alege un fișier audio</string>
<string name="search_folder">Caută dosarul</string>
<string name="rooted_device_only">Aceasta funcționează numai dacă se dispune de drepturi de administrator</string>
<string name="recents">Recente</string>
<string name="show_recents">Afișați recentele</string>
<string name="invert_colors">Inversați culorile</string>
<string name="show_recents">Arată Recente</string>
<string name="invert_colors">Inversează culorile</string>
<string name="open_as">Deschide ca</string>
<string name="text_file">Fișier text</string>
<string name="image_file">Fișier imagine</string>
<string name="audio_file">Fişier audio</string>
<string name="video_file">Fişier video</string>
<string name="other_file">Alt fișier</string>
<string name="compress">Comprimare</string>
<string name="decompress">Decomprimare</string>
<string name="compress_as">Comprimaţi ca</string>
<string name="compressing">Comprimare…</string>
<string name="decompressing">Decomprimare…</string>
<string name="other_file">Alte fișiere</string>
<string name="compress">Comprimă</string>
<string name="decompress">Decomprimă</string>
<string name="compress_as">Comprimă ca</string>
<string name="compressing">Se comprimă…</string>
<string name="decompressing">Se decomprimă…</string>
<string name="compression_successful">Comprimare reușită</string>
<string name="decompression_successful">Decomprimare reușită</string>
<string name="compressing_failed">Comprimarea a eșuat</string>
<string name="decompressing_failed">Decomprimarea a eșuat</string>
<string name="manage_favorites">Gestionați favoritele</string>
<string name="go_to_favorite">Mergeți la favorite</string>
<string name="favorites_activity_placeholder">Puteți adăuga dosarele utilizate frecvent la favorite pentru a le accesa ușor de oriunde.</string>
<string name="compressing_failed">Comprimare nereușită</string>
<string name="decompressing_failed">Decomprimare nereușită</string>
<string name="manage_favorites">Gestionare preferate</string>
<string name="go_to_favorite">Du-te la preferate</string>
<string name="favorites_activity_placeholder">Poți adăuga în preferate dosarele utilizate frecvent pentru a le accesa ușor de oriunde.</string>
<string name="file_editor">Editor de fișiere</string>
<string name="storage_analysis">Analiza stocării</string>
<string name="images">Imagini</string>
<string name="videos">Videoclipuri</string>
<string name="documents">Documente</string>
<string name="downloads">Descărcări</string>
<string name="downloads">Descărcate</string>
<string name="archives">Arhive</string>
<string name="others">Altele</string>
<string name="storage_free">liber</string>
<string name="total_storage">Spaţiu de stocare total: %s</string>
<string name="enable_root_access">Activați accesul root</string>
<string name="press_back_twice">Trebuie să apăsați de două ori butonul Înapoi pentru a părăsi aplicația</string>
<string name="total_storage">Memoria totală: %s</string>
<string name="enable_root_access">Activează accesul ca administrator</string>
<string name="press_back_twice">Cere apăsarea de două ori a butonului Înapoi pentru a părăsi aplicația</string>
<string name="audio">Audio</string>
</resources>
+2 -2
View File
@@ -13,7 +13,7 @@
<string name="recents">Недавнее</string>
<string name="show_recents">Показывать недавнее</string>
<string name="invert_colors">Инвертировать цвета</string>
<string name="open_as">Открыть как…</string>
<string name="open_as">Открыть как</string>
<string name="text_file">Текст</string>
<string name="image_file">Изображение</string>
<string name="audio_file">Звуковой файл</string>
@@ -21,7 +21,7 @@
<string name="other_file">Другое</string>
<string name="compress">Сжать</string>
<string name="decompress">Извлечь</string>
<string name="compress_as">Сжать как…</string>
<string name="compress_as">Сжать как</string>
<string name="compressing">Сжатие…</string>
<string name="decompressing">Извлечение…</string>
<string name="compression_successful">Сжатие успешно</string>
+1
View File
@@ -43,4 +43,5 @@
<string name="total_storage">Úložisko celkom: %s</string>
<string name="enable_root_access">Povoliť prístup ku koreňovým súborom</string>
<string name="press_back_twice">Vyžadovať stlačenie Späť na opustenie apky dvakrát</string>
<string name="audio">Zvuk</string>
</resources>
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Филе Манагер</string>
<string name="app_launcher_name">Менаџер фајлова</string>
<string name="press_back_again">Притисните поново да бисте изашли</string>
<string name="go_to_home_folder">Идите у почетни фолдер</string>
<string name="set_as_home_folder">Постави као почетни фолдер</string>
+9 -9
View File
@@ -18,19 +18,19 @@
<string name="image_file">Resim dosyası</string>
<string name="audio_file">Ses dosyası</string>
<string name="video_file">Video dosyası</string>
<string name="other_file">Diğer dosya</string>
<string name="other_file">Diğer dosyalar</string>
<string name="compress">Sıkıştır</string>
<string name="decompress">Çöz</string>
<string name="compress_as">Sıkıştır:</string>
<string name="decompress">Çıkar</string>
<string name="compress_as">Sıkıştır</string>
<string name="compressing">Sıkıştırılıyor…</string>
<string name="decompressing">Çözülüyor…</string>
<string name="decompressing">Çıkarılıyor…</string>
<string name="compression_successful">Sıkıştırma başarılı</string>
<string name="decompression_successful">Çözme başarılı</string>
<string name="decompression_successful">Çıkarma başarılı</string>
<string name="compressing_failed">Sıkıştırma başarısız</string>
<string name="decompressing_failed">Çözme başarısız</string>
<string name="manage_favorites">Favorileri yönet</string>
<string name="go_to_favorite">Favoriye git</string>
<string name="favorites_activity_placeholder">Sık kullanılan klasörleri her yerden kolay erişmek için favorilere ekleyebilirsiniz.</string>
<string name="decompressing_failed">Çıkarma başarısız</string>
<string name="manage_favorites">Gözdeleri yönet</string>
<string name="go_to_favorite">Gözdeye git</string>
<string name="favorites_activity_placeholder">Sık kullanılan klasörlere her yerden kolay erişmek için gözdelere ekleyebilirsiniz.</string>
<string name="file_editor">Dosya Düzenleyici</string>
<string name="storage_analysis">Depolama analizi</string>
<string name="images">Resimler</string>
+6 -6
View File
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Менеджер Файлів</string>
<string name="press_back_again">Для виходу натисніть Назад ще раз</string>
<string name="app_launcher_name">Менеджер файлів</string>
<string name="press_back_again">Для виходу натисніть «Назад» ще раз</string>
<string name="go_to_home_folder">Перейти у домашню теку</string>
<string name="set_as_home_folder">Встановити як домашню теку</string>
<string name="home_folder_updated">Домашню теку оновлено</string>
<string name="set_as_home_folder">Встановити як головну теку</string>
<string name="home_folder_updated">Головну теку оновлено</string>
<string name="copy_path">Скопіювати шлях у буфер обміну</string>
<string name="path_copied">Шлях скопійовано</string>
<string name="select_audio_file">Будь ласка, оберіть аудіо файл</string>
<string name="select_audio_file">Оберіть аудіофайл</string>
<string name="search_folder">Шукати теку</string>
<string name="rooted_device_only">Ця команда працює лише на пристроях з root-доступом</string>
<string name="recents">Останні</string>
@@ -44,4 +44,4 @@
<string name="total_storage">Всього пам\'яті: %s</string>
<string name="enable_root_access">Активувати root-доступ</string>
<string name="press_back_twice">Натисніть «Назад» двічі, щоб вийти зі застосунку</string>
</resources>
</resources>
+18 -18
View File
@@ -5,43 +5,43 @@
<string name="app_launcher_name">Quản lý tập tin</string>
<string name="recents">Gần đây</string>
<string name="path_copied">Đã sao chép đường dẫn</string>
<string name="rooted_device_only">Thao tác này chỉ hoạt động trên các thiết bị đã root</string>
<string name="other_file">Tập tin khác</string>
<string name="text_file">Tập tin văn bản</string>
<string name="image_file">Tập tin hình ảnh</string>
<string name="audio_file">Tập tin âm thanh</string>
<string name="rooted_device_only">Thao tác này chỉ hiệu quả trên các thiết bị đã root</string>
<string name="other_file">Khác</string>
<string name="text_file">Văn bản</string>
<string name="image_file">Hình ảnh</string>
<string name="audio_file">Âm thanh</string>
<string name="compress">Nén</string>
<string name="decompression_successful">Giải nén thành công</string>
<string name="compressing_failed">Nén không thành công</string>
<string name="decompressing_failed">Giải nén không thành công</string>
<string name="manage_favorites">Quản lí các mục yêu thích</string>
<string name="go_to_favorite">Chuyển đến mục yêu thích</string>
<string name="go_to_home_folder">Chuyển đến thư mục chính</string>
<string name="compressing_failed">Không thể nén</string>
<string name="decompressing_failed">Không thể giải nén</string>
<string name="manage_favorites">Mục yêu thích</string>
<string name="go_to_favorite">Mục yêu thích</string>
<string name="go_to_home_folder">Đến thư mục chính</string>
<string name="set_as_home_folder">Đặt làm thư mục chính</string>
<string name="audio">Âm thanh</string>
<string name="storage_analysis">Thống kê bộ nhớ</string>
<string name="documents">Tài liệu</string>
<string name="downloads">Tải xuống</string>
<string name="videos">Video</string>
<string name="archives">Lưu trữ</string>
<string name="archives">File nén</string>
<string name="others">Khác</string>
<string name="press_back_again">Nhấn quay lại lần nữa để thoát</string>
<string name="press_back_again">Nhấn quay lại để thoát</string>
<string name="search_folder">Tìm kiếm thư mục</string>
<string name="select_audio_file">Vui lòng chọn một tập tin âm thanh</string>
<string name="copy_path">Sao chép đường dẫn vào bộ nhớ tạm</string>
<string name="select_audio_file">Hãy chọn một file âm thanh</string>
<string name="copy_path">Sao chép đường dẫn</string>
<string name="invert_colors">Đảo màu</string>
<string name="show_recents">Hiển thị gần đây</string>
<string name="open_as">Mở dưới dạng</string>
<string name="video_file">Tập tin video</string>
<string name="video_file">Video</string>
<string name="decompress">Giải nén</string>
<string name="compress_as">Nén dưới dạng</string>
<string name="compressing">Đang nén…</string>
<string name="decompressing">Đang giải nén…</string>
<string name="compression_successful">Nén thành công</string>
<string name="favorites_activity_placeholder">Bạn có thể thêm các thư mục được sử dụng thường xuyên vào mục yêu thích để dễ dàng truy cập từ mọi nơi.</string>
<string name="file_editor">Trình chỉnh sửa tập tin</string>
<string name="favorites_activity_placeholder">Bạn có thể thêm các thư mục thường xuyên sử dụng vào mục yêu thích để truy cập nhanh hơn.</string>
<string name="file_editor">Trình chỉnh sửa file</string>
<string name="storage_free">trống</string>
<string name="total_storage">Tổng bộ nhớ: %s</string>
<string name="enable_root_access">Cho phép truy cập root</string>
<string name="press_back_twice">Yêu cầu nhấn Quay lại hai lần để thoát ứng dụng</string>
<string name="press_back_twice">Nhấn Quay lại hai lần để thoát ứng dụng</string>
</resources>
+9 -9
View File
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">文件管理器</string>
<string name="press_back_again">再次点击返回以退出</string>
<string name="press_back_again">再次按返回退出</string>
<string name="go_to_home_folder">前往主文件夹</string>
<string name="set_as_home_folder">设定为主文件夹</string>
<string name="set_as_home_folder">设为主文件夹</string>
<string name="home_folder_updated">主文件夹已更新</string>
<string name="copy_path">复制路径至剪贴板</string>
<string name="path_copied">路径已复制</string>
<string name="select_audio_file">请选择一个音频文件</string>
<string name="search_folder">搜索文件夹</string>
<string name="rooted_device_only">该选项仅在 root 后的设备上工作</string>
<string name="recents">最近</string>
<string name="show_recents">显示最近</string>
<string name="rooted_device_only">仅在拥有 Root 权限时生效</string>
<string name="recents">最近文件</string>
<string name="show_recents">显示最近文件</string>
<string name="invert_colors">恢复颜色</string>
<string name="open_as">打开为</string>
<string name="text_file">文本文件</string>
<string name="image_file">图像文件</string>
<string name="image_file">图片文件</string>
<string name="audio_file">音频文件</string>
<string name="video_file">视频文件</string>
<string name="other_file">其他文件</string>
@@ -38,10 +38,10 @@
<string name="audio">音频</string>
<string name="documents">文档</string>
<string name="downloads">下载</string>
<string name="archives">存档</string>
<string name="archives">归档</string>
<string name="others">其他</string>
<string name="storage_free">空闲</string>
<string name="total_storage">总存储: %s</string>
<string name="storage_free">可用</string>
<string name="total_storage">总存储:%s</string>
<string name="enable_root_access">启用 root 访问</string>
<string name="press_back_twice">需要按两次返回键才能离开应用程序</string>
</resources>
+46 -1
View File
@@ -1,2 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="images">圖片</string>
<string name="videos">影片</string>
<string name="app_launcher_name">檔案管理器</string>
<string name="press_back_again">再按一次返回以離開</string>
<string name="go_to_home_folder">前往主資料夾</string>
<string name="set_as_home_folder">設為主資料夾</string>
<string name="home_folder_updated">主資料夾已更新</string>
<string name="copy_path">路徑複製到剪貼簿</string>
<string name="path_copied">路徑已複製</string>
<string name="select_audio_file">請選擇一個音訊檔案</string>
<string name="search_folder">搜尋資料夾</string>
<string name="rooted_device_only">這個操作只對已 root 的裝置有用</string>
<string name="recents">最近瀏覽</string>
<string name="show_recents">顯示最近瀏覽</string>
<string name="invert_colors">顏色反轉</string>
<string name="open_as">開啟為</string>
<string name="text_file">文字檔案</string>
<string name="image_file">圖片檔案</string>
<string name="audio_file">音源檔案</string>
<string name="video_file">影片檔案</string>
<string name="other_file">其他檔案</string>
<string name="compress">壓縮</string>
<string name="decompress">解壓縮</string>
<string name="compress_as">壓縮為</string>
<string name="compressing">壓縮中…</string>
<string name="decompressing">解壓縮中…</string>
<string name="compression_successful">壓縮成功</string>
<string name="decompression_successful">解壓縮成功</string>
<string name="compressing_failed">壓縮失敗</string>
<string name="decompressing_failed">解壓縮失敗</string>
<string name="manage_favorites">管理我的最愛</string>
<string name="go_to_favorite">前往我的最愛</string>
<string name="favorites_activity_placeholder">你可將常用資料夾加入我的最愛,方便從任何地方開啟。</string>
<string name="file_editor">檔案編輯器</string>
<string name="storage_analysis">儲存空間分析</string>
<string name="audio">音訊</string>
<string name="documents">文件</string>
<string name="downloads">下載</string>
<string name="archives">封存</string>
<string name="others">其他</string>
<string name="storage_free">可用空間</string>
<string name="total_storage">總儲存空間:%s</string>
<string name="enable_root_access">啟用 root 權限</string>
<string name="press_back_twice">需按兩次返回鍵才能離開 app</string>
</resources>
+9 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">簡易檔案管理器</string>
<string name="app_launcher_name">檔案管理器</string>
<string name="press_back_again">再按一次返回以離開</string>
<string name="go_to_home_folder">前往主資料夾</string>
<string name="set_as_home_folder">設為主資料夾</string>
@@ -35,6 +35,13 @@
<string name="videos">影片</string>
<string name="others">其他</string>
<string name="total_storage">總儲存空間:%s</string>
<string name="enable_root_access">啟用root權限</string>
<string name="enable_root_access">啟用 root 權限</string>
<string name="press_back_twice">需按兩次返回鍵才能離開 app</string>
<string name="audio">音訊</string>
<string name="downloads">下載</string>
<string name="archives">封存</string>
<string name="recents">最近造訪</string>
<string name="show_recents">顯示最近造訪</string>
<string name="documents">文件</string>
<string name="storage_free">可用空間</string>
</resources>
+1
View File
@@ -1,4 +1,5 @@
plugins {
alias(libs.plugins.android).apply(false)
alias(libs.plugins.kotlinAndroid).apply(false)
alias(libs.plugins.detekt).apply(false)
}
+58
View File
@@ -0,0 +1,58 @@
build:
maxIssues: 0
weights:
complexity: 2
LongParameterList: 2
style: 1
processors:
active: true
exclude:
- "FunctionCountProcessor"
- "PropertyCountProcessor"
config:
validation: true
complexity:
LongParameterList:
active: true
functionThreshold: 10
constructorThreshold: 8
ignoreDefaultParameters: true
ignoreAnnotated:
- "Composable"
LongMethod:
active: true
threshold: 120
ignoreAnnotated:
- "Composable"
- "Preview"
style:
MagicNumber:
active: true
ignoreAnnotated: ["Composable"]
ignoreEnums: true
ignoreNumbers: ["-1", "0", "1", "2", "42", "1000"]
MaxLineLength:
active: true
maxLineLength: 120
excludePackageStatements: true
excludeImportStatements: true
naming:
FunctionNaming:
active: true
ignoreAnnotated: ["Composable", "Preview"]
functionPattern: "[a-z][A-Za-z0-9]*"
Compose: # io.nlopez.compose.rules
ComposableParametersOrdering:
active: true
ModifierDefaultValue:
active: true
MissingModifierDefaultValue:
active: true
PublicComposablePreview:
active: true
+6 -32
View File
@@ -1,38 +1,12 @@
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
#
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:android)
platform :android do
desc "Runs all the tests"
lane :test do
gradle(task: "test")
end
desc 'Run unit & instrumentation tests'
lane(:test) { test_android }
desc "Submit a new Beta Build to Crashlytics Beta"
lane :beta do
gradle(task: "clean assembleRelease")
crashlytics
# sh "your_script.sh"
# You can also use other beta testing services here
end
desc 'Build & deploy AAB to Google Play (includes metadata)'
lane(:deploy) { deploy_android }
desc "Deploy a new version to the Google Play"
lane :deploy do
gradle(task: "clean assembleRelease")
upload_to_play_store
end
desc 'Push Play Store metadata'
lane(:metadata) { metadata_android }
end
+48
View File
@@ -0,0 +1,48 @@
fastlane documentation
----
# Installation
Make sure you have the latest version of the Xcode command line tools installed:
```sh
xcode-select --install
```
For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
# Available Actions
## Android
### android test
```sh
[bundle exec] fastlane android test
```
Run unit & instrumentation tests
### android deploy
```sh
[bundle exec] fastlane android deploy
```
Build & deploy AAB to Google Play (includes metadata)
### android metadata
```sh
[bundle exec] fastlane android metadata
```
Push Play Store metadata
----
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
@@ -0,0 +1,30 @@
هل سئمت من مديري الملفات الذين يبطئونك وينتهكون خصوصيتك؟ افتح تجربة سريعة وآمنة وقابلة للتخصيص بالكامل مع مدير الملفات Fossify. ⚡
🚀 سيطر على عالمك الرقمي من خلال التنقل فائق السرعة:
• أدر ملفاتك بسرعة من خلال إمكانيات الضغط والنقل السهلة، مما يحافظ على تنظيم حياتك الرقمية.
• يمكنك الوصول بسرعة إلى المجلدات الأكثر استخدامًا لديك باستخدام مجلد المنزل القابل للتخصيص واختصارات المفضلة.
• ابحث عما تحتاجه في ثوانٍ باستخدام خيارات التنقل والبحث والفرز البديهية.
🔐 عزز بياناتك بخصوصية وأمان لا مثيل لهما:
• أمّن الملفات الحساسة بكلمة مرور أو نمط أو أقفال بصمة الإصبع للعناصر المخفية أو التطبيق بأكمله.
• لا يلزم الوصول إلى الإنترنت - تظل ملفاتك خاصة وآمنة على جهازك.
💾 أتقن تخزينك مثل المحترفين:
• أفرغ المساحة بضغط سهل للملفات والمجلدات لزيادة إمكانات جهازك.
• تحديد وتنظيف الملفات التي تستهلك مساحة كبيرة باستخدام أداة تحليل التخزين المضمنة.
• يمكنك التنقل بسلاسة في ملفات الجذر وبطاقات SD وأجهزة USB للتنظيم الكامل.
📁 حسّن سير عملك باستخدام أدوات يدوية:
• أنشئ اختصارات لسطح المكتب للوصول الفوري إلى الملفات والمجلدات الأكثر استخدامًا لديك.
• حرّر المستندات أو طباعتها أو قراءتها بسهولة باستخدام محرر الملفات الخفيف، المعزز بإيماءات التكبير/التصغير.
اجعلها خاصة بك مع التخصيص اللانهائي:
• استمتع بتجربة مفتوحة المصدر وخالية من الإعلانات تمنحك التحكم، وليس الشركات العملاقة.
• خصّص الألوان والسمات والأيقونات لتعكس أسلوبك وتفضيلاتك الفريدة.
تخلص من مديري الملفات المنتفخين والمنتهكين للخصوصية واستمتع بالحرية الحقيقية مع مدير الملفات Fossify. نزّل الآن واستعد التحكم في حياتك الرقمية!
استكشف المزيد من التطبيقات بواسطة Fossify: https://www.fossify.org
كود المصدر: https://www.github.com/FossifyOrg
انضم إلى المجتمع على Reddit: https://www.reddit.com/r/Fossify
تواصل على Telegram: https://t.me/Fossify
@@ -0,0 +1 @@
مستكشف ملفات عملي وخفيف ومفتوح المصدر مزود بميزات أساسية.
-1
View File
@@ -1 +0,0 @@
Фосифай Файлов Мениджър
Loaded 100 of 163 files, more files were not shown because too many files have changed in this diff. Show more