Compare commits

...

1612 Commits

Author SHA1 Message Date
Sylvia van Os
47bdd5209d Adjust text sizing 2025-12-20 12:45:11 +01:00
Sylvia van Os
1f6db32155 Fix build issues 2025-12-17 21:30:24 +01:00
Sylvia van Os
705b80a32c Fix Gradle setup 2025-12-17 21:19:54 +01:00
LooKeR
91bb808d19 test: Fix configuration of compose tests 2025-12-17 21:13:56 +01:00
LooKeR
497669b3f8 test: Add more comprehensive tests for about screen 2025-12-17 21:13:31 +01:00
LooKeR
3fb77bd607 style: Format AboutActivity.kt 2025-12-17 21:13:31 +01:00
LooKeR
cc2fe5b52b refactor: Best practise apply theme as high as possible for most cases 2025-12-17 21:13:31 +01:00
LooKeR
abb01eed66 refactor: Best practise to make previews private to reduce pollution 2025-12-17 21:13:31 +01:00
LooKeR
a1469aa550 refactor: Make showRateOnGooglePlay default to app/build.gradle.kts/defaultConfig value 2025-12-17 21:13:31 +01:00
LooKeR
f8deeee32c refactor: Move compose tests to unit tests 2025-12-17 21:13:31 +01:00
LooKeR
021fd13ea6 refactor: Add defaults for AboutScreenContent 2025-12-17 21:12:35 +01:00
LooKeR
3f753e8f51 test: Add basic test for compose about screen 2025-12-17 21:12:35 +01:00
LooKeR
2c1210e8cd test: Add test tags for compose components 2025-12-17 21:12:35 +01:00
Sylvia van Os
10193ffd85 WIP 2025-12-17 21:11:40 +01:00
Sylvia van Os
17d3e9b3d0 Merge pull request #2876 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-12-17 20:34:32 +01:00
امیرضا
de47b9e774 Translated using Weblate (Persian)
Currently translated at 83.9% (278 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-12-17 20:01:10 +01:00
امیرضا
acfa8d9fe2 Translated using Weblate (Persian)
Currently translated at 27.2% (42 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fa/
2025-12-17 20:01:08 +01:00
Sylvia van Os
930246e6c5 Merge pull request #2874 from CatimaLoyalty/create-pull-request/patch-1765747610
Update Fastlane changelogs
2025-12-14 22:28:01 +01:00
TheLastProject
c6b8272448 Update Fastlane changelogs 2025-12-14 21:26:50 +00:00
Sylvia van Os
24b832a217 Update CHANGELOG 2025-12-14 22:26:37 +01:00
Charalampos Kardaris
3acf002f95 [Fix] Issue #2812: Show duplicate action in long press menu (#2873)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-12-14 22:25:23 +01:00
Sylvia van Os
16f9b3f6b1 Merge pull request #2872 from CatimaLoyalty/create-pull-request/patch-1765686940
Update contributors
2025-12-14 10:51:09 +01:00
TheLastProject
3c38c7cc25 Update contributors 2025-12-14 04:35:39 +00:00
Methum Menthusa
efbc930125 Merge pull request #2868 from methum-m/dependency-cooldown
Add 7 day dependency cooldown
2025-12-12 15:26:02 +01:00
Sylvia van Os
90b326e6b9 Merge pull request #2870 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-12-12 11:34:18 +01:00
Francisco Serrador
d3e7fe212d Translated using Weblate (Spanish)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-12-12 11:00:29 +01:00
Sylvia van Os
803d83f8e1 Merge pull request #2869 from CatimaLoyalty/dependabot/gradle/com.android.application-8.13.2
Bump com.android.application from 8.13.1 to 8.13.2
2025-12-12 08:25:25 +01:00
dependabot[bot]
59b060fbc0 Bump com.android.application from 8.13.1 to 8.13.2
Bumps com.android.application from 8.13.1 to 8.13.2.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 02:02:59 +00:00
Sylvia van Os
6d64bd4cdf Fix release staps 2025-12-08 18:45:13 +01:00
Sylvia van Os
ada4850f65 Merge branch 'main' of github.com:CatimaLoyalty/Android 2025-12-08 18:40:48 +01:00
Sylvia van Os
479fce68d5 Release Catima 2.40.0 2025-12-08 18:32:40 +01:00
Sylvia van Os
2c0b49d7f8 Merge pull request #2865 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-12-08 18:31:45 +01:00
Hosted Weblate
e534eebc4d Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2025-12-08 18:03:39 +01:00
Yasin Tanış
db16676cc4 Translated using Weblate (Turkish)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-12-08 18:03:38 +01:00
Gideon
0f1e5b858b Translated using Weblate (Dutch)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-12-08 18:03:38 +01:00
Yasin Tanış
a39d2e46e1 Translated using Weblate (Turkish)
Currently translated at 66.8% (103 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2025-12-08 18:03:37 +01:00
Sylvia van Os
4370cd2383 Merge pull request #2864 from CatimaLoyalty/dependabot/github_actions/peter-evans/create-pull-request-7.0.11
Bump peter-evans/create-pull-request from 7.0.9 to 7.0.11
2025-12-08 10:15:25 +01:00
dependabot[bot]
0c4ef730e0 Bump peter-evans/create-pull-request from 7.0.9 to 7.0.11
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.9 to 7.0.11.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v7.0.9...v7.0.11)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 7.0.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-08 02:04:42 +00:00
Sylvia van Os
ee909e0047 Merge pull request #2863 from CatimaLoyalty/create-pull-request/patch-1765081875
Update contributors
2025-12-07 11:11:45 +01:00
TheLastProject
6eee4a25f3 Update contributors 2025-12-07 04:31:15 +00:00
Sylvia van Os
ffa99231c6 Merge pull request #2862 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-12-06 20:58:41 +01:00
Hosted Weblate
cbcd74f735 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2025-12-06 19:03:25 +00:00
Richard Varga
4f46a3c8ab Translated using Weblate (Slovak)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-12-06 19:03:24 +00:00
Ati
5cec75c4c7 Translated using Weblate (Slovak)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-12-06 19:03:24 +00:00
Patrik
38d3731027 Translated using Weblate (Slovak)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-12-06 19:03:23 +00:00
Richard Varga
2a9f911a39 Translated using Weblate (Slovak)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-12-06 19:03:22 +00:00
Sylvia van Os
c762fcf6cc Merge pull request #2861 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-12-05 22:17:50 +01:00
VKing9
59db6642c3 Translated using Weblate (Hindi)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2025-12-05 16:01:04 +01:00
Diego Menezes
eb5168ef83 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-12-05 16:01:03 +01:00
VKing9
7221ea64c8 Translated using Weblate (Hindi)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2025-12-05 16:01:03 +01:00
Marko Zakrajsek
af17bde7c5 Translated using Weblate (Slovenian)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2025-12-05 16:01:02 +01:00
Sylvia van Os
67e2abde8b Merge pull request #2860 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-12-04 15:26:38 +01:00
Liner Seven
f28a9e7ba3 Translated using Weblate (Japanese)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-12-04 15:04:26 +01:00
Joel A
96f01b6a2c Translated using Weblate (Swedish)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-12-04 15:04:26 +01:00
B o d o
56bc429c4b Translated using Weblate (German)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-12-04 15:04:25 +01:00
Fjuro
163da4b021 Translated using Weblate (Czech)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-12-04 15:04:24 +01:00
Sylvain Pichon
6d9c168125 Translated using Weblate (French)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-12-04 15:04:24 +01:00
solokot
ccaef1adc5 Translated using Weblate (Russian)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-12-04 15:04:23 +01:00
4ipset
f73222597c Translated using Weblate (Russian)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-12-04 15:04:22 +01:00
大王叫我来巡山
1714606744 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-12-04 15:04:22 +01:00
Максим Горпиніч
ac3ef7fb36 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-12-04 15:04:21 +01:00
Fjuro
9417814268 Translated using Weblate (Czech)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-12-04 15:04:20 +01:00
Vasilis K.
72737074fb Translated using Weblate (Greek)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-12-04 15:04:20 +01:00
Максим Горпиніч
e05386620b Translated using Weblate (Ukrainian)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-12-04 15:04:19 +01:00
jack son
7cfe1ad833 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2025-12-04 15:04:18 +01:00
Edgars Andersons
00b975a140 Translated using Weblate (Latvian)
Currently translated at 12.3% (19 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-12-04 15:04:18 +01:00
Liner Seven
424e57e41a Translated using Weblate (Japanese)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-12-04 15:04:17 +01:00
B o d o
cdb169c4e0 Translated using Weblate (German)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-12-04 15:04:16 +01:00
109247019824
17aa18397e Translated using Weblate (Bulgarian)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-12-04 15:04:15 +01:00
4ipset
bb72eefc7f Translated using Weblate (Russian)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-12-04 15:04:15 +01:00
Joel A
a007ed6a8f Translated using Weblate (Swedish)
Currently translated at 6.4% (10 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2025-12-04 15:04:14 +01:00
jack son
2219e86576 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2025-12-04 15:04:13 +01:00
大王叫我来巡山
7f90e06ac5 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-12-04 15:04:13 +01:00
Edgars Andersons
5dd089c976 Translated using Weblate (Latvian)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-12-04 15:04:12 +01:00
Sylvain Pichon
ef9aacd609 Translated using Weblate (French)
Currently translated at 100.0% (154 of 154 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-12-04 15:04:11 +01:00
Priit Jõerüüt
fa19960c5e Translated using Weblate (Estonian)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-12-04 15:04:11 +01:00
josé m.
a5428b80ff Translated using Weblate (Galician)
Currently translated at 100.0% (331 of 331 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-12-04 15:04:10 +01:00
Sylvia van Os
56512101c2 Merge pull request #2859 from CatimaLoyalty/dependabot/gradle/androidx.exifinterface-exifinterface-1.4.2
Bump androidx.exifinterface:exifinterface from 1.4.1 to 1.4.2
2025-12-04 07:22:02 +01:00
dependabot[bot]
2bc8312511 Bump androidx.exifinterface:exifinterface from 1.4.1 to 1.4.2
Bumps androidx.exifinterface:exifinterface from 1.4.1 to 1.4.2.

---
updated-dependencies:
- dependency-name: androidx.exifinterface:exifinterface
  dependency-version: 1.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-04 02:03:23 +00:00
ProgramminCat
43ccf9b48e Convert MainActivity to Kotlin (#2830)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-12-02 20:54:33 +01:00
Sylvia van Os
e1a4ed6634 Merge pull request #2858 from CatimaLoyalty/dependabot/github_actions/actions/setup-python-6.1.0
Bump actions/setup-python from 6.0.0 to 6.1.0
2025-12-02 20:15:08 +01:00
Sylvia van Os
272e249d5e Merge pull request #2843 from CatimaLoyalty/gradlew-update-9.2.1
Update Gradle Wrapper from 9.2.0 to 9.2.1
2025-12-02 20:14:21 +01:00
dependabot[bot]
5636653c16 Bump actions/setup-python from 6.0.0 to 6.1.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v6.0.0...v6.1.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 02:16:46 +00:00
Sylvia van Os
06b1b32ce7 Merge pull request #2857 from CatimaLoyalty/create-pull-request/patch-1764477253
Update contributors
2025-11-30 11:09:05 +01:00
TheLastProject
202936b21f Update contributors 2025-11-30 04:34:13 +00:00
Sylvia van Os
122f7f64b7 Merge pull request #2856 from CatimaLoyalty/create-pull-request/patch-1764415067
Update Fastlane changelogs
2025-11-29 12:21:44 +01:00
TheLastProject
fbb913862a Update Fastlane changelogs 2025-11-29 11:17:46 +00:00
Sylvia van Os
61892f9f22 Update CHANGELOG 2025-11-29 12:17:34 +01:00
Sylvia van Os
166056fedd Merge pull request #2855 from CatimaLoyalty/fix/2847
Swap currency and balance fields to reduce chance of accidental conversions
2025-11-29 12:16:56 +01:00
Sylvia van Os
e03c883a9c Swap currency and balance fields to reduce chance of accidental conversions
This swaps the currency and balance fields to reduce the risk of users
entering a decimal value (1,23) first and having to changed to 1 due to
the default currency (Points) having no decimals.

The changes in the LoyaltyCardEditActivity are purely cosmetic, just a
swap of function order to more closely stick to the order in the XML
layout file
2025-11-29 11:59:31 +01:00
Sylvia van Os
1b4559fa3c Merge pull request #2854 from CatimaLoyalty/create-pull-request/patch-1764269098
Update Fastlane changelogs
2025-11-27 19:46:16 +01:00
TheLastProject
ae8487f8d9 Update Fastlane changelogs 2025-11-27 18:44:57 +00:00
Sylvia van Os
922b517d37 Update CHANGELOG 2025-11-27 19:44:46 +01:00
Aditya Varma
5a0d99fc80 Copy card ID to clipboard from menu or long press (#2789)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-11-27 19:43:26 +01:00
Sylvia van Os
c89a759c8b Merge pull request #2852 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-27 08:27:49 +01:00
Liner Seven
4c81fdcefb Translated using Weblate (Japanese)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-11-27 05:05:54 +00:00
Marbino Timatim Jr.
7a35b7f598 Translated using Weblate (Filipino)
Currently translated at 19.5% (64 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fil/
2025-11-27 05:05:53 +00:00
Sylvia van Os
e1108c08ac Merge pull request #2851 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-25 16:36:52 +01:00
Hosted Weblate
6ab943f776 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/
2025-11-25 15:51:14 +01:00
Sylvia van Os
aac3570431 Translated using Weblate (Hebrew (Israel))
Currently translated at 24.0% (79 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2025-11-25 15:51:13 +01:00
דוד משה המבורגר
3abf287c67 Translated using Weblate (Hebrew (Israel))
Currently translated at 24.3% (80 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2025-11-25 13:51:27 +00:00
Edgars Andersons
cb26d23b02 Translated using Weblate (Latvian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-11-25 13:51:26 +00:00
Maria Vacari
9afcb0d7c6 Translated using Weblate (Romanian)
Currently translated at 85.0% (279 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2025-11-25 13:51:25 +00:00
Sylvia van Os
acc50c4fda Merge pull request #2849 from CatimaLoyalty/dependabot/github_actions/peter-evans/create-pull-request-7.0.9
Bump peter-evans/create-pull-request from 7.0.8 to 7.0.9
2025-11-24 07:15:20 +01:00
Sylvia van Os
91fab12da6 Merge pull request #2848 from CatimaLoyalty/dependabot/github_actions/actions/checkout-6
Bump actions/checkout from 5 to 6
2025-11-24 07:14:47 +01:00
dependabot[bot]
e094b969ee Bump peter-evans/create-pull-request from 7.0.8 to 7.0.9
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.8 to 7.0.9.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v7.0.8...v7.0.9)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 7.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 02:05:16 +00:00
dependabot[bot]
3103d3a9cf Bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 02:05:11 +00:00
Sylvia van Os
c82b255eaa Merge pull request #2845 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-18 10:13:36 +01:00
Nam Nguyen Thanh
9ee4f0da9b Translated using Weblate (Vietnamese)
Currently translated at 27.4% (42 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/vi/
2025-11-18 09:52:06 +01:00
Sylvia van Os
3b5e6ac450 Merge pull request #2844 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-18 09:26:57 +01:00
Nam Nguyen Thanh
7ab270f323 Translated using Weblate (Vietnamese)
Currently translated at 16.9% (26 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/vi/
2025-11-18 07:52:27 +00:00
Nam Nguyen Thanh
6f9b4739c8 Translated using Weblate (Vietnamese)
Currently translated at 16.3% (25 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/vi/
2025-11-18 07:52:26 +00:00
gradle-update-robot
e654a657a0 Update Gradle Wrapper from 9.2.0 to 9.2.1
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2025-11-18 00:59:39 +00:00
Sylvia van Os
ae6567a784 Merge pull request #2841 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-16 17:19:24 +01:00
Dao Duy Tin
be12707ab1 Translated using Weblate (Vietnamese)
Currently translated at 84.4% (277 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2025-11-16 15:51:51 +00:00
Sylvia van Os
e8d40ec679 Merge pull request #2839 from CatimaLoyalty/create-pull-request/patch-1763267079
Update contributors
2025-11-16 10:14:34 +01:00
TheLastProject
e9c40c88a9 Update contributors 2025-11-16 04:24:38 +00:00
Sylvia van Os
82bb9b2817 Merge pull request #2838 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-15 00:12:13 +01:00
Francisco Serrador
976dd6f80b Translated using Weblate (Spanish)
Currently translated at 66.0% (101 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2025-11-14 23:52:36 +01:00
Sylvia van Os
2ac36fa415 Merge pull request #2836 from CatimaLoyalty/create-pull-request/patch-1762978593
Update feature graphic
2025-11-12 23:07:39 +01:00
TheLastProject
19399dd17f Update feature graphic 2025-11-12 20:16:33 +00:00
Sylvia van Os
acae8c1a0d Merge pull request #2835 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-12 21:14:35 +01:00
Mohammad Alhasan
64073e210e Translated using Weblate (Arabic)
Currently translated at 96.0% (315 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2025-11-12 19:51:23 +00:00
Francisco Serrador
3adbf61be7 Translated using Weblate (Spanish)
Currently translated at 63.3% (97 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2025-11-12 17:52:18 +00:00
Francisco Serrador
f0df4622eb Translated using Weblate (Spanish)
Currently translated at 45.7% (70 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2025-11-12 17:52:01 +01:00
Francisco Serrador
81c0f284f6 Translated using Weblate (Spanish)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-11-12 17:51:59 +01:00
Adrián Gelmotto Ruiz
fce60ca712 Translated using Weblate (Spanish)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-11-12 17:51:58 +01:00
Sylvia van Os
2be4d1cd2b Merge pull request #2834 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-12 09:11:26 +01:00
Alì Mortacci
72b19a8272 Translated using Weblate (Italian)
Currently translated at 83.6% (128 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2025-11-12 08:52:04 +01:00
Sylvia van Os
9f9d404632 Merge pull request #2833 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-12 08:25:25 +01:00
Sylvia van Os
157d1ecc49 Merge pull request #2832 from CatimaLoyalty/dependabot/gradle/com.google.zxing-core-3.5.4
Bump com.google.zxing:core from 3.5.3 to 3.5.4
2025-11-12 08:20:51 +01:00
Alì Mortacci
54b21167ec Translated using Weblate (Italian)
Currently translated at 85.9% (282 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2025-11-12 07:52:57 +01:00
Alì Mortacci
34a125008f Translated using Weblate (Italian)
Currently translated at 81.6% (125 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2025-11-12 07:52:56 +01:00
Alì Mortacci
1776f8fd90 Translated using Weblate (Italian)
Currently translated at 85.3% (280 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2025-11-12 07:52:55 +01:00
dependabot[bot]
55269f748f Bump com.google.zxing:core from 3.5.3 to 3.5.4
Bumps [com.google.zxing:core](https://github.com/zxing/zxing) from 3.5.3 to 3.5.4.
- [Release notes](https://github.com/zxing/zxing/releases)
- [Changelog](https://github.com/zxing/zxing/blob/master/CHANGES)
- [Commits](https://github.com/zxing/zxing/compare/zxing-3.5.3...zxing-3.5.4)

---
updated-dependencies:
- dependency-name: com.google.zxing:core
  dependency-version: 3.5.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-12 02:03:17 +00:00
Sylvia van Os
6e42d0dcd9 Merge pull request #2831 from CatimaLoyalty/dependabot/gradle/com.android.application-8.13.1
Bump com.android.application from 8.13.0 to 8.13.1
2025-11-11 08:12:29 +01:00
dependabot[bot]
48113eba18 Bump com.android.application from 8.13.0 to 8.13.1
Bumps com.android.application from 8.13.0 to 8.13.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-11 02:03:16 +00:00
Sylvia van Os
41c8bb1815 Merge pull request #2829 from CatimaLoyalty/create-pull-request/patch-1762662107
Update contributors
2025-11-09 09:17:16 +01:00
Sylvia van Os
eab4f9e123 Merge pull request #2828 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-09 09:16:31 +01:00
TheLastProject
05f4cfc07b Update contributors 2025-11-09 04:21:46 +00:00
asdasd gfsdfdfg
b07b09e703 Translated using Weblate (Polish)
Currently translated at 94.7% (145 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2025-11-08 21:51:56 +01:00
Sylvia van Os
42e69916f0 Merge pull request #2827 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-08 17:13:41 +01:00
Aliaksandr Truš
254c9fee14 Translated using Weblate (Belarusian)
Currently translated at 86.8% (285 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/be/
2025-11-08 11:51:37 +01:00
Sylvia van Os
66e568aa06 Merge pull request #2825 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-07 07:56:05 +01:00
Joel A
1f38110e94 Translated using Weblate (Swedish)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-11-07 03:51:21 +01:00
Joel A
e92a98a956 Translated using Weblate (Swedish)
Currently translated at 99.3% (326 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-11-07 01:51:38 +00:00
Rishab Mamgai
875e90e940 Basic (incomplete) app_name consistency check script
Co-authored-by: ProgramminCat <72707293+ProgramminCat@users.noreply.github.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-11-06 20:02:03 +01:00
Sylvia van Os
5ebd23a88a Merge pull request #2824 from CatimaLoyalty/dependabot/gradle/androidx.core-core-splashscreen-1.2.0
Bump androidx.core:core-splashscreen from 1.0.1 to 1.2.0
2025-11-06 06:53:52 +01:00
Sylvia van Os
6559857ba2 Merge pull request #2823 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-06 06:52:25 +01:00
dependabot[bot]
684b3e9836 Bump androidx.core:core-splashscreen from 1.0.1 to 1.2.0
Bumps androidx.core:core-splashscreen from 1.0.1 to 1.2.0.

---
updated-dependencies:
- dependency-name: androidx.core:core-splashscreen
  dependency-version: 1.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-06 02:03:18 +00:00
Joel A
d4b4599496 Translated using Weblate (Swedish)
Currently translated at 5.2% (8 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2025-11-05 23:51:21 +00:00
Joel A
decd0a104d Translated using Weblate (Swedish)
Currently translated at 97.5% (320 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-11-05 23:51:41 +01:00
Sylvia van Os
177f8e43e2 Merge pull request #2822 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-05 22:27:47 +01:00
ssantos
75234a6cd4 Translated using Weblate (Portuguese)
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-11-05 18:52:34 +00:00
ssantos
86b5c2998e Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-11-05 18:52:33 +00:00
Sylvia van Os
0fee650cee Merge pull request #2820 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-05 17:18:13 +01:00
Francisco Serrador
61ee8b5910 Translated using Weblate (Spanish)
Currently translated at 99.6% (327 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-11-05 11:51:45 +01:00
Sylvia van Os
dae66a63f1 Remove Stocard import reference from README
Stocard importer was removed a while ago
2025-11-04 22:43:36 +01:00
Sylvia van Os
934d7ba041 Release Catima 2.39.2 2025-11-04 18:28:37 +01:00
Sylvia van Os
32b4dd73aa Merge pull request #2818 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-04 16:07:16 +01:00
ezn24
e558e7f6e4 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2025-11-04 14:52:04 +01:00
Sylvia van Os
20cc714b52 Merge pull request #2817 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-03 22:06:54 +01:00
Odoamar
abf26c92e4 Translated using Weblate (Polish)
Currently translated at 94.7% (145 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2025-11-03 19:51:45 +00:00
Sylvia van Os
89bdbe1544 Merge pull request #2816 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-11-03 16:34:33 +01:00
Fjuro
afe930a29f Translated using Weblate (Czech)
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-11-03 14:51:36 +00:00
Edgars Andersons
fc28ad0088 Translated using Weblate (Latvian)
Currently translated at 11.7% (18 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-11-03 08:51:41 +00:00
Kachelkaiser
58b1c67abf Translated using Weblate (German)
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-11-03 08:51:35 +00:00
solokot
ba563023c1 Translated using Weblate (Russian)
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-11-03 08:51:34 +01:00
Максим Горпиніч
efe9487a44 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-11-03 06:51:38 +00:00
Sylvain Pichon
2140066c4d Translated using Weblate (French)
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-11-03 05:51:36 +01:00
Liner Seven
32a70f10c0 Translated using Weblate (Japanese)
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-11-03 02:51:49 +00:00
Arif Budiman
c5ef9f4b1d Translated using Weblate (Indonesian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2025-11-03 00:51:39 +00:00
Krisna A. Prayoga
91a3548613 Translated using Weblate (Indonesian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2025-11-03 00:51:34 +00:00
Irham Mustofa
1f370b86dd Translated using Weblate (Indonesian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2025-11-03 00:51:33 +00:00
大王叫我来巡山
a93ddcb76e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (153 of 153 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-11-02 23:51:42 +00:00
தமிழ்நேரம்
69aa985318 Translated using Weblate (Tamil)
Currently translated at 93.9% (308 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2025-11-02 20:51:59 +01:00
Sylvia van Os
2855cf4569 Merge pull request #2815 from CatimaLoyalty/create-pull-request/patch-1762096307
Update Fastlane changelogs
2025-11-02 17:00:28 +01:00
TheLastProject
01878a5ced Update Fastlane changelogs 2025-11-02 15:11:46 +00:00
Sylvia van Os
bfb68e4118 Update CHANGELOG 2025-11-02 16:11:35 +01:00
Sylvia van Os
709fffcfe5 Merge pull request #2814 from CatimaLoyalty/create-pull-request/patch-1762057266
Update contributors
2025-11-02 08:27:39 +01:00
TheLastProject
5c0474b38e Update contributors 2025-11-02 04:21:05 +00:00
Sylvia van Os
986ae4f0cb Merge pull request #2783 from u7683648/refactor/convert-letterbitmap-to-kotlin
refactor: Convert LetterBitmap to Kotlin
2025-10-31 17:25:00 +01:00
Sylvia van Os
04937e8839 Merge pull request #2809 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-31 08:34:31 +01:00
norm
071062a939 Translated using Weblate (Spanish)
Currently translated at 44.7% (68 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2025-10-31 04:03:15 +00:00
norm
058dc6c79b Translated using Weblate (Spanish)
Currently translated at 44.0% (67 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2025-10-31 02:03:52 +00:00
Xinqi Li
13a78dadb4 convert LetterBitmap to Kotlin 2025-10-31 12:11:58 +11:00
Sylvia van Os
bf12bc4f9d Merge pull request #2803 from CatimaLoyalty/fix/tamilFeatureGraphicTweak
Tweak Tamil feature graphic sizing more
2025-10-30 20:48:10 +01:00
Sylvia van Os
7986428149 Merge pull request #2808 from CatimaLoyalty/create-pull-request/patch-1761849375
Update feature graphic
2025-10-30 19:44:12 +01:00
TheLastProject
e17cbd5c9a Update feature graphic 2025-10-30 18:36:15 +00:00
Sylvia van Os
ebfb105fe4 Tweak Tamil feature graphic sizing more 2025-10-30 19:26:35 +01:00
Sylvia van Os
05a06eea27 Merge pull request #2800 from CatimaLoyalty/gradlew-update-9.2.0
Update Gradle Wrapper from 9.1.0 to 9.2.0
2025-10-30 17:13:22 +01:00
gradle-update-robot
663d7f3354 Update Gradle Wrapper from 9.1.0 to 9.2.0
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2025-10-30 01:00:21 +00:00
Sylvia van Os
dbe5b88b52 Merge pull request #2798 from CatimaLoyalty/create-pull-request/patch-1761761200
Update feature graphic
2025-10-29 19:29:46 +01:00
Sylvia van Os
c839fffadb Merge pull request #2797 from CatimaLoyalty/fix/tamil_feature_graphic
Lower Tamil font size
2025-10-29 19:28:23 +01:00
TheLastProject
8edfe53b45 Update feature graphic 2025-10-29 18:06:39 +00:00
Sylvia van Os
0153fc54f1 Lower Tamil font size
This should make the feature graphic fit properly
2025-10-29 19:02:05 +01:00
Sylvia van Os
f6b0af153f Merge pull request #2779 from adammazechen/refactor/scanactivity_java_to_kt
Refactor ScanActivity.java to kotlin
2025-10-29 18:42:42 +01:00
Sylvia van Os
cfefce1baf Minor cleanups 2025-10-29 18:27:15 +01:00
Zechen Ma
ff1683d5b4 refactor: convert ScanActivity.java to Kotlin.
bug: fix indentation and several bugs, convert more code blocks into apply blocks.
2025-10-29 08:35:13 +11:00
Sylvia van Os
e181a866f7 Merge pull request #2794 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-28 20:31:36 +01:00
Hosted Weblate
1571d5766c Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2025-10-28 18:06:30 +01:00
ssantos
1a4582adae Translated using Weblate (Portuguese)
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-10-28 18:04:47 +01:00
ssantos
88335b970f Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-10-28 18:03:56 +01:00
Anonymous
cac2dffb6c Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-10-28 18:03:55 +01:00
ssantos
8a868e17bc Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-10-28 18:03:54 +01:00
ssantos
1d05e96690 Translated using Weblate (Portuguese)
Currently translated at 98.6% (150 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-10-28 16:03:54 +00:00
ssantos
1d315d530f Translated using Weblate (Portuguese (Portugal))
Currently translated at 98.0% (149 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-10-28 16:03:32 +00:00
Sylvia van Os
597fefa9c9 Translated using Weblate (Tamil)
Currently translated at 3.9% (6 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ta/
2025-10-27 19:04:17 +01:00
Rajasree2004
764834bbae Translated using Weblate (Tamil)
Currently translated at 3.9% (6 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ta/
2025-10-27 19:04:16 +01:00
Rajasree2004
582cfb4cf0 Translated using Weblate (Tamil)
Currently translated at 3.9% (6 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ta/
2025-10-27 19:04:15 +01:00
Rajasree2004
998fb16a03 Translated using Weblate (Tamil)
Currently translated at 3.9% (6 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ta/
2025-10-27 19:04:14 +01:00
Rajasree2004
40dd95f9c2 Translated using Weblate (Tamil)
Currently translated at 87.1% (286 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2025-10-27 19:04:13 +01:00
Sylvia van Os
a27a6733e8 Merge pull request #2795 from CatimaLoyalty/dependabot/github_actions/actions/upload-artifact-5.0.0
Bump actions/upload-artifact from 4.6.2 to 5.0.0
2025-10-27 06:58:57 +01:00
dependabot[bot]
c76de152fc Bump actions/upload-artifact from 4.6.2 to 5.0.0
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.2 to 5.0.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4.6.2...v5.0.0)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 02:06:32 +00:00
Sylvia van Os
d0d75a4f50 Merge pull request #2793 from CatimaLoyalty/create-pull-request/patch-1761452387
Update contributors
2025-10-26 12:33:09 +01:00
TheLastProject
df42111f83 Update contributors 2025-10-26 04:19:46 +00:00
Sylvia van Os
da52a3685f Merge pull request #2792 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-25 10:46:40 +02:00
Igor W
bd85711e7f Translated using Weblate (Polish)
Currently translated at 92.0% (302 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-10-25 08:03:10 +00:00
Sylvia van Os
a02bf3e05c Merge pull request #2791 from CatimaLoyalty/dependabot/gradle/org.jetbrains.kotlin.android-2.2.21
Bump org.jetbrains.kotlin.android from 2.2.20 to 2.2.21
2025-10-24 08:17:00 +02:00
dependabot[bot]
a397199834 Bump org.jetbrains.kotlin.android from 2.2.20 to 2.2.21
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 2.2.20 to 2.2.21.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v2.2.21/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.2.20...v2.2.21)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-24 02:04:27 +00:00
Zechen Ma
27c16c2faf Rename .java to .kt 2025-10-24 06:20:23 +11:00
Sylvia van Os
131004494b Merge pull request #2790 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-22 23:21:55 +02:00
Feike Donia
777bde7b5e Translated using Weblate (Catalan)
Currently translated at 83.2% (273 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2025-10-22 21:02:56 +00:00
Feike Donia
3ba8f36108 Translated using Weblate (Afrikaans)
Currently translated at 14.3% (47 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/af/
2025-10-22 20:03:29 +00:00
Feike Donia
773a0fa6d4 Translated using Weblate (Catalan)
Currently translated at 83.2% (273 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2025-10-22 20:03:28 +00:00
Feike Donia
e88a537aec Translated using Weblate (Italian)
Currently translated at 85.0% (279 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2025-10-22 20:03:27 +00:00
Sylvia van Os
6ac60f9546 Merge pull request #2788 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-22 19:26:44 +02:00
Feike Donia
6fd6379ef3 Translated using Weblate (Afrikaans)
Currently translated at 14.0% (46 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/af/
2025-10-22 19:03:03 +02:00
Feike Donia
2a4949a505 Translated using Weblate (Dutch)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-10-22 19:03:02 +02:00
Sylvia van Os
386a24305d Merge pull request #2787 from CatimaLoyalty/create-pull-request/patch-1761152124
Update locales
2025-10-22 19:01:48 +02:00
TheLastProject
45c4b89a4d Update locales 2025-10-22 16:55:24 +00:00
Sylvia van Os
73ea525d8b Merge pull request #2786 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-22 18:55:06 +02:00
Sylvia van Os
2ab267f601 Merge pull request #2782 from aradxxx/ucropwrapper_to_kt
Convert UcropWrapper to kotlin
2025-10-22 18:47:20 +02:00
Feike Donia
ae54e91382 Added translation using Weblate (Frisian) 2025-10-22 18:39:39 +02:00
Feike Donia
45c082fba9 Added translation using Weblate (Afrikaans) 2025-10-22 16:39:08 +00:00
Feike Donia
aeedd9c3ac Translated using Weblate (Catalan)
Currently translated at 84.1% (276 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2025-10-22 16:39:07 +00:00
Sylvia van Os
e76e4f42f2 Merge pull request #2785 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-22 18:27:04 +02:00
Feike Donia
f68a1f1c86 Translated using Weblate (Catalan)
Currently translated at 78.9% (259 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2025-10-22 18:02:58 +02:00
Edgars Andersons
45a07d361c Translated using Weblate (Latvian)
Currently translated at 11.1% (17 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-10-22 16:03:19 +02:00
Xinqi Li
7f4937552d Rename .java to .kt 2025-10-22 11:22:12 +11:00
Sylvia van Os
b786fd60b4 Merge pull request #2777 from aradxxx/managegroupactivity_codestyle_fixes
ManageGroupActivity.kt small codestyle fixes
2025-10-21 22:44:14 +02:00
aradxxx
66646758a8 Convert UCropWrapper to kotlin 2025-10-21 22:08:15 +04:00
aradxxx
ece309fbde Rename .java to .kt 2025-10-21 21:40:34 +04:00
aradxxx
99c472330f ManageGroupActivity.kt small codestyle fixes 2025-10-20 23:50:51 +04:00
Sylvia van Os
246d5b5e4c Merge pull request #2781 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-20 21:31:45 +02:00
Damjan Gerl
8a8b243012 Translated using Weblate (Slovenian)
Currently translated at 38.1% (58 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2025-10-20 19:04:55 +02:00
ssantos
4612473e62 Translated using Weblate (Portuguese)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-10-20 04:56:55 +00:00
ssantos
ab94e05e91 Translated using Weblate (Portuguese (Portugal))
Currently translated at 97.5% (320 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-10-20 04:56:53 +00:00
Anonymous
d2ecad5c3f Translated using Weblate (Portuguese (Portugal))
Currently translated at 97.5% (320 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-10-20 04:56:52 +00:00
Kerso
a4c9d5a345 Translated using Weblate (Polish)
Currently translated at 90.8% (298 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-10-20 04:56:51 +00:00
Sylvia van Os
5b30a11da3 Merge pull request #2763 from aradxxx/managegroupsactivity_to_kotlin
Convert ManageGroupsActivity to Kotlin
2025-10-19 14:01:53 +02:00
Gonzalo Aparicio
bda159a343 Migrate dependency management to Gradle Version Catalog (libs.versions.toml) (#2727)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-10-19 13:57:09 +02:00
Sylvia van Os
f473d31f13 Merge pull request #2780 from CatimaLoyalty/create-pull-request/patch-1760847620
Update contributors
2025-10-19 12:12:40 +02:00
TheLastProject
1afe181085 Update contributors 2025-10-19 04:20:20 +00:00
Sylvia van Os
647b7185df Merge pull request #2776 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-16 18:37:42 +02:00
Liner Seven
f301726a02 Translated using Weblate (Japanese)
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-16 08:08:48 +00:00
Liner Seven
819be647b5 Translated using Weblate (Japanese)
Currently translated at 90.1% (137 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-16 09:13:26 +02:00
Liner Seven
6215972732 Translated using Weblate (Japanese)
Currently translated at 88.8% (135 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-16 07:11:46 +00:00
Liner Seven
90e406c30e Translated using Weblate (Japanese)
Currently translated at 87.5% (133 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-16 07:08:31 +02:00
Liner Seven
d7a5a47393 Translated using Weblate (Japanese)
Currently translated at 80.2% (122 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-16 04:09:06 +02:00
Liner Seven
8bacd4d1f5 Translated using Weblate (Japanese)
Currently translated at 80.2% (122 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-16 02:08:30 +00:00
Liner Seven
a4d9ef0cb1 Translated using Weblate (Japanese)
Currently translated at 76.3% (116 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-16 02:08:44 +02:00
aradxxx
8bed9c753b Convert ManageGroupsActivity.java to Kotlin 2025-10-15 22:58:45 +04:00
aradxxx
47e598ede1 Rename .java to .kt 2025-10-15 21:40:27 +04:00
Damjan Gerl
7edd41b08f Translated using Weblate (Slovenian)
Currently translated at 31.5% (48 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2025-10-15 17:07:43 +00:00
Sylvia van Os
a00dd69005 Merge pull request #2775 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-15 18:34:04 +02:00
Damjan Gerl
201c2b5964 Translated using Weblate (Slovenian)
Currently translated at 30.2% (46 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2025-10-15 16:11:18 +00:00
Hosted Weblate
5329a69e4d Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2025-10-15 16:11:17 +00:00
Damjan Gerl
7ab0ffa0a3 Translated using Weblate (Slovenian)
Currently translated at 28.9% (44 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2025-10-15 16:11:16 +00:00
Damjan Gerl
33471e91be Translated using Weblate (Slovenian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2025-10-15 16:11:15 +00:00
Sylvia van Os
129bffe4b7 Merge pull request #2774 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-15 17:10:34 +02:00
mrestivill
3f3a9ac807 Translated using Weblate (Catalan)
Currently translated at 40.7% (62 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ca/
2025-10-15 14:38:11 +00:00
mrestivill
c702efbd1e Translated using Weblate (Catalan)
Currently translated at 78.0% (256 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2025-10-15 14:38:09 +00:00
Sylvia van Os
088098edad Merge pull request #2773 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-15 08:40:14 +02:00
Liner Seven
1e3e3c0e2e Translated using Weblate (Japanese)
Currently translated at 67.1% (102 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-15 01:07:45 +00:00
Liner Seven
d9781e207c Translated using Weblate (Japanese)
Currently translated at 50.6% (77 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-15 02:08:16 +02:00
Liner Seven
4a83c21d0d Translated using Weblate (Japanese)
Currently translated at 50.0% (76 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-15 02:08:15 +02:00
Sylvia van Os
5d592e253b Merge pull request #2772 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-14 19:50:25 +02:00
Liner Seven
820091b8fa Translated using Weblate (Japanese)
Currently translated at 47.3% (72 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-14 09:08:15 +02:00
Sylvia van Os
40c5eab3c5 Merge pull request #2771 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-14 08:20:39 +02:00
Liner Seven
c133fcf08a Translated using Weblate (Japanese)
Currently translated at 42.7% (65 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-14 08:07:58 +02:00
Sylvia van Os
8094b7cc47 Merge pull request #2760 from aradxxx/manage_group_activity_to_kt
Convert ManageGroupActivity to Kotlin
2025-10-13 23:18:36 +02:00
Sylvia van Os
abd8716b56 Minor cleanups 2025-10-13 23:01:36 +02:00
Sylvia van Os
cecad8351e Merge pull request #2770 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-13 18:54:31 +02:00
ssantos
4d1af69ed8 Translated using Weblate (Portuguese)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-10-13 16:08:01 +00:00
ssantos
f468c06801 Translated using Weblate (Portuguese)
Currently translated at 98.0% (149 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-10-13 16:08:00 +00:00
aradxxx
a0ef9b8d1b Convert ManageGroupActivity.java to Kotlin 2025-10-13 15:04:29 +04:00
Sylvia van Os
27f1f6f179 Merge pull request #2769 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-13 12:24:33 +02:00
jezoswiec
6ea1120517 Translated using Weblate (Polish)
Currently translated at 90.5% (297 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-10-13 08:07:41 +02:00
Sylvia van Os
2f7c44cbbe Merge pull request #2766 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-12 09:45:02 +02:00
Sylvia van Os
dd866a0f2b Merge pull request #2767 from CatimaLoyalty/create-pull-request/patch-1760242739
Update contributors
2025-10-12 09:41:42 +02:00
TheLastProject
889d1beab4 Update contributors 2025-10-12 04:18:59 +00:00
Oğuz Ersen
357052ee42 Translated using Weblate (Turkish)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-10-11 17:08:54 +02:00
Sylvia van Os
19eda065ba Merge pull request #2765 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-11 09:22:58 +02:00
Liner Seven
5279c5c3b2 Translated using Weblate (Japanese)
Currently translated at 40.7% (62 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-11 09:07:37 +02:00
Liner Seven
17be4e739f Translated using Weblate (Japanese)
Currently translated at 36.8% (56 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-11 06:07:41 +00:00
Liner Seven
f2dd2e4d7e Translated using Weblate (Japanese)
Currently translated at 30.2% (46 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-11 03:07:35 +02:00
Liner Seven
7c6ce077c1 Translated using Weblate (Japanese)
Currently translated at 29.6% (45 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-11 02:07:45 +02:00
Sylvia van Os
45bf552eff Merge pull request #2755 from amlwin/main
Convert ImportExportActivity to Kotlin
2025-10-09 23:35:08 +02:00
Sylvia van Os
633d412b52 Merge pull request #2762 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-09 12:29:17 +02:00
Adrián Gelmotto Ruiz
54b8fb2d78 Translated using Weblate (Spanish)
Currently translated at 99.0% (325 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-10-09 08:08:01 +00:00
Sylvia van Os
443e9f110b Merge pull request #2761 from CatimaLoyalty/docs/LLM
Explain why LLM contributions are discouraged
2025-10-09 01:11:21 +02:00
Sylvia van Os
ac80bed084 Explain why LLM contributions are discouraged 2025-10-08 21:24:19 +02:00
aradxxx
802717c7a4 Rename .java to .kt 2025-10-08 21:16:30 +04:00
Sylvia van Os
68b931f3b5 Merge pull request #2753 from CatimaLoyalty/dependabot/github_actions/gradle/actions-5
Bump gradle/actions from 4 to 5
2025-10-07 15:15:07 +02:00
Sylvia van Os
d4a4067754 Merge pull request #2758 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-07 10:35:50 +02:00
Hosted Weblate
ca18cfd6d1 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2025-10-07 06:05:02 +00:00
ezn24
18d80d2a4a Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2025-10-07 06:05:01 +00:00
ezn24
ba4b9e4234 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2025-10-07 06:05:00 +00:00
Anonymous
b87d531069 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2025-10-07 06:05:00 +00:00
Sylvia van Os
5cbb2505e3 Merge pull request #2757 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-07 06:46:15 +02:00
Liner Seven
e500a13c7e Translated using Weblate (Japanese)
Currently translated at 26.9% (41 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-07 00:02:32 +00:00
Sylvia van Os
a4e9333c6e Merge pull request #2756 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-06 21:23:21 +02:00
ssantos
9dbe39e1a4 Translated using Weblate (Portuguese (Portugal))
Currently translated at 96.3% (316 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-10-06 21:02:40 +02:00
Sylvia van Os
13c78eaee5 Merge pull request #2754 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-06 20:19:08 +02:00
Liner Seven
ef0e36b8be Translated using Weblate (Japanese)
Currently translated at 21.7% (33 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-06 07:02:06 +02:00
Liner Seven
a1351563c1 Translated using Weblate (Japanese)
Currently translated at 21.0% (32 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-06 06:02:07 +02:00
amlwin
303b40e572 Convert ImportExportActivity to Kotlin
Refactored `ImportExportActivity` and its corresponding test class from Java to Kotlin. The new implementation uses modern Kotlin idioms and syntax while preserving the original functionality.
2025-10-06 11:34:45 +08:00
amlwin
622ea37554 Rename .java to .kt 2025-10-06 11:34:45 +08:00
Liner Seven
8a80d16f11 Translated using Weblate (Japanese)
Currently translated at 16.4% (25 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-10-06 05:02:27 +02:00
dependabot[bot]
4ea515c342 Bump gradle/actions from 4 to 5
Bumps [gradle/actions](https://github.com/gradle/actions) from 4 to 5.
- [Release notes](https://github.com/gradle/actions/releases)
- [Commits](https://github.com/gradle/actions/compare/v4...v5)

---
updated-dependencies:
- dependency-name: gradle/actions
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 02:06:05 +00:00
Aung Myo Lwin
ce3dbaf902 Convert SettingsActivity to Kotlin (#2744)
* Rename .java to .kt

* Convert SettingsActivity to Kotlin

Refactored the `SettingsActivity` and its inner `SettingsFragment` from Java to Kotlin, adopting modern Kotlin idioms and syntax. The functionality remains unchanged.

* Address PR comment: by removing null safety with non-null asserted call operator

* Apply Android Studio suggested fixup

---------

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-10-05 21:13:17 +02:00
Sylvia van Os
a429b858e2 Merge pull request #2752 from CatimaLoyalty/create-pull-request/patch-1759637964
Update contributors
2025-10-05 09:04:54 +02:00
TheLastProject
d8d228aa67 Update contributors 2025-10-05 04:19:24 +00:00
Sylvia van Os
b31785a705 Merge pull request #2749 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-04 15:25:28 +02:00
B o d o
48b5e9f775 Translated using Weblate (Portuguese)
Currently translated at 98.1% (322 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-10-04 15:02:32 +02:00
B o d o
150ef5982a Translated using Weblate (Esperanto)
Currently translated at 78.6% (258 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/eo/
2025-10-04 15:02:31 +02:00
Sylvia van Os
f91b94d100 Dep/bump ucrop (#2748)
* Bump com.github.yalantis:ucrop from 2.2.10 to 2.2.11

Bumps [com.github.yalantis:ucrop](https://github.com/Yalantis/uCrop) from 2.2.10 to 2.2.11.
- [Release notes](https://github.com/Yalantis/uCrop/releases)
- [Commits](https://github.com/Yalantis/uCrop/compare/2.2.10...2.2.11)

---
updated-dependencies:
- dependency-name: com.github.yalantis:ucrop
  dependency-version: 2.2.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

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

* Fix build

While testing on Android 15, no difference was found in the status bar
colour on Android 15 with or without the setting

* Use non-native release

* Apply autogenerated ProGuard missing rules

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-04 14:11:42 +02:00
Sylvia van Os
6f25cc416f Merge pull request #2746 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-03 21:53:12 +02:00
Svend Bøgelund
8358e982f9 Translated using Weblate (Danish)
Currently translated at 46.9% (154 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/da/
2025-10-03 16:02:26 +02:00
Claus Kruse
637fdeebe6 Translated using Weblate (Danish)
Currently translated at 46.9% (154 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/da/
2025-10-03 16:02:25 +02:00
Sylvia van Os
96cf5274b1 Merge pull request #2743 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-02 16:26:15 +02:00
JorgeS15
1df5772857 Translated using Weblate (Portuguese (Portugal))
Currently translated at 85.3% (280 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-10-02 10:02:14 +00:00
Fjuro
44690dae55 Translated using Weblate (Czech)
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-10-02 10:02:28 +02:00
Liner Seven
ff46db7ac2 Translated using Weblate (Japanese)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-10-02 10:02:06 +02:00
Liner Seven
8f03595683 Translated using Weblate (Japanese)
Currently translated at 97.8% (321 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-10-02 09:02:14 +02:00
Liner Seven
ac7494d08d Translated using Weblate (Japanese)
Currently translated at 97.5% (320 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-10-02 07:02:06 +00:00
Nyatsuki
e6ae0dab30 Translated using Weblate (Japanese)
Currently translated at 97.5% (320 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-10-02 07:02:02 +00:00
Liner Seven
bc7da41da4 Translated using Weblate (Japanese)
Currently translated at 79.2% (260 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-10-02 06:02:29 +00:00
Nyatsuki
2fc5216cf1 Translated using Weblate (Japanese)
Currently translated at 79.2% (260 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-10-02 06:02:28 +00:00
Liner Seven
8a792481b6 Translated using Weblate (Japanese)
Currently translated at 78.9% (259 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-10-02 06:02:27 +00:00
Nyatsuki
53e4e6b675 Translated using Weblate (Japanese)
Currently translated at 78.9% (259 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-10-02 06:02:27 +00:00
Sylvia van Os
f06d338c5a Merge pull request #2741 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-01 22:41:29 +02:00
Milo Ivir
fef65bd5d2 Translated using Weblate (Croatian)
Currently translated at 1.9% (3 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hr/
2025-10-01 20:26:17 +00:00
Milo Ivir
b830040639 Translated using Weblate (Croatian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2025-10-01 20:26:17 +00:00
Sylvia van Os
2662178bef Merge pull request #2739 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-01 20:39:51 +02:00
Milo Ivir
2a15ba9fe4 Translated using Weblate (Croatian)
Currently translated at 85.0% (279 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2025-10-01 20:02:34 +02:00
Sylvia van Os
f777491dcd Release Catima 2.39.1 2025-10-01 17:54:19 +02:00
Sylvia van Os
81445a21ff Merge pull request #2737 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-10-01 17:53:39 +02:00
Edgars Andersons
ff410542fb Translated using Weblate (Latvian)
Currently translated at 11.1% (17 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-10-01 11:02:18 +00:00
B o d o
343e10f433 Translated using Weblate (German)
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-10-01 12:02:18 +02:00
Максим Горпиніч
8023372a03 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-10-01 08:03:02 +02:00
solokot
cd999f2346 Translated using Weblate (Russian)
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-10-01 08:02:39 +02:00
Sylvain Pichon
4272d48fbf Translated using Weblate (French)
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-10-01 08:02:18 +02:00
大王叫我来巡山
ae40737b75 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-10-01 05:02:20 +00:00
大王叫我来巡山
4fe55be866 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (152 of 152 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-10-01 05:02:38 +02:00
Sylvia van Os
c5c4cf615f Merge pull request #2736 from CatimaLoyalty/create-pull-request/patch-1759268827
Update Fastlane changelogs
2025-09-30 23:47:35 +02:00
TheLastProject
44e542ed5a Update Fastlane changelogs 2025-09-30 21:47:07 +00:00
Sylvia van Os
bc2be8d33c Update CHANGELOG 2025-09-30 23:46:54 +02:00
Sylvia van Os
73ed0edab7 Merge pull request #2734 from CatimaLoyalty/fix/crash_missing_header_color
Fix crash on missing header colors
2025-09-30 23:44:07 +02:00
Sylvia van Os
a34a091cdb Fix crash on missing header colors
An off-by-one error caused invalid colour info to sometimes be generated
if no header colour was set. Under normal conditions, a header colour
should always be set, but due to some bugs in the past in some cases
they may not be set.

Sadly this does change the card colours for cards which are not properly
initialized. But that's better than a crash at least.
2025-09-30 23:27:11 +02:00
Sylvia van Os
4f3d162d7a Merge pull request #2732 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-30 21:31:33 +02:00
Eren Ekşi
99605d7d18 Translated using Weblate (Turkish)
Currently translated at 99.6% (327 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-09-30 21:02:25 +02:00
Sylvia van Os
fa152510a6 Merge pull request #2730 from CatimaLoyalty/fix/privacy_policy_acra
Document ACRA usage in privacy policy
2025-09-30 19:24:56 +02:00
Sylvia van Os
ddc868894e Document ACRA usage in privacy policy 2025-09-30 19:13:18 +02:00
Sylvia van Os
0a65fb607a Release Catima 2.39.0 2025-09-30 18:39:26 +02:00
Sylvia van Os
921c76459c Merge pull request #2728 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-30 18:38:16 +02:00
大王叫我来巡山
abf1ad61d6 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-09-30 16:03:13 +02:00
Sylvia van Os
fbcc2ef4fe Merge pull request #2724 from CatimaLoyalty/dependabot/gradle/acraVersion-5.13.1
Bump acraVersion from 5.12.0 to 5.13.1
2025-09-29 20:10:39 +02:00
Sylvia van Os
699e7ce489 Merge pull request #2725 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-29 18:31:15 +02:00
Gideon
a45588abee Translated using Weblate (Dutch)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-09-29 17:01:59 +02:00
ikanakova
44d5095101 Translated using Weblate (Czech)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-09-29 14:02:42 +00:00
solokot
b0b6de9a7d Translated using Weblate (Russian)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-09-29 11:02:22 +00:00
Edgars Andersons
6b13e83146 Translated using Weblate (Latvian)
Currently translated at 10.5% (16 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-09-29 11:02:12 +02:00
rainy_sunset
cbac67728e Translated using Weblate (Japanese)
Currently translated at 5.2% (8 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-09-29 11:02:04 +02:00
Sylvain Pichon
400f4d20c1 Translated using Weblate (French)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-09-29 08:02:54 +02:00
dependabot[bot]
3288b4602a Bump acraVersion from 5.12.0 to 5.13.1
Bumps `acraVersion` from 5.12.0 to 5.13.1.

Updates `ch.acra:acra-mail` from 5.12.0 to 5.13.1
- [Release notes](https://github.com/ACRA/acra/releases)
- [Commits](https://github.com/ACRA/acra/compare/acra-5.12.0...acra-5.13.1)

Updates `ch.acra:acra-dialog` from 5.12.0 to 5.13.1
- [Release notes](https://github.com/ACRA/acra/releases)
- [Commits](https://github.com/ACRA/acra/compare/acra-5.12.0...acra-5.13.1)

---
updated-dependencies:
- dependency-name: ch.acra:acra-mail
  dependency-version: 5.13.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: ch.acra:acra-dialog
  dependency-version: 5.13.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 02:04:16 +00:00
Sylvia van Os
74dec728ad Merge pull request #2723 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-28 23:20:35 +02:00
Максим Горпиніч
aa72663440 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-09-28 21:03:01 +00:00
B o d o
f2fa6ed96d Translated using Weblate (German)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-09-28 21:03:00 +00:00
Sylvia van Os
9b8e78a264 Merge pull request #2722 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-28 22:23:12 +02:00
Fjuro
0e442beed5 Translated using Weblate (Czech)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-09-28 20:02:46 +00:00
Fjuro
ff1d38d159 Translated using Weblate (Czech)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-09-28 20:02:45 +00:00
Sylvia van Os
5f8c8048e6 Merge pull request #2721 from CatimaLoyalty/create-pull-request/patch-1759033153
Update contributors
2025-09-28 08:57:52 +02:00
TheLastProject
dc6d951241 Update contributors 2025-09-28 04:19:13 +00:00
Sylvia van Os
9037ae0d53 Merge pull request #2719 from CatimaLoyalty/create-pull-request/patch-1758969988
Update Fastlane changelogs
2025-09-27 12:46:47 +02:00
TheLastProject
83e7aa61fa Update Fastlane changelogs 2025-09-27 10:46:27 +00:00
Sylvia van Os
11030b1e6a Update CHANGELOG 2025-09-27 12:46:16 +02:00
Sylvia van Os
2f37e2a9c7 Merge pull request #2713 from vijay2909/fix/remove-image-crash
fix: Crash after removing image while viewing image
2025-09-27 12:45:37 +02:00
Sylvia van Os
fcf891647c Merge pull request #2718 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-27 12:03:09 +02:00
Edgars Andersons
8465131d41 Translated using Weblate (Latvian)
Currently translated at 10.5% (16 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-09-27 09:02:26 +00:00
Edgars Andersons
a33656d43b Translated using Weblate (Latvian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-09-27 09:02:25 +00:00
Sylvia van Os
52397ab340 Merge pull request #2717 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-27 10:29:19 +02:00
109247019824
930a730252 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-09-27 09:02:24 +02:00
Sylvia van Os
37a707ba1d Merge pull request #2715 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-27 00:19:24 +02:00
109247019824
d9e4f58687 Translated using Weblate (Bulgarian)
Currently translated at 98.7% (324 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-09-27 00:02:20 +02:00
Sylvia van Os
98bbca85b2 Merge pull request #2714 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-26 21:29:05 +02:00
solokot
0f9aac76e2 Translated using Weblate (Russian)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-09-26 19:02:44 +00:00
solokot
7c933f888c Translated using Weblate (Russian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-09-26 19:02:43 +00:00
hritikRitss
9ae02ddb15 fix: reset mainImageIndex if it exceeds available image count 2025-09-26 23:47:37 +05:30
Sylvia van Os
8333dd0d0c Update used libraries (#2712) 2025-09-26 19:15:19 +02:00
Sylvia van Os
c21159c571 Update used libraries 2025-09-26 19:03:31 +02:00
PRATHAMESH BHAGAT
81db39d4e1 Migrate Enums and Interfaces to kotlin (#2710)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-09-26 18:57:10 +02:00
Sylvia van Os
3e77ab6845 Merge pull request #2711 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-26 18:29:09 +02:00
Sylvain Pichon
562ae9cd56 Translated using Weblate (French)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-09-26 16:02:48 +00:00
Sylvain Pichon
cb321ffdb8 Translated using Weblate (French)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-26 16:02:48 +00:00
Sylvia van Os
a8d654b8d5 Merge pull request #2709 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-26 18:02:23 +02:00
Priit Jõerüüt
b2806cd000 Translated using Weblate (Estonian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-09-26 16:02:09 +02:00
Vasilis K
d4166f681d Translated using Weblate (Greek)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-09-26 13:02:00 +00:00
B o d o
19829be16a Translated using Weblate (German)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-09-26 09:02:03 +02:00
B o d o
666ee288c3 Translated using Weblate (German)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-26 09:01:59 +02:00
josé m
2a8b5f983f Translated using Weblate (Galician)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-09-26 07:02:01 +02:00
Максим Горпиніч
adf8ae9878 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-09-26 06:02:21 +02:00
Максим Горпиніч
7a6bee4a13 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-09-26 06:02:00 +02:00
大王叫我来巡山
4a05031e42 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (151 of 151 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-09-26 04:02:20 +02:00
大王叫我来巡山
8c86cc3c1a Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-09-26 04:02:02 +02:00
delvani
5205011610 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (328 of 328 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-09-26 00:02:10 +00:00
Bai
f689cb6a8e Translated using Weblate (Turkish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-09-25 23:02:43 +00:00
Oğuz Ersen
412215603e Translated using Weblate (Turkish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-09-25 23:02:42 +00:00
Sylvia van Os
97c34f8ae6 Merge pull request #2708 from CatimaLoyalty/create-pull-request/patch-1758830206
Update Fastlane changelogs
2025-09-25 22:09:41 +02:00
TheLastProject
6563bc1b70 Update Fastlane changelogs 2025-09-25 19:56:46 +00:00
Sylvia van Os
205bda34ae Update CHANGELOG 2025-09-25 21:55:45 +02:00
Sylvia van Os
663f68fff9 Merge pull request #2107 from CatimaLoyalty/experiment/acra
Set up ACRA with email crash alerts
2025-09-25 21:46:41 +02:00
Sylvia van Os
dc9f4fafde Set up ACRA with email crash alerts for foss build 2025-09-25 19:14:39 +02:00
Sylvia van Os
6651aff962 Merge pull request #2611 from CatimaLoyalty/dependabot/gradle/androidx.core-core-ktx-1.17.0
Bump androidx.core:core-ktx from 1.16.0 to 1.17.0
2025-09-25 19:04:40 +02:00
dependabot[bot]
55a6dfafed Bump androidx.core:core-ktx from 1.16.0 to 1.17.0
Bumps androidx.core:core-ktx from 1.16.0 to 1.17.0.

---
updated-dependencies:
- dependency-name: androidx.core:core-ktx
  dependency-version: 1.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-25 16:03:28 +00:00
Sylvia van Os
a6bf282db5 Merge pull request #2706 from CatimaLoyalty/create-pull-request/patch-1758733079
Update Fastlane changelogs
2025-09-24 18:58:23 +02:00
TheLastProject
63bd0edb10 Update Fastlane changelogs 2025-09-24 16:57:58 +00:00
Sylvia van Os
9f2adf4691 Update CHANGELOG 2025-09-24 18:57:47 +02:00
Sylvia van Os
d36b95d275 Merge pull request #2697 from CatimaLoyalty/target/android16
Target Android 16
2025-09-24 18:56:31 +02:00
Sylvia van Os
c7fdd63d7d Add some FIXMEs 2025-09-24 18:31:22 +02:00
Sylvia van Os
412077e2ab Remove rotation hack and add warning to not rotate to import/export
This is suboptimal, but rotation support is being removed by Google for
over 600dp screen sizes
2025-09-24 18:31:22 +02:00
Sylvia van Os
0f1005c193 Remove rotation support
With the release of targetSdk 36, the Android platform will no longer
always apply rotation. To lower the chance of user confusion, this
support is being removed completely.

I know some of you really love this, but I can't do anything about this.
This is Google's decision and my opinion doesn't matter.
2025-09-24 18:31:19 +02:00
Sylvia van Os
7353414ae6 Bump targetSdk to 36 2025-09-24 18:30:44 +02:00
Sylvia van Os
894a3dd44f Merge pull request #2705 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-24 17:28:09 +02:00
Sylvia van Os
4b86f3e822 Translated using Weblate (Hindi)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2025-09-24 13:02:32 +00:00
B o d o
b6077e1dd6 Translated using Weblate (Swedish)
Currently translated at 97.9% (327 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-09-24 13:02:08 +00:00
B o d o
267efb8905 Translated using Weblate (Swedish)
Currently translated at 93.1% (311 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-09-24 12:03:02 +00:00
Joel A
9412a70517 Translated using Weblate (Swedish)
Currently translated at 93.1% (311 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-09-24 12:03:01 +00:00
Govind Gopal Yadav
de754acf92 Translated using Weblate (Hindi)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2025-09-24 12:03:01 +00:00
Govind Gopal Yadav
fce7bf9cd0 Translated using Weblate (Hindi)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2025-09-24 12:03:00 +00:00
Govind Gopal Yadav
6f335d44a0 Translated using Weblate (Hindi)
Currently translated at 98.6% (148 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2025-09-24 12:02:59 +00:00
Hosted Weblate
2fa6af7de9 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2025-09-24 12:02:58 +00:00
Govind Gopal Yadav
4b9dfc9e0c Translated using Weblate (Hindi)
Currently translated at 97.3% (146 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2025-09-24 12:02:58 +00:00
Govind Gopal Yadav
3ead1ab079 Translated using Weblate (Hindi)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2025-09-24 12:02:57 +00:00
Py- Droid
ff5ffed8aa Translated using Weblate (Arabic)
Currently translated at 97.3% (325 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2025-09-24 12:02:55 +00:00
PRATHAMESH BHAGAT
d047c38bc2 Migrating ThirdPartyInfo class to kotlin (#2699)
* Migrating ThirdPartyINfo class to kotlin

* Removing null allowance in strings
2025-09-23 18:30:00 +02:00
Sylvia van Os
52b62b1075 Merge pull request #2701 from CatimaLoyalty/gradlew-update-9.1.0
Update Gradle Wrapper from 9.0.0 to 9.1.0
2025-09-22 22:36:33 +02:00
Sylvia van Os
ad384af7e4 Merge pull request #2704 from CatimaLoyalty/create-pull-request/patch-1758428392
Update contributors
2025-09-21 10:59:55 +02:00
TheLastProject
06b3ec09be Update contributors 2025-09-21 04:19:52 +00:00
Sylvia van Os
c803c5be8b Merge pull request #2703 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-20 23:14:02 +02:00
Fjuro
f120a00a75 Translated using Weblate (Czech)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-09-20 21:02:35 +00:00
Sylvia van Os
99a244ae2e Merge pull request #2702 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-20 17:18:40 +02:00
Sylvain Pichon
713af1aeaa Translated using Weblate (French)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-19 04:02:24 +00:00
gradle-update-robot
1cc7ac3f4d Update Gradle Wrapper from 9.0.0 to 9.1.0
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2025-09-19 00:56:32 +00:00
Sylvia van Os
dfee86186a Merge pull request #2700 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-18 20:10:50 +02:00
Priit Jõerüüt
d82574136a Translated using Weblate (Estonian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-09-18 19:02:28 +02:00
delvani
766f953e65 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-09-18 19:02:27 +02:00
Sylvia van Os
593a4098a5 Merge pull request #2698 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-18 17:24:22 +02:00
hellooo
ecfc29feb9 Translated using Weblate (Romanian)
Currently translated at 86.2% (288 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2025-09-18 14:02:01 +02:00
Edgars Andersons
84ce92cebc Translated using Weblate (Latvian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-09-18 10:02:04 +00:00
109247019824
489a2eb037 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-09-18 11:02:06 +02:00
B o d o
e48e0233bb Translated using Weblate (Spanish)
Currently translated at 99.1% (331 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-09-18 11:02:02 +02:00
B o d o
b67471df92 Translated using Weblate (Spanish (Argentina))
Currently translated at 70.9% (237 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2025-09-18 11:02:00 +02:00
大王叫我来巡山
be727462ee Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-09-18 10:02:00 +02:00
josé m
ed72b41527 Translated using Weblate (Galician)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-09-18 06:02:10 +00:00
solokot
309980836a Translated using Weblate (Russian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-09-18 06:02:01 +00:00
Yasin Tanış
fb3ab11700 Translated using Weblate (Turkish)
Currently translated at 87.7% (293 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-09-18 01:02:23 +02:00
Sylvia van Os
ccbcc8b736 Merge pull request #2696 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-17 23:32:46 +02:00
Bert Aarts
7fcfcf7bdb Translated using Weblate (Dutch)
Currently translated at 66.0% (99 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2025-09-17 21:02:44 +00:00
Bert Aarts
f7231a3ac5 Translated using Weblate (Dutch)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-09-17 21:02:43 +00:00
Kachelkaiser
c4ae77123d Translated using Weblate (German)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-17 21:02:43 +00:00
Sylvia van Os
81c6874aff Merge pull request #2694 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-17 21:21:19 +02:00
Максим Горпиніч
de05560297 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-09-17 21:02:29 +02:00
HostujePlik.PL
816a3b2f2c Translated using Weblate (Polish)
Currently translated at 91.0% (304 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-09-17 21:02:29 +02:00
Vasilis K
c8af3fe35e Translated using Weblate (Greek)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-09-17 21:02:29 +02:00
Sylvia van Os
f3448d06c1 Merge pull request #2693 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-17 20:19:54 +02:00
HostujePlik.PL
3442cf3a35 Translated using Weblate (Polish)
Currently translated at 91.0% (304 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-09-17 18:02:30 +00:00
PRATHAMESH BHAGAT
03115c0de1 Removing unnecessary lines in workflows files (#2692) 2025-09-17 18:55:37 +02:00
Sylvia van Os
9f5f7f0dd8 Merge pull request #2676 from CatimaLoyalty/gradlew-update-9.0.0
Update Gradle Wrapper from 8.14 to 9.0.0
2025-09-16 19:39:01 +02:00
PRATHAMESH BHAGAT
4901a6b183 Merge pull request #2687 from PrathameshBhagat/main
Making Github Actions file more readable
2025-09-16 18:24:32 +02:00
Sylvia van Os
f2372c40aa Merge pull request #2683 from CatimaLoyalty/fix/missingPositionalFormatting
Fix missing positional formatting
2025-09-16 18:22:51 +02:00
Sylvia van Os
3f1c0695b8 Merge pull request #2691 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-16 17:12:52 +02:00
Gideon
fd9991ceb1 Translated using Weblate (Dutch)
Currently translated at 63.3% (95 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2025-09-16 14:02:23 +02:00
Gideon
2628a9856b Translated using Weblate (Dutch)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-09-16 14:02:00 +02:00
Edgars Andersons
c1f3fae50b Translated using Weblate (Latvian)
Currently translated at 10.0% (15 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-09-16 07:02:30 +00:00
Edgars Andersons
2d5cd25696 Translated using Weblate (Latvian)
Currently translated at 94.0% (314 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-09-16 07:02:29 +00:00
Sylvia van Os
dc8b7d6ae4 Merge pull request #2690 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-16 08:18:43 +02:00
josé m
a2211947cd Translated using Weblate (Galician)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-09-16 08:02:28 +02:00
Sylvia van Os
db2617e2d4 Merge pull request #2689 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-15 22:58:24 +02:00
Giuseppe Piscitelli
412f48d801 Translated using Weblate (Italian)
Currently translated at 86.8% (290 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2025-09-15 20:02:01 +00:00
Hosted Weblate
bd7bf7ddbe Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2025-09-15 18:04:26 +00:00
Gideon
e7a99ad7b6 Translated using Weblate (Dutch)
Currently translated at 62.6% (94 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2025-09-15 18:04:26 +00:00
Gideon
8fce04cf45 Translated using Weblate (Dutch)
Currently translated at 99.4% (332 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-09-15 18:04:25 +00:00
Heimen Stoffels
62f2545f9e Translated using Weblate (Dutch)
Currently translated at 99.4% (332 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-09-15 18:04:24 +00:00
Sylvia van Os
d22e0bd5e5 Merge pull request #2686 from CatimaLoyalty/dependabot/github_actions/actions/checkout-5
Bump actions/checkout from 4 to 5
2025-09-15 19:23:00 +02:00
Sylvia van Os
61d206f318 Merge pull request #2685 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-15 18:55:23 +02:00
Álvaro Palacios
7bfef398c3 Translated using Weblate (Spanish)
Currently translated at 99.1% (331 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-09-15 14:02:01 +02:00
Vasilis K
2311acc15e Translated using Weblate (Greek)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-09-15 10:02:03 +02:00
Deleted User
14787cc520 Translated using Weblate (Greek)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-09-15 10:02:00 +02:00
Sylwester Cyba
7b57b603aa Translated using Weblate (Polish)
Currently translated at 89.2% (298 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-09-15 09:02:03 +02:00
Warder
185f6d1a5f Translated using Weblate (Slovak)
Currently translated at 89.8% (300 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-09-15 07:02:01 +02:00
dependabot[bot]
791cf7224e Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 02:05:54 +00:00
Vasilis K
8cab9a4204 Translated using Weblate (Greek)
Currently translated at 94.6% (316 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-09-14 21:02:22 +00:00
Deleted User
42a8efd5e5 Translated using Weblate (Greek)
Currently translated at 94.6% (316 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-09-14 21:02:21 +00:00
Sylvia van Os
85e171ae4a Merge pull request #2684 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-14 19:02:21 +02:00
Sylvia van Os
18d5438c38 Translated using Weblate (Portuguese)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-09-14 14:02:26 +02:00
Sylvia van Os
0f311d1901 Fix missing positional formatting 2025-09-14 13:46:50 +02:00
Sylvia van Os
5f33679ddd Merge pull request #2681 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-14 13:27:43 +02:00
Sylvia van Os
ce0fab5b38 Merge pull request #2682 from CatimaLoyalty/create-pull-request/patch-1757823583
Update contributors
2025-09-14 11:22:11 +02:00
B o d o
d6ba49add5 Translated using Weblate (Spanish)
Currently translated at 98.5% (329 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-09-14 09:02:05 +00:00
J. Lavoie
2dcb561882 Translated using Weblate (Spanish)
Currently translated at 98.5% (329 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-09-14 09:02:03 +00:00
B o d o
25153d98e7 Translated using Weblate (Spanish (Argentina))
Currently translated at 70.3% (235 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2025-09-14 09:02:02 +00:00
Brian Bentancour
ee90044a59 Translated using Weblate (Spanish (Argentina))
Currently translated at 70.3% (235 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2025-09-14 09:02:01 +00:00
Viviana Y
4a0a23a8f7 Translated using Weblate (Spanish (Argentina))
Currently translated at 70.3% (235 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2025-09-14 09:01:59 +00:00
TheLastProject
09d5b68baf Update contributors 2025-09-14 04:19:42 +00:00
Sylvain Pichon
402a5ef044 Translated using Weblate (French)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-13 23:02:01 +02:00
Naga
31fd642295 Translated using Weblate (French)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-13 23:02:00 +02:00
Thomas Bertels
68dc947c4c Translated using Weblate (French)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-13 23:01:59 +02:00
Максим Горпиніч
4daa00111b Translated using Weblate (Ukrainian)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-09-13 21:02:29 +02:00
Максим Горпиніч
b6e00fa096 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-09-13 21:02:03 +02:00
IllusiveMan196
3cf5910e62 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-09-13 21:02:00 +02:00
delvani
681d0744d4 Translated using Weblate (Portuguese)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-09-13 19:02:23 +02:00
Sylvia van Os
c19d6dd2f2 Merge pull request #2680 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-13 18:56:16 +02:00
delvani
35b81437f8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-09-13 18:44:43 +02:00
Bruno Fernandes
f1403e6fce Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-09-13 18:44:43 +02:00
Sylvain Pichon
7f12530b8e Translated using Weblate (French)
Currently translated at 94.3% (315 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-13 18:44:42 +02:00
Thomas Bertels
850209c00b Translated using Weblate (French)
Currently translated at 94.3% (315 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-13 18:44:42 +02:00
Sylvia van Os
72e7b8127a Merge pull request #2679 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-13 17:17:37 +02:00
Nataniel Dika Kurniawan
db2808fa94 Translated using Weblate (Indonesian)
Currently translated at 89.2% (298 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2025-09-13 16:03:11 +02:00
Fjuro
d9c3509bbc Translated using Weblate (Czech)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-09-13 16:03:10 +02:00
Sylvain Pichon
231b17d955 Translated using Weblate (French)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-09-13 16:03:10 +02:00
Sylvain Pichon
310a1266a5 Translated using Weblate (French)
Currently translated at 94.0% (314 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-13 16:03:09 +02:00
J. Lavoie
407e7293af Translated using Weblate (French)
Currently translated at 94.0% (314 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-13 16:03:08 +02:00
Fjuro
577ab84020 Translated using Weblate (Czech)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-09-13 16:03:08 +02:00
Slávek Banko
650cf559ba Translated using Weblate (Czech)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-09-13 16:03:07 +02:00
Jan Novotny
b3b53cd25a Translated using Weblate (Czech)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-09-13 16:03:07 +02:00
Sylvia van Os
160456d21c Merge pull request #2678 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-13 13:23:23 +02:00
B o d o
37b5ed2c24 Translated using Weblate (German)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-13 13:02:02 +02:00
B o d o
5c410d4817 Translated using Weblate (German)
Currently translated at 93.4% (312 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-13 10:02:41 +00:00
B o d o
940ba85e3d Translated using Weblate (German)
Currently translated at 93.1% (311 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-13 10:02:40 +00:00
B o d o
92508bdd2b Translated using Weblate (German)
Currently translated at 92.8% (310 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-13 10:02:39 +00:00
J. Lavoie
235cbce123 Translated using Weblate (German)
Currently translated at 92.8% (310 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-13 10:02:38 +00:00
Sylvia van Os
060cfa75bf Merge pull request #2677 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-13 11:14:08 +02:00
B o d o
329770576e Translated using Weblate (German)
Currently translated at 88.0% (294 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-13 11:02:22 +02:00
B o d o
4881212adb Translated using Weblate (German)
Currently translated at 87.7% (293 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-13 11:02:21 +02:00
Sylvia van Os
5b7ed3f4e5 Merge pull request #2675 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-13 10:50:50 +02:00
solokot
bdd6bc3923 Translated using Weblate (Russian)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-09-13 08:02:29 +00:00
solokot
1d5d5419dc Translated using Weblate (Russian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-09-13 08:02:01 +00:00
josé m
196051dc82 Translated using Weblate (Galician)
Currently translated at 96.1% (321 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-09-13 06:02:01 +02:00
gradle-update-robot
4962701224 Update Gradle Wrapper from 8.14 to 9.0.0
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2025-09-13 00:51:38 +00:00
大王叫我来巡山
a74c801977 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-09-13 02:02:36 +02:00
大王叫我来巡山
409f35719d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-09-13 02:02:11 +02:00
Deleted User
f761ae6c3e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-09-13 02:02:09 +02:00
109247019824
d56f1eb2a3 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-09-12 23:02:23 +02:00
Sylvia van Os
23907a558d Merge pull request #2674 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-12 22:31:21 +02:00
B o d o
6b77aff18f Translated using Weblate (German)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-09-12 22:03:09 +02:00
Sylvia van Os
b66383e9ab Release Catima 2.38.0 2025-09-12 20:58:31 +02:00
PRATHAMESH BHAGAT
863316d7b4 Merge pull request #2662 from PrathameshBhagat/main
Replace Gradle update checker
2025-09-12 20:48:47 +02:00
Sylvia van Os
33d5632b6d Merge pull request #2672 from CatimaLoyalty/create-pull-request/patch-1757607265
Update Fastlane changelogs
2025-09-11 19:57:20 +02:00
TheLastProject
67d8ae2d90 Update Fastlane changelogs 2025-09-11 16:14:24 +00:00
Sylvia van Os
c933b76a8c Update CHANGELOG 2025-09-11 18:14:12 +02:00
Sylvia van Os
9d12123f71 Merge pull request #2670 from CatimaLoyalty/fix/widgetIconCrash
Workaround widget crash by disabling images on Android 12L and below
2025-09-11 18:13:18 +02:00
Sylvia van Os
beff5e0aa4 Merge pull request #2671 from CatimaLoyalty/dependabot/gradle/org.jetbrains.kotlin.android-2.2.20
Bump org.jetbrains.kotlin.android from 2.2.10 to 2.2.20
2025-09-11 08:16:55 +02:00
dependabot[bot]
d61da3e499 Bump org.jetbrains.kotlin.android from 2.2.10 to 2.2.20
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>
2025-09-11 02:04:30 +00:00
Sylvia van Os
8419122193 Fix wrong SDK_INT 2025-09-10 23:24:36 +02:00
Sylvia van Os
20559d1506 Workaround widget crash by disabling images on Android 12L and below 2025-09-10 21:49:32 +02:00
Sylvia van Os
5e3de19e7b Merge pull request #2669 from CatimaLoyalty/fix/permissionIcon
Use monochrome icon for permission dialog
2025-09-10 20:38:14 +02:00
Sylvia van Os
2463599ba2 Use monochrome icon for permission dialog 2025-09-10 20:24:54 +02:00
jwkwshjsjsj
ea90d26a0a Minor string updates (#2638)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-09-10 20:12:43 +02:00
Sylvia van Os
8339de2596 Merge pull request #2668 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-10 17:21:03 +02:00
Hasan Berat Kaylan
e283d3abd8 Translated using Weblate (Turkish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-09-10 14:02:02 +00:00
Fjuro
b8980e3708 Translated using Weblate (Czech)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-09-10 13:02:45 +00:00
Edgars Andersons
2d306a2046 Translated using Weblate (Latvian)
Currently translated at 10.0% (15 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-09-10 12:02:10 +02:00
solokot
fe79e03fb3 Translated using Weblate (Russian)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-09-10 09:02:26 +00:00
B o d o
e938c29601 Translated using Weblate (German)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-09-10 10:05:25 +02:00
B o d o
45d76468dc Translated using Weblate (German)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-10 10:05:24 +02:00
Sylvia van Os
d8aab4f956 Merge pull request #2667 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-10 08:21:43 +02:00
Sylvain Pichon
7084420781 Translated using Weblate (French)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-09-10 08:04:06 +02:00
大王叫我来巡山
b4b90cdf48 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-09-10 07:02:53 +02:00
Максим Горпиніч
e899d902f7 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-09-10 07:02:35 +02:00
Milo Ivir
e04fead496 Translated using Weblate (Croatian)
Currently translated at 99.7% (333 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2025-09-09 23:02:00 +00:00
Kachelkaiser
4d5c4bfc6e Translated using Weblate (German)
Currently translated at 99.3% (149 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-09-09 22:02:50 +00:00
Sylvia van Os
6779693213 Merge pull request #2666 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-09 23:32:13 +02:00
Kachelkaiser
f2db558eaf Translated using Weblate (German)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-09 21:02:06 +00:00
Sylvia van Os
cecf0bf1bc Merge pull request #2665 from CatimaLoyalty/create-pull-request/patch-1757437148
Update Fastlane changelogs
2025-09-09 19:38:32 +02:00
TheLastProject
9110d3cc17 Update Fastlane changelogs 2025-09-09 16:59:07 +00:00
Sylvia van Os
032380e872 Update CHANGELOG 2025-09-09 18:58:55 +02:00
Sylvia van Os
53ea1741c0 Merge pull request #2657 from CatimaLoyalty/fix/removeStocardImport
Remove Stocard importer
2025-09-09 18:58:12 +02:00
Sylvia van Os
51e75f61ec Merge pull request #2664 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-09 17:02:29 +02:00
Dika
a590e6dca1 Translated using Weblate (Indonesian)
Currently translated at 99.4% (334 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2025-09-09 12:02:09 +02:00
Sylvia van Os
e25128947c Merge pull request #2663 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-09 08:19:44 +02:00
josé m
da6c81595c Translated using Weblate (Galician)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-09-09 04:02:07 +00:00
Sylvia van Os
1fc5a1e04a Remove Stocard importer
Stocard no longer exists as a company and these import files are no
longer generated
2025-09-08 19:55:10 +02:00
Sylvia van Os
faa5946c15 Merge pull request #2661 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-08 19:39:59 +02:00
Edgars Andersons
d35911724c Translated using Weblate (Latvian)
Currently translated at 10.0% (15 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-09-08 11:02:12 +02:00
Edgars Andersons
2acd9d87f4 Translated using Weblate (Latvian)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-09-08 08:02:09 +00:00
Sylvia van Os
43c2e3e78a Merge pull request #2660 from CatimaLoyalty/dependabot/github_actions/actions/setup-python-6.0.0
Bump actions/setup-python from 5.6.0 to 6.0.0
2025-09-08 06:57:47 +02:00
dependabot[bot]
1ea3dc77f0 Bump actions/setup-python from 5.6.0 to 6.0.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.6.0 to 6.0.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.6.0...v6.0.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 02:06:00 +00:00
Sylvia van Os
eeb27dc169 Merge pull request #2659 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-07 22:14:15 +02:00
Fjuro
7cc09e4a0d Translated using Weblate (Czech)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-09-07 20:02:28 +00:00
Sylvia van Os
8ca0bcd97c Merge pull request #2658 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-07 21:20:38 +02:00
Fjuro
8bfdef6f9c Translated using Weblate (Czech)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-09-07 19:02:15 +00:00
Sylvia van Os
e7155a55bd Merge pull request #2656 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-07 15:00:24 +02:00
ssantos
0405a96710 Translated using Weblate (Portuguese)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-09-07 12:04:47 +00:00
Priit Jõerüüt
a4a988393c Translated using Weblate (Estonian)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-09-07 12:04:47 +00:00
delvani
155d732ec7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-09-07 12:04:46 +00:00
ssantos
c07eefd48f Translated using Weblate (Portuguese)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-09-07 12:04:45 +00:00
ssantos
edf4a67590 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-09-07 12:04:45 +00:00
ssantos
442072641a Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-09-07 12:04:44 +00:00
109247019824
7719ece810 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-09-07 12:04:44 +00:00
大王叫我来巡山
6de0473582 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-09-07 12:04:43 +00:00
大王叫我来巡山
4da1d3d1c3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-09-07 12:04:42 +00:00
Warder
4a70c1f6c9 Translated using Weblate (Slovak)
Currently translated at 98.6% (148 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-09-07 12:04:42 +00:00
Максим Горпиніч
873d7e3cd1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-09-07 12:04:41 +00:00
solokot
fce8f6cdb9 Translated using Weblate (Russian)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-09-07 12:04:41 +00:00
B o d o
207781fa58 Translated using Weblate (German)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-09-07 12:04:40 +00:00
Sylvain Pichon
3aae958a1b Translated using Weblate (French)
Currently translated at 100.0% (150 of 150 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-09-07 12:04:39 +00:00
Максим Горпиніч
65b699564e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-09-07 12:04:39 +00:00
Warder
acf7314f6c Translated using Weblate (Slovak)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-09-07 12:04:38 +00:00
solokot
8b394cc644 Translated using Weblate (Russian)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-09-07 12:04:37 +00:00
mateale1234
a1385be797 Translated using Weblate (Polish)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-09-07 12:04:37 +00:00
Sylvain Pichon
cf9249b97e Translated using Weblate (French)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-09-07 12:04:36 +00:00
Vasilis K
91f953915d Translated using Weblate (Greek)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-09-07 12:04:35 +00:00
B o d o
f6263e6cf5 Translated using Weblate (German)
Currently translated at 100.0% (336 of 336 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-09-07 12:04:35 +00:00
Sylvia van Os
e48ff4d6a3 Merge pull request #2644 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.16
Bump org.robolectric:robolectric from 4.15.1 to 4.16
2025-09-06 13:51:22 +02:00
dependabot[bot]
a93ee35c9b Bump org.robolectric:robolectric from 4.15.1 to 4.16
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.15.1 to 4.16.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.15.1...robolectric-4.16)

---
updated-dependencies:
- dependency-name: org.robolectric:robolectric
  dependency-version: '4.16'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 11:33:33 +00:00
Sylvia van Os
6b561d00f3 Merge pull request #2655 from CatimaLoyalty/create-pull-request/patch-1757156668
Update Fastlane changelogs
2025-09-06 13:04:55 +02:00
TheLastProject
ffd9b9c097 Update Fastlane changelogs 2025-09-06 11:04:28 +00:00
Sylvia van Os
4b4d7f537d Update CHANGELOG 2025-09-06 13:04:16 +02:00
Sylvia van Os
58bad96b2e Merge pull request #2654 from CatimaLoyalty/feature/pkpasses
Add support for .pkpasses
2025-09-06 13:03:20 +02:00
Sylvia van Os
67701840bb Add support for .pkpasses 2025-09-06 12:49:50 +02:00
Sylvia van Os
d936209b0e Merge pull request #2652 from CatimaLoyalty/dependabot/gradle/com.google.android.material-material-1.13.0
Bump com.google.android.material:material from 1.12.0 to 1.13.0
2025-09-04 20:01:46 +02:00
dependabot[bot]
14f7116aad Bump com.google.android.material:material from 1.12.0 to 1.13.0
Bumps [com.google.android.material:material](https://github.com/material-components/material-components-android) from 1.12.0 to 1.13.0.
- [Release notes](https://github.com/material-components/material-components-android/releases)
- [Commits](https://github.com/material-components/material-components-android/compare/1.12.0...1.13.0)

---
updated-dependencies:
- dependency-name: com.google.android.material:material
  dependency-version: 1.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-04 10:17:41 +00:00
Sylvia van Os
132844f6ce Merge pull request #2651 from CatimaLoyalty/dependabot/gradle/com.android.application-8.13.0
Bump com.android.application from 8.12.2 to 8.13.0
2025-09-03 23:56:18 +02:00
dependabot[bot]
a50789a7e9 Bump com.android.application from 8.12.2 to 8.13.0
Bumps com.android.application from 8.12.2 to 8.13.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-03 21:21:21 +00:00
Sylvia van Os
513e3d97f6 Merge pull request #2650 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-09-01 19:27:01 +02:00
Niko
58f1944268 Translated using Weblate (Serbian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sr/
2025-08-31 21:02:26 +02:00
Damjan Gerl
aa75c22328 Translated using Weblate (Slovenian)
Currently translated at 26.8% (40 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2025-08-31 21:02:26 +02:00
Damjan Gerl
3b72ada8d0 Translated using Weblate (Slovenian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2025-08-31 21:02:25 +02:00
Sylvia van Os
a65131bdf6 Merge pull request #2648 from CatimaLoyalty/create-pull-request/patch-1756613947
Update contributors
2025-08-31 11:08:03 +02:00
TheLastProject
b9622d3da9 Update contributors 2025-08-31 04:19:06 +00:00
Sylvia van Os
234bb86d7e Merge pull request #2646 from CatimaLoyalty/dependabot/gradle/com.android.application-8.12.2
Bump com.android.application from 8.12.1 to 8.12.2
2025-08-29 08:25:23 +02:00
dependabot[bot]
b6243a1f2f Bump com.android.application from 8.12.1 to 8.12.2
Bumps com.android.application from 8.12.1 to 8.12.2.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-29 02:03:33 +00:00
Sylvia van Os
5f01eef75a Merge pull request #2643 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-26 18:10:17 +02:00
ssantos
9c43752134 Translated using Weblate (Portuguese)
Currently translated at 100.0% (149 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-08-26 02:03:51 +00:00
ssantos
e7d965576f Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (149 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-08-26 02:03:50 +00:00
大王叫我来巡山
2111357c7d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (149 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-08-26 02:03:50 +00:00
Sylvia van Os
37c7f88f82 Merge pull request #2641 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-25 07:21:18 +02:00
Robin Syl
15b466c9a6 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/zh_Hant/
2025-08-24 23:03:06 +02:00
Robin Syl
42a0e5abd8 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 85.9% (128 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2025-08-24 23:03:05 +02:00
Robin Syl
feb217f1ba Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2025-08-24 23:03:04 +02:00
Sylvia van Os
c5e56ca27d Merge pull request #2633 from CatimaLoyalty/create-pull-request/patch-1756009535
Update contributors
2025-08-24 09:18:28 +02:00
TheLastProject
6ccfdaef83 Update contributors 2025-08-24 04:25:35 +00:00
Sylvia van Os
081c0b8507 Merge pull request #2632 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-23 19:21:20 +02:00
Fjuro
351ee7caed Translated using Weblate (Czech)
Currently translated at 100.0% (149 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-08-23 17:04:17 +00:00
Максим Горпиніч
7fb3c73877 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (149 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-08-23 17:04:16 +00:00
solokot
b1102fbcc0 Translated using Weblate (Russian)
Currently translated at 100.0% (149 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-08-23 17:04:15 +00:00
B o d o
b9a5032b15 Translated using Weblate (German)
Currently translated at 100.0% (149 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-08-23 17:04:15 +00:00
Sylvain Pichon
d6e52e17ee Translated using Weblate (French)
Currently translated at 100.0% (149 of 149 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-08-23 17:04:14 +00:00
Sylvia van Os
fc25082a9a Release Catima 2.37.0 2025-08-22 18:18:42 +02:00
Sylvia van Os
7625d783f3 Merge pull request #2630 from CatimaLoyalty/create-pull-request/patch-1755877734
Update feature graphic
2025-08-22 18:15:19 +02:00
TheLastProject
f61c9adf61 Update feature graphic 2025-08-22 15:48:53 +00:00
Sylvia van Os
cba8d637f5 Merge pull request #2628 from il-Luca/main
Fix for minor issues with feature graphic generation
2025-08-22 17:46:35 +02:00
Sylvia van Os
79853e597b Add Aeven-Dev as logo contributor 2025-08-22 17:38:09 +02:00
il-Luca
dd69182347 Update generate_feature_graphic.sh 2025-08-22 13:14:37 +02:00
il-Luca
e5fb836131 Update featureGraphic.svg 2025-08-22 12:45:58 +02:00
Sylvia van Os
2026c4e171 Merge pull request #2626 from CatimaLoyalty/create-pull-request/patch-1755812967
Update Fastlane changelogs
2025-08-21 23:50:31 +02:00
TheLastProject
ac8e89d65f Update Fastlane changelogs 2025-08-21 21:49:26 +00:00
Sylvia van Os
2f97628c52 Update CHANGELOG 2025-08-21 23:49:17 +02:00
Sylvia van Os
59d373aa74 Merge pull request #2625 from CatimaLoyalty/create-pull-request/patch-1755812511
Update feature graphic
2025-08-21 23:47:04 +02:00
TheLastProject
742e8799f1 Update feature graphic 2025-08-21 21:41:50 +00:00
Sylvia van Os
bbbda9bd1d Merge pull request #2624 from CatimaLoyalty/feature/new_icon
New Catima logo and feature graphic
2025-08-21 23:38:54 +02:00
il-Luca
8ad1f044fd New Catima logo and feature graphic
- Updated app icon assets (mipmaps & VectorDrawables)
- Updated feature graphic SVG (updated icon, changed fonts to match the new icon style)
- Updated feature graphic script (to account for the changed fonts)
- Created .design folder containing master design files
- Deleted old logo and fonts
2025-08-21 22:26:15 +02:00
Sylvia van Os
59d6c047ed Delete bors.toml
Stopped using bors years ago
2025-08-20 18:25:38 +02:00
Sylvia van Os
bccba88ad0 Merge pull request #2620 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-20 18:09:18 +02:00
Hosted Weblate
c6486e4f25 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/
2025-08-20 12:02:19 +00:00
Sylvia van Os
047f9df218 Translated using Weblate (Kannada)
Currently translated at 33.5% (112 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/kn/
2025-08-20 12:02:18 +00:00
Joel A
e8ab75ec77 Translated using Weblate (Swedish)
Currently translated at 96.1% (321 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-08-20 12:02:17 +00:00
Sylvia van Os
a1bd671ed4 Merge pull request #2618 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-19 18:10:13 +02:00
Sylvia van Os
a458065e4f Merge pull request #2619 from CatimaLoyalty/dependabot/gradle/com.android.application-8.12.1
Bump com.android.application from 8.12.0 to 8.12.1
2025-08-19 17:19:23 +02:00
dependabot[bot]
1e48191431 Bump com.android.application from 8.12.0 to 8.12.1
Bumps com.android.application from 8.12.0 to 8.12.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-19 12:41:03 +00:00
Shiva
b05432446f Translated using Weblate (Kannada)
Currently translated at 34.1% (114 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/kn/
2025-08-19 13:04:03 +02:00
tomek7667
9449639014 Translated using Weblate (Polish)
Currently translated at 97.9% (145 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2025-08-19 13:04:02 +02:00
tomek7667
fe1d53b2ee Translated using Weblate (Polish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-08-19 13:04:00 +02:00
Sylvia van Os
62f6d17e43 Merge pull request #2616 from CatimaLoyalty/create-pull-request/patch-1755451248
Update feature graphic
2025-08-18 19:30:56 +02:00
Sylvia van Os
a3d96a6dcf Merge pull request #2617 from CatimaLoyalty/dependabot/github_actions/actions/checkout-5.0.0
Bump actions/checkout from 4.2.2 to 5.0.0
2025-08-18 07:05:39 +02:00
dependabot[bot]
c5df55d5ae Bump actions/checkout from 4.2.2 to 5.0.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.2 to 5.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4.2.2...v5.0.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 04:18:50 +00:00
TheLastProject
447433f865 Update feature graphic 2025-08-17 17:20:48 +00:00
Sylvia van Os
bb1f5c979e Merge pull request #2615 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-17 19:19:10 +02:00
Kolappan N
d258c9bd47 Translated using Weblate (Tamil)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/ta/
2025-08-17 15:02:26 +02:00
Kolappan N
156ad3d60d Translated using Weblate (Tamil)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2025-08-17 15:02:25 +02:00
Amit Yefet
2a632f47f8 Translated using Weblate (Hebrew (Israel))
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/he_IL/
2025-08-17 15:02:24 +02:00
Amit Yefet
c660267aed Translated using Weblate (Hebrew (Israel))
Currently translated at 2.0% (3 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/he_IL/
2025-08-17 15:02:22 +02:00
mrMonos
22fede920f Translated using Weblate (Polish)
Currently translated at 99.7% (333 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-08-17 15:02:21 +02:00
Sylvia van Os
89f730b23a Merge pull request #2614 from CatimaLoyalty/create-pull-request/patch-1755405024
Update contributors
2025-08-17 09:26:54 +02:00
TheLastProject
c67b1b9fe4 Update contributors 2025-08-17 04:30:24 +00:00
Sylvia van Os
2b931f68fe Merge pull request #2613 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-16 19:04:59 +02:00
Joel A
884b84effc Translated using Weblate (Swedish)
Currently translated at 5.4% (8 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2025-08-16 07:02:39 +00:00
Joel A
54d41285fd Translated using Weblate (Swedish)
Currently translated at 95.5% (319 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-08-16 07:02:38 +00:00
novrian
12f8f258b6 Translated using Weblate (Indonesian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2025-08-16 07:02:37 +00:00
Sofia
1deb094ca8 Translated using Weblate (Spanish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-08-16 07:02:37 +00:00
Sofia
b6910dc03a Translated using Weblate (Spanish (Argentina))
Currently translated at 71.5% (239 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2025-08-16 07:02:36 +00:00
Sylvia van Os
b50b367058 Merge pull request #2612 from CatimaLoyalty/dependabot/gradle/org.jetbrains.kotlin.android-2.2.10
Bump org.jetbrains.kotlin.android from 2.2.0 to 2.2.10
2025-08-15 08:15:42 +02:00
dependabot[bot]
983026d313 Bump org.jetbrains.kotlin.android from 2.2.0 to 2.2.10
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>
2025-08-15 02:41:53 +00:00
Sylvia van Os
a471fa36c8 Merge pull request #2609 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-11 17:02:45 +02:00
Thong Nguyen
e0eebb665b Translated using Weblate (Vietnamese)
Currently translated at 99.7% (333 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2025-08-11 07:02:49 +00:00
Land
a8ab204036 Translated using Weblate (Malayalam)
Currently translated at 27.2% (91 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ml/
2025-08-11 07:02:49 +00:00
Nishkarsh Yadav
11e821a074 Translated using Weblate (Hindi)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2025-08-11 07:02:48 +00:00
Nishkarsh Yadav
19aaa80b7f Translated using Weblate (Hindi)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2025-08-11 07:02:47 +00:00
Sylvia van Os
241591db0f Merge pull request #2607 from CatimaLoyalty/create-pull-request/patch-1754800744
Update contributors
2025-08-10 11:58:17 +02:00
TheLastProject
058b822a52 Update contributors 2025-08-10 04:39:04 +00:00
Sylvia van Os
d21a53dbf0 Merge pull request #2606 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-09 18:41:50 +02:00
Joel A
511f9e25b8 Translated using Weblate (Swedish)
Currently translated at 93.7% (313 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-08-09 16:02:12 +00:00
Sylvia van Os
bed1b11384 Merge pull request #2605 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-08 16:57:05 +02:00
Andrzej Stachera
d16350351f Translated using Weblate (Polish)
Currently translated at 99.7% (333 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-08-08 14:01:57 +00:00
Sylvia van Os
a7d47477d1 Merge pull request #2603 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-06 18:33:29 +02:00
Warder
8cd33189fa Translated using Weblate (Slovak)
Currently translated at 98.6% (146 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-08-06 18:03:07 +02:00
Sylvia van Os
0af7ced380 Translated using Weblate (Dutch)
Currently translated at 61.4% (91 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2025-08-06 18:03:07 +02:00
Sylvia van Os
a514f285f7 Release Catima 2.36.0 2025-08-05 18:10:57 +02:00
Sylvia van Os
5634df1f5a Merge pull request #2601 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-05 18:09:02 +02:00
delvani
f2b46310de Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-08-05 17:49:05 +02:00
Edgars Andersons
a646717277 Translated using Weblate (Latvian)
Currently translated at 9.4% (14 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-08-05 17:49:05 +02:00
Edgars Andersons
63e992be5c Translated using Weblate (Latvian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-08-05 17:49:04 +02:00
Sylvia van Os
98a574f223 Translated using Weblate (Dutch)
Currently translated at 59.4% (88 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2025-08-05 17:49:04 +02:00
Sylvia van Os
6dfbcc3577 Translated using Weblate (Dutch)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-08-05 17:49:03 +02:00
Sylvia van Os
4c00c8b94d Merge pull request #2599 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-03 20:49:25 +02:00
Ömer
cde3dd8ecf Translated using Weblate (Turkish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-08-03 18:02:29 +00:00
Giovanni Donisi
e22ad2c4a8 Translated using Weblate (Italian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2025-08-03 18:02:28 +00:00
Sylvia van Os
62aeadae71 Merge pull request #2598 from CatimaLoyalty/create-pull-request/patch-1754196371
Update contributors
2025-08-03 10:24:36 +02:00
TheLastProject
7e89db428b Update contributors 2025-08-03 04:46:11 +00:00
Sylvia van Os
50e13c22c6 Merge pull request #2597 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-02 17:33:07 +02:00
ssantos
7e323dc342 Translated using Weblate (Portuguese)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-08-02 17:08:20 +02:00
josé m
c0cd051831 Translated using Weblate (Galician)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-08-02 17:08:20 +02:00
Priit Jõerüüt
b1b97c8972 Translated using Weblate (Estonian)
Currently translated at 11.4% (17 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/et/
2025-08-02 17:08:19 +02:00
Priit Jõerüüt
256687ecdb Translated using Weblate (Estonian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-08-02 17:08:18 +02:00
ssantos
9829cc3100 Translated using Weblate (Portuguese)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-08-02 17:08:18 +02:00
ssantos
2aa8be2642 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-08-02 17:08:17 +02:00
ssantos
75a6482c0e Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-08-02 17:08:16 +02:00
109247019824
14e953db4c Translated using Weblate (Bulgarian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-08-02 17:08:16 +02:00
Ricky Tigg
60e3c864c8 Translated using Weblate (Finnish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2025-08-02 17:08:15 +02:00
大王叫我来巡山
87ca4a5dd3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-08-02 17:08:14 +02:00
大王叫我来巡山
a70671cf0b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-08-02 17:08:14 +02:00
Warder
67d7ea4ca2 Translated using Weblate (Slovak)
Currently translated at 98.6% (146 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-08-02 17:08:13 +02:00
Fjuro
53f58940dd Translated using Weblate (Czech)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-08-02 17:08:13 +02:00
Максим Горпиніч
f2639612f0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-08-02 17:08:12 +02:00
solokot
d29344af73 Translated using Weblate (Russian)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-08-02 17:08:12 +02:00
Kachelkaiser
32635bdc9a Translated using Weblate (German)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-08-02 17:08:11 +02:00
Sylvain Pichon
8457cc06d2 Translated using Weblate (French)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-08-02 17:08:10 +02:00
Максим Горпиніч
a8316769a1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-08-02 17:08:10 +02:00
Warder
2f6bae7333 Translated using Weblate (Slovak)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-08-02 17:08:09 +02:00
solokot
e951402049 Translated using Weblate (Russian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-08-02 17:08:08 +02:00
Sylvain Pichon
4d5e3043ff Translated using Weblate (French)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-08-02 17:08:08 +02:00
Vasilis K
d57f528165 Translated using Weblate (Greek)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-08-02 17:08:07 +02:00
Kachelkaiser
14e84e5e0f Translated using Weblate (German)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-08-02 17:08:07 +02:00
Fjuro
fe79d3e866 Translated using Weblate (Czech)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-08-02 17:08:06 +02:00
Sylvia van Os
88369ea070 Merge pull request #2596 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-01 17:18:04 +02:00
Warder
944e83e480 Translated using Weblate (Slovak)
Currently translated at 98.6% (146 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-08-01 16:53:47 +02:00
Sylvia van Os
8bb15bcb57 Merge pull request #2593 from CatimaLoyalty/dependabot/gradle/com.android.application-8.12.0
Bump com.android.application from 8.11.1 to 8.12.0
2025-08-01 08:16:33 +02:00
dependabot[bot]
cb6358892b Bump com.android.application from 8.11.1 to 8.12.0
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>
2025-08-01 02:06:11 +00:00
Sylvia van Os
9956f6de34 Merge pull request #2592 from CatimaLoyalty/create-pull-request/patch-1753994193
Update Fastlane changelogs
2025-07-31 22:38:06 +02:00
TheLastProject
893bd551e0 Update Fastlane changelogs 2025-07-31 20:36:32 +00:00
Sylvia van Os
5c67459330 Update CHANGELOG 2025-07-31 22:36:20 +02:00
Sylvia van Os
e2988ec29a Merge pull request #2566 from realwk/widget
Widget with all cards
2025-07-31 22:35:44 +02:00
Sylvia van Os
2c96b11725 Various widget bugfixes
Widget now updates on sorting order change and no cards is correctly
detected
2025-07-31 21:50:59 +02:00
Sylvia van Os
0d52a49e8b Merge pull request #2591 from CatimaLoyalty/dependabot/gradle/androidx.test.ext-junit-1.3.0
Bump androidx.test.ext:junit from 1.2.1 to 1.3.0
2025-07-31 08:46:53 +02:00
dependabot[bot]
504ab7f148 Bump androidx.test.ext:junit from 1.2.1 to 1.3.0
Bumps androidx.test.ext:junit from 1.2.1 to 1.3.0.

---
updated-dependencies:
- dependency-name: androidx.test.ext:junit
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-31 06:23:18 +00:00
Sylvia van Os
d75f228632 Merge pull request #2590 from CatimaLoyalty/dependabot/gradle/androidx.test.espresso-espresso-core-3.7.0
Bump androidx.test.espresso:espresso-core from 3.6.1 to 3.7.0
2025-07-31 08:22:07 +02:00
Sylvia van Os
410f0f2a6f Merge pull request #2588 from CatimaLoyalty/dependabot/gradle/androidXTestVersion-1.7.0
Bump androidXTestVersion from 1.6.1 to 1.7.0
2025-07-31 08:16:15 +02:00
dependabot[bot]
c4672d282c Bump androidx.test.espresso:espresso-core from 3.6.1 to 3.7.0
Bumps androidx.test.espresso:espresso-core from 3.6.1 to 3.7.0.

---
updated-dependencies:
- dependency-name: androidx.test.espresso:espresso-core
  dependency-version: 3.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-31 02:06:24 +00:00
dependabot[bot]
9297fee839 Bump androidXTestVersion from 1.6.1 to 1.7.0
Bumps `androidXTestVersion` from 1.6.1 to 1.7.0.

Updates `androidx.test:core` from 1.6.1 to 1.7.0

Updates `androidx.test:runner` from 1.6.1 to 1.7.0

---
updated-dependencies:
- dependency-name: androidx.test:core
  dependency-version: 1.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: androidx.test:runner
  dependency-version: 1.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-31 02:06:07 +00:00
Sylvia van Os
acc72c0937 Rename from CatimaWidget to ListWidget
This makes the codebase easier to understand if we get more widget types
in the future
2025-07-30 21:23:14 +02:00
Sylvia van Os
54c27f7038 Refactor widget to be the same size as regular cards
This isn't as automatic as I would've liked, but with some manual
trial-and-error I think this works well enough in keeping the aspect
ratio while somewhat "scaling" based on size (at least the number of
columns are scaled)
2025-07-30 21:23:14 +02:00
Sylvia van Os
7277ff26fc Refactor deprecated widget code
This replaces the deprecated widget method with the new one and ensures
it consistently updates on changes.
2025-07-30 21:23:14 +02:00
realwk
9a0149def8 Initial widget work
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-07-30 21:23:14 +02:00
Sylvia van Os
e217e99864 Merge pull request #2587 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-29 20:17:46 +02:00
Lilith Maria
9674af3bae Translated using Weblate (Lithuanian)
Currently translated at 4.0% (6 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lt/
2025-07-29 19:10:30 +02:00
Sylvia van Os
a2b85dd37a Merge pull request #2585 from StellarSand/mainfork
Migrate 2 actvities to kotlin
2025-07-29 18:15:01 +02:00
Sylvia van Os
220fe96268 Merge pull request #2586 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-28 18:45:19 +02:00
ssantos
917b6cfb7d Translated using Weblate (Portuguese)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-07-28 18:22:47 +02:00
ssantos
0b687e1788 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-07-28 18:22:46 +02:00
Edgars Andersons
b35fa810ef Translated using Weblate (Latvian)
Currently translated at 9.4% (14 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-07-28 18:22:45 +02:00
大王叫我来巡山
0d1e10d064 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-07-28 18:22:45 +02:00
StellarSand
96359e5942 minor changes 2025-07-28 04:03:06 +05:30
StellarSand
bf63390f65 convert BarcodeSelectorActivity to kotlin 2025-07-28 02:47:58 +05:30
StellarSand
6f54981333 Rename .java to .kt 2025-07-28 02:47:58 +05:30
StellarSand
aed145239b convert CardShortcutConfigure to kotlin 2025-07-28 02:47:44 +05:30
StellarSand
99a8c917b9 Rename .java to .kt 2025-07-28 02:47:44 +05:30
Sylvia van Os
ef39f30fd7 Merge pull request #2584 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-27 15:37:11 +02:00
Reptalica
24e996e1a9 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2025-07-27 12:07:40 +00:00
Fjuro
4178dce4e2 Translated using Weblate (Czech)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-07-27 12:07:38 +00:00
Максим Горпиніч
514eaae616 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-07-27 12:07:23 +00:00
solokot
5692251668 Translated using Weblate (Russian)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-07-27 12:07:07 +00:00
B o d o
6208dd3fd9 Translated using Weblate (German)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-07-27 12:06:52 +00:00
Sylvain Pichon
85288a3658 Translated using Weblate (French)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-07-27 12:06:36 +00:00
Sylvia van Os
bae7e676b4 Merge pull request #2581 from CatimaLoyalty/create-pull-request/patch-1753466727
Update Fastlane changelogs
2025-07-25 20:05:51 +02:00
TheLastProject
6ae7491a18 Update Fastlane changelogs 2025-07-25 18:05:26 +00:00
Sylvia van Os
e5de694711 Update CHANGELOG 2025-07-25 20:05:13 +02:00
StellarSand
996cd2cd2c Proper fix for FAB being hidden by keyboard (#2579) 2025-07-25 20:04:24 +02:00
Sylvia van Os
8f6bd8c266 Merge pull request #2578 from CatimaLoyalty/create-pull-request/patch-1753131181
Update Fastlane changelogs
2025-07-21 23:20:23 +02:00
TheLastProject
599d58e3c7 Update Fastlane changelogs 2025-07-21 20:53:01 +00:00
Sylvia van Os
1dd58bf2d0 Update CHANGELOG 2025-07-21 22:52:49 +02:00
Sylvia van Os
90cf3adc25 Merge pull request #2573 from StellarSand/main
Fix for save button being covered by keyboard
2025-07-21 22:45:55 +02:00
Sylvia van Os
26797addb8 Merge pull request #2577 from CatimaLoyalty/create-pull-request/patch-1752986452
Update contributors
2025-07-20 09:59:27 +02:00
TheLastProject
b320e6f253 Update contributors 2025-07-20 04:40:52 +00:00
Sylvia van Os
48d9ac4eed Merge pull request #2575 from CatimaLoyalty/create-pull-request/patch-1752820497
Update feature graphic
2025-07-18 17:42:17 +02:00
TheLastProject
388eb273e4 Update feature graphic 2025-07-18 06:34:57 +00:00
Sylvia van Os
0eee713712 Merge pull request #2574 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-18 08:32:14 +02:00
Hosted Weblate
3ff1262149 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/
2025-07-18 05:04:31 +02:00
Mujtaba-Alsaleh
f4a420b699 Translated using Weblate (Arabic)
Currently translated at 44.8% (66 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2025-07-18 05:04:31 +02:00
Mujtaba-Alsaleh
b35b0cf1f9 Translated using Weblate (Arabic)
Currently translated at 44.8% (66 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2025-07-18 05:04:30 +02:00
Mujtaba-Alsaleh
2f4ee75c85 Translated using Weblate (Arabic)
Currently translated at 44.8% (66 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2025-07-18 05:04:30 +02:00
StellarSand
b3356b6575 close keypad if open on back pressed 2025-07-18 02:24:26 +05:30
Sylvia van Os
359a37c8a6 Remove gradle updater
Has been broken for several months, mailing me daily about failed runs. Needs replacing. See https://github.com/CatimaLoyalty/Android/issues/2525
2025-07-11 08:55:04 +02:00
Sylvia van Os
a5a57fe8c8 Merge pull request #2571 from CatimaLoyalty/dependabot/gradle/com.android.application-8.11.1
Bump com.android.application from 8.11.0 to 8.11.1
2025-07-11 07:57:50 +02:00
dependabot[bot]
c1f088c191 Bump com.android.application from 8.11.0 to 8.11.1
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>
2025-07-11 02:39:37 +00:00
Sylvia van Os
fec8d05927 Merge pull request #2570 from CatimaLoyalty/create-pull-request/patch-1751776272
Update contributors
2025-07-06 07:13:23 +02:00
TheLastProject
466f068e36 Update contributors 2025-07-06 04:31:11 +00:00
Sylvia van Os
b5880223a5 Merge pull request #2569 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-05 08:46:07 +02:00
toposets
0a8a621fad Translated using Weblate (Indonesian)
Currently translated at 99.6% (331 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2025-07-05 07:01:56 +02:00
Cristian Carpo
5267607b79 Translated using Weblate (Romanian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2025-07-05 07:01:56 +02:00
Sylvia van Os
5474a516f4 Merge pull request #2567 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-01 23:38:33 +02:00
ssantos
221b8cd7d1 Translated using Weblate (Portuguese)
Currently translated at 100.0% (147 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-07-01 21:37:30 +02:00
ssantos
2b544a74bd Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (147 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-07-01 21:37:30 +02:00
Yash R. Dhake
bcb7df24ec Optimize resizeBitmap(): Skip resizing for already-small images (#2565)
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-06-29 21:24:12 +02:00
Sylvia van Os
59fb95a4a7 Merge pull request #2563 from CatimaLoyalty/create-pull-request/patch-1751171603
Update contributors
2025-06-29 08:11:57 +02:00
TheLastProject
157617fe4a Update contributors 2025-06-29 04:33:23 +00:00
Sylvia van Os
ecdfeee3e6 Merge pull request #2562 from CatimaLoyalty/dependabot/gradle/com.android.application-8.11.0
Bump com.android.application from 8.10.1 to 8.11.0
2025-06-25 07:03:13 +02:00
dependabot[bot]
3cd3a53268 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>
2025-06-25 02:14:37 +00:00
Sylvia van Os
9edf3c3028 Merge pull request #2561 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-24 08:17:13 +02:00
Sylvia van Os
82d8addafa Merge pull request #2560 from CatimaLoyalty/dependabot/gradle/org.jetbrains.kotlin.android-2.2.0
Bump org.jetbrains.kotlin.android from 2.1.21 to 2.2.0
2025-06-24 08:13:11 +02:00
Warder
3b446145b8 Translated using Weblate (Slovak)
Currently translated at 98.6% (145 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-06-24 07:02:19 +02:00
dependabot[bot]
92fec8558e Bump org.jetbrains.kotlin.android from 2.1.21 to 2.2.0
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>
2025-06-24 03:07:37 +00:00
Sylvia van Os
df858a7d65 Merge pull request #2559 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.15.1
Bump org.robolectric:robolectric from 4.15 to 4.15.1
2025-06-23 07:05:58 +02:00
dependabot[bot]
a4c0c51a45 Bump org.robolectric:robolectric from 4.15 to 4.15.1
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.15 to 4.15.1.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.15...robolectric-4.15.1)

---
updated-dependencies:
- dependency-name: org.robolectric:robolectric
  dependency-version: 4.15.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-23 03:13:01 +00:00
Sylvia van Os
33d4b3ab7c Merge pull request #2558 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-22 23:20:41 +02:00
solokot
06dc720108 Translated using Weblate (Russian)
Currently translated at 100.0% (147 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-06-22 21:02:23 +02:00
Sylvia van Os
a24805232c Merge pull request #2557 from CatimaLoyalty/create-pull-request/patch-1750566607
Update contributors
2025-06-22 10:03:50 +02:00
TheLastProject
5ec1bcb721 Update contributors 2025-06-22 04:30:07 +00:00
Sylvia van Os
cddc273333 Merge pull request #2556 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-21 16:23:36 +02:00
大王叫我来巡山
0bd46b96cb Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (147 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-06-21 15:03:44 +02:00
Fjuro
2b6926c800 Translated using Weblate (Czech)
Currently translated at 100.0% (147 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-06-21 15:03:43 +02:00
Максим Горпиніч
ceb6bb8328 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (147 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-06-21 15:03:42 +02:00
Michael Moroni
8fd88e29ec Translated using Weblate (Italian)
Currently translated at 85.0% (125 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2025-06-21 15:03:42 +02:00
B o d o
d97b1cc1d0 Translated using Weblate (German)
Currently translated at 100.0% (147 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-06-21 15:03:41 +02:00
Sylvain Pichon
baf2848ce0 Translated using Weblate (French)
Currently translated at 100.0% (147 of 147 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-06-21 15:03:40 +02:00
Sylvia van Os
b16ea272ae Merge pull request #2554 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-20 17:10:52 +02:00
ssantos
59fa7d143d Translated using Weblate (Portuguese)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-06-20 14:04:03 +02:00
ssantos
658cfd2d4a Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-06-20 14:04:02 +02:00
Sylvia van Os
a428db36c4 Merge pull request #2553 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.15
Bump org.robolectric:robolectric from 4.14.1 to 4.15
2025-06-20 08:18:21 +02:00
dependabot[bot]
469eaefcb6 Bump org.robolectric:robolectric from 4.14.1 to 4.15
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.14.1 to 4.15.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.14.1...robolectric-4.15)

---
updated-dependencies:
- dependency-name: org.robolectric:robolectric
  dependency-version: '4.15'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-20 02:37:20 +00:00
Sylvia van Os
e991c9fdc1 Update fastlane 2025-06-18 22:05:28 +02:00
Sylvia van Os
43c9e7f7ac Merge branch 'main' of github.com:CatimaLoyalty/Android 2025-06-17 18:54:46 +02:00
Sylvia van Os
b410f100e8 Release Catima 2.35.1 2025-06-17 18:47:43 +02:00
Sylvia van Os
e2413f8538 Merge pull request #2551 from CatimaLoyalty/create-pull-request/patch-1750178776
Update Fastlane changelogs
2025-06-17 18:46:41 +02:00
TheLastProject
745f1ba8cc Update Fastlane changelogs 2025-06-17 16:46:16 +00:00
Sylvia van Os
482b16e772 Update CHANGELOG 2025-06-17 18:46:04 +02:00
Sylvia van Os
f284c4807f Merge pull request #2549 from CatimaLoyalty/create-pull-request/patch-1749961719
Update contributors
2025-06-15 11:46:00 +02:00
TheLastProject
9927d6a544 Update contributors 2025-06-15 04:28:39 +00:00
Sylvia van Os
0b4c474ece Merge pull request #2548 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-14 12:25:26 +02:00
KING APPS
344e853839 Translated using Weblate (Persian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-06-14 09:02:06 +00:00
Sylvia van Os
865f5f67d7 Merge pull request #2546 from SamantazFox/patch-1
Fix: Use ANDROID_SDK_ROOT everywhere in build.sh
2025-06-12 19:09:47 +02:00
Sylvia van Os
5f8e7ab702 Replace deprecated ANDROID_SDK_ROOT with ANDROID_HOME var 2025-06-12 18:51:43 +02:00
Sylvia van Os
6ac864e3aa Merge pull request #2547 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-11 15:43:54 +02:00
smcx
e0a012f3a4 Translated using Weblate (Persian)
Currently translated at 96.0% (319 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-06-11 13:02:35 +02:00
Toni Liski
5f1ae9db8e Translated using Weblate (Finnish)
Currently translated at 5.4% (8 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fi/
2025-06-11 13:02:34 +02:00
Toni Liski
dcb5cd882e Translated using Weblate (Finnish)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2025-06-11 13:02:33 +02:00
Samantaz Fox
9d27df7e10 Fix: Use ANDROID_SDK_ROOT everywhere in build.sh
The signing section was using $HOME/Android/Sdk instead of $ANDROID_SDK_ROOT, preventing from signing the APK if the Android SDK is not installed at the default location.
2025-06-11 05:53:36 +00:00
Sylvia van Os
a11682181c Merge pull request #2545 from CatimaLoyalty/docs/repro_status
Add reproducibility status

Powered by https://shields.rbtlog.dev/
2025-06-10 23:44:07 +02:00
Sylvia van Os
a9b7f47053 Merge pull request #2544 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-10 23:43:14 +02:00
Sylvia van Os
809a91b16a Add reproducibility status
Powered by https://shields.rbtlog.dev/
2025-06-10 23:36:39 +02:00
Sylvia van Os
2c6e56342c Translated using Weblate (Arabic)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2025-06-10 09:06:37 +00:00
Sylvia van Os
df2b7ffc1b Translated using Weblate (Korean)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2025-06-10 09:06:19 +00:00
jonnysemon
3c5f28b496 Translated using Weblate (Arabic)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2025-06-09 10:02:48 +02:00
Aerin Park
7942bfc3f7 Translated using Weblate (Korean)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ko/
2025-06-09 10:02:47 +02:00
Taiki Ohno
9e8e7fd8c2 Translated using Weblate (Japanese)
Currently translated at 82.8% (275 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-06-09 10:02:46 +02:00
Aerin Park
e8c5caa2f3 Translated using Weblate (Korean)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2025-06-09 10:02:45 +02:00
Sylvia van Os
b697aa389a Merge pull request #2542 from CatimaLoyalty/create-pull-request/patch-1749356924
Update contributors
2025-06-08 11:02:56 +02:00
TheLastProject
a19f5b91a8 Update contributors 2025-06-08 04:28:44 +00:00
Sylvia van Os
e1ebeec623 Merge pull request #2539 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-05 18:59:16 +02:00
Hosted Weblate
7734727e16 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/
2025-06-05 17:59:17 +02:00
Sylvia van Os
d4d1e9e649 Translated using Weblate (Persian)
Currently translated at 95.7% (318 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-06-05 17:59:16 +02:00
Sylvia van Os
b3b45fcc50 Merge pull request #2537 from CatimaLoyalty/create-pull-request/patch-1749113981
Update locales
2025-06-05 11:20:37 +02:00
TheLastProject
3bf63b855f Update locales 2025-06-05 08:59:40 +00:00
Sylvia van Os
c24ac94307 Merge pull request #2535 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-05 10:59:27 +02:00
Sylvia van Os
94c8f1f82d Merge pull request #2536 from CatimaLoyalty/dependabot/gradle/androidx.appcompat-appcompat-1.7.1
Bump androidx.appcompat:appcompat from 1.7.0 to 1.7.1
2025-06-05 10:23:49 +02:00
Majid G
5d455a31b3 Translated using Weblate (Persian)
Currently translated at 96.0% (319 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-06-05 06:10:24 +02:00
dependabot[bot]
b43fe087d6 Bump androidx.appcompat:appcompat from 1.7.0 to 1.7.1
Bumps androidx.appcompat:appcompat from 1.7.0 to 1.7.1.

---
updated-dependencies:
- dependency-name: androidx.appcompat:appcompat
  dependency-version: 1.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-05 02:33:53 +00:00
ofab22
c7c414c218 Translated using Weblate (Slovak)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-06-04 19:35:42 +00:00
Sylvia van Os
775b55fd23 Merge pull request #2508 from CatimaLoyalty/dependabot/gradle/org.jetbrains.kotlin.android-2.1.21
Bump org.jetbrains.kotlin.android from 2.1.10 to 2.1.21
2025-06-02 23:23:40 +02:00
Sylvia van Os
4cb601e0ce Rewrite loop that stopped working in Kotlin 2.1.21 2025-06-02 23:11:43 +02:00
Sylvia van Os
c42533aba5 Merge pull request #2534 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-02 15:06:07 +02:00
dicaeffe
df919417cb Translated using Weblate (Italian)
Currently translated at 84.9% (124 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2025-06-02 13:26:04 +02:00
Sylvia van Os
90afc5594f Merge pull request #2533 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-02 11:15:26 +02:00
ssantos
7b62e1871d Translated using Weblate (Portuguese (Portugal))
Currently translated at 98.6% (144 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-06-02 11:03:47 +02:00
ofab22
fc483b449b Translated using Weblate (Slovak)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-06-02 11:03:47 +02:00
Sylvia van Os
62dbc9c97f Merge pull request #2531 from CatimaLoyalty/create-pull-request/patch-1748752381
Update contributors
2025-06-01 09:23:25 +02:00
TheLastProject
ed9beb0752 Update contributors 2025-06-01 04:33:01 +00:00
Sylvia van Os
6b750ff84b Merge pull request #2530 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-06-01 00:09:33 +02:00
Hosted Weblate
17be2599f0 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/
2025-05-31 18:52:53 +02:00
Sylvia van Os
20820c27f8 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 98.7% (328 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2025-05-31 18:52:52 +02:00
林依若
b83f629c09 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.0% (329 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2025-05-31 17:26:41 +02:00
Warder
bfc79f6d97 Translated using Weblate (Slovak)
Currently translated at 98.6% (144 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-05-31 17:26:41 +02:00
Sylvia van Os
e297620ea2 Merge pull request #2528 from CatimaLoyalty/create-pull-request/patch-1748542198
Update feature graphic
2025-05-29 20:10:50 +02:00
TheLastProject
83e5240871 Update feature graphic 2025-05-29 18:09:58 +00:00
Sylvia van Os
2e68290d0c Merge pull request #2527 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-29 20:07:22 +02:00
ofab22
690d405f87 Translated using Weblate (Slovak)
Currently translated at 98.6% (144 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-05-29 19:12:13 +02:00
ofab22
4c711a991a Translated using Weblate (Slovak)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-05-29 19:12:12 +02:00
dependabot[bot]
79795ff328 Bump org.jetbrains.kotlin.android from 2.1.10 to 2.1.21
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 2.1.10 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/v2.1.10...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-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-29 06:56:40 +00:00
Sylvia van Os
c178fb230e Merge pull request #2526 from CatimaLoyalty/dependabot/gradle/com.android.application-8.10.1
Bump com.android.application from 8.10.0 to 8.10.1
2025-05-29 08:55:46 +02:00
dependabot[bot]
0acaf0598a Bump com.android.application from 8.10.0 to 8.10.1
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>
2025-05-29 02:55:42 +00:00
Sylvia van Os
7b99bf86fa Merge pull request #2524 from CatimaLoyalty/TheLastProject-patch-1
Update OpenJDK version in README
2025-05-28 10:12:31 +02:00
Sylvia van Os
6cf68abfc7 Update OpenJDK version in README 2025-05-28 10:11:53 +02:00
Sylvia van Os
0e95dadb6c Merge pull request #2523 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-27 17:12:01 +02:00
summoner001
77b525809d Translated using Weblate (Hungarian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2025-05-27 15:02:27 +00:00
Warder
d624316207 Translated using Weblate (Slovak)
Currently translated at 98.6% (144 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-05-27 15:02:26 +00:00
Sylvia van Os
353c8090a9 Merge pull request #2522 from CatimaLoyalty/create-pull-request/patch-1748147066
Update contributors
2025-05-25 08:48:35 +02:00
Sylvia van Os
7928cf8332 Merge pull request #2521 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-25 08:44:59 +02:00
TheLastProject
75bcade01c Update contributors 2025-05-25 04:24:26 +00:00
Sylvia van Os
2d33774b56 Translated using Weblate (Slovak)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-05-25 01:56:41 +02:00
Sylvia van Os
26e5a1fbab Merge pull request #2520 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-23 18:06:31 +02:00
B o d o
b516736b6c Translated using Weblate (German)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-05-23 15:01:07 +00:00
Sylvia van Os
881b3fefef Merge pull request #2519 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-23 10:50:40 +02:00
Priit Jõerüüt
a4c14e3c88 Translated using Weblate (Estonian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-05-23 10:35:06 +02:00
Sylvia van Os
2943b64634 Merge pull request #2517 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-20 20:53:10 +02:00
Takahiro Namatame
0af74ef8de Translated using Weblate (Japanese)
Currently translated at 82.5% (274 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-05-20 19:34:07 +02:00
Sylvia van Os
8556507c6a Update and fix fastlane
Apply the workaround in
https://github.com/fastlane/fastlane/issues/29183 (needed on Fedora 42)
2025-05-20 17:28:24 +02:00
Sylvia van Os
ff8c662423 Merge pull request #2515 from CatimaLoyalty/create-pull-request/patch-1747561264
Update locales
2025-05-18 11:52:42 +02:00
Sylvia van Os
9314637094 Merge pull request #2514 from CatimaLoyalty/fix/he
Fix hebrew support
2025-05-18 11:52:14 +02:00
TheLastProject
8def5cbe5b Update locales 2025-05-18 09:41:04 +00:00
Sylvia van Os
6c7f21d6fd Fix hebrew support 2025-05-18 11:40:01 +02:00
Sylvia van Os
edc3c38d14 Merge pull request #2513 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-18 11:21:35 +02:00
Sylvia van Os
4045566514 Merge pull request #2512 from CatimaLoyalty/create-pull-request/patch-1747542126
Update contributors
2025-05-18 11:12:52 +02:00
elid
9b5af3b221 Translated using Weblate (Hebrew)
Currently translated at 15.6% (52 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he/
2025-05-18 08:50:52 +02:00
elid
b5fc0af979 Added translation using Weblate (Hebrew) 2025-05-18 05:41:35 +00:00
TheLastProject
4c643b3c61 Update contributors 2025-05-18 04:22:06 +00:00
Sylvia van Os
01e198c94b Release Catima 2.35.0 2025-05-17 13:40:13 +02:00
Sylvia van Os
6b09656164 Merge pull request #2510 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-15 21:50:25 +02:00
Sylvia van Os
21b051c422 Merge pull request #2507 from CatimaLoyalty/target/java21
Use Java 21
2025-05-15 21:48:22 +02:00
Prachi Joshi
9a8fa4ad1a Translated using Weblate (Marathi)
Currently translated at 39.7% (132 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/mr/
2025-05-15 20:02:28 +02:00
Sylvain Pichon
2ac2f07c80 Translated using Weblate (French)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-05-15 20:02:27 +02:00
Sylvia van Os
e893923164 Remove spotBugs
We've been running an old version for very long because there hasn't
been any time to update it. A newer version doesn't support Java 21.
Given Java 21 ihas more priority, let's just get rid of spotBugs.
2025-05-14 20:53:14 +02:00
Sylvia van Os
ebacb6fe4c Fix CI status badge 2025-05-14 20:49:04 +02:00
Sylvia van Os
fb329f410a Merge pull request #2509 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-14 17:12:12 +02:00
Edgars Andersons
f95d7d62dd Translated using Weblate (Latvian)
Currently translated at 8.9% (13 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-05-14 14:03:16 +00:00
大王叫我来巡山
482303b775 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-05-14 14:03:15 +00:00
Fjuro
d02a359cc3 Translated using Weblate (Czech)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-05-14 14:03:15 +00:00
Максим Горпиніч
9b24158acc Translated using Weblate (Ukrainian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-05-14 14:03:14 +00:00
solokot
cf65476f16 Translated using Weblate (Russian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-05-14 14:03:14 +00:00
B o d o
02d04614e0 Translated using Weblate (German)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-05-14 14:03:13 +00:00
Sylvia van Os
a543d4d4bf Use Java 21 2025-05-13 20:28:57 +02:00
Sylvia van Os
f4de708e42 Merge pull request #2506 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-13 17:23:41 +02:00
hajer tabbane
f1079f4e5d Translated using Weblate (Arabic)
Currently translated at 42.4% (62 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2025-05-13 13:02:26 +00:00
icosahedr.online
4d09077b2f Translated using Weblate (Dutch)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-05-13 13:02:24 +00:00
Sylvia van Os
f62fc879c5 Merge pull request #2505 from CatimaLoyalty/create-pull-request/patch-1747073386
Update Fastlane changelogs
2025-05-12 20:15:28 +02:00
TheLastProject
0b24a76b19 Update Fastlane changelogs 2025-05-12 18:09:45 +00:00
Sylvia van Os
921773ee59 Update CHANGELOG 2025-05-12 20:09:32 +02:00
Sylvia van Os
6d012413bc Merge pull request #2504 from CatimaLoyalty/fix/2503
Fix crash on pkpass with no barcodes
2025-05-12 20:06:26 +02:00
Sylvia van Os
caeba57a42 Fix crash on pkpass with no barcodes 2025-05-12 19:34:51 +02:00
Sylvia van Os
e12204771f Merge pull request #2502 from CatimaLoyalty/create-pull-request/patch-1746937166
Update contributors
2025-05-11 11:08:42 +02:00
TheLastProject
cf9612052a Update contributors 2025-05-11 04:19:26 +00:00
Sylvia van Os
b0081919c9 Merge pull request #2499 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-10 18:06:10 +02:00
e zabihi
7c2959b501 Translated using Weblate (Persian)
Currently translated at 65.9% (219 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-05-10 14:02:32 +02:00
大王叫我来巡山
6f9ab1ad1d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-05-10 14:02:31 +02:00
Sylvain Pichon
42f9a43393 Translated using Weblate (French)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-05-10 14:02:30 +02:00
Damjan Gerl
955cd8a0d4 Translated using Weblate (Slovenian)
Currently translated at 77.1% (256 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2025-05-10 14:02:30 +02:00
Sylvia van Os
b1c806a189 Merge pull request #2498 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-09 18:17:36 +02:00
Edgars Andersons
bea5f5eb82 Translated using Weblate (Latvian)
Currently translated at 8.9% (13 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-05-09 10:03:04 +00:00
Serhat
958e0951bc Translated using Weblate (Turkish)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-05-09 10:03:03 +00:00
Fjuro
26dbf6d53d Translated using Weblate (Czech)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-05-09 10:03:02 +00:00
Максим Горпиніч
051e49a099 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-05-09 10:03:02 +00:00
solokot
083b3d0666 Translated using Weblate (Russian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-05-09 10:03:01 +00:00
B o d o
b4ab8a0220 Translated using Weblate (German)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-05-09 10:03:00 +00:00
B o d o
658205bc49 Translated using Weblate (German)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-05-09 10:03:00 +00:00
Sylvia van Os
d9ee1950d8 Merge pull request #2496 from CatimaLoyalty/create-pull-request/patch-1746719450
Update feature graphic
2025-05-08 17:58:20 +02:00
TheLastProject
601600a036 Update feature graphic 2025-05-08 15:50:50 +00:00
Sylvia van Os
7805e9f323 Merge pull request #2495 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-08 17:47:33 +02:00
Warder
61dd342f17 Translated using Weblate (Slovak)
Currently translated at 99.3% (145 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-05-08 11:03:47 +02:00
Sylvia van Os
1c91842ad4 Merge pull request #2493 from CatimaLoyalty/create-pull-request/patch-1746652483
Update Fastlane changelogs
2025-05-07 23:30:55 +02:00
TheLastProject
2f9ef2859b Update Fastlane changelogs 2025-05-07 21:14:43 +00:00
Sylvia van Os
9ce27f4fa0 Update changelog 2025-05-07 23:14:26 +02:00
Sylvia van Os
3f654d2170 Merge pull request #2492 from herodotos/2366-Bug
Fix for coloured QR code fails to scan #2366
2025-05-07 23:14:05 +02:00
Sylvia van Os
88019dcae3 Also apply inverted scanning to camera 2025-05-07 22:56:48 +02:00
Sylvia van Os
b94ea44f42 Merge pull request #2490 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-07 08:54:01 +02:00
Sylvia van Os
f52b101735 Translated using Weblate (Slovak)
Currently translated at 99.3% (145 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-05-07 08:36:27 +02:00
Warder
02e139f5d2 Translated using Weblate (Slovak)
Currently translated at 99.3% (145 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-05-07 08:36:27 +02:00
GiannosOB
67a3b13209 Translated using Weblate (Greek)
Currently translated at 5.4% (8 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/el/
2025-05-07 08:36:27 +02:00
Warder
4cd85f3a05 Translated using Weblate (Slovak)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-05-07 08:36:27 +02:00
herodotos
35f88ca386 Fix for coloured QR code fails to scan #2366 2025-05-07 08:19:13 +02:00
Sylvia van Os
0157e76725 Merge pull request #2491 from CatimaLoyalty/dependabot/gradle/com.android.application-8.10.0
Bump com.android.application from 8.9.2 to 8.10.0
2025-05-07 08:17:35 +02:00
dependabot[bot]
fceda14f89 Bump com.android.application from 8.9.2 to 8.10.0
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>
2025-05-07 02:27:38 +00:00
Sylvia van Os
18a2c3d907 Merge pull request #2471 from CatimaLoyalty/fix/iconWhiteLine
Fix icons having white/black lines
2025-05-04 12:06:01 +02:00
Sylvia van Os
8f944329c2 Merge pull request #2486 from CatimaLoyalty/create-pull-request/patch-1746332429
Update contributors
2025-05-04 10:56:28 +02:00
Sylvia van Os
24cde962b4 Merge pull request #2485 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-04 10:55:49 +02:00
TheLastProject
cdd78cbfb5 Update contributors 2025-05-04 04:20:29 +00:00
Aliaksandr Truš
a0782f115c Translated using Weblate (Belarusian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/be/
2025-05-04 04:07:31 +02:00
Sylvia van Os
1d2e7bb8d2 Merge pull request #2484 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-05-03 22:15:40 +02:00
Provek
272102ed61 Translated using Weblate (Polish)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-05-03 20:04:15 +02:00
Michael Moroni
1baea9ee4b Translated using Weblate (Italian)
Currently translated at 99.6% (331 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2025-05-03 20:04:15 +02:00
LordTenebrous
3022c8fd75 Translated using Weblate (Spanish)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-05-03 20:04:15 +02:00
Sylvia van Os
e1cfb15a8b Merge pull request #2482 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-30 08:43:19 +02:00
Noctade
ecfa677542 Translated using Weblate (Serbian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sr/
2025-04-30 06:04:55 +02:00
abdelbasset jabrane
810eb97dfc Translated using Weblate (Arabic)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2025-04-30 06:04:55 +02:00
RTTTC
40bd33f6af Translated using Weblate (Lithuanian)
Currently translated at 93.3% (310 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2025-04-30 06:04:55 +02:00
Sylvia van Os
19cc6c7573 Merge pull request #2480 from CatimaLoyalty/dependabot/github_actions/actions/setup-python-5.6.0
Bump actions/setup-python from 5.5.0 to 5.6.0
2025-04-28 07:04:05 +02:00
Sylvia van Os
89144ff83e Merge pull request #2479 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-28 07:00:55 +02:00
dependabot[bot]
5c77bab972 Bump actions/setup-python from 5.5.0 to 5.6.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.5.0 to 5.6.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.5.0...v5.6.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 5.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-28 02:24:03 +00:00
Aliaksandr Truš
e406e69c54 Translated using Weblate (Belarusian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/be/
2025-04-27 22:36:43 +00:00
ssantos
52b36b5946 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-04-27 22:36:41 +00:00
ssantos
06cf71a96a Translated using Weblate (Portuguese (Portugal))
Currently translated at 97.9% (143 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-04-27 22:36:40 +00:00
Sylvia van Os
00052f68b8 Merge pull request #2478 from CatimaLoyalty/create-pull-request/patch-1745784188
Update locales
2025-04-27 22:04:23 +02:00
TheLastProject
70f90bbf8f Update locales 2025-04-27 20:03:08 +00:00
Sylvia van Os
167ce12b57 Merge pull request #2475 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-27 22:02:56 +02:00
Sylvia van Os
a056841aec Merge pull request #2476 from CatimaLoyalty/create-pull-request/patch-1745727537
Update contributors
2025-04-27 12:39:16 +02:00
TheLastProject
bb81e22dae Update contributors 2025-04-27 04:18:57 +00:00
Aliaksandr Truš
068a80617d Translated using Weblate (Belarusian)
Currently translated at 97.5% (324 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/be/
2025-04-27 06:15:29 +02:00
Sylvia van Os
22c3e10274 Merge pull request #2474 from CatimaLoyalty/create-pull-request/patch-1745648687
Update Gradle to 8.14
2025-04-26 22:19:09 +02:00
Sylvia van Os
4696862745 Merge pull request #2473 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-26 20:39:09 +02:00
TheLastProject
a8930c43ce Update Gradle to 8.14 2025-04-26 06:24:47 +00:00
Govind Gopal Yadav
3fac57d023 Translated using Weblate (Hindi)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2025-04-25 18:33:10 +02:00
Govind Gopal Yadav
1c9dba92b1 Translated using Weblate (Hindi)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2025-04-25 18:33:10 +02:00
Sylvia van Os
833a4b8743 Merge pull request #2472 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-24 18:58:20 +02:00
Aliaksandr Truš
aedeb91b1a Translated using Weblate (Belarusian)
Currently translated at 32.2% (107 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/be/
2025-04-24 16:38:24 +00:00
Govind Gopal Yadav
0c191eda05 Translated using Weblate (Hindi)
Currently translated at 93.6% (311 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2025-04-24 16:38:23 +00:00
Sylvia van Os
e3e1e0c85b Fix icons having white/black lines
It's extremely hard to perfectly reach the 85.6:53.98 ratio, so if the
image is cropped close enough to it, we enable center cropping. This
allows a bit of the edges to be cut off to fully fill the image area.
2025-04-24 18:16:49 +02:00
Sylvia van Os
32a6fa9e8f Merge pull request #2470 from CatimaLoyalty/create-pull-request/patch-1745506852
Update locales
2025-04-24 17:35:08 +02:00
TheLastProject
4f4ffa46e7 Update locales 2025-04-24 15:00:51 +00:00
Sylvia van Os
8f7ab2b4bf Merge pull request #2469 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-24 17:00:40 +02:00
Sylvia van Os
71c1afc10e Merge pull request #2466 from CatimaLoyalty/dependabot/gradle/androidx.exifinterface-exifinterface-1.4.1
Bump androidx.exifinterface:exifinterface from 1.4.0 to 1.4.1
2025-04-24 16:58:28 +02:00
Aliaksandr Truš
bdb1f70754 Added translation using Weblate (Belarusian) 2025-04-24 15:32:19 +02:00
Sylvia van Os
e08d95f0f5 Translated using Weblate (Tamil)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2025-04-24 15:32:19 +02:00
Sylvia van Os
d487668ad9 Translated using Weblate (Galician)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-04-24 15:32:18 +02:00
Priit Jõerüüt
2660550df1 Translated using Weblate (Estonian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-04-24 15:32:18 +02:00
dedakir923
cfed16d2e5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-04-24 15:32:17 +02:00
Sylvia van Os
9af3ef90a2 Translated using Weblate (Latvian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-04-24 15:32:16 +02:00
大王叫我来巡山
d7db959dd7 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-04-24 15:32:16 +02:00
大王叫我来巡山
b5eff7f9c7 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-04-24 15:32:15 +02:00
Sylvia van Os
8891f5d75d Translated using Weblate (Greek)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-04-24 15:32:15 +02:00
Sylvia van Os
f0aab7017e Translated using Weblate (German)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-04-24 15:32:14 +02:00
Sylvia van Os
b4985bba76 Translated using Weblate (Czech)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-04-24 15:32:14 +02:00
dependabot[bot]
0911ec8c9d Bump androidx.exifinterface:exifinterface from 1.4.0 to 1.4.1
Bumps androidx.exifinterface:exifinterface from 1.4.0 to 1.4.1.

---
updated-dependencies:
- dependency-name: androidx.exifinterface:exifinterface
  dependency-version: 1.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-24 02:48:25 +00:00
Sylvia van Os
5e171c17be Merge pull request #2465 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-23 21:43:25 +02:00
Elcio Augusto Dalosto
7896600863 Translated using Weblate (Portuguese)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-04-23 20:04:48 +02:00
தமிழ்நேரம்
d20a0e8598 Translated using Weblate (Tamil)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2025-04-23 20:04:47 +02:00
josé m
b871279502 Translated using Weblate (Galician)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-04-23 20:04:47 +02:00
Priit Jõerüüt
fa08f4f797 Translated using Weblate (Estonian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-04-23 20:04:46 +02:00
Edgars Andersons
794932812c Translated using Weblate (Latvian)
Currently translated at 8.9% (13 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-04-23 20:04:45 +02:00
Edgars Andersons
e316fc7309 Translated using Weblate (Latvian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-04-23 20:04:45 +02:00
109247019824
971e861e18 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-04-23 20:04:43 +02:00
Fjuro
3e7cf68425 Translated using Weblate (Czech)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-04-23 20:04:42 +02:00
B o d o
d2137c5f80 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-04-23 20:04:42 +02:00
solokot
0f17841fe4 Translated using Weblate (Russian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-04-23 20:04:41 +02:00
Sylvain Pichon
663ad8b4b2 Translated using Weblate (French)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-04-23 20:04:40 +02:00
solokot
0609c05864 Translated using Weblate (Russian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-04-23 20:04:40 +02:00
Sylvain Pichon
07da8cb492 Translated using Weblate (French)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-04-23 20:04:39 +02:00
GiannosOB
c16da87be8 Translated using Weblate (Greek)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-04-23 20:04:38 +02:00
B o d o
450d359c16 Translated using Weblate (German)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-04-23 20:04:37 +02:00
Fjuro
c1a1098501 Translated using Weblate (Czech)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-04-23 20:04:36 +02:00
Sylvia van Os
4c7aac2f67 More fixes for height string 2025-04-22 21:44:39 +02:00
Sylvia van Os
2bcd6f856a Merge pull request #2463 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-22 21:41:35 +02:00
Максим Горпиніч
d98fb2fe12 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-04-22 19:34:07 +02:00
B o d o
c549c713a3 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-04-22 19:34:05 +02:00
B o d o
9388a05eac Translated using Weblate (German)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-04-22 19:34:02 +02:00
Vasilis K
6809153412 Translated using Weblate (Greek)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-04-22 19:34:00 +02:00
B o d o
39556705ab Translated using Weblate (German)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-04-22 19:34:00 +02:00
Максим Горпиніч
d1939b943d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-04-22 16:52:07 +02:00
தமிழ்நேரம்
f2c32202c8 Added translation using Weblate (Tamil) 2025-04-22 16:48:40 +02:00
nadia fekih ahmed
7ece032bb3 Translated using Weblate (Arabic)
Currently translated at 30.1% (44 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2025-04-22 16:48:32 +02:00
Sylvia van Os
9393c2b8d8 Merge pull request #2462 from CatimaLoyalty/dependabot/gradle/com.android.application-8.9.2
Bump com.android.application from 8.9.1 to 8.9.2
2025-04-22 08:23:35 +02:00
dependabot[bot]
f2dd15aaf5 Bump com.android.application from 8.9.1 to 8.9.2
Bumps com.android.application from 8.9.1 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>
2025-04-22 03:00:53 +00:00
Sylvia van Os
f4927d9c8b Merge pull request #2458 from CatimaLoyalty/create-pull-request/patch-1745248381
Update Fastlane changelogs
2025-04-21 17:13:42 +02:00
TheLastProject
1dddd2cee3 Update Fastlane changelogs 2025-04-21 15:13:00 +00:00
Sylvia van Os
1e75da4eaf Update CHANGELOG 2025-04-21 17:12:48 +02:00
Sylvia van Os
1add77f4fe Remove colon for height for consistency with width field 2025-04-21 17:12:10 +02:00
perepujal
4b77700b97 Merge pull request #2254 from perepujal/main
Adding the ability to resize the width in the fullscreen view.
2025-04-21 17:06:49 +02:00
Sylvia van Os
cb547b0a71 Merge pull request #2457 from CatimaLoyalty/create-pull-request/patch-1745122739
Update contributors
2025-04-20 08:03:26 +02:00
TheLastProject
01ee3568ca Update contributors 2025-04-20 04:18:59 +00:00
Sylvia van Os
fcd7c00cc7 Merge pull request #2456 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-18 20:20:10 +02:00
Brian Sciretti
90a41ccf0f Translated using Weblate (Lombard)
Currently translated at 15.4% (51 of 330 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lmo/
2025-04-18 20:01:46 +02:00
Sylvia van Os
6c9748aca4 Merge pull request #2455 from CatimaLoyalty/create-pull-request/patch-1744925476
Update locales
2025-04-18 17:06:43 +02:00
TheLastProject
02e3ae4dd6 Update locales 2025-04-17 21:31:15 +00:00
Sylvia van Os
d39fdf400c Merge pull request #2447 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-17 23:31:02 +02:00
Sylvia van Os
073c6dfed8 Merge pull request #2432 from CatimaLoyalty/fix/persian_feature_graphic
Fix Persian feature graphic generation
2025-04-17 23:28:47 +02:00
Sylvia van Os
0fa4a6a4c8 Merge pull request #2454 from CatimaLoyalty/create-pull-request/patch-1744921489
Update feature graphic
2025-04-17 22:55:18 +02:00
TheLastProject
07b59f090e Update feature graphic 2025-04-17 20:24:48 +00:00
Sylvia van Os
df807d5548 Fix Persian feature graphic generation 2025-04-17 22:21:24 +02:00
Brian Sciretti
f21264c762 Added translation using Weblate (Lombard) 2025-04-17 19:52:33 +02:00
hajer tabbane
8aace7f765 Translated using Weblate (French)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/fr/
2025-04-17 19:52:32 +02:00
hadeelljn
531c25add7 Translated using Weblate (Arabic)
Currently translated at 19.8% (29 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2025-04-17 19:52:32 +02:00
Sylvia van Os
43add95012 Merge pull request #2444 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-14 20:30:27 +02:00
Sylvain Pichon
6ef892fa41 Translated using Weblate (French)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-04-14 09:03:21 +02:00
Sylvia van Os
1c832eb899 Merge pull request #2443 from CatimaLoyalty/create-pull-request/patch-1744519581
Update contributors
2025-04-13 11:14:29 +02:00
TheLastProject
f187fd10a5 Update contributors 2025-04-13 04:46:21 +00:00
Sylvia van Os
4cac1b103a Merge pull request #2441 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-12 00:21:38 +02:00
Edgars Andersons
2c7a759711 Translated using Weblate (Latvian)
Currently translated at 8.9% (13 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-04-11 22:51:32 +02:00
Sylvia van Os
c490ce6248 Merge pull request #2440 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-11 08:39:23 +02:00
Sylvia van Os
7e3e1544d2 Translated using Weblate (Occitan)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/oc/
2025-04-11 00:03:48 +02:00
B o d o
edf18591ca Translated using Weblate (German)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-04-11 00:03:47 +02:00
Sylvia van Os
8cb08dc980 Merge pull request #2438 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-10 17:13:58 +02:00
hajer tabbane
5e925f41fb Translated using Weblate (Tamazight (Central Atlas))
Currently translated at 0.0% (0 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/tzm/
2025-04-10 09:00:49 +00:00
hajer tabbane
a3a28b38e7 Translated using Weblate (Czech)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/cs/
2025-04-10 09:00:48 +00:00
109247019824
87fb81de91 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/bg/
2025-04-10 09:00:48 +00:00
hajer tabbane
76adf47107 Translated using Weblate (Turkish)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/tr/
2025-04-10 09:00:47 +00:00
大王叫我来巡山
ecbca16246 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-04-10 09:00:46 +00:00
Fjuro
4bd9b25633 Translated using Weblate (Czech)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-04-10 09:00:46 +00:00
Максим Горпиніч
dd46a45b21 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-04-10 09:00:45 +00:00
solokot
e0875d8e45 Translated using Weblate (Russian)
Currently translated at 100.0% (146 of 146 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-04-10 09:00:45 +00:00
nadia fekih ahmed
329ff33dc4 Translated using Weblate (Spanish (Argentina))
Currently translated at 72.1% (238 of 330 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2025-04-10 09:00:44 +00:00
hajer tabbane
4610058c54 Added translation using Weblate (Tamazight (Central Atlas)) 2025-04-10 09:00:43 +00:00
nadia fekih ahmed
8ce338c525 Translated using Weblate (Filipino)
Currently translated at 18.0% (60 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fil/
2025-04-10 09:00:43 +00:00
nadia fekih ahmed
22e119336b Translated using Weblate (Marathi)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/mr/
2025-04-10 09:00:42 +00:00
nadia fekih ahmed
981e031697 Translated using Weblate (Spanish (Argentina))
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/es_AR/
2025-04-10 09:00:41 +00:00
nadia fekih ahmed
4f934b35ca Translated using Weblate (Slovenian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/sl/
2025-04-10 09:00:41 +00:00
nadia fekih ahmed
441ce040ff Translated using Weblate (Bengali (India))
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/bn_IN/
2025-04-10 09:00:40 +00:00
nadia fekih ahmed
39e3a5afa8 Translated using Weblate (Malayalam)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/ml/
2025-04-10 09:00:40 +00:00
nadia fekih ahmed
b281a8b8e4 Translated using Weblate (Icelandic)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/is/
2025-04-10 09:00:39 +00:00
nadia fekih ahmed
5877508fb7 Translated using Weblate (Welsh)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/cy/
2025-04-10 09:00:38 +00:00
nadia fekih ahmed
7ff98a9b6d Translated using Weblate (Occitan)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/oc/
2025-04-10 09:00:38 +00:00
nadia fekih ahmed
e658555c2b Translated using Weblate (Bosnian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/bs/
2025-04-10 09:00:37 +00:00
nadia fekih ahmed
80a52afd8e Translated using Weblate (Asturian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/ast/
2025-04-10 09:00:36 +00:00
nadia fekih ahmed
5963582abf Translated using Weblate (Bulgarian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/bg/
2025-04-10 09:00:35 +00:00
nadia fekih ahmed
b918d51744 Translated using Weblate (Bengali)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/bn/
2025-04-10 09:00:35 +00:00
nadia fekih ahmed
1a475bc9c5 Translated using Weblate (Danish)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/da/
2025-04-10 09:00:34 +00:00
nadia fekih ahmed
1b86795c20 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/lt/
2025-04-10 09:00:33 +00:00
nadia fekih ahmed
42d1bc452f Translated using Weblate (Luxembourgish)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/lb/
2025-04-10 09:00:33 +00:00
hadeelljn
7e0e788689 Translated using Weblate (Arabic)
Currently translated at 9.6% (14 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2025-04-10 09:00:32 +00:00
hadeelljn
14434e1c55 Translated using Weblate (Arabic)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2025-04-10 09:00:32 +00:00
hadeelljn
a733b681d8 Translated using Weblate (Japanese)
Currently translated at 4.8% (7 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2025-04-10 09:00:31 +00:00
Sylvia van Os
af39b9de25 Merge pull request #2439 from CatimaLoyalty/dependabot/gradle/androidx.core-core-ktx-1.16.0
Bump androidx.core:core-ktx from 1.15.0 to 1.16.0
2025-04-10 08:34:17 +02:00
dependabot[bot]
74c988aa67 Bump androidx.core:core-ktx from 1.15.0 to 1.16.0
Bumps androidx.core:core-ktx from 1.15.0 to 1.16.0.

---
updated-dependencies:
- dependency-name: androidx.core:core-ktx
  dependency-version: 1.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-10 02:43:07 +00:00
Sylvia van Os
8ff1120a0d Merge pull request #2437 from CatimaLoyalty/create-pull-request/patch-1744140504
Update Fastlane changelogs
2025-04-08 21:28:45 +02:00
TheLastProject
543787a559 Update Fastlane changelogs 2025-04-08 19:28:24 +00:00
Sylvia van Os
3eb7b01a98 Update CHANGELOG 2025-04-08 21:28:09 +02:00
Sylvia van Os
c66e800a22 Merge pull request #2427 from CatimaLoyalty/fix/removeConfusingImportFromApp
Remove confusing import from app function
2025-04-08 21:27:23 +02:00
Sylvia van Os
10ed6be747 Merge pull request #2435 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-08 08:32:56 +02:00
Shubham Sharma (Kaku)
b99c7f576d Translated using Weblate (Hindi)
Currently translated at 94.5% (315 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2025-04-08 06:44:22 +02:00
Sylvia van Os
ac5d15578f Remove confusing import from app function 2025-04-06 20:54:22 +02:00
Sylvia van Os
d5c03f9d36 Merge pull request #2428 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-06 17:24:15 +02:00
Sylvia van Os
6ed2ff849a Translated using Weblate (Persian)
Currently translated at 63.3% (211 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-04-06 17:03:08 +02:00
ssantos
2945450186 Translated using Weblate (Portuguese)
Currently translated at 99.3% (144 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-04-06 17:03:08 +02:00
KING APPS
8944c6d5dc Translated using Weblate (Persian)
Currently translated at 22.7% (33 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fa/
2025-04-06 04:37:03 +02:00
KING APPS
97db8ee025 Translated using Weblate (Persian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/fa/
2025-04-06 04:37:03 +02:00
KING APPS
777a3cce28 Translated using Weblate (Persian)
Currently translated at 63.3% (211 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-04-06 04:37:03 +02:00
Sylvia van Os
91386df0f7 Merge pull request #2426 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-04 17:57:07 +02:00
XblateX
9f95812d32 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-04-04 16:24:48 +02:00
Sylvia van Os
361b011205 Merge pull request #2425 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-04 10:43:46 +02:00
Tachibana Saza
ac45a5cdfe Translated using Weblate (Japanese)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/ja/
2025-04-04 01:21:09 +02:00
Tachibana Saza
e892f5d57c Translated using Weblate (Japanese)
Currently translated at 81.6% (272 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2025-04-04 01:21:08 +02:00
Sylvia van Os
a3d24ebe3b Merge pull request #2424 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-02 20:19:30 +02:00
Sylvia van Os
29ce8e63b3 Translated using Weblate (Persian)
Currently translated at 46.2% (154 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-04-01 21:03:20 +02:00
alpha chart
223d6d1d35 Translated using Weblate (Persian)
Currently translated at 46.2% (154 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-04-01 19:46:49 +02:00
alpha chart
e712765f0b Translated using Weblate (Persian)
Currently translated at 46.2% (154 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-04-01 19:24:21 +02:00
alpha chart
ad68c43857 Added translation using Weblate (Persian) 2025-04-01 19:11:23 +02:00
alpha chart
626c25b781 Translated using Weblate (Persian)
Currently translated at 45.9% (153 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-04-01 19:11:23 +02:00
Sylvia van Os
0e9366e0ce Merge pull request #2423 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-04-01 07:31:25 +02:00
Branislav Veljkovic
cccffe9543 Translated using Weblate (Serbian)
Currently translated at 94.2% (314 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sr/
2025-04-01 03:27:29 +02:00
Sylvia van Os
821e81303c Merge pull request #2421 from CatimaLoyalty/dependabot/github_actions/actions/setup-python-5.5.0
Bump actions/setup-python from 5.4.0 to 5.5.0
2025-03-31 07:03:14 +02:00
dependabot[bot]
d3ba0ff93f Bump actions/setup-python from 5.4.0 to 5.5.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.4.0 to 5.5.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.4.0...v5.5.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-31 02:44:55 +00:00
Sylvia van Os
2bf9f58054 Merge pull request #2420 from CatimaLoyalty/create-pull-request/patch-1743308358
Update contributors
2025-03-30 12:16:15 +02:00
TheLastProject
07ba380c21 Update contributors 2025-03-30 04:19:17 +00:00
Sylvia van Os
6e523dff7e Merge pull request #2419 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-30 00:33:20 +01:00
abdelbasset jabrane
702cc17bd5 Translated using Weblate (Arabic)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2025-03-30 00:02:03 +01:00
Sylvia van Os
6b9c452de7 Merge pull request #2418 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-26 10:32:27 +01:00
mohamad jamshidi
5d9a670225 Translated using Weblate (Persian)
Currently translated at 45.6% (152 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-03-26 01:10:20 +01:00
Sylvia van Os
4cb939ab6b Merge pull request #2416 from CatimaLoyalty/dependabot/gradle/com.android.application-8.9.1
Bump com.android.application from 8.9.0 to 8.9.1
2025-03-25 07:14:36 +01:00
dependabot[bot]
f14b2dffcd Bump com.android.application from 8.9.0 to 8.9.1
Bumps com.android.application from 8.9.0 to 8.9.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 03:03:46 +00:00
Sylvia van Os
55b0ee7a63 Merge pull request #2415 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-24 22:01:08 +01:00
ar djeb
4adfb0d292 Translated using Weblate (Arabic)
Currently translated at 99.3% (331 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2025-03-24 20:18:52 +00:00
Sylvia van Os
948ee26852 Bump fastlane 2025-03-24 18:44:34 +01:00
Sylvia van Os
a652d3fd9a Merge pull request #2413 from CatimaLoyalty/dependabot/github_actions/actions/upload-artifact-4.6.2
Bump actions/upload-artifact from 4.6.1 to 4.6.2
2025-03-24 13:21:21 +01:00
Sylvia van Os
18e530f3a0 Merge pull request #2414 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-24 13:13:47 +01:00
Edgars Andersons
a55dcd760c Translated using Weblate (Latvian)
Currently translated at 8.2% (12 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-03-24 13:04:38 +01:00
Максим Горпиніч
2bbcad03ef Translated using Weblate (Ukrainian)
Currently translated at 100.0% (145 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-03-24 13:04:38 +01:00
solokot
cc9c50032c Translated using Weblate (Russian)
Currently translated at 100.0% (145 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-03-24 13:04:38 +01:00
dependabot[bot]
06cf3e9288 Bump actions/upload-artifact from 4.6.1 to 4.6.2
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.1 to 4.6.2.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4.6.1...v4.6.2)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-24 03:02:10 +00:00
Sylvia van Os
a25e91dede Merge pull request #2412 from CatimaLoyalty/create-pull-request/patch-1742767250
Update feature graphic
2025-03-23 23:04:21 +01:00
TheLastProject
57086649f4 Update feature graphic 2025-03-23 22:00:50 +00:00
Sylvia van Os
7d2fc03248 Merge pull request #2410 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-23 22:59:38 +01:00
ssantos
b2ad30d1ae Translated using Weblate (Portuguese)
Currently translated at 97.9% (142 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-03-23 19:40:12 +00:00
ssantos
8970a0a031 Translated using Weblate (Portuguese (Portugal))
Currently translated at 97.9% (142 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-03-23 19:40:06 +00:00
Sylvia van Os
c9e713cf7f Merge pull request #2409 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-23 17:58:01 +01:00
Fjuro
64e315f0b0 Translated using Weblate (Czech)
Currently translated at 100.0% (145 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-03-23 16:18:27 +00:00
Sylvia van Os
f60cf0e674 Merge pull request #2408 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-23 15:50:42 +01:00
大王叫我来巡山
5d2a1b0263 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (145 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-03-23 15:36:48 +01:00
Sylvia van Os
77860441ad Merge pull request #2406 from CatimaLoyalty/create-pull-request/patch-1742703483
Update contributors
2025-03-23 10:33:48 +01:00
Sylvia van Os
f46ec1ec51 Merge pull request #2405 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-23 10:32:38 +01:00
TheLastProject
e644c347ec Update contributors 2025-03-23 04:18:03 +00:00
B o d o
0b28df9999 Translated using Weblate (German)
Currently translated at 100.0% (145 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-03-23 00:34:29 +01:00
Sylvia van Os
dddb3e3a11 Merge pull request #2404 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-22 20:56:27 +01:00
Edgars Andersons
0518821341 Translated using Weblate (Latvian)
Currently translated at 7.5% (11 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-03-22 19:42:43 +00:00
B o d o
2eefcf1270 Translated using Weblate (German)
Currently translated at 100.0% (145 of 145 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-03-22 19:42:42 +00:00
Sylvia van Os
93c3705207 Merge pull request #2403 from CatimaLoyalty/create-pull-request/patch-1742664270
Update Fastlane changelogs
2025-03-22 19:16:44 +01:00
TheLastProject
9fcf9e4dd9 Update Fastlane changelogs 2025-03-22 17:24:29 +00:00
Sylvia van Os
392ce9bc79 Fix typo 2025-03-22 18:24:16 +01:00
Sylvia van Os
da3eaf36f1 Release Catima 2.34.5 2025-03-22 18:18:24 +01:00
Sylvia van Os
0458c501c8 Merge pull request #2394 from CatimaLoyalty/create-pull-request/patch-1742235107
Update Fastlane changelogs
2025-03-17 19:12:06 +01:00
TheLastProject
632ef8b3a8 Update Fastlane changelogs 2025-03-17 18:11:47 +00:00
Sylvia van Os
40e5014cc6 Update changelog 2025-03-17 19:11:31 +01:00
Sylvia van Os
ba09eb4ca3 Merge pull request #2393 from CatimaLoyalty/fix/2317
Support pkpass files without any extra data
2025-03-17 19:10:57 +01:00
Sylvia van Os
2c77dcadb5 Support pkpass files without any extra data
Previously, the code assumed one of "boardingPass", "coupon", "eventTicket", "generic" existed and refused to pass a pkpass file without any of them
2025-03-17 18:37:28 +01:00
Sylvia van Os
99eaaebf1c Merge pull request #2392 from CatimaLoyalty/bump/tests_35
Run tests on API 35
2025-03-16 18:41:22 +01:00
Sylvia van Os
f2e77cdf09 Run tests on API 35 2025-03-16 18:31:53 +01:00
Sylvia van Os
8f00b17315 Merge pull request #2391 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-16 00:50:42 +01:00
Fajar Shiddiq
3a17756532 Translated using Weblate (Indonesian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2025-03-16 00:41:45 +01:00
Sylvia van Os
cff3fff971 Merge pull request #2390 from CatimaLoyalty/create-pull-request/patch-1741987875
Update Fastlane changelogs
2025-03-14 22:32:17 +01:00
TheLastProject
2763635f17 Update Fastlane changelogs 2025-03-14 21:31:14 +00:00
Sylvia van Os
1dd1a1273f Update CHANGELOG 2025-03-14 22:31:01 +01:00
Sylvia van Os
3f5b953c16 Merge pull request #2388 from CatimaLoyalty/create-pull-request/patch-1741984134
Update Fastlane changelogs
2025-03-14 22:30:47 +01:00
Sylvia van Os
1539d88d78 Merge pull request #2389 from CatimaLoyalty/fix/pkpassCrash
Fix pkpass reading crashing Catima
2025-03-14 22:30:11 +01:00
Sylvia van Os
91ee846054 Fix pkpass reading crashing Catima 2025-03-14 22:09:04 +01:00
TheLastProject
c5cecee7b1 Update Fastlane changelogs 2025-03-14 20:28:54 +00:00
Sylvia van Os
1e0a52d780 Update CHANGELOG 2025-03-14 21:28:40 +01:00
Sylvia van Os
0792bb1407 Merge pull request #2378 from CatimaLoyalty/feature/android15
Target Android 15
2025-03-14 21:26:58 +01:00
Sylvia van Os
6e9a05389a Merge pull request #2384 from CatimaLoyalty/dependabot/github_actions/peter-evans/create-pull-request-7.0.8
Bump peter-evans/create-pull-request from 7.0.7 to 7.0.8
2025-03-10 12:11:59 +01:00
dependabot[bot]
68833a7ff1 Bump peter-evans/create-pull-request from 7.0.7 to 7.0.8
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.7 to 7.0.8.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v7.0.7...v7.0.8)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 02:58:22 +00:00
Sylvia van Os
cc7553850a Target Android 15
We apply window insets to basically not draw behind the top and bottom
bar. While this is a slight visual downgrade (we used to draw behind the
top bar before), it at least allows us to target Android 15.
2025-03-09 16:51:06 +01:00
Sylvia van Os
e66277d665 Merge pull request #2382 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-09 12:06:50 +01:00
Sylvia van Os
caea63ea32 Merge pull request #2383 from CatimaLoyalty/create-pull-request/patch-1741493688
Update contributors
2025-03-09 09:55:44 +01:00
TheLastProject
1761465532 Update contributors 2025-03-09 04:14:48 +00:00
Pixiii
8218cc63c7 Translated using Weblate (Lithuanian)
Currently translated at 93.3% (311 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2025-03-08 18:30:12 +01:00
Sylvia van Os
c2ff763311 Merge pull request #2375 from CatimaLoyalty/create-pull-request/patch-1741191680
Update locales
2025-03-07 20:07:08 +01:00
Sylvia van Os
813287a657 Merge pull request #2376 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-07 20:06:47 +01:00
Fjuro
66c3046c4d Translated using Weblate (Czech)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-03-07 04:06:57 +01:00
ssantos
acbdf79d79 Translated using Weblate (Portuguese)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-03-07 04:06:57 +01:00
Sylvia van Os
ade3db0902 Merge pull request #2372 from CatimaLoyalty/dependabot/gradle/com.android.application-8.9.0
Bump com.android.application from 8.8.2 to 8.9.0
2025-03-05 18:31:24 +01:00
TheLastProject
d66066c195 Update locales 2025-03-05 16:21:19 +00:00
Sylvia van Os
0a222ca16a Merge pull request #2374 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-05 17:21:02 +01:00
ssantos
48fa369dc3 Added translation using Weblate (Portuguese) 2025-03-05 14:36:53 +00:00
ssantos
9e861b1b10 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-03-05 14:36:52 +00:00
dependabot[bot]
6b7926ecde Bump com.android.application from 8.8.2 to 8.9.0
Bumps com.android.application from 8.8.2 to 8.9.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-05 02:09:02 +00:00
Sylvia van Os
ccd6e12547 Merge pull request #2371 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-03-04 18:37:02 +01:00
Balázs Meskó
c869104e82 Translated using Weblate (Hungarian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2025-03-04 17:09:09 +01:00
Sylvia van Os
f430d3071b Merge pull request #2369 from CatimaLoyalty/dependabot/github_actions/peter-evans/create-pull-request-7.0.7
Bump peter-evans/create-pull-request from 7.0.6 to 7.0.7
2025-03-03 07:09:21 +01:00
dependabot[bot]
26460753a6 Bump peter-evans/create-pull-request from 7.0.6 to 7.0.7
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.6 to 7.0.7.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v7.0.6...v7.0.7)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-03 02:30:19 +00:00
Sylvia van Os
2653c7aea3 Merge pull request #2367 from CatimaLoyalty/create-pull-request/patch-1740889044
Update contributors
2025-03-02 13:31:55 +01:00
juuce79
1a892b2de3 Kotlin conversion of AboutActivity with tests also in Kotlin (#2360) 2025-03-02 13:30:10 +01:00
TheLastProject
a9e9ee511d Update contributors 2025-03-02 04:17:23 +00:00
Sylvia van Os
7719a2d3fd Merge pull request #2365 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-28 18:50:07 +01:00
Ricky Tigg
84a6202db1 Translated using Weblate (Finnish)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2025-02-28 12:51:42 +00:00
Sylvia van Os
4d8a4fbd6a Merge pull request #2364 from CatimaLoyalty/dependabot/gradle/com.android.application-8.8.2
Bump com.android.application from 8.8.1 to 8.8.2
2025-02-28 07:56:59 +01:00
dependabot[bot]
d556e7e0a2 Bump com.android.application from 8.8.1 to 8.8.2
Bumps com.android.application from 8.8.1 to 8.8.2.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-28 02:32:30 +00:00
Sylvia van Os
5f039c5c3f Merge pull request #2362 from CatimaLoyalty/dependabot/gradle/androidx.constraintlayout-constraintlayout-2.2.1
Bump androidx.constraintlayout:constraintlayout from 2.2.0 to 2.2.1
2025-02-27 08:14:49 +01:00
dependabot[bot]
5bf69db296 Bump androidx.constraintlayout:constraintlayout from 2.2.0 to 2.2.1
Bumps androidx.constraintlayout:constraintlayout from 2.2.0 to 2.2.1.

---
updated-dependencies:
- dependency-name: androidx.constraintlayout:constraintlayout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-27 07:03:05 +00:00
Sylvia van Os
f20cac5d85 Merge pull request #2361 from CatimaLoyalty/dependabot/gradle/androidx.exifinterface-exifinterface-1.4.0
Bump androidx.exifinterface:exifinterface from 1.3.7 to 1.4.0
2025-02-27 08:02:08 +01:00
dependabot[bot]
69976289ca Bump androidx.exifinterface:exifinterface from 1.3.7 to 1.4.0
Bumps androidx.exifinterface:exifinterface from 1.3.7 to 1.4.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-27 02:13:51 +00:00
Sylvia van Os
8b30f92dfd Merge pull request #2359 from CatimaLoyalty/create-pull-request/patch-1740551110
Update Gradle to 8.13
2025-02-26 19:03:36 +01:00
Sylvia van Os
477c70a8e5 Merge pull request #2358 from CatimaLoyalty/dependabot/gradle/com.android.tools-desugar_jdk_libs-2.1.5
Bump com.android.tools:desugar_jdk_libs from 2.1.4 to 2.1.5
2025-02-26 08:34:30 +01:00
TheLastProject
2e9d1a41f6 Update Gradle to 8.13 2025-02-26 06:25:09 +00:00
dependabot[bot]
ff617036c7 Bump com.android.tools:desugar_jdk_libs from 2.1.4 to 2.1.5
Bumps [com.android.tools:desugar_jdk_libs](https://github.com/google/desugar_jdk_libs) from 2.1.4 to 2.1.5.
- [Changelog](https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/desugar_jdk_libs/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-26 02:16:31 +00:00
Sylvia van Os
2b4e8b1f8b Merge pull request #2357 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-25 16:56:33 +01:00
Priit Jõerüüt
7bcbdd8358 Translated using Weblate (Estonian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-02-25 16:29:26 +01:00
Sylvia van Os
45c212c5cc Merge pull request #2356 from CatimaLoyalty/dependabot/github_actions/actions/upload-artifact-4.6.1
Bump actions/upload-artifact from 4.6.0 to 4.6.1
2025-02-24 08:14:07 +01:00
dependabot[bot]
00d7b5e231 Bump actions/upload-artifact from 4.6.0 to 4.6.1
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.0 to 4.6.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4.6.0...v4.6.1)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 02:57:08 +00:00
Sylvia van Os
0314d49b77 Merge pull request #2355 from CatimaLoyalty/create-pull-request/patch-1740284254
Update contributors
2025-02-23 09:09:05 +01:00
TheLastProject
6335b731df Update contributors 2025-02-23 04:17:34 +00:00
Sylvia van Os
c248d1e84c Merge pull request #2354 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-22 09:06:29 +01:00
தமிழ்நேரம்
94de9829b9 Translated using Weblate (Tamil)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2025-02-22 00:40:54 +00:00
Edgars Andersons
0448efd04c Translated using Weblate (Latvian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-02-22 00:40:54 +00:00
Sylvia van Os
21f4b9b5cf Merge pull request #2352 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-17 17:11:47 +01:00
Trond Kjetil Bremnes
01a30db52e Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2025-02-17 15:18:34 +00:00
Sylvia van Os
01ed9bd30f Merge pull request #2347 from CatimaLoyalty/dependabot/gradle/com.android.application-8.8.1
Bump com.android.application from 8.8.0 to 8.8.1
2025-02-14 08:32:51 +01:00
dependabot[bot]
583edb53d9 Bump com.android.application from 8.8.0 to 8.8.1
Bumps com.android.application from 8.8.0 to 8.8.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-14 02:50:40 +00:00
Sylvia van Os
f51cc70d8e Merge pull request #2346 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-13 19:09:14 +01:00
zedsansor
539d05a603 Translated using Weblate (Persian)
Currently translated at 45.0% (150 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-02-12 21:01:59 +01:00
Sylvia van Os
906162ebb4 Merge pull request #2343 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-11 20:02:28 +01:00
Lari Tanase
b06203dc8a Translated using Weblate (Romanian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2025-02-11 17:02:20 +00:00
Sylvia van Os
6aec4b93ff Merge pull request #2341 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-10 19:49:28 +01:00
Mahan Khalili
3ea6f64021 Translated using Weblate (Persian)
Currently translated at 37.5% (125 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fa/
2025-02-10 16:02:02 +00:00
Lari Tanase
51fb01b190 Translated using Weblate (Romanian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2025-02-10 16:02:01 +00:00
dicaeffe
01b23109ae Translated using Weblate (Italian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2025-02-10 16:02:00 +00:00
Sylvia van Os
4e291b58d3 Merge pull request #2339 from CatimaLoyalty/create-pull-request/patch-1739074637
Update contributors
2025-02-09 11:45:49 +01:00
TheLastProject
1689cf1026 Update contributors 2025-02-09 04:17:17 +00:00
Sylvia van Os
a55ce2c952 Merge pull request #2338 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-06 18:58:05 +01:00
이정희
d2ff17a90e Translated using Weblate (Italian)
Currently translated at 81.9% (118 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2025-02-06 16:02:42 +00:00
Odoamar
70c446e88d Translated using Weblate (Polish)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2025-02-06 16:02:41 +00:00
Sylvia van Os
0d6dc40da5 Merge pull request #2334 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-02-03 20:43:41 +01:00
Hosted Weblate
a4f3a81d58 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/
2025-02-03 20:02:48 +01:00
Priit Jõerüüt
c64f75ffe4 Translated using Weblate (Estonian)
Currently translated at 10.4% (15 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/et/
2025-02-03 20:02:48 +01:00
Ricky Tigg
0fdb6ee567 Translated using Weblate (Finnish)
Currently translated at 99.6% (332 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2025-02-03 20:02:47 +01:00
이정희
9aa40fc88c Translated using Weblate (Korean)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2025-02-03 20:02:46 +01:00
Sylvia van Os
4f4c0171c0 Translated using Weblate (Hebrew (Israel))
Currently translated at 29.4% (98 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2025-02-03 20:02:45 +01:00
Anonymous
e4644b3eb7 Translated using Weblate (Hebrew (Israel))
Currently translated at 29.4% (98 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2025-02-03 20:02:44 +01:00
Sylvia van Os
999cf241f8 Merge pull request #2331 from CatimaLoyalty/dependabot/github_actions/actions/setup-python-5.4.0
Bump actions/setup-python from 5.3.0 to 5.4.0
2025-02-03 19:30:38 +01:00
dependabot[bot]
42b964a324 Bump actions/setup-python from 5.3.0 to 5.4.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.3.0 to 5.4.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.3.0...v5.4.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-03 02:47:52 +00:00
Sylvia van Os
1262bfd502 Merge pull request #2329 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-31 20:29:52 +01:00
Bruno Fragoso
81fe561678 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-01-31 18:07:38 +01:00
polarwood
9cb989155d Translated using Weblate (Turkish)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-01-31 18:07:38 +01:00
Fermín Etcheverry
59587f4a40 Translated using Weblate (Spanish)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2025-01-31 18:07:38 +01:00
Sylvia van Os
4dc0d4cd24 Merge pull request #2326 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-29 18:00:50 +01:00
Ricky Tigg
89598be72e Translated using Weblate (Finnish)
Currently translated at 4.1% (6 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fi/
2025-01-29 16:03:18 +01:00
Sylvia van Os
1d2359f295 Merge pull request #2324 from CatimaLoyalty/dependabot/gradle/org.jetbrains.kotlin.android-2.1.10
Bump org.jetbrains.kotlin.android from 2.1.0 to 2.1.10
2025-01-28 10:21:53 +01:00
dependabot[bot]
026984920b Bump org.jetbrains.kotlin.android from 2.1.0 to 2.1.10
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 2.1.0 to 2.1.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.1.0...v2.1.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-28 02:50:47 +00:00
Sylvia van Os
03ed289ef9 Merge pull request #2319 from CatimaLoyalty/create-pull-request/patch-1737865002
Update contributors
2025-01-26 10:10:23 +01:00
TheLastProject
0ccbeb42dd Update contributors 2025-01-26 04:16:42 +00:00
Sylvia van Os
3f9b772a11 Merge pull request #2316 from CatimaLoyalty/create-pull-request/patch-1737786088
Update Gradle to 8.12.1
2025-01-25 13:33:46 +01:00
TheLastProject
e97c9de471 Update Gradle to 8.12.1 2025-01-25 06:21:27 +00:00
Sylvia van Os
872db6b966 Merge pull request #2315 from CatimaLoyalty/create-pull-request/patch-1737497854
Update feature graphic
2025-01-22 21:46:40 +01:00
Sylvia van Os
724d036df9 Merge pull request #2314 from CatimaLoyalty/fix/imagemagick
Fix feature graphic generation
2025-01-21 23:27:02 +01:00
TheLastProject
fc98e6651a Update feature graphic 2025-01-21 22:17:33 +00:00
Sylvia van Os
a70e4aa7a7 Fix feature graphic generation 2025-01-21 23:14:30 +01:00
Sylvia van Os
d542be322c Merge pull request #2312 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-21 23:05:55 +01:00
Sylvia van Os
d5a977c5b0 Translated using Weblate (Catalan)
Currently translated at 4.1% (6 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ca/
2025-01-21 22:54:35 +01:00
mrestivill
bac9199974 Translated using Weblate (Catalan)
Currently translated at 3.4% (5 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ca/
2025-01-21 22:19:26 +01:00
mrestivill
bb92ec2291 Translated using Weblate (Catalan)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/ca/
2025-01-21 22:19:25 +01:00
mrestivill
b155f45b01 Translated using Weblate (Catalan)
Currently translated at 81.9% (273 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2025-01-21 22:19:24 +01:00
Milo Ivir
b2f79f836b Translated using Weblate (Croatian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2025-01-21 22:19:24 +01:00
ikanakova
9ba7e4a92b Translated using Weblate (Czech)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-01-21 22:19:23 +01:00
Sylvia van Os
28088beb72 Merge pull request #2311 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-20 22:21:27 +01:00
reimu105
25351f4138 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2025-01-20 02:51:26 +00:00
B o d o
1ac4db8641 Translated using Weblate (German)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-01-20 02:51:26 +00:00
J. Lavoie
5cee4ef497 Translated using Weblate (French)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-01-20 02:51:25 +00:00
Sylvia van Os
b323c2e5cd Merge pull request #2310 from CatimaLoyalty/create-pull-request/patch-1737260228
Update contributors
2025-01-19 09:52:14 +01:00
TheLastProject
66be4a8c18 Update contributors 2025-01-19 04:17:08 +00:00
Sylvia van Os
dd2bd294ba Merge pull request #2308 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-18 13:02:13 +01:00
Edgars Andersons
e4db1e931a Translated using Weblate (Latvian)
Currently translated at 6.9% (10 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-01-18 11:45:31 +00:00
Edgars Andersons
f8b3e9c65b Translated using Weblate (Latvian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-01-18 11:45:31 +00:00
reimu105
880a596621 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 87.5% (126 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2025-01-18 11:45:30 +00:00
reimu105
9903b4d955 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2025-01-18 11:45:29 +00:00
大王叫我来巡山
40bc87c772 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-01-18 11:45:28 +00:00
Максим Горпиніч
586642c6f6 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-01-18 11:45:28 +00:00
solokot
f3847a4a2b Translated using Weblate (Russian)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-01-18 11:45:27 +00:00
B o d o
63352c310e Translated using Weblate (German)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-01-18 11:45:27 +00:00
Sylvia van Os
e7aac163c2 Release Catima 2.34.4 2025-01-17 19:23:43 +01:00
Sylvia van Os
5a3d61d8f0 Merge pull request #2306 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-17 19:20:18 +01:00
Sylvia van Os
33ba81d3b0 Translated using Weblate (Dutch)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-01-17 19:08:14 +01:00
josé m
6a0956181d Translated using Weblate (Galician)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-01-17 19:03:59 +01:00
Priit Jõerüüt
aca7d3bd9c Translated using Weblate (Estonian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-01-17 19:03:59 +01:00
109247019824
e3e8378f8e Translated using Weblate (Bulgarian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-01-17 19:03:59 +01:00
大王叫我来巡山
61d235b497 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-01-17 19:03:59 +01:00
大王叫我来巡山
e069d7a956 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-01-17 19:03:59 +01:00
ikanakova
3d8806e38c Translated using Weblate (Czech)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-01-17 19:03:59 +01:00
Максим Горпиніч
650da3bd6a Translated using Weblate (Ukrainian)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-01-17 19:03:59 +01:00
solokot
26b7cece35 Translated using Weblate (Russian)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-01-17 19:03:59 +01:00
B o d o
1d3da4d1d1 Translated using Weblate (German)
Currently translated at 100.0% (144 of 144 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-01-17 19:03:59 +01:00
Максим Горпиніч
bc3aeed090 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-01-17 19:03:59 +01:00
solokot
6606eeb9a7 Translated using Weblate (Russian)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-01-17 19:03:59 +01:00
Vasilis K
2401a3f8bf Translated using Weblate (Greek)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-01-17 19:03:59 +01:00
B o d o
b3685c0c7e Translated using Weblate (German)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-01-17 19:03:59 +01:00
ikanakova
868315948e Translated using Weblate (Czech)
Currently translated at 100.0% (333 of 333 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-01-17 19:03:59 +01:00
Sylvia van Os
19a68719fe Merge pull request #2305 from CatimaLoyalty/create-pull-request/patch-1737136973
Update Fastlane changelogs
2025-01-17 19:03:12 +01:00
TheLastProject
92570ec75c Update Fastlane changelogs 2025-01-17 18:02:53 +00:00
Sylvia van Os
573817f81d Update CHANGELOG 2025-01-17 19:02:39 +01:00
Sylvia van Os
21da1fed85 Merge pull request #2304 from CatimaLoyalty/fix/15_no_e2e
Revert to targeting Android 14
2025-01-17 19:02:05 +01:00
Sylvia van Os
c23527eb82 Revert to targeting Android 14
This reverts commit ff08dbe5d5.

I tried keeping the target at Android 15 and opting out of edge-to-edge
enforcement, but this is not a true compatibility mode and broke the
multi-selection UI in the main activity.
2025-01-17 18:38:57 +01:00
Sylvia van Os
926b9e0822 Merge pull request #2302 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-17 17:34:14 +01:00
Sebastian
d32a0b698d Translated using Weblate (Danish)
Currently translated at 56.0% (186 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/da/
2025-01-17 00:11:07 +00:00
Sylvia van Os
47bf18f219 Merge pull request #2298 from CatimaLoyalty/create-pull-request/patch-1736974941
Update Fastlane changelogs
2025-01-15 22:02:57 +01:00
TheLastProject
91096c5839 Update Fastlane changelogs 2025-01-15 21:02:20 +00:00
Sylvia van Os
477c16360e Update CHANGELOG 2025-01-15 22:02:06 +01:00
Christos Tsingiropoylos
9a1d7d2e44 Sort by valid from date (#2297) 2025-01-15 22:01:25 +01:00
Sylvia van Os
be54c50786 Release Catima 2.34.3 2025-01-15 17:50:02 +01:00
Sylvia van Os
2624924f53 Merge pull request #2295 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-15 17:47:42 +01:00
Priit Jõerüüt
724552eaa3 Translated using Weblate (Estonian)
Currently translated at 7.6% (11 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/et/
2025-01-15 08:51:45 +01:00
Edgars Andersons
bef0d70d09 Translated using Weblate (Latvian)
Currently translated at 6.2% (9 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-01-15 08:51:45 +01:00
大王叫我来巡山
d7201f62ab Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-01-15 08:51:45 +01:00
Максим Горпиніч
1f229980b7 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-01-15 08:51:44 +01:00
solokot
8f08b1989b Translated using Weblate (Russian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-01-15 08:51:44 +01:00
Kachelkaiser
e3c83c0cb0 Translated using Weblate (German)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-01-15 08:51:44 +01:00
Sylvia van Os
431e380f5e Merge pull request #2294 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-14 17:15:43 +01:00
josé m
5c7b102e08 Translated using Weblate (Galician)
Currently translated at 10.4% (15 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/gl/
2025-01-14 07:11:44 +01:00
B o d o
6dc1a1b196 Translated using Weblate (German)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-01-14 07:11:44 +01:00
Sylvia van Os
6c01d2ffa9 Merge pull request #2291 from CatimaLoyalty/dependabot/github_actions/actions/upload-artifact-4.6.0
Bump actions/upload-artifact from 4.5.0 to 4.6.0
2025-01-13 18:58:47 +01:00
dependabot[bot]
3156fd6daf Bump actions/upload-artifact from 4.5.0 to 4.6.0
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.5.0 to 4.6.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4.5.0...v4.6.0)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 02:20:56 +00:00
Sylvia van Os
6fa4ab3e3b Add Contributor Covenant Code of Conduct 2025-01-12 11:54:15 +01:00
Sylvia van Os
9fa67b59c7 Merge pull request #2290 from CatimaLoyalty/create-pull-request/patch-1736655501
Update contributors
2025-01-12 10:34:20 +01:00
TheLastProject
0935a17fec Update contributors 2025-01-12 04:18:21 +00:00
Sylvia van Os
5fdc575485 Merge pull request #2289 from CatimaLoyalty/hack/espass_as_pkpass
Add unofficial support for espass
2025-01-11 12:50:06 +01:00
Sylvia van Os
d6bbd16945 Add unofficial support for espass
While espass files aren't pkpass files, they are so similar we can
generally parse them fine with the pkpass parser. While this feature
shouldn't be advertised as it is kinda hacky, it does make it easier for
PassAndroid users to share cards with Catima users.
2025-01-11 12:38:03 +01:00
Sylvia van Os
1110f7ee99 Merge pull request #2288 from CatimaLoyalty/create-pull-request/patch-1736595116
Update Fastlane changelogs
2025-01-11 12:32:10 +01:00
TheLastProject
d64860a34e Update Fastlane changelogs 2025-01-11 11:31:56 +00:00
Sylvia van Os
9fb0da6954 Update CHANGELOG 2025-01-11 12:31:43 +01:00
Sylvia van Os
12b0f8806b Merge pull request #2286 from CatimaLoyalty/fix/add_secondary_pkpass_mimetype
Also parse application/vnd-com.apple.pkpass as pkpass files
2025-01-11 12:30:52 +01:00
Sylvia van Os
5c5a1df39d Also parse application/vnd-com.apple.pkpass as pkpass files 2025-01-11 12:19:48 +01:00
Sylvia van Os
5b0ac65fbe Merge pull request #2217 from CatimaLoyalty/dependabot/gradle/androidx.core-core-ktx-1.15.0
Bump androidx.core:core-ktx from 1.13.1 to 1.15.0
2025-01-11 11:40:24 +01:00
dependabot[bot]
e9b542ee6e Bump androidx.core:core-ktx from 1.13.1 to 1.15.0
Bumps androidx.core:core-ktx from 1.13.1 to 1.15.0.

---
updated-dependencies:
- dependency-name: androidx.core:core-ktx
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-11 10:07:38 +00:00
Sylvia van Os
ae6bf5e8f6 Merge pull request #2285 from CatimaLoyalty/fix/bumpCompileSdk
Bump compile SDK
2025-01-11 11:06:40 +01:00
Sylvia van Os
4dc564ffcf Bump AGP 2025-01-11 10:55:56 +01:00
Sylvia van Os
49a9ef2f80 Bump compile SDK 2025-01-11 10:44:23 +01:00
Sylvia van Os
1907f482eb Merge pull request #2277 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-10 20:02:52 +01:00
Sylvia van Os
08aad7ce20 Merge pull request #2275 from CatimaLoyalty/dependabot/gradle/com.android.application-8.8.0
Bump com.android.application from 8.7.3 to 8.8.0
2025-01-10 19:28:48 +01:00
josé m
f555a160d5 Translated using Weblate (Galician)
Currently translated at 9.7% (14 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/gl/
2025-01-10 07:31:36 +01:00
Максим Горпиніч
2d9b7f358e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-01-10 07:31:36 +01:00
solokot
db396b5f21 Translated using Weblate (Russian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-01-10 07:31:34 +01:00
B o d o
018d36c3fd Translated using Weblate (German)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-01-10 07:31:31 +01:00
dependabot[bot]
e6621244b8 Bump com.android.application from 8.7.3 to 8.8.0
Bumps com.android.application from 8.7.3 to 8.8.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-10 02:58:19 +00:00
Sylvia van Os
29aef64d97 Merge pull request #2273 from CatimaLoyalty/fix/weblate_conflict_20250109
Fix/weblate conflict 20250109
2025-01-09 18:21:14 +01:00
Edgars Andersons
cbe243feb3 Translated using Weblate (Latvian)
Currently translated at 6.2% (9 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-01-09 17:29:39 +01:00
Joel A
ff02c59f85 Translated using Weblate (Swedish)
Currently translated at 94.8% (315 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2025-01-09 17:29:39 +01:00
大王叫我来巡山
3895bc1f73 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-01-09 17:29:39 +01:00
ikanakova
cd0cce532a Translated using Weblate (Czech)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-01-09 17:29:39 +01:00
Максим Горпиніч
3fdf6693d2 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-01-09 17:29:39 +01:00
solokot
d2be344700 Translated using Weblate (Russian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-01-09 17:29:39 +01:00
B o d o
9bd2898678 Translated using Weblate (German)
Currently translated at 100.0% (143 of 143 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-01-09 17:29:39 +01:00
Sylvia van Os
07f2348a6d Merge pull request #2270 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-08 17:29:55 +01:00
Sylvia van Os
ddd1c1a516 Merge pull request #2269 from CatimaLoyalty/create-pull-request/patch-1736289127
Update Fastlane changelogs
2025-01-07 23:32:20 +01:00
TheLastProject
8de76e3c52 Update Fastlane changelogs 2025-01-07 22:32:07 +00:00
Sylvia van Os
6ea2645e9d Update CHANGELOG 2025-01-07 23:31:40 +01:00
Sylvia van Os
ed166b1b33 Merge pull request #2268 from CatimaLoyalty/fix/incorrectSoftInputModes
Ensure save button stays pressable while keyboard is visible in edit screen
2025-01-07 23:29:59 +01:00
Sylvia van Os
2dd53a5300 Ensure save button stays pressable while keyboard is visible in edit screen
Also cleans up some other unnecessary windowSoftInputMode configurations
left over from years ago
2025-01-07 23:12:11 +01:00
ikanakova
97f9120acf Translated using Weblate (Czech)
Currently translated at 100.0% (142 of 142 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-01-07 19:54:10 +01:00
Sylvia van Os
dd29be75f2 Merge pull request #2266 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-01-07 19:11:39 +01:00
Sylvia van Os
fa87df2ed8 Merge pull request #2267 from CatimaLoyalty/create-pull-request/patch-1736269587
Update Fastlane changelogs
2025-01-07 18:06:56 +01:00
TheLastProject
1fb94de809 Update Fastlane changelogs 2025-01-07 17:06:26 +00:00
Sylvia van Os
0e18e84c8f Update CHANGELOG 2025-01-07 18:06:11 +01:00
Sylvia van Os
0ba2261033 Merge pull request #2263 from CatimaLoyalty/fix/sdk35
Android 15 (SDK 35) support
2025-01-07 18:05:35 +01:00
ikanakova
703ebf9418 Translated using Weblate (Czech)
Currently translated at 100.0% (142 of 142 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-01-07 18:03:24 +01:00
Sylvia van Os
ff08dbe5d5 Android 15 (SDK 35) support 2025-01-04 15:20:07 +01:00
Sylvia van Os
3003a10550 Merge pull request #2261 from CatimaLoyalty/dependabot/github_actions/peter-evans/create-pull-request-7.0.6
Bump peter-evans/create-pull-request from 7.0.5 to 7.0.6
2024-12-30 11:47:11 +01:00
dependabot[bot]
f95be6cc71 Bump peter-evans/create-pull-request from 7.0.5 to 7.0.6
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.5 to 7.0.6.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v7.0.5...v7.0.6)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-30 02:49:57 +00:00
Sylvia van Os
23bc40e630 Merge pull request #2260 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-29 12:26:53 +01:00
Jiri Grönroos
45c47674fb Translated using Weblate (Finnish)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2024-12-29 11:01:14 +00:00
David
cf1d1a8122 Translated using Weblate (French)
Currently translated at 100.0% (142 of 142 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2024-12-29 11:01:13 +00:00
Sylvia van Os
45d2629863 Merge pull request #2259 from CatimaLoyalty/create-pull-request/patch-1735445907
Update contributors
2024-12-29 09:19:29 +01:00
TheLastProject
f6b0736bbf Update contributors 2024-12-29 04:18:27 +00:00
Sylvia van Os
83f9a2bcc9 Release Catima 2.34.2 2024-12-26 19:59:09 +01:00
Sylvia van Os
1b817222f0 Merge pull request #2256 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-26 19:57:45 +01:00
Edgars Andersons
50db796a47 Translated using Weblate (Latvian)
Currently translated at 5.6% (8 of 142 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2024-12-26 19:48:28 +01:00
Doctorredits_here
f2f7fe3151 Translated using Weblate (Indonesian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2024-12-26 19:48:28 +01:00
大王叫我来巡山
90293b90fb Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (142 of 142 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2024-12-26 19:48:27 +01:00
Максим Горпиніч
f1751eaebf Translated using Weblate (Ukrainian)
Currently translated at 100.0% (142 of 142 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2024-12-26 19:48:25 +01:00
solokot
19a3aa0b86 Translated using Weblate (Russian)
Currently translated at 100.0% (142 of 142 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-12-26 19:48:22 +01:00
B o d o
a3b901e357 Translated using Weblate (German)
Currently translated at 100.0% (142 of 142 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-12-26 19:48:19 +01:00
solokot
fbe12cfadc Translated using Weblate (Russian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2024-12-26 19:48:17 +01:00
Sylvia van Os
3ffbf11902 Merge pull request #2255 from CatimaLoyalty/create-pull-request/patch-1735164841
Update Fastlane changelogs
2024-12-25 23:14:22 +01:00
TheLastProject
5c3b32a6ee Update Fastlane changelogs 2024-12-25 22:14:00 +00:00
Sylvia van Os
36267b8255 Update CHANGELOG 2024-12-25 23:13:47 +01:00
Sylvia van Os
668c9b0d76 Merge pull request #2253 from CatimaLoyalty/fix/2249
Improve star and archive display
2024-12-25 23:13:08 +01:00
Sylvia van Os
eebbe6dec8 Improve star and archive display
By improving the icons to all have a small border, they will be visible
on every background and we can severely simplify the code
2024-12-25 21:06:15 +01:00
Sylvia van Os
a84ae51a4f Merge pull request #2251 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-24 15:46:49 +01:00
Peter Dave Hello
bdbb977233 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2024-12-24 15:00:28 +01:00
Sylvia van Os
ac27cc6a1e Merge pull request #2238 from CatimaLoyalty/feature/flavours
Start using flavours
2024-12-24 14:47:29 +01:00
Sylvia van Os
91551bf4e8 Start using flavours
Currently, this just allows us to remove the donation button on Google
Play without using the deprecated installer APIs.

In the future, this should allow us to also release multiple versions of
Catima (for example: WearOS is a commonly requested feature, but this
needs non-free dependencies, which may not be okay to all users).
2024-12-24 14:33:35 +01:00
Sylvia van Os
e8c11debfd Merge pull request #2247 from CatimaLoyalty/dependabot/gradle/com.android.tools-desugar_jdk_libs-2.1.4
Bump com.android.tools:desugar_jdk_libs from 2.1.3 to 2.1.4
2024-12-23 11:46:40 +01:00
Sylvia van Os
e29a1c659f Merge pull request #2246 from CatimaLoyalty/dependabot/github_actions/actions/upload-artifact-4.5.0
Bump actions/upload-artifact from 4.4.3 to 4.5.0
2024-12-23 11:45:31 +01:00
dependabot[bot]
d66bf0e3fd Bump com.android.tools:desugar_jdk_libs from 2.1.3 to 2.1.4
Bumps [com.android.tools:desugar_jdk_libs](https://github.com/google/desugar_jdk_libs) from 2.1.3 to 2.1.4.
- [Changelog](https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/desugar_jdk_libs/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-23 02:16:11 +00:00
dependabot[bot]
172b71dd00 Bump actions/upload-artifact from 4.4.3 to 4.5.0
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.4.3 to 4.5.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4.4.3...v4.5.0)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-23 02:11:36 +00:00
Sylvia van Os
10ce432c97 Merge pull request #2244 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-22 12:55:42 +01:00
Sylvia van Os
3299a8dca3 Merge pull request #2245 from CatimaLoyalty/create-pull-request/patch-1734841042
Update contributors
2024-12-22 11:44:56 +01:00
TheLastProject
5dca8bc5d2 Update contributors 2024-12-22 04:17:21 +00:00
grgergo
1b8f8704f5 Translated using Weblate (Hungarian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2024-12-22 02:38:39 +01:00
Deleted User
64e801311b Translated using Weblate (German)
Currently translated at 100.0% (141 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-12-22 02:38:39 +01:00
Sylvia van Os
da8202b4e1 Merge pull request #2242 from CatimaLoyalty/create-pull-request/patch-1734762145
Update Gradle to 8.12
2024-12-21 21:26:13 +01:00
Sylvia van Os
72d70f1265 Merge pull request #2243 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-21 20:42:01 +01:00
Edgars Andersons
660597e89a Translated using Weblate (Latvian)
Currently translated at 4.9% (7 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2024-12-21 09:00:52 +01:00
Edgars Andersons
4a48ac8797 Translated using Weblate (Latvian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2024-12-21 09:00:51 +01:00
TheLastProject
4c61c19e4f Update Gradle to 8.12 2024-12-21 06:22:24 +00:00
Sylvia van Os
bb3b13364c Merge pull request #2237 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-18 19:18:07 +01:00
Sylvia van Os
b34bb65f79 Translated using Weblate (Tamil)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2024-12-18 19:00:02 +01:00
தமிழ்நேரம்
a7cfb4b68f Translated using Weblate (Tamil)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2024-12-18 16:00:34 +01:00
Trond Kjetil Bremnes
8d58a6192d Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2024-12-18 16:00:33 +01:00
Sylvia van Os
1da34ceda4 Merge pull request #2236 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-17 18:59:58 +01:00
தமிழ்நேரம்
dc31b7e839 Translated using Weblate (Tamil)
Currently translated at 93.9% (312 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2024-12-17 00:00:38 +01:00
Priit Jõerüüt
5c6ee7b787 Translated using Weblate (Estonian)
Currently translated at 4.2% (6 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/et/
2024-12-17 00:00:36 +01:00
Nguyen Duc Tri Thuc
5620a62cad Translated using Weblate (Vietnamese)
Currently translated at 11.3% (16 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/vi/
2024-12-17 00:00:34 +01:00
Sylvia van Os
429abb4914 Merge pull request #2234 from CatimaLoyalty/create-pull-request/patch-1734236299
Update contributors
2024-12-15 09:54:00 +01:00
Sylvia van Os
f90d33daf7 Merge pull request #2235 from CatimaLoyalty/weblate
Weblate
2024-12-15 09:52:55 +01:00
தமிழ்நேரம்
baa67cf9f4 Translated using Weblate (Tamil)
Currently translated at 99.6% (331 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2024-12-15 09:44:55 +01:00
Isard Sabut
4054269db3 Translated using Weblate (Catalan)
Currently translated at 18.9% (63 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2024-12-15 09:44:35 +01:00
Augustin LAVILLE
559b8d00dd Translated using Weblate (French)
Currently translated at 99.2% (140 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2024-12-15 09:44:35 +01:00
Максим Горпиніч
9b9c19586f Translated using Weblate (Ukrainian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2024-12-15 09:44:35 +01:00
Augustin LAVILLE
a3407734a7 Translated using Weblate (French)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2024-12-15 09:44:35 +01:00
TheLastProject
99c579ee51 Update contributors 2024-12-15 04:18:18 +00:00
Sylvia van Os
81bc7db43e Merge pull request #2232 from CatimaLoyalty/create-pull-request/patch-1734181312
Update feature graphic
2024-12-14 14:08:58 +01:00
Sylvia van Os
117e08d957 Merge pull request #2231 from CatimaLoyalty/feature/sans_feature_graphics
Use Sans fonts for app name
2024-12-14 14:08:43 +01:00
TheLastProject
89356dac50 Update feature graphic 2024-12-14 13:01:51 +00:00
Sylvia van Os
c7bf1f5f30 Use Sans fonts for app name
Sans could be "friendlier". This also fixes the new zh-TW picture not
showing up
2024-12-14 13:59:29 +01:00
Sylvia van Os
1a7a2d31f4 Merge pull request #2229 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-14 12:47:04 +01:00
Sylvia van Os
8fd4335a98 Delete invalid translations
Incorrectly formatted XML will crash the app.
2024-12-14 12:07:59 +01:00
தமிழ்நேரம்
6b4b0e846b Translated using Weblate (Tamil)
Currently translated at 99.6% (331 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ta/
2024-12-13 23:02:26 +01:00
josé m
451fa87990 Translated using Weblate (Galician)
Currently translated at 4.2% (6 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/gl/
2024-12-13 23:02:26 +01:00
josé m
2c50c2b48c Translated using Weblate (Galician)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2024-12-13 23:02:26 +01:00
Robin Syl
8b9c26ad5a Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 85.1% (120 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2024-12-13 23:02:26 +01:00
Robin Syl
ef7db55d8c Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.0% (329 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2024-12-13 23:02:26 +01:00
大王叫我来巡山
8f2d39d0ec Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (141 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2024-12-13 23:02:26 +01:00
Maxine Clementine Caulfield
3597e3098f Translated using Weblate (Czech)
Currently translated at 100.0% (141 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2024-12-13 23:02:26 +01:00
solokot
0702fc579c Translated using Weblate (Russian)
Currently translated at 100.0% (141 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-12-13 23:02:26 +01:00
B o d o
017cf19d27 Translated using Weblate (German)
Currently translated at 100.0% (141 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-12-13 23:02:26 +01:00
Dawid
83a3a5b9e2 Translated using Weblate (Polish)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2024-12-13 23:02:26 +01:00
Maxine Clementine Caulfield
54828c3c93 Translated using Weblate (Czech)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2024-12-13 23:02:25 +01:00
Sylvia van Os
31e517d7ee Merge pull request #2227 from CatimaLoyalty/create-pull-request/patch-1734118019
Update locales
2024-12-13 21:43:23 +01:00
TheLastProject
00957ac576 Update locales 2024-12-13 19:26:59 +00:00
Sylvia van Os
852c38d88d Merge pull request #2226 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-13 20:26:44 +01:00
Максим Горпиніч
67314b09a9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (141 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2024-12-12 21:39:09 +01:00
B o d o
944e2ca0c0 Translated using Weblate (German)
Currently translated at 100.0% (141 of 141 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-12-12 21:39:09 +01:00
Dawid
68564864d5 Translated using Weblate (Polish)
Currently translated at 99.6% (331 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2024-12-12 21:39:09 +01:00
Sylvia van Os
19bccc0c82 Release Catima 2.34.1 2024-12-12 17:27:24 +01:00
Sylvia van Os
04905edab4 Merge pull request #2224 from CatimaLoyalty/create-pull-request/patch-1734020723
Update Fastlane changelogs
2024-12-12 17:25:36 +01:00
Sylvia van Os
179a9adbe5 Merge pull request #2222 from CatimaLoyalty/create-pull-request/patch-1734019804
Update locales
2024-12-12 17:25:23 +01:00
TheLastProject
3925a79158 Update Fastlane changelogs 2024-12-12 16:25:22 +00:00
Sylvia van Os
71de6f8c99 Update CHANGELOG 2024-12-12 17:25:07 +01:00
Sylvia van Os
9d81ca5c9b Merge pull request #2223 from CatimaLoyalty/fix/crashOnInvalidPkpassFile
Fix crash when trying to load invalid pkpass file
2024-12-12 17:24:08 +01:00
Sylvia van Os
75c393af92 Fix crash when trying to load invalid pkpass file 2024-12-12 17:13:49 +01:00
TheLastProject
3e16515b6c Update locales 2024-12-12 16:10:04 +00:00
Sylvia van Os
3e9857f14f Merge pull request #2221 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-12 17:09:38 +01:00
தமிழ்நேரம்
20ee7c9324 Added translation using Weblate (Tamil) 2024-12-12 16:29:00 +01:00
Hamza Mohamed
fa6ee155ac Translated using Weblate (Arabic)
Currently translated at 99.6% (331 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2024-12-12 01:01:11 +01:00
goknarbahceli
c186e53eab Translated using Weblate (Turkish)
Currently translated at 70.7% (99 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2024-12-12 01:01:09 +01:00
goknarbahceli
75abd6f80c Translated using Weblate (Turkish)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2024-12-12 01:01:08 +01:00
Sylvia van Os
0a98e6154c Update Fastlane 2024-12-11 17:11:13 +01:00
Sylvia van Os
c2b31fad43 Release Catima 2.34.0 2024-12-10 18:53:36 +01:00
Sylvia van Os
2043dffc10 Merge pull request #2218 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-10 18:52:41 +01:00
Sylvia van Os
244aabcc1a Translated using Weblate (Hindi)
Currently translated at 94.5% (314 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2024-12-10 18:44:54 +01:00
Miguel Mota
a1faed8717 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2024-12-10 18:36:55 +01:00
Arun Arya
fcf9176523 Translated using Weblate (Hindi)
Currently translated at 94.5% (314 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2024-12-10 18:36:55 +01:00
Sylvia van Os
30db9e3cd6 Translated using Weblate (Dutch)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2024-12-10 18:36:55 +01:00
Kamborio
fb3df0ff4d Translated using Weblate (Spanish)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2024-12-10 18:36:54 +01:00
Priit Jõerüüt
9b4b48e6e3 Translated using Weblate (Estonian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2024-12-09 22:01:11 +01:00
Edgars Andersons
9a9cdaff09 Translated using Weblate (Latvian)
Currently translated at 3.5% (5 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2024-12-09 22:01:10 +01:00
Edgars Andersons
3a82efcf6f Translated using Weblate (Latvian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2024-12-09 22:01:10 +01:00
이정희
7c2d08b06f Translated using Weblate (Korean)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ko/
2024-12-09 22:01:09 +01:00
이정희
aebe84c2cd Translated using Weblate (Korean)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2024-12-09 22:01:08 +01:00
solokot
3768f0ebcf Translated using Weblate (Russian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2024-12-09 22:01:07 +01:00
Sylvia van Os
8f7d527c21 Translated using Weblate (Dutch)
Currently translated at 99.3% (330 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2024-12-09 22:01:07 +01:00
Giovanni Donisi
54ec5ee0d0 Translated using Weblate (Italian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2024-12-09 22:01:06 +01:00
Sylvia van Os
dccb244c8f Merge pull request #2216 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-08 21:55:56 +01:00
Asmodeus
a37084af1a Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2024-12-08 21:01:46 +01:00
109247019824
af0a7ae89b Translated using Weblate (Bulgarian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2024-12-08 21:01:45 +01:00
大王叫我来巡山
315cbab4be Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2024-12-08 21:01:44 +01:00
大王叫我来巡山
bc3830d685 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2024-12-08 21:01:43 +01:00
Максим Горпиніч
4893d28bb0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2024-12-08 21:01:42 +01:00
solokot
2a7670e19d Translated using Weblate (Russian)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-12-08 21:01:41 +01:00
Vasilis K
86e6a1bb2d Translated using Weblate (Greek)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2024-12-08 21:01:40 +01:00
Sylvia van Os
d1d3f95dfe Merge pull request #2215 from CatimaLoyalty/create-pull-request/patch-1733631542
Update contributors
2024-12-08 14:51:30 +01:00
TheLastProject
ebfc90e998 Update contributors 2024-12-08 04:19:02 +00:00
Sylvia van Os
704db9eb46 Merge pull request #2214 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-07 20:23:11 +01:00
B o d o
3557870d34 Translated using Weblate (German)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-12-07 18:41:43 +01:00
Sylvia van Os
59354c7251 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2024-12-07 18:41:41 +01:00
B o d o
cae25599f8 Translated using Weblate (German)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2024-12-07 18:41:41 +01:00
109247019824
e89eb46f79 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2024-12-07 18:25:36 +01:00
Максим Горпиніч
039b433d0a Translated using Weblate (Ukrainian)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2024-12-07 18:25:29 +01:00
Vasilis K
0319d16f2b Translated using Weblate (Greek)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2024-12-07 18:25:29 +01:00
Sylvia van Os
f11c45d169 Merge pull request #2213 from CatimaLoyalty/create-pull-request/patch-1733591941
Update Fastlane changelogs
2024-12-07 18:19:24 +01:00
TheLastProject
572c0fea4a Update Fastlane changelogs 2024-12-07 17:19:01 +00:00
Sylvia van Os
5e9d364e5e Update CHANGELOG 2024-12-07 18:18:47 +01:00
Sylvia van Os
57d62fdb29 Merge pull request #2212 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-07 17:44:35 +01:00
summoner001
0c7332396b Translated using Weblate (Hungarian)
Currently translated at 97.8% (322 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2024-12-07 17:36:35 +01:00
Renko
7bdca36f53 Translated using Weblate (Romanian)
Currently translated at 99.0% (326 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2024-12-07 17:36:35 +01:00
Sylvia van Os
f8a8a84f1e Merge pull request #2038 from CatimaLoyalty/feature/pkpass2024
Add Pkpass parser
2024-12-07 17:33:50 +01:00
Sylvia van Os
8009baca26 Remove unnecessary image load from storage calls
The LoyaltyCard object itself loads the images itself
2024-12-07 15:23:07 +01:00
Sylvia van Os
e0786594bc Load images on request
This prevents loading the front and back images when scrolling through
the loyalty card list and should allow scaling to more images/files more
easily
2024-12-07 15:23:07 +01:00
Sylvia van Os
7fe67960bf Move TaskHandler to ViewModel
This should make it possible to properly cancel the running barcode
generation threads on rotation and prevent CPU rising on many rotations.
2024-12-07 15:23:07 +01:00
Sylvia van Os
83fca93649 Use ViewModel to prevent hammering storage
When you turn a LoyaltyCard into a bundle, it writes the files to
storage as it can't otherwise fit in the limited storage size. This
means that, on rotation, you write all images to storage and load them
again. Using a ViewModel prevents that storage hit due to holding it in
memory (as a ViewModel has a longer lifecycle).
2024-12-07 15:23:07 +01:00
Sylvia van Os
96a9850d9c Delete old cache files on startup 2024-12-07 15:23:07 +01:00
Sylvia van Os
1cb9ddecac Support for returning images from PkpassParser 2024-12-07 15:23:07 +01:00
Sylvia van Os
f7697ce8bf Support opening supported barcode files directly 2024-12-07 15:23:07 +01:00
Sylvia van Os
9358348795 Add option to share pkpass file to Catima 2024-12-07 15:23:07 +01:00
Sylvia van Os
711ca1e761 Add option to load pkpass from ScanActivity 2024-12-07 15:23:07 +01:00
Sylvia van Os
8eeff0058b Refactor ScanActivity result code (use ParseResult) 2024-12-07 15:23:07 +01:00
Sylvia van Os
ea456c6d80 Add Pkpass parser 2024-12-07 15:23:05 +01:00
Sylvia van Os
3bdc06b5b4 Merge pull request #2211 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-07 11:53:00 +01:00
inesre
2c9fbfcae8 Translated using Weblate (Spanish)
Currently translated at 47.8% (67 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2024-12-06 23:01:06 +00:00
solokot
e4a28f9fc9 Translated using Weblate (Russian)
Currently translated at 100.0% (329 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2024-12-06 23:01:05 +00:00
Sylvia van Os
630bf14387 Merge pull request #2210 from CatimaLoyalty/fix/transparentThumbnails3
Fix background colour for shortcuts
2024-12-05 19:01:09 +01:00
Sylvia van Os
4dd85f845e Fix background colour for shortcuts 2024-12-05 18:52:27 +01:00
Sylvia van Os
8382d1975b Merge pull request #2209 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-04 17:50:58 +01:00
大王叫我来巡山
4d4cac6a9e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2024-12-04 17:15:30 +01:00
solokot
5bd276a32d Translated using Weblate (Russian)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-12-04 17:15:29 +01:00
Sylvia van Os
e31ad60d32 Merge pull request #2207 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-12-03 21:02:12 +01:00
Nguyen Duc Tri Thuc
f511b29fcb Translated using Weblate (Vietnamese)
Currently translated at 10.7% (15 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/vi/
2024-12-03 19:09:57 +00:00
Nguyen Duc Tri Thuc
158abdb96c Translated using Weblate (Vietnamese)
Currently translated at 100.0% (329 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2024-12-03 19:09:57 +00:00
Sylvia van Os
959f6770dd Translated using Weblate (Latvian)
Currently translated at 100.0% (329 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2024-12-03 19:09:56 +00:00
Максим Горпиніч
c429fef56d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2024-12-03 19:09:55 +00:00
Kachelkaiser
4ce8d293f4 Translated using Weblate (German)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-12-03 19:09:55 +00:00
Edgars Andersons
ef9b28671b Translated using Weblate (Latvian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/lv/
2024-12-03 19:09:54 +00:00
Edgars Andersons
e3afaa1d49 Translated using Weblate (Latvian)
Currently translated at 100.0% (329 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2024-12-03 19:09:54 +00:00
Lassi Määttä
094e6951d0 Translated using Weblate (Finnish)
Currently translated at 3.5% (5 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fi/
2024-12-03 19:09:53 +00:00
Sylvia van Os
73f33e238c Merge pull request #2206 from CatimaLoyalty/dependabot/gradle/com.android.application-8.7.3
Bump com.android.application from 8.7.2 to 8.7.3
2024-12-03 19:59:38 +01:00
Sylvia van Os
d1b8051771 Merge pull request #2205 from CatimaLoyalty/fix/transparentThumbnails2
Make thumbnails in edit view consistent with card view
2024-12-03 16:38:51 +00:00
dependabot[bot]
17fd6db65f Bump com.android.application from 8.7.2 to 8.7.3
Bumps com.android.application from 8.7.2 to 8.7.3.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-03 02:50:05 +00:00
Sylvia van Os
e6345bc2fe Make thumbnails in edit view consistent with card view
Commit 88c1dd1bc6 changed the behaviour of
the background colour of the thumbnails, but the edit view still used
the old behaviour. This creates more consistency.
2024-12-03 00:33:21 +01:00
Sylvia van Os
208b1a2eba Merge pull request #2204 from CatimaLoyalty/dependabot/gradle/com.github.yalantis-ucrop-2.2.10
Bump com.github.yalantis:ucrop from 2.2.9 to 2.2.10
2024-12-02 21:18:36 +00:00
dependabot[bot]
b796425551 Bump com.github.yalantis:ucrop from 2.2.9 to 2.2.10
Bumps [com.github.yalantis:ucrop](https://github.com/Yalantis/uCrop) from 2.2.9 to 2.2.10.
- [Release notes](https://github.com/Yalantis/uCrop/releases)
- [Commits](https://github.com/Yalantis/uCrop/compare/2.2.9...2.2.10)

---
updated-dependencies:
- dependency-name: com.github.yalantis:ucrop
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-02 02:05:16 +00:00
Sylvia van Os
425a9f9a57 Merge pull request #2203 from CatimaLoyalty/create-pull-request/patch-1733026828
Update contributors
2024-12-01 09:51:18 +00:00
TheLastProject
3701c1f2cb Update contributors 2024-12-01 04:20:28 +00:00
Sylvia van Os
7a5233ed1a Merge pull request #2202 from CatimaLoyalty/create-pull-request/patch-1732976710
Update Fastlane changelogs
2024-11-30 15:23:09 +00:00
TheLastProject
5df349c118 Update Fastlane changelogs 2024-11-30 14:25:09 +00:00
Sylvia van Os
f97da3afcb Update CHANGELOG 2024-11-30 15:24:55 +01:00
Sylvia van Os
d997759ccf Merge pull request #2201 from CatimaLoyalty/fix/transparentThumbnails
Use black/white background colour instead of dominant colour for images
2024-11-30 10:34:20 +00:00
Sylvia van Os
5e710ba424 Merge pull request #2200 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-11-29 16:44:03 +00:00
Sylvia van Os
88c1dd1bc6 Use black/white background colour instead of dominant colour for images
This severely reduces the risk of a transparent PNG being put on a
background which is the same colour as the logo
2024-11-29 17:37:03 +01:00
Ricky Tigg
b63fbfa4c6 Translated using Weblate (Finnish)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/fi/
2024-11-29 10:00:45 +01:00
mingyee2
565b441444 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (329 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2024-11-29 10:00:44 +01:00
Greg
6900cf3475 Translated using Weblate (Polish)
Currently translated at 99.6% (328 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2024-11-29 10:00:43 +01:00
Sylvia van Os
2c0c63aad4 Merge pull request #2196 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-11-27 16:44:21 +00:00
Doctorredits_here
b48e6f2437 Translated using Weblate (Indonesian)
Currently translated at 100.0% (329 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2024-11-27 11:00:32 +01:00
Trond Kjetil Bremnes
37b4096713 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (329 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2024-11-27 11:00:31 +01:00
Sylvia van Os
7a0894e4d2 Merge pull request #2194 from CatimaLoyalty/create-pull-request/patch-1732641808
Update feature graphic
2024-11-26 17:30:21 +00:00
TheLastProject
e6f8c29078 Update feature graphic 2024-11-26 17:23:27 +00:00
Sylvia van Os
b1672408c3 Merge pull request #2193 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-11-26 17:22:14 +00:00
josé m
b79f2ae51d Translated using Weblate (Galician)
Currently translated at 2.1% (3 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/gl/
2024-11-26 07:00:57 +01:00
Augustin LAVILLE
2a758d2e57 Translated using Weblate (French)
Currently translated at 98.5% (138 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2024-11-26 07:00:56 +01:00
Sylvia van Os
07def17334 Merge pull request #2189 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-11-24 20:11:40 +00:00
Sylvia van Os
1c3fb47c89 Merge pull request #2190 from CatimaLoyalty/feature/readd-fdroid
Re-add F-Droid
2024-11-24 20:02:41 +00:00
Sylvia van Os
d1e4deb7eb Re-add F-Droid 2024-11-24 20:36:24 +01:00
大王叫我来巡山
ad97571ab0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2024-11-24 20:01:25 +01:00
Максим Горпиніч
4bbf0983c5 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2024-11-24 20:01:25 +01:00
solokot
13e86e5e53 Translated using Weblate (Russian)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-11-24 20:01:24 +01:00
B o d o
454070c346 Translated using Weblate (German)
Currently translated at 100.0% (140 of 140 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-11-24 20:01:24 +01:00
Sylvia van Os
10458d9975 Merge pull request #2188 from CatimaLoyalty/create-pull-request/patch-1732421879
Update contributors
2024-11-24 12:18:59 +00:00
TheLastProject
823c38c50c Update contributors 2024-11-24 04:17:58 +00:00
Sylvia van Os
a593e68ffb Merge pull request #2187 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-11-23 20:38:21 +00:00
Priit Jõerüüt
5ef8cf5381 Translated using Weblate (Estonian)
Currently translated at 2.8% (4 of 139 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/et/
2024-11-23 19:00:38 +01:00
Sebastian
db94d5bc5d Translated using Weblate (Danish)
Currently translated at 39.5% (130 of 329 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/da/
2024-11-23 19:00:37 +01:00
Sylvia van Os
b6fe1bc2a7 Merge pull request #2186 from CatimaLoyalty/create-pull-request/patch-1732292688
Update Fastlane changelogs
2024-11-22 16:25:12 +00:00
TheLastProject
78754ca313 Update Fastlane changelogs 2024-11-22 16:24:48 +00:00
Sylvia van Os
8e8667b721 Update CHANGELOG 2024-11-22 17:24:31 +01:00
Sylvia van Os
40731104cb Merge pull request #2185 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.14.1
Bump org.robolectric:robolectric from 4.14 to 4.14.1
2024-11-22 15:56:32 +00:00
dependabot[bot]
879872202a Bump org.robolectric:robolectric from 4.14 to 4.14.1
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.14 to 4.14.1.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.14...robolectric-4.14.1)

---
updated-dependencies:
- dependency-name: org.robolectric:robolectric
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-22 02:20:08 +00:00
Sylvia van Os
0fcf16d9d2 Merge pull request #2182 from CatimaLoyalty/fix/transparentPdf
Fix parsing PDF with transparent background
2024-11-21 20:27:58 +00:00
Sylvia van Os
23d27ab838 Merge pull request #2184 from CatimaLoyalty/create-pull-request/patch-1732170302
Update Gradle to 8.11.1
2024-11-21 17:56:04 +00:00
TheLastProject
0b4df647d1 Update Gradle to 8.11.1 2024-11-21 06:25:02 +00:00
Sylvia van Os
389372e8f3 Fix parsing PDF with transparent background 2024-11-18 22:03:41 +01:00
1330 changed files with 14082 additions and 15468 deletions

4
.design/README.txt Normal file
View File

@@ -0,0 +1,4 @@
VectorDrawable does not support all SVG features, such as shadows and masks.
Therefore the ic_launcher files are slightly different from the master files: no shadows, minor color tweaks, path optimisation.
Use ic_launcher_*.svg files to generate assets for the app icon
Use master_*.svg files to generate other assets (e.g. feature graphic, playstore icon) or to rework the icon design

View File

@@ -0,0 +1,3 @@
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="108" height="108" fill="#1F4262"/>
</svg>

After

Width:  |  Height:  |  Size: 155 B

View File

@@ -0,0 +1,18 @@
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M45.5 30.5768L68.0526 22.3683C70.1285 21.6127 72.4239 22.6831 73.1795 24.759L75.9156 32.2765L49.6042 41.8531L45.5 30.5768Z" fill="#F5A3A3"/>
<path d="M70.3604 25.785C70.1715 25.2661 69.5977 24.9985 69.0787 25.1874L49.3451 32.3698L51.3973 38.008L72.0705 30.4835L70.3604 25.785ZM75.9156 32.2765L49.6042 41.8531L45.5 30.5768L68.0526 22.3683C70.1285 21.6127 72.4239 22.6831 73.1795 24.759L75.9156 32.2765Z" fill="#CF1717"/>
<path d="M58.4155 30.5767L35.8629 22.3682C33.787 21.6126 31.4916 22.683 30.7361 24.7589L27.9999 32.2764L54.3113 41.853L58.4155 30.5767Z" fill="#F5A3A3"/>
<path d="M33.5551 25.7849C33.744 25.2659 34.3179 24.9984 34.8368 25.1873L54.5704 32.3697L52.5183 38.0078L31.845 30.4834L33.5551 25.7849ZM27.9999 32.2764L54.3113 41.853L58.4155 30.5767L35.8629 22.3682C33.787 21.6126 31.4916 22.683 30.7361 24.7589L27.9999 32.2764Z" fill="#DD1818"/>
<path d="M28.6958 37.5992C29.0794 35.4236 31.1543 33.9709 33.3298 34.3545L80.6006 42.6897C82.7761 43.0734 84.2288 45.148 83.8452 47.3235L81.8157 58.8328C82.2998 59.0988 84.6663 60.1572 87.416 57.2288V57.229C87.9156 56.6942 88.4507 56.2283 89.0068 55.8575C91.764 54.0193 93.9993 55.2156 93.9993 58.5293C93.9992 61.343 92.3876 64.7782 90.2134 66.8763C86.626 70.5423 80.6933 70.5552 79.7524 70.5332L77.5938 82.7766C77.2101 84.9522 75.1355 86.4049 72.96 86.0213L25.6892 77.6861C25.6723 77.6831 25.6555 77.6797 25.6387 77.6765C23.4483 77.3198 22.0001 76.7026 22 76.0003C22 75.7175 22.2348 75.4485 22.6582 75.2046C22.3986 74.5429 22.3121 73.8036 22.4446 73.0523L28.6958 37.5992Z" fill="#B81414"/>
<path d="M90.6707 60.748C90.6707 61.8526 89.9257 63.2447 89.0066 63.8574C88.0876 64.4701 87.3425 64.0714 87.3425 62.9668C87.3425 61.8622 88.0876 60.4701 89.0066 59.8574C89.9257 59.2447 90.6707 59.6434 90.6707 60.748Z" fill="#E82E2E"/>
<path d="M78 30C80.2091 30 82 31.7909 82 34V70C82 72.2091 80.2091 74 78 74H30C25.5817 74 22 74.8954 22 76V32C22 30.8954 25.5817 30 30 30H78Z" fill="#E82E2E"/>
<path d="M51.2008 54.25C51.615 53.5325 52.5324 53.2867 53.2498 53.7009C53.9449 54.1022 54.1973 54.9757 53.8358 55.6822L53.762 55.8178C53.4005 56.5242 53.6529 57.3977 54.3479 57.799C55.043 58.2003 55.9256 57.9821 56.3567 57.3158L56.4372 57.1841C56.8683 56.5178 57.751 56.2997 58.446 56.7009C59.1634 57.1151 59.4092 58.0325 58.995 58.75C57.7524 60.9023 55.0002 61.6397 52.8479 60.3971C50.6956 59.1544 49.9582 56.4023 51.2008 54.25Z" fill="#8A0F0F"/>
<path d="M52.795 54.25C52.3808 53.5325 51.4634 53.2867 50.746 53.7009C50.051 54.1022 49.7986 54.9757 50.1601 55.6822L50.2339 55.8178C50.5954 56.5242 50.343 57.3977 49.6479 57.799C48.9529 58.2003 48.0702 57.9821 47.6392 57.3158L47.5586 57.1841C47.1276 56.5178 46.2449 56.2997 45.5499 56.7009C44.8324 57.1151 44.5866 58.0325 45.0008 58.75C46.2435 60.9023 48.9956 61.6397 51.1479 60.3971C53.3002 59.1544 54.0377 56.4023 52.795 54.25Z" fill="#8A0F0F"/>
<path d="M53.2989 56.75C52.7216 57.75 51.2782 57.75 50.7009 56.75L48.1028 52.25C47.5254 51.25 48.2471 50 49.4018 50L54.598 50C55.7527 50 56.4744 51.25 55.897 52.25L53.2989 56.75Z" fill="#8A0F0F"/>
<path d="M40.4999 40.5C43.7321 40.5 46.4561 42.6167 47.4233 45.5269C47.6845 46.313 47.2592 47.162 46.4731 47.4233C45.687 47.6846 44.8379 47.2592 44.5766 46.4731C43.9982 44.7328 42.3813 43.5 40.4999 43.5C38.6186 43.5 37.0016 44.7328 36.4233 46.4731C36.162 47.2592 35.3129 47.6846 34.5268 47.4233C33.7407 47.162 33.3153 46.313 33.5766 45.5269C34.5438 42.6167 37.2678 40.5 40.4999 40.5Z" fill="#8A0F0F"/>
<path d="M63.4999 40.5C66.7321 40.5 69.4561 42.6167 70.4233 45.5269C70.6845 46.313 70.2592 47.162 69.4731 47.4233C68.687 47.6846 67.8379 47.2592 67.5766 46.4731C66.9982 44.7328 65.3813 43.5 63.4999 43.5C61.6186 43.5 60.0016 44.7328 59.4233 46.4731C59.162 47.2592 58.3129 47.6846 57.5268 47.4233C56.7407 47.162 56.3153 46.313 56.5766 45.5269C57.5438 42.6167 60.2678 40.5 63.4999 40.5Z" fill="#8A0F0F"/>
<path d="M26 55C25.4477 55 25 54.5523 25 54C25 53.4477 25.4477 53 26 53H42C42.5523 53 43 53.4477 43 54C43 54.5523 42.5523 55 42 55H26Z" fill="#8A0F0F"/>
<path d="M26.3511 60.9363C25.834 61.1302 25.2576 60.8682 25.0637 60.3511C24.8698 59.834 25.1318 59.2575 25.6489 59.0636L41.6488 53.0637C42.1659 52.8698 42.7423 53.1318 42.9362 53.6489C43.1302 54.166 42.8681 54.7424 42.351 54.9363L26.3511 60.9363Z" fill="#8A0F0F"/>
<path d="M61.649 54.9364C61.1319 54.7425 60.8699 54.1661 61.0638 53.6489C61.2577 53.1318 61.8341 52.8698 62.3512 53.0637L78.3511 59.0637C78.8682 59.2576 79.1302 59.834 78.9363 60.3511C78.7424 60.8683 78.166 61.1303 77.6489 60.9364L61.649 54.9364Z" fill="#8A0F0F"/>
<path d="M78 55C78.5523 55 79 54.5523 79 54C79 53.4477 78.5523 53 78 53H62C61.4477 53 61 53.4477 61 54C61 54.5523 61.4477 55 62 55H78Z" fill="#8A0F0F"/>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -0,0 +1,10 @@
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M75 31.0001C78.3137 31.0001 81 33.6864 81 37.0001V44.4339C81.8278 45.6739 82.1977 47.2224 81.9185 48.8065L81 54.0147V55.8692C81.2385 55.7207 81.5023 55.5135 81.7856 55.2232L81.864 55.1412C82.3815 54.5878 82.9573 54.0824 83.5825 53.6656L83.7239 53.5736C85.1958 52.6378 87.0298 52.1726 88.6753 53.0533C90.3738 53.9624 90.9907 55.8341 90.9907 57.6305L90.9895 57.7735C90.9384 60.7815 89.2885 64.1632 87.1213 66.2555L87.1211 66.2552C85.2162 68.1795 82.7376 69.0841 80.7588 69.5221C80.6417 69.548 80.5255 69.572 80.4106 69.5951C79.8487 70.7645 78.9192 71.7235 77.7715 72.3223L76.709 78.3509C76.1335 81.6141 73.0215 83.7931 69.7583 83.2179L30.3657 76.2718C30.328 76.2652 30.292 76.2576 30.2576 76.2508C29.124 76.0893 28.0601 75.8434 27.2224 75.4942C26.8046 75.32 26.3313 75.075 25.9299 74.7176C25.538 74.3686 25.0098 73.7183 25.0005 72.7752C25.0005 72.7766 25.0007 72.778 25.0007 72.7794C25.0006 72.7696 25 72.7599 25 72.7501V34.5001C25 33.8368 25.3232 33.2494 25.8203 32.8856C26.2266 32.4885 26.6978 32.2406 27.0352 32.0872C27.6048 31.8283 28.2727 31.6301 28.9683 31.4781C29.7466 31.308 30.6353 31.1794 31.5925 31.0987C31.5854 31.0993 31.5784 31.0998 31.5713 31.1004L32.6726 28.0748L32.7275 27.93C33.9136 24.9114 37.2979 23.3732 40.363 24.4888L52.8337 29.0277L65.3047 24.4888C68.4185 23.3555 71.8617 24.9609 72.9951 28.0748L74.0598 31.0001H75ZM34.8474 73.0001L70.4529 79.2784C71.5406 79.4701 72.5777 78.7437 72.7695 77.6561L73.5906 73.0001H34.8474ZM34 35.0001C32.3461 35.0001 30.8829 35.1543 29.8225 35.3861C29.4849 35.4599 29.2118 35.5362 29 35.6082V69.4718C30.4021 69.1686 32.1493 69.0001 34 69.0001H75L75.103 68.9974C76.1256 68.9455 76.9454 68.1256 76.9973 67.1031L77 67.0001V37.0001C77 35.8955 76.1046 35.0001 75 35.0001H34ZM86.782 56.5904C86.6812 56.5851 86.3996 56.6115 85.8818 56.9412L85.8013 56.9937C85.4702 57.2144 85.1253 57.5101 84.7834 57.8761C84.7824 57.8772 84.7811 57.8783 84.78 57.8795L84.6406 58.025C83.4435 59.2483 82.1848 59.8799 81 60.1214V65.3201C82.1999 64.9382 83.3456 64.358 84.219 63.5015L84.343 63.3775C85.8843 61.8895 86.9907 59.4316 86.9907 57.6305L86.9897 57.5343C86.9769 56.9198 86.8422 56.671 86.782 56.5904ZM46.5574 31.0001L38.9949 28.2476C37.9893 27.8817 36.8807 28.3724 36.469 29.347L36.4314 29.4429L35.8645 31.0001H46.5574ZM69.803 31.0001L69.2363 29.4429C68.8586 28.4051 67.7109 27.8698 66.6729 28.2476L59.1104 31.0001H69.803Z" fill="black"/>
<path d="M55.165 51C56.3197 51.0001 57.0412 52.25 56.4639 53.25L54.6943 56.3145C54.5983 56.7617 54.7947 57.2387 55.2122 57.4797C55.7303 57.7788 56.3927 57.6015 56.6919 57.0835C57.1061 56.3661 58.0235 56.1202 58.741 56.5344C59.4584 56.9487 59.7042 57.8661 59.29 58.5835C58.1625 60.5364 55.6651 61.2054 53.7122 60.0779C53.4495 59.9262 53.2103 59.7495 52.9954 59.553C52.7804 59.7495 52.5414 59.9263 52.2788 60.0779C50.3258 61.2055 47.8283 60.5365 46.7007 58.5835C46.2865 57.8661 46.5324 56.9487 47.2498 56.5344C47.9672 56.1202 48.8846 56.3661 49.2988 57.0835C49.598 57.6016 50.2607 57.7789 50.7788 57.4797C51.2042 57.2341 51.3997 56.7436 51.2905 56.2891L49.5359 53.25C48.9586 52.25 49.6801 51.0001 50.8347 51H55.165Z" fill="black"/>
<path d="M43.2499 42.5C46.0011 42.5 48.4844 44.0694 49.4008 46.4639C49.6968 47.2376 49.3097 48.1048 48.536 48.4009C47.7623 48.697 46.8951 48.3098 46.599 47.5361C46.1806 46.4427 44.9148 45.5 43.2499 45.5C41.5849 45.5 40.3192 46.4427 39.9008 47.5361C39.6047 48.3098 38.7374 48.697 37.9637 48.4009C37.1901 48.1048 36.8029 47.2376 37.099 46.4639C38.0153 44.0694 40.4987 42.5 43.2499 42.5Z" fill="black"/>
<path d="M62.7499 42.5C65.5011 42.5 67.9844 44.0694 68.9008 46.4639C69.1968 47.2376 68.8097 48.1048 68.036 48.4009C67.2623 48.697 66.3951 48.3098 66.099 47.5361C65.6806 46.4427 64.4148 45.5 62.7499 45.5C61.0849 45.5 59.8192 46.4427 59.4008 47.5361C59.1047 48.3098 58.2374 48.697 57.4637 48.4009C56.6901 48.1048 56.3029 47.2376 56.599 46.4639C57.5153 44.0694 59.9987 42.5 62.7499 42.5Z" fill="black"/>
<path d="M33 55C32.1716 55 31.5 54.3284 31.5 53.5C31.5 52.6716 32.1716 52 33 52H44.25C45.0784 52 45.75 52.6716 45.75 53.5C45.75 54.3284 45.0784 55 44.25 55H33Z" fill="black"/>
<path d="M33.6106 59.8701C32.8538 60.2073 31.9671 59.8671 31.6299 59.1104C31.2928 58.3537 31.6329 57.467 32.3896 57.1298L43.6118 52.1298C44.3685 51.7926 45.2553 52.1328 45.5924 52.8895C45.9296 53.6462 45.5894 54.533 44.8327 54.8701L33.6106 59.8701Z" fill="black"/>
<path d="M60.8488 54.8768C60.0885 54.5478 59.7389 53.6647 60.0678 52.9044C60.3968 52.1441 61.2798 51.7945 62.0401 52.1234L73.5957 57.1233C74.356 57.4523 74.7056 58.3353 74.3767 59.0956C74.0477 59.8559 73.1647 60.2056 72.4043 59.8766L60.8488 54.8768Z" fill="black"/>
<path d="M73 52C73.8284 52 74.5 52.6716 74.5 53.5C74.5 54.3284 73.8284 55 73 55H61.5C60.6716 55 60 54.3284 60 53.5C60 52.6716 60.6716 52 61.5 52H73Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

69
.design/master_color.svg Normal file
View File

@@ -0,0 +1,69 @@
<svg width="432" height="432" viewBox="0 0 432 432" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="432" height="432" fill="#1F4262"/>
<g filter="url(#filter0_d_39_7)">
<path d="M182 122.308L272.21 89.4737C280.514 86.4514 289.696 90.7328 292.718 99.0364L303.663 129.107L198.417 167.413L182 122.308Z" fill="#F5A3A3"/>
<path d="M274.263 95.1118C279.452 93.2229 285.191 95.8988 287.08 101.089L295.972 125.521L202.003 159.723L189.69 125.894L274.263 95.1118Z" stroke="#E82E2E" stroke-width="12"/>
</g>
<g filter="url(#filter1_d_39_7)">
<path d="M233.662 122.307L143.452 89.4727C135.148 86.4504 125.966 90.7318 122.944 99.0355L112 129.106L217.245 167.412L233.662 122.307Z" fill="#F5A3A3"/>
<path d="M141.399 95.1109C136.21 93.2219 130.471 95.8978 128.582 101.088L119.69 125.52L213.659 159.722L225.972 125.893L141.399 95.1109Z" stroke="#E82E2E" stroke-width="12"/>
</g>
<g filter="url(#filter2_d_39_7)">
<path d="M114.783 150.397C116.318 141.695 124.617 135.884 133.319 137.419L322.402 170.759C331.104 172.293 336.915 180.592 335.381 189.294L327.263 235.331C329.199 236.395 338.665 240.629 349.664 228.915V228.916C351.663 226.777 353.803 224.913 356.027 223.43C367.056 216.077 375.997 220.862 375.997 234.117C375.997 245.372 369.551 259.113 360.854 267.505C346.504 282.169 322.773 282.222 319.01 282.134L310.375 331.106C308.841 339.809 300.542 345.619 291.84 344.085L102.757 310.745C102.684 310.732 102.611 310.717 102.538 310.703C93.7855 309.276 88 306.809 88 304.001C88 302.87 88.9396 301.794 90.6338 300.818C89.5953 298.172 89.2485 295.215 89.7783 292.21L114.783 150.397Z" fill="#B81414"/>
</g>
<circle cx="8" cy="8" r="8" transform="matrix(0.83205 -0.5547 0 1 349.37 243.867)" fill="#E82E2E"/>
<g filter="url(#filter3_d_39_7)">
<path d="M312 120C320.837 120 328 127.163 328 136V280C328 288.837 320.837 296 312 296H120C102.327 296 88 299.582 88 304V128C88 123.582 102.327 120 120 120H312Z" fill="#E82E2E"/>
</g>
<path d="M230.785 232C227.471 237.74 220.132 239.706 214.392 236.392C208.653 233.079 206.686 225.74 210 220" stroke="#8A0F0F" stroke-width="12" stroke-linecap="round"/>
<path d="M185.2 232C188.513 237.74 195.853 239.706 201.592 236.392C207.332 233.079 209.298 225.74 205.984 220" stroke="#8A0F0F" stroke-width="12" stroke-linecap="round"/>
<path d="M213.196 227C210.887 231 205.113 231 202.804 227L192.412 209C190.102 205 192.989 200 197.608 200L218.392 200C223.011 200 225.898 205 223.588 209L213.196 227Z" fill="#8A0F0F"/>
<path d="M184 184C180.909 174.699 172.227 168 162 168C151.773 168 143.091 174.699 140 184" stroke="#8A0F0F" stroke-width="12" stroke-linecap="round"/>
<path d="M276 184C272.909 174.699 264.227 168 254 168C243.773 168 235.091 174.699 232 184" stroke="#8A0F0F" stroke-width="12" stroke-linecap="round"/>
<path d="M168 216H104" stroke="#8A0F0F" stroke-width="8" stroke-linecap="round"/>
<path d="M168 216L104 240" stroke="#8A0F0F" stroke-width="8" stroke-linecap="round"/>
<path d="M312 240L248 216" stroke="#8A0F0F" stroke-width="8" stroke-linecap="round"/>
<path d="M248 216H312" stroke="#8A0F0F" stroke-width="8" stroke-linecap="round"/>
<defs>
<filter id="filter0_d_39_7" x="166" y="72.5049" width="153.663" height="110.908" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="8"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_39_7"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_39_7" result="shape"/>
</filter>
<filter id="filter1_d_39_7" x="95.9995" y="72.5039" width="153.663" height="110.908" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="8"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_39_7"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_39_7" result="shape"/>
</filter>
<filter id="filter2_d_39_7" x="72" y="121.173" width="319.997" height="239.158" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="8"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_39_7"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_39_7" result="shape"/>
</filter>
<filter id="filter3_d_39_7" x="72" y="104" width="272" height="216" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="8"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_39_7"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_39_7" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@@ -9,10 +9,15 @@ updates:
- mavenCentral
schedule:
interval: "daily"
cooldown:
default-days: 7
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
cooldown:
default-days: 7
# Workaround for https://github.com/dependabot/dependabot-core/issues/6888
registries:

View File

@@ -24,45 +24,47 @@ permissions:
security-events: none
statuses: none
env:
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
JAVA_HOME: /usr/lib/jvm/java-21-openjdk-amd64
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
api-level: [ 21, 34 ]
flavor: [Foss, Gplay]
steps:
- uses: actions/checkout@v4.2.2
- name: Fail on bad translations
run: if grep -ri "&lt;xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
- uses: gradle/actions/wrapper-validation@v4
- name: set up OpenJDK 17
run: |
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk-headless
sudo update-alternatives --auto java
- name: Build
run: ./gradlew assembleRelease
- name: Check lint
run: ./gradlew lintRelease
- name: Run unit tests
run: timeout 5m ./gradlew testReleaseUnitTest || { ./gradlew --stop && timeout 5m ./gradlew testReleaseUnitTest; }
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run instrumented tests
uses: ReactiveCircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-level }}
arch: x86_64
script: ./gradlew connectedCheck
- name: SpotBugs
run: ./gradlew spotbugsRelease
- name: Archive test results
if: always()
uses: actions/upload-artifact@v4.4.3
with:
name: test-results-api${{ matrix.api-level }}
path: app/build/reports
- uses: actions/checkout@v6
- uses: gradle/actions/wrapper-validation@v5
- name: set up OpenJDK 21
run: |
sudo apt-get update
sudo apt-get install -y openjdk-21-jdk-headless
sudo update-alternatives --auto java
- name: Build
run: ./gradlew assemble${{ matrix.flavor }}Release
- name: Check lint
run: ./gradlew lint${{ matrix.flavor }}Release
- name: Run unit tests
run: timeout 5m ./gradlew test${{ matrix.flavor }}ReleaseUnitTest || { ./gradlew --stop && timeout 5m ./gradlew test${{ matrix.flavor }}ReleaseUnitTest; }
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run instrumented tests (API 21)
uses: ReactiveCircus/android-emulator-runner@v2
with:
api-level: 21
arch: x86_64
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
- name: Run instrumented tests (API 35)
uses: ReactiveCircus/android-emulator-runner@v2
with:
api-level: 35
arch: x86_64
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
- name: Archive test results
if: always()
uses: actions/upload-artifact@v5.0.0
with:
name: test-results-flavor${{ matrix.flavor }}
path: app/build/reports

View File

@@ -1,4 +1,5 @@
name: Convert CHANGELOG to Fastlane
on:
workflow_dispatch:
push:
@@ -6,20 +7,11 @@ on:
- main
paths:
- 'CHANGELOG.md'
permissions:
actions: none
checks: none
contents: write
deployments: none
discussions: none
id-token: none
issues: none
packages: none
pages: none
pull-requests: write
repository-projects: none
security-events: none
statuses: none
jobs:
convert_changelog_to_fastlane:
runs-on: ubuntu-latest
@@ -27,15 +19,15 @@ jobs:
steps:
- name: Checkout repo
id: checkout
uses: actions/checkout@v4.2.2
uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v5.3.0
uses: actions/setup-python@v6.1.0
with:
python-version: '3.x'
- name: Run converter script
run: python .scripts/changelog_to_fastlane.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7.0.5
uses: peter-evans/create-pull-request@v7.0.11
with:
title: "Update Fastlane changelogs"
commit-message: "Update Fastlane changelogs"

View File

@@ -1,22 +1,14 @@
name: Write contributors to file
on:
workflow_dispatch:
schedule:
- cron: '3 4 * * 0'
permissions:
actions: none
checks: none
contents: write
deployments: none
discussions: none
id-token: none
issues: none
packages: none
pages: none
pull-requests: write
repository-projects: none
security-events: none
statuses: none
jobs:
contributors_to_file:
runs-on: ubuntu-latest
@@ -25,7 +17,7 @@ jobs:
steps:
- name: Checkout repo
id: checkout
uses: actions/checkout@v4.2.2
uses: actions/checkout@v6
- name: Update contributors
id: update_contributors
uses: TheLastProject/contributors-to-file-action@v3.2.0
@@ -33,7 +25,7 @@ jobs:
file_in_repo: app/src/main/res/raw/contributors.txt
min_commit_count: 5
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7.0.5
uses: peter-evans/create-pull-request@v7.0.11
with:
title: "Update contributors"
commit-message: "Update contributors"

View File

@@ -1,4 +1,5 @@
name: Generate feature graphic
on:
workflow_dispatch:
push:
@@ -7,29 +8,20 @@ on:
paths:
- 'fastlane/**/title.txt'
- '.scripts/generate_feature_graphic/**'
permissions:
actions: none
checks: none
contents: write
deployments: none
discussions: none
id-token: none
issues: none
packages: none
pages: none
pull-requests: write
repository-projects: none
security-events: none
statuses: none
jobs:
generate-feature-graphic:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.2.2
- uses: actions/checkout@v6
- name: Install requirements
run: |
sudo apt-get update
sudo apt-get install optipng mat2
sudo apt-get install inkscape mat2 optipng xvfb
# Install 200 weight versions of relevant Noto (to use for languages not supported by Lexend Deca)
sudo apt-get install fonts-noto-extra fonts-noto-cjk-extra
# Custom fonts
@@ -39,7 +31,7 @@ jobs:
- name: Generate featureGraphic.png for each language
run: .scripts/generate_feature_graphic/generate_feature_graphic.sh
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7.0.5
uses: peter-evans/create-pull-request@v7.0.11
with:
title: "Update feature graphic"
commit-message: "Update feature graphic"

View File

@@ -1,33 +0,0 @@
name: Gradle update
on:
workflow_dispatch:
schedule:
- cron: '3 6 * * *'
permissions:
actions: none
checks: none
contents: write
deployments: none
discussions: none
id-token: none
issues: none
packages: none
pages: none
pull-requests: write
repository-projects: none
security-events: none
statuses: none
jobs:
gradle-update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.2.2
- uses: obfusk/gradle-update-action@v3.0.0
id: gradle-update
- uses: gradle/actions/wrapper-validation@v4
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7.0.5
with:
title: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"
commit-message: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"
branch-suffix: timestamp

34
.github/workflows/i18n-check.yml vendored Normal file
View File

@@ -0,0 +1,34 @@
name: i18n check
on:
workflow_dispatch:
push:
branches:
- main
- staging
- trying
pull_request:
branches:
- main
permissions:
actions: none
checks: none
contents: read
deployments: none
discussions: none
id-token: none
issues: none
packages: none
pages: none
pull-requests: none
repository-projects: none
security-events: none
statuses: none
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Fail on bad translations
run: if grep -ri "&lt;xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
- name: Check app_name consistency
run: bash .scripts/check_app_name.sh

View File

@@ -0,0 +1,19 @@
name: Update Gradle Wrapper
on:
schedule:
- cron: "0 0 * * *"
permissions:
contents: write
pull-requests: write
jobs:
update-gradle-wrapper:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Update Gradle Wrapper
uses: gradle-update/update-gradle-wrapper-action@v2

View File

@@ -1,4 +1,5 @@
name: Update locales
on:
workflow_dispatch:
push:
@@ -7,31 +8,22 @@ on:
paths:
- app/src/main/res/values-*/strings.xml
- app/src/main/res/values/settings.xml
permissions:
actions: none
checks: none
contents: write
deployments: none
discussions: none
id-token: none
issues: none
packages: none
pages: none
pull-requests: write
repository-projects: none
security-events: none
statuses: none
jobs:
update-locales:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.2.2
- uses: actions/checkout@v6
- name: Add new locales
run: .scripts/new-locales.py
- name: Update locales
run: .scripts/locales.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7.0.5
uses: peter-evans/create-pull-request@v7.0.11
with:
title: "Update locales"
commit-message: "Update locales"

3
.gitignore vendored
View File

@@ -25,3 +25,6 @@
/.bundle/
/vendor/bundle
/lib/bundler/man/
# Catima-specific
SHA256SUMS

View File

@@ -0,0 +1,71 @@
#!/bin/bash
set -e
shopt -s lastpipe # Run last command in a pipeline in the current shell.
# Colors
LIGHTCYAN='\033[1;36m'
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Vars
SUCCESS=1
CANONICAL_TITLE="Catima"
ALLOWLIST=("ar" "bn" "fa" "fa-IR" "he-IL" "hi" "hi-IN" "kn" "kn-IN" "ml" "mr" "ta" "ta-IN" "zh-rTW" "zh-TW") # TODO: Link values and fastlane with different codes together
function get_lang() {
LANG_DIRNAME=$(dirname "$FILE" | xargs basename)
LANG=${LANG_DIRNAME#values-} # Fetch lang name
LANG=${LANG#values} # Handle "app/src/main/res/values"
LANG=${LANG:-en} # Default to en
}
# FIXME: This function should use its own variables and return a success/fail status, instead of working on global variables
function check() {
# FIXME: This allows inconsistency between values and fastlane if the app name is not Catima
# When the app name is not Catima, it should still check if title.txt and strings.xml use the same app name (or start)
if echo "${ALLOWLIST[*]}" | grep -w -q "${LANG}" || [[ -z ${APP_NAME} ]]; then
return 0
fi
if [[ ${FILE} == *"title.txt" ]]; then
if [[ ! ${APP_NAME} =~ ^${CANONICAL_TITLE} ]]; then
echo -e "${RED}Error: ${LIGHTCYAN}title in $FILE ($LANG) is ${RED}'$APP_NAME'${LIGHTCYAN}, expected to start with ${GREEN}'$CANONICAL_TITLE'. ${NC}"
SUCCESS=0
fi
else
if [[ ${APP_NAME} != "${CANONICAL_TITLE}" ]]; then
echo -e "${RED}Error: ${LIGHTCYAN}app_name in $FILE ($LANG) is ${RED}'$APP_NAME'${LIGHTCYAN}, expected ${GREEN}'$CANONICAL_TITLE'. ${NC}"
SUCCESS=0
fi
fi
}
# FIXME: This checks all title.txt and strings.xml files separately, but it needs to check if the title.txt and strings.xml match for a language as well
echo -e "${LIGHTCYAN}Checking title.txt's. ${NC}"
find fastlane/metadata/android/* -maxdepth 1 -type f -name "title.txt" | while read -r FILE; do
APP_NAME=$(head -n 1 "$FILE")
get_lang
check
done
echo -e "${LIGHTCYAN}Checking string.xml's. ${NC}"
find app/src/main/res/values* -maxdepth 1 -type f -name "strings.xml" | while read -r FILE; do
# FIXME: This only checks app_name, but there are more strings with Catima inside it
# It should check the original English text for all strings that contain Catima and ensure they use the correct app_name for consistency
APP_NAME=$(grep -oP '<string name="app_name">\K[^<]+' "$FILE" | head -n1)
get_lang
check
done
if [[ $SUCCESS -eq 1 ]]; then
echo -e "\n${GREEN}Success!! All app_name values match the canonical title. ${NC}"
else
echo -e "\n${RED}Unsuccessful!! Some app_name values did not match the canonical titles. ${NC}"
exit 1
fi

View File

@@ -1,44 +0,0 @@
#!/usr/bin/python3
import csv
import json
import msgpack
MSGPACK = "bootstrapdata.msgpack"
OUTFILE = "stocard_stores.csv"
def load(fh):
data = []
for r in msgpack.Unpacker(fh, raw=False):
if r["collection"] == "/loyalty-card-providers/":
d = json.loads(r["data"])
data.append([r["resource_id"], d["name"], d["default_barcode_format"]])
return data
def save(data, output_file=OUTFILE):
with open(output_file, "w") as fh:
writer = csv.writer(fh, lineterminator="\n")
writer.writerow(["_id", "name", "barcodeFormat"])
for row in data:
writer.writerow(row)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(
epilog=f"INPUT_FILE must be a .msgpack or .apk and defaults to {MSGPACK}; "
f"OUTPUT_FILE defaults to {OUTFILE}")
parser.add_argument("input_file", metavar="INPUT_FILE", nargs="?", default=MSGPACK)
parser.add_argument("output_file", metavar="OUTPUT_FILE", nargs="?", default=OUTFILE)
args = parser.parse_args()
if args.input_file.lower().endswith(".apk"):
import zipfile
with zipfile.ZipFile(args.input_file) as zf:
with zf.open(f"assets/{MSGPACK}") as fh:
data = load(fh)
else:
with open(args.input_file, "rb") as fh:
data = load(fh)
save(data, args.output_file)

View File

@@ -1,15 +1,76 @@
<svg width="1024" height="500" viewBox="0 0 1024 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="1024" height="500" fill="#223355"/>
<text fill="white" xml:space="preserve" style="" font-family="Yesteryear" font-size="150" letter-spacing="0em"><tspan x="470.082" y="285.511">Catima
</tspan></text>
<path d="M381.046 147.001L236.3 211.446L276.524 301.79L421.27 237.345L381.046 147.001Z" fill="#F0F0F0" stroke="#C80000" stroke-width="2"/>
<path d="M402.077 219.13L240.07 147L191.984 255.004L353.99 327.135L402.077 219.13Z" fill="#F0F0F0" stroke="#C80000" stroke-width="2"/>
<path d="M437.17 236.241L251.831 183.096L220.071 293.855L405.41 347L437.17 236.241Z" fill="#C80000" stroke="#C80000" stroke-width="6" stroke-linejoin="round"/>
<path d="M412.879 178.633H220.071V293.855H412.879V178.633Z" fill="#FF0000" stroke="#FF0000" stroke-width="6" stroke-linejoin="round"/>
<path d="M221.482 296.217C238.316 296.217 251.963 269.366 251.963 236.244C251.963 203.121 238.316 176.27 221.482 176.27C204.647 176.27 191 203.121 191 236.244C191 269.366 204.647 296.217 221.482 296.217Z" fill="#FF0000" stroke="#FF0000" stroke-width="3.44232" stroke-linejoin="round"/>
<path d="M307.256 250.444C307.256 253.187 306.289 255.842 304.526 257.944C302.763 260.045 300.316 261.458 297.614 261.934C294.913 262.41 292.13 261.92 289.755 260.548C287.379 259.177 285.563 257.012 284.625 254.435" stroke="#F0F0F0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M330.301 254.298C329.363 256.875 327.547 259.04 325.171 260.411C322.796 261.783 320.013 262.273 317.312 261.797C314.61 261.321 312.163 259.908 310.4 257.807C308.637 255.706 307.671 253.05 307.671 250.307" stroke="#F0F0F0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M248.345 225.937L266.818 207.465L285.29 225.937" stroke="#F0F0F0" stroke-width="2"/>
<path d="M329.625 225.937L348.098 207.465L366.571 225.937" stroke="#F0F0F0" stroke-width="2"/>
<text fill="white" xml:space="preserve" style="" font-family="Lexend Deca" font-size="35" font-weight="200" letter-spacing="0em"><tspan x="466" y="340">Loyalty Card Wallet</tspan></text>
<g clip-path="url(#clip0_78_203)">
<path d="M1024 0H0V500H1024V0Z" fill="#1F4262"/>
<text fill="white" xml:space="preserve" style="white-space: pre" font-family="Lexend" font-size="35" letter-spacing="0em"><tspan x="481" y="325">Loyalty Card Wallet</tspan></text>
<text fill="white" xml:space="preserve" style="white-space: pre" font-family="Lobster" font-size="150" letter-spacing="0em"><tspan x="469" y="270">Catima</tspan></text>
<g filter="url(#filter0_d_78_203)">
<path d="M218 156.307L308.21 123.473C316.514 120.45 325.696 124.732 328.718 133.035L339.663 163.106L234.417 201.412L218 156.307Z" fill="#F5A3A3"/>
<path d="M310.263 129.111C315.452 127.222 321.191 129.898 323.08 135.088L331.972 159.52L238.003 193.722L225.69 159.893L310.263 129.111Z" stroke="#E82E2E" stroke-width="12"/>
</g>
<g filter="url(#filter1_d_78_203)">
<path d="M269.662 156.307L179.452 123.473C171.148 120.45 161.966 124.732 158.944 133.035L148 163.106L253.245 201.412L269.662 156.307Z" fill="#F5A3A3"/>
<path d="M177.399 129.111C172.21 127.222 166.471 129.898 164.582 135.088L155.69 159.52L249.659 193.722L261.972 159.893L177.399 129.111Z" stroke="#E82E2E" stroke-width="12"/>
</g>
<g filter="url(#filter2_d_78_203)">
<path d="M150.783 184.396C152.318 175.694 160.617 169.884 169.319 171.418L358.402 204.759C367.104 206.293 372.915 214.592 371.381 223.294L363.263 269.331C365.199 270.395 374.665 274.629 385.664 262.915V262.916C387.662 260.777 389.802 258.913 392.027 257.43C403.056 250.077 411.997 254.862 411.997 268.117C411.997 279.372 405.55 293.113 396.853 301.505C382.504 316.169 358.773 316.221 355.01 316.133L346.375 365.106C344.84 373.809 336.542 379.619 327.84 378.085L138.757 344.744C138.689 344.732 138.622 344.719 138.555 344.706C129.793 343.279 124 340.81 124 338.001C124 336.87 124.939 335.794 126.633 334.818C125.594 332.171 125.248 329.214 125.778 326.209L150.783 184.396Z" fill="#B81414"/>
</g>
<circle cx="8" cy="8" r="8" transform="matrix(0.83205 -0.5547 0 1 385.37 277.867)" fill="#E82E2E"/>
<g filter="url(#filter3_d_78_203)">
<path d="M348 154C356.837 154 364 161.163 364 170V314C364 322.837 356.837 330 348 330H156C138.327 330 124 333.582 124 338V162C124 157.582 138.327 154 156 154H348Z" fill="#E82E2E"/>
</g>
<path d="M266.784 266C263.471 271.74 256.132 273.706 250.392 270.392C244.653 267.079 242.686 259.74 246 254" stroke="#8A0F0F" stroke-width="12" stroke-linecap="round"/>
<path d="M221.2 266C224.514 271.74 231.853 273.706 237.592 270.392C243.332 267.079 245.298 259.74 241.984 254" stroke="#8A0F0F" stroke-width="12" stroke-linecap="round"/>
<path d="M249.196 261C246.887 265 241.113 265 238.804 261L228.412 243C226.102 239 228.989 234 233.608 234L254.392 234C259.011 234 261.898 239 259.588 243L249.196 261Z" fill="#8A0F0F"/>
<path d="M220 218C216.909 208.699 208.227 202 198 202C187.773 202 179.091 208.699 176 218" stroke="#8A0F0F" stroke-width="12" stroke-linecap="round"/>
<path d="M312 218C308.909 208.699 300.227 202 290 202C279.773 202 271.091 208.699 268 218" stroke="#8A0F0F" stroke-width="12" stroke-linecap="round"/>
<path d="M204 250H140" stroke="#8A0F0F" stroke-width="8" stroke-linecap="round"/>
<path d="M204 250L140 274" stroke="#8A0F0F" stroke-width="8" stroke-linecap="round"/>
<path d="M348 274L284 250" stroke="#8A0F0F" stroke-width="8" stroke-linecap="round"/>
<path d="M284 250H348" stroke="#8A0F0F" stroke-width="8" stroke-linecap="round"/>
</g>
<defs>
<filter id="filter0_d_78_203" x="202" y="106.504" width="153.663" height="110.908" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="8"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_78_203"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_78_203" result="shape"/>
</filter>
<filter id="filter1_d_78_203" x="132" y="106.504" width="153.663" height="110.908" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="8"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_78_203"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_78_203" result="shape"/>
</filter>
<filter id="filter2_d_78_203" x="108" y="155.172" width="319.997" height="239.159" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="8"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_78_203"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_78_203" result="shape"/>
</filter>
<filter id="filter3_d_78_203" x="108" y="138" width="272" height="216" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="8"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_78_203"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_78_203" result="shape"/>
</filter>
<clipPath id="clip0_78_203">
<rect width="1024" height="500" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Binary file not shown.

View File

@@ -2,7 +2,7 @@ Copyright 2018 The Lexend Project Authors (https://github.com/googlefonts/lexend
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
https://openfontlicense.org
-----------------------------------------------------------

View File

Binary file not shown.

View File

@@ -1,9 +1,8 @@
Copyright (c) 2011 by Brian J. Bonislawsky DBA Astigmatic (AOETI)
(astigma@astigmatic.com), with Reserved Font Names "Yesteryear"
Copyright 2010 The Lobster Project Authors (https://github.com/impallari/The-Lobster-Font), with Reserved Font Name "Lobster".
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
https://openfontlicense.org
-----------------------------------------------------------

View File

@@ -33,23 +33,26 @@ for lang in "$script_location/../../fastlane/metadata/android/"*; do
perl -pi -e 's/Catima/$ENV{appname}/' featureGraphic.svg
perl -pi -e 's/Loyalty Card Wallet/$ENV{subtext}/' featureGraphic.svg
# Set correct font or font size for language if needed
# (Lexend Deca has limited support and some characters are big)
# We specifically need the Serif version because of the 200 weight
# (Lobster and Lexend have limited language support)
case "$(basename "$lang")" in
bg|el-GR|ru-RU|uk) sed -i "s/Lexend Deca/Noto Serif/" featureGraphic.svg ;;
hi-IN) sed -i -e "s/Yesteryear/Noto Serif Devanagari/" -e "s/Lexend Deca/Noto Serif Devanagari/" featureGraphic.svg ;;
ja-JP) sed -i "s/Lexend Deca/Noto Serif CJK JP/" featureGraphic.svg ;;
kn-IN) sed -i -e 's/font-size="150"/font-size="100"/' -e "s/Yesteryear/Noto Serif Kannada/" featureGraphic.svg ;;
ko) sed -i "s/Lexend Deca/Noto Serif CJK KR/" featureGraphic.svg ;;
zh-CN) sed -i "s/Lexend Deca/Noto Serif CJK SC/" featureGraphic.svg ;;
zh-TW) sed -i "s/Lexend Deca/Noto Serif CJK TC/" featureGraphic.svg ;;
bg|el-GR|ru-RU|uk) sed -i "s/Lexend/Noto Sans/" featureGraphic.svg ;;
ar|fa-IR) sed -i -e 's/svg direction="ltr"/svg direction="rtl"/' -e "s/Lobster/Noto Sans Arabic/" -e "s/Lexend/Noto Sans Arabic/" featureGraphic.svg ;;
he-IL) sed -i -e "s/Lobster/Noto Sans Hebrew/" -e "s/Lexend/Noto Sans Hebrew/" featureGraphic.svg ;;
hi-IN) sed -i -e "s/Lobster/Noto Sans Devanagari/" -e "s/Lexend/Noto Sans Devanagari/" featureGraphic.svg ;;
ja-JP) sed -i "s/Lexend/Noto Sans CJK JP/" featureGraphic.svg ;;
kn-IN) sed -i -e 's/font-size="150"/font-size="125"/' -e 's/\(<tspan x="469" \)y="270"/\1y="240"/' -e "s/Lobster/Noto Sans Kannada/" -e "s/Lexend/Noto Sans Kannada/" featureGraphic.svg ;;
ko) sed -i "s/Lexend/Noto Sans CJK KR/" featureGraphic.svg ;;
ta-IN) sed -i -e 's/font-size="150"/font-size="125"/' -e 's/\(<tspan x="469" \)y="270"/\1y="240"/' featureGraphic.svg ;;
zh-CN) sed -i "s/Lexend/Noto Sans CJK SC/" featureGraphic.svg ;;
zh-TW) sed -i -e "s/Lobster/Noto Sans CJK TC/" -e "s/Lexend/Noto Sans CJK TC/" featureGraphic.svg ;;
*) ;;
esac
fi
# Ensure images directory exists
mkdir -p images
# Generate .png
convert featureGraphic.svg images/featureGraphic.png
# Generate .png (we use Inkscape because ImageMagick ignores RTL)
xvfb-run inkscape --export-filename=images/featureGraphic.png featureGraphic.svg
# Optimize .png
optipng images/featureGraphic.png
# Remove metadata (timestamps) from .png

View File

@@ -11,6 +11,7 @@ MIN_PERCENT = 90
NOT_LANGS = ("night", "w600dp")
REPLACE_CODES = {
"el": "el-rGR",
"he": "iw",
"id": "in-rID",
"ro": "ro-rRO",
"zh_Hans": "zh-rCN",

View File

@@ -1,5 +1,87 @@
# Changelog
## Unreleased - 157
- Add duplicate option to main screen and reorder options slightly
## v2.40.0 - 156 (2025-12-08)
- Copy card ID to clipboard from view dialog or long press
- Swap balance and currency fields to hopefully reduce unintended rounding
## v2.39.2 - 155 (2025-11-04)
- Preparations for future improvements (rewrote many classes to Kotlin)
## v2.39.1 - 154 (2025-10-01)
- Fix possible crash that could occur for cards missing colour information in the database
## v2.39.0 - 153 (2025-09-30)
- Target Android 16
- Fix possible crash after removing image from card
- Remove "Screen orientation" feature (Google removed the ability for apps to control screen rotation when targeting Android 16)
- Add crash reporter to FOSS build (not used in Google Play version, only in other app stores)
## v2.38.0 - 152 (2025-09-12)
- Add support for .pkpasses files
- Remove Stocard importer (Stocard no longer exists)
- Temporarily disable widget images below Android 12L (workaround for a crash issue)
## v2.37.0 - 151 (2025-08-22)
- New redesign of the Catima logo
- Translation updates
## v2.36.0 - 150 (2025-08-05)
- Add a widget showing all non-archived cards
- Prevent the keyboard from overlapping the save button in edit and group screens
## v2.35.1 - 149 (2025-06-17)
- Dependency and translation updates
## v2.35.0 - 148 (2025-05-17)
- Add ability to choose barcode width in fullscreen view
- Remove confusing import from app function
- Various scanning fixes
- Fix crash when loading a pkpass file without barcode
## v2.34.5 - 147 (2025-03-22)
- Target Android 15
- Fix crash reading unsupported pkpass files
- Improve pkpass support
## v2.34.4 - 146 (2025-01-17)
- Ability to sort cards by start of validity
- Temporarily revert to targeting Android 14 to fix some UI issues
## v2.34.3 - 145 (2025-01-15)
- Target Android 15
- Fix keyboard covering save button in edit screen
- Fix some pkpass files not being detected as pkpass (application/vnd-com.apple.pkpass mime type support)
## v2.34.2 - 144 (2024-12-26)
- Improve archive/starred icon display
## v2.34.1 - 143 (2024-12-12)
- Fix crash when opening invalid pkpass files
## v2.34.0 - 142 (2024-12-10)
- Add Passbook (.pkpass) support
- Fix import of transparent PDF files
- Improve display of transparent thumbnails
## v2.33.0 - 141 (2024-11-19)
- Change default column on wide screens to 4

128
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
catima.g9ex3@hackerchick.me.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@@ -23,6 +23,30 @@ for good reason.
## Code Changes
Note: submitting LLM ("AI") generated code is strongly discouraged, as such
code is often (subtly) incorrect or overcomplicated (for example: unnecessarily
pulling in extra libraries for functionality already covered by existing
libraries). It also often makes unrelated changes that increase the risk of
introducing new issues and complicates reviewing. Even when it doesn't do any
of the before mentioned things, it will often not fit the coding style and flow
of existing code, requiring excessive refactoring.
While we cannot ever control or be sure if LLMs were used to generate the
submitted code, it is your responsibility to ensure that whatever code you
submit is correct and fits within the design of existing code. It is never
acceptable to defend a change by stating a LLM suggested it.
This is a personal plea more than anything: please understand that writing code
is the easy part. The hard part is making sure the code fits the design of the
rest of the application and is maintainable. Reviewing is a very time-consuming
task for this reason. Please do not use LLMs to quickly generate a "fix" and
moving the cost of labor to me as a reviewer. If you do use LLMs to generate
part of your code, please be open about this, explain what was generated how
and how you confirmed and refactored the code to fit the project and minimized
risk.
Please never submit LLM-generated code as-is.
### Test Your Code
There are four possible tests you can run to verify your code. The first
@@ -36,10 +60,6 @@ These are the Android lint checker, run using:
# ./gradlew lintRelease
and SpotBugs, run using:
# ./gradlew spotbugsRelease
The final check is by testing the application on a live device and verifying
the basic functionality works as expected.

View File

@@ -1,3 +1,8 @@
source "https://rubygems.org"
gem "fastlane"
# https://github.com/fastlane/fastlane/issues/29183
gem "abbrev"
gem "mutex_m"
gem "ostruct"

View File

@@ -5,35 +5,38 @@ GEM
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.3.0)
aws-partitions (1.998.0)
aws-sdk-core (3.211.0)
aws-eventstream (1.4.0)
aws-partitions (1.1117.0)
aws-sdk-core (3.226.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.95.0)
aws-sdk-core (~> 3, >= 3.210.0)
logger
aws-sdk-kms (1.105.0)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.169.0)
aws-sdk-core (~> 3, >= 3.210.0)
aws-sdk-s3 (1.189.1)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.10.1)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
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.6.5)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.6.20240107)
dotenv (2.8.1)
@@ -55,11 +58,11 @@ GEM
faraday (>= 0.8.0)
http-cookie (~> 1.0.0)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-em_synchrony (1.0.1)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.0.4)
multipart-post (~> 2)
faraday-multipart (1.1.1)
multipart-post (~> 2.0)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
@@ -67,8 +70,8 @@ GEM
faraday-retry (1.0.3)
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.3.1)
fastlane (2.225.0)
fastimage (2.4.0)
fastlane (2.228.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -108,7 +111,7 @@ GEM
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty (~> 0.4.1)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
@@ -129,12 +132,12 @@ GEM
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.7.1)
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.4.0)
google-cloud-errors (1.5.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
@@ -150,36 +153,40 @@ GEM
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.7)
http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.8.3)
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.7.5)
jwt (2.9.3)
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.2.1)
naturally (2.3.0)
nkf (0.2.0)
optparse (0.5.0)
optparse (0.6.0)
os (1.1.4)
plist (3.7.1)
public_suffix (6.0.1)
rake (13.2.1)
ostruct (0.6.1)
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.3.9)
rouge (2.0.7)
rexml (3.4.1)
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
rubyzip (2.4.1)
security (0.1.5)
signet (0.19.0)
signet (0.20.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
@@ -199,15 +206,15 @@ GEM
uber (0.1.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
xcodeproj (1.26.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.3.0)
rouge (~> 2.0.7)
xcpretty (0.4.1)
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
@@ -215,7 +222,10 @@ PLATFORMS
ruby
DEPENDENCIES
abbrev
fastlane
mutex_m
ostruct
BUNDLED WITH
2.5.16
2.5.22

View File

@@ -1,5 +1,5 @@
**Last updated**
August 30 2023
September 30 2025
# Privacy Policy
Catima does not collect or transmit any personal information.
@@ -11,6 +11,12 @@ To ensure correct app functionality, we require access to the following:
Catima offers a feature to share cards with other users. All the relevant data is in the generated shareable URLs and never transmitted to our servers. When viewed through catima.app, the data in the URL is rendered using client-side Javascript to further ensure no data is ever transmitted to us.
## Crash reporting privacy
In the FOSS version of Catima (the version used on IzzyOnDroid, F-Droid and GitHub), the open source crash reporter ACRA is used for crash reporting. When a crash is detected, Catima will ask the user if they are willing to report the crash. If they choose to do so, the user's mail client is opened so they can review the data that would be sent. Crash reporting data is only sent when the user explicitly chooses to do so, it is **never** sent automatically. Crash reporting data is only used to solve crashes and no (potentially) sensitive information is ever shared. Users who do not want to be asked to report crashes can disable the "Ask to send crash reports" setting in Catima settings.
For the Google Play version of Catima, crash reporting is [managed by Google](https://support.google.com/googleplay/android-developer/answer/9859174?hl=en). Users can opt in or out of crash reporting through the Google app under the "Usage and diagnostics" setting.
# Changes
This Privacy Policy may be updated from time to time for any reason. We will notify you of any changes to our Privacy Policy by posting the new Privacy Policy to https://catima.app/privacy-policy/. A snapshot of the Privacy Policy is available within the Catima app, though it may be outdated. When the Privacy Policy on the website and in the app differ, the website should be considered leading. You are advised to consult the Privacy Policy regularly for any changes, as continued use is deemed approval of all changes.

View File

@@ -1,35 +1,36 @@
import com.android.build.gradle.internal.tasks.factory.dependsOn
import com.github.spotbugs.snom.SpotBugsTask
plugins {
id("com.android.application")
id("com.github.spotbugs")
alias(libs.plugins.com.android.application)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.org.jetbrains.kotlin.plugin.compose)
}
spotbugs {
ignoreFailures.set(false)
setEffort("max")
excludeFilter.set(file("./config/spotbugs/exclude.xml"))
reportsDir.set(layout.buildDirectory.file("reports/spotbugs/").get().asFile)
kotlin {
jvmToolchain(21)
}
android {
namespace = "protect.card_locker"
compileSdk = 34
compileSdk = 36
defaultConfig {
applicationId = "me.hackerchick.catima"
minSdk = 21
targetSdk = 34
versionCode = 141
versionName = "2.33.0"
targetSdk = 36
versionCode = 156
versionName = "2.40.0"
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true
resourceConfigurations += listOf("ar", "bg", "bn", "bn-rIN", "bs", "cs", "da", "de", "el-rGR", "en", "eo", "es", "es-rAR", "et", "fi", "fr", "gl", "he-rIL", "hi", "hr", "hu", "in-rID", "is", "it", "ja", "ko", "lt", "lv", "nb-rNO", "nl", "oc", "pl", "pt-rBR", "pt-rPT", "ro-rRO", "ru", "sk", "sl", "sr", "sv", "tr", "uk", "vi", "zh-rCN", "zh-rTW")
resourceConfigurations += listOf("ar", "be", "bg", "bn", "bn-rIN", "bs", "cs", "da", "de", "el-rGR", "en", "eo", "es", "es-rAR", "et", "fa", "fi", "fr", "gl", "he-rIL", "hi", "hr", "hu", "in-rID", "is", "it", "ja", "ko", "lt", "lv", "nb-rNO", "nl", "oc", "pl", "pt", "pt-rBR", "pt-rPT", "ro-rRO", "ru", "sk", "sl", "sr", "sv", "ta", "tr", "uk", "vi", "zh-rCN", "zh-rTW")
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("boolean", "showDonate", "true")
buildConfigField("boolean", "showRateOnGooglePlay", "false")
buildConfigField("boolean", "useAcraCrashReporter", "true")
}
buildTypes {
@@ -47,9 +48,28 @@ android {
buildFeatures {
buildConfig = true
compose = true
viewBinding = true
}
flavorDimensions.add("type")
productFlavors {
create("foss") {
dimension = "type"
isDefault = true
}
create("gplay") {
dimension = "type"
// Google doesn't allow donation links
buildConfigField("boolean", "showDonate", "false")
buildConfigField("boolean", "showRateOnGooglePlay", "true")
// Google Play already sends crashes to the Google Play Console
buildConfigField("boolean", "useAcraCrashReporter", "false")
}
}
bundle {
language {
enableSplit = false
@@ -62,8 +82,8 @@ android {
// Flag to enable support for the new language APIs
isCoreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
sourceSets {
@@ -84,58 +104,60 @@ android {
lint {
lintConfig = file("lint.xml")
}
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
// AndroidX
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("androidx.constraintlayout:constraintlayout:2.2.0")
implementation("androidx.exifinterface:exifinterface:1.3.7")
implementation("androidx.palette:palette:1.0.0")
implementation("androidx.preference:preference:1.2.1")
implementation("com.google.android.material:material:1.12.0")
implementation("com.github.yalantis:ucrop:2.2.9")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.3")
implementation(libs.androidx.appcompat.appcompat)
implementation(libs.androidx.constraintlayout.constraintlayout)
implementation(libs.androidx.core.core.ktx)
implementation(libs.androidx.core.core.remoteviews)
implementation(libs.androidx.core.core.splashscreen)
implementation(libs.androidx.exifinterface.exifinterface)
implementation(libs.androidx.palette.palette)
implementation(libs.androidx.preference.preference)
implementation(libs.com.google.android.material.material)
coreLibraryDesugaring(libs.com.android.tools.desugar.jdk.libs)
// Splash Screen
implementation("androidx.core:core-splashscreen:1.0.1")
// Compose
implementation(libs.androidx.activity.activity.compose)
val composeBom = platform(libs.androidx.compose.compose.bom)
implementation(composeBom)
implementation(libs.androidx.compose.foundation.foundation)
implementation(libs.androidx.compose.material3.material3)
implementation(libs.androidx.compose.material.material.icons.extended)
implementation(libs.androidx.compose.ui.ui.tooling.preview.android)
debugImplementation(libs.androidx.compose.ui.ui.test.manifest)
androidTestImplementation(composeBom)
androidTestImplementation(libs.androidx.compose.ui.ui.test.junit4)
// Third-party
implementation("com.journeyapps:zxing-android-embedded:4.3.0@aar")
implementation("com.google.zxing:core:3.5.3")
implementation("org.apache.commons:commons-csv:1.9.0")
implementation("com.jaredrummler:colorpicker:1.1.0")
implementation("net.lingala.zip4j:zip4j:2.11.5")
implementation(libs.com.journeyapps.zxing.android.embedded)
implementation(libs.com.github.yalantis.ucrop)
implementation(libs.com.google.zxing.core)
implementation(libs.org.apache.commons.commons.csv)
implementation(libs.com.jaredrummler.colorpicker)
implementation(libs.net.lingala.zip4j.zip4j)
// SpotBugs
implementation("io.wcm.tooling.spotbugs:io.wcm.tooling.spotbugs.annotations:1.0.0")
// Crash reporting
implementation(libs.bundles.acra)
// Testing
val androidXTestVersion = "1.6.1"
val junitVersion = "4.13.2"
testImplementation("androidx.test:core:$androidXTestVersion")
testImplementation("junit:junit:$junitVersion")
testImplementation("org.robolectric:robolectric:4.14")
testImplementation(libs.androidx.test.core)
testImplementation(libs.junit.junit)
testImplementation(libs.org.robolectric.robolectric)
androidTestImplementation("androidx.test:core:$androidXTestVersion")
androidTestImplementation("junit:junit:$junitVersion")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test:runner:$androidXTestVersion")
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
}
tasks.withType<SpotBugsTask>().configureEach {
description = "Run spotbugs"
group = "verification"
//classes = fileTree("build/intermediates/javac/debug/compileDebugJavaWithJavac/classes")
//source = fileTree("src/main/java")
//classpath = files()
reports.maybeCreate("xml").required.set(false)
reports.maybeCreate("html").required.set(true)
androidTestImplementation(libs.bundles.androidx.test)
androidTestImplementation(libs.junit.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.androidx.test.rules)
androidTestImplementation(libs.androidx.test.runner)
androidTestImplementation(libs.androidx.test.uiautomator.uiautomator)
androidTestImplementation(libs.androidx.test.espresso.espresso.core)
}
tasks.register("copyRawResFiles", Copy::class) {

View File

@@ -21,4 +21,19 @@
-keepattributes SourceFile,LineNumberTable
# This keep the class and method names the same, for debugging stack traces
-dontobfuscate
-dontobfuscate
# Required for uCrop 2.2.11
# This is generated automatically by the Android Gradle plugin.
-dontwarn javax.annotation.processing.AbstractProcessor
-dontwarn javax.annotation.processing.SupportedOptions
-dontwarn okhttp3.Call
-dontwarn okhttp3.Dispatcher
-dontwarn okhttp3.OkHttpClient
-dontwarn okhttp3.Request$Builder
-dontwarn okhttp3.Request
-dontwarn okhttp3.Response
-dontwarn okhttp3.ResponseBody
-dontwarn okio.BufferedSource
-dontwarn okio.Okio
-dontwarn okio.Sink

View File

@@ -0,0 +1,89 @@
package protect.card_locker
import android.app.Instrumentation
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performScrollTo
import androidx.compose.ui.test.runComposeUiTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import protect.card_locker.compose.theme.CatimaTheme
@OptIn(ExperimentalTestApi::class)
@RunWith(AndroidJUnit4::class)
class AboutActivityTest {
@get:Rule
private val rule: ComposeContentTestRule = createComposeRule()
private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
private val content: AboutContent = AboutContent(instrumentation.targetContext)
@Test
fun testInitialState(): Unit = runComposeUiTest {
setContent {
AboutScreenContent(content = content)
}
onNodeWithTag("topbar_catima").assertIsDisplayed()
onNodeWithTag("card_version_history").assertIsDisplayed()
onNodeWithText(content.versionHistory).assertIsDisplayed()
onNodeWithTag("card_credits").assertIsDisplayed()
onNodeWithText(content.copyrightShort).assertIsDisplayed()
onNodeWithTag("card_translate").assertIsDisplayed()
onNodeWithTag("card_license").assertIsDisplayed()
// We might be off the screen so start scrolling
onNodeWithTag("card_source_github").performScrollTo().assertIsDisplayed()
onNodeWithTag("card_privacy_policy").performScrollTo().assertIsDisplayed()
onNodeWithTag("card_donate").performScrollTo().assertIsDisplayed()
// Dont scroll to this, since its not displayed
onNodeWithTag("card_rate_google").assertIsNotDisplayed()
onNodeWithTag("card_report_error").performScrollTo().assertIsDisplayed()
}
@Test
fun testDonateAndGoogleCardVisible(): Unit = runComposeUiTest {
setContent {
CatimaTheme {
AboutScreenContent(
content = content,
showDonate = true,
showRateOnGooglePlay = true,
)
}
}
onNodeWithTag("card_donate").performScrollTo().assertIsDisplayed()
onNodeWithTag("card_rate_google").performScrollTo().assertIsDisplayed()
}
@Test
fun testDonateAndGoogleCardHidden(): Unit = runComposeUiTest {
setContent {
CatimaTheme {
AboutScreenContent(
content = content,
showDonate = false,
showRateOnGooglePlay = false,
)
}
}
onNodeWithTag("card_privacy_policy").performScrollTo().assertIsDisplayed()
onNodeWithTag("card_donate").assertIsNotDisplayed()
onNodeWithTag("card_rate_google").assertIsNotDisplayed()
onNodeWithTag("card_report_error").performScrollTo().assertIsDisplayed()
}
}

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Fehlersuche</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Отстраняване на грешки в Catima</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">ক্যাটিমা ডিবাগ</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">ক্যাটিমা ডিবাগ</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Otklanjanje Grešaka</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Debugar Catima</string>
</resources>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Catima Debug</string>
</resources>
<string name="app_name">Catima Ladění</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Datfygio</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Fejlfinding</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Depuración</string>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">عیب‌یابی کاتیما</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima-vianmääritys</string>
</resources>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Débogage de Catima</string>
</resources>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">קטימה ניפוי באגים</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Villuleit</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catimaデバーグ</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Feelerkorrektur</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Klaidų Taisymas</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima atkļūdošana</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">കാറ്റിമ ഡീബഗ്</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">कॅटिमा डीबग</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Correcion d\'Errors</string>
</resources>

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">Catima Odpravljanje Napak</string>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">கேட்டிமா Debug</string>
</resources>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Catima Hata Ayaklama</string>
</resources>
<string name="app_name">Catima Hata Ayıklama</string>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ⴽⴰⵜⵉⵎⴰ ⴰⵙⵔⴰⵡ</string>
</resources>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Catima 除錯版</string>
</resources>
<string name="app_name">卡提碼除錯版</string>
</resources>

View File

@@ -4,7 +4,7 @@
<permission
android:description="@string/permissionReadCardsDescription"
android:icon="@drawable/ic_launcher_foreground"
android:icon="@drawable/ic_launcher_monochrome"
android:label="@string/permissionReadCardsLabel"
android:name="${applicationId}.READ_CARDS"
android:protectionLevel="dangerous" />
@@ -30,6 +30,20 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:localeConfig="@xml/locales_config">
<receiver
android:name=".ListWidget"
android:label="@string/card_list_widget_name"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/list_widget_info" />
</receiver>
<activity
android:name=".MainActivity"
android:exported="true"
@@ -40,12 +54,30 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content"/>
<data android:host="*"/>
<data android:mimeType="image/*" />
<data android:mimeType="application/pdf" />
<data android:mimeType="application/vnd.apple.pkpass" />
<data android:mimeType="application/vnd-com.apple.pkpass" />
<data android:mimeType="application/vnd.espass-espass" />
<data android:mimeType="application/vnd.apple.pkpasses" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
<data android:mimeType="image/*" />
<data android:mimeType="application/pdf" />
<data android:mimeType="application/vnd.apple.pkpass" />
<data android:mimeType="application/vnd-com.apple.pkpass" />
<data android:mimeType="application/vnd.espass-espass" />
<data android:mimeType="application/vnd.apple.pkpasses" />
</intent-filter>
</activity>
<activity
@@ -59,17 +91,17 @@
<activity
android:name=".ManageGroupActivity"
android:label="@string/group_edit"
android:theme="@style/AppTheme.NoActionBar"/>
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".LoyaltyCardViewActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden" />
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".LoyaltyCardEditActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden">
android:windowSoftInputMode="adjustResize">
<intent-filter
android:autoVerify="true"
android:label="@string/app_name">
@@ -107,18 +139,16 @@
<activity
android:name=".BarcodeSelectorActivity"
android:label="@string/selectBarcodeTitle"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden" />
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".preferences.SettingsActivity"
android:label="@string/settings"
android:theme="@style/AppTheme.NoActionBar" />
<!-- FIXME: locked screenOrientation is a workaround for https://github.com/CatimaLoyalty/Android/issues/1715, remove when https://github.com/CatimaLoyalty/Android/issues/513 is fixed -->
<!-- FIXME: ImportExportActivity cancels import on rotation -->
<activity
android:name=".ImportExportActivity"
android:label="@string/importExport"
android:exported="true"
android:screenOrientation="locked"
android:theme="@style/AppTheme.NoActionBar">
<!-- ZIP Intent Filter -->

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -1,147 +0,0 @@
package protect.card_locker;
import android.os.Bundle;
import android.text.Spanned;
import android.view.MenuItem;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import protect.card_locker.databinding.AboutActivityBinding;
public class AboutActivity extends CatimaAppCompatActivity {
private static final String TAG = "Catima";
private AboutActivityBinding binding;
private AboutContent content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = AboutActivityBinding.inflate(getLayoutInflater());
content = new AboutContent(this);
setTitle(content.getPageTitle());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
enableToolbarBackButton();
TextView copyright = binding.creditsSub;
copyright.setText(content.getCopyrightShort());
TextView versionHistory = binding.versionHistorySub;
versionHistory.setText(content.getVersionHistory());
binding.versionHistory.setTag("https://catima.app/changelog/");
binding.translate.setTag("https://hosted.weblate.org/engage/catima/");
binding.license.setTag("https://github.com/CatimaLoyalty/Android/blob/main/LICENSE");
binding.repo.setTag("https://github.com/CatimaLoyalty/Android/");
binding.privacy.setTag("https://catima.app/privacy-policy/");
binding.reportError.setTag("https://github.com/CatimaLoyalty/Android/issues");
binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima");
binding.donate.setTag("https://catima.app/donate");
boolean installedFromGooglePlay = Utils.installedFromGooglePlay(this);
// Hide Google Play rate button if not on Google Play
binding.rate.setVisibility(installedFromGooglePlay ? View.VISIBLE : View.GONE);
// Hide donate button on Google Play (Google Play doesn't allow donation links)
binding.donate.setVisibility(installedFromGooglePlay ? View.GONE : View.VISIBLE);
bindClickListeners();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onDestroy() {
super.onDestroy();
content.destroy();
clearClickListeners();
binding = null;
}
private void bindClickListeners() {
binding.versionHistory.setOnClickListener(this::showHistory);
binding.translate.setOnClickListener(this::openExternalBrowser);
binding.license.setOnClickListener(this::showLicense);
binding.repo.setOnClickListener(this::openExternalBrowser);
binding.privacy.setOnClickListener(this::showPrivacy);
binding.reportError.setOnClickListener(this::openExternalBrowser);
binding.rate.setOnClickListener(this::openExternalBrowser);
binding.donate.setOnClickListener(this::openExternalBrowser);
binding.credits.setOnClickListener(view -> showCredits());
}
private void clearClickListeners() {
binding.versionHistory.setOnClickListener(null);
binding.translate.setOnClickListener(null);
binding.license.setOnClickListener(null);
binding.repo.setOnClickListener(null);
binding.privacy.setOnClickListener(null);
binding.reportError.setOnClickListener(null);
binding.rate.setOnClickListener(null);
binding.donate.setOnClickListener(null);
binding.credits.setOnClickListener(null);
}
private void showCredits() {
showHTML(R.string.credits, content.getContributorInfo(), null);
}
private void showHistory(View view) {
showHTML(R.string.version_history, content.getHistoryInfo(), view);
}
private void showLicense(View view) {
showHTML(R.string.license, content.getLicenseInfo(), view);
}
private void showPrivacy(View view) {
showHTML(R.string.privacy_policy, content.getPrivacyInfo(), view);
}
private void showHTML(@StringRes int title, final Spanned text, @Nullable View view) {
int dialogContentPadding = getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
TextView textView = new TextView(this);
textView.setText(text);
Utils.makeTextViewLinksClickable(textView, text);
ScrollView scrollView = new ScrollView(this);
scrollView.addView(textView);
scrollView.setPadding(dialogContentPadding, dialogContentPadding / 2, dialogContentPadding, 0);
// Create dialog
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(this);
materialAlertDialogBuilder
.setTitle(title)
.setView(scrollView)
.setPositiveButton(R.string.ok, null);
// Add View online button if an URL is linked to this view
if (view != null && view.getTag() != null) {
materialAlertDialogBuilder.setNeutralButton(R.string.view_online, (dialog, which) -> openExternalBrowser(view));
}
// Show dialog
materialAlertDialogBuilder.show();
}
private void openExternalBrowser(View view) {
Object tag = view.getTag();
if (tag instanceof String && ((String) tag).startsWith("https://")) {
(new OpenWebLinkHandler()).openBrowser(this, (String) tag);
}
}
}

View File

@@ -0,0 +1,167 @@
package protect.card_locker
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.TextLinkStyles
import androidx.compose.ui.text.fromHtml
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.tooling.preview.Preview
import protect.card_locker.compose.CatimaAboutSection
import protect.card_locker.compose.CatimaTopAppBar
import protect.card_locker.compose.theme.CatimaTheme
class AboutActivity : ComponentActivity() {
private lateinit var content: AboutContent
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
content = AboutContent(this)
title = content.pageTitle
setContent {
CatimaTheme {
AboutScreenContent(
content = content,
showDonate = BuildConfig.showDonate,
showRateOnGooglePlay = BuildConfig.showRateOnGooglePlay,
onBackPressedDispatcher = onBackPressedDispatcher
)
}
}
}
}
@Composable
fun AboutScreenContent(
content: AboutContent,
showDonate: Boolean = true,
showRateOnGooglePlay: Boolean = false,
onBackPressedDispatcher: OnBackPressedDispatcher? = null,
) {
Scaffold(
topBar = { CatimaTopAppBar(content.pageTitle.toString(), onBackPressedDispatcher) }
) { innerPadding ->
Column(
modifier = Modifier
.padding(innerPadding)
.verticalScroll(rememberScrollState())
) {
CatimaAboutSection(
stringResource(R.string.version_history),
content.versionHistory,
modifier = Modifier.testTag("card_version_history"),
onClickUrl = "https://catima.app/changelog/",
onClickDialogText = AnnotatedString.fromHtml(
htmlString = content.historyHtml,
linkStyles = TextLinkStyles(
style = SpanStyle(
textDecoration = TextDecoration.Underline,
color = MaterialTheme.colorScheme.primary
)
)
)
)
CatimaAboutSection(
stringResource(R.string.credits),
content.copyrightShort,
modifier = Modifier.testTag("card_credits"),
onClickDialogText = AnnotatedString.fromHtml(
htmlString = content.contributorInfoHtml,
linkStyles = TextLinkStyles(
style = SpanStyle(
textDecoration = TextDecoration.Underline,
color = MaterialTheme.colorScheme.primary
)
)
)
)
CatimaAboutSection(
stringResource(R.string.help_translate_this_app),
stringResource(R.string.translate_platform),
modifier = Modifier.testTag("card_translate"),
onClickUrl = "https://hosted.weblate.org/engage/catima/"
)
CatimaAboutSection(
stringResource(R.string.license),
stringResource(R.string.app_license),
modifier = Modifier.testTag("card_license"),
onClickUrl = "https://github.com/CatimaLoyalty/Android/blob/main/LICENSE",
onClickDialogText = AnnotatedString.fromHtml(
htmlString = content.licenseHtml,
linkStyles = TextLinkStyles(
style = SpanStyle(
textDecoration = TextDecoration.Underline,
color = MaterialTheme.colorScheme.primary
)
)
)
)
CatimaAboutSection(
stringResource(R.string.source_repository),
stringResource(R.string.on_github),
modifier = Modifier.testTag("card_source_github"),
onClickUrl = "https://github.com/CatimaLoyalty/Android/"
)
CatimaAboutSection(
stringResource(R.string.privacy_policy),
stringResource(R.string.and_data_usage),
modifier = Modifier.testTag("card_privacy_policy"),
onClickUrl = "https://catima.app/privacy-policy/",
onClickDialogText = AnnotatedString.fromHtml(
htmlString = content.privacyHtml,
linkStyles = TextLinkStyles(
style = SpanStyle(
textDecoration = TextDecoration.Underline,
color = MaterialTheme.colorScheme.primary
)
)
)
)
if (showDonate) {
CatimaAboutSection(
stringResource(R.string.donate),
"",
modifier = Modifier.testTag("card_donate"),
onClickUrl = "https://catima.app/donate"
)
}
if (showRateOnGooglePlay) {
CatimaAboutSection(
stringResource(R.string.rate_this_app),
stringResource(R.string.on_google_play),
modifier = Modifier.testTag("card_rate_google"),
onClickUrl = "https://play.google.com/store/apps/details?id=me.hackerchick.catima"
)
}
CatimaAboutSection(
stringResource(R.string.report_error),
stringResource(R.string.on_github),
modifier = Modifier.testTag("card_report_error"),
onClickUrl = "https://github.com/CatimaLoyalty/Android/issues"
)
}
}
}
@Preview
@Composable
private fun AboutActivityPreview() {
AboutScreenContent(AboutContent(LocalContext.current))
}

View File

@@ -3,11 +3,8 @@ package protect.card_locker;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.text.Spanned;
import android.util.Log;
import androidx.core.text.HtmlCompat;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
@@ -55,7 +52,7 @@ public class AboutContent {
return context.getString(R.string.app_copyright_short);
}
public String getContributors() {
public String getContributorsHtml() {
String contributors;
try {
contributors = "<br/>" + Utils.readTextFile(context, R.raw.contributors);
@@ -65,7 +62,7 @@ public class AboutContent {
return contributors.replace("\n", "<br />");
}
public String getHistory() {
public String getHistoryHtml() {
String versionHistory;
try {
versionHistory = Utils.readTextFile(context, R.raw.changelog)
@@ -77,7 +74,7 @@ public class AboutContent {
.replace("\n", "<br />");
}
public String getLicense() {
public String getLicenseHtml() {
try {
return Utils.readTextFile(context, R.raw.license);
} catch (IOException ignored) {
@@ -85,7 +82,7 @@ public class AboutContent {
}
}
public String getPrivacy() {
public String getPrivacyHtml() {
String privacyPolicy;
try {
privacyPolicy = Utils.readTextFile(context, R.raw.privacy)
@@ -97,11 +94,11 @@ public class AboutContent {
.replace("\n", "<br />");
}
public String getThirdPartyLibraries() {
public String getThirdPartyLibrariesHtml() {
final List<ThirdPartyInfo> usedLibraries = new ArrayList<>();
usedLibraries.add(new ThirdPartyInfo("ACRA", "https://github.com/ACRA/acra", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
usedLibraries.add(new ThirdPartyInfo("uCrop", "https://github.com/Yalantis/uCrop", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("Zip4j", "https://github.com/srikanth-lingala/zip4j", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("ZXing", "https://github.com/zxing/zxing", "Apache 2.0"));
@@ -116,7 +113,7 @@ public class AboutContent {
return result.toString();
}
public String getUsedThirdPartyAssets() {
public String getUsedThirdPartyAssetsHtml() {
final List<ThirdPartyInfo> usedAssets = new ArrayList<>();
usedAssets.add(new ThirdPartyInfo("Android icons", "https://fonts.google.com/icons?selected=Material+Icons", "Apache 2.0"));
@@ -129,31 +126,19 @@ public class AboutContent {
return result.toString();
}
public Spanned getContributorInfo() {
public String getContributorInfoHtml() {
StringBuilder contributorInfo = new StringBuilder();
contributorInfo.append(getCopyright());
contributorInfo.append("<br/><br/>");
contributorInfo.append(context.getString(R.string.app_copyright_old));
contributorInfo.append("<br/><br/>");
contributorInfo.append(String.format(context.getString(R.string.app_contributors), getContributors()));
contributorInfo.append(String.format(context.getString(R.string.app_contributors), getContributorsHtml()));
contributorInfo.append("<br/><br/>");
contributorInfo.append(String.format(context.getString(R.string.app_libraries), getThirdPartyLibraries()));
contributorInfo.append(String.format(context.getString(R.string.app_libraries), getThirdPartyLibrariesHtml()));
contributorInfo.append("<br/><br/>");
contributorInfo.append(String.format(context.getString(R.string.app_resources), getUsedThirdPartyAssets()));
contributorInfo.append(String.format(context.getString(R.string.app_resources), getUsedThirdPartyAssetsHtml()));
return HtmlCompat.fromHtml(contributorInfo.toString(), HtmlCompat.FROM_HTML_MODE_COMPACT);
}
public Spanned getHistoryInfo() {
return HtmlCompat.fromHtml(getHistory(), HtmlCompat.FROM_HTML_MODE_COMPACT);
}
public Spanned getLicenseInfo() {
return HtmlCompat.fromHtml(getLicense(), HtmlCompat.FROM_HTML_MODE_LEGACY);
}
public Spanned getPrivacyInfo() {
return HtmlCompat.fromHtml(getPrivacy(), HtmlCompat.FROM_HTML_MODE_COMPACT);
return contributorInfo.toString();
}
public String getVersionHistory() {

View File

@@ -1,5 +0,0 @@
package protect.card_locker;
public interface BarcodeImageWriterResultCallback {
void onBarcodeImageWriterResult(boolean success);
}

View File

@@ -0,0 +1,5 @@
package protect.card_locker
interface BarcodeImageWriterResultCallback {
fun onBarcodeImageWriterResult(success: Boolean)
}

View File

@@ -49,7 +49,7 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
BarcodeImageWriterTask(
Context context, ImageView imageView, String cardIdString,
CatimaBarcode barcodeFormat, TextView textView,
boolean showFallback, BarcodeImageWriterResultCallback callback, boolean roundCornerPadding
boolean showFallback, BarcodeImageWriterResultCallback callback, boolean roundCornerPadding, boolean isFullscreen
) {
mContext = context;
@@ -86,13 +86,13 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
if (format.isSquare()) {
imageHeight = imageWidth = Math.min(imageViewHeight, Math.min(MAX_WIDTH, imageViewWidth));
} else if (imageView.getWidth() < MAX_WIDTH) {
} else if (imageView.getWidth() < MAX_WIDTH && !isFullscreen) {
imageHeight = imageViewHeight;
imageWidth = imageViewWidth;
} else {
// Scale down the image to reduce the memory needed to produce it
imageWidth = MAX_WIDTH;
double ratio = (double) MAX_WIDTH / (double) imageViewWidth;
imageWidth = Math.min(MAX_WIDTH, this.mContext.getResources().getDisplayMetrics().widthPixels);
double ratio = (double) imageWidth / (double) imageViewWidth;
imageHeight = (int) (imageViewHeight * ratio);
}

View File

@@ -1,125 +0,0 @@
package protect.card_locker;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import com.google.zxing.BarcodeFormat;
import java.util.ArrayList;
import protect.card_locker.databinding.BarcodeSelectorActivityBinding;
/**
* This activity is callable and will allow a user to enter
* barcode data and generate all barcodes possible for
* the data. The user may then select any barcode, where its
* data and type will be returned to the caller.
*/
public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements BarcodeSelectorAdapter.BarcodeSelectorListener {
private BarcodeSelectorActivityBinding binding;
private static final String TAG = "Catima";
// Result this activity will return
public static final String BARCODE_CONTENTS = "contents";
public static final String BARCODE_FORMAT = "format";
private final Handler typingDelayHandler = new Handler(Looper.getMainLooper());
public static final Integer INPUT_DELAY = 250;
private BarcodeSelectorAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = BarcodeSelectorActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.selectBarcodeTitle);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
enableToolbarBackButton();
EditText cardId = binding.cardId;
ListView mBarcodeList = binding.barcodes;
mAdapter = new BarcodeSelectorAdapter(this, new ArrayList<>(), this);
mBarcodeList.setAdapter(mAdapter);
cardId.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Delay the input processing so we avoid overload
typingDelayHandler.removeCallbacksAndMessages(null);
typingDelayHandler.postDelayed(() -> {
Log.d(TAG, "Entered text: " + s);
runOnUiThread(() -> {
generateBarcodes(s.toString());
});
}, INPUT_DELAY);
}
});
final Bundle b = getIntent().getExtras();
final String initialCardId = b != null ? b.getString(LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID) : null;
if (initialCardId != null) {
cardId.setText(initialCardId);
} else {
generateBarcodes("");
}
}
private void generateBarcodes(String value) {
// Update barcodes
ArrayList<CatimaBarcodeWithValue> barcodes = new ArrayList<>();
for (BarcodeFormat barcodeFormat : CatimaBarcode.barcodeFormats) {
CatimaBarcode catimaBarcode = CatimaBarcode.fromBarcode(barcodeFormat);
barcodes.add(new CatimaBarcodeWithValue(catimaBarcode, value));
}
mAdapter.setBarcodes(barcodes);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
setResult(Activity.RESULT_CANCELED);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onRowClicked(int inputPosition, View view) {
CatimaBarcodeWithValue barcodeWithValue = mAdapter.getItem(inputPosition);
CatimaBarcode catimaBarcode = barcodeWithValue.catimaBarcode();
if (!mAdapter.isValid(view)) {
Toast.makeText(this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
return;
}
String barcodeFormat = catimaBarcode.format().name();
String value = barcodeWithValue.value();
Log.d(TAG, "Selected barcode type " + barcodeFormat);
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, barcodeFormat);
result.putExtra(BARCODE_CONTENTS, value);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
}
}

View File

@@ -0,0 +1,118 @@
package protect.card_locker
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.core.view.MenuProvider
import androidx.core.widget.doOnTextChanged
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import protect.card_locker.BarcodeSelectorAdapter.BarcodeSelectorListener
import protect.card_locker.databinding.BarcodeSelectorActivityBinding
/**
* This activity is callable and will allow a user to enter
* barcode data and generate all barcodes possible for
* the data. The user may then select any barcode, where its
* data and type will be returned to the caller.
*/
class BarcodeSelectorActivity : CatimaAppCompatActivity(), BarcodeSelectorListener, MenuProvider {
private lateinit var binding: BarcodeSelectorActivityBinding
private lateinit var mAdapter: BarcodeSelectorAdapter
companion object {
private const val TAG = "Catima"
// Result this activity will return
const val BARCODE_CONTENTS = "contents"
const val BARCODE_FORMAT = "format"
const val INPUT_DELAY = 250L
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
addMenuProvider(this)
binding = BarcodeSelectorActivityBinding.inflate(layoutInflater)
setTitle(R.string.selectBarcodeTitle)
setContentView(binding.getRoot())
Utils.applyWindowInsets(binding.getRoot())
setSupportActionBar(binding.toolbar)
enableToolbarBackButton()
var typingDelayJob: Job? = null
val cardId = binding.cardId
val mBarcodeList = binding.barcodes
mAdapter = BarcodeSelectorAdapter(this, ArrayList<CatimaBarcodeWithValue?>(), this)
mBarcodeList.adapter = mAdapter
cardId.doOnTextChanged { s, _, _, _ ->
typingDelayJob?.cancel()
typingDelayJob =
lifecycleScope.launch {
delay(INPUT_DELAY) // Delay the input processing so we avoid overload
Log.d(TAG, "Entered text: $s")
generateBarcodes(s.toString())
}
}
val initialCardId = intent.extras?.getString(LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID)
initialCardId?.let {
cardId.setText(initialCardId)
} ?: generateBarcodes("")
}
private fun generateBarcodes(value: String?) {
// Update barcodes
val barcodes = ArrayList<CatimaBarcodeWithValue?>()
CatimaBarcode.barcodeFormats.forEach {
val catimaBarcode = CatimaBarcode.fromBarcode(it)
barcodes.add(CatimaBarcodeWithValue(catimaBarcode, value))
}
mAdapter.setBarcodes(barcodes)
}
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
if (menuItem.itemId == android.R.id.home) {
setResult(RESULT_CANCELED)
finish()
}
return true
}
override fun onRowClicked(inputPosition: Int, view: View) {
val barcodeWithValue = mAdapter.getItem(inputPosition)
val catimaBarcode = barcodeWithValue!!.catimaBarcode()
if (!mAdapter.isValid(view)) {
Toast.makeText(this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show()
return
}
val barcodeFormat = catimaBarcode.format().name
val value = barcodeWithValue.value()
Log.d(TAG, "Selected barcode type $barcodeFormat")
Intent().apply {
putExtra(BARCODE_FORMAT, barcodeFormat)
putExtra(BARCODE_CONTENTS, value)
setResult(RESULT_OK, this)
}
finish()
}
}

View File

@@ -92,13 +92,13 @@ public class BarcodeSelectorAdapter extends ArrayAdapter<CatimaBarcodeWithValue>
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null, true);
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null, true, false);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
});
} else {
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null, true);
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null, true, false);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
}

View File

@@ -1,29 +0,0 @@
package protect.card_locker;
import androidx.annotation.Nullable;
public class BarcodeValues {
@Nullable
private final CatimaBarcode mFormat;
private final String mContent;
private String mNote;
public BarcodeValues(@Nullable CatimaBarcode format, String content) {
mFormat = format;
mContent = content;
}
public void setNote(String note) {
mNote = note;
}
public @Nullable CatimaBarcode format() {
return mFormat;
}
public String content() {
return mContent;
}
public String note() { return mNote; }
}

View File

@@ -1,6 +0,0 @@
package protect.card_locker;
public interface BarcodeValuesListDisambiguatorCallback {
void onUserChoseBarcode(BarcodeValues barcodeValues);
void onUserDismissedSelector();
}

View File

@@ -1,110 +0,0 @@
package protect.card_locker;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import protect.card_locker.databinding.CardShortcutConfigureActivityBinding;
import protect.card_locker.preferences.Settings;
/**
* The configuration screen for creating a shortcut.
*/
public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
private CardShortcutConfigureActivityBinding binding;
static final String TAG = "Catima";
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
binding = CardShortcutConfigureActivityBinding.inflate(getLayoutInflater());
mDatabase = new DBHelper(this).getReadableDatabase();
// Set the result to CANCELED. This will cause nothing to happen if the
// aback button is pressed.
setResult(RESULT_CANCELED);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
toolbar.setTitle(R.string.shortcutSelectCard);
setSupportActionBar(toolbar);
// If there are no cards, bail
int cardCount = DBHelper.getLoyaltyCardCount(mDatabase);
if (cardCount == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show();
finish();
}
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this, null);
binding.list.setAdapter(mAdapter);
}
@Override
protected void onResume() {
super.onResume();
var layoutManager = (GridLayoutManager) binding.list.getLayoutManager();
if (layoutManager != null) {
var settings = new Settings(this);
layoutManager.setSpanCount(settings.getPreferredColumnCount());
}
}
private void onClickAction(int position) {
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
selected.moveToPosition(position);
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(selected);
Log.d(TAG, "Creating shortcut for card " + loyaltyCard.store + "," + loyaltyCard.id);
ShortcutInfoCompat shortcut = ShortcutHelper.createShortcutBuilder(CardShortcutConfigure.this, loyaltyCard).build();
setResult(RESULT_OK, ShortcutManagerCompat.createShortcutResultIntent(CardShortcutConfigure.this, shortcut));
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
getMenuInflater().inflate(R.menu.card_details_menu, inputMenu);
return super.onCreateOptionsMenu(inputMenu);
}
@Override
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog();
invalidateOptionsMenu();
return true;
}
return super.onOptionsItemSelected(inputItem);
}
@Override
public void onRowClicked(int inputPosition) {
onClickAction(inputPosition);
}
@Override
public void onRowLongClicked(int inputPosition) {
// do nothing
}
}

View File

@@ -0,0 +1,96 @@
package protect.card_locker
import android.database.sqlite.SQLiteDatabase
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.widget.Toast
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.view.MenuProvider
import androidx.recyclerview.widget.GridLayoutManager
import protect.card_locker.LoyaltyCardCursorAdapter.CardAdapterListener
import protect.card_locker.databinding.CardShortcutConfigureActivityBinding
import protect.card_locker.preferences.Settings
class CardShortcutConfigure : CatimaAppCompatActivity(), CardAdapterListener, MenuProvider {
private lateinit var binding: CardShortcutConfigureActivityBinding
private lateinit var mDatabase: SQLiteDatabase
private lateinit var mAdapter: LoyaltyCardCursorAdapter
private companion object {
private const val TAG: String = "Catima"
}
public override fun onCreate(savedInstanceBundle: Bundle?) {
super.onCreate(savedInstanceBundle)
addMenuProvider(this)
binding = CardShortcutConfigureActivityBinding.inflate(layoutInflater)
mDatabase = DBHelper(this).readableDatabase
// Set the result to CANCELED.
// This will cause nothing to happen if the back button is pressed.
setResult(RESULT_CANCELED)
setContentView(binding.getRoot())
Utils.applyWindowInsets(binding.getRoot())
binding.toolbar.apply {
setTitle(R.string.shortcutSelectCard)
setSupportActionBar(this)
}
// If there are no cards, bail
if (DBHelper.getLoyaltyCardCount(mDatabase) == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show()
finish()
}
val cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All)
mAdapter = LoyaltyCardCursorAdapter(this, cardCursor, this, null)
binding.list.setAdapter(mAdapter)
}
override fun onResume() {
super.onResume()
val layoutManager = binding.list.layoutManager as GridLayoutManager?
layoutManager?.setSpanCount(Settings(this).getPreferredColumnCount())
}
private fun onClickAction(position: Int) {
val selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All)
selected.moveToPosition(position)
val loyaltyCard = LoyaltyCard.fromCursor(this, selected)
Log.d(TAG, "Creating shortcut for card ${loyaltyCard.store}, ${loyaltyCard.id}")
val shortcut = ShortcutHelper.createShortcutBuilder(this, loyaltyCard).build()
setResult(RESULT_OK,
ShortcutManagerCompat.createShortcutResultIntent(this, shortcut))
finish()
}
override fun onCreateMenu(inputMenu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.card_details_menu, inputMenu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
if (menuItem.itemId == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog()
}
return true
}
override fun onRowClicked(inputPosition: Int) {
onClickAction(inputPosition)
}
override fun onRowLongClicked(inputPosition: Int) {
// do nothing
}
}

View File

@@ -42,7 +42,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived);
return subscriber -> {
while (loyaltyCardCursor.moveToNext()) {
LoyaltyCard card = LoyaltyCard.fromCursor(loyaltyCardCursor);
LoyaltyCard card = LoyaltyCard.fromCursor(this, loyaltyCardCursor);
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(LoyaltyCardViewActivity.BUNDLE_ID, card.id);
@@ -69,7 +69,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
for (String controlId : controlIds) {
Control control;
Integer cardId = this.controlIdToCardId(controlId);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId);
LoyaltyCard card = DBHelper.getLoyaltyCard(this, mDatabase, cardId);
if (card != null) {
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
@@ -99,7 +99,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
}
private Bitmap getIcon(Context context, LoyaltyCard loyaltyCard) {
Bitmap cardIcon = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon);
Bitmap cardIcon = loyaltyCard.getImageThumbnail(context);
if (cardIcon != null) {
return cardIcon;

View File

@@ -7,6 +7,7 @@ import android.os.Bundle;
import android.view.View;
import android.view.Window;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
@@ -24,6 +25,7 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
EdgeToEdge.enable(this);
super.onCreate(savedInstanceState);
Utils.patchColors(this);
}

View File

@@ -23,10 +23,11 @@ import java.util.Set;
public class DBHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "Catima.db";
public static final int ORIGINAL_DATABASE_VERSION = 1;
public static final int DATABASE_VERSION = 16;
public static final int DATABASE_VERSION = 17;
// NB: changing this value requires a migration
// NB: changing these values requires a migration
public static final int DEFAULT_ZOOM_LEVEL = 100;
public static final int DEFAULT_ZOOM_LEVEL_WIDTH = 100;
public static class LoyaltyCardDbGroups {
public static final String TABLE = "groups";
@@ -51,6 +52,7 @@ public class DBHelper extends SQLiteOpenHelper {
public static final String STAR_STATUS = "starstatus";
public static final String LAST_USED = "lastused";
public static final String ZOOM_LEVEL = "zoomlevel";
public static final String ZOOM_LEVEL_WIDTH = "zoomlevelwidth";
public static final String ARCHIVE_STATUS = "archive";
}
@@ -70,6 +72,7 @@ public class DBHelper extends SQLiteOpenHelper {
public enum LoyaltyCardOrder {
Alpha,
LastUsed,
ValidFrom,
Expiry
}
@@ -112,6 +115,7 @@ public class DBHelper extends SQLiteOpenHelper {
LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0'," +
LoyaltyCardDbIds.LAST_USED + " INTEGER DEFAULT '0', " +
LoyaltyCardDbIds.ZOOM_LEVEL + " INTEGER DEFAULT '" + DEFAULT_ZOOM_LEVEL + "', " +
LoyaltyCardDbIds.ZOOM_LEVEL_WIDTH + " INTEGER DEFAULT '" + DEFAULT_ZOOM_LEVEL_WIDTH + "', " +
LoyaltyCardDbIds.ARCHIVE_STATUS + " INTEGER DEFAULT '0' )");
// create associative table for cards in groups
@@ -326,16 +330,21 @@ public class DBHelper extends SQLiteOpenHelper {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.VALID_FROM + " INTEGER");
}
if (oldVersion < 17 && newVersion >= 17) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.ZOOM_LEVEL_WIDTH + " INTEGER DEFAULT '100' ");
}
}
public static Set<String> imageFiles(Context context, final SQLiteDatabase database) {
Set<String> files = new HashSet<>();
Cursor cardCursor = getLoyaltyCardCursor(database);
while (cardCursor.moveToNext()) {
LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor);
LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor);
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
String name = Utils.getCardImageFileName(card.id, imageLocationType);
if (Utils.retrieveCardImageAsFile(context, name).exists()) {
if (card.getImageForImageLocationType(context, imageLocationType) != null) {
files.add(name);
}
}
@@ -515,15 +524,17 @@ public class DBHelper extends SQLiteOpenHelper {
return (rowsUpdated == 1);
}
public static boolean updateLoyaltyCardZoomLevel(SQLiteDatabase database, int loyaltyCardId, int zoomLevel) {
public static boolean updateLoyaltyCardZoomLevel(SQLiteDatabase database, int loyaltyCardId, int zoomLevel, int zoomLevelWidth) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.ZOOM_LEVEL, zoomLevel);
contentValues.put(LoyaltyCardDbIds.ZOOM_LEVEL_WIDTH, zoomLevelWidth);
Log.d("updateLoyaltyCardZLevel", "Card Id = " + loyaltyCardId + " Zoom level= " + zoomLevel);
Log.d("updateLoyaltyCardZoomLW", "Card Id = " + loyaltyCardId + " Zoom level width= " + zoomLevelWidth);
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(loyaltyCardId));
Log.d("updateLoyaltyCardZLevel", "Rows changed = " + rowsUpdated);
return (rowsUpdated == 1);
Log.d("updateLoyaltyCardZLevel", "Card Id = " + loyaltyCardId + " Zoom level = " + zoomLevel + " Zoom level width = " + zoomLevelWidth);
return (rowsUpdated >= 1);
}
public static boolean updateLoyaltyCardBalance(SQLiteDatabase database, final int id, final BigDecimal newBalance) {
@@ -535,14 +546,14 @@ public class DBHelper extends SQLiteOpenHelper {
return (rowsUpdated == 1);
}
public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) {
public static LoyaltyCard getLoyaltyCard(Context context, SQLiteDatabase database, final int id) {
Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
LoyaltyCard card = null;
if (data.getCount() == 1) {
data.moveToFirst();
card = LoyaltyCard.fromCursor(data);
card = LoyaltyCard.fromCursor(context, data);
}
data.close();
@@ -916,6 +927,10 @@ public class DBHelper extends SQLiteOpenHelper {
return LoyaltyCardDbIds.LAST_USED;
}
if (order == LoyaltyCardOrder.ValidFrom) {
return LoyaltyCardDbIds.VALID_FROM;
}
if (order == LoyaltyCardOrder.Expiry) {
return LoyaltyCardDbIds.EXPIRY;
}

View File

@@ -1,428 +0,0 @@
package protect.card_locker;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputLayout;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.ImportExportActivityBinding;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
import protect.card_locker.importexport.ImportExportResultType;
public class ImportExportActivity extends CatimaAppCompatActivity {
private ImportExportActivityBinding binding;
private static final String TAG = "Catima";
private ImportExportTask importExporter;
private String importAlertTitle;
private String importAlertMessage;
private DataFormat importDataFormat;
private String exportPassword;
private ActivityResultLauncher<Intent> fileCreateLauncher;
private ActivityResultLauncher<String> fileOpenLauncher;
private ActivityResultLauncher<Intent> filePickerLauncher;
final private TaskHandler mTasks = new TaskHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ImportExportActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.importExport);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
enableToolbarBackButton();
Intent fileIntent = getIntent();
if (fileIntent != null && fileIntent.getType() != null) {
chooseImportType(false, fileIntent.getData());
}
// would use ActivityResultContracts.CreateDocument() but mime type cannot be set
fileCreateLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent intent = result.getData();
if (intent == null) {
Log.e(TAG, "Activity returned NULL data");
return;
}
Uri uri = intent.getData();
if (uri == null) {
Log.e(TAG, "Activity returned NULL uri");
return;
}
// Running this in a thread prevents Android from throwing a NetworkOnMainThreadException for large files
// FIXME: This is still suboptimal, because showing that the export started is delayed until the network request finishes
new Thread() {
@Override
public void run() {
try {
OutputStream writer = getContentResolver().openOutputStream(uri);
Log.d(TAG, "Starting file export with: " + result);
startExport(writer, uri, exportPassword.toCharArray(), true);
} catch (IOException e) {
Log.e(TAG, "Failed to export file: " + result, e);
onExportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, result.toString()), uri);
}
}
}.start();
});
fileOpenLauncher = registerForActivityResult(new ActivityResultContracts.GetContent(), result -> {
if (result == null) {
Log.e(TAG, "Activity returned NULL data");
return;
}
openFileForImport(result, null);
});
filePickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent intent = result.getData();
if (intent == null) {
Log.e(TAG, "Activity returned NULL data");
return;
}
Uri uri = intent.getData();
if (uri == null) {
Log.e(TAG, "Activity returned NULL uri");
return;
}
openFileForImport(intent.getData(), null);
});
// Check that there is a file manager available
final Intent intentCreateDocumentAction = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intentCreateDocumentAction.addCategory(Intent.CATEGORY_OPENABLE);
intentCreateDocumentAction.setType("application/zip");
intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "catima.zip");
Button exportButton = binding.exportButton;
exportButton.setOnClickListener(v -> {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ImportExportActivity.this);
builder.setTitle(R.string.exportPassword);
FrameLayout container = new FrameLayout(ImportExportActivity.this);
final TextInputLayout textInputLayout = new TextInputLayout(ImportExportActivity.this);
textInputLayout.setEndIconMode(TextInputLayout.END_ICON_PASSWORD_TOGGLE);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(50, 10, 50, 0);
textInputLayout.setLayoutParams(params);
final EditText input = new EditText(ImportExportActivity.this);
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
input.setHint(R.string.exportPasswordHint);
textInputLayout.addView(input);
container.addView(textInputLayout);
builder.setView(container);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
exportPassword = input.getText().toString();
try {
fileCreateLauncher.launch(intentCreateDocumentAction);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedOpeningFileManager, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
});
builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel());
builder.show();
});
// Check that there is a file manager available
Button importFilesystem = binding.importOptionFilesystemButton;
importFilesystem.setOnClickListener(v -> chooseImportType(false, null));
// Check that there is an app that data can be imported from
Button importApplication = binding.importOptionApplicationButton;
importApplication.setOnClickListener(v -> chooseImportType(true, null));
// FIXME: The importer/exporter is currently quite broken
// To prevent the screen from turning off during import/export and some devices killing Catima as it's no longer foregrounded, force the screen to stay on here
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
private void openFileForImport(Uri uri, char[] password) {
// Running this in a thread prevents Android from throwing a NetworkOnMainThreadException for large files
// FIXME: This is still suboptimal, because showing that the import started is delayed until the network request finishes
new Thread() {
@Override
public void run() {
try {
InputStream reader = getContentResolver().openInputStream(uri);
Log.d(TAG, "Starting file import with: " + uri);
startImport(reader, uri, importDataFormat, password, true);
} catch (IOException e) {
Log.e(TAG, "Failed to import file: " + uri, e);
onImportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, e.toString()), uri, importDataFormat);
}
}
}.start();
}
private void chooseImportType(boolean choosePicker,
@Nullable Uri fileData) {
List<CharSequence> betaImportOptions = new ArrayList<>();
betaImportOptions.add("Fidme");
betaImportOptions.add("Stocard");
List<CharSequence> importOptions = new ArrayList<>();
for (String importOption : getResources().getStringArray(R.array.import_types_array)) {
if (betaImportOptions.contains(importOption)) {
importOption = importOption + " (BETA)";
}
importOptions.add(importOption);
}
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.chooseImportType)
.setItems(importOptions.toArray(new CharSequence[importOptions.size()]), (dialog, which) -> {
switch (which) {
// Catima
case 0:
importAlertTitle = getString(R.string.importCatima);
importAlertMessage = getString(R.string.importCatimaMessage);
importDataFormat = DataFormat.Catima;
break;
// Fidme
case 1:
importAlertTitle = getString(R.string.importFidme);
importAlertMessage = getString(R.string.importFidmeMessage);
importDataFormat = DataFormat.Fidme;
break;
// Loyalty Card Keychain
case 2:
importAlertTitle = getString(R.string.importLoyaltyCardKeychain);
importAlertMessage = getString(R.string.importLoyaltyCardKeychainMessage);
importDataFormat = DataFormat.Catima;
break;
// Stocard
case 3:
importAlertTitle = getString(R.string.importStocard);
importAlertMessage = getString(R.string.importStocardMessage);
importDataFormat = DataFormat.Stocard;
break;
// Voucher Vault
case 4:
importAlertTitle = getString(R.string.importVoucherVault);
importAlertMessage = getString(R.string.importVoucherVaultMessage);
importDataFormat = DataFormat.VoucherVault;
break;
default:
throw new IllegalArgumentException("Unknown DataFormat");
}
if (fileData != null) {
openFileForImport(fileData, null);
return;
}
new MaterialAlertDialogBuilder(this)
.setTitle(importAlertTitle)
.setMessage(importAlertMessage)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
if (choosePicker) {
final Intent intentPickAction = new Intent(Intent.ACTION_PICK);
filePickerLauncher.launch(intentPickAction);
} else {
fileOpenLauncher.launch("*/*");
}
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedOpeningFileManager, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
})
.setNegativeButton(R.string.cancel, null)
.show();
});
builder.show();
}
private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password, final boolean closeWhenDone) {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() {
@Override
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
onImportComplete(result, targetUri, dataFormat);
if (closeWhenDone) {
try {
target.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
};
importExporter = new ImportExportTask(ImportExportActivity.this,
dataFormat, target, password, listener);
mTasks.executeTask(TaskHandler.TYPE.IMPORT, importExporter);
}
private void startExport(final OutputStream target, final Uri targetUri, char[] password, final boolean closeWhenDone) {
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false);
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() {
@Override
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
onExportComplete(result, targetUri);
if (closeWhenDone) {
try {
target.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
};
importExporter = new ImportExportTask(ImportExportActivity.this,
DataFormat.Catima, target, password, listener);
mTasks.executeTask(TaskHandler.TYPE.EXPORT, importExporter);
}
@Override
protected void onDestroy() {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false);
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
private void retryWithPassword(DataFormat dataFormat, Uri uri) {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.passwordRequired);
FrameLayout container = new FrameLayout(ImportExportActivity.this);
final TextInputLayout textInputLayout = new TextInputLayout(ImportExportActivity.this);
textInputLayout.setEndIconMode(TextInputLayout.END_ICON_PASSWORD_TOGGLE);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(50, 10, 50, 0);
textInputLayout.setLayoutParams(params);
final EditText input = new EditText(ImportExportActivity.this);
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
input.setHint(R.string.exportPasswordHint);
textInputLayout.addView(input);
container.addView(textInputLayout);
builder.setView(container);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
openFileForImport(uri, input.getText().toString().toCharArray());
});
builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel());
builder.show();
}
private String buildResultDialogMessage(ImportExportResult result, boolean isImport) {
int messageId;
if (result.resultType() == ImportExportResultType.Success) {
messageId = isImport ? R.string.importSuccessful : R.string.exportSuccessful;
} else {
messageId = isImport ? R.string.importFailed : R.string.exportFailed;
}
StringBuilder messageBuilder = new StringBuilder(getResources().getString(messageId));
if (result.developerDetails() != null) {
messageBuilder.append("\n\n");
messageBuilder.append(getResources().getString(R.string.include_if_asking_support));
messageBuilder.append("\n\n");
messageBuilder.append(result.developerDetails());
}
return messageBuilder.toString();
}
private void onImportComplete(ImportExportResult result, Uri path, DataFormat dataFormat) {
ImportExportResultType resultType = result.resultType();
if (resultType == ImportExportResultType.BadPassword) {
retryWithPassword(dataFormat, path);
return;
}
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.importSuccessfulTitle : R.string.importFailedTitle);
builder.setMessage(buildResultDialogMessage(result, true));
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
builder.create().show();
}
private void onExportComplete(ImportExportResult result, final Uri path) {
ImportExportResultType resultType = result.resultType();
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.exportSuccessfulTitle : R.string.exportFailedTitle);
builder.setMessage(buildResultDialogMessage(result, false));
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
if (resultType == ImportExportResultType.Success) {
final CharSequence sendLabel = ImportExportActivity.this.getResources().getText(R.string.sendLabel);
builder.setPositiveButton(sendLabel, (dialog, which) -> {
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, path);
sendIntent.setType("text/csv");
// set flag to give temporary permission to external app to use the FileProvider
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
ImportExportActivity.this.startActivity(Intent.createChooser(sendIntent,
sendLabel));
dialog.dismiss();
});
}
builder.create().show();
}
}

View File

@@ -0,0 +1,416 @@
package protect.card_locker
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.text.InputType
import android.util.Log
import android.view.MenuItem
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.Button
import android.widget.EditText
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.Toolbar
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.TextInputLayout
import protect.card_locker.async.TaskHandler
import protect.card_locker.databinding.ImportExportActivityBinding
import protect.card_locker.importexport.DataFormat
import protect.card_locker.importexport.ImportExportResult
import protect.card_locker.importexport.ImportExportResultType
import java.io.IOException
import java.io.InputStream
import java.io.OutputStream
class ImportExportActivity : CatimaAppCompatActivity() {
private lateinit var binding: ImportExportActivityBinding
private var importExporter: ImportExportTask? = null
private var importAlertTitle: String? = null
private var importAlertMessage: String? = null
private var importDataFormat: DataFormat? = null
private var exportPassword: String? = null
private lateinit var fileCreateLauncher: ActivityResultLauncher<Intent>
private lateinit var fileOpenLauncher: ActivityResultLauncher<String>
private val mTasks = TaskHandler()
companion object {
private const val TAG = "Catima"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ImportExportActivityBinding.inflate(layoutInflater)
setTitle(R.string.importExport)
setContentView(binding.root)
Utils.applyWindowInsets(binding.root)
val toolbar: Toolbar = binding.toolbar
setSupportActionBar(toolbar)
enableToolbarBackButton()
val fileIntent = intent
if (fileIntent?.type != null) {
chooseImportType(fileIntent.data)
}
// would use ActivityResultContracts.CreateDocument() but mime type cannot be set
fileCreateLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val intent = result.data
if (intent == null) {
Log.e(TAG, "Activity returned NULL data")
return@registerForActivityResult
}
val uri = intent.data
if (uri == null) {
Log.e(TAG, "Activity returned NULL uri")
return@registerForActivityResult
}
// Running this in a thread prevents Android from throwing a NetworkOnMainThreadException for large files
// FIXME: This is still suboptimal, because showing that the export started is delayed until the network request finishes
Thread {
try {
val writer = contentResolver.openOutputStream(uri)
Log.d(TAG, "Starting file export with: $result")
startExport(writer, uri, exportPassword?.toCharArray(), true)
} catch (e: IOException) {
Log.e(TAG, "Failed to export file: $result", e)
onExportComplete(
ImportExportResult(
ImportExportResultType.GenericFailure,
result.toString()
), uri
)
}
}.start()
}
fileOpenLauncher =
registerForActivityResult(ActivityResultContracts.GetContent()) { result ->
if (result == null) {
Log.e(TAG, "Activity returned NULL data")
return@registerForActivityResult
}
openFileForImport(result, null)
}
// Check that there is a file manager available
val intentCreateDocumentAction = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/zip"
putExtra(Intent.EXTRA_TITLE, "catima.zip")
}
val exportButton: Button = binding.exportButton
exportButton.setOnClickListener {
val builder = MaterialAlertDialogBuilder(this@ImportExportActivity)
builder.setTitle(R.string.exportPassword)
val container = FrameLayout(this@ImportExportActivity)
val textInputLayout = TextInputLayout(this@ImportExportActivity).apply {
endIconMode = TextInputLayout.END_ICON_PASSWORD_TOGGLE
layoutParams = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
setMargins(50, 10, 50, 0)
}
}
val input = EditText(this@ImportExportActivity).apply {
inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
setHint(R.string.exportPasswordHint)
}
textInputLayout.addView(input)
container.addView(textInputLayout)
builder.setView(container)
builder.setPositiveButton(R.string.ok) { _, _ ->
exportPassword = input.text.toString()
try {
fileCreateLauncher.launch(intentCreateDocumentAction)
} catch (e: ActivityNotFoundException) {
Toast.makeText(
applicationContext,
R.string.failedOpeningFileManager,
Toast.LENGTH_LONG
).show()
Log.e(TAG, "No activity found to handle intent", e)
}
}
builder.setNegativeButton(R.string.cancel) { dialogInterface, _ -> dialogInterface.cancel() }
builder.show()
}
// Check that there is a file manager available
val importFilesystem: Button = binding.importOptionFilesystemButton
importFilesystem.setOnClickListener { chooseImportType(null) }
// FIXME: The importer/exporter is currently quite broken
// To prevent the screen from turning off during import/export and some devices killing Catima as it's no longer foregrounded, force the screen to stay on here
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private fun openFileForImport(uri: Uri, password: CharArray?) {
// Running this in a thread prevents Android from throwing a NetworkOnMainThreadException for large files
// FIXME: This is still suboptimal, because showing that the import started is delayed until the network request finishes
Thread {
try {
val reader = contentResolver.openInputStream(uri)
Log.d(TAG, "Starting file import with: $uri")
startImport(reader, uri, importDataFormat, password, true)
} catch (e: IOException) {
Log.e(TAG, "Failed to import file: $uri", e)
onImportComplete(
ImportExportResult(
ImportExportResultType.GenericFailure,
e.toString()
), uri, importDataFormat
)
}
}.start()
}
private fun chooseImportType(fileData: Uri?) {
val betaImportOptions = mutableListOf<CharSequence>()
betaImportOptions.add("Fidme")
val importOptions = mutableListOf<CharSequence>()
for (importOption in resources.getStringArray(R.array.import_types_array)) {
var option = importOption
if (betaImportOptions.contains(importOption)) {
option = "$importOption (BETA)"
}
importOptions.add(option)
}
val builder = MaterialAlertDialogBuilder(this)
builder.setTitle(R.string.chooseImportType)
.setItems(importOptions.toTypedArray()) { _, which ->
when (which) {
// Catima
0 -> {
importAlertTitle = getString(R.string.importCatima)
importAlertMessage = getString(R.string.importCatimaMessage)
importDataFormat = DataFormat.Catima
}
// Fidme
1 -> {
importAlertTitle = getString(R.string.importFidme)
importAlertMessage = getString(R.string.importFidmeMessage)
importDataFormat = DataFormat.Fidme
}
// Loyalty Card Keychain
2 -> {
importAlertTitle = getString(R.string.importLoyaltyCardKeychain)
importAlertMessage = getString(R.string.importLoyaltyCardKeychainMessage)
importDataFormat = DataFormat.Catima
}
// Voucher Vault
3 -> {
importAlertTitle = getString(R.string.importVoucherVault)
importAlertMessage = getString(R.string.importVoucherVaultMessage)
importDataFormat = DataFormat.VoucherVault
}
else -> throw IllegalArgumentException("Unknown DataFormat")
}
if (fileData != null) {
openFileForImport(fileData, null)
return@setItems
}
MaterialAlertDialogBuilder(this)
.setTitle(importAlertTitle)
.setMessage(importAlertMessage)
.setPositiveButton(R.string.ok) { _, _ ->
try {
fileOpenLauncher.launch("*/*")
} catch (e: ActivityNotFoundException) {
Toast.makeText(
applicationContext,
R.string.failedOpeningFileManager,
Toast.LENGTH_LONG
).show()
Log.e(TAG, "No activity found to handle intent", e)
}
}
.setNegativeButton(R.string.cancel, null)
.show()
}
builder.show()
}
private fun startImport(
target: InputStream?,
targetUri: Uri,
dataFormat: DataFormat?,
password: CharArray?,
closeWhenDone: Boolean
) {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false)
val listener = ImportExportTask.TaskCompleteListener { result, dataFormat ->
onImportComplete(result, targetUri, dataFormat)
if (closeWhenDone) {
try {
target?.close()
} catch (ioException: IOException) {
ioException.printStackTrace()
}
}
}
importExporter = ImportExportTask(
this@ImportExportActivity,
dataFormat, target, password, listener
)
mTasks.executeTask(TaskHandler.TYPE.IMPORT, importExporter)
}
private fun startExport(
target: OutputStream?,
targetUri: Uri,
password: CharArray?,
closeWhenDone: Boolean
) {
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false)
val listener = ImportExportTask.TaskCompleteListener { result, dataFormat ->
onExportComplete(result, targetUri)
if (closeWhenDone) {
try {
target?.close()
} catch (ioException: IOException) {
ioException.printStackTrace()
}
}
}
importExporter = ImportExportTask(
this@ImportExportActivity,
DataFormat.Catima, target, password, listener
)
mTasks.executeTask(TaskHandler.TYPE.EXPORT, importExporter)
}
override fun onDestroy() {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false)
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false)
super.onDestroy()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == android.R.id.home) {
finish()
return true
}
return super.onOptionsItemSelected(item)
}
private fun retryWithPassword(dataFormat: DataFormat, uri: Uri) {
val builder = MaterialAlertDialogBuilder(this)
builder.setTitle(R.string.passwordRequired)
val container = FrameLayout(this@ImportExportActivity)
val textInputLayout = TextInputLayout(this@ImportExportActivity).apply {
endIconMode = TextInputLayout.END_ICON_PASSWORD_TOGGLE
layoutParams = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
setMargins(50, 10, 50, 0)
}
}
val input = EditText(this@ImportExportActivity).apply {
inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
setHint(R.string.exportPasswordHint)
}
textInputLayout.addView(input)
container.addView(textInputLayout)
builder.setView(container)
builder.setPositiveButton(R.string.ok) { _, _ ->
openFileForImport(uri, input.text.toString().toCharArray())
}
builder.setNegativeButton(R.string.cancel) { dialogInterface, _ -> dialogInterface.cancel() }
builder.show()
}
private fun buildResultDialogMessage(result: ImportExportResult, isImport: Boolean): String {
val messageId = if (result.resultType() == ImportExportResultType.Success) {
if (isImport) R.string.importSuccessful else R.string.exportSuccessful
} else {
if (isImport) R.string.importFailed else R.string.exportFailed
}
val messageBuilder = StringBuilder(resources.getString(messageId))
if (result.developerDetails() != null) {
messageBuilder.append("\n\n")
messageBuilder.append(resources.getString(R.string.include_if_asking_support))
messageBuilder.append("\n\n")
messageBuilder.append(result.developerDetails())
}
return messageBuilder.toString()
}
private fun onImportComplete(result: ImportExportResult, path: Uri, dataFormat: DataFormat?) {
val resultType = result.resultType()
if (resultType == ImportExportResultType.BadPassword) {
retryWithPassword(dataFormat!!, path)
return
}
val builder = MaterialAlertDialogBuilder(this)
builder.setTitle(if (resultType == ImportExportResultType.Success) R.string.importSuccessfulTitle else R.string.importFailedTitle)
builder.setMessage(buildResultDialogMessage(result, true))
builder.setNeutralButton(R.string.ok) { dialog, _ -> dialog.dismiss() }
builder.create().show()
}
private fun onExportComplete(result: ImportExportResult, path: Uri) {
val resultType = result.resultType()
val builder = MaterialAlertDialogBuilder(this)
builder.setTitle(if (resultType == ImportExportResultType.Success) R.string.exportSuccessfulTitle else R.string.exportFailedTitle)
builder.setMessage(buildResultDialogMessage(result, false))
builder.setNeutralButton(R.string.ok) { dialog, _ -> dialog.dismiss() }
if (resultType == ImportExportResultType.Success) {
val sendLabel = this@ImportExportActivity.resources.getText(R.string.sendLabel)
builder.setPositiveButton(sendLabel) { dialog, _ ->
val sendIntent = Intent(Intent.ACTION_SEND).apply {
putExtra(Intent.EXTRA_STREAM, path)
type = "text/csv"
// set flag to give temporary permission to external app to use the FileProvider
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
}
this@ImportExportActivity.startActivity(Intent.createChooser(sendIntent, sendLabel))
dialog.dismiss()
}
}
builder.create().show()
}
}

View File

@@ -1,12 +1,17 @@
package protect.card_locker;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.widget.Toast;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.io.IOException;
import java.io.InputStream;
@@ -32,7 +37,7 @@ public class ImportExportTask implements CompatCallable<ImportExportResult> {
private char[] password;
private TaskCompleteListener listener;
private ProgressDialog progress;
private AlertDialog progress;
/**
* Constructor which will setup a task for exporting to the given file
@@ -88,12 +93,36 @@ public class ImportExportTask implements CompatCallable<ImportExportResult> {
}
public void onPreExecute() {
progress = new ProgressDialog(activity);
progress.setTitle(doImport ? R.string.importing : R.string.exporting);
MaterialAlertDialogBuilder progressDialogBuilder = new MaterialAlertDialogBuilder(activity);
progressDialogBuilder.setCancelable(false); // Don't cancel if user taps next to dialog
progressDialogBuilder.setTitle(doImport ? R.string.importing : R.string.exporting);
progress.setOnCancelListener(dialog -> cancel());
progress.setOnDismissListener(dialog -> cancel());
// Create components
TextView progressDialogTextView = new TextView(activity);
progressDialogTextView.setText(R.string.pleaseDoNotRotateTheDevice); // FIXME: Instead of telling the user to not rotate, rotation should not cancel the import
ProgressBar progressDialogProgressBar = new ProgressBar(activity);
progressDialogProgressBar.setIndeterminate(true);
// Create LinearLayout (to put the components below each other)
LinearLayout progressDialogLayout = new LinearLayout(activity);
progressDialogLayout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams progressDialogLayoutParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
);
int contentPadding = activity.getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
progressDialogLayoutParams.setMargins(contentPadding, contentPadding / 2, contentPadding, 0);
// Put components in layout
progressDialogLayout.addView(progressDialogTextView, progressDialogLayoutParams);
progressDialogLayout.addView(progressDialogProgressBar, progressDialogLayoutParams);
// Create and show dialog
progressDialogBuilder.setView(progressDialogLayout);
progressDialogBuilder.setNeutralButton(R.string.cancel, (dialogInterface, i) -> cancel());
progressDialogBuilder.setOnCancelListener(dialogInterface -> cancel());
progressDialogBuilder.setOnDismissListener(dialogInterface -> cancel());
progress = progressDialogBuilder.create();
progress.show();
}

View File

@@ -125,7 +125,30 @@ public class ImportURIHelper {
headerColor = Integer.parseInt(unparsedHeaderColor);
}
return new LoyaltyCard(-1, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100, 0);
return new LoyaltyCard(
-1,
store,
note,
validFrom,
expiry,
balance,
balanceType,
cardId,
barcodeId,
barcodeType,
headerColor,
0,
Utils.getUnixTime(),
100,
100,
0,
null,
null,
null,
null,
null,
null
);
} catch (NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) {
throw new InvalidObjectException("Not a valid import URI");
}

View File

@@ -1,145 +0,0 @@
package protect.card_locker;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.util.Log;
import androidx.core.graphics.PaintCompat;
/**
* Original from https://github.com/andOTP/andOTP/blob/master/app/src/main/java/org/shadowice/flocke/andotp/Utilities/LetterBitmap.java
* which was originally from http://stackoverflow.com/questions/23122088/colored-boxed-with-letters-a-la-gmail
* Used to create a {@link Bitmap} that contains a letter used in the English
* alphabet or digit, if there is no letter or digit available, a default image
* is shown instead.
*/
class LetterBitmap {
/**
* The number of available tile colors
*/
private static final int NUM_OF_TILE_COLORS = 8;
/**
* The letter bitmap
*/
private final Bitmap mBitmap;
/**
* The background color of the letter bitmap
*/
private final Integer mColor;
/**
* Constructor for <code>LetterTileProvider</code>
*
* @param context The {@link Context} to use
* @param displayName The name used to create the letter for the tile
* @param key The key used to generate the background color for the tile
* @param tileLetterFontSize The font size used to display the letter
* @param width The desired width of the tile
* @param height The desired height of the tile
* @param backgroundColor (optional) color to use for background.
* @param textColor (optional) color to use for text.
*/
public LetterBitmap(Context context, String displayName, String key, int tileLetterFontSize,
int width, int height, Integer backgroundColor, Integer textColor) {
TextPaint paint = new TextPaint();
if (textColor != null) {
paint.setColor(textColor);
} else {
paint.setColor(Color.WHITE);
}
paint.setTextAlign(Paint.Align.CENTER);
paint.setAntiAlias(true);
paint.setTextSize(tileLetterFontSize);
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
if (backgroundColor == null) {
mColor = getDefaultColor(context, key);
} else {
mColor = backgroundColor;
}
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
String firstChar = displayName.substring(0, 1).toUpperCase();
int firstCharEnd = 2;
while (firstCharEnd <= displayName.length()) {
// Test for the longest render-able string
// But ignore containing only a-Z0-9 to not render things like ffi as a single character
String test = displayName.substring(0, firstCharEnd);
if (!isAlphabetical(test) && PaintCompat.hasGlyph(paint, test)) {
firstChar = test;
}
firstCharEnd++;
}
Log.d("LetterBitmap", "using sequence " + firstChar + " to render first char which has length " + firstChar.length());
final Canvas c = new Canvas();
c.setBitmap(mBitmap);
c.drawColor(mColor);
Rect bounds = new Rect();
paint.getTextBounds(firstChar, 0, firstChar.length(), bounds);
c.drawText(firstChar,
0, firstChar.length(),
width / 2.0f, (height - (bounds.bottom + bounds.top)) / 2.0f
, paint);
}
/**
* @return A {@link Bitmap} that contains a letter used in the English
* alphabet or digit, if there is no letter or digit available, a
* default image is shown instead
*/
public Bitmap getLetterTile() {
return mBitmap;
}
/**
* @return background color used for letter title.
*/
public int getBackgroundColor() {
return mColor;
}
/**
* @param key The key used to generate the tile color
* @return A new or previously chosen color for <code>key</code> used as the
* tile background color
*/
private static int pickColor(String key, TypedArray colors) {
// String.hashCode() is not supposed to change across java versions, so
// this should guarantee the same key always maps to the same color
final int color = Math.abs(key.hashCode()) % NUM_OF_TILE_COLORS;
return colors.getColor(color, Color.BLACK);
}
private static boolean isAlphabetical(String string) {
return string.matches("[a-zA-Z0-9]*");
}
/**
* Determine the color which the letter tile will use if no default
* color is provided.
*/
public static int getDefaultColor(Context context, String key) {
final Resources res = context.getResources();
TypedArray colors = res.obtainTypedArray(R.array.letter_tile_colors);
int color = pickColor(key, colors);
colors.recycle();
return color;
}
}

View File

@@ -0,0 +1,136 @@
package protect.card_locker
import android.content.Context
import android.content.res.TypedArray
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.graphics.Typeface
import android.text.TextPaint
import android.util.Log
import androidx.core.graphics.PaintCompat
import java.util.Locale
import kotlin.math.abs
/**
* Original from https://github.com/andOTP/andOTP/blob/master/app/src/main/java/org/shadowice/flocke/andotp/Utilities/LetterBitmap.java
* which was originally from http://stackoverflow.com/questions/23122088/colored-boxed-with-letters-a-la-gmail
* Used to create a {@link Bitmap} that contains a letter used in the English
* alphabet or digit, if there is no letter or digit available, a default image
* is shown instead.
*
* @constructor Constructor for <code>LetterTileProvider</code>
* @param context The {@link Context} to use
* @param displayName The name used to create the letter for the tile
* @param key The key used to generate the background color for the tile
* @param tileLetterFontSize The font size used to display the letter
* @param width The desired width of the tile
* @param height The desired height of the tile
* @param backgroundColor (optional) color to use for background.
* @param textColor (optional) color to use for text.
*/
class LetterBitmap(
context: Context, displayName: String, key: String, tileLetterFontSize: Int,
width: Int, height: Int, backgroundColor: Int?, textColor: Int?
) {
/**
* A {@link Bitmap} that contains a letter used in the English
* alphabet or digit, if there is no letter or digit available, a
* default image is shown instead
*/
private val letterTile: Bitmap
/**
* The background color of the letter bitmap
*/
private val mColor: Int
init {
val paint = TextPaint().apply {
color = textColor ?: Color.WHITE
textAlign = Paint.Align.CENTER
isAntiAlias = true
textSize = tileLetterFontSize.toFloat()
typeface = Typeface.defaultFromStyle(Typeface.BOLD)
}
mColor = backgroundColor ?: getDefaultColor(context, key)
this.letterTile = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
var firstChar = displayName.substring(0, 1).uppercase(Locale.getDefault())
var firstCharEnd = 2
while (firstCharEnd <= displayName.length) {
// Test for the longest render-able string
// But ignore containing only a-Z0-9 to not render things like ffi as a single character
val test = displayName.substring(0, firstCharEnd)
if (!isAlphabetical(test) && PaintCompat.hasGlyph(paint, test)) {
firstChar = test
}
firstCharEnd++
}
Log.d(
"LetterBitmap",
"using sequence $firstChar to render first char which has length ${firstChar.length}"
)
Canvas().apply {
setBitmap(this@LetterBitmap.letterTile)
drawColor(mColor)
val bounds = Rect()
paint.getTextBounds(firstChar, 0, firstChar.length, bounds)
drawText(
firstChar,
0, firstChar.length,
width / 2.0f, (height - (bounds.bottom + bounds.top)) / 2.0f,
paint
)
}
}
val backgroundColor: Int
/**
* @return background color used for letter title.
*/
get() = mColor
fun getLetterTile(): Bitmap {
return letterTile
}
companion object {
/**
* @param key The key used to generate the tile color
* @return A new or previously chosen color for `key` used as the
* tile background color
*/
private fun pickColor(key: String, colors: TypedArray): Int {
// String.hashCode() is not supposed to change across java versions, so
// this should guarantee the same key always maps to the same color
val color = abs(key.hashCode()) % colors.length()
return colors.getColor(color, Color.BLACK)
}
private fun isAlphabetical(string: String): Boolean {
return string.matches("[a-zA-Z0-9]*".toRegex())
}
/**
* Determine the color which the letter tile will use if no default
* color is provided.
*/
fun getDefaultColor(context: Context, key: String): Int {
val res = context.resources
val colors = res.obtainTypedArray(R.array.letter_tile_colors)
val color: Int = pickColor(key, colors)
colors.recycle()
return color
}
}
}

View File

@@ -0,0 +1,131 @@
package protect.card_locker
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.Icon
import android.os.Build
import android.view.View
import android.widget.RemoteViews
import androidx.core.widget.RemoteViewsCompat
import protect.card_locker.DBHelper.LoyaltyCardArchiveFilter
class ListWidget : AppWidgetProvider() {
fun updateAll(context: Context) {
val appWidgetManager = AppWidgetManager.getInstance(context)
val componentName = ComponentName(context, ListWidget::class.java)
onUpdate(
context,
appWidgetManager,
appWidgetManager.getAppWidgetIds(componentName)
)
}
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
val database = DBHelper(context).readableDatabase
// Get cards
val order = Utils.getLoyaltyCardOrder(context);
val orderDirection = Utils.getLoyaltyCardOrderDirection(context);
val loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(
database,
"",
null,
order,
orderDirection,
LoyaltyCardArchiveFilter.Unarchived
)
// Bind every card to cell in the grid
var hasCards = false
val remoteCollectionItemsBuilder = RemoteViewsCompat.RemoteCollectionItems.Builder()
if (loyaltyCardCursor.moveToFirst()) {
do {
val loyaltyCard = LoyaltyCard.fromCursor(context, loyaltyCardCursor)
remoteCollectionItemsBuilder.addItem(
loyaltyCard.id.toLong(),
createRemoteViews(
context, loyaltyCard
)
)
hasCards = true
} while (loyaltyCardCursor.moveToNext())
}
loyaltyCardCursor.close()
// Create the base empty view
var views = RemoteViews(context.packageName, R.layout.list_widget_empty)
if (hasCards) {
// If we have cards, create the list
views = RemoteViews(context.packageName, R.layout.list_widget)
val templateIntent = Intent(context, LoyaltyCardViewActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
context,
0,
templateIntent,
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
views.setPendingIntentTemplate(R.id.grid_view, pendingIntent)
RemoteViewsCompat.setRemoteAdapter(
context,
views,
appWidgetId,
R.id.grid_view,
remoteCollectionItemsBuilder.build()
)
}
// Let Android know the widget is ready for display
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
private fun createRemoteViews(context: Context, loyaltyCard: LoyaltyCard): RemoteViews {
// Create a single cell for the grid view, bind it to open in the LoyaltyCardViewActivity
// Note: Android 5 will not use bitmaps
val remoteViews = RemoteViews(context.packageName, R.layout.list_widget_item).apply {
val headerColor = Utils.getHeaderColor(context, loyaltyCard)
val foreground = if (Utils.needsDarkForeground(headerColor)) Color.BLACK else Color.WHITE
setInt(R.id.item_container_foreground, "setBackgroundColor", headerColor)
val icon = loyaltyCard.getImageThumbnail(context)
// setImageViewIcon is not supported on Android 5, so force Android 5 down the text path
// FIXME: The icon flow causes a crash up to Android 12L, so SDK_INT is forced up from 23 to 33
if (icon != null && Build.VERSION.SDK_INT >= 32) {
setInt(R.id.item_container_foreground, "setBackgroundColor", foreground)
setImageViewIcon(R.id.item_image, Icon.createWithBitmap(icon))
setViewVisibility(R.id.item_text, View.INVISIBLE)
setViewVisibility(R.id.item_image, View.VISIBLE)
} else {
setImageViewBitmap(R.id.item_image, null)
setTextViewText(R.id.item_text, loyaltyCard.store)
setViewVisibility(R.id.item_text, View.VISIBLE)
setViewVisibility(R.id.item_image, View.INVISIBLE)
setTextColor(
R.id.item_text,
foreground
)
}
// Add the card ID to the intent template
val fillInIntent = Intent().apply {
putExtra(LoyaltyCardViewActivity.BUNDLE_ID, loyaltyCard.id)
}
setOnClickFillInIntent(R.id.item_container, fillInIntent)
}
return remoteViews
}
}

View File

@@ -1,9 +1,9 @@
package protect.card_locker;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -11,11 +11,10 @@ import androidx.annotation.Nullable;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.Objects;
public class LoyaltyCard implements Parcelable {
public class LoyaltyCard {
public int id;
public String store;
public String note;
@@ -36,8 +35,23 @@ public class LoyaltyCard implements Parcelable {
public int starStatus;
public long lastUsed;
public int zoomLevel;
public int zoomLevelWidth;
public int archiveStatus;
@Nullable
private Bitmap imageThumbnail;
@Nullable
private String imageThumbnailPath;
@Nullable
private Bitmap imageFront;
@Nullable
private String imageFrontPath;
@Nullable
private Bitmap imageBack;
@Nullable
private String imageBackPath;
public static final String BUNDLE_LOYALTY_CARD_ID = "loyaltyCardId";
public static final String BUNDLE_LOYALTY_CARD_STORE = "loyaltyCardStore";
public static final String BUNDLE_LOYALTY_CARD_NOTE = "loyaltyCardNote";
@@ -52,7 +66,15 @@ public class LoyaltyCard implements Parcelable {
public static final String BUNDLE_LOYALTY_CARD_STAR_STATUS = "loyaltyCardStarStatus";
public static final String BUNDLE_LOYALTY_CARD_LAST_USED = "loyaltyCardLastUsed";
public static final String BUNDLE_LOYALTY_CARD_ZOOM_LEVEL = "loyaltyCardZoomLevel";
public static final String BUNDLE_LOYALTY_CARD_ZOOM_LEVEL_WIDTH = "loyaltyCardZoomLevelWidth";
public static final String BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS = "loyaltyCardArchiveStatus";
public static final String BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL = "loyaltyCardImageThumbnail";
public static final String BUNDLE_LOYALTY_CARD_IMAGE_FRONT = "loyaltyCardImageFront";
public static final String BUNDLE_LOYALTY_CARD_IMAGE_BACK = "loyaltyCardImageBack";
private static final String TEMP_IMAGE_THUMBNAIL_FILE_NAME = "loyaltyCardTempImageThumbnailFileName";
private static final String TEMP_IMAGE_FRONT_FILE_NAME = "loyaltyCardTempImageFrontFileName";
private static final String TEMP_IMAGE_BACK_FILE_NAME = "loyaltyCardTempImageBackFileName";
/**
* Create a loyalty card object with default values
@@ -72,7 +94,11 @@ public class LoyaltyCard implements Parcelable {
setStarStatus(0);
setLastUsed(Utils.getUnixTime());
setZoomLevel(100);
setZoomLevelWidth(100);
setArchiveStatus(0);
setImageThumbnail(null, null);
setImageFront(null, null);
setImageBack(null, null);
}
/**
@@ -92,13 +118,17 @@ public class LoyaltyCard implements Parcelable {
* @param starStatus
* @param lastUsed
* @param zoomLevel
* @param zoomLevelWidth
* @param archiveStatus
*/
public LoyaltyCard(final int id, final String store, final String note, @Nullable final Date validFrom,
@Nullable final Date expiry, final BigDecimal balance, @Nullable final Currency balanceType,
final String cardId, @Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType,
@Nullable final Integer headerColor, final int starStatus,
final long lastUsed, final int zoomLevel, final int archiveStatus) {
final long lastUsed, final int zoomLevel, final int zoomLevelWidth, final int archiveStatus,
@Nullable Bitmap imageThumbnail, @Nullable String imageThumbnailPath,
@Nullable Bitmap imageFront, @Nullable String imageFrontPath,
@Nullable Bitmap imageBack, @Nullable String imageBackPath) {
setId(id);
setStore(store);
setNote(note);
@@ -113,7 +143,65 @@ public class LoyaltyCard implements Parcelable {
setStarStatus(starStatus);
setLastUsed(lastUsed);
setZoomLevel(zoomLevel);
setZoomLevelWidth(zoomLevelWidth);
setArchiveStatus(archiveStatus);
setImageThumbnail(imageThumbnail, imageThumbnailPath);
setImageFront(imageFront, imageFrontPath);
setImageBack(imageBack, imageBackPath);
}
@Nullable
public Bitmap getImageThumbnail(Context context) {
if (imageThumbnailPath != null) {
if (imageThumbnailPath.equals(TEMP_IMAGE_THUMBNAIL_FILE_NAME)) {
imageThumbnail = Utils.loadTempImage(context, imageThumbnailPath);
} else {
imageThumbnail = Utils.retrieveCardImage(context, imageThumbnailPath);
}
imageThumbnailPath = null;
}
if (imageThumbnail == null) {
return null;
}
return imageThumbnail.copy(imageThumbnail.getConfig(), imageThumbnail.isMutable());
}
@Nullable
public Bitmap getImageFront(Context context) {
if (imageFrontPath != null) {
if (imageFrontPath.equals(TEMP_IMAGE_FRONT_FILE_NAME)) {
imageFront = Utils.loadTempImage(context, imageFrontPath);
} else {
imageFront = Utils.retrieveCardImage(context, imageFrontPath);
}
imageFrontPath = null;
}
if (imageFront == null) {
return null;
}
return imageFront.copy(imageFront.getConfig(), imageFront.isMutable());
}
@Nullable
public Bitmap getImageBack(Context context) {
if (imageBackPath != null) {
if (imageBackPath.equals(TEMP_IMAGE_BACK_FILE_NAME)) {
imageBack = Utils.loadTempImage(context, imageBackPath);
} else {
imageBack = Utils.retrieveCardImage(context, imageBackPath);
}
imageBackPath = null;
}
if (imageBack == null) {
return null;
}
return imageBack.copy(imageBack.getConfig(), imageBack.isMutable());
}
public void setId(int id) {
@@ -180,6 +268,14 @@ public class LoyaltyCard implements Parcelable {
this.zoomLevel = zoomLevel;
}
public void setZoomLevelWidth(int zoomLevelWidth) {
if (zoomLevelWidth < 0 || zoomLevelWidth > 100) {
throw new IllegalArgumentException("zoomLevelWidth must be in range 0-100");
}
this.zoomLevelWidth = zoomLevelWidth;
}
public void setArchiveStatus(int archiveStatus) {
if (archiveStatus != 0 && archiveStatus != 1) {
throw new IllegalArgumentException("archiveStatus must be 0 or 1");
@@ -188,59 +284,47 @@ public class LoyaltyCard implements Parcelable {
this.archiveStatus = archiveStatus;
}
protected LoyaltyCard(Parcel in) {
setId(in.readInt());
setStore(Objects.requireNonNull(in.readString()));
setNote(Objects.requireNonNull(in.readString()));
long tmpValidFrom = in.readLong();
setValidFrom(tmpValidFrom > 0 ? new Date(tmpValidFrom) : null);
long tmpExpiry = in.readLong();
setExpiry(tmpExpiry > 0 ? new Date(tmpExpiry) : null);
setBalance((BigDecimal) in.readValue(BigDecimal.class.getClassLoader()));
setBalanceType((Currency) in.readValue(Currency.class.getClassLoader()));
setCardId(Objects.requireNonNull(in.readString()));
setBarcodeId(in.readString());
String tmpBarcodeType = in.readString();
setBarcodeType((tmpBarcodeType != null && !tmpBarcodeType.isEmpty()) ? CatimaBarcode.fromName(tmpBarcodeType) : null);
int tmpHeaderColor = in.readInt();
setHeaderColor(tmpHeaderColor != -1 ? tmpHeaderColor : null);
setStarStatus(in.readInt());
setLastUsed(in.readLong());
setZoomLevel(in.readInt());
setArchiveStatus(in.readInt());
public void setImageThumbnail(@Nullable Bitmap imageThumbnail, @Nullable String imageThumbnailPath) {
if (imageThumbnail != null && imageThumbnailPath != null) {
throw new IllegalArgumentException("Cannot set both thumbnail and path");
}
this.imageThumbnailPath = imageThumbnailPath;
this.imageThumbnail = imageThumbnail != null ? imageThumbnail.copy(imageThumbnail.getConfig(), imageThumbnail.isMutable()) : null;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(id);
parcel.writeString(store);
parcel.writeString(note);
parcel.writeLong(validFrom != null ? validFrom.getTime() : -1);
parcel.writeLong(expiry != null ? expiry.getTime() : -1);
parcel.writeValue(balance);
parcel.writeValue(balanceType);
parcel.writeString(cardId);
parcel.writeString(barcodeId);
parcel.writeString(barcodeType != null ? barcodeType.name() : "");
parcel.writeInt(headerColor != null ? headerColor : -1);
parcel.writeInt(starStatus);
parcel.writeLong(lastUsed);
parcel.writeInt(zoomLevel);
parcel.writeInt(archiveStatus);
public void setImageFront(@Nullable Bitmap imageFront, @Nullable String imageFrontPath) {
if (imageFront != null && imageFrontPath != null) {
throw new IllegalArgumentException("Cannot set both thumbnail and path");
}
this.imageFrontPath = imageFrontPath;
this.imageFront = imageFront != null ? imageFront.copy(imageFront.getConfig(), imageFront.isMutable()) : null;
}
public static LoyaltyCard fromBundle(Bundle bundle, boolean requireFull) {
// Grab default card
LoyaltyCard loyaltyCard = new LoyaltyCard();
public void setImageBack(@Nullable Bitmap imageBack, @Nullable String imageBackPath) {
if (imageBack != null && imageBackPath != null) {
throw new IllegalArgumentException("Cannot set both thumbnail and path");
}
// Update from bundle
loyaltyCard.updateFromBundle(bundle, requireFull);
// Return updated version
return loyaltyCard;
this.imageBackPath = imageBackPath;
this.imageBack = imageBack != null ? imageBack.copy(imageBack.getConfig(), imageBack.isMutable()) : null;
}
public void updateFromBundle(Bundle bundle, boolean requireFull) {
@Nullable
public Bitmap getImageForImageLocationType(Context context, ImageLocationType imageLocationType) {
if (imageLocationType == ImageLocationType.icon) {
return getImageThumbnail(context);
} else if (imageLocationType == ImageLocationType.front) {
return getImageFront(context);
} else if (imageLocationType == ImageLocationType.back) {
return getImageBack(context);
}
throw new IllegalArgumentException("Unknown image location type");
}
public void updateFromBundle(@NonNull Bundle bundle, boolean requireFull) {
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_ID)) {
setId(bundle.getInt(BUNDLE_LOYALTY_CARD_ID));
} else if (requireFull) {
@@ -316,46 +400,120 @@ public class LoyaltyCard implements Parcelable {
} else if (requireFull) {
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_ZOOM_LEVEL);
}
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL_WIDTH)) {
setZoomLevelWidth(bundle.getInt(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL_WIDTH));
} else if (requireFull) {
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_ZOOM_LEVEL_WIDTH);
}
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS)) {
setArchiveStatus(bundle.getInt(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS));
} else if (requireFull) {
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS);
}
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL)) {
setImageThumbnail(null, bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL));
} else if (requireFull) {
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL);
}
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_FRONT)) {
setImageFront(null, bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT));
} else if (requireFull) {
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_FRONT);
}
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_BACK)) {
setImageBack(null, bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_BACK));
} else if (requireFull) {
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_BACK);
}
}
public Bundle toBundle() {
public Bundle toBundle(Context context, List<String> exportLimit) {
boolean exportIsLimited = !exportLimit.isEmpty();
Bundle bundle = new Bundle();
bundle.putInt(BUNDLE_LOYALTY_CARD_ID, id);
bundle.putString(BUNDLE_LOYALTY_CARD_STORE, store);
bundle.putString(BUNDLE_LOYALTY_CARD_NOTE, note);
if (validFrom != null) {
bundle.putLong(BUNDLE_LOYALTY_CARD_VALID_FROM, validFrom.getTime());
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_ID)) {
bundle.putInt(BUNDLE_LOYALTY_CARD_ID, id);
}
if (expiry != null) {
bundle.putLong(BUNDLE_LOYALTY_CARD_EXPIRY, expiry.getTime());
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_STORE)) {
bundle.putString(BUNDLE_LOYALTY_CARD_STORE, store);
}
bundle.putString(BUNDLE_LOYALTY_CARD_BALANCE, balance.toString());
if (balanceType != null) {
bundle.putString(BUNDLE_LOYALTY_CARD_BALANCE_TYPE, balanceType.toString());
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_NOTE)) {
bundle.putString(BUNDLE_LOYALTY_CARD_NOTE, note);
}
bundle.putString(BUNDLE_LOYALTY_CARD_CARD_ID, cardId);
bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_ID, barcodeId);
if (barcodeType != null) {
bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_TYPE, barcodeType.name());
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_VALID_FROM)) {
bundle.putLong(BUNDLE_LOYALTY_CARD_VALID_FROM, validFrom != null ? validFrom.getTime() : -1);
}
if (headerColor != null) {
bundle.putInt(BUNDLE_LOYALTY_CARD_HEADER_COLOR, headerColor);
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_EXPIRY)) {
bundle.putLong(BUNDLE_LOYALTY_CARD_EXPIRY, expiry != null ? expiry.getTime() : -1);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BALANCE)) {
bundle.putString(BUNDLE_LOYALTY_CARD_BALANCE, balance.toString());
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BALANCE_TYPE)) {
bundle.putString(BUNDLE_LOYALTY_CARD_BALANCE_TYPE, balanceType != null ? balanceType.toString() : null);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_CARD_ID)) {
bundle.putString(BUNDLE_LOYALTY_CARD_CARD_ID, cardId);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BARCODE_ID)) {
bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_ID, barcodeId);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BARCODE_TYPE)) {
bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_HEADER_COLOR)) {
bundle.putInt(BUNDLE_LOYALTY_CARD_HEADER_COLOR, headerColor != null ? headerColor : -1);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_STAR_STATUS)) {
bundle.putInt(BUNDLE_LOYALTY_CARD_STAR_STATUS, starStatus);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_LAST_USED)) {
bundle.putLong(BUNDLE_LOYALTY_CARD_LAST_USED, lastUsed);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL)) {
bundle.putInt(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL, zoomLevel);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL_WIDTH)) {
bundle.putInt(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL_WIDTH, zoomLevelWidth);
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS)) {
bundle.putInt(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS, archiveStatus);
}
// There is an (undocumented) size limit to bundles of around 2MB(?), when going over it you will experience a random crash
// So, instead of storing the bitmaps directly, we write the bitmap to a temp file and store the path
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL)) {
Bitmap thumbnail = getImageThumbnail(context);
if (thumbnail != null) {
Utils.saveTempImage(context, thumbnail, TEMP_IMAGE_THUMBNAIL_FILE_NAME, Bitmap.CompressFormat.PNG);
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL, TEMP_IMAGE_THUMBNAIL_FILE_NAME);
} else {
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL, null);
}
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_FRONT)) {
Bitmap front = getImageFront(context);
if (front != null) {
Utils.saveTempImage(context, front, TEMP_IMAGE_FRONT_FILE_NAME, Bitmap.CompressFormat.PNG);
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT, TEMP_IMAGE_FRONT_FILE_NAME);
} else {
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT, null);
}
}
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_BACK)) {
Bitmap back = getImageBack(context);
if (back != null) {
Utils.saveTempImage(context, back, TEMP_IMAGE_BACK_FILE_NAME, Bitmap.CompressFormat.PNG);
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_BACK, TEMP_IMAGE_BACK_FILE_NAME);
} else {
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_BACK, null);
}
}
bundle.putInt(BUNDLE_LOYALTY_CARD_STAR_STATUS, starStatus);
bundle.putLong(BUNDLE_LOYALTY_CARD_LAST_USED, lastUsed);
bundle.putInt(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL, zoomLevel);
bundle.putInt(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS, archiveStatus);
return bundle;
}
public static LoyaltyCard fromCursor(Cursor cursor) {
public static LoyaltyCard fromCursor(Context context, Cursor cursor) {
// id
int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
// store
@@ -390,14 +548,40 @@ public class LoyaltyCard implements Parcelable {
long lastUsed = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.LAST_USED));
// zoomLevel
int zoomLevel = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ZOOM_LEVEL));
// zoomLevelWidth
int zoomLevelWidth = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ZOOM_LEVEL_WIDTH));
// archiveStatus
int archiveStatus = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS));
return new LoyaltyCard(id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, zoomLevel, archiveStatus);
return new LoyaltyCard(
id,
store,
note,
validFrom,
expiry,
balance,
balanceType,
cardId,
barcodeId,
barcodeType,
headerColor,
starStatus,
lastUsed,
zoomLevel,
zoomLevelWidth,
archiveStatus,
null,
Utils.getCardImageFileName(id, ImageLocationType.icon),
null,
Utils.getCardImageFileName(id, ImageLocationType.front),
null,
Utils.getCardImageFileName(id, ImageLocationType.back)
);
}
public static boolean isDuplicate(final LoyaltyCard a, final LoyaltyCard b) {
// Skip lastUsed & zoomLevel
public static boolean isDuplicate(Context context, final LoyaltyCard a, final LoyaltyCard b) {
// Note: Bitmap comparing is slow, be careful when calling this method
// Skip lastUsed & zoomLevel*
return a.id == b.id && // non-nullable int
a.store.equals(b.store) && // non-nullable String
a.note.equals(b.note) && // non-nullable String
@@ -411,12 +595,23 @@ public class LoyaltyCard implements Parcelable {
b.barcodeType == null ? null : b.barcodeType.format()) && // nullable CatimaBarcode with no overridden .equals(), so we need to check .format()
Utils.equals(a.headerColor, b.headerColor) && // nullable Integer
a.starStatus == b.starStatus && // non-nullable int
a.archiveStatus == b.archiveStatus; // non-nullable int
a.archiveStatus == b.archiveStatus && // non-nullable int
nullableBitmapsEqual(a.getImageThumbnail(context), b.getImageThumbnail(context)) && // nullable Bitmap
nullableBitmapsEqual(a.getImageFront(context), b.getImageFront(context)) && // nullable Bitmap
nullableBitmapsEqual(a.getImageBack(context), b.getImageBack(context)); // nullable Bitmap
}
@Override
public int describeContents() {
return 0;
public static boolean nullableBitmapsEqual(@Nullable Bitmap a, @Nullable Bitmap b) {
if (a == null && b == null) {
return true;
}
if (a != null && b != null) {
return a.sameAs(b);
}
// One is null and the other isn't, so it's not equal
return false;
}
@NonNull
@@ -425,7 +620,8 @@ public class LoyaltyCard implements Parcelable {
return String.format(
"LoyaltyCard{%n id=%s,%n store=%s,%n note=%s,%n validFrom=%s,%n expiry=%s,%n"
+ " balance=%s,%n balanceType=%s,%n cardId=%s,%n barcodeId=%s,%n barcodeType=%s,%n"
+ " headerColor=%s,%n starStatus=%s,%n lastUsed=%s,%n zoomLevel=%s,%n archiveStatus=%s%n}",
+ " headerColor=%s,%n starStatus=%s,%n lastUsed=%s,%n zoomLevel=%s,%n zoomLevelWidth=%s,%n archiveStatus=%s%n"
+ " imageThumbnail=%s,%n imageThumbnailPath=%s,%n imageFront=%s,%n imageFrontPath=%s,%n imageBack=%s,%n imageBackPath=%s,%n}",
this.id,
this.store,
this.note,
@@ -440,19 +636,14 @@ public class LoyaltyCard implements Parcelable {
this.starStatus,
this.lastUsed,
this.zoomLevel,
this.archiveStatus
this.zoomLevelWidth,
this.archiveStatus,
this.imageThumbnail,
this.imageThumbnailPath,
this.imageFront,
this.imageFrontPath,
this.imageBack,
this.imageBackPath
);
}
public static final Creator<LoyaltyCard> CREATOR = new Creator<LoyaltyCard>() {
@Override
public LoyaltyCard createFromParcel(Parcel in) {
return new LoyaltyCard(in);
}
@Override
public LoyaltyCard[] newArray(int size) {
return new LoyaltyCard[size];
}
};
}

View File

@@ -80,7 +80,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public LoyaltyCard getCard(int position) {
mCursor.moveToPosition(position);
return LoyaltyCard.fromCursor(mCursor);
return LoyaltyCard.fromCursor(mContext, mCursor);
}
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
@@ -88,8 +88,8 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
boolean showDivider = false;
inputHolder.mDivider.setVisibility(View.GONE);
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(inputCursor);
Bitmap icon = Utils.retrieveCardImage(mContext, loyaltyCard.id, ImageLocationType.icon);
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(mContext, inputCursor);
Bitmap icon = loyaltyCard.getImageThumbnail(mContext);
if (mLoyaltyCardListDisplayOptions.showingNameBelowThumbnail() && icon != null) {
showDivider = true;
@@ -124,9 +124,9 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
}
inputHolder.mCardIcon.setContentDescription(loyaltyCard.store);
inputHolder.mIconBackgroundColor = Utils.setIconOrTextWithBackground(mContext, loyaltyCard, icon, inputHolder.mCardIcon, inputHolder.mCardText, new Settings(mContext).getPreferredColumnCount());
Utils.setIconOrTextWithBackground(mContext, loyaltyCard, icon, inputHolder.mCardIcon, inputHolder.mCardText, new Settings(mContext).getPreferredColumnCount());
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0);
inputHolder.itemView.setActivated(mSelectedItems.get(inputCursor.getPosition(), false));
applyIconAnimation(inputHolder, inputCursor.getPosition());
@@ -193,7 +193,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
int i;
for (i = 0; i < mSelectedItems.size(); i++) {
mCursor.moveToPosition(mSelectedItems.keyAt(i));
result.add(LoyaltyCard.fromCursor(mCursor));
result.add(LoyaltyCard.fromCursor(mContext, mCursor));
}
return result;
@@ -212,13 +212,11 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mCardText, mStoreField, mNoteField, mBalanceField, mValidFromField, mExpiryField;
public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground;
public ImageView mCardIcon, mTickIcon;
public MaterialCardView mRow;
public ConstraintLayout mStar, mArchived;
public View mDivider;
private int mIconBackgroundColor;
protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) {
super(loyaltyCardLayoutBinding.getRoot());
View inputView = loyaltyCardLayoutBinding.getRoot();
@@ -232,10 +230,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mCardIcon = loyaltyCardLayoutBinding.thumbnail;
mCardText = loyaltyCardLayoutBinding.thumbnailText;
mStar = loyaltyCardLayoutBinding.star;
mStarBackground = loyaltyCardLayoutBinding.starBackground;
mStarBorder = loyaltyCardLayoutBinding.starBorder;
mArchived = loyaltyCardLayoutBinding.archivedIcon;
mArchivedBackground = loyaltyCardLayoutBinding.archiveBackground;
mTickIcon = loyaltyCardLayoutBinding.selectedThumbnail;
inputView.setOnLongClickListener(view -> {
inputListener.onRowClicked(getAdapterPosition());
@@ -297,31 +292,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mNoteField.requestLayout();
}
public void toggleCardStateIcon(boolean enableStar, boolean enableArchive, boolean colorByTheme) {
/* the below code does not work in android 5! hence the change of drawable instead
boolean needDarkForeground = Utils.needsDarkForeground(mIconBackgroundColor);
Drawable borderDrawable = mStarBorder.getDrawable().mutate();
Drawable backgroundDrawable = mStarBackground.getDrawable().mutate();
DrawableCompat.setTint(borderDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
DrawableCompat.setTint(backgroundDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
mStarBorder.setImageDrawable(borderDrawable);
mStarBackground.setImageDrawable(backgroundDrawable);
*/
boolean dark = Utils.needsDarkForeground(mIconBackgroundColor);
if (colorByTheme) {
dark = !mDarkModeEnabled;
}
if (dark) {
mStarBorder.setImageResource(R.drawable.ic_unstarred_white);
mStarBackground.setImageResource(R.drawable.ic_starred_black);
mArchivedBackground.setImageResource(R.drawable.ic_baseline_archive_24_black);
} else {
mStarBorder.setImageResource(R.drawable.ic_unstarred_black);
mStarBackground.setImageResource(R.drawable.ic_starred_white);
mArchivedBackground.setImageResource(R.drawable.ic_baseline_archive_24);
}
public void toggleCardStateIcon(boolean enableStar, boolean enableArchive) {
if (enableStar) {
mStar.setVisibility(View.VISIBLE);
} else{
@@ -333,11 +304,6 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
} else{
mArchived.setVisibility(View.GONE);
}
mStarBorder.invalidate();
mStarBackground.invalidate();
mArchivedBackground.invalidate();
}
}
}

View File

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,12 @@ import android.app.Application;
import androidx.appcompat.app.AppCompatDelegate;
import org.acra.ACRA;
import org.acra.config.CoreConfigurationBuilder;
import org.acra.config.DialogConfigurationBuilder;
import org.acra.config.MailSenderConfigurationBuilder;
import org.acra.data.StringFormat;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardLockerApplication extends Application {
@@ -12,6 +18,27 @@ public class LoyaltyCardLockerApplication extends Application {
public void onCreate() {
super.onCreate();
// Initialize crash reporter (if enabled)
if (BuildConfig.useAcraCrashReporter) {
ACRA.init(this, new CoreConfigurationBuilder()
//core configuration:
.withBuildConfigClass(BuildConfig.class)
.withReportFormat(StringFormat.KEY_VALUE_LIST)
.withPluginConfigurations(
new DialogConfigurationBuilder()
.withText(String.format(getString(R.string.acra_catima_has_crashed), getString(R.string.app_name)))
.withCommentPrompt(getString(R.string.acra_explain_crash))
.withResTheme(R.style.AppTheme)
.build(),
new MailSenderConfigurationBuilder()
.withMailTo("acra-crash@catima.app")
.withSubject(String.format(getString(R.string.acra_crash_email_subject), getString(R.string.app_name)))
.build()
)
);
}
// Set theme
Settings settings = new Settings(this);
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
}

View File

@@ -1,8 +1,9 @@
package protect.card_locker;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.database.sqlite.SQLiteDatabase;
@@ -52,6 +53,7 @@ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText;
import com.google.zxing.BarcodeFormat;
import java.io.File;
import java.io.UnsupportedEncodingException;
@@ -139,6 +141,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// If the barcode is shown, switch to fullscreen layout
if (imageType == ImageType.BARCODE) {
setFullscreen(true);
return;
}
@@ -221,7 +224,13 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} else {
binding.scalerGuideline.setGuidelinePercent(0.5f * scale);
}
}
private void setScalerWidthGuideline(int zoomLevelWidth) {
float halfscale = zoomLevelWidth / 200f;
binding.scalerEndwidthguideline.setGuidelinePercent(0.5f + halfscale);
binding.scalerStartwidthguideline.setGuidelinePercent(0.5f - halfscale);
}
@Override
@@ -248,24 +257,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
super.onCreate(savedInstanceState);
binding = LoyaltyCardViewLayoutBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Utils.applyWindowInsets(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
settings = new Settings(this);
String cardOrientation = settings.getCardViewOrientation();
if (cardOrientation.equals(getString(R.string.settings_key_follow_sensor_orientation))) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
} else if (cardOrientation.equals(getString(R.string.settings_key_lock_on_opening_orientation))) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
} else if (cardOrientation.equals(getString(R.string.settings_key_portrait_orientation))) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if (cardOrientation.equals(getString(R.string.settings_key_landscape_orientation))) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
if (savedInstanceState != null) {
mainImageIndex = savedInstanceState.getInt(STATE_IMAGEINDEX);
isFullscreen = savedInstanceState.getBoolean(STATE_FULLSCREEN);
@@ -278,36 +275,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
database = new DBHelper(this).getWritableDatabase();
importURIHelper = new ImportURIHelper(this);
binding.barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (!fromUser) {
Log.d(TAG, "non user triggered onProgressChanged, ignoring, progress is " + progress);
return;
}
Log.d(TAG, "Progress is " + progress);
Log.d(TAG, "Max is " + binding.barcodeScaler.getMax());
float scale = (float) progress / (float) binding.barcodeScaler.getMax();
Log.d(TAG, "Scaling to " + scale);
loyaltyCard.zoomLevel = progress;
DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel);
setScalerGuideline(loyaltyCard.zoomLevel);
drawMainImage(mainImageIndex, true, isFullscreen);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
binding.barcodeScaler.setOnSeekBarChangeListener(setOnSeekBarChangeListenerUnifiedFunction());
binding.barcodeWidthscaler.setOnSeekBarChangeListener(setOnSeekBarChangeListenerUnifiedFunction());
rotationEnabled = true;
@@ -329,7 +298,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
binding.bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog());
binding.iconContainer.setOnClickListener(view -> {
if (Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon) != null) {
if (loyaltyCard.getImageThumbnail(this) != null) {
openImageInGallery(ImageType.ICON);
} else {
Toast.makeText(LoyaltyCardViewActivity.this, R.string.icon_header_click_text, Toast.LENGTH_LONG).show();
@@ -369,6 +338,46 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
});
}
private SeekBar.OnSeekBarChangeListener setOnSeekBarChangeListenerUnifiedFunction() {
return new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (!fromUser) {
Log.d(TAG, "non user triggered onProgressChanged, ignoring, progress is " + progress);
return;
}
Log.d(TAG, "Progress is " + progress);
if (seekBar.getId() == binding.barcodeScaler.getId()) {
Log.d(TAG, "Max is " + binding.barcodeScaler.getMax());
float scale = (float) progress / (float) binding.barcodeScaler.getMax();
Log.d(TAG, "Scaling to " + scale);
}
else {
Log.d(TAG, "Max is " + binding.barcodeWidthscaler.getMax());
float scale = (float) progress / (float) binding.barcodeWidthscaler.getMax();
Log.d(TAG, "Scaling to " + scale);
}
if (seekBar.getId() == binding.barcodeScaler.getId()) {
loyaltyCard.zoomLevel = progress;
setScalerGuideline(loyaltyCard.zoomLevel);
}
else {
loyaltyCard.zoomLevelWidth = progress;
setScalerWidthGuideline(loyaltyCard.zoomLevelWidth);
}
DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel, loyaltyCard.zoomLevelWidth);
drawMainImage(mainImageIndex, true, isFullscreen);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
};
}
private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) {
if (spannableStringBuilder.length() > 0) {
spannableStringBuilder.append("\n\n");
@@ -660,7 +669,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
window.setAttributes(attributes);
}
loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId);
loyaltyCard = DBHelper.getLoyaltyCard(this, database, loyaltyCardId);
if (loyaltyCard == null) {
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
@@ -696,10 +705,22 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(LoyaltyCardViewActivity.this);
builder.setTitle(R.string.cardId);
builder.setView(cardIdView);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> dialogInterface.dismiss());
builder.setPositiveButton(android.R.string.ok, (dialog, which) -> dialog.dismiss());
builder.setNeutralButton(R.string.copy_value, (dialog, which) -> {
copyCardIdToClipboard();
});
AlertDialog dialog = builder.create();
dialog.show();
});
binding.mainImageDescription.setOnLongClickListener(view -> {
if (mainImageIndex != 0) {
// Don't copy to clipboard, we're showing something else
return false;
}
copyCardIdToClipboard();
return true;
});
int backgroundHeaderColor = Utils.getHeaderColor(this, loyaltyCard);
@@ -707,6 +728,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
int darkenedColor = ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.1f);
binding.barcodeScaler.setProgressTintList(ColorStateList.valueOf(darkenedColor));
binding.barcodeScaler.setThumbTintList(ColorStateList.valueOf(darkenedColor));
binding.barcodeWidthscaler.setProgressTintList(ColorStateList.valueOf(darkenedColor));
binding.barcodeWidthscaler.setThumbTintList(ColorStateList.valueOf(darkenedColor));
// Set bottomAppBar and system navigation bar color
binding.bottomAppBar.setBackgroundColor(darkenedColor);
@@ -719,7 +742,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
binding.fabEdit.setImageDrawable(editButtonIcon);
Bitmap icon = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon);
Bitmap icon = loyaltyCard.getImageThumbnail(this);
Utils.setIconOrTextWithBackground(this, loyaltyCard, icon, binding.iconImage, binding.iconText, 1);
// If the background is very bright, we should use dark icons
@@ -748,12 +771,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
imageTypes.add(ImageType.BARCODE);
}
frontImageBitmap = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.front);
frontImageBitmap = loyaltyCard.getImageFront(this);
if (frontImageBitmap != null) {
imageTypes.add(ImageType.IMAGE_FRONT);
}
backImageBitmap = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.back);
backImageBitmap = loyaltyCard.getImageBack(this);
if (backImageBitmap != null) {
imageTypes.add(ImageType.IMAGE_BACK);
}
@@ -857,6 +880,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} else if (id == R.id.action_star_unstar) {
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, loyaltyCard.starStatus == 0 ? 1 : 0);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
// Re-init loyaltyCard with new data from DB
onResume();
invalidateOptionsMenu();
@@ -867,6 +892,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show();
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
// Re-init loyaltyCard with new data from DB
onResume();
@@ -892,6 +918,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
DBHelper.deleteLoyaltyCard(database, LoyaltyCardViewActivity.this, loyaltyCardId);
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
finish();
dialog.dismiss();
@@ -935,7 +962,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
null,
false,
this,
addPadding);
addPadding,
isFullscreen);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
}
@@ -1070,6 +1098,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
private void setMainImagePreviousNextButtons() {
// Ensure the main image index is valid. After a card update, some images (front/back/barcode)
// may have been removed, so the index should not exceed the number of available images.
if(mainImageIndex > imageTypes.size() - 1){
mainImageIndex = 0;
}
if (imageTypes.size() < 2) {
binding.mainLeftButton.setVisibility(View.INVISIBLE);
binding.mainRightButton.setVisibility(View.INVISIBLE);
@@ -1129,11 +1163,18 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
binding.container.setVisibility(View.GONE);
binding.fullscreenLayout.setVisibility(View.VISIBLE);
// Only show width slider if the barcode isn't square (square barcodes will resize height and width together)
// or if the internals of the barcode are squares, like DATA_MATRIX
binding.setWidthLayout.setVisibility((format.isSquare() || format.format() == BarcodeFormat.DATA_MATRIX) ? View.GONE : View.VISIBLE);
drawMainImage(mainImageIndex, true, isFullscreen);
binding.barcodeScaler.setProgress(loyaltyCard.zoomLevel);
setScalerGuideline(loyaltyCard.zoomLevel);
binding.barcodeWidthscaler.setProgress(loyaltyCard.zoomLevelWidth);
setScalerWidthGuideline(loyaltyCard.zoomLevelWidth);
// Hide actionbar
if (actionBar != null) {
actionBar.hide();
@@ -1219,4 +1260,20 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
);
}
}
private void copyCardIdToClipboard() {
// Take the value thats already displayed to the user
String value = loyaltyCard.cardId;
if (value == null || value.isEmpty()) {
Toast.makeText(this, R.string.nothing_to_copy, Toast.LENGTH_SHORT).show();
return;
}
ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(getString(R.string.cardId), value);
cm.setPrimaryClip(clip);
Toast.makeText(this, R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show();
}
}

View File

@@ -1,846 +0,0 @@
package protect.card_locker;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.CursorIndexOutOfBoundsException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Toast;
import androidx.activity.OnBackPressedCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.SearchView;
import androidx.core.splashscreen.SplashScreen;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import protect.card_locker.databinding.ContentMainBinding;
import protect.card_locker.databinding.MainActivityBinding;
import protect.card_locker.databinding.SortingOptionBinding;
import protect.card_locker.preferences.Settings;
import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
private MainActivityBinding binding;
private ContentMainBinding contentMainBinding;
private static final String TAG = "Catima";
public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent";
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
static final String STATE_SEARCH_QUERY = "SEARCH_QUERY";
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
private ActionMode mCurrentActionMode;
private SearchView mSearchView;
private int mLoyaltyCardCount = 0;
protected String mFilter = "";
private String currentQuery = "";
private String finalQuery = "";
protected Object mGroup = null;
protected DBHelper.LoyaltyCardOrder mOrder = DBHelper.LoyaltyCardOrder.Alpha;
protected DBHelper.LoyaltyCardOrderDirection mOrderDirection = DBHelper.LoyaltyCardOrderDirection.Ascending;
protected int selectedTab = 0;
private RecyclerView mCardList;
private View mHelpSection;
private View mNoMatchingCardsText;
private View mNoGroupCardsText;
private TabLayout groupsTabLayout;
private Runnable mUpdateLoyaltyCardListRunnable;
private ActivityResultLauncher<Intent> mBarcodeScannerLauncher;
private ActivityResultLauncher<Intent> mSettingsLauncher;
private ActionMode.Callback mCurrentActionModeCallback = new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode inputMode, Menu inputMenu) {
inputMode.getMenuInflater().inflate(R.menu.card_longclick_menu, inputMenu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode inputMode, Menu inputMenu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode inputMode, MenuItem inputItem) {
if (inputItem.getItemId() == R.id.action_share) {
final ImportURIHelper importURIHelper = new ImportURIHelper(MainActivity.this);
try {
importURIHelper.startShareIntent(mAdapter.getSelectedItems());
} catch (UnsupportedEncodingException e) {
Toast.makeText(MainActivity.this, R.string.failedGeneratingShareURL, Toast.LENGTH_LONG).show();
e.printStackTrace();
}
inputMode.finish();
return true;
} else if (inputItem.getItemId() == R.id.action_edit) {
if (mAdapter.getSelectedItemCount() != 1) {
throw new IllegalArgumentException("Cannot edit more than 1 card at a time");
}
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle();
bundle.putInt(LoyaltyCardEditActivity.BUNDLE_ID, mAdapter.getSelectedItems().get(0).id);
bundle.putBoolean(LoyaltyCardEditActivity.BUNDLE_UPDATE, true);
intent.putExtras(bundle);
startActivity(intent);
inputMode.finish();
return true;
} else if (inputItem.getItemId() == R.id.action_delete) {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(MainActivity.this);
// The following may seem weird, but it is necessary to give translators enough flexibility.
// For example, in Russian, Android's plural quantity "one" actually refers to "any number ending on 1 but not ending in 11".
// So while in English the extra non-plural form seems unnecessary duplication, it is necessary to give translators enough flexibility.
// In here, we use the plain string when meaning exactly 1, and otherwise use the plural forms
if (mAdapter.getSelectedItemCount() == 1) {
builder.setTitle(R.string.deleteTitle);
builder.setMessage(R.string.deleteConfirmation);
} else {
builder.setTitle(getResources().getQuantityString(R.plurals.deleteCardsTitle, mAdapter.getSelectedItemCount(), mAdapter.getSelectedItemCount()));
builder.setMessage(getResources().getQuantityString(R.plurals.deleteCardsConfirmation, mAdapter.getSelectedItemCount(), mAdapter.getSelectedItemCount()));
}
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Deleting card: " + loyaltyCard.id);
DBHelper.deleteLoyaltyCard(mDatabase, MainActivity.this, loyaltyCard.id);
ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id);
}
TabLayout.Tab tab = groupsTabLayout.getTabAt(selectedTab);
mGroup = tab != null ? tab.getTag() : null;
updateLoyaltyCardList(true);
dialog.dismiss();
});
builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
return true;
} else if (inputItem.getItemId() == R.id.action_archive) {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Archiving card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 1);
ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id);
updateLoyaltyCardList(false);
inputMode.finish();
invalidateOptionsMenu();
}
return true;
} else if (inputItem.getItemId() == R.id.action_unarchive) {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Unarchiving card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 0);
updateLoyaltyCardList(false);
inputMode.finish();
invalidateOptionsMenu();
}
return true;
} else if (inputItem.getItemId() == R.id.action_star) {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Starring card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardStarStatus(mDatabase, loyaltyCard.id, 1);
updateLoyaltyCardList(false);
inputMode.finish();
}
return true;
} else if (inputItem.getItemId() == R.id.action_unstar) {
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Unstarring card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardStarStatus(mDatabase, loyaltyCard.id, 0);
updateLoyaltyCardList(false);
inputMode.finish();
}
return true;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode inputMode) {
mAdapter.clearSelections();
mCurrentActionMode = null;
}
};
@Override
protected void onCreate(Bundle inputSavedInstanceState) {
SplashScreen.installSplashScreen(this);
super.onCreate(inputSavedInstanceState);
// We should extract the share intent after we called the super.onCreate as it may need to spawn a dialog window and the app needs to be initialized to not crash
extractIntentFields(getIntent());
binding = MainActivityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
groupsTabLayout = binding.groups;
contentMainBinding = ContentMainBinding.bind(binding.include.getRoot());
mDatabase = new DBHelper(this).getWritableDatabase();
mUpdateLoyaltyCardListRunnable = () -> {
updateLoyaltyCardList(false);
};
groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
selectedTab = tab.getPosition();
Log.d("onTabSelected", "Tab Position " + tab.getPosition());
mGroup = tab.getTag();
updateLoyaltyCardList(false);
// Store active tab in Shared Preference to restore next app launch
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
Context.MODE_PRIVATE);
SharedPreferences.Editor activeTabPrefEditor = activeTabPref.edit();
activeTabPrefEditor.putInt(getString(R.string.sharedpreference_active_tab), tab.getPosition());
activeTabPrefEditor.apply();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
mHelpSection = contentMainBinding.helpSection;
mNoMatchingCardsText = contentMainBinding.noMatchingCardsText;
mNoGroupCardsText = contentMainBinding.noGroupCardsText;
mCardList = contentMainBinding.list;
mAdapter = new LoyaltyCardCursorAdapter(this, null, this, mUpdateLoyaltyCardListRunnable);
mCardList.setAdapter(mAdapter);
registerForContextMenu(mCardList);
mBarcodeScannerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
// Exit early if the user cancelled the scan (pressed back/home)
if (result.getResultCode() != RESULT_OK) {
return;
}
Intent intent = result.getData();
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
Bundle inputBundle = intent.getExtras();
String group = inputBundle != null ? inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) : null;
processBarcodeValuesList(barcodeValuesList, group, false);
});
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
Intent intent = result.getData();
if (intent != null && intent.getBooleanExtra(RESTART_ACTIVITY_INTENT, false)) {
recreate();
}
}
});
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
if (mSearchView != null && !mSearchView.isIconified()) {
mSearchView.setIconified(true);
} else {
finish();
}
}
});
}
@Override
protected void onResume() {
super.onResume();
if (mCurrentActionMode != null) {
mAdapter.clearSelections();
mCurrentActionMode.finish();
}
if (mSearchView != null && !mSearchView.isIconified()) {
mFilter = mSearchView.getQuery().toString();
}
// Start of active tab logic
updateTabGroups(groupsTabLayout);
// Restore selected tab from Shared Preference
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
Context.MODE_PRIVATE);
selectedTab = activeTabPref.getInt(getString(R.string.sharedpreference_active_tab), 0);
// Restore sort preferences from Shared Preferences
// If one of the sorting prefererences has never been set or is set to an invalid value,
// stick to the defaults.
SharedPreferences sortPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_sort),
Context.MODE_PRIVATE);
String orderString = sortPref.getString(getString(R.string.sharedpreference_sort_order), null);
String orderDirectionString = sortPref.getString(getString(R.string.sharedpreference_sort_direction), null);
if (orderString != null && orderDirectionString != null) {
try {
mOrder = DBHelper.LoyaltyCardOrder.valueOf(orderString);
mOrderDirection = DBHelper.LoyaltyCardOrderDirection.valueOf(orderDirectionString);
} catch (IllegalArgumentException ignored) {
}
}
mGroup = null;
if (groupsTabLayout.getTabCount() != 0) {
TabLayout.Tab tab = groupsTabLayout.getTabAt(selectedTab);
if (tab == null) {
tab = groupsTabLayout.getTabAt(0);
}
groupsTabLayout.selectTab(tab);
assert tab != null;
mGroup = tab.getTag();
} else {
scaleScreen();
}
updateLoyaltyCardList(true);
// End of active tab logic
FloatingActionButton addButton = binding.fabAdd;
addButton.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), ScanActivity.class);
Bundle bundle = new Bundle();
if (selectedTab != 0) {
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, groupsTabLayout.getTabAt(selectedTab).getText().toString());
}
intent.putExtras(bundle);
mBarcodeScannerLauncher.launch(intent);
});
addButton.bringToFront();
var layoutManager = (GridLayoutManager) mCardList.getLayoutManager();
if (layoutManager != null) {
var settings = new Settings(this);
layoutManager.setSpanCount(settings.getPreferredColumnCount());
}
}
private void displayCardSetupOptions(Menu menu, boolean shouldShow) {
for (int id : new int[]{R.id.action_search, R.id.action_display_options, R.id.action_sort}) {
menu.findItem(id).setVisible(shouldShow);
}
}
private void updateLoyaltyCardCount() {
mLoyaltyCardCount = DBHelper.getLoyaltyCardCount(mDatabase);
}
private void updateLoyaltyCardList(boolean updateCount) {
Group group = null;
if (mGroup != null) {
group = (Group) mGroup;
}
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase, mFilter, group, mOrder, mOrderDirection, mAdapter.showingArchivedCards() ? DBHelper.LoyaltyCardArchiveFilter.All : DBHelper.LoyaltyCardArchiveFilter.Unarchived));
if (updateCount) {
updateLoyaltyCardCount();
// Update menu icons if necessary
invalidateOptionsMenu();
}
if (mLoyaltyCardCount > 0) {
// We want the cardList to be visible regardless of the filtered match count
// to ensure that the noMatchingCardsText doesn't end up being shown below
// the keyboard
mHelpSection.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.GONE);
if (mAdapter.getItemCount() > 0) {
mCardList.setVisibility(View.VISIBLE);
mNoMatchingCardsText.setVisibility(View.GONE);
} else {
mCardList.setVisibility(View.GONE);
if (!mFilter.isEmpty()) {
// Actual Empty Search Result
mNoMatchingCardsText.setVisibility(View.VISIBLE);
mNoGroupCardsText.setVisibility(View.GONE);
} else {
// Group Tab with no Group Cards
mNoMatchingCardsText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.VISIBLE);
}
}
} else {
mCardList.setVisibility(View.GONE);
mHelpSection.setVisibility(View.VISIBLE);
mNoMatchingCardsText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.GONE);
}
if (mCurrentActionMode != null) {
mCurrentActionMode.finish();
}
}
private void processBarcodeValuesList(List<BarcodeValues> barcodeValuesList, String group, boolean closeAppOnNoBarcode) {
if (barcodeValuesList.isEmpty()) {
throw new IllegalArgumentException("barcodesValues may not be empty");
}
Utils.makeUserChooseBarcodeFromList(MainActivity.this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
CatimaBarcode barcodeType = barcodeValues.format();
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle();
bundle.putString(LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID, barcodeValues.content());
bundle.putString(LoyaltyCard.BUNDLE_LOYALTY_CARD_BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
bundle.putString(LoyaltyCard.BUNDLE_LOYALTY_CARD_BARCODE_ID, null);
if (group != null) {
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
}
intent.putExtras(bundle);
startActivity(intent);
}
@Override
public void onUserDismissedSelector() {
if (closeAppOnNoBarcode) {
finish();
}
}
});
}
private void onSharedIntent(Intent intent) {
String receivedAction = intent.getAction();
String receivedType = intent.getType();
// Check if an image or file was shared to us
if (Intent.ACTION_SEND.equals(receivedAction)) {
List<BarcodeValues> barcodeValuesList;
if (receivedType.equals("text/plain")) {
barcodeValuesList = Collections.singletonList(new BarcodeValues(null, intent.getStringExtra(Intent.EXTRA_TEXT)));
} else if (receivedType.startsWith("image/")) {
barcodeValuesList = Utils.retrieveBarcodesFromImage(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
} else if (receivedType.equals("application/pdf")) {
barcodeValuesList = Utils.retrieveBarcodesFromPdf(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
} else {
Log.e(TAG, "Wrong mime-type");
return;
}
if (barcodeValuesList.isEmpty()) {
finish();
return;
}
processBarcodeValuesList(barcodeValuesList, null, true);
}
}
private void extractIntentFields(Intent intent) {
onSharedIntent(intent);
}
public void updateTabGroups(TabLayout groupsTabLayout) {
List<Group> newGroups = DBHelper.getGroups(mDatabase);
if (newGroups.size() == 0) {
groupsTabLayout.removeAllTabs();
groupsTabLayout.setVisibility(View.GONE);
return;
}
groupsTabLayout.removeAllTabs();
TabLayout.Tab allTab = groupsTabLayout.newTab();
allTab.setText(R.string.all);
allTab.setTag(null);
groupsTabLayout.addTab(allTab, false);
for (Group group : newGroups) {
TabLayout.Tab tab = groupsTabLayout.newTab();
tab.setText(group._id);
tab.setTag(group);
groupsTabLayout.addTab(tab, false);
}
groupsTabLayout.setVisibility(View.VISIBLE);
}
@Override
// Saving currentQuery to finalQuery for user, this will be used to restore search history, happens when user clicks a card from list
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
finalQuery = currentQuery;
// Putting the query also into outState for later use in onRestoreInstanceState when rotating screen
if (mSearchView != null) {
outState.putString(STATE_SEARCH_QUERY, finalQuery);
}
}
@Override
// Restoring instance state when rotation of screen happens with the goal to restore search query for user
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
finalQuery = savedInstanceState.getString(STATE_SEARCH_QUERY, "");
}
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
getMenuInflater().inflate(R.menu.main_menu, inputMenu);
displayCardSetupOptions(inputMenu, mLoyaltyCardCount > 0);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
if (searchManager != null) {
MenuItem searchMenuItem = inputMenu.findItem(R.id.action_search);
mSearchView = (SearchView) searchMenuItem.getActionView();
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
mSearchView.setSubmitButtonEnabled(false);
mSearchView.setOnCloseListener(() -> {
invalidateOptionsMenu();
return false;
});
/*
* On Android 13 and later, pressing Back while the search view is open hides the keyboard
* and collapses the search view at the same time.
* This brings back the old behavior on Android 12 and lower: pressing Back once
* hides the keyboard, press again while keyboard is hidden to collapse the search view.
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(@NonNull MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(@NonNull MenuItem item) {
if (mSearchView.hasFocus()) {
mSearchView.clearFocus();
return false;
}
currentQuery = "";
mFilter = "";
updateLoyaltyCardList(false);
return true;
}
});
}
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mFilter = newText;
// New logic to ensure search history after coming back from picked card - user will see the last search query
if (newText.isEmpty()) {
if(!finalQuery.isEmpty()){
// Setting the query text for user after coming back from picked card from finalQuery
mSearchView.setQuery(finalQuery, false);
}
else if(!currentQuery.isEmpty()){
// Else if is needed in case user deletes search - expected behaviour is to show all cards
currentQuery = "";
mSearchView.setQuery(currentQuery, false);
}
} else {
// Setting search query each time user changes the text in search to temporary variable to be used later in finalQuery String which will be used to restore search history
currentQuery = newText;
}
TabLayout.Tab currentTab = groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition());
mGroup = currentTab != null ? currentTab.getTag() : null;
updateLoyaltyCardList(false);
return true;
}
});
// Check if we came from a picked card back to search, in that case we want to show the search view with previous search query
if(!finalQuery.isEmpty()){
// Expand the search view to show the query
searchMenuItem.expandActionView();
// Setting the query text to empty String due to behaviour of onQueryTextChange after coming back from picked card - onQueryTextChange is called automatically without users interaction
finalQuery = "";
mSearchView.setQuery(currentQuery, false);
}
}
return super.onCreateOptionsMenu(inputMenu);
}
@Override
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == android.R.id.home) {
getOnBackPressedDispatcher().onBackPressed();
}
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog();
invalidateOptionsMenu();
return true;
}
if (id == R.id.action_sort) {
AtomicInteger currentIndex = new AtomicInteger();
List<DBHelper.LoyaltyCardOrder> loyaltyCardOrders = Arrays.asList(DBHelper.LoyaltyCardOrder.values());
for (int i = 0; i < loyaltyCardOrders.size(); i++) {
if (mOrder == loyaltyCardOrders.get(i)) {
currentIndex.set(i);
break;
}
}
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(MainActivity.this);
builder.setTitle(R.string.sort_by);
SortingOptionBinding sortingOptionBinding = SortingOptionBinding
.inflate(LayoutInflater.from(MainActivity.this), null, false);
final View customLayout = sortingOptionBinding.getRoot();
builder.setView(customLayout);
CheckBox showReversed = sortingOptionBinding.checkBoxReverse;
showReversed.setChecked(mOrderDirection == DBHelper.LoyaltyCardOrderDirection.Descending);
builder.setSingleChoiceItems(R.array.sort_types_array, currentIndex.get(), (dialog, which) -> currentIndex.set(which));
builder.setPositiveButton(R.string.sort, (dialog, which) -> {
setSort(
loyaltyCardOrders.get(currentIndex.get()),
showReversed.isChecked() ? DBHelper.LoyaltyCardOrderDirection.Descending : DBHelper.LoyaltyCardOrderDirection.Ascending
);
dialog.dismiss();
});
builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
return true;
}
if (id == R.id.action_manage_groups) {
Intent i = new Intent(getApplicationContext(), ManageGroupsActivity.class);
startActivity(i);
return true;
}
if (id == R.id.action_import_export) {
Intent i = new Intent(getApplicationContext(), ImportExportActivity.class);
startActivity(i);
return true;
}
if (id == R.id.action_settings) {
Intent i = new Intent(getApplicationContext(), SettingsActivity.class);
mSettingsLauncher.launch(i);
return true;
}
if (id == R.id.action_about) {
Intent i = new Intent(getApplicationContext(), AboutActivity.class);
startActivity(i);
return true;
}
return super.onOptionsItemSelected(inputItem);
}
private void setSort(DBHelper.LoyaltyCardOrder order, DBHelper.LoyaltyCardOrderDirection direction) {
// Update values
mOrder = order;
mOrderDirection = direction;
// Store in Shared Preference to restore next app launch
SharedPreferences sortPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_sort),
Context.MODE_PRIVATE);
SharedPreferences.Editor sortPrefEditor = sortPref.edit();
sortPrefEditor.putString(getString(R.string.sharedpreference_sort_order), order.name());
sortPrefEditor.putString(getString(R.string.sharedpreference_sort_direction), direction.name());
sortPrefEditor.apply();
// Update card list
updateLoyaltyCardList(false);
}
@Override
public void onRowLongClicked(int inputPosition) {
enableActionMode(inputPosition);
}
private void enableActionMode(int inputPosition) {
if (mCurrentActionMode == null) {
mCurrentActionMode = startSupportActionMode(mCurrentActionModeCallback);
}
toggleSelection(inputPosition);
}
private void scaleScreen() {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int screenHeight = displayMetrics.heightPixels;
float mediumSizePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,MEDIUM_SCALE_FACTOR_DIP,getResources().getDisplayMetrics());
boolean shouldScaleSmaller = screenHeight < mediumSizePx;
binding.include.welcomeIcon.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
}
private void toggleSelection(int inputPosition) {
mAdapter.toggleSelection(inputPosition);
int count = mAdapter.getSelectedItemCount();
if (count == 0) {
mCurrentActionMode.finish();
} else {
mCurrentActionMode.setTitle(getResources().getQuantityString(R.plurals.selectedCardCount, count, count));
MenuItem editItem = mCurrentActionMode.getMenu().findItem(R.id.action_edit);
MenuItem archiveItem = mCurrentActionMode.getMenu().findItem(R.id.action_archive);
MenuItem unarchiveItem = mCurrentActionMode.getMenu().findItem(R.id.action_unarchive);
MenuItem starItem = mCurrentActionMode.getMenu().findItem(R.id.action_star);
MenuItem unstarItem = mCurrentActionMode.getMenu().findItem(R.id.action_unstar);
boolean hasStarred = false;
boolean hasUnstarred = false;
boolean hasArchived = false;
boolean hasUnarchived = false;
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
if (loyaltyCard.starStatus == 1) {
hasStarred = true;
} else {
hasUnstarred = true;
}
if (loyaltyCard.archiveStatus == 1) {
hasArchived = true;
} else {
hasUnarchived = true;
}
// We have all types, no need to keep checking
if (hasStarred && hasUnstarred && hasArchived && hasUnarchived) {
break;
}
}
unarchiveItem.setVisible(hasArchived);
archiveItem.setVisible(hasUnarchived);
if (count == 1) {
starItem.setVisible(!hasStarred);
unstarItem.setVisible(!hasUnstarred);
editItem.setVisible(true);
editItem.setEnabled(true);
} else {
starItem.setVisible(hasUnstarred);
unstarItem.setVisible(hasStarred);
editItem.setVisible(false);
editItem.setEnabled(false);
}
mCurrentActionMode.invalidate();
}
}
@Override
public void onRowClicked(int inputPosition) {
if (mAdapter.getSelectedItemCount() > 0) {
enableActionMode(inputPosition);
} else {
// FIXME
//
// There is a really nasty edge case that can happen when someone taps a card but right
// after it swipes (very small window, hard to reproduce). The cursor gets replaced and
// may not have a card at the ID number that is returned from onRowClicked.
//
// The proper fix, obviously, would involve makes sure an onFling can't happen while a
// click is being processed. Sadly, I have not yet found a way to make that possible.
LoyaltyCard loyaltyCard;
try {
loyaltyCard = mAdapter.getCard(inputPosition);
} catch (CursorIndexOutOfBoundsException e) {
Log.w(TAG, "Prevented crash from tap + swipe on ID " + inputPosition + ": " + e);
return;
}
Intent intent = new Intent(this, LoyaltyCardViewActivity.class);
intent.setAction("");
final Bundle b = new Bundle();
b.putInt(LoyaltyCardViewActivity.BUNDLE_ID, loyaltyCard.id);
ArrayList<Integer> cardList = new ArrayList<>();
for (int i = 0; i < mAdapter.getItemCount(); i++) {
cardList.add(mAdapter.getCard(i).id);
}
b.putIntegerArrayList(LoyaltyCardViewActivity.BUNDLE_CARDLIST, cardList);
intent.putExtras(b);
startActivity(intent);
}
}
}

View File

@@ -0,0 +1,945 @@
package protect.card_locker
import android.app.SearchManager
import android.content.DialogInterface
import android.content.Intent
import android.database.CursorIndexOutOfBoundsException
import android.database.sqlite.SQLiteDatabase
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.DisplayMetrics
import android.util.Log
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.SearchView
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import protect.card_locker.DBHelper.LoyaltyCardOrder
import protect.card_locker.DBHelper.LoyaltyCardOrderDirection
import protect.card_locker.LoyaltyCardCursorAdapter.CardAdapterListener
import protect.card_locker.databinding.ContentMainBinding
import protect.card_locker.databinding.MainActivityBinding
import protect.card_locker.databinding.SortingOptionBinding
import protect.card_locker.preferences.Settings
import protect.card_locker.preferences.SettingsActivity
import java.io.UnsupportedEncodingException
import java.util.concurrent.atomic.AtomicInteger
import androidx.core.content.edit
class MainActivity : CatimaAppCompatActivity(), CardAdapterListener {
private lateinit var binding: MainActivityBinding
private lateinit var contentMainBinding: ContentMainBinding
private lateinit var mDatabase: SQLiteDatabase
private lateinit var mAdapter: LoyaltyCardCursorAdapter
private var mCurrentActionMode: ActionMode? = null
private var mSearchView: SearchView? = null
private var mLoyaltyCardCount = 0
@JvmField
var mFilter: String = ""
private var currentQuery = ""
private var finalQuery = ""
private var mGroup: Any? = null
private var mOrder: LoyaltyCardOrder = LoyaltyCardOrder.Alpha
private var mOrderDirection: LoyaltyCardOrderDirection = LoyaltyCardOrderDirection.Ascending
private var selectedTab: Int = 0
private lateinit var groupsTabLayout: TabLayout
private lateinit var mUpdateLoyaltyCardListRunnable: Runnable
private lateinit var mBarcodeScannerLauncher: ActivityResultLauncher<Intent>
private lateinit var mSettingsLauncher: ActivityResultLauncher<Intent>
private val mCurrentActionModeCallback: ActionMode.Callback = object : ActionMode.Callback {
override fun onCreateActionMode(inputMode: ActionMode, inputMenu: Menu?): Boolean {
inputMode.menuInflater.inflate(R.menu.card_longclick_menu, inputMenu)
return true
}
override fun onPrepareActionMode(inputMode: ActionMode?, inputMenu: Menu?): Boolean {
return false
}
override fun onActionItemClicked(inputMode: ActionMode, inputItem: MenuItem): Boolean {
when (inputItem.itemId) {
R.id.action_share -> {
try {
ImportURIHelper(this@MainActivity).startShareIntent(mAdapter.getSelectedItems())
} catch (e: UnsupportedEncodingException) {
Toast.makeText(
this@MainActivity,
R.string.failedGeneratingShareURL,
Toast.LENGTH_LONG
).show()
e.printStackTrace()
}
inputMode.finish()
return true
}
R.id.action_edit -> {
require(mAdapter.selectedItemCount == 1) { "Cannot edit more than 1 card at a time" }
startActivity(
Intent(applicationContext, LoyaltyCardEditActivity::class.java).apply {
putExtras(Bundle().apply {
putInt(
LoyaltyCardEditActivity.BUNDLE_ID,
mAdapter.getSelectedItems()[0].id
)
putBoolean(LoyaltyCardEditActivity.BUNDLE_UPDATE, true)
})
}
)
inputMode.finish()
return true
}
R.id.action_duplicate -> {
require(mAdapter.selectedItemCount == 1) { "Cannot duplicate more than 1 card at a time" }
startActivity(
Intent(applicationContext, LoyaltyCardEditActivity::class.java).apply {
putExtras(Bundle().apply {
putInt(
LoyaltyCardEditActivity.BUNDLE_ID,
mAdapter.getSelectedItems()[0].id
)
putBoolean(LoyaltyCardEditActivity.BUNDLE_DUPLICATE_ID, true)
})
}
)
inputMode.finish()
return true
}
R.id.action_delete -> {
MaterialAlertDialogBuilder(this@MainActivity).apply {
// The following may seem weird, but it is necessary to give translators enough flexibility.
// For example, in Russian, Android's plural quantity "one" actually refers to "any number ending on 1 but not ending in 11".
// So while in English the extra non-plural form seems unnecessary duplication, it is necessary to give translators enough flexibility.
// In here, we use the plain string when meaning exactly 1, and otherwise use the plural forms
if (mAdapter.selectedItemCount == 1) {
setTitle(R.string.deleteTitle)
setMessage(R.string.deleteConfirmation)
} else {
setTitle(
getResources().getQuantityString(
R.plurals.deleteCardsTitle,
mAdapter.selectedItemCount,
mAdapter.selectedItemCount
)
)
setMessage(
getResources().getQuantityString(
R.plurals.deleteCardsConfirmation,
mAdapter.selectedItemCount,
mAdapter.selectedItemCount
)
)
}
setPositiveButton(
R.string.confirm
) { dialog, _ ->
for (loyaltyCard in mAdapter.getSelectedItems()) {
Log.d(TAG, "Deleting card: " + loyaltyCard.id)
DBHelper.deleteLoyaltyCard(mDatabase, this@MainActivity, loyaltyCard.id)
ShortcutHelper.removeShortcut(this@MainActivity, loyaltyCard.id)
}
val tab = groupsTabLayout.getTabAt(selectedTab)
mGroup = tab?.tag
updateLoyaltyCardList(true)
dialog.dismiss()
}
setNegativeButton(R.string.cancel) { dialog, _ ->
dialog.dismiss()
}
}.create().show()
return true
}
R.id.action_archive -> {
for (loyaltyCard in mAdapter.getSelectedItems()) {
Log.d(TAG, "Archiving card: " + loyaltyCard.id)
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 1)
ShortcutHelper.removeShortcut(this@MainActivity, loyaltyCard.id)
updateLoyaltyCardList(false)
inputMode.finish()
invalidateOptionsMenu()
}
return true
}
R.id.action_unarchive -> {
for (loyaltyCard in mAdapter.getSelectedItems()) {
Log.d(TAG, "Unarchiving card: " + loyaltyCard.id)
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 0)
updateLoyaltyCardList(false)
inputMode.finish()
invalidateOptionsMenu()
}
return true
}
R.id.action_star -> {
for (loyaltyCard in mAdapter.getSelectedItems()) {
Log.d(TAG, "Starring card: " + loyaltyCard.id)
DBHelper.updateLoyaltyCardStarStatus(mDatabase, loyaltyCard.id, 1)
updateLoyaltyCardList(false)
inputMode.finish()
}
return true
}
R.id.action_unstar -> {
for (loyaltyCard in mAdapter.getSelectedItems()) {
Log.d(TAG, "Unstarring card: " + loyaltyCard.id)
DBHelper.updateLoyaltyCardStarStatus(mDatabase, loyaltyCard.id, 0)
updateLoyaltyCardList(false)
inputMode.finish()
}
return true
}
}
return false
}
override fun onDestroyActionMode(inputMode: ActionMode?) {
mAdapter.clearSelections()
mCurrentActionMode = null
}
}
override fun onCreate(inputSavedInstanceState: Bundle?) {
installSplashScreen()
super.onCreate(inputSavedInstanceState)
// Delete old cache files
// These could be temporary images for the cropper, temporary images in LoyaltyCard toBundle/writeParcel/ etc.
Thread {
val twentyFourHoursAgo = System.currentTimeMillis() - (1000 * 60 * 60 * 24)
val tempFiles = cacheDir.listFiles()
if (tempFiles == null) {
Log.e(
TAG,
"getCacheDir().listFiles() somehow returned null, this should never happen... Skipping cache cleanup..."
)
return@Thread
}
for (file in tempFiles) {
if (file.lastModified() < twentyFourHoursAgo) {
if (!file.delete()) {
Log.w(TAG, "Failed to delete cache file " + file.path)
}
}
}
}.start()
// We should extract the share intent after we called the super.onCreate as it may need to spawn a dialog window and the app needs to be initialized to not crash
extractIntentFields(intent)
binding = MainActivityBinding.inflate(layoutInflater)
setContentView(binding.getRoot())
Utils.applyWindowInsets(binding.getRoot())
setSupportActionBar(binding.toolbar)
groupsTabLayout = binding.groups
contentMainBinding = ContentMainBinding.bind(binding.include.getRoot())
mDatabase = DBHelper(this).writableDatabase
mUpdateLoyaltyCardListRunnable = Runnable {
updateLoyaltyCardList(false)
}
groupsTabLayout.addOnTabSelectedListener(object : OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
selectedTab = tab.position
Log.d("onTabSelected", "Tab Position " + tab.position)
mGroup = tab.tag
updateLoyaltyCardList(false)
// Store active tab in Shared Preference to restore next app launch
applicationContext.getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
MODE_PRIVATE
).edit {
putInt(
getString(R.string.sharedpreference_active_tab),
tab.position
)
}
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
mAdapter = LoyaltyCardCursorAdapter(this, null, this, mUpdateLoyaltyCardListRunnable)
contentMainBinding.list.setAdapter(mAdapter)
registerForContextMenu(contentMainBinding.list)
mBarcodeScannerLauncher = registerForActivityResult(
StartActivityForResult(),
ActivityResultCallback registerForActivityResult@{ result: ActivityResult? ->
// Exit early if the user cancelled the scan (pressed back/home)
if (result == null || result.resultCode != RESULT_OK) {
return@registerForActivityResult
}
startActivity(
Intent(applicationContext, LoyaltyCardEditActivity::class.java).apply {
putExtras(result.data!!.extras!!)
}
)
})
mSettingsLauncher = registerForActivityResult(
StartActivityForResult()
) { result: ActivityResult? ->
if (result?.resultCode == RESULT_OK) {
val intent = result.data
if (intent != null && intent.getBooleanExtra(RESTART_ACTIVITY_INTENT, false)) {
recreate()
}
}
}
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (mSearchView != null && !mSearchView!!.isIconified) {
mSearchView!!.isIconified = true
} else {
finish()
}
}
})
}
override fun onResume() {
super.onResume()
if (mCurrentActionMode != null) {
mAdapter.clearSelections()
mCurrentActionMode!!.finish()
}
if (mSearchView != null && !mSearchView!!.isIconified) {
mFilter = mSearchView!!.query.toString()
}
// Start of active tab logic
updateTabGroups(groupsTabLayout)
// Restore selected tab from Shared Preference
selectedTab = applicationContext.getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
MODE_PRIVATE
).getInt(getString(R.string.sharedpreference_active_tab), 0)
// Restore sort preferences from Shared Preferences
mOrder = Utils.getLoyaltyCardOrder(this)
mOrderDirection = Utils.getLoyaltyCardOrderDirection(this)
mGroup = null
if (groupsTabLayout.tabCount != 0) {
var tab = groupsTabLayout.getTabAt(selectedTab)
if (tab == null) {
tab = groupsTabLayout.getTabAt(0)
}
groupsTabLayout.selectTab(tab)
checkNotNull(tab)
mGroup = tab.tag
} else {
scaleScreen()
}
updateLoyaltyCardList(true)
// End of active tab logic
binding.fabAdd.setOnClickListener {
mBarcodeScannerLauncher.launch(
Intent(applicationContext, ScanActivity::class.java).apply {
putExtras(Bundle().apply {
if (selectedTab != 0) {
putString(
LoyaltyCardEditActivity.BUNDLE_ADDGROUP,
groupsTabLayout.getTabAt(selectedTab)!!.text.toString()
)
}
})
}
)
}
binding.fabAdd.bringToFront()
val layoutManager = contentMainBinding.list.layoutManager as GridLayoutManager?
if (layoutManager != null) {
val settings = Settings(this)
layoutManager.setSpanCount(settings.getPreferredColumnCount())
}
}
private fun displayCardSetupOptions(menu: Menu, shouldShow: Boolean) {
for (id in intArrayOf(R.id.action_search, R.id.action_display_options, R.id.action_sort)) {
menu.findItem(id).isVisible = shouldShow
}
}
private fun updateLoyaltyCardCount() {
mLoyaltyCardCount = DBHelper.getLoyaltyCardCount(mDatabase)
}
private fun updateLoyaltyCardList(updateCount: Boolean) {
var group: Group? = null
if (mGroup != null) {
group = mGroup as Group
}
mAdapter.swapCursor(
DBHelper.getLoyaltyCardCursor(
mDatabase,
mFilter,
group,
mOrder,
mOrderDirection,
if (mAdapter.showingArchivedCards()) DBHelper.LoyaltyCardArchiveFilter.All else DBHelper.LoyaltyCardArchiveFilter.Unarchived
)
)
if (updateCount) {
updateLoyaltyCardCount()
// Update menu icons if necessary
invalidateOptionsMenu()
}
if (mLoyaltyCardCount > 0) {
// We want the cardList to be visible regardless of the filtered match count
// to ensure that the noMatchingCardsText doesn't end up being shown below
// the keyboard
contentMainBinding.helpSection.visibility = View.GONE
contentMainBinding.noGroupCardsText.visibility = View.GONE
if (mAdapter.itemCount > 0) {
contentMainBinding.list.visibility = View.VISIBLE
contentMainBinding.noMatchingCardsText.visibility = View.GONE
} else {
contentMainBinding.list.visibility = View.GONE
if (!mFilter.isEmpty()) {
// Actual Empty Search Result
contentMainBinding.noMatchingCardsText.visibility = View.VISIBLE
contentMainBinding.noGroupCardsText.visibility = View.GONE
} else {
// Group Tab with no Group Cards
contentMainBinding.noMatchingCardsText.visibility = View.GONE
contentMainBinding.noGroupCardsText.visibility = View.VISIBLE
}
}
} else {
contentMainBinding.list.visibility = View.GONE
contentMainBinding.helpSection.visibility = View.VISIBLE
contentMainBinding.noMatchingCardsText.visibility = View.GONE
contentMainBinding.noGroupCardsText.visibility = View.GONE
}
if (mCurrentActionMode != null) {
mCurrentActionMode!!.finish()
}
ListWidget().updateAll(mAdapter.mContext)
}
private fun processParseResultList(
parseResultList: MutableList<ParseResult?>,
group: String?,
closeAppOnNoBarcode: Boolean
) {
require(!parseResultList.isEmpty()) { "parseResultList may not be empty" }
Utils.makeUserChooseParseResultFromList(
this@MainActivity,
parseResultList,
object : ParseResultListDisambiguatorCallback {
override fun onUserChoseParseResult(parseResult: ParseResult) {
val intent =
Intent(applicationContext, LoyaltyCardEditActivity::class.java)
val bundle = parseResult.toLoyaltyCardBundle(this@MainActivity)
if (group != null) {
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group)
}
intent.putExtras(bundle)
startActivity(intent)
}
override fun onUserDismissedSelector() {
if (closeAppOnNoBarcode) {
finish()
}
}
})
}
private fun onSharedIntent(intent: Intent) {
val receivedAction = intent.action
val receivedType = intent.type
if (receivedAction == null || receivedType == null) {
return
}
val parseResultList: MutableList<ParseResult?>?
// Check for shared text
if (receivedAction == Intent.ACTION_SEND && receivedType == "text/plain") {
val loyaltyCard = LoyaltyCard()
loyaltyCard.setCardId(intent.getStringExtra(Intent.EXTRA_TEXT)!!)
parseResultList = mutableListOf(ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard))
} else {
// Parse whatever file was sent, regardless of opening or sharing
val data: Uri? = when (receivedAction) {
Intent.ACTION_VIEW -> {
intent.data
}
Intent.ACTION_SEND -> {
intent.getParcelableExtra(Intent.EXTRA_STREAM)
}
else -> {
Log.e(TAG, "Wrong action type to parse intent")
return
}
}
if (receivedType.startsWith("image/")) {
parseResultList = Utils.retrieveBarcodesFromImage(this, data)
} else if (receivedType == "application/pdf") {
parseResultList = Utils.retrieveBarcodesFromPdf(this, data)
} else if (mutableListOf<String?>(
"application/vnd.apple.pkpass",
"application/vnd-com.apple.pkpass"
).contains(receivedType)
) {
parseResultList = Utils.retrieveBarcodesFromPkPass(this, data)
} else if (receivedType == "application/vnd.espass-espass") {
// FIXME: espass is not pkpass
// However, several users stated in https://github.com/CatimaLoyalty/Android/issues/2197 that the formats are extremely similar to the point they could rename an .espass file to .pkpass and have it imported
// So it makes sense to "unofficially" treat it as a PKPASS for now, even though not completely correct
parseResultList = Utils.retrieveBarcodesFromPkPass(this, data)
} else if (receivedType == "application/vnd.apple.pkpasses") {
parseResultList = Utils.retrieveBarcodesFromPkPasses(this, data)
} else {
Log.e(TAG, "Wrong mime-type")
return
}
}
// Give up if we should parse but there is nothing to parse
if (parseResultList == null || parseResultList.isEmpty()) {
finish()
return
}
processParseResultList(parseResultList, null, true)
}
private fun extractIntentFields(intent: Intent) {
onSharedIntent(intent)
}
fun updateTabGroups(groupsTabLayout: TabLayout) {
val newGroups = DBHelper.getGroups(mDatabase)
if (newGroups.isEmpty()) {
groupsTabLayout.removeAllTabs()
groupsTabLayout.visibility = View.GONE
return
}
groupsTabLayout.removeAllTabs()
groupsTabLayout.addTab(
groupsTabLayout.newTab().apply {
setText(R.string.all)
tag = null
},
false
)
for (group in newGroups) {
groupsTabLayout.addTab(
groupsTabLayout.newTab().apply {
text = group._id
tag = group
},
false
)
}
groupsTabLayout.visibility = View.VISIBLE
}
// Saving currentQuery to finalQuery for user, this will be used to restore search history, happens when user clicks a card from list
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
finalQuery = currentQuery
// Putting the query also into outState for later use in onRestoreInstanceState when rotating screen
if (mSearchView != null) {
outState.putString(STATE_SEARCH_QUERY, finalQuery)
}
}
// Restoring instance state when rotation of screen happens with the goal to restore search query for user
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
finalQuery = savedInstanceState.getString(STATE_SEARCH_QUERY, "")
}
override fun onCreateOptionsMenu(inputMenu: Menu): Boolean {
menuInflater.inflate(R.menu.main_menu, inputMenu)
displayCardSetupOptions(inputMenu, mLoyaltyCardCount > 0)
val searchManager = getSystemService(SEARCH_SERVICE) as SearchManager?
if (searchManager != null) {
val searchMenuItem = inputMenu.findItem(R.id.action_search)
mSearchView = searchMenuItem.actionView as SearchView?
mSearchView!!.setSearchableInfo(searchManager.getSearchableInfo(componentName))
mSearchView!!.setSubmitButtonEnabled(false)
mSearchView!!.setOnCloseListener {
invalidateOptionsMenu()
false
}
/*
* On Android 13 and later, pressing Back while the search view is open hides the keyboard
* and collapses the search view at the same time.
* This brings back the old behavior on Android 12 and lower: pressing Back once
* hides the keyboard, press again while keyboard is hidden to collapse the search view.
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
searchMenuItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
return true
}
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
if (mSearchView!!.hasFocus()) {
mSearchView!!.clearFocus()
return false
}
currentQuery = ""
mFilter = ""
updateLoyaltyCardList(false)
return true
}
})
}
mSearchView!!.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
return false
}
override fun onQueryTextChange(newText: String): Boolean {
mFilter = newText
// New logic to ensure search history after coming back from picked card - user will see the last search query
if (newText.isEmpty()) {
if (!finalQuery.isEmpty()) {
// Setting the query text for user after coming back from picked card from finalQuery
mSearchView!!.setQuery(finalQuery, false)
} else if (!currentQuery.isEmpty()) {
// Else if is needed in case user deletes search - expected behaviour is to show all cards
currentQuery = ""
mSearchView!!.setQuery(currentQuery, false)
}
} else {
// Setting search query each time user changes the text in search to temporary variable to be used later in finalQuery String which will be used to restore search history
currentQuery = newText
}
val currentTab =
groupsTabLayout.getTabAt(groupsTabLayout.selectedTabPosition)
mGroup = currentTab?.tag
updateLoyaltyCardList(false)
return true
}
})
// Check if we came from a picked card back to search, in that case we want to show the search view with previous search query
if (!finalQuery.isEmpty()) {
// Expand the search view to show the query
searchMenuItem.expandActionView()
// Setting the query text to empty String due to behaviour of onQueryTextChange after coming back from picked card - onQueryTextChange is called automatically without users interaction
finalQuery = ""
mSearchView!!.setQuery(currentQuery, false)
}
}
return super.onCreateOptionsMenu(inputMenu)
}
override fun onOptionsItemSelected(inputItem: MenuItem): Boolean {
when (inputItem.itemId) {
android.R.id.home -> {
onBackPressedDispatcher.onBackPressed()
}
R.id.action_display_options -> {
mAdapter.showDisplayOptionsDialog()
invalidateOptionsMenu()
return true
}
R.id.action_sort -> {
val currentIndex = AtomicInteger()
val loyaltyCardOrders = listOf<LoyaltyCardOrder?>(*LoyaltyCardOrder.entries.toTypedArray())
for (i in loyaltyCardOrders.indices) {
if (mOrder == loyaltyCardOrders[i]) {
currentIndex.set(i)
break
}
}
MaterialAlertDialogBuilder(this@MainActivity).apply {
setTitle(R.string.sort_by)
val sortingOptionBinding = SortingOptionBinding.inflate(LayoutInflater.from(this@MainActivity), null, false)
val customLayout: View = sortingOptionBinding.getRoot()
setView(customLayout)
val showReversed = sortingOptionBinding.checkBoxReverse
showReversed.isChecked = mOrderDirection == LoyaltyCardOrderDirection.Descending
setSingleChoiceItems(
R.array.sort_types_array,
currentIndex.get()
) { _: DialogInterface?, which: Int ->
currentIndex.set(which)
}
setPositiveButton(
R.string.sort
) { dialog, _ ->
setSort(
loyaltyCardOrders[currentIndex.get()]!!,
if (showReversed.isChecked) LoyaltyCardOrderDirection.Descending else LoyaltyCardOrderDirection.Ascending
)
ListWidget().updateAll(this@MainActivity)
dialog?.dismiss()
}
setNegativeButton(R.string.cancel) { dialog, _ ->
dialog.dismiss()
}
}.create().show()
return true
}
R.id.action_manage_groups -> {
startActivity(
Intent(applicationContext, ManageGroupsActivity::class.java)
)
return true
}
R.id.action_import_export -> {
startActivity(
Intent(applicationContext, ImportExportActivity::class.java)
)
return true
}
R.id.action_settings -> {
mSettingsLauncher.launch(
Intent(applicationContext, SettingsActivity::class.java)
)
return true
}
R.id.action_about -> {
startActivity(
Intent(applicationContext, AboutActivity::class.java)
)
return true
}
}
return super.onOptionsItemSelected(inputItem)
}
private fun setSort(order: LoyaltyCardOrder, direction: LoyaltyCardOrderDirection) {
// Update values
mOrder = order
mOrderDirection = direction
// Store in Shared Preference to restore next app launch
applicationContext.getSharedPreferences(
getString(R.string.sharedpreference_sort),
MODE_PRIVATE
).edit {
putString(
getString(R.string.sharedpreference_sort_order),
order.name
)
putString(
getString(R.string.sharedpreference_sort_direction),
direction.name
)
}
// Update card list
updateLoyaltyCardList(false)
}
override fun onRowLongClicked(inputPosition: Int) {
enableActionMode(inputPosition)
}
private fun enableActionMode(inputPosition: Int) {
if (mCurrentActionMode == null) {
mCurrentActionMode = startSupportActionMode(mCurrentActionModeCallback)
}
toggleSelection(inputPosition)
}
private fun scaleScreen() {
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
val screenHeight = displayMetrics.heightPixels
val mediumSizePx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
MEDIUM_SCALE_FACTOR_DIP.toFloat(),
getResources().displayMetrics
)
val shouldScaleSmaller = screenHeight < mediumSizePx
binding.include.welcomeIcon.visibility = if (shouldScaleSmaller) View.GONE else View.VISIBLE
}
private fun toggleSelection(inputPosition: Int) {
mAdapter.toggleSelection(inputPosition)
val count = mAdapter.selectedItemCount
if (count == 0) {
mCurrentActionMode!!.finish()
} else {
mCurrentActionMode!!.title = getResources().getQuantityString(
R.plurals.selectedCardCount,
count,
count
)
val editItem = mCurrentActionMode!!.menu.findItem(R.id.action_edit)
val duplicateItem = mCurrentActionMode!!.menu.findItem(R.id.action_duplicate)
val archiveItem = mCurrentActionMode!!.menu.findItem(R.id.action_archive)
val unarchiveItem = mCurrentActionMode!!.menu.findItem(R.id.action_unarchive)
val starItem = mCurrentActionMode!!.menu.findItem(R.id.action_star)
val unstarItem = mCurrentActionMode!!.menu.findItem(R.id.action_unstar)
var hasStarred = false
var hasUnstarred = false
var hasArchived = false
var hasUnarchived = false
for (loyaltyCard in mAdapter.getSelectedItems()) {
if (loyaltyCard.starStatus == 1) {
hasStarred = true
} else {
hasUnstarred = true
}
if (loyaltyCard.archiveStatus == 1) {
hasArchived = true
} else {
hasUnarchived = true
}
// We have all types, no need to keep checking
if (hasStarred && hasUnstarred && hasArchived && hasUnarchived) {
break
}
}
unarchiveItem.isVisible = hasArchived
archiveItem.isVisible = hasUnarchived
if (count == 1) {
starItem.isVisible = !hasStarred
unstarItem.isVisible = !hasUnstarred
editItem.isVisible = true
editItem.isEnabled = true
duplicateItem.isVisible = true
duplicateItem.isEnabled = true
} else {
starItem.isVisible = hasUnstarred
unstarItem.isVisible = hasStarred
editItem.isVisible = false
editItem.isEnabled = false
duplicateItem.isVisible = false
duplicateItem.isEnabled = false
}
mCurrentActionMode!!.invalidate()
}
}
override fun onRowClicked(inputPosition: Int) {
if (mAdapter.selectedItemCount > 0) {
enableActionMode(inputPosition)
} else {
// FIXME
//
// There is a really nasty edge case that can happen when someone taps a card but right
// after it swipes (very small window, hard to reproduce). The cursor gets replaced and
// may not have a card at the ID number that is returned from onRowClicked.
//
// The proper fix, obviously, would involve makes sure an onFling can't happen while a
// click is being processed. Sadly, I have not yet found a way to make that possible.
val loyaltyCard: LoyaltyCard
try {
loyaltyCard = mAdapter.getCard(inputPosition)
} catch (e: CursorIndexOutOfBoundsException) {
Log.w(TAG, "Prevented crash from tap + swipe on ID $inputPosition: $e")
return
}
startActivity(
Intent(this, LoyaltyCardViewActivity::class.java).apply {
action = ""
putExtras(Bundle().apply {
putInt(LoyaltyCardViewActivity.BUNDLE_ID, loyaltyCard.id)
val cardList = ArrayList<Int?>()
for (i in 0..<mAdapter.itemCount) {
cardList.add(mAdapter.getCard(i).id)
}
putIntegerArrayList(LoyaltyCardViewActivity.BUNDLE_CARDLIST, cardList)
})
}
)
}
}
companion object {
private const val TAG = "Catima"
const val RESTART_ACTIVITY_INTENT: String = "restart_activity_intent"
private const val MEDIUM_SCALE_FACTOR_DIP = 460
const val STATE_SEARCH_QUERY: String = "SEARCH_QUERY"
}
}

View File

@@ -1,241 +0,0 @@
package protect.card_locker;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import protect.card_locker.databinding.ActivityManageGroupBinding;
public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener {
private ActivityManageGroupBinding binding;
private SQLiteDatabase mDatabase;
private ManageGroupCursorAdapter mAdapter;
private final String SAVE_INSTANCE_ADAPTER_STATE = "adapterState";
private final String SAVE_INSTANCE_CURRENT_GROUP_NAME = "currentGroupName";
protected Group mGroup = null;
private RecyclerView mCardList;
private TextView noGroupCardsText;
private EditText mGroupNameText;
private boolean mGroupNameNotInUse;
@Override
protected void onCreate(Bundle inputSavedInstanceState) {
super.onCreate(inputSavedInstanceState);
binding = ActivityManageGroupBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
mDatabase = new DBHelper(this).getWritableDatabase();
noGroupCardsText = binding.include.noGroupCardsText;
mCardList = binding.include.list;
FloatingActionButton saveButton = binding.fabSave;
mGroupNameText = binding.editTextGroupName;
mGroupNameText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
mGroupNameNotInUse = true;
mGroupNameText.setError(null);
String currentGroupName = mGroupNameText.getText().toString().trim();
if (currentGroupName.length() == 0) {
mGroupNameText.setError(getResources().getText(R.string.group_name_is_empty));
return;
}
if (!mGroup._id.equals(currentGroupName)) {
if (DBHelper.getGroup(mDatabase, currentGroupName) != null) {
mGroupNameNotInUse = false;
mGroupNameText.setError(getResources().getText(R.string.group_name_already_in_use));
} else {
mGroupNameNotInUse = true;
}
}
}
});
Intent intent = getIntent();
String groupId = intent.getStringExtra("group");
if (groupId == null) {
throw (new IllegalArgumentException("this activity expects a group loaded into it's intent"));
}
Log.d("groupId", "groupId: " + groupId);
mGroup = DBHelper.getGroup(mDatabase, groupId);
if (mGroup == null) {
throw (new IllegalArgumentException("cannot load group " + groupId + " from database"));
}
mGroupNameText.setText(mGroup._id);
setTitle(getString(R.string.editGroup, mGroup._id));
mAdapter = new ManageGroupCursorAdapter(this, null, this, mGroup, null);
mCardList.setAdapter(mAdapter);
registerForContextMenu(mCardList);
if (inputSavedInstanceState != null) {
mAdapter.importInGroupState(integerArrayToAdapterState(inputSavedInstanceState.getIntegerArrayList(SAVE_INSTANCE_ADAPTER_STATE)));
mGroupNameText.setText(inputSavedInstanceState.getString(SAVE_INSTANCE_CURRENT_GROUP_NAME));
}
enableToolbarBackButton();
saveButton.setOnClickListener(v -> {
String currentGroupName = mGroupNameText.getText().toString().trim();
if (!currentGroupName.equals(mGroup._id)) {
if (currentGroupName.length() == 0) {
Toast.makeText(getApplicationContext(), R.string.group_name_is_empty, Toast.LENGTH_SHORT).show();
return;
}
if (!mGroupNameNotInUse) {
Toast.makeText(getApplicationContext(), R.string.group_name_already_in_use, Toast.LENGTH_SHORT).show();
return;
}
}
mAdapter.commitToDatabase();
if (!currentGroupName.equals(mGroup._id)) {
DBHelper.updateGroup(mDatabase, mGroup._id, currentGroupName);
}
Toast.makeText(getApplicationContext(), R.string.group_updated, Toast.LENGTH_SHORT).show();
finish();
});
// this setText is here because content_main.xml is reused from main activity
noGroupCardsText.setText(getResources().getText(R.string.noGiftCardsGroup));
updateLoyaltyCardList();
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
leaveWithoutSaving();
}
});
}
private ArrayList<Integer> adapterStateToIntegerArray(HashMap<Integer, Boolean> adapterState) {
ArrayList<Integer> ret = new ArrayList<>(adapterState.size() * 2);
for (Map.Entry<Integer, Boolean> entry : adapterState.entrySet()) {
ret.add(entry.getKey());
ret.add(entry.getValue() ? 1 : 0);
}
return ret;
}
private HashMap<Integer, Boolean> integerArrayToAdapterState(ArrayList<Integer> in) {
HashMap<Integer, Boolean> ret = new HashMap<>();
if (in.size() % 2 != 0) {
throw (new RuntimeException("failed restoring adapterState from integer array list"));
}
for (int i = 0; i < in.size(); i += 2) {
ret.put(in.get(i), in.get(i + 1) == 1);
}
return ret;
}
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
getMenuInflater().inflate(R.menu.card_details_menu, inputMenu);
return super.onCreateOptionsMenu(inputMenu);
}
@Override
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog();
invalidateOptionsMenu();
return true;
}
return super.onOptionsItemSelected(inputItem);
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putIntegerArrayList(SAVE_INSTANCE_ADAPTER_STATE, adapterStateToIntegerArray(mAdapter.exportInGroupState()));
outState.putString(SAVE_INSTANCE_CURRENT_GROUP_NAME, mGroupNameText.getText().toString());
}
private void updateLoyaltyCardList() {
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase));
if (mAdapter.getItemCount() == 0) {
mCardList.setVisibility(View.GONE);
noGroupCardsText.setVisibility(View.VISIBLE);
} else {
mCardList.setVisibility(View.VISIBLE);
noGroupCardsText.setVisibility(View.GONE);
}
}
private void leaveWithoutSaving() {
if (hasChanged()) {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ManageGroupActivity.this);
builder.setTitle(R.string.leaveWithoutSaveTitle);
builder.setMessage(R.string.leaveWithoutSaveConfirmation);
builder.setPositiveButton(R.string.confirm, (dialog, which) -> finish());
builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
} else {
finish();
}
}
@Override
public boolean onSupportNavigateUp() {
getOnBackPressedDispatcher().onBackPressed();
return true;
}
private boolean hasChanged() {
return mAdapter.hasChanged() || !mGroup._id.equals(mGroupNameText.getText().toString().trim());
}
@Override
public void onRowLongClicked(int inputPosition) {
mAdapter.toggleSelection(inputPosition);
}
@Override
public void onRowClicked(int inputPosition) {
mAdapter.toggleSelection(inputPosition);
}
}

View File

@@ -0,0 +1,236 @@
package protect.card_locker
import android.content.DialogInterface
import android.database.sqlite.SQLiteDatabase
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.core.widget.doAfterTextChanged
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import protect.card_locker.LoyaltyCardCursorAdapter.CardAdapterListener
import protect.card_locker.databinding.ActivityManageGroupBinding
class ManageGroupActivity : CatimaAppCompatActivity(), CardAdapterListener {
private lateinit var binding: ActivityManageGroupBinding
private lateinit var mDatabase: SQLiteDatabase
private lateinit var mAdapter: ManageGroupCursorAdapter
private lateinit var mGroup: Group
private lateinit var mCardList: RecyclerView
private lateinit var noGroupCardsText: TextView
private lateinit var mGroupNameText: EditText
private var mGroupNameNotInUse = false
override fun onCreate(inputSavedInstanceState: Bundle?) {
super.onCreate(inputSavedInstanceState)
binding = ActivityManageGroupBinding.inflate(layoutInflater)
setContentView(binding.root)
Utils.applyWindowInsetsAndFabOffset(binding.root, binding.fabSave)
setSupportActionBar(binding.toolbar)
mDatabase = DBHelper(this).writableDatabase
noGroupCardsText = binding.include.noGroupCardsText
mCardList = binding.include.list
mGroupNameText = binding.editTextGroupName
mGroupNameText.doAfterTextChanged {
mGroupNameNotInUse = true
mGroupNameText.error = null
val currentGroupName = mGroupNameText.text.trim().toString()
if (currentGroupName.isEmpty()) {
mGroupNameText.error = getText(R.string.group_name_is_empty)
return@doAfterTextChanged
}
if (mGroup._id != currentGroupName) {
if (DBHelper.getGroup(mDatabase, currentGroupName) != null) {
mGroupNameNotInUse = false
mGroupNameText.error = getText(R.string.group_name_already_in_use)
} else {
mGroupNameNotInUse = true
}
}
}
val groupId = intent.getStringExtra("group")
?: throw (IllegalArgumentException("this activity expects a group loaded into it's intent"))
Log.d("groupId", "groupId: $groupId")
mGroup = DBHelper.getGroup(mDatabase, groupId)
?: throw IllegalArgumentException("Cannot load group $groupId from database")
mGroupNameText.setText(mGroup._id)
setTitle(getString(R.string.editGroup, mGroup._id))
mAdapter = ManageGroupCursorAdapter(this, null, this, mGroup, null)
mCardList.adapter = mAdapter
registerForContextMenu(mCardList)
if (inputSavedInstanceState != null) {
mAdapter.importInGroupState(
bundleToAdapterState(
adapterStateBundle = inputSavedInstanceState.getBundle(
SAVE_INSTANCE_ADAPTER_STATE
)
)
)
mGroupNameText.setText(
inputSavedInstanceState.getString(
SAVE_INSTANCE_CURRENT_GROUP_NAME
)
)
}
enableToolbarBackButton()
binding.fabSave.setOnClickListener { v: View ->
val currentGroupName = mGroupNameText.text.trim().toString()
if (currentGroupName != mGroup._id) {
when {
currentGroupName.isEmpty() -> {
Toast.makeText(
applicationContext,
R.string.group_name_is_empty,
Toast.LENGTH_SHORT
).show()
return@setOnClickListener
}
!mGroupNameNotInUse -> {
Toast.makeText(
applicationContext,
R.string.group_name_already_in_use,
Toast.LENGTH_SHORT
).show()
return@setOnClickListener
}
}
}
mAdapter.commitToDatabase()
if (currentGroupName != mGroup._id) {
DBHelper.updateGroup(mDatabase, mGroup._id, currentGroupName)
}
Toast.makeText(
applicationContext,
R.string.group_updated,
Toast.LENGTH_SHORT
).show()
finish()
}
// this setText is here because content_main.xml is reused from main activity
noGroupCardsText.text = getText(R.string.noGiftCardsGroup)
updateLoyaltyCardList()
onBackPressedDispatcher.addCallback(
owner = this,
onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
leaveWithoutSaving()
}
})
}
private fun adapterStateToBundle(adapterState: HashMap<Int, Boolean>): Bundle {
val adapterStateBundle = Bundle().apply {
for (entry in adapterState.entries) {
putBoolean(entry.key.toString(), entry.value)
}
}
return adapterStateBundle
}
private fun bundleToAdapterState(adapterStateBundle: Bundle?): Map<Int, Boolean> {
adapterStateBundle ?: return emptyMap()
val adapterStateMap = buildMap {
for (key in adapterStateBundle.keySet()) {
put(key.toInt(), adapterStateBundle.getBoolean(key))
}
}
return adapterStateMap
}
override fun onCreateOptionsMenu(inputMenu: Menu): Boolean {
menuInflater.inflate(R.menu.card_details_menu, inputMenu)
return super.onCreateOptionsMenu(inputMenu)
}
override fun onOptionsItemSelected(inputItem: MenuItem): Boolean {
val id = inputItem.itemId
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog()
invalidateOptionsMenu()
return true
}
return super.onOptionsItemSelected(inputItem)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBundle(
SAVE_INSTANCE_ADAPTER_STATE,
adapterStateToBundle(mAdapter.exportInGroupState())
)
outState.putString(SAVE_INSTANCE_CURRENT_GROUP_NAME, mGroupNameText.text.toString())
}
private fun updateLoyaltyCardList() {
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase))
if (mAdapter.itemCount == 0) {
mCardList.visibility = View.GONE
noGroupCardsText.visibility = View.VISIBLE
} else {
mCardList.visibility = View.VISIBLE
noGroupCardsText.visibility = View.GONE
}
}
private fun leaveWithoutSaving() {
if (hasChanged()) {
MaterialAlertDialogBuilder(this@ManageGroupActivity).apply {
setTitle(R.string.leaveWithoutSaveTitle)
setMessage(R.string.leaveWithoutSaveConfirmation)
setPositiveButton(R.string.confirm) { dialog: DialogInterface, _ ->
finish()
}
setNegativeButton(R.string.cancel) { dialog: DialogInterface, _ ->
dialog.dismiss()
}
}.create().show()
} else {
finish()
}
}
override fun onSupportNavigateUp(): Boolean {
onBackPressedDispatcher.onBackPressed()
return true
}
private fun hasChanged(): Boolean {
return mAdapter.hasChanged() || mGroup._id != mGroupNameText.text.trim().toString()
}
override fun onRowLongClicked(inputPosition: Int) {
mAdapter.toggleSelection(inputPosition)
}
override fun onRowClicked(inputPosition: Int) {
mAdapter.toggleSelection(inputPosition)
}
private companion object {
const val SAVE_INSTANCE_ADAPTER_STATE = "adapterState"
const val SAVE_INSTANCE_CURRENT_GROUP_NAME = "currentGroupName"
}
}

View File

@@ -33,7 +33,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
@Override
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(inputCursor);
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(mContext, inputCursor);
Boolean overlayValue = mInGroupOverlay.get(loyaltyCard.id);
if ((overlayValue != null ? overlayValue : isLoyaltyCardInGroup(loyaltyCard.id))) {
mAnimationItemsIndex.put(inputCursor.getPosition(), true);
@@ -99,7 +99,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
}
}
public void importInGroupState(HashMap<Integer, Boolean> cardIdInGroupMap) {
public void importInGroupState(Map<Integer, Boolean> cardIdInGroupMap) {
mInGroupOverlay = new HashMap<>(cardIdInGroupMap);
}

View File

@@ -1,246 +0,0 @@
package protect.card_locker;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;
import protect.card_locker.databinding.ManageGroupsActivityBinding;
public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener {
private ManageGroupsActivityBinding binding;
private static final String TAG = "Catima";
private SQLiteDatabase mDatabase;
private TextView mHelpText;
private RecyclerView mGroupList;
GroupCursorAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ManageGroupsActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.groups);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
enableToolbarBackButton();
mDatabase = new DBHelper(this).getWritableDatabase();
}
@Override
protected void onResume() {
super.onResume();
FloatingActionButton addButton = binding.fabAdd;
addButton.setOnClickListener(v -> createGroup());
addButton.bringToFront();
mGroupList = binding.include.list;
mHelpText = binding.include.helpText;
// Init group list
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
mGroupList.setLayoutManager(mLayoutManager);
mGroupList.setItemAnimator(new DefaultItemAnimator());
mAdapter = new GroupCursorAdapter(this, null, this);
mGroupList.setAdapter(mAdapter);
updateGroupList();
}
private void updateGroupList() {
mAdapter.swapCursor(DBHelper.getGroupCursor(mDatabase));
if (DBHelper.getGroupCount(mDatabase) == 0) {
mGroupList.setVisibility(View.GONE);
mHelpText.setVisibility(View.VISIBLE);
return;
}
mGroupList.setVisibility(View.VISIBLE);
mHelpText.setVisibility(View.GONE);
}
private void invalidateHomescreenActiveTab() {
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
Context.MODE_PRIVATE);
SharedPreferences.Editor activeTabPrefEditor = activeTabPref.edit();
activeTabPrefEditor.putInt(getString(R.string.sharedpreference_active_tab), 0);
activeTabPrefEditor.apply();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
private void createGroup() {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
// Header
builder.setTitle(R.string.enter_group_name);
// Layout
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
int contentPadding = getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
params.leftMargin = contentPadding;
params.topMargin = contentPadding / 2;
params.rightMargin = contentPadding;
// EditText with spacing
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
input.setLayoutParams(params);
layout.addView(input);
// Set layout
builder.setView(layout);
// Buttons
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
DBHelper.insertGroup(mDatabase, input.getText().toString().trim());
updateGroupList();
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
AlertDialog dialog = builder.create();
// Now that the dialog exists, we can bind something that affects the OK button
input.addTextChangedListener(new SimpleTextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
String groupName = s.toString().trim();
if (groupName.length() == 0) {
input.setError(getString(R.string.group_name_is_empty));
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
return;
}
if (DBHelper.getGroup(mDatabase, groupName) != null) {
input.setError(getString(R.string.group_name_already_in_use));
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
return;
}
input.setError(null);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
}
});
dialog.show();
// Disable button (must be done **after** dialog is shown to prevent crash
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
// Set focus on input field
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
input.requestFocus();
}
private String getGroupName(View view) {
TextView groupNameTextView = view.findViewById(R.id.name);
return (String) groupNameTextView.getText();
}
private void moveGroup(View view, boolean up) {
List<Group> groups = DBHelper.getGroups(mDatabase);
final String groupName = getGroupName(view);
int currentIndex = DBHelper.getGroup(mDatabase, groupName).order;
int newIndex;
// Reinsert group in correct position
if (up) {
newIndex = currentIndex - 1;
} else {
newIndex = currentIndex + 1;
}
// Don't try to move out of bounds
if (newIndex < 0 || newIndex >= groups.size()) {
return;
}
Group group = groups.remove(currentIndex);
groups.add(newIndex, group);
// Update database
DBHelper.reorderGroups(mDatabase, groups);
// Update UI
updateGroupList();
// Ordering may have changed, so invalidate
invalidateHomescreenActiveTab();
}
@Override
public void onMoveDownButtonClicked(View view) {
moveGroup(view, false);
}
@Override
public void onMoveUpButtonClicked(View view) {
moveGroup(view, true);
}
@Override
public void onEditButtonClicked(View view) {
Intent intent = new Intent(this, ManageGroupActivity.class);
intent.putExtra("group", getGroupName(view));
startActivity(intent);
}
@Override
public void onDeleteButtonClicked(View view) {
final String groupName = getGroupName(view);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.deleteConfirmationGroup);
builder.setMessage(groupName);
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
DBHelper.deleteGroup(mDatabase, groupName);
updateGroupList();
// Delete may change ordering, so invalidate
invalidateHomescreenActiveTab();
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
AlertDialog dialog = builder.create();
dialog.show();
}
}

View File

@@ -0,0 +1,240 @@
package protect.card_locker
import android.content.DialogInterface
import android.content.Intent
import android.database.sqlite.SQLiteDatabase
import android.os.Bundle
import android.text.InputType
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.EditText
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.core.content.edit
import androidx.core.widget.doOnTextChanged
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import protect.card_locker.GroupCursorAdapter.GroupAdapterListener
import protect.card_locker.databinding.ManageGroupsActivityBinding
class ManageGroupsActivity : CatimaAppCompatActivity(), GroupAdapterListener {
private lateinit var binding: ManageGroupsActivityBinding
private lateinit var mDatabase: SQLiteDatabase
private lateinit var mHelpText: TextView
private lateinit var mGroupList: RecyclerView
private lateinit var mAdapter: GroupCursorAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ManageGroupsActivityBinding.inflate(layoutInflater)
setTitle(R.string.groups)
setContentView(binding.root)
Utils.applyWindowInsets(binding.root)
setSupportActionBar(binding.toolbar)
enableToolbarBackButton()
mDatabase = DBHelper(this).writableDatabase
}
override fun onResume() {
super.onResume()
with(binding.fabAdd) {
setOnClickListener { v: View ->
createGroup()
}
bringToFront()
}
mGroupList = binding.include.list
mHelpText = binding.include.helpText
// Init group list
LinearLayoutManager(applicationContext).apply {
mGroupList.layoutManager = this
}
mGroupList.setItemAnimator(DefaultItemAnimator())
mAdapter = GroupCursorAdapter(this, null, this)
mGroupList.setAdapter(mAdapter)
updateGroupList()
}
private fun updateGroupList() {
mAdapter.swapCursor(DBHelper.getGroupCursor(mDatabase))
if (DBHelper.getGroupCount(mDatabase) == 0) {
mGroupList.visibility = View.GONE
mHelpText.visibility = View.VISIBLE
return
}
mGroupList.visibility = View.VISIBLE
mHelpText.visibility = View.GONE
}
private fun invalidateHomescreenActiveTab() {
val activeTabPref = getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
MODE_PRIVATE
)
activeTabPref.edit {
putInt(getString(R.string.sharedpreference_active_tab), 0)
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
finish()
}
return super.onOptionsItemSelected(item)
}
private fun createGroup() {
val builder: AlertDialog.Builder = MaterialAlertDialogBuilder(this)
// Header
builder.setTitle(R.string.enter_group_name)
// Layout
val layout = LinearLayout(this)
layout.orientation = LinearLayout.VERTICAL
val params = LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
val contentPadding =
resources.getDimensionPixelSize(R.dimen.alert_dialog_content_padding)
leftMargin = contentPadding
topMargin = contentPadding / 2
rightMargin = contentPadding
}
// EditText with spacing
val input = EditText(this)
input.setInputType(InputType.TYPE_CLASS_TEXT)
input.setLayoutParams(params)
layout.addView(input)
// Set layout
builder.setView(layout)
// Buttons
builder.setPositiveButton(getString(R.string.ok)) { dialog: DialogInterface, which: Int ->
DBHelper.insertGroup(mDatabase, input.text.trim().toString())
updateGroupList()
}
builder.setNegativeButton(getString(R.string.cancel)) { dialog: DialogInterface, which: Int ->
dialog.cancel()
}
val dialog = builder.create()
// Now that the dialog exists, we can bind something that affects the OK button
input.doOnTextChanged { s: CharSequence?, start: Int, before: Int, count: Int ->
val groupName = s?.trim().toString()
if (groupName.isEmpty()) {
input.error = getString(R.string.group_name_is_empty)
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false)
return@doOnTextChanged
}
if (DBHelper.getGroup(mDatabase, groupName) != null) {
input.error = getString(R.string.group_name_already_in_use)
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false)
return@doOnTextChanged
}
input.error = null
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true)
}
dialog.apply {
show()
// Disable button (must be done **after** dialog is shown to prevent crash
getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false)
// Set focus on input field
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}
input.requestFocus()
}
private fun getGroupName(view: View): String {
val groupNameTextView = view.findViewById<TextView>(R.id.name)
return groupNameTextView.text.toString()
}
private fun moveGroup(view: View, up: Boolean) {
val groups = DBHelper.getGroups(mDatabase)
val groupName = getGroupName(view)
val currentIndex = DBHelper.getGroup(mDatabase, groupName).order
// Reinsert group in correct position
val newIndex: Int = if (up) {
currentIndex - 1
} else {
currentIndex + 1
}
// Don't try to move out of bounds
if (newIndex < 0 || newIndex >= groups.size) {
return
}
val group = groups.removeAt(currentIndex)
groups.add(newIndex, group)
// Update database
DBHelper.reorderGroups(mDatabase, groups)
// Update UI
updateGroupList()
// Ordering may have changed, so invalidate
invalidateHomescreenActiveTab()
}
override fun onMoveDownButtonClicked(view: View) {
moveGroup(view, false)
}
override fun onMoveUpButtonClicked(view: View) {
moveGroup(view, true)
}
override fun onEditButtonClicked(view: View) {
Intent(this, ManageGroupActivity::class.java).apply {
putExtra("group", getGroupName(view))
startActivity(this)
}
}
override fun onDeleteButtonClicked(view: View) {
val groupName = getGroupName(view)
MaterialAlertDialogBuilder(this).apply {
setTitle(R.string.deleteConfirmationGroup)
setMessage(groupName)
setPositiveButton(getString(R.string.ok)) { dialog: DialogInterface, which: Int ->
DBHelper.deleteGroup(mDatabase, groupName)
updateGroupList()
// Delete may change ordering, so invalidate
invalidateHomescreenActiveTab()
}
setNegativeButton(getString(R.string.cancel)) { dialog: DialogInterface, which: Int ->
dialog.cancel()
}
}.create().show()
}
}

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