41 Commits
Author SHA1 Message Date
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
33 changed files with 373 additions and 107 deletions

No files matched your search

+1 -1
View File
@@ -1,2 +1,2 @@
# Auto-generated file. DO NOT EDIT. # Auto-generated file. DO NOT EDIT.
1.2.0 1.3.0
+1 -4
View File
@@ -18,7 +18,7 @@ body:
required: true 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." - 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 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 required: true
- label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed." - label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed."
required: true required: true
@@ -77,9 +77,6 @@ body:
What did you do for the bug to show up? 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. 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: | placeholder: |
1. Go to '...' 1. Go to '...'
2. Click on '....' 2. Click on '....'
+1 -1
View File
@@ -1,5 +1,5 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: Questions - name: Questions
url: https://github.com/FossifyOrg/File-Manager/discussions url: https://github.com/orgs/FossifyOrg/discussions
about: Please ask and answer questions here. about: Please ask and answer questions here.
+1 -3
View File
@@ -16,7 +16,7 @@ body:
options: 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." - 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 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 required: true
- label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed." - label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed."
required: true required: true
@@ -33,8 +33,6 @@ body:
label: Feature description label: Feature description
description: | description: |
Explain how you want the app's look or behavior to change to suit your needs. 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: validations:
required: true required: true
+40 -1
View File
@@ -6,6 +6,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [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 ## [1.2.0] - 2025-07-12
### Changed ### Changed
- Updated translations - Updated translations
@@ -51,6 +78,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#27]: https://github.com/FossifyOrg/File-Manager/issues/27 [#27]: https://github.com/FossifyOrg/File-Manager/issues/27
[#37]: https://github.com/FossifyOrg/File-Manager/issues/37 [#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 [#105]: https://github.com/FossifyOrg/File-Manager/issues/105
[#106]: https://github.com/FossifyOrg/File-Manager/issues/106 [#106]: https://github.com/FossifyOrg/File-Manager/issues/106
[#120]: https://github.com/FossifyOrg/File-Manager/issues/120 [#120]: https://github.com/FossifyOrg/File-Manager/issues/120
@@ -58,8 +89,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#149]: https://github.com/FossifyOrg/File-Manager/issues/149 [#149]: https://github.com/FossifyOrg/File-Manager/issues/149
[#150]: https://github.com/FossifyOrg/File-Manager/issues/150 [#150]: https://github.com/FossifyOrg/File-Manager/issues/150
[#176]: https://github.com/FossifyOrg/File-Manager/issues/176 [#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.2.0...HEAD [Unreleased]: https://github.com/FossifyOrg/File-Manager/compare/1.3.0...HEAD
[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.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.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.1]: https://github.com/FossifyOrg/File-Manager/compare/1.0.0...1.0.1
+1 -1
View File
@@ -182,7 +182,7 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0) trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0) uber (< 0.2.0)
retriable (3.1.2) retriable (3.1.2)
rexml (3.4.1) rexml (3.4.2)
rouge (3.28.0) rouge (3.28.0)
ruby2_keywords (0.0.5) ruby2_keywords (0.0.5)
rubyzip (2.4.1) rubyzip (2.4.1)
+10 -10
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 8.11.0" type="baseline" client="gradle" dependencies="false" name="AGP (8.11.0)" variant="all" version="8.11.0"> <issues format="6" by="lint 8.11.1" type="baseline" client="gradle" dependencies="false" name="AGP (8.11.1)" variant="all" version="8.11.1">
<issue <issue
id="ScopedStorage" id="ScopedStorage"
@@ -29,7 +29,7 @@
errorLine1="app-build-targetSDK = &quot;34&quot;" errorLine1="app-build-targetSDK = &quot;34&quot;"
errorLine2=" ~~~~"> errorLine2=" ~~~~">
<location <location
file="$HOME/Projects/Fossify/FossifyOrg/File-Manager/gradle/libs.versions.toml" file="$HOME/work/File-Manager/File-Manager/gradle/libs.versions.toml"
line="22" line="22"
column="23"/> column="23"/>
</issue> </issue>
@@ -51,18 +51,18 @@
errorLine1="distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip" errorLine1="distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location <location
file="$HOME/Projects/Fossify/FossifyOrg/File-Manager/gradle/wrapper/gradle-wrapper.properties" file="$HOME/work/File-Manager/File-Manager/gradle/wrapper/gradle-wrapper.properties"
line="3" line="3"
column="17"/> column="17"/>
</issue> </issue>
<issue <issue
id="AndroidGradlePluginVersion" id="AndroidGradlePluginVersion"
message="A newer version of com.android.application than 8.11.0 is available: 8.11.1" message="A newer version of com.android.application than 8.11.1 is available: 8.12.2"
errorLine1="gradlePlugins-agp = &quot;8.11.0&quot;" errorLine1="gradlePlugins-agp = &quot;8.11.1&quot;"
errorLine2=" ~~~~~~~~"> errorLine2=" ~~~~~~~~">
<location <location
file="$HOME/Projects/Fossify/FossifyOrg/File-Manager/gradle/libs.versions.toml" file="$HOME/work/File-Manager/File-Manager/gradle/libs.versions.toml"
line="19" line="19"
column="21"/> column="21"/>
</issue> </issue>
@@ -73,7 +73,7 @@
errorLine1="app-build-compileSDKVersion = &quot;34&quot;" errorLine1="app-build-compileSDKVersion = &quot;34&quot;"
errorLine2=" ~~~~"> errorLine2=" ~~~~">
<location <location
file="$HOME/Projects/Fossify/FossifyOrg/File-Manager/gradle/libs.versions.toml" file="$HOME/work/File-Manager/File-Manager/gradle/libs.versions.toml"
line="21" line="21"
column="31"/> column="31"/>
</issue> </issue>
@@ -113,7 +113,7 @@
<issue <issue
id="MissingTranslation" id="MissingTranslation"
message="&quot;app_launcher_name&quot; is not translated in &quot;fil&quot; (Filipino; Pilipino), &quot;lv&quot; (Latvian), &quot;mk&quot; (Macedonian), &quot;ml&quot; (Malayalam), &quot;ms&quot; (Malay), &quot;en&quot; (English), &quot;ne&quot; (Nepali), &quot;fa&quot; (Persian), &quot;nn&quot; (Norwegian Nynorsk), &quot;bn&quot; (Bangla), &quot;bs&quot; (Bosnian), &quot;si&quot; (Sinhala), &quot;zgh&quot; (Standard Moroccan Tamazight), &quot;ltg&quot;, &quot;kn&quot; (Kannada), &quot;or&quot; (Odia), &quot;kr&quot; (Kanuri), &quot;sat&quot; (Santali), &quot;cr&quot; (Cree), &quot;te&quot; (Telugu), &quot;th&quot; (Thai)" message="&quot;app_launcher_name&quot; is not translated in &quot;fil&quot; (Filipino; Pilipino), &quot;lv&quot; (Latvian), &quot;ml&quot; (Malayalam), &quot;ms&quot; (Malay), &quot;ne&quot; (Nepali), &quot;fa&quot; (Persian), &quot;nn&quot; (Norwegian Nynorsk), &quot;bn&quot; (Bangla), &quot;bs&quot; (Bosnian), &quot;si&quot; (Sinhala), &quot;zgh&quot; (Standard Moroccan Tamazight), &quot;ltg&quot;, &quot;kn&quot; (Kannada), &quot;or&quot; (Odia), &quot;kr&quot; (Kanuri), &quot;sat&quot; (Santali), &quot;cr&quot; (Cree), &quot;te&quot; (Telugu), &quot;th&quot; (Thai)"
errorLine1=" &lt;string name=&quot;app_launcher_name&quot;>File Manager_debug&lt;/string>" errorLine1=" &lt;string name=&quot;app_launcher_name&quot;>File Manager_debug&lt;/string>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
<location <location
@@ -124,7 +124,7 @@
<issue <issue
id="MissingTranslation" id="MissingTranslation"
message="&quot;app_launcher_name&quot; is not translated in &quot;fil&quot; (Filipino; Pilipino), &quot;lv&quot; (Latvian), &quot;mk&quot; (Macedonian), &quot;ml&quot; (Malayalam), &quot;ms&quot; (Malay), &quot;en&quot; (English), &quot;ne&quot; (Nepali), &quot;fa&quot; (Persian), &quot;nn&quot; (Norwegian Nynorsk), &quot;bn&quot; (Bangla), &quot;bs&quot; (Bosnian), &quot;si&quot; (Sinhala), &quot;zgh&quot; (Standard Moroccan Tamazight), &quot;ltg&quot;, &quot;kn&quot; (Kannada), &quot;or&quot; (Odia), &quot;kr&quot; (Kanuri), &quot;sat&quot; (Santali), &quot;cr&quot; (Cree), &quot;te&quot; (Telugu), &quot;th&quot; (Thai)" message="&quot;app_launcher_name&quot; is not translated in &quot;fil&quot; (Filipino; Pilipino), &quot;lv&quot; (Latvian), &quot;ml&quot; (Malayalam), &quot;ms&quot; (Malay), &quot;ne&quot; (Nepali), &quot;fa&quot; (Persian), &quot;nn&quot; (Norwegian Nynorsk), &quot;bn&quot; (Bangla), &quot;bs&quot; (Bosnian), &quot;si&quot; (Sinhala), &quot;zgh&quot; (Standard Moroccan Tamazight), &quot;ltg&quot;, &quot;kn&quot; (Kannada), &quot;or&quot; (Odia), &quot;kr&quot; (Kanuri), &quot;sat&quot; (Santali), &quot;cr&quot; (Cree), &quot;te&quot; (Telugu), &quot;th&quot; (Thai)"
errorLine1=" &lt;string name=&quot;app_launcher_name&quot;>File Manager&lt;/string>" errorLine1=" &lt;string name=&quot;app_launcher_name&quot;>File Manager&lt;/string>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
<location <location
@@ -135,7 +135,7 @@
<issue <issue
id="MissingTranslation" id="MissingTranslation"
message="&quot;press_back_again&quot; is not translated in &quot;fil&quot; (Filipino; Pilipino), &quot;lv&quot; (Latvian), &quot;ia&quot; (Interlingua), &quot;mk&quot; (Macedonian), &quot;ml&quot; (Malayalam), &quot;ms&quot; (Malay), &quot;en&quot; (English), &quot;ne&quot; (Nepali), &quot;fa&quot; (Persian), &quot;nn&quot; (Norwegian Nynorsk), &quot;bn&quot; (Bangla), &quot;bs&quot; (Bosnian), &quot;si&quot; (Sinhala), &quot;zgh&quot; (Standard Moroccan Tamazight), &quot;ltg&quot;, &quot;kn&quot; (Kannada), &quot;or&quot; (Odia), &quot;kr&quot; (Kanuri), &quot;sat&quot; (Santali), &quot;cr&quot; (Cree), &quot;te&quot; (Telugu), &quot;th&quot; (Thai), &quot;ckb&quot;" message="&quot;press_back_again&quot; is not translated in &quot;fil&quot; (Filipino; Pilipino), &quot;lv&quot; (Latvian), &quot;ia&quot; (Interlingua), &quot;ml&quot; (Malayalam), &quot;ms&quot; (Malay), &quot;en&quot; (English), &quot;ne&quot; (Nepali), &quot;fa&quot; (Persian), &quot;nn&quot; (Norwegian Nynorsk), &quot;bn&quot; (Bangla), &quot;bs&quot; (Bosnian), &quot;si&quot; (Sinhala), &quot;zgh&quot; (Standard Moroccan Tamazight), &quot;ltg&quot;, &quot;kn&quot; (Kannada), &quot;or&quot; (Odia), &quot;kr&quot; (Kanuri), &quot;sat&quot; (Santali), &quot;cr&quot; (Cree), &quot;te&quot; (Telugu), &quot;th&quot; (Thai), &quot;ckb&quot;"
errorLine1=" &lt;string name=&quot;press_back_again&quot;>Press back again to exit&lt;/string>" errorLine1=" &lt;string name=&quot;press_back_again&quot;>Press back again to exit&lt;/string>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
<location <location
-1
View File
@@ -2,5 +2,4 @@
<resources> <resources>
<bool name="show_donate_in_about">false</bool> <bool name="show_donate_in_about">false</bool>
<bool name="hide_google_relations">false</bool> <bool name="hide_google_relations">false</bool>
<bool name="hide_all_external_links">true</bool>
</resources> </resources>
@@ -1,22 +1,17 @@
package org.fossify.filemanager.activities package org.fossify.filemanager.activities
import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.ClipData import android.content.ClipData
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.media.RingtoneManager import android.media.RingtoneManager
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.os.Handler import android.os.Handler
import android.provider.Settings
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import com.stericson.RootTools.RootTools import com.stericson.RootTools.RootTools
import me.grantland.widget.AutofitHelper import me.grantland.widget.AutofitHelper
import org.fossify.commons.dialogs.ConfirmationAdvancedDialog
import org.fossify.commons.dialogs.RadioGroupDialog import org.fossify.commons.dialogs.RadioGroupDialog
import org.fossify.commons.extensions.appLaunched import org.fossify.commons.extensions.appLaunched
import org.fossify.commons.extensions.appLockManager import org.fossify.commons.extensions.appLockManager
@@ -43,7 +38,6 @@ import org.fossify.commons.extensions.launchMoreAppsFromUsIntent
import org.fossify.commons.extensions.onGlobalLayout import org.fossify.commons.extensions.onGlobalLayout
import org.fossify.commons.extensions.onTabSelectionChanged import org.fossify.commons.extensions.onTabSelectionChanged
import org.fossify.commons.extensions.sdCardPath import org.fossify.commons.extensions.sdCardPath
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.updateBottomTabItemColors import org.fossify.commons.extensions.updateBottomTabItemColors
import org.fossify.commons.extensions.viewBinding import org.fossify.commons.extensions.viewBinding
@@ -59,7 +53,6 @@ import org.fossify.commons.helpers.TAB_RECENT_FILES
import org.fossify.commons.helpers.TAB_STORAGE_ANALYSIS import org.fossify.commons.helpers.TAB_STORAGE_ANALYSIS
import org.fossify.commons.helpers.VIEW_TYPE_GRID import org.fossify.commons.helpers.VIEW_TYPE_GRID
import org.fossify.commons.helpers.ensureBackgroundThread import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isRPlus
import org.fossify.commons.models.FAQItem import org.fossify.commons.models.FAQItem
import org.fossify.commons.models.RadioItem import org.fossify.commons.models.RadioItem
import org.fossify.commons.models.Release import org.fossify.commons.models.Release
@@ -84,7 +77,6 @@ import java.io.File
class MainActivity : SimpleActivity() { class MainActivity : SimpleActivity() {
companion object { companion object {
private const val BACK_PRESS_TIMEOUT = 5000 private const val BACK_PRESS_TIMEOUT = 5000
private const val MANAGE_STORAGE_RC = 201
private const val PICKED_PATH = "picked_path" private const val PICKED_PATH = "picked_path"
} }
@@ -281,15 +273,6 @@ class MainActivity : SimpleActivity() {
} }
} }
@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 updateMenuColors() { private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor()) updateStatusbarColor(getProperBackgroundColor())
binding.mainMenu.updateColors() binding.mainMenu.updateColors()
@@ -323,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) { private fun initFileManager(refreshRecents: Boolean) {
if (intent.action == Intent.ACTION_VIEW && intent.data != null) { if (intent.action == Intent.ACTION_VIEW && intent.data != null) {
val data = intent.data val data = intent.data
@@ -133,10 +133,11 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
override fun selectedPaths(paths: ArrayList<String>) {} override fun selectedPaths(paths: ArrayList<String>) {}
fun searchQueryChanged(text: String) { fun searchQueryChanged(text: String) {
val searchText = text.trim() val normalizedText = text.normalizeString()
lastSearchedText = searchText val searchNormalizedText = normalizedText.trim()
lastSearchedText = searchNormalizedText
when { when {
searchText.isEmpty() -> { searchNormalizedText.isEmpty() -> {
binding.apply { binding.apply {
mimetypesFastscroller.beVisible() mimetypesFastscroller.beVisible()
getRecyclerAdapter()?.updateItems(storedItems) getRecyclerAdapter()?.updateItems(storedItems)
@@ -145,7 +146,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
} }
} }
searchText.length == 1 -> { searchNormalizedText.length == 1 -> {
binding.apply { binding.apply {
mimetypesFastscroller.beGone() mimetypesFastscroller.beGone()
mimetypesPlaceholder.beVisible() mimetypesPlaceholder.beVisible()
@@ -155,11 +156,13 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
else -> { else -> {
ensureBackgroundThread { ensureBackgroundThread {
if (lastSearchedText != searchText) { if (lastSearchedText != searchNormalizedText) {
return@ensureBackgroundThread 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 { runOnUiThread {
getRecyclerAdapter()?.updateItems(listItems, text) getRecyclerAdapter()?.updateItems(listItems, text)
@@ -7,6 +7,7 @@ import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.print.PrintAttributes import android.print.PrintAttributes
import android.print.PrintManager import android.print.PrintManager
import android.util.Base64
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.webkit.WebResourceRequest import android.webkit.WebResourceRequest
import android.webkit.WebView import android.webkit.WebView
@@ -143,6 +144,7 @@ class ReadTextActivity : SimpleActivity() {
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.menu_search -> openSearch() R.id.menu_search -> openSearch()
R.id.menu_save -> saveText() R.id.menu_save -> saveText()
R.id.menu_save_as -> saveAsText()
R.id.menu_open_with -> openPath(intent.dataString!!, true) R.id.menu_open_with -> openPath(intent.dataString!!, true)
R.id.menu_print -> printText() R.id.menu_print -> printText()
else -> return@setOnMenuItemClickListener false else -> return@setOnMenuItemClickListener false
@@ -164,10 +166,14 @@ class ReadTextActivity : SimpleActivity() {
}, 250) }, 250)
} }
private fun saveText(shouldExitAfterSaving: Boolean = false) { private fun updateFilePath() {
if (filePath.isEmpty()) { if (filePath.isEmpty()) {
filePath = getRealPathFromURI(intent.data!!) ?: "" filePath = getRealPathFromURI(intent.data!!) ?: ""
} }
}
private fun saveAsText(shouldExitAfterSaving: Boolean = false) {
updateFilePath()
if (filePath.isEmpty()) { if (filePath.isEmpty()) {
SaveAsDialog(this, filePath, true) { _, filename -> SaveAsDialog(this, filePath, true) { _, filename ->
@@ -181,6 +187,7 @@ class ReadTextActivity : SimpleActivity() {
} else { } else {
SELECT_SAVE_FILE_INTENT SELECT_SAVE_FILE_INTENT
} }
@Suppress("DEPRECATION")
startActivityForResult(this, requestCode) startActivityForResult(this, requestCode)
} }
} }
@@ -199,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) { private fun saveTextContent(outputStream: OutputStream?, shouldExitAfterSaving: Boolean, shouldOverwriteOriginalText: Boolean) {
if (outputStream != null) { if (outputStream != null) {
val currentText = binding.readTextView.text.toString() val currentText = binding.readTextView.text.toString()
@@ -229,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) { } catch (e: Exception) {
showErrorToast(e) showErrorToast(e)
} }
@@ -18,7 +18,21 @@ class SaveAsActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root) 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) { if (intent.action == Intent.ACTION_SEND && intent.extras?.containsKey(Intent.EXTRA_STREAM) == true) {
FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden(), showFAB = true, showFavoritesButton = true) { FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden(), showFAB = true, showFavoritesButton = true) {
val destination = it val destination = it
@@ -36,8 +50,9 @@ class SaveAsActivity : SimpleActivity() {
} }
val source = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)!! val source = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)!!
val filename = getFilenameFromContentUri(source) val originalFilename = getFilenameFromContentUri(source)
?: source.toString().getFilenameFromPath() ?: source.toString().getFilenameFromPath()
val filename = sanitizeFilename(originalFilename)
val mimeType = contentResolver.getType(source) val mimeType = contentResolver.getType(source)
?: intent.type?.takeIf { it != "*/*" } ?: intent.type?.takeIf { it != "*/*" }
?: filename.getMimeType() ?: filename.getMimeType()
@@ -66,4 +81,9 @@ class SaveAsActivity : SimpleActivity() {
super.onResume() super.onResume()
setupToolbar(binding.activitySaveAsToolbar, NavigationIcon.Arrow) 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 package org.fossify.filemanager.activities
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent
import android.os.Environment import android.os.Environment
import android.provider.Settings
import org.fossify.commons.activities.BaseSimpleActivity import org.fossify.commons.activities.BaseSimpleActivity
import org.fossify.commons.dialogs.ConfirmationAdvancedDialog
import org.fossify.commons.extensions.hasPermission 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.PERMISSION_WRITE_STORAGE
import org.fossify.commons.helpers.isRPlus import org.fossify.commons.helpers.isRPlus
import org.fossify.filemanager.R import org.fossify.filemanager.R
@@ -31,10 +37,23 @@ open class SimpleActivity : BaseSimpleActivity() {
R.mipmap.ic_launcher_grey_black 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 getAppLauncherName() = getString(R.string.app_launcher_name)
override fun getRepositoryName() = "File-Manager" 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") @SuppressLint("NewApi")
fun hasStoragePermission(): Boolean { fun hasStoragePermission(): Boolean {
return if (isRPlus()) { return if (isRPlus()) {
@@ -43,4 +62,39 @@ open class SimpleActivity : BaseSimpleActivity() {
hasPermission(PERMISSION_WRITE_STORAGE) 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)
}
}
}
} }
@@ -257,7 +257,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
} }
var lastModified = lastModifieds.remove(curPath) 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 children = if (isDirectory && getProperChildCount) file.getDirectChildrenCount(context, showHidden) else 0
val size = if (isDirectory) { val size = if (isDirectory) {
if (isSortingBySize) { if (isSortingBySize) {
@@ -377,6 +377,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
return files return files
} }
val normalizedText = text.normalizeString()
val sorting = context!!.config.getFolderSorting(path) val sorting = context!!.config.getFolderSorting(path)
FileDirItem.sorting = context!!.config.getFolderSorting(currentPath) FileDirItem.sorting = context!!.config.getFolderSorting(currentPath)
val isSortingBySize = sorting and SORT_BY_SIZE != 0 val isSortingBySize = sorting and SORT_BY_SIZE != 0
@@ -386,7 +387,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
} }
if (it.isDirectory) { if (it.isDirectory) {
if (it.name.contains(text, true)) { if (it.name.normalizeString().contains(normalizedText, true)) {
val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false) val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false)
if (fileDirItem != null) { if (fileDirItem != null) {
files.add(fileDirItem) files.add(fileDirItem)
@@ -395,7 +396,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
files.addAll(searchFiles(text, it.absolutePath)) files.addAll(searchFiles(text, it.absolutePath))
} else { } else {
if (it.name.contains(text, true)) { if (it.name.normalizeString().contains(normalizedText, true)) {
val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false) val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false)
if (fileDirItem != null) { if (fileDirItem != null) {
files.add(fileDirItem) files.add(fileDirItem)
@@ -12,6 +12,7 @@ import org.fossify.commons.extensions.getDoesFilePathExist
import org.fossify.commons.extensions.getFilenameFromPath import org.fossify.commons.extensions.getFilenameFromPath
import org.fossify.commons.extensions.getLongValue import org.fossify.commons.extensions.getLongValue
import org.fossify.commons.extensions.getStringValue import org.fossify.commons.extensions.getStringValue
import org.fossify.commons.extensions.normalizeString
import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.helpers.VIEW_TYPE_GRID import org.fossify.commons.helpers.VIEW_TYPE_GRID
import org.fossify.commons.helpers.VIEW_TYPE_LIST import org.fossify.commons.helpers.VIEW_TYPE_LIST
@@ -178,9 +179,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath() val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
val size = cursor.getLongValue(FileColumns.SIZE) val size = cursor.getLongValue(FileColumns.SIZE)
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000 val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
val fileDirItem = ListItem(path, name, false, 0, size, modified, false, false) val isHiddenFile = name.startsWith(".")
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) { val shouldShow = showHidden || (!isHiddenFile && !isPathInHiddenFolder(path))
if (shouldShow && activity?.getDoesFilePathExist(path) == true) {
if (wantedMimeTypes.any { isProperMimeType(it, path, false) }) { if (wantedMimeTypes.any { isProperMimeType(it, path, false) }) {
val fileDirItem = ListItem(path, name, false, 0, size, modified, false, false)
listItems.add(fileDirItem) listItems.add(fileDirItem)
} }
} }
@@ -196,6 +199,18 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
} }
} }
private fun isPathInHiddenFolder(path: String): Boolean {
val parts = path.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
}
private fun getRecyclerAdapter() = binding.recentsList.adapter as? ItemsAdapter private fun getRecyclerAdapter() = binding.recentsList.adapter as? ItemsAdapter
override fun toggleFilenameVisibility() { override fun toggleFilenameVisibility() {
@@ -242,7 +257,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
override fun searchQueryChanged(text: String) { override fun searchQueryChanged(text: String) {
lastSearchedText = text 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 { binding.apply {
(recentsList.adapter as? ItemsAdapter)?.updateItems(filtered, text) (recentsList.adapter as? ItemsAdapter)?.updateItems(filtered, text)
recentsPlaceholder.beVisibleIf(filtered.isEmpty()) recentsPlaceholder.beVisibleIf(filtered.isEmpty())
@@ -28,6 +28,7 @@ import org.fossify.commons.extensions.getLongValue
import org.fossify.commons.extensions.getProperBackgroundColor import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getProperPrimaryColor import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.getStringValue import org.fossify.commons.extensions.getStringValue
import org.fossify.commons.extensions.normalizeString
import org.fossify.commons.extensions.queryCursor import org.fossify.commons.extensions.queryCursor
import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.updateTextColors import org.fossify.commons.extensions.updateTextColors
@@ -95,7 +96,6 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
} }
totalSpace.text = String.format(context.getString(R.string.total_storage), "…") totalSpace.text = String.format(context.getString(R.string.total_storage), "…")
getSizes(volumeName)
if (volumeNames.size > 1) { if (volumeNames.size > 1) {
root.children.forEach { it.beGone() } root.children.forEach { it.beGone() }
@@ -155,8 +155,7 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
val tealColor = context.resources.getColor(R.color.md_teal_700) val tealColor = context.resources.getColor(R.color.md_teal_700)
val pinkColor = context.resources.getColor(R.color.md_pink_700) val pinkColor = context.resources.getColor(R.color.md_pink_700)
volumes.entries.forEach { (it, volumeBinding) -> volumes.values.forEach { volumeBinding ->
getSizes(it)
volumeBinding.apply { volumeBinding.apply {
mainStorageUsageProgressbar.setIndicatorColor(properPrimaryColor) mainStorageUsageProgressbar.setIndicatorColor(properPrimaryColor)
mainStorageUsageProgressbar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) mainStorageUsageProgressbar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA)
@@ -335,12 +334,14 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
freeSpaceValue.text = freeStorageSpace.formatSizeThousand() freeSpaceValue.text = freeStorageSpace.formatSizeThousand()
totalSpace.text = String.format(context.getString(R.string.total_storage), totalStorageSpace.formatSizeThousand()) totalSpace.text = String.format(context.getString(R.string.total_storage), totalStorageSpace.formatSizeThousand())
freeSpaceLabel.beVisible() freeSpaceLabel.beVisible()
getSizes(volumeName)
} }
} }
} }
} }
override fun searchQueryChanged(text: String) { override fun searchQueryChanged(text: String) {
val normalizedText = text.normalizeString()
lastSearchedText = text lastSearchedText = text
binding.apply { binding.apply {
if (text.isNotEmpty()) { if (text.isNotEmpty()) {
@@ -365,8 +366,10 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
} else { } else {
showProgressBar() showProgressBar()
ensureBackgroundThread { ensureBackgroundThread {
val start = System.currentTimeMillis() val filtered = allDeviceListItems.filter {
val filtered = allDeviceListItems.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList<ListItem> it.mName.normalizeString().contains(normalizedText, true)
}.toMutableList() as ArrayList<ListItem>
if (lastSearchedText != text) { if (lastSearchedText != text) {
return@ensureBackgroundThread return@ensureBackgroundThread
} }
@@ -63,6 +63,11 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/general_settings" /> 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 <RelativeLayout
android:id="@+id/settings_use_english_holder" android:id="@+id/settings_use_english_holder"
style="@style/SettingsHolderSwitchStyle" style="@style/SettingsHolderSwitchStyle"
+6 -1
View File
@@ -11,8 +11,13 @@
<item <item
android:id="@+id/menu_save" android:id="@+id/menu_save"
android:icon="@drawable/ic_save_vector" android:icon="@drawable/ic_save_vector"
android:title="@string/save_as" android:title="@string/save"
app:showAsAction="always" /> app:showAsAction="always" />
<item
android:id="@+id/menu_save_as"
android:showAsAction="never"
android:title="@string/save_as"
app:showAsAction="never" />
<item <item
android:id="@+id/menu_print" android:id="@+id/menu_print"
android:icon="@drawable/ic_print_vector" android:icon="@drawable/ic_print_vector"
+5 -1
View File
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?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
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_launcher_name">מנהל קבצים</string> <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="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="home_folder_updated">תיקיית הבית עודכנה</string>
<string name="copy_path">העתק נתיב ללוח</string> <string name="copy_path">העתק נתיב ללוח</string>
+5 -1
View File
@@ -9,7 +9,7 @@
<string name="path_copied">Bane kopiert</string> <string name="path_copied">Bane kopiert</string>
<string name="select_audio_file">Vennligst velg en lydfil</string> <string name="select_audio_file">Vennligst velg en lydfil</string>
<string name="search_folder">Søk etter mappe</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="recents">Nylige</string>
<string name="show_recents">Vis nylige</string> <string name="show_recents">Vis nylige</string>
<string name="open_as">Åpne som</string> <string name="open_as">Åpne som</string>
@@ -40,4 +40,8 @@
<string name="storage_free">ledig</string> <string name="storage_free">ledig</string>
<string name="total_storage">Total lagring: %s</string> <string name="total_storage">Total lagring: %s</string>
<string name="enable_root_access">Aktiver root-tilgang</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> </resources>
+1
View File
@@ -43,4 +43,5 @@
<string name="total_storage">Úložisko celkom: %s</string> <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="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="press_back_twice">Vyžadovať stlačenie Späť na opustenie apky dvakrát</string>
<string name="audio">Zvuk</string>
</resources> </resources>
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_launcher_name">Филе Манагер</string> <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="go_to_home_folder">Идите у почетни фолдер</string>
<string name="set_as_home_folder">Постави као почетни фолдер</string> <string name="set_as_home_folder">Постави као почетни фолдер</string>
+44 -1
View File
@@ -1,4 +1,47 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="images">圖片</string> <string name="images">圖片</string>
</resources> <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>
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_launcher_name">簡易檔案管理器</string> <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="go_to_home_folder">前往主資料夾</string>
<string name="set_as_home_folder">設為主資料夾</string> <string name="set_as_home_folder">設為主資料夾</string>
@@ -44,4 +44,4 @@
<string name="show_recents">顯示最近造訪</string> <string name="show_recents">顯示最近造訪</string>
<string name="documents">文件</string> <string name="documents">文件</string>
<string name="storage_free">可用空間</string> <string name="storage_free">可用空間</string>
</resources> </resources>
@@ -0,0 +1,8 @@
Changed:
• Updated translations
Fixed:
• Fixed empty storage usage bars on initial load
@@ -0,0 +1,3 @@
Fixed:
• Fixed folders showing up incorrectly as files in some cases
@@ -0,0 +1,16 @@
Added:
• Added a separate "Save as" option in the text editor
Changed:
• Save button now overwrites files directly in the text editor
• Search now ignores accents and diacritics
• Updated translations
Fixed:
• Fixed folders showing up incorrectly as files in the copy/move dialog
• Fixed error when saving files with unsupported characters
• Fixed printing text files containing a "#"
• Fixed files in hidden folders showing up in the recent tab
@@ -0,0 +1,30 @@
厭倦了檔案管理器會拖慢您的速度並侵犯您的私私嗎?使用 Fossify File Manager 解鎖閃電般快速、安全且完全可自訂的體驗。 ⚡
🚀 以極快的導航統治您的數位世界:
• 透過簡單的壓縮和傳輸功能快速管理您的檔案,讓您的數位生活井然有序。
• 使用可自訂的主資料夾和我的最愛捷徑快速存取最常用的資料夾。
• 透過直觀的導航、搜尋和排序選項,在幾秒鐘內找到您需要的內容。
🔐 以無與倫比的私隱和安全性強化您的資料:
• 使用密碼、圖案或指紋鎖定保護敏感檔案的隱藏項目或整個應用程式。
• 無需網絡連線-您的檔案在您的裝置上保持私密且安全。
💾 像專業人士一樣掌控您的儲存:
• 透過輕鬆的檔案和資料夾壓縮來清理空間,以最大限度地發揮設備的潛力。
• 使用內建儲存分析工具辨識並清理佔用空間的檔案。
• 無縫導航根檔案、SD 卡和 USB 裝置以實現整體組織。
📁 使用便利工具優化您的工作流程:
• 建立桌面捷徑以即時存取最常用的檔案和資料夾。
• 使用輕量級檔案編輯器輕鬆編輯、列印或閱讀文件,並透過縮放手勢進行增強。
🌈 透過無限的客製化打造您自己的:
• 享受無廣告、開源體驗,讓您而非企業巨頭掌控一切。
• 個人化顏色、主題和圖示以反映您獨特的風格和偏好。
拋棄臃腫、侵犯私隱的檔案管理器,使用 Fossify File Manager 體驗真正的自由。立即下載並重新掌控您的數位生活!
探索 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 @@
具備基本功能的輕便好用開源檔案管理器。
@@ -0,0 +1,30 @@
厭倦了檔案管理器會拖慢您的速度並侵犯您的隱私嗎?使用 Fossify File Manager 解鎖閃電般快速、安全且完全可自訂的體驗。 ⚡
🚀 以極快的導航統治您的數位世界:
• 透過簡單的壓縮和傳輸功能快速管理您的檔案,讓您的數位生活井井有條。
• 使用可自訂的主資料夾和最喜愛的捷徑快速存取最常用的資料夾。
• 透過直覺的導航、搜尋和排序選項,在幾秒鐘內找到您需要的內容。
🔐 以無與倫比的隱私和安全性強化您的資料:
• 使用密碼、圖案或指紋鎖定保護敏感檔案的隱藏項目或整個應用程式。
• 無需上網-您的檔案在您的裝置上保持私密且安全。
💾 像專業人士一樣掌控您的儲存:
• 透過輕鬆的檔案和資料夾壓縮來清理空間,以最大限度地發揮設備的潛力。
• 使用內建儲存分析工具辨識並清理佔用空間的檔案。
• 無縫導航根檔案、SD 卡和 USB 裝置以實現整體組織。
📁 使用便利工具優化您的工作流程:
• 建立桌面捷徑以即時存取最常用的檔案和資料夾。
• 使用輕量級檔案編輯器輕鬆編輯、列印或閱讀文檔,並透過縮放手勢進行增強。
🌈 透過無限的客製化打造您自己的:
• 享受無廣告、開源體驗,讓您而非企業巨頭掌控一切。
• 個人化顏色、主題和圖示以反映您獨特的風格和偏好。
拋棄臃腫、侵犯隱私的檔案管理器,使用 Fossify File Manager 體驗真正的自由。立即下載並重新掌控您的數位生活!
探索 Fossify 的更多應用程式:https://www.fossify.org
原始碼:https://www.github.com/FossifyOrg
加入 Reddit 社群:https://www.reddit.com/r/Fossify
在 Telegram 上連接:https://t.me/Fossify
+2 -2
View File
@@ -20,6 +20,6 @@ org.gradle.jvmargs=-Xmx4g
# org.gradle.parallel=true # org.gradle.parallel=true
# Versioning # Versioning
VERSION_NAME=1.2.0 VERSION_NAME=1.3.0
VERSION_CODE=4 VERSION_CODE=8
APP_ID=org.fossify.filemanager APP_ID=org.fossify.filemanager
+4 -4
View File
@@ -1,14 +1,14 @@
[versions] [versions]
#jetbrains #jetbrains
kotlin = "2.2.0" kotlin = "2.2.20"
#Detekt #Detekt
detekt = "1.23.8" detekt = "1.23.8"
detektCompose = "0.4.22" detektCompose = "0.4.27"
#AndroidX #AndroidX
androidx-swiperefreshlayout = "1.1.0" androidx-swiperefreshlayout = "1.1.0"
androidx-documentfile = "1.1.0" androidx-documentfile = "1.1.0"
#Fossify #Fossify
commons = "4.2.0" commons = "5.2.0"
#Other #Other
autofittextview = "0.2.1" autofittextview = "0.2.1"
gestureviews = "2.8.3" gestureviews = "2.8.3"
@@ -16,7 +16,7 @@ rootshell = "bc7e5d398e"
roottools = "965c154e20" roottools = "965c154e20"
zip4j = "2.11.5" zip4j = "2.11.5"
#Gradle #Gradle
gradlePlugins-agp = "8.11.0" gradlePlugins-agp = "8.11.1"
#build #build
app-build-compileSDKVersion = "34" app-build-compileSDKVersion = "34"
app-build-targetSDK = "34" app-build-targetSDK = "34"