Compare commits

...
179 Commits
Author SHA1 Message Date
Sylvia van Os b675ad785d Release Catima 2.42.1 2026-05-16 15:00:12 +02:00
Sylvia van Os 649bd85fd5 Merge pull request #3133 from CatimaLoyalty/create-pull-request/patch-1778936057
Update Fastlane changelogs
2026-05-16 14:54:42 +02:00
TheLastProject f302fb7da5 Update Fastlane changelogs 2026-05-16 12:54:16 +00:00
Sylvia van Os a9ad35a379 Update CHANGELOG 2026-05-16 14:54:02 +02:00
Sylvia van Os ed412c221a Merge pull request #3132 from CatimaLoyalty/workaround/nfc_crash
Work around NFC crash
2026-05-16 14:53:14 +02:00
Sylvia van Os e46da24e03 Merge pull request #3130 from CatimaLoyalty/create-pull-request/patch-1778768891
Update feature graphic
2026-05-14 17:28:26 +02:00
TheLastProject c9ef64b81f Update feature graphic 2026-05-14 14:28:10 +00:00
Sylvia van Os 18a6235844 Merge pull request #3128 from CatimaLoyalty/dependabot/gradle/androidx.compose-compose-bom-2026.05.00
Bump androidx.compose:compose-bom from 2026.04.01 to 2026.05.00
2026-05-14 16:26:39 +02:00
Sylvia van Os 357566805b Merge pull request #3129 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-14 16:26:22 +02:00
inesre f89a2b8447 Translated using Weblate (Spanish)
Currently translated at 94.4% (154 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2026-05-14 11:11:51 +02:00
dependabot[bot] 2528b9ff2a Bump androidx.compose:compose-bom from 2026.04.01 to 2026.05.00
Bumps androidx.compose:compose-bom from 2026.04.01 to 2026.05.00.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.05.00
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-14 02:54:48 +00:00
Sylvia van Os 3a8b3689fb Merge pull request #3122 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-11 19:10:01 +02:00
ssantos 74d2a17867 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2026-05-11 15:11:58 +02:00
ssantos e77c90debe Translated using Weblate (Portuguese)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/pt/
2026-05-11 15:11:58 +02:00
Sylvia van Os 8364e86980 Merge pull request #3123 from CatimaLoyalty/create-pull-request/patch-1778394739
Update contributors
2026-05-10 10:05:15 +02:00
TheLastProject fc5206456e Update contributors 2026-05-10 06:32:18 +00:00
Sylvia van Os 216e3afec7 Merge pull request #3121 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-09 11:32:12 +02:00
ssantos 70b86277bd Added translation using Weblate (Portuguese) 2026-05-09 08:09:14 +00:00
ssantos 488163c945 Translated using Weblate (Portuguese)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2026-05-09 08:09:13 +00:00
H Tamás 5c8916d32e Translated using Weblate (Hungarian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2026-05-09 08:09:13 +00:00
Sylvia van Os 9f1fa7601b Merge pull request #3118 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-08 12:49:29 +02:00
H Tamás a3f59ed7a2 Translated using Weblate (Hungarian)
Currently translated at 86.5% (277 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2026-05-08 07:11:38 +02:00
delvani 20ad4003b7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2026-05-08 07:11:38 +02:00
Sylvia van Os c059dd916e Update fastlane 2026-05-07 23:18:26 +02:00
Sylvia van Os 61b582f676 Release Catima 2.42.0 2026-05-06 20:34:41 +02:00
Sylvia van Os 4bf6ae897f Merge pull request #3116 from CatimaLoyalty/feature/java_25_21
Java fixes
2026-05-06 20:29:56 +02:00
Sylvia van Os 74b15ce766 Java fixes
Use 25 in build.sh (Fedora 44 doesn't ship with 21 anymore) and target
21 consistently (Android Studio doesn't support 25 yet)
2026-05-06 19:01:35 +02:00
Sylvia van Os cea4a5431e Merge pull request #3115 from CatimaLoyalty/dependabot/gradle/gradle-wrapper-9.5.0
Bump gradle-wrapper from 9.4.1 to 9.5.0
2026-05-06 17:05:31 +02:00
dependabot[bot] 12e0105b5a Bump gradle-wrapper from 9.4.1 to 9.5.0
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.4.1 to 9.5.0.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.4.1...v9.5.0)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-06 02:53:39 +00:00
Sylvia van Os 17be43d0d2 Merge pull request #3114 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-05 20:47:27 +02:00
Francisco Serrador dd071c912a Translated using Weblate (Spanish)
Currently translated at 94.4% (154 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2026-05-05 18:47:00 +02:00
The Wizard 32cdacb4be Translated using Weblate (Arabic)
Currently translated at 99.3% (318 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2026-05-05 18:46:59 +02:00
Thu Trang Pham c1cbebd782 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2026-05-05 18:46:58 +02:00
Sylvia van Os 2a334445dc Merge pull request #3113 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-05 13:27:21 +02:00
Patrik 34bba5a636 Translated using Weblate (Czech)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2026-05-05 11:12:23 +00:00
Francisco Serrador 3c18ac0d96 Translated using Weblate (Spanish)
Currently translated at 75.4% (123 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2026-05-05 11:12:22 +00:00
Patrik 9b9005087e Translated using Weblate (Slovak)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2026-05-05 11:12:21 +00:00
The Wizard 88f0bc4c28 Translated using Weblate (Arabic)
Currently translated at 99.0% (317 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2026-05-05 11:12:20 +00:00
Sylvia van Os c8d368e86f Merge pull request #3112 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-04 11:37:04 +02:00
Patrik 318d6956fa Translated using Weblate (Slovak)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2026-05-04 09:10:36 +00:00
Omikorin 5443214033 Translated using Weblate (Polish)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2026-05-04 09:10:36 +00:00
NooB9496 2bdabbcd4c Translated using Weblate (Polish)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2026-05-04 09:10:35 +00:00
Francisco Serrador 38eaa59518 Translated using Weblate (Spanish)
Currently translated at 69.9% (114 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2026-05-04 09:10:34 +00:00
Patrik ed6fa92f51 Translated using Weblate (Slovak)
Currently translated at 95.7% (156 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2026-05-04 09:10:33 +00:00
Sylvia van Os 7f0b4bccb3 Merge pull request #3111 from CatimaLoyalty/create-pull-request/patch-1777789590
Update contributors
2026-05-03 08:48:31 +02:00
TheLastProject f4edfb870b Update contributors 2026-05-03 06:26:30 +00:00
Sylvia van Os 9a07256a70 Merge pull request #3110 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-05-02 20:34:58 +02:00
이정희 b744754949 Translated using Weblate (Korean)
Currently translated at 94.3% (302 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2026-05-02 18:10:09 +00:00
ssantos f08859b377 Translated using Weblate (Portuguese)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2026-05-02 18:10:08 +00:00
ssantos fb5475b724 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2026-05-02 18:10:07 +00:00
Sylvia van Os 798d26ddae Merge pull request #3109 from CatimaLoyalty/fix/nfc_state
Ensure correct NFC state on onResume
2026-05-02 19:02:56 +02:00
Sylvia van Os cd2eb2e0d9 Ensure correct NFC state on onResume
This fixes going to settings from the view activity and disabling NFC,
followed by a press of the back button from not disabling reader mode
2026-05-02 16:14:50 +02:00
NightShiftNexus dfa1c29fa0 feat: split complex loyaltyCardViewActivity (#3072) 2026-05-02 16:10:03 +02:00
Sylvia van Os 090e85ea1c Merge pull request #3106 from CatimaLoyalty/dependabot/gradle/androidx.compose-compose-bom-2026.04.01
Bump androidx.compose:compose-bom from 2026.03.01 to 2026.04.01
2026-04-30 11:44:47 +02:00
dependabot[bot] d1fd7c1eb0 Bump androidx.compose:compose-bom from 2026.03.01 to 2026.04.01
Bumps androidx.compose:compose-bom from 2026.03.01 to 2026.04.01.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.04.01
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-30 05:37:45 +00:00
Sylvia van Os 775cba5667 Merge pull request #3105 from CatimaLoyalty/dependabot/gradle/kotlin-2.3.21
Bump kotlin from 2.3.20 to 2.3.21
2026-04-30 07:36:40 +02:00
dependabot[bot] 6f40bc5b1b Bump kotlin from 2.3.20 to 2.3.21
Bumps `kotlin` from 2.3.20 to 2.3.21.

Updates `org.jetbrains.kotlin.android` from 2.3.20 to 2.3.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.3.20...v2.3.21)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.3.20 to 2.3.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.3.20...v2.3.21)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-30 02:56:01 +00:00
Sylvia van Os e14fb974b4 Fix last updated year 2026-04-29 21:36:39 +02:00
Sylvia van Os dbf29c6b83 Add NFC permission to privacy policy (#3104) 2026-04-29 21:24:06 +02:00
Sylvia van Os ad44fd3382 Merge pull request #3103 from CatimaLoyalty/revert-3095-fix/remove_unneeded_nfc_permission
Revert "Remove unneeded NFC permission"
2026-04-29 19:42:47 +02:00
Sylvia van Os 61df41d5fe Merge pull request #3102 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-29 19:27:38 +02:00
Sylvia van Os 942a795c2c Revert "Remove unneeded NFC permission" 2026-04-29 19:18:52 +02:00
Sylvia van Os 5f948badd1 Translated using Weblate (Spanish)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2026-04-29 17:10:21 +00:00
Liner Seven f07f32b169 Translated using Weblate (Japanese)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2026-04-29 17:10:20 +00:00
Liner Seven 905257d039 Translated using Weblate (Japanese)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2026-04-29 17:10:19 +00:00
ezn24 4af7500e42 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2026-04-29 17:10:18 +00:00
Sylvia van Os a9a3a0037b Merge pull request #3100 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-28 18:28:16 +02:00
Sylvia van Os 111d16319b Translated using Weblate (Bulgarian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2026-04-28 17:10:27 +02:00
Francisco Serrador 269a74da52 Translated using Weblate (Spanish)
Currently translated at 67.4% (110 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2026-04-28 17:10:26 +02:00
Milo Ivir 51a094a502 Translated using Weblate (Croatian)
Currently translated at 2.4% (4 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hr/
2026-04-28 17:10:25 +02:00
Francisco Serrador b048c017bf Translated using Weblate (Spanish)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2026-04-28 17:10:24 +02:00
NooB9496 d725756498 Translated using Weblate (Polish)
Currently translated at 99.3% (162 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2026-04-28 17:10:23 +02:00
Milo Ivir 65649bbb72 Translated using Weblate (Croatian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2026-04-28 17:10:22 +02:00
Sylvia van Os 7e246e9d78 Merge pull request #3098 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-27 16:35:37 +02:00
Sylvain Pichon cdf965f4da Translated using Weblate (French)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2026-04-27 16:11:24 +02:00
Fjuro b2e19bb89a Translated using Weblate (Czech)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2026-04-27 16:11:24 +02:00
B o d o ba6cfb0a55 Translated using Weblate (German)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2026-04-27 16:11:23 +02:00
109247019824 8a24dbfdaf Translated using Weblate (Bulgarian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2026-04-27 16:11:21 +02:00
Oğuz Ersen d84e13e2ef Translated using Weblate (Turkish)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2026-04-27 16:11:20 +02:00
大王叫我来巡山 c4727aa3d8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2026-04-27 16:11:18 +02:00
josé m. 110b5d4c87 Translated using Weblate (Galician)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2026-04-27 16:11:17 +02:00
大王叫我来巡山 b8c834794b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2026-04-27 16:11:16 +02:00
solokot bcc1cc412e Translated using Weblate (Russian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2026-04-27 16:11:16 +02:00
B o d o ff96880cc2 Translated using Weblate (German)
Currently translated at 100.0% (163 of 163 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2026-04-27 16:11:15 +02:00
Sylvain Pichon 6f4e9662db Translated using Weblate (French)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2026-04-27 16:11:14 +02:00
Gideon 5da99fc5f0 Translated using Weblate (Dutch)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2026-04-27 16:11:12 +02:00
Priit Jõerüüt ec3fc8737a Translated using Weblate (Estonian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2026-04-27 16:11:11 +02:00
Vasilis K. 5fd3dcda36 Translated using Weblate (Greek)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2026-04-27 16:11:11 +02:00
Fjuro 938aaba898 Translated using Weblate (Czech)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2026-04-27 16:11:10 +02:00
Giovanni Donisi cb7e6c96b0 Translated using Weblate (Italian)
Currently translated at 100.0% (320 of 320 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2026-04-27 16:11:09 +02:00
Sylvia van Os 49b128a20c Merge pull request #3096 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-26 16:04:06 +02:00
7f683eb920 Translated using Weblate (Korean)
Currently translated at 95.2% (300 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2026-04-26 13:10:01 +00:00
Sylvia van Os 489c89205d Merge pull request #3095 from CatimaLoyalty/fix/remove_unneeded_nfc_permission
Remove unneeded NFC permission
2026-04-25 18:20:55 +02:00
Sylvia van Os 4b0b91de98 Remove unneeded NFC permission 2026-04-25 16:09:39 +02:00
Sylvia van Os c54b1ab4a0 Merge pull request #3094 from CatimaLoyalty/create-pull-request/patch-1777125791
Update Fastlane changelogs
2026-04-25 16:03:39 +02:00
TheLastProject 8055a2b651 Update Fastlane changelogs 2026-04-25 14:03:11 +00:00
Sylvia van Os 71ababc4d1 Update CHANGELOG 2026-04-25 16:02:58 +02:00
Sylvia van Os 498b885398 Merge pull request #3047 from il-Luca/feature/pause-nfc-while-viewing-card
Add option to pause NFC while viewing a card
2026-04-25 16:02:30 +02:00
Sylvia van Os 774fcfd497 Improve comment clarity 2026-04-25 15:46:23 +02:00
Sylvia van Os 0967e475d5 Pause NFC by default 2026-04-25 15:42:08 +02:00
Sylvia van Os 2bd6fc444e Show snackbar when NFC is paused 2026-04-25 14:07:14 +02:00
Sylvia van Os dfa025952b Merge pull request #3093 from CatimaLoyalty/dependabot/github_actions/peter-evans/create-pull-request-8.1.1
Bump peter-evans/create-pull-request from 8.1.0 to 8.1.1
2026-04-23 09:09:12 +02:00
Sylvia van Os 30918675bf Merge pull request #3092 from CatimaLoyalty/dependabot/github_actions/actions/upload-artifact-7.0.1
Bump actions/upload-artifact from 7.0.0 to 7.0.1
2026-04-23 09:08:34 +02:00
dependabot[bot] 91f6c11821 Bump peter-evans/create-pull-request from 8.1.0 to 8.1.1
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 8.1.0 to 8.1.1.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v8.1.0...v8.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 02:53:10 +00:00
dependabot[bot] bf16fbe84b Bump actions/upload-artifact from 7.0.0 to 7.0.1
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v7.0.0...v7.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 02:53:02 +00:00
Sylvia van Os ffb8003245 Merge pull request #3090 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-21 21:29:59 +02:00
Ariel Isaharov 1645b5f362 Translated using Weblate (Hebrew (Israel))
Currently translated at 23.8% (75 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2026-04-21 19:09:56 +00:00
Sylvia van Os aa03cb5f89 Merge pull request #3089 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-20 19:31:59 +02:00
אופק מזרחי 1d8025b0cf Translated using Weblate (Hebrew)
Currently translated at 13.0% (41 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he/
2026-04-20 17:09:59 +00:00
Sylvia van Os 3ac8998377 Merge pull request #3088 from CatimaLoyalty/create-pull-request/patch-1776191728
Update Fastlane changelogs
2026-04-14 21:06:34 +02:00
TheLastProject 5160f61523 Update Fastlane changelogs 2026-04-14 18:35:28 +00:00
Sylvia van Os 68c5fa10f4 Update CHANGELOG 2026-04-14 20:35:15 +02:00
Sylvia van Os 620f564ae5 Merge pull request #3087 from utafrali/fix/issue-3086-feature-request-timestamp-in-the-export-
Add timestamp to export filename
2026-04-14 20:34:35 +02:00
ugurtafrali b840d481a8 Add timestamp to export filename 2026-04-14 00:31:40 +03:00
Sylvia van Os 7872a59a89 Merge pull request #3085 from CatimaLoyalty/create-pull-request/patch-1775973243
Update contributors
2026-04-12 09:19:26 +02:00
TheLastProject 62c7f92563 Update contributors 2026-04-12 05:54:02 +00:00
Sylvia van Os 283f237180 Merge pull request #3084 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-10 13:18:16 +02:00
Thu Trang Pham 6dcd1c43fe Translated using Weblate (Vietnamese)
Currently translated at 100.0% (315 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2026-04-10 06:47:10 +02:00
Chaitanya 805bad437c Translated using Weblate (Hindi)
Currently translated at 100.0% (315 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2026-04-10 06:47:10 +02:00
Sylvia van Os f476fb1cc0 Merge pull request #3082 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-08 10:53:11 +02:00
Sylvia van Os f35f8b1b29 Translated using Weblate (Bosnian)
Currently translated at 100.0% (315 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bs/
2026-04-07 22:53:57 +00:00
Sylvia van Os 061ed7e765 Merge pull request #3081 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-07 15:18:02 +02:00
Milo Ivir fbbfe78828 Translated using Weblate (Croatian)
Currently translated at 100.0% (315 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2026-04-06 19:09:57 +00:00
pacavarn 557132b4c5 Translated using Weblate (Bosnian)
Currently translated at 100.0% (315 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bs/
2026-04-06 19:09:56 +00:00
Sylvia van Os 5bc7a15c15 Merge pull request #3079 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-04-03 21:41:03 +02:00
Sylvia van Os 0fa34e3eeb Translated using Weblate (Vietnamese)
Currently translated at 88.2% (278 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2026-04-03 21:40:33 +02:00
Thu Trang Pham eeef8bd468 Translated using Weblate (Vietnamese)
Currently translated at 88.2% (278 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2026-04-03 18:09:58 +02:00
Sylvia van Os 6b5eeea3b7 Merge pull request #3077 from CatimaLoyalty/dependabot/gradle/androidx.compose-compose-bom-2026.03.01
Bump androidx.compose:compose-bom from 2026.03.00 to 2026.03.01
2026-04-02 08:31:43 +02:00
dependabot[bot] 6e9fd540c5 Bump androidx.compose:compose-bom from 2026.03.00 to 2026.03.01
Bumps androidx.compose:compose-bom from 2026.03.00 to 2026.03.01.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.03.01
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-02 05:34:18 +00:00
Sylvia van Os c4da8ce9df Merge pull request #3075 from CatimaLoyalty/create-pull-request/patch-1774762990
Update contributors
2026-03-29 10:21:42 +02:00
TheLastProject 5cc50e6e06 Update contributors 2026-03-29 05:43:10 +00:00
Sylvia van Os 5088ea7b80 Merge pull request #3074 from CatimaLoyalty/dependabot/gradle/gradle-wrapper-9.4.1
Bump gradle-wrapper from 9.4.0 to 9.4.1
2026-03-27 19:50:16 +01:00
dependabot[bot] d7ae175a00 Bump gradle-wrapper from 9.4.0 to 9.4.1
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.4.0 to 9.4.1.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.4.0...v9.4.1)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-27 02:53:17 +00:00
Sylvia van Os 60e47f2ffc Update to AGP 9.1.0 (#3071) 2026-03-26 21:00:32 +01:00
Sylvia van Os 850c2d3b8a Merge pull request #3070 from CatimaLoyalty/create-pull-request/patch-1774369651
Update Fastlane changelogs
2026-03-24 18:01:11 +01:00
TheLastProject cdddd5eacf Update Fastlane changelogs 2026-03-24 16:27:30 +00:00
Sylvia van Os fd4793db99 Update CHANGELOG 2026-03-24 17:27:18 +01:00
Sylvia van Os 9006dbee87 Merge pull request #3069 from tbertels/first_letter_capital
Set store name first letter as capital by default
2026-03-24 17:26:18 +01:00
Thomas Bertels 073923d072 Set store name first letter as capital by default
Asks the keyboard to switch to capital for the first letter of each
word.
2026-03-24 09:45:59 +01:00
Sylvia van Os dfb006584e Merge pull request #3066 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-03-23 17:50:32 +01:00
Sylvia van Os c00383ce81 Translated using Weblate (Spanish (Argentina))
Currently translated at 87.3% (275 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2026-03-23 16:51:57 +01:00
Sylvia van Os ca9d61d955 Translated using Weblate (Finnish)
Currently translated at 99.3% (313 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2026-03-23 16:51:57 +01:00
Lilli 37a8549d21 Translated using Weblate (Finnish)
Currently translated at 99.3% (313 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2026-03-23 12:10:03 +00:00
Agustin Rodriguez 6c753b5058 Translated using Weblate (Spanish (Argentina))
Currently translated at 87.3% (275 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2026-03-23 12:10:02 +00:00
Sylvia van Os 7395ed0c2b Merge pull request #3064 from CatimaLoyalty/dependabot/gradle/androidx.core-core-ktx-1.18.0
Bump androidx.core:core-ktx from 1.17.0 to 1.18.0
2026-03-19 09:38:59 +01:00
dependabot[bot] 2b55c2b5e0 Bump androidx.core:core-ktx from 1.17.0 to 1.18.0
Bumps androidx.core:core-ktx from 1.17.0 to 1.18.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 06:13:20 +00:00
Sylvia van Os 41d9aa488f Merge pull request #3063 from CatimaLoyalty/dependabot/gradle/androidx.compose-compose-bom-2026.03.00
Bump androidx.compose:compose-bom from 2026.02.01 to 2026.03.00
2026-03-19 07:12:19 +01:00
dependabot[bot] 3e46d2ad84 Bump androidx.compose:compose-bom from 2026.02.01 to 2026.03.00
Bumps androidx.compose:compose-bom from 2026.02.01 to 2026.03.00.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.03.00
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 05:51:36 +00:00
Sylvia van Os dac990716d Merge pull request #3062 from CatimaLoyalty/dependabot/gradle/androidx.activity-activity-compose-1.13.0
Bump androidx.activity:activity-compose from 1.12.2 to 1.13.0
2026-03-19 06:50:21 +01:00
dependabot[bot] ed56e14574 Bump androidx.activity:activity-compose from 1.12.2 to 1.13.0
Bumps androidx.activity:activity-compose from 1.12.2 to 1.13.0.

---
updated-dependencies:
- dependency-name: androidx.activity:activity-compose
  dependency-version: 1.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 02:52:32 +00:00
Sylvia van Os acf72397b6 Merge pull request #3061 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-03-16 20:58:22 +01:00
EditaNEmilis 02d97e440f Translated using Weblate (Lithuanian)
Currently translated at 77.4% (244 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2026-03-16 19:10:03 +00:00
Sylvia van Os f2e67d3727 Merge pull request #3058 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-03-15 16:52:37 +01:00
Sylvia van Os ae11b24c7a Merge pull request #3059 from CatimaLoyalty/create-pull-request/patch-1773552502
Update contributors
2026-03-15 10:47:59 +01:00
TheLastProject 6f2b77fbdc Update contributors 2026-03-15 05:28:21 +00:00
Liner Seven 11d4df8c36 Translated using Weblate (Japanese)
Currently translated at 100.0% (162 of 162 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2026-03-15 02:10:11 +01:00
Sylvia van Os f221b01811 Merge pull request #3056 from CatimaLoyalty/dependabot/gradle/gradle-wrapper-9.4.0
Bump gradle-wrapper from 9.3.1 to 9.4.0
2026-03-13 20:09:52 +01:00
Sylvia van Os 236e9e60da Merge pull request #3057 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-03-13 19:38:35 +01:00
Thu Trang Pham 40cfb3d111 Translated using Weblate (Vietnamese)
Currently translated at 87.9% (277 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2026-03-13 15:11:56 +01:00
Arif Budiman 05190e6384 Translated using Weblate (Indonesian)
Currently translated at 95.0% (154 of 162 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2026-03-13 15:11:56 +01:00
dependabot[bot] 77ab8ed85b Bump gradle-wrapper from 9.3.1 to 9.4.0
Bumps gradle-wrapper from 9.3.1 to 9.4.0.

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-12 02:53:34 +00:00
Sylvia van Os 059cf5e631 Merge pull request #3055 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-03-11 16:23:18 +01:00
claudio.arseni b304c7ebe8 Translated using Weblate (Italian)
Currently translated at 100.0% (315 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2026-03-11 14:10:13 +00:00
claudio.arseni 9b097d3a42 Translated using Weblate (Italian)
Currently translated at 97.5% (158 of 162 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2026-03-11 14:10:10 +00:00
AhmedAwad 4dc2e1f262 Translated using Weblate (Arabic)
Currently translated at 41.9% (68 of 162 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2026-03-11 14:09:56 +00:00
claudio.arseni 6a10cdd8cd Translated using Weblate (Italian)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/it/
2026-03-11 14:09:48 +00:00
Sylvia van Os 7febdf13b7 Merge pull request #3054 from CatimaLoyalty/dependabot/gradle/androidx.compose-compose-bom-2026.02.01
Bump androidx.compose:compose-bom from 2026.02.00 to 2026.02.01
2026-03-09 07:04:54 +01:00
dependabot[bot] 47b0b678e4 Bump androidx.compose:compose-bom from 2026.02.00 to 2026.02.01
Bumps androidx.compose:compose-bom from 2026.02.00 to 2026.02.01.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.02.01
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 02:52:31 +00:00
Sylvia van Os 4e21c606ef Merge pull request #3053 from CatimaLoyalty/create-pull-request/patch-1772988807
Update feature graphic
2026-03-08 17:53:53 +01:00
TheLastProject aef143256d Update feature graphic 2026-03-08 16:53:26 +00:00
Sylvia van Os 7c76bd91b4 Merge pull request #3052 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2026-03-08 17:51:50 +01:00
Sylvia van Os 2ddce7b69b Translated using Weblate (Serbian)
Currently translated at 100.0% (315 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sr/
2026-03-08 17:51:24 +01:00
Michał Korczak 73df916b86 Translated using Weblate (Polish)
Currently translated at 99.3% (161 of 162 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2026-03-08 17:10:10 +01:00
Zoran Jeremić 85285a2005 Translated using Weblate (Serbian)
Currently translated at 3.0% (5 of 162 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sr/
2026-03-08 17:10:08 +01:00
Zoran Jeremić 5a3b90ec12 Translated using Weblate (Serbian)
Currently translated at 100.0% (315 of 315 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sr/
2026-03-08 17:10:04 +01:00
LepusOL 13bc0b7d46 Translated using Weblate (German)
Currently translated at 100.0% (162 of 162 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2026-03-08 17:10:01 +01:00
Sylvia van Os 814e11a153 Merge pull request #3051 from CatimaLoyalty/create-pull-request/patch-1772946485
Update contributors
2026-03-08 10:44:06 +01:00
TheLastProject 262988a0f8 Update contributors 2026-03-08 05:08:05 +00:00
il-Luca 0428a87c71 Add option to pause NFC while viewing a card 2026-02-27 12:37:19 +01:00
203 changed files with 1937 additions and 1029 deletions

No files matched your search

+5 -5
View File
@@ -24,7 +24,7 @@ permissions:
security-events: none
statuses: none
env:
JAVA_HOME: /usr/lib/jvm/java-21-openjdk-amd64
JAVA_HOME: /usr/lib/jvm/java-25-openjdk-amd64
jobs:
build:
runs-on: ubuntu-latest
@@ -34,17 +34,17 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: gradle/actions/wrapper-validation@v5
- name: set up OpenJDK 21
- name: set up OpenJDK 25
run: |
sudo apt-get update
sudo apt-get install -y openjdk-21-jdk-headless
sudo apt-get install -y openjdk-25-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; }
run: timeout 5m ./gradlew test${{ matrix.flavor }}DebugUnitTest || { ./gradlew --stop && timeout 5m ./gradlew test${{ matrix.flavor }}DebugUnitTest; }
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
@@ -64,7 +64,7 @@ jobs:
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
- name: Archive test results
if: always()
uses: actions/upload-artifact@v7.0.0
uses: actions/upload-artifact@v7.0.1
with:
name: test-results-flavor${{ matrix.flavor }}
path: app/build/reports
+1 -1
View File
@@ -27,7 +27,7 @@ jobs:
- name: Run converter script
run: python .scripts/changelog_to_fastlane.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v8.1.0
uses: peter-evans/create-pull-request@v8.1.1
with:
title: "Update Fastlane changelogs"
commit-message: "Update Fastlane changelogs"
+1 -1
View File
@@ -27,7 +27,7 @@ jobs:
- name: Remove gradle-update-robot from contributors (not a person)
run: "sed -i '/^gradle-update-robot$/d' app/src/main/res/raw/contributors.txt"
- name: Create Pull Request
uses: peter-evans/create-pull-request@v8.1.0
uses: peter-evans/create-pull-request@v8.1.1
with:
title: "Update contributors"
commit-message: "Update contributors"
@@ -31,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@v8.1.0
uses: peter-evans/create-pull-request@v8.1.1
with:
title: "Update feature graphic"
commit-message: "Update feature graphic"
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
- name: Update locales
run: .scripts/locales.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v8.1.0
uses: peter-evans/create-pull-request@v8.1.1
with:
title: "Update locales"
commit-message: "Update locales"
+1
View File
@@ -0,0 +1 @@
3.3.11
+10
View File
@@ -1,5 +1,15 @@
# Changelog
## v2.42.1 - 166 (2026-05-16)
- Prevent crash on devices with misbehaving NFC
## v2.42.0 - 165 (2026-05-06)
- Disable NFC while showing a card by default
- Ask keyboard to capitalize each word in store name in edit screen
- Put date in export file name
## v2.41.7 - 164 (2026-03-06)
Android 5.0 and 5.1 are no longer supported starting with this release. If you want to use Catima on these versions, please use version 2.41.6.
-5
View File
@@ -1,8 +1,3 @@
source "https://rubygems.org"
gem "fastlane"
# https://github.com/fastlane/fastlane/issues/29183
gem "abbrev"
gem "mutex_m"
gem "ostruct"
+34 -38
View File
@@ -1,40 +1,40 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.7)
base64
nkf
rexml
CFPropertyList (3.0.8)
abbrev (0.1.2)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
aws-partitions (1.1117.0)
aws-sdk-core (3.226.0)
aws-partitions (1.1246.0)
aws-sdk-core (3.246.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
bigdecimal
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-kms (1.105.0)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sdk-kms (1.124.0)
aws-sdk-core (~> 3, >= 3.244.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.189.1)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sdk-s3 (1.221.0)
aws-sdk-core (~> 3, >= 3.244.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.3.0)
bigdecimal (4.1.2)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
csv (3.3.5)
declarative (0.0.20)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
@@ -42,7 +42,7 @@ GEM
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.112.0)
faraday (1.10.4)
faraday (1.10.5)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
@@ -54,25 +54,26 @@ GEM
faraday-rack (~> 1.0)
faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.7)
faraday-cookie_jar (0.0.8)
faraday (>= 0.8.0)
http-cookie (~> 1.0.0)
http-cookie (>= 1.0.0)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.1)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.1.1)
faraday-multipart (1.2.0)
multipart-post (~> 2.0)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
faraday-retry (1.0.4)
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.0)
fastlane (2.228.0)
fastimage (2.4.1)
fastlane (2.229.0)
CFPropertyList (>= 2.3, < 4.0.0)
abbrev (~> 0.1.2)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
@@ -80,6 +81,7 @@ GEM
bundler (>= 1.12.0, < 3.0.0)
colored (~> 1.2)
commander (~> 4.6)
csv (~> 3.3)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
@@ -99,6 +101,7 @@ GEM
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
mutex_m (~> 0.3.0)
naturally (~> 2.2)
optparse (>= 0.1.1, < 1.0.0)
plist (>= 3.1.0, < 4.0.0)
@@ -113,8 +116,7 @@ GEM
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.1)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
fastlane-sirp (1.1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
@@ -137,7 +139,7 @@ GEM
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.5.0)
google-cloud-errors (1.6.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
@@ -158,43 +160,40 @@ GEM
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.12.2)
jwt (2.10.1)
json (2.19.5)
jwt (2.10.2)
base64
logger (1.7.0)
mini_magick (4.13.2)
mini_mime (1.1.5)
multi_json (1.15.0)
multi_json (1.21.1)
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
naturally (2.3.0)
nkf (0.2.0)
optparse (0.6.0)
optparse (0.8.1)
os (1.1.4)
ostruct (0.6.1)
plist (3.7.2)
public_suffix (6.0.2)
rake (13.3.0)
public_suffix (7.0.5)
rake (13.4.2)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.4.1)
retriable (3.4.1)
rexml (3.4.4)
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
security (0.1.5)
signet (0.20.0)
signet (0.21.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
jwt (>= 1.5, < 4.0)
multi_json (~> 1.10)
simctl (1.6.10)
CFPropertyList
naturally
sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@@ -222,10 +221,7 @@ PLATFORMS
ruby
DEPENDENCIES
abbrev
fastlane
mutex_m
ostruct
BUNDLED WITH
2.5.22
+2 -1
View File
@@ -1,5 +1,5 @@
**Last updated**
September 30 2025
April 29 2026
# Privacy Policy
Catima does not collect or transmit any personal information.
@@ -7,6 +7,7 @@ Catima does not collect or transmit any personal information.
To ensure correct app functionality, we require access to the following:
- Camera: We need access to your camera to be able to scan barcodes. The app can still be used when camera access is denied, but you will have to manually type the barcode information.
- NFC: We need NFC access to temporarily disable NFC while showing a barcode to prevent NFC payment apps from triggering (such as when using a check-in gates which support both barcodes and NFC payments). This functionality can be disabled in settings.
- Storage (Android 5 and 6 only): We need access to your device storage to create or import backups. The app can still be used when storage access is denied, but you will not be able to create or import backups.
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.
+6 -7
View File
@@ -19,8 +19,8 @@ android {
applicationId = "me.hackerchick.catima"
minSdk = 23
targetSdk = 36
versionCode = 164
versionName = "2.41.7"
versionCode = 166
versionName = "2.42.1"
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true
@@ -38,7 +38,7 @@ android {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android.txt"),
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
@@ -98,7 +98,7 @@ android {
kotlin {
compilerOptions {
jvmTarget = JvmTarget.JVM_17
jvmTarget = JvmTarget.JVM_21
}
}
compileOptions {
@@ -107,9 +107,8 @@ android {
// Flag to enable support for the new language APIs
isCoreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
}
+2 -2
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">Debug di Catima</string>
</resources>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Depuração do Catima</string>
</resources>
+5 -1
View File
@@ -12,8 +12,12 @@
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="23" />
<uses-feature
android:name="android.hardware.nfc"
android:required="false" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
@@ -94,7 +98,7 @@
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".LoyaltyCardViewActivity"
android:name=".cardview.LoyaltyCardViewActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar" />
<activity
@@ -57,7 +57,7 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
private final boolean showFallback;
private final BarcodeImageWriterResultCallback callback;
BarcodeImageWriterTask(
public BarcodeImageWriterTask(
Context context, ImageView imageView, String cardIdString,
CatimaBarcode barcodeFormat, @NonNull Charset barcodeEncoding, TextView textView,
boolean showFallback, BarcodeImageWriterResultCallback callback, boolean roundCornerPadding, boolean isFullscreen
@@ -22,6 +22,8 @@ import java.util.List;
import java.util.concurrent.Flow;
import java.util.function.Consumer;
import protect.card_locker.cardview.LoyaltyCardViewActivity;
@RequiresApi(Build.VERSION_CODES.R)
public class CardsOnPowerScreenService extends ControlsProviderService {
@@ -27,6 +27,9 @@ import protect.card_locker.importexport.ImportExportResultType
import java.io.IOException
import java.io.InputStream
import java.io.OutputStream
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
class ImportExportActivity : CatimaAppCompatActivity() {
private lateinit var binding: ImportExportActivityBinding
@@ -45,6 +48,11 @@ class ImportExportActivity : CatimaAppCompatActivity() {
companion object {
private const val TAG = "Catima"
internal fun getExportFilename(): String {
val sdf = SimpleDateFormat("yyyyMMdd", Locale.US)
return "catima_${sdf.format(Date())}.zip"
}
}
override fun onCreate(savedInstanceState: Bundle?) {
@@ -107,7 +115,7 @@ class ImportExportActivity : CatimaAppCompatActivity() {
val intentCreateDocumentAction = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/zip"
putExtra(Intent.EXTRA_TITLE, "catima.zip")
putExtra(Intent.EXTRA_TITLE, getExportFilename())
}
val exportButton: Button = binding.exportButton
@@ -13,6 +13,7 @@ import android.view.View
import android.widget.RemoteViews
import androidx.core.widget.RemoteViewsCompat
import protect.card_locker.DBHelper.LoyaltyCardArchiveFilter
import protect.card_locker.cardview.LoyaltyCardViewActivity
class ListWidget : AppWidgetProvider() {
fun updateAll(context: Context) {
@@ -129,4 +130,4 @@ class ListWidget : AppWidgetProvider() {
return remoteViews
}
}
}
@@ -719,6 +719,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
});
}
@Override
protected void onDestroy() {
if (mDatabase != null && mDatabase.isOpen()) {
mDatabase.close();
}
super.onDestroy();
}
private void selectTab(int index) {
binding.tabs.selectTab(binding.tabs.getTabAt(index));
viewModel.setTabIndex(index);
@@ -31,6 +31,7 @@ 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.cardview.LoyaltyCardViewActivity
import protect.card_locker.databinding.ContentMainBinding
import protect.card_locker.databinding.MainActivityBinding
import protect.card_locker.databinding.SortingOptionBinding
@@ -15,11 +15,11 @@ import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.LinkedList;
class ShortcutHelper {
import protect.card_locker.cardview.LoyaltyCardViewActivity;
public class ShortcutHelper {
/**
* This variable controls the maximum number of shortcuts available.
* It is made public only to make testing easier and should not be
@@ -43,33 +43,36 @@ class ShortcutHelper {
* based on the lastUsed field. Archived cards are excluded from the shortcuts
* list. The list keeps at most maxShortcuts number of elements.
*/
static void updateShortcuts(Context context) {
public static void updateShortcuts(Context context) {
if (maxShortcuts == -1) {
maxShortcuts = ShortcutManagerCompat.getMaxShortcutCountPerActivity(context);
}
LinkedList<ShortcutInfoCompat> finalList = new LinkedList<>();
SQLiteDatabase database = new DBHelper(context).getReadableDatabase();
Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase database = dbHelper.getReadableDatabase();
try (Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(
database,
"",
null,
DBHelper.LoyaltyCardOrder.LastUsed,
DBHelper.LoyaltyCardOrderDirection.Ascending,
DBHelper.LoyaltyCardArchiveFilter.Unarchived
);
)) {
int rank = 0;
int rank = 0;
while (rank < maxShortcuts && loyaltyCardCursor.moveToNext()) {
int id = loyaltyCardCursor.getInt(loyaltyCardCursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(context, database, id);
while (rank < maxShortcuts && loyaltyCardCursor.moveToNext()) {
int id = loyaltyCardCursor.getInt(loyaltyCardCursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(context, database, id);
ShortcutInfoCompat updatedShortcut = createShortcutBuilder(context, loyaltyCard)
.setRank(rank)
.build();
ShortcutInfoCompat updatedShortcut = createShortcutBuilder(context, loyaltyCard)
.setRank(rank)
.build();
finalList.addLast(updatedShortcut);
rank++;
finalList.addLast(updatedShortcut);
rank++;
}
} finally {
dbHelper.close();
}
ShortcutManagerCompat.setDynamicShortcuts(context, finalList);
@@ -110,4 +113,4 @@ class ShortcutHelper {
.setIntent(intent)
.setIcon(icon);
}
}
}
@@ -0,0 +1,103 @@
package protect.card_locker.cardview;
import java.util.ArrayList;
import java.util.List;
final class LoyaltyCardImageNavigator {
private final List<LoyaltyCardImageType> imageTypes;
private int currentIndex;
LoyaltyCardImageNavigator(List<LoyaltyCardImageType> imageTypes, int currentIndex) {
this.imageTypes = new ArrayList<>(imageTypes);
this.currentIndex = clampIndex(currentIndex);
}
LoyaltyCardImageType getCurrent() {
if (isEmpty()) {
return LoyaltyCardImageType.NONE;
}
return imageTypes.get(currentIndex);
}
boolean isEmpty() {
return imageTypes.isEmpty();
}
int size() {
return imageTypes.size();
}
boolean remove(LoyaltyCardImageType type) {
int removedIndex = imageTypes.indexOf(type);
if (removedIndex == -1) {
return false;
}
imageTypes.remove(removedIndex);
currentIndex = clampIndex(currentIndex);
return true;
}
boolean canGoPrevious() {
return currentIndex > 0;
}
boolean canGoNext() {
return currentIndex < imageTypes.size() - 1;
}
boolean movePrevious() {
if (!canGoPrevious()) {
return false;
}
currentIndex--;
return true;
}
boolean moveNext(boolean overflow) {
if (isEmpty()) {
return false;
}
if (canGoNext()) {
currentIndex++;
return true;
}
if (overflow) {
currentIndex = 0;
return true;
}
return false;
}
int getCurrentIndex() {
return currentIndex;
}
LoyaltyCardImageType peekNext(boolean overflow) {
if (isEmpty()) {
return LoyaltyCardImageType.NONE;
}
if (canGoNext()) {
return imageTypes.get(currentIndex + 1);
}
return overflow ? imageTypes.get(0) : getCurrent();
}
private int clampIndex(int index) {
if (imageTypes.isEmpty()) {
return 0;
}
return Math.max(0, Math.min(index, imageTypes.size() - 1));
}
}
enum LoyaltyCardImageType {
NONE,
ICON,
BARCODE,
IMAGE_FRONT,
IMAGE_BACK
}
@@ -0,0 +1,183 @@
package protect.card_locker.cardview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.color.MaterialColors;
import java.nio.charset.Charset;
import protect.card_locker.*;
import protect.card_locker.async.TaskHandler;
final class LoyaltyCardMainImageRenderer {
private final Context context;
private final TaskHandler tasks = new TaskHandler();
private final BarcodeImageWriterResultCallback barcodeCallback;
LoyaltyCardMainImageRenderer(
Context context,
BarcodeImageWriterResultCallback barcodeCallback
) {
this.context = context;
this.barcodeCallback = barcodeCallback;
}
void renderCurrent(
LoyaltyCardImageType imageType,
Bitmap frontImageBitmap,
Bitmap backImageBitmap,
CatimaBarcode format,
Charset barcodeEncoding,
String cardIdString,
String barcodeIdString,
ImageView barcodeRenderTarget,
TextView mainImageDescription,
MaterialCardView mainCardView,
boolean isFullscreen,
boolean waitForResize
) {
if (imageType == LoyaltyCardImageType.NONE) {
// With no renderable media left, show the raw card ID instead of an empty card area.
barcodeRenderTarget.setVisibility(View.GONE);
mainCardView.setCardBackgroundColor(Color.TRANSPARENT);
mainImageDescription.setTextColor(
MaterialColors.getColor(
mainImageDescription,
com.google.android.material.R.attr.colorOnSurfaceVariant
)
);
mainImageDescription.setText(cardIdString);
return;
}
if (imageType == LoyaltyCardImageType.BARCODE) {
barcodeRenderTarget.setBackgroundColor(Color.WHITE);
mainCardView.setCardBackgroundColor(Color.WHITE);
mainImageDescription.setTextColor(context.getResources().getColor(R.color.md_theme_light_onSurfaceVariant));
if (waitForResize) {
redrawBarcodeAfterResize(
barcodeRenderTarget,
barcodeIdString,
cardIdString,
format,
barcodeEncoding,
!isFullscreen,
isFullscreen
);
} else {
drawBarcode(
barcodeRenderTarget,
barcodeIdString,
cardIdString,
format,
barcodeEncoding,
!isFullscreen,
isFullscreen
);
}
mainImageDescription.setText(cardIdString);
barcodeRenderTarget.setContentDescription(
context.getString(R.string.barcodeImageDescriptionWithType, format.prettyName())
);
} else if (imageType == LoyaltyCardImageType.IMAGE_FRONT) {
barcodeRenderTarget.setImageBitmap(frontImageBitmap);
barcodeRenderTarget.setBackgroundColor(Color.TRANSPARENT);
mainCardView.setCardBackgroundColor(Color.TRANSPARENT);
mainImageDescription.setTextColor(
MaterialColors.getColor(
mainImageDescription,
com.google.android.material.R.attr.colorOnSurfaceVariant
)
);
mainImageDescription.setText(context.getString(R.string.frontImageDescription));
barcodeRenderTarget.setContentDescription(context.getString(R.string.frontImageDescription));
} else if (imageType == LoyaltyCardImageType.IMAGE_BACK) {
barcodeRenderTarget.setImageBitmap(backImageBitmap);
barcodeRenderTarget.setBackgroundColor(Color.TRANSPARENT);
mainCardView.setCardBackgroundColor(Color.TRANSPARENT);
mainImageDescription.setTextColor(
MaterialColors.getColor(
mainImageDescription,
com.google.android.material.R.attr.colorOnSurfaceVariant
)
);
mainImageDescription.setText(context.getString(R.string.backImageDescription));
barcodeRenderTarget.setContentDescription(context.getString(R.string.backImageDescription));
} else {
throw new IllegalArgumentException("Unknown image type: " + imageType);
}
barcodeRenderTarget.setVisibility(View.VISIBLE);
}
private void redrawBarcodeAfterResize(
ImageView barcodeRenderTarget,
String barcodeIdString,
String cardIdString,
CatimaBarcode format,
Charset barcodeEncoding,
boolean addPadding,
boolean isFullscreen
) {
if (format == null) {
return;
}
// Barcode dimensions depend on the final ImageView size, so wait for layout before rendering.
barcodeRenderTarget.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
barcodeRenderTarget.getViewTreeObserver().removeOnGlobalLayoutListener(this);
drawBarcode(
barcodeRenderTarget,
barcodeIdString,
cardIdString,
format,
barcodeEncoding,
addPadding,
isFullscreen
);
}
});
}
private void drawBarcode(
ImageView barcodeRenderTarget,
String barcodeIdString,
String cardIdString,
CatimaBarcode format,
Charset barcodeEncoding,
boolean addPadding,
boolean isFullscreen
) {
// Barcodes are regenerated eagerly because zoom/fullscreen changes affect the output bitmap.
tasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false);
if (format == null) {
return;
}
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(
context.getApplicationContext(),
barcodeRenderTarget,
barcodeIdString != null ? barcodeIdString : cardIdString,
format,
barcodeEncoding,
null,
false,
barcodeCallback,
addPadding,
isFullscreen
);
tasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
}
@@ -0,0 +1,246 @@
package protect.card_locker.cardview;
import android.content.Context;
import android.graphics.Color;
import android.text.InputType;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.DigitsKeyListener;
import android.text.style.ForegroundColorSpan;
import android.text.util.Linkify;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.function.Predicate;
import protect.card_locker.*;
final class LoyaltyCardViewDialogs {
interface BalanceUpdateListener {
void onBalanceUpdated(BigDecimal newBalance);
}
void showInfoDialog(Context context, LoyaltyCard loyaltyCard, List<Group> loyaltyCardGroups) {
AlertDialog.Builder infoDialog = new MaterialAlertDialogBuilder(context);
int dialogContentPadding = context.getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
infoDialog.setTitle(loyaltyCard.store);
TextView infoTextview = new TextView(context);
infoTextview.setPadding(
dialogContentPadding,
dialogContentPadding / 2,
dialogContentPadding,
0
);
infoTextview.setAutoLinkMask(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS | Linkify.WEB_URLS);
infoTextview.setTextIsSelectable(true);
SpannableStringBuilder infoText = new SpannableStringBuilder();
if (!loyaltyCard.note.isEmpty()) {
infoText.append(loyaltyCard.note);
}
if (!loyaltyCardGroups.isEmpty()) {
List<String> groupNames = new ArrayList<>();
for (Group group : loyaltyCardGroups) {
groupNames.add(group._id);
}
padSpannableString(infoText);
infoText.append(context.getString(R.string.groupsList, TextUtils.join(", ", groupNames)));
}
if (hasBalance(loyaltyCard)) {
padSpannableString(infoText);
infoText.append(context.getString(
R.string.balanceSentence,
Utils.formatBalance(context, loyaltyCard.balance, loyaltyCard.balanceType)
));
}
appendDateInfo(
context,
infoText,
loyaltyCard.validFrom,
Utils::isNotYetValid,
R.string.validFromSentence,
R.string.validFromSentence
);
appendDateInfo(
context,
infoText,
loyaltyCard.expiry,
Utils::hasExpired,
R.string.expiryStateSentenceExpired,
R.string.expiryStateSentence
);
infoTextview.setText(infoText);
infoDialog.setView(infoTextview);
infoDialog.setPositiveButton(R.string.ok, (dialogInterface, i) -> dialogInterface.dismiss());
infoDialog.create().show();
}
void showBalanceUpdateDialog(
Context context,
LoyaltyCard loyaltyCard,
BalanceUpdateListener balanceUpdateListener
) {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(context);
builder.setTitle(R.string.updateBalanceTitle);
FrameLayout container = new FrameLayout(context);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
int contentPadding = context.getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
params.leftMargin = contentPadding;
params.topMargin = contentPadding / 2;
params.rightMargin = contentPadding;
LinearLayout layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);
TextView currentTextview = new TextView(context);
currentTextview.setText(context.getString(
R.string.currentBalanceSentence,
Utils.formatBalance(context, loyaltyCard.balance, loyaltyCard.balanceType)
));
layout.addView(currentTextview);
final TextInputEditText input = new TextInputEditText(context);
input.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
input.setKeyListener(DigitsKeyListener.getInstance("0123456789,."));
input.setHint(R.string.updateBalanceHint);
layout.addView(input);
layout.setLayoutParams(params);
container.addView(layout);
builder.setView(container);
builder.setPositiveButton(R.string.spend, (dialogInterface, i) -> {
try {
BigDecimal balanceChange = Utils.parseBalance(input.getText().toString(), loyaltyCard.balanceType);
BigDecimal newBalance = loyaltyCard.balance.subtract(balanceChange).max(new BigDecimal(0));
balanceUpdateListener.onBalanceUpdated(newBalance);
Toast.makeText(
context,
context.getString(
R.string.newBalanceSentence,
Utils.formatBalance(context, newBalance, loyaltyCard.balanceType)
),
Toast.LENGTH_LONG
).show();
} catch (ParseException e) {
Toast.makeText(context, R.string.amountParsingFailed, Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton(R.string.receive, (dialogInterface, i) -> {
try {
BigDecimal balanceChange = Utils.parseBalance(input.getText().toString(), loyaltyCard.balanceType);
BigDecimal newBalance = loyaltyCard.balance.add(balanceChange);
balanceUpdateListener.onBalanceUpdated(newBalance);
Toast.makeText(
context,
context.getString(
R.string.newBalanceSentence,
Utils.formatBalance(context, newBalance, loyaltyCard.balanceType)
),
Toast.LENGTH_LONG
).show();
} catch (ParseException e) {
Toast.makeText(context, R.string.amountParsingFailed, Toast.LENGTH_LONG).show();
}
});
builder.setNeutralButton(context.getString(R.string.cancel), (dialog, which) -> dialog.cancel());
AlertDialog dialog = builder.create();
// Button state depends on the parsed input, so listeners must be bound after the dialog exists.
input.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
BigDecimal balanceChange;
try {
balanceChange = Utils.parseBalance(s.toString(), loyaltyCard.balanceType);
} catch (ParseException e) {
input.setError(context.getString(R.string.amountParsingFailed));
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
return;
}
input.setError(null);
boolean hasNonZeroValue = !balanceChange.equals(new BigDecimal(0));
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(hasNonZeroValue);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(hasNonZeroValue);
}
});
dialog.show();
// Touching dialog buttons before show() can crash because they are not created yet.
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
if (dialog.getWindow() != null) {
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
// Focus immediately so the keyboard opens on the amount field.
input.requestFocus();
}
private boolean hasBalance(LoyaltyCard loyaltyCard) {
return !loyaltyCard.balance.equals(new BigDecimal(0));
}
private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) {
if (spannableStringBuilder.length() > 0) {
spannableStringBuilder.append("\n\n");
}
return spannableStringBuilder;
}
private void appendDateInfo(
Context context,
SpannableStringBuilder infoText,
Date date,
Predicate<Date> dateCheck,
@StringRes int dateCheckTrueString,
@StringRes int dateCheckFalseString
) {
if (date == null) {
return;
}
String formattedDate = DateFormat.getDateInstance(DateFormat.LONG).format(date);
padSpannableString(infoText);
if (dateCheck.test(date)) {
int start = infoText.length();
infoText.append(context.getString(dateCheckTrueString, formattedDate));
infoText.setSpan(new ForegroundColorSpan(Color.RED), start, infoText.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
} else {
infoText.append(context.getString(dateCheckFalseString, formattedDate));
}
}
}
@@ -82,6 +82,10 @@ public class Settings {
return getBoolean(R.string.settings_key_disable_lockscreen_while_viewing_card, true);
}
public boolean getDisableNfcWhileViewingCard() {
return getBoolean(R.string.settings_key_disable_nfc_while_viewing_card, true);
}
public boolean getAllowContentProviderRead() {
return getBoolean(R.string.settings_key_allow_content_provider_read, true);
}
@@ -109,7 +109,8 @@
android:id="@+id/storeNameEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true" />
android:singleLine="true"
android:inputType="textCapWords" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
+32 -30
View File
@@ -14,90 +14,92 @@ Katharine Chui / Katie
mondstern
IllusiveMan196
Silvério Santos
Максим Горпиніч
Edgars Andersons
Altonss
Liner Seven
Joel A
Michael Moroni
Altonss
Fjuro
Joel A
GitSpoon
Michael Moroni
Priit Jõerüüt
Eric
Максим Горпиніч
GM
laralem
Petr Novák
Горпиніч Максим Олександрович
Taco
Milo Ivir
nadiafekihahmed
pfaffenrodt
Aayush Gupta
Scrambled777
josé m
Vasilis
ikanakova
Nyatsuki
Kachelkaiser
josé m
Scrambled777
Aayush Gupta
Giovanni Donisi
Nyatsuki
ikanakova
Kachelkaiser
Jiri Grönroos
Milo Ivir
HudobniVolk
Warder
Samantaz Fox
109247019824
Traductor
Samantaz Fox
Balázs Meskó
mdvhimself
AMIR-G98
Feike
Arno-github
Cliff Heraldo
Sergio Paredes
Ankit Tiwari
Feike
Arno-github
Jose Delvani
Milan Šalka
mdvhimself
Robin
Milan Šalka
damjang
தமிழ்நேரம்
huuhaa
Skrripy
Gideon
Govindgopalyadav
Skrripy
huuhaa
தமிழ்நேரம்
waffshappen
Marnick L'Eau
JungHee Lee
pacavarn
ngocanhtve
aradxxx
StellarSand
Quentin PAGÈS
Projjal Moitra
Gideon
Traductor
Aliaksandr Trush
e-michalak
JungHee Lee
pacavarn
hajertabbane
inavleb
Ziad OUALHADJ
Robin Liu
Ricky Tigg
Renko
Denis Shilin
Renko
Ricky Tigg
Robin Liu
Ziad OUALHADJ
しいたけ
Alexander Ivanov
Miha Frangež
stavpup
mrestivill
ezn24
ehrt74
Virginie
Tim Trek
Peter Dave Hello
Alì Mortacci
Andre Costa
arshbeerSingh
Augustin LAVILLE
Freddo espresso
Vasudev R.
Govind S Nair
Kim Seohyun
echo r"0xX4H" | rev
rudy3
Michael Gangolf
PRATHAMESH BHAGAT
Peter Dave Hello
Thomas Bertels
Patrik
+2
View File
@@ -325,4 +325,6 @@
<string name="back">رجوع</string>
<string name="pref_enable_acra">إخطار بإرسال تقارير الأخطاء</string>
<string name="pref_enable_acra_summary">عند التفعيل, سيتم سؤالك للابلاغ بالاعطال عندما تحدث. لا ولن يتم الابلاغ بالاعطال تلفائيا.</string>
<string name="settings_disable_nfc_while_viewing_card">وقف NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">وقف NFC لمنع NFC من العمل أثناء عرض بطاقة</string>
</resources>
+4
View File
@@ -301,4 +301,8 @@
<string name="nothing_to_copy">Няма стойност</string>
<string name="back">Назад</string>
<string name="barcodeEncoding">Кодиране на щрихкода</string>
<string name="settings_disable_nfc_while_viewing_card">Пауза на NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Спира NFC, за да бъдат предотвратени безконтактни плащания при преглед на карта</string>
<string name="nfc_blocked_while_viewing_card">NFC е на пауза</string>
<string name="change_settings">Настройки</string>
</resources>
+1
View File
@@ -306,4 +306,5 @@
<string name="pref_enable_acra_summary">Kada je omogućeno, bit ćete upitani da prijavite pad sistema kada se dogodi. Izvještaji o padu sistema se nikada ne šalju automatski.</string>
<string name="copy_value">Kopiraj vrijednost</string>
<string name="copied_to_clipboard">Kopirano u međuspremnik</string>
<string name="importCatimaMessage">Odaberite izvoz iz Catima za uvoz. \nKreirajte ga iz menija Uvoz/izvoz druge Catima aplikacije pritiskom na Izvoz.</string>
</resources>
+4
View File
@@ -307,4 +307,8 @@
<string name="nothing_to_copy">Nenalezena žádná hodnota</string>
<string name="barcodeEncoding">Kódování čárového kódu</string>
<string name="back">Zpět</string>
<string name="settings_disable_nfc_while_viewing_card">Pozastavit NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pozastaví NFC pro zabránění spuštění NFC plateb při zobrazování karty</string>
<string name="nfc_blocked_while_viewing_card">NFC je pozastaveno</string>
<string name="change_settings">Změnit nastavení</string>
</resources>
+4
View File
@@ -301,4 +301,8 @@
<string name="nothing_to_copy">Keinen Betrag gefunden</string>
<string name="barcodeEncoding">Barcode-Kodierung</string>
<string name="back">Zurück</string>
<string name="change_settings">Einstellungen ändern</string>
<string name="nfc_blocked_while_viewing_card">NFC ist vorübergehend deaktiviert</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Deaktiviert vorübergehend NFC, sodass keine NFC-Zahlungen ausgelöst werden können, während eine Karte angezeigt wird</string>
<string name="settings_disable_nfc_while_viewing_card">NFC vorübergehend deaktivieren</string>
</resources>
@@ -301,4 +301,8 @@
<string name="nothing_to_copy">Δεν βρέθηκε τιμή</string>
<string name="barcodeEncoding">Κωδικοποίηση γραμμωτού κώδικα</string>
<string name="back">Πίσω</string>
<string name="settings_disable_nfc_while_viewing_card">Παύση NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Παύση του NFC για την αποτροπή ενεργοποίησης πληρωμών NFC κατά την προβολή μιας κάρτας</string>
<string name="nfc_blocked_while_viewing_card">Το NFC είναι σε παύση</string>
<string name="change_settings">Αλλαγή ρυθμίσεων</string>
</resources>
@@ -252,4 +252,15 @@
<string name="settings_column_count_3">3</string>
<string name="settings_column_count_4">4</string>
<string name="settings_column_count_5">5</string>
<string name="currentBalanceSentence">Balance actual: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Nuevo balance: <xliff:g>%s</xliff:g></string>
<string name="validFromSentence">Válido desde <xliff:g>%s</xliff:g></string>
<string name="settings_column_count_6">6</string>
<string name="settings_column_count_7">7</string>
<string name="settings_category_title_general">General</string>
<string name="settings_category_title_privacy">Privacidad</string>
<string name="action_display_options">Mostrar Opciones</string>
<string name="show_archived_cards">Mostrar tarjetas archivadas</string>
<string name="view_online">Ver Online</string>
<string name="action_more_options">Más Opciones</string>
</resources>
+4
View File
@@ -307,4 +307,8 @@
<string name="nothing_to_copy">Ningún valor encontrado</string>
<string name="barcodeEncoding">Codificación de barra de código</string>
<string name="back">Atrás</string>
<string name="settings_disable_nfc_while_viewing_card">Pausar NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para prevenir abonaciones NFC desde disparador mientras vea una tarjeta</string>
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
<string name="change_settings">Cambiar ajustes</string>
</resources>
+4
View File
@@ -301,4 +301,8 @@
<string name="nothing_to_copy">Ühtegi väärtust ei leidu</string>
<string name="barcodeEncoding">Triipkoodi kodeerimine</string>
<string name="back">Tagasi</string>
<string name="settings_disable_nfc_while_viewing_card">Peata lähiväljaside (NFC)</string>
<string name="nfc_blocked_while_viewing_card">Lähiväljaside (NFC) on peatatud</string>
<string name="change_settings">Muuda seadistusi</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Vältimaks, et lähiväljaside (NFC) abil toimiv makseliides käivitub, lülitatakse kaardi vaatamisel lähiväljaside (NFC) välja</string>
</resources>
+2
View File
@@ -300,4 +300,6 @@
<string name="nothing_to_copy">Arvoa ei löytynyt</string>
<string name="barcodeEncoding">Viivakoodin koodaus</string>
<string name="back">Takaisin</string>
<string name="acra_explain_crash">Jos mahdollista lisää tietoja toiminnastasi täällä:</string>
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> pysähtymisraportti</string>
</resources>
+4
View File
@@ -307,4 +307,8 @@
<string name="nothing_to_copy">Aucune valeur trouvée</string>
<string name="barcodeEncoding">Encodage du code-barres</string>
<string name="back">Retour</string>
<string name="settings_disable_nfc_while_viewing_card">Mettre en pause le NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Mettre en pause le NFC pour éviter le déclenchement de paiements NFC lors de la consultation d\'une carte</string>
<string name="nfc_blocked_while_viewing_card">Le NFC est en pause</string>
<string name="change_settings">Modifier les paramètres</string>
</resources>
+4
View File
@@ -300,4 +300,8 @@
<string name="nothing_to_copy">Non hai ningún valor</string>
<string name="barcodeEncoding">Códificación do código de barras</string>
<string name="back">Volver</string>
<string name="settings_disable_nfc_while_viewing_card">NFC en pausa</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Detén o NFC para evitar a activación de pago con NFC cando se mira unha tarxeta</string>
<string name="nfc_blocked_while_viewing_card">NFC está en pausa</string>
<string name="change_settings">Cambiar axustes</string>
</resources>
+18 -3
View File
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_add">הוספה</string>
<string name="cardId">מזהה כרטיס</string>
<string name="cancel">ביטול</string>
<string name="save">שמור</string>
<string name="ok">אישור</string>
<string name="action_search">חיפוש</string>
<string name="noGiftCards">לחץ על לחצן ה + להוספת כרטיס, או ייבא מספר כרטיסים באמצעות התפריט ⋮.</string>
<string name="noGiftCards">לחץ על כפתור הפלוס (+) כדי להוסיף כרטיס, או ייבא כרטיס מהתפריט ⋮.</string>
<string name="share">שיתוף</string>
<string name="addCardTitle">הוספת כרטיס</string>
<string name="star">הוספה למועדפים</string>
@@ -16,7 +16,7 @@
<string name="noBarcode">אין ברקוד</string>
<string name="edit">עריכה</string>
<string name="exportFailed">לא ניתן לייצא</string>
<string name="noGiftCardsGroup">צור מספר כרטיסים, ואז שייך אותם לקבוצה פה.</string>
<string name="noGiftCardsGroup">צור מספר כרטיסים, ולאחר מכן שייך אותם לקבוצה.</string>
<string name="failedParsingImportUriError">נתיב לא נמצא</string>
<string name="noMatchingGiftCards">אין תוצאות. נסה חיפוש אחר.</string>
<string name="storeName">שם חנות</string>
@@ -51,4 +51,19 @@
<string name="multipleBarcodesFoundPleaseChooseOne">באיזה מהברקודים שנמצאו אתה רוצה להשתמש?</string>
<string name="useFrontImage">השתמש בתמונה קדמית</string>
<string name="useBackImage">השתמש בתמונה אחורית</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> נבחר</item>
<item quantity="two"><xliff:g>%d</xliff:g> נבחרו</item>
<item quantity="other"><xliff:g>%d</xliff:g> נבחרו</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="one">הסר <xliff:g>%d</xliff:g> כרטיסייה</item>
<item quantity="two">הסר <xliff:g>%d</xliff:g> כרטיסיות</item>
<item quantity="other">הסר <xliff:g>%d</xliff:g> כרטיסיות</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="one">להסיר את <xliff:g>%d</xliff:g> הכרטיסייה לצמיתות?</item>
<item quantity="two">להסיר את <xliff:g>%d</xliff:g> הכרטיסיות לצמיתות?</item>
<item quantity="other">להסיר את <xliff:g>%d</xliff:g> הכרטיסיות לצמיתות?</item>
</plurals>
</resources>
+2
View File
@@ -298,4 +298,6 @@
<string name="copy_value">मान कॉपी करें</string>
<string name="copied_to_clipboard">क्लिपबोर्ड पर कॉपी किया गया</string>
<string name="nothing_to_copy">कोई मूल्य नहीं मिला</string>
<string name="barcodeEncoding">बारकोड एन्कोडिंग</string>
<string name="back">वापस</string>
</resources>
+6
View File
@@ -305,4 +305,10 @@
<string name="copied_to_clipboard">Kopirano u međuspremnik</string>
<string name="back">Natrag</string>
<string name="copy_value">Kopiraj vrijednost</string>
<string name="nothing_to_copy">Nije pronađena vrijednost</string>
<string name="barcodeEncoding">Kodiranje barkoda</string>
<string name="change_settings">Promijeni postavke</string>
<string name="settings_disable_nfc_while_viewing_card">Pauziraj NFC</string>
<string name="nfc_blocked_while_viewing_card">NFC je pauziran</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pauzira NFC kako bi se spriječilo aktiviranje NFC plaćanja tijekom prikazivanja kartice</string>
</resources>
+41 -26
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="noGiftCards">Kattintson a + plusz gombra egy kártya hozzáadásához, vagy importáljon a ⋮ menüből.</string>
<string name="noGiftCards">Koppintson a + plusz gombra egy kártya hozzáadásához, vagy importáljon a ⋮ menüből</string>
<string name="action_add">Hozzáadás</string>
<string name="action_search">Keresés</string>
<plurals name="selectedCardCount">
@@ -8,7 +8,7 @@
<item quantity="other"><xliff:g>%d</xliff:g> kiválasztva</item>
</plurals>
<string name="noCardsMessage">Először adjon hozzá egy kártyát</string>
<string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string>
<string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz</string>
<string name="noMatchingGiftCards">Nincs találat. Próbálja módosítani a keresést.</string>
<string name="storeName">Név</string>
<string name="note">Feljegyzés</string>
@@ -32,12 +32,12 @@
<string name="sendLabel">Küldés…</string>
<string name="editCardTitle">Kártya szerkesztése</string>
<string name="addCardTitle">Kártya hozzáadása</string>
<string name="scanCardBarcode">Vonalkód leolvasása</string>
<string name="scanCardBarcode">Vonalkód beolvasása</string>
<string name="cardShortcut">Kártya parancsikon</string>
<string name="failedParsingImportUriError">Az importálási URI nem értelmezhető</string>
<string name="importExport">Importálás/exportálás</string>
<string name="importExport">Importálás/Exportálás</string>
<string name="exportName">Exportálás</string>
<string name="importExportHelp">Az adatok mentése lehetővé teszi, hogy egy másik eszközre helyezze át.</string>
<string name="importExportHelp">Az adatok mentése lehetővé teszi, hogy egy másik eszközre helyezze át</string>
<string name="importSuccessfulTitle">Importálva</string>
<string name="importFailedTitle">Az importálás sikertelen</string>
<string name="importFailed">Nem sikerült az importálás végrehajtása</string>
@@ -49,14 +49,14 @@
</plurals>
<string name="deleteTitle">Kártya törlése</string>
<string name="barcodeImageDescriptionWithType">A(z) <xliff:g>%s</xliff:g> vonalkód képe</string>
<string name="noCardExistsError">A kártya nem található</string>
<string name="noCardExistsError">Kártya nem található</string>
<string name="importVoucherVault">Importálás a Voucher Vaultból</string>
<string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a kiválasztott vonalkódtípushoz</string>
<string name="setBackImage">Hátlapi kép beállítása</string>
<string name="no">Nem</string>
<string name="passwordRequired">Adja meg a jelszót</string>
<string name="exportPasswordHint">Kód beírása</string>
<string name="failedGeneratingShareURL">Nem lehetett megosztható webcímet előállítani. Kérjük, ezt jelentse.</string>
<string name="failedGeneratingShareURL">Nem lehetett megosztható webcímet előállítani</string>
<string name="sort">Rendezés</string>
<string name="on_google_play">a Google Playen</string>
<string name="and_data_usage">és adathasználat</string>
@@ -68,7 +68,7 @@
<string name="exportFailed">Nem sikerült az exportálás végrehajtása</string>
<string name="importing">Importálás…</string>
<string name="exporting">Exportálás…</string>
<string name="exportOptionExplanation">Az adatok a kiválasztott helyre lesznek mentve.</string>
<string name="exportOptionExplanation">Az adatok a kiválasztott helyre kerülnek mentésre</string>
<string name="importOptionFilesystemTitle">Importálás fájlrendszerből</string>
<string name="importOptionFilesystemButton">A fájlrendszerből</string>
<string name="app_license">Copyleft licencű szabad szoftver, GPLv3+ alatt közzétéve</string>
@@ -91,7 +91,7 @@
<string name="groups">Csoportok</string>
<string name="group_edit">Csoport szerkesztése</string>
<string name="group_name_is_empty">A csoportnév nem lehet üres</string>
<string name="failedOpeningFileManager">Előbb telepítsen egy fájlkezelőt.</string>
<string name="failedOpeningFileManager">Fájl böngésző nem elérhető</string>
<string name="moveUp">Mozgatás felfelé</string>
<string name="moveDown">Mozgatás lefelé</string>
<string name="leaveWithoutSaveTitle">Kilépés</string>
@@ -108,7 +108,7 @@
<string name="chooseExpiryDate">Lejárati dátum kiválasztása</string>
<string name="moveBarcodeToTopOfScreen">Vonalkód feltolása a képernyő tetejére</string>
<string name="noBarcodeFound">Nem található vonalkód</string>
<string name="errorReadingImage">Nem lehet olvasni a képet</string>
<string name="errorReadingImage">Kép nem olvasható</string>
<string name="balance">Egyenleg</string>
<string name="currency">Pénznem</string>
<string name="points">Pontok</string>
@@ -118,10 +118,8 @@
<string name="importCatima">Importálás a Catimából</string>
<string name="importFidme">Importálás a FidMeből</string>
<string name="importLoyaltyCardKeychain">Importálás a Loyalty Card Keychainből</string>
<string name="importLoyaltyCardKeychainMessage">Válassza ki a Loyalty Card Keychainből importálandó <i>LoyaltyCardKeychain.csv</i> export fájlt.
\nEzt hozza létre a Loyalty Card Keychainben az Importálás/exportálás menüben, az Exportálás megnyomásával.</string>
<string name="importVoucherVaultMessage">Válassza ki az importálandó <i>vouchervault.json</i> Voucher Vault export fájlt.
\nEzt hozza létre a Voucher Vaultban az Exportálás megnyomásával.</string>
<string name="importLoyaltyCardKeychainMessage">Jelölje ki az importálandó Loyalty Card Keychain exportot. \nLétre tudja hozni a Loyalty Card Keychain Importálás/Exportálás menün belül az Exportálásra koppintva.</string>
<string name="importVoucherVaultMessage">Jelölje ki az importálandó Voucher Vault exportot. \nLétre tudja hozni a Voucher Vault-on belüli Exportálás menüben.</string>
<string name="barcodeId">Vonalkód értéke</string>
<string name="sameAsCardId">Ugyanaz, mint az azonosító</string>
<string name="setBarcodeId">Vonalkód értékének beállítása</string>
@@ -167,30 +165,28 @@
</plurals>
<string name="chooseImportType">Adatok importálása innen</string>
<string name="thumbnailDescription">Előkép</string>
<string name="importOptionFilesystemExplanation">Válassza ki a kívánt fájlt a fájlrendszerből.</string>
<string name="importOptionFilesystemExplanation">Válassza ki a kívánt fájlt a fájlrendszerből</string>
<string name="about">Névjegy</string>
<string name="app_copyright_old">Készült a Loyalty Card Keychain alapján
\nCopyright © 20162020 Branden Archer</string>
<string name="app_libraries">Szabad külső programkönyvtárak: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="settings_dark_theme">Sötét</string>
<string name="deleteConfirmationGroup">Csoport törlése\?</string>
<string name="noGroups">Nyomja meg a + gombot a csoportok kategorizálásához.</string>
<string name="noGroups">Koppintson a + gombra a csoportok kategorizálásához</string>
<string name="group_name_already_in_use">A csoportnév már létezik</string>
<string name="all">Összes</string>
<string name="noGroupCards">Ez a csoport üres</string>
<string name="group_updated">Csoport frissítve</string>
<string name="expiryStateSentenceExpired">Lejárt: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Csoportok: <xliff:g>%s</xliff:g></string>
<string name="importCatimaMessage">Válassza ki az exportált <i>catima.zip</i> fájlt az importáláshoz.
\nLétrehozhatja az Importálás/exportálás menüből az Exportálást megnyomva egy másik Catima alkalmazásban.</string>
<string name="importFidmeMessage">Válassza ki a FidMeből exportált <i>fidme-export-request-xxxxxx.zip</i> fájl majd importálja be, és utána válassza a kézi vonalkódbeírást.
\nEzt hozza létre a FidMe-profiljában az Adatvédelem rész választásával, majd a Saját adatok kinyerése megnyomásával.</string>
<string name="importCatimaMessage">Válassza ki a megfelelő exportált Catima elemet importálásra. \nA menüben található Importálás/Exportálásból importálhat egy korábbi Catima exportot.</string>
<string name="importFidmeMessage">Jelölje ki az importálandó FidMe exportot, ezt követően adja meg kézileg a vonalkód típust. \nLétre tudja hozni a FidMe profiljából az Adatvédelmen belül a Adatom kinyerése opcióval.</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
</plurals>
<string name="failedToOpenUrl">Először telepítsen egy webböngészőt</string>
<string name="failedLaunchingPhotoPicker">Nem található támogatott galéria alkalmazás</string>
<string name="failedLaunchingPhotoPicker">Nem található támogatott képválasztó</string>
<string name="previousCard">Előző</string>
<string name="nextCard">Következő</string>
<string name="settings_oled_dark">Teljesen fekete háttér a sötét témánál</string>
@@ -228,7 +224,7 @@
<string name="icon_header_click_text">Hosszan nyomja meg a miniatűr szerkesztéséhez</string>
<string name="show_note">Megjegyzés megjelenítése</string>
<string name="show_balance">Egyenleg megjelenítése</string>
<string name="permissionReadCardsLabel">Catima kártyák olvasása</string>
<string name="permissionReadCardsLabel">Catima kártyák beolvasása</string>
<string name="permissionReadCardsDescription">olvassa el a Catima-kártyáit, és annak minden részletét, beleértve a jegyzeteket és a képeket is</string>
<string name="show_validity">Érvényesség megjelenítése</string>
<string name="show_name_below_image_thumbnail">Név megjelenítése a kép miniatűrje alatt</string>
@@ -257,7 +253,7 @@
<string name="app_name">Catima</string>
<string name="amountParsingFailed">Hibás érték</string>
<string name="add_manually_warning_title">Szkennelés ajánlott</string>
<string name="add_manually_warning_message">Egyes boltoknál a kártyán levő számsor különbözik a vonalkódtól. Emiatt a manuális szám beírás nem minden esetben fog működni. Erősen ajánlott inkább a vonalkód szkennelése kamerával. Biztosan folytatja?</string>
<string name="add_manually_warning_message">Egyes kártyákon levő számsor különbözik a vonalkód számától. Emiatt a manuális szám beírás nem minden esetben működni. Ajánlott tehát a vonalkód beolvasása kamerával. Biztosan folytatja?</string>
<string name="continue_">Tovább</string>
<string name="spend">Költött</string>
<string name="receive">Megkapott</string>
@@ -282,12 +278,31 @@
<string name="settings_column_count_6">6</string>
<string name="settings_column_count_3">3</string>
<string name="settings_column_count_1">1</string>
<string name="addFromPkpass">Válassz egy Passbook fájlt (.pkpass)</string>
<string name="addFromPkpass">Válasszon egy Passbook fájlt (.pkpass / .pkpasses)</string>
<string name="unsupportedFile">Ez a fájl nem támogatott</string>
<string name="generic_error_please_retry">Sajnálom, valami rosszul ment, próbálkozz újra...</string>
<string name="generic_error_please_retry">Hiba lépett fel</string>
<string name="settings_column_count_4">4</string>
<string name="settings_column_count_7">7</string>
<string name="sort_by_valid_from">Érvényesség kezdete</string>
<string name="width">Szélesség</string>
<string name="setBarcodeWidth">Vonalkód szélességének beállítása</string>
<string name="setBarcodeWidth">Vonalkód szélesség beállítása</string>
<string name="settings_disable_nfc_while_viewing_card">NFC leállítása</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Az NFC leállítása a kártya megtekintés erejéig, hogy ne indítsa be az NFC fizetést</string>
<string name="card_list_widget_name">Kártya lista</string>
<string name="card_list_widget_empty">Miután hozzáadja a kártyákat a Catima-hoz, itt fognak megjelenni. Ha vannak kártyái, győződjön meg, hogy nincsenek e archiválva.</string>
<string name="cardWithNumber"><xliff:g>%d</xliff:g> kártya</string>
<string name="cardWithNumberAndLocale"><xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>) kártya</string>
<string name="pleaseDoNotRotateTheDevice">Kérem ne forgassa el az eszközt, mert az megszakítja a műveletet</string>
<string name="acra_catima_has_crashed">Sajnos a <xliff:g id="app_name">%s</xliff:g> összeomlott. Segítsen ezt a hibát megoldani, azzal, hogy elküldi a jelentést számunkra.</string>
<string name="acra_explain_crash">Ha lehetséges adja meg, hogy éppen milyen műveletet végzett:</string>
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> összeomlási jelentés</string>
<string name="pref_enable_acra">Kérje az összeomlási jelentéseket</string>
<string name="pref_enable_acra_summary">Bekapcsolása esetén mindig kéri az összeomlási jelentés küldését. A jelentések sosem kerülnek küldésre automatikusan.</string>
<string name="copy_value">Érték másolása</string>
<string name="copied_to_clipboard">Vágólapra másolva</string>
<string name="nothing_to_copy">Nem található érték</string>
<string name="barcodeEncoding">Vonalkód kódolás</string>
<string name="back">Vissza</string>
<string name="nfc_blocked_while_viewing_card">NFC leállítva</string>
<string name="change_settings">Beállítások változtatása</string>
</resources>
+5 -1
View File
@@ -3,7 +3,7 @@
<string name="action_search">Cerca</string>
<string name="action_add">Aggiungi</string>
<string name="noGiftCards">Premi il pulsante + per aggiungere una carta oppure importala dal menù ⋮</string>
<string name="noMatchingGiftCards">Nessun risultato. Prova a cambiare la tua ricerca.</string>
<string name="noMatchingGiftCards">Nessun risultato. Prova a modificare la ricerca.</string>
<string name="storeName">Nome</string>
<string name="note">Note</string>
<string name="cardId">Codice</string>
@@ -307,4 +307,8 @@
<string name="nothing_to_copy">Nessun valore trovato</string>
<string name="barcodeEncoding">Codifica codici a barre</string>
<string name="back">Indietro</string>
<string name="settings_disable_nfc_while_viewing_card">Pausa NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Sospende la funzione NFC per impedire che i pagamenti NFC vengano attivati durante la visualizzazione di una carta</string>
<string name="nfc_blocked_while_viewing_card">La funzione NFC è disattivata</string>
<string name="change_settings">Modifica impostazioni</string>
</resources>
+5
View File
@@ -8,4 +8,9 @@
</plurals>
<string name="action_add">הוסף</string>
<string name="noGiftCards">לחץ על כפתור הפלוס (+) כדי להוסיף כרטיס, או ייבא מתפריט ⋮.</string>
<string name="noMatchingGiftCards">אין תוצאות. נסה לשנות את החיפוש.</string>
<string name="storeName">שם החנות</string>
<string name="note">הערות</string>
<string name="barcodeType">סוג ברקוד</string>
<string name="noBarcode">אין ברקוד</string>
</resources>
+4
View File
@@ -294,4 +294,8 @@
<string name="nothing_to_copy">値が見つかりません</string>
<string name="barcodeEncoding">バーコードの符号化</string>
<string name="back">戻る</string>
<string name="settings_disable_nfc_while_viewing_card">NFCを一時停止</string>
<string name="settings_disable_nfc_while_viewing_card_summary">カードの表示中にNFC決済が誤って実行されないようにNFCを一時停止します</string>
<string name="nfc_blocked_while_viewing_card">NFCは停止中です</string>
<string name="change_settings">設定を変更する</string>
</resources>
+2 -1
View File
@@ -87,7 +87,7 @@
<string name="settings_locale">언어</string>
<string name="settings_system_locale">시스템</string>
<string name="selectColor">색상 선택</string>
<string name="app_contributors">기여자: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="app_contributors">제작 지원: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="showMoreInfo">정보 보기</string>
<string name="updateBalance">잔액 업데이트</string>
<string name="failedToRetrieveImageFile">이미지 파일을 검색하지 못했습니다</string>
@@ -280,4 +280,5 @@
<string name="sort_by_valid_from">유효 기간</string>
<string name="width">너비</string>
<string name="setBarcodeWidth">바코드 너비를 설정하세요</string>
<string name="card_list_widget_name">카드 목록</string>
</resources>
+4
View File
@@ -280,4 +280,8 @@
<string name="sort_by_valid_from">Teisinga forma</string>
<string name="settings_use_volume_keys_navigation">Keisti korteles su garso mygtukais</string>
<string name="settings_use_volume_keys_navigation_summary">Naudokite garso mygtukus kortelių pakeitimui</string>
<string name="settings_category_title_cards_overview">Kortelių apžvalga</string>
<string name="settings_column_count_portrait">Stulpeliai vertikaliame režime</string>
<string name="settings_column_count_landscape">Stulpeliai horizontaliame režime</string>
<string name="settings_automatic_column_count">Automatiškai</string>
</resources>
+4
View File
@@ -301,4 +301,8 @@
<string name="copy_value">Kopieer waarde</string>
<string name="back">Terug</string>
<string name="barcodeEncoding">Barcodecodering</string>
<string name="change_settings">Verander instellingen</string>
<string name="settings_disable_nfc_while_viewing_card">Pauzeer NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pauzeert NFC om te voorkomen dat NFC-betalingen activeren tijdens het bekijken van een kaart</string>
<string name="nfc_blocked_while_viewing_card">NFC is gepauzeerd</string>
</resources>
@@ -307,4 +307,8 @@
<string name="nothing_to_copy">Nenhum valor encontrado</string>
<string name="barcodeEncoding">codificação de código de barras</string>
<string name="back">Voltar</string>
<string name="settings_disable_nfc_while_viewing_card">Pausar NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Suspende a tecnologia NFC para impedir que pagamentos NFC sejam acionados enquanto o cartão estiver sendo visualizado</string>
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
<string name="change_settings">Alterar configurações</string>
</resources>
@@ -307,4 +307,8 @@
<string name="nothing_to_copy">Nenhum valor encontrado</string>
<string name="barcodeEncoding">Codificação de códigos de barras</string>
<string name="back">Voltar</string>
<string name="settings_disable_nfc_while_viewing_card">Pausar NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para evitar que pagamentos de NFC sejam acionados enquanto visualiza um cartão</string>
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
<string name="change_settings">Alterar configurações</string>
</resources>
+4
View File
@@ -306,4 +306,8 @@
<string name="nothing_to_copy">Nenhum valor encontrado</string>
<string name="barcodeEncoding">codificação de código de barras</string>
<string name="back">Voltar</string>
<string name="settings_disable_nfc_while_viewing_card">Pausar NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pausa NFC para evitar que pagamentos de NFC sejam acionados enquanto visualiza um cartão</string>
<string name="nfc_blocked_while_viewing_card">NFC está pausado</string>
<string name="change_settings">Alterar configurações</string>
</resources>
+4
View File
@@ -313,4 +313,8 @@
<string name="nothing_to_copy">Значение не найдено</string>
<string name="barcodeEncoding">Кодировка штрих-кода</string>
<string name="back">Назад</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Приостанавливать работу NFC для предотвращения срабатывание NFC-платежей при просмотре карты</string>
<string name="settings_disable_nfc_while_viewing_card">Отключать NFC</string>
<string name="nfc_blocked_while_viewing_card">NFC приостановлен</string>
<string name="change_settings">Изменить настройки</string>
</resources>
+4
View File
@@ -307,4 +307,8 @@
<string name="nothing_to_copy">Nenašla sa žiadna hodnota</string>
<string name="barcodeEncoding">Kódovanie čiarového kódu</string>
<string name="back">Späť</string>
<string name="settings_disable_nfc_while_viewing_card">Pozastaviť NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pozastaví NFC pre zabránenie spustenia NFC platieb pri zobrazovaní karty</string>
<string name="nfc_blocked_while_viewing_card">NFC je pozastavené</string>
<string name="change_settings">Zmenit nastavenie</string>
</resources>
+35 -26
View File
@@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Dodaj</string>
<string name="action_search">Pretraga</string>
<string name="noGiftCards">Klikni + plus znak da dodaš karticu, ili je uvezi pomoću ⋮ menija.</string>
<string name="noGiftCards">Klikni + plus znak da dodaš karticu, ili je uvezi pomoću ⋮ menija</string>
<string name="storeName">Ime</string>
<string name="cardId">Broj kartice</string>
<string name="star">Dodaj u omiljene</string>
@@ -27,10 +27,10 @@
<string name="cardShortcut">Prečica kartice</string>
<string name="noCardsMessage">Prvo dodaj karticu</string>
<string name="noCardExistsError">Nije moguće pronaći tu karticu</string>
<string name="failedParsingImportUriError">Nije moguće obraditi uvozni URI</string>
<string name="importExport">Uvoz/Izvoz</string>
<string name="failedParsingImportUriError">Nije moguće obraditi uvozni URL</string>
<string name="importExport">Uvoz/izvoz</string>
<string name="exportName">Izvoz</string>
<string name="importExportHelp">Pravljenje rezervnih kopija podataka omogućava premeštanje na drugi uređaj.</string>
<string name="importExportHelp">Pravljenje rezervnih kopija podataka omogućava premeštanje na drugi uređaj</string>
<string name="importSuccessfulTitle">Uvezeno</string>
<string name="importFailedTitle">Uvoz nije uspeo</string>
<string name="importFailed">Nije moguće izvršiti uvoz</string>
@@ -43,8 +43,8 @@
<string name="noBarcode">Nema bar-koda</string>
<string name="scanCardBarcode">Skeniraj bar-kod</string>
<string name="barcodeImageDescriptionWithType">Fotografija <xliff:g>%s</xliff:g> bar-koda</string>
<string name="exportOptionExplanation">Podaci će biti sačuvani na lokaciji po tvom izboru.</string>
<string name="importOptionFilesystemExplanation">Odaberi određenu datoteku iz sistema za upravljanje datotekama.</string>
<string name="exportOptionExplanation">Podaci će biti sačuvani na lokaciji po tvom izboru</string>
<string name="importOptionFilesystemExplanation">Odaberi određenu datoteku iz sistema za upravljanje datotekama</string>
<string name="importOptionFilesystemTitle">Uvezi iz sistema za upravljanje datotekama</string>
<string name="importOptionFilesystemButton">Iz sistema za upravljanje datotekama</string>
<string name="about">O aplikaciji</string>
@@ -68,7 +68,7 @@
<string name="importSuccessful">Podaci uvezeni</string>
<string name="exportSuccessful">Podaci izvezeni</string>
<string name="enter_group_name">Unesite ime grupe</string>
<string name="noGroups">Klikni + plus znak da dodaš grupe za kategorizaciju.</string>
<string name="noGroups">Klikni + plus znak da dodaš grupe za kategorizaciju</string>
<string name="noGroupCards">Ova grupa je prazna</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kartica</item>
@@ -99,11 +99,9 @@
<string name="importCatima">Uvezi iz Catime</string>
<string name="importFidme">Uvoz iz FidMe</string>
<string name="importLoyaltyCardKeychain">Uvezi iz aplikacije Loyalty Card Keychain</string>
<string name="importLoyaltyCardKeychainMessage">Odaberi svoj <i>LoyaltyCardKeychain.csv</i> izvoz iz aplikacije Loyalty Card Keychain za uvoz.
\nKreiraj ga iz menija \"Import/Export\" u aplikaciji Loyalty Card Keychain klikom na \"Export\".</string>
<string name="importLoyaltyCardKeychainMessage">Odaberi svoj izvoz iz aplikacije Loyalty Card Keychain za uvoz. \nKreiraj ga iz menija \"Import/Export\" u aplikaciji Loyalty Card Keychain klikom na \"Export\".</string>
<string name="importVoucherVault">Uvoz iz Voucher Vault</string>
<string name="importVoucherVaultMessage">Odaberi svoj <i>vouchervault.json</i> izvoz iz Voucher Vault za uvoz.
\nKreiraj ga pritiskom na \"Export\" u Voucher Vault aplikaciji.</string>
<string name="importVoucherVaultMessage">Odaberi svoj izvoz iz Voucher Vault za uvoz. \nKreiraj ga pritiskom na \"Export\" u Voucher Vault aplikaciji.</string>
<string name="barcodeId">Vrednost bar-koda</string>
<string name="sameAsCardId">Isti kao broj kartice</string>
<string name="setBarcodeId">Podesi vrednost bar-koda</string>
@@ -119,7 +117,7 @@
<string name="yes">Da</string>
<string name="exportPassword">Podesi lozinku da bi zaštitio svoj izvoz (opciono)</string>
<string name="exportPasswordHint">Unesi lozinku</string>
<string name="failedGeneratingShareURL">Nije moguće generisati URL koji se može podeliti. Molim te da prijaviš ovo developeru.</string>
<string name="failedGeneratingShareURL">Nije moguće generisati URL koji se može podeliti.</string>
<string name="turn_flashlight_on">Uključi blic</string>
<string name="turn_flashlight_off">Isključi blic</string>
<string name="settings_locale">Jezik</string>
@@ -155,7 +153,7 @@
<string name="unarchive">Ukloni iz arhive</string>
<string name="unarchived">Kartica uklonjena iz arhive</string>
<string name="archived">Kartica dodata u arhivu</string>
<string name="failedLaunchingPhotoPicker">Nije moguće pronaći podržanu galerija aplikaciju</string>
<string name="failedLaunchingPhotoPicker">Nije moguće pronaći podržan birač fotografija</string>
<string name="previousCard">Prethodna</string>
<string name="nextCard">Sledeća</string>
<string name="failedToOpenUrl">Prvo instalirajte internet pregledač</string>
@@ -171,7 +169,7 @@
<string name="height">Visina</string>
<string name="switchToFrontImage">Prebaci na prednju fotografiju</string>
<string name="switchToBarcode">Prebaci na bar-kod</string>
<string name="openFrontImageInGalleryApp">Otvori prednju fotografiju u galerija aplikaciji</string>
<string name="openFrontImageInGalleryApp">Otvori prednju fotografiju u prikazivaču fotografija</string>
<string name="setBarcodeHeight">Postavi visinu bar-koda</string>
<string name="donate">Doniraj</string>
<string name="icon_header_click_text">Dugi pritisak za izmenu naslovne fotografije</string>
@@ -191,7 +189,7 @@
<item quantity="few"><xliff:g>%d</xliff:g> izabrane</item>
<item quantity="other"><xliff:g>%d</xliff:g> izabranih</item>
</plurals>
<string name="noGiftCardsGroup">Kreirajte par kartica, a zatim ih ovde dodeli grupi.</string>
<string name="noGiftCardsGroup">Kreiraj par kartica, a zatim ih ovde dodeli grupi.</string>
<string name="noMatchingGiftCards">Nema rezultata. Pokušaj da promeniš pretragu.</string>
<string name="note">Napomena</string>
<plurals name="deleteCardsTitle">
@@ -208,8 +206,8 @@
<string name="app_license">Kopileftovani slobodni softver, licenciran GPLv3+</string>
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verzija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_libraries">Slobodne biblioteke trećih strana: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Slobodni resursi trećih strana: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Biblioteke trećih strana: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Resursi trećih strana: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="settings_keep_screen_on">Drži ekran uključen</string>
<string name="settings_keep_screen_on_summary">Onemogućava vremensko ograničenje gašenja ekrana dok gledate karticu</string>
<string name="settings_disable_lockscreen_while_viewing_card_summary">Onemogućava zaključavanje ekrana dok gledate karticu</string>
@@ -217,7 +215,7 @@
<string name="groups">Grupe</string>
<string name="group_edit">Izmeni grupu</string>
<string name="group_updated">Grupa ažurirana</string>
<string name="failedOpeningFileManager">Prvo instaliraj menadžer datoteka.</string>
<string name="failedOpeningFileManager">Otvaranje menadžera datoteka nije uspelo.</string>
<string name="editGroup">Izmena grupe: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Ističe: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Istekla: <xliff:g>%s</xliff:g></string>
@@ -233,10 +231,8 @@
<string name="never">Nikad</string>
<string name="chooseExpiryDate">Odaberi datum isteka</string>
<string name="noBarcodeFound">Nije pronađen bar-kod</string>
<string name="importCatimaMessage">Odaberi svoj <i>catima.zip</i> koji želiš da uvezeš.
\nMožeš da ga kreiraš u Catima aplikaciji koju prenosiš iz menija Uvoz/Izvoz aplikacije pritiskom na izvoz.</string>
<string name="importFidmeMessage">Odaberi svoj <i>fidme-export-request-xxxxxx.zip</i> izvoz iz FidMe za uvoz, a zatim ručno izaberite tipove bar-kodova.
\nKreirajte ga iz svog FidMe profila tako što ćeš izabrati \"Data Protection\", a zatim pritisnuti \"Extract my data first\".</string>
<string name="importCatimaMessage">Odaberi svoj export iz Carine radi importa.\nMožeš da ga kreiraš u Catima aplikaciji koju prenosiš iz menija Uvoz/Izvoz u drugoj Catima aplikaciji pritiskom na Izvoz.</string>
<string name="importFidmeMessage">Odaberi svoj izvoz iz FidMe za uvoz, a zatim ručno izaberite tipove bar-kodova.\nKreirajte ga iz svog FidMe profila tako što ćeš izabrati \"Data Protection\", a zatim pritisnuti \"Extract my data first\".</string>
<string name="backImageDescription">Zadnja fotografija kartice</string>
<string name="setBackImage">Postavi zadnju fotografiju</string>
<string name="passwordRequired">Unesi lozinku</string>
@@ -253,7 +249,7 @@
<string name="include_if_asking_support">Ako želiš da zatražiš podršku, ubaci sledeće informacije:</string>
<string name="newBalanceSentence">Novo stanje: <xliff:g>%s</xliff:g></string>
<string name="switchToBackImage">Prebaci na zadnju fotografiju</string>
<string name="openBackImageInGalleryApp">Otvori zadnju fotografiju u galerija aplikaciji</string>
<string name="openBackImageInGalleryApp">Otvori zadnju fotografiju u prikazivaču fotografija</string>
<string name="settings_category_title_cards">Pregled kartica</string>
<string name="addWithoutBarcode">Dodaj karticu bez bar-koda</string>
<string name="enter_card_id">Unesite broj ili tekst sa kartice</string>
@@ -262,7 +258,7 @@
<string name="field_must_not_be_empty">Ovo polje ne sme biti prazno</string>
<string name="manually_enter_barcode_instructions">Unesi broj ili tekst sa kartice i pritisnite bar-kod koji liči na onaj koji je na kartici.</string>
<string name="add_manually_warning_title">Skeniranje se preporučuje</string>
<string name="add_manually_warning_message">Za neke prodavnice, vrednost bar-koda može da se razlikuje od broja napisanog na kartici. Zbog toga, ručno unešeni bar-kod možda neće uvek funkcionisati. Toplo se preporučuje da umesto toga skeniraš bar-kod kamerom. Da li ipak želiš da nastaviš?</string>
<string name="add_manually_warning_message">Za neke kartice, vrednost bar-koda može da se razlikuje od broja napisanog na kartici. Zbog toga, ručno unešeni bar-kod možda neće uvek funkcionisati. Preporučujemo da umesto toga skeniraš bar-kod kamerom. Da li ipak želiš da nastaviš?</string>
<string name="continue_">Nastavi</string>
<string name="spend">Potroši</string>
<string name="receive">Primi</string>
@@ -278,7 +274,7 @@
<string name="pageWithNumber">Strana <xliff:g>%d</xliff:g></string>
<string name="noCameraFoundGuideText">Čini se da tvoj uređaj nema kameru. Ako je ima, pokušaj da ponovo pokreneš uređaj. U suprotnom, koristi dugme Više opcija, koje se nalazi ispod, da bi dodao bar-kod na drugi način.</string>
<string name="sort_by_valid_from">Važi od</string>
<string name="generic_error_please_retry">Izvinite, nešto je pošlo naopako, molimo Vas pokušajte ponovo...</string>
<string name="generic_error_please_retry">Došlo je do greške</string>
<string name="width">Širina</string>
<string name="setBarcodeWidth">Postavi širinu barkoda</string>
<string name="settings_use_volume_keys_navigation">Promeni kartice koristeći dugmad za zvuk</string>
@@ -295,7 +291,20 @@
<string name="settings_column_count_2">2</string>
<string name="settings_column_count_3">3</string>
<string name="settings_column_count_4">4</string>
<string name="addFromPkpass">Izaberi \"Passbook\" dokument (.pkpass)</string>
<string name="addFromPkpass">Izaberi \"Passbook\" dokument (.pkpass/.pkpasses)</string>
<string name="card_list_widget_name">Lista kartica</string>
<string name="card_list_widget_empty">Nakon što dodate neke kartice lojalnosti u Catima, one će se pojaviti ovde. Ako imate kartice, uverite se da nisu sve arhivirane.</string>
<string name="cardWithNumber">Kartica <xliff:g>%d</xliff:g></string>
<string name="cardWithNumberAndLocale">Kartica <xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>)</string>
<string name="pleaseDoNotRotateTheDevice">Molimo ne rotiraj uređaj, jer će to poništiti radnju</string>
<string name="acra_catima_has_crashed">Nažalost, aplikacija <xliff:g id="app_name">%s</xliff:g> se neočekivano zaustavila. Molimo te da nam pomogneš u popravljanju ovog problema tako što ćeš nam poslati izveštaj o grešci.</string>
<string name="acra_explain_crash">Ukoliko je moguće, molimo te da dodaš još detalja o tome šta si radio ovde:</string>
<string name="acra_crash_email_subject"><xliff:g id="app_name">%s</xliff:g> izveštaj o grešci</string>
<string name="pref_enable_acra">Pitaj za slanje izveštaja o grešci</string>
<string name="pref_enable_acra_summary">Kada je omogućeno, bićeš upitan da prijaviš grešku kada do nje dođe. Izveštaji o grešci nikada neće biti poslati automatski.</string>
<string name="copy_value">Kopiraj vrednost</string>
<string name="copied_to_clipboard">Kopiramo u privremenu memoriju</string>
<string name="nothing_to_copy">Nije pronađena vrednost</string>
<string name="barcodeEncoding">Enkodiranje bar-koda</string>
<string name="back">Nazad</string>
</resources>
+4
View File
@@ -301,4 +301,8 @@
<string name="nothing_to_copy">Değer bulunamadı</string>
<string name="barcodeEncoding">Barkod kodlaması</string>
<string name="back">Geri</string>
<string name="settings_disable_nfc_while_viewing_card">NFC\'yi duraklat</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Kart görüntülenirken NFC ödemelerinin tetiklenmesini önlemek için NFC işlevini duraklatır</string>
<string name="nfc_blocked_while_viewing_card">NFC duraklatıldı</string>
<string name="change_settings">Ayarları değiştir</string>
</resources>
+43 -29
View File
@@ -21,12 +21,12 @@
<string name="takePhoto">Chụp ảnh</string>
<string name="storeName">Tên</string>
<string name="validFromDate">Có hiệu lực từ</string>
<string name="cameraPermissionDeniedTitle">Không sử dụng được camera</string>
<string name="wrongValueForBarcodeType">Giá trị cho loại mã vạch này không hợp lệ</string>
<string name="cameraPermissionDeniedTitle">Không thể truy cập camera</string>
<string name="wrongValueForBarcodeType">Giá trị không hợp lệ cho loại mã vạch đã chọn</string>
<string name="expiryDate">Ngày hết hạn</string>
<string name="currency">Tiền tệ</string>
<string name="welcome">Chào mừng tới Catima</string>
<string name="failedParsingImportUriError">Không thể phân tích URI được cung cấp</string>
<string name="failedParsingImportUriError">Không thể phân tích URI đã nhập</string>
<string name="exporting">Đang xuất dữ liệu…</string>
<string name="group_edit">Sửa nhóm</string>
<string name="debug_version_fmt">Phiên bản: <xliff:g id="version">%s</xliff:g></string>
@@ -54,11 +54,10 @@
<string name="cardId">ID thẻ</string>
<string name="settings_disable_lockscreen_while_viewing_card_summary">Tắt tính năng khóa màng hình khi đang xem thẻ</string>
<string name="action_more_options">Tùy chọn mở rộng</string>
<string name="exportOptionExplanation">Dữ liệu sẽ được ghi vào vị trí mà bạn chọn.</string>
<string name="exportOptionExplanation">Dữ liệu sẽ được ghi vào vị trí mà bạn chọn</string>
<string name="app_copyright_old">Dựa trên Loyalty Card Keychain
\nbản quyền © 20162020 Branden Archer</string>
<string name="importVoucherVaultMessage">Chọn <i>vouchervault.json</i> được xuất từ Voucher Vault để nhập liệu.
\nTập tin này có thể tạo bằng cách bấm Export trong ứng dụng Voucher Vault.</string>
<string name="importVoucherVaultMessage">Chọn tập tin đã xuất từ Voucher Vault để nhập liệu. \nTạo tập tin này bằng cách bấm Export trong ứng dụng Voucher Vault.</string>
<string name="importFailed">Không thể nhập dữ liệu</string>
<string name="chooseImportType">Nhập dữ liệu từ</string>
<string name="frontImageDescription">Ảnh mặt trước</string>
@@ -106,18 +105,18 @@
<string name="on_google_play">trên CH Play</string>
<string name="turn_flashlight_off">Tắt đèn pin</string>
<string name="show_note">Hiện ghi chú</string>
<string name="report_error">Báo Lỗi</string>
<string name="report_error">Báo lỗi</string>
<string name="passwordRequired">Xin mời nhập mật khẩu</string>
<string name="intent_import_card_from_url_share_text">Tôi muốn chia sẻ thẻ với bạn</string>
<string name="star">Đánh dấu ưa thích</string>
<string name="addFromImage">Chọn ảnh từ thư viện ảnh</string>
<string name="reverse">...theo trật tự đảo ngược</string>
<string name="app_copyright_short">Bản quyền © Sylvia van Os và các cộng sự</string>
<string name="importExportHelp">Sao lưu cho phép bạn chuyển dữ liệu của mình đến thiết bị khác.</string>
<string name="importExportHelp">Sao lưu cho phép bạn chuyển dữ liệu của mình đến thiết bị khác</string>
<string name="settings_oled_dark">Nền đen tuyền cho chủ đề tối</string>
<string name="starred">Ưa thích</string>
<string name="field_must_not_be_empty">Không được để ô trống</string>
<string name="importOptionFilesystemExplanation">Chọn 1 tập tin cụ thể từ hệ thống (filesystem).</string>
<string name="importOptionFilesystemExplanation">Chọn 1 tập tin cụ thể từ hệ thống (filesystem)</string>
<string name="validFromSentence">Hợp lệ từ: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessful">Xuất dữ liệu xong</string>
<string name="previousCard">Trước</string>
@@ -125,7 +124,7 @@
<string name="license">Giấy phép</string>
<string name="newBalanceSentence">Số dư mới: <xliff:g>%s</xliff:g></string>
<string name="editGroup">Sửa nhóm: <xliff:g>%s</xliff:g></string>
<string name="noGroups">Bấm vào dấu cộng + để thêm nhóm cho việc phân loại.</string>
<string name="noGroups">Bấm vào dấu cộng + để thêm nhóm cho việc phân loại</string>
<plurals name="groupCardCountWithArchived">
<item quantity="other"><xliff:g>%1$d</xliff:g> thẻ (lưu trữ <xliff:g id="archivedCount">%2$d</xliff:g>)</item>
</plurals>
@@ -137,7 +136,7 @@
<string name="options">Tùy chọn</string>
<string name="sendLabel">Gửi…</string>
<string name="importOptionFilesystemButton">Lấy từ hệ thống</string>
<string name="failedGeneratingShareURL">Không tạo được URL chia sẻ. Xin hãy báo cáo sự cố này.</string>
<string name="failedGeneratingShareURL">Không tạo được URL để chia sẻ</string>
<string name="selectColor">Chọn màu</string>
<string name="setBarcodeHeight">Đặt chiều cao cho mã vạch</string>
<string name="privacy_policy">Chính sách quyền riêng tư</string>
@@ -149,7 +148,7 @@
<string name="addManually">Nhập mã vạch thủ công</string>
<string name="updateBalance">Cập nhật số dư</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Bản quyền © 2019<xliff:g>%d</xliff:g> Sylvia van Os và các cộng sự</string>
<string name="sort_by_most_recently_used">Sửa dụng gần đây nhất</string>
<string name="sort_by_most_recently_used">Sử dụng gần đây nhất</string>
<string name="noGiftCards">Bấm nút dấu cộng + để thêm thẻ, hoặc nhập dữ liệu từ ⋮ menu</string>
<string name="importVoucherVault">Nhập dữ liệu từ Voucher Vault</string>
<string name="barcodeId">Giá trị mã vạch</string>
@@ -164,8 +163,7 @@
<string name="cameraPermissionRequired">Tác vụ này cần được cấp quyền sử dụng camera…</string>
<string name="settings_allow_content_provider_read_title">Cho phép ứng dụng khác truy cập vào dữ liệu của tôi</string>
<string name="updateBarcodeQuestionText">Bạn đã thay đổi ID. Bạn có muốn cập nhật mã vạch dùng chung giá trị này\?</string>
<string name="importLoyaltyCardKeychainMessage">Chọn <i>LoyaltyCardKeychain.csv</i> được xuất từ Loyalty Card Keychain để nhập liệu.
\nTập tin này có thể tạo bằng cách vào menu Import/Export của Loyalty Card Keychain → bấm Export.</string>
<string name="importLoyaltyCardKeychainMessage">Chọn tập tin được xuất từ Loyalty Card Keychain để nhập liệu. \nTạo tập tin này bằng cách vào menu Import/Export của Loyalty Card Keychain và bấm Export.</string>
<string name="settings_light_theme">Sáng</string>
<string name="moveDown">Kéo xuống</string>
<string name="importSuccessfulTitle">Nhập dữ liệu xong</string>
@@ -178,7 +176,7 @@
<string name="scanCardBarcode">Quét Mã Vạch</string>
<string name="updateBalanceHint">Nhập số lượng</string>
<string name="action_search">Tìm kiếm</string>
<string name="noGiftCardsGroup">Tạo vài thẻ, và phân công chúng vào nhóm này.</string>
<string name="noGiftCardsGroup">Tạo vài thẻ, và sắp xếp chúng vào nhóm này</string>
<string name="on_github">trên Github</string>
<string name="sort">Sắp Xếp</string>
<string name="permissionReadCardsLabel">Đọc thẻ Catima</string>
@@ -202,11 +200,11 @@
<string name="show_archived_cards">Hiện thẻ lưu trữ</string>
<string name="selectBarcodeTitle">Chọn Mã Vạch</string>
<string name="importSuccessful">Nhập dữ liệu xong</string>
<string name="app_libraries">Thư viện mở từ bên thứ 3: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_libraries">Thư viện mở từ bên thứ ba: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="updateBalanceTitle">Bạn đã chi tiêu hoặc nhận được bao nhiêu?</string>
<string name="editCardTitle">Sửa thẻ</string>
<string name="archive">Lưu trữ</string>
<string name="app_resources">Tài nguyên mở từ bên thứ 3: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_resources">Tài nguyên mở từ bên thứ ba: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="shortcutSelectCard">Chọn một thẻ</string>
<string name="accept">Đồng ý</string>
<string name="noCardsMessage">Thêm danh sách thẻ</string>
@@ -220,15 +218,13 @@
<plurals name="selectedCardCount">
<item quantity="other"><xliff:g>%d</xliff:g> đã được chọn</item>
</plurals>
<string name="version_history">Lịch SPhiên Bản</string>
<string name="version_history">Lịch sphiên bản</string>
<string name="note">Ghi chú</string>
<string name="importCatimaMessage">Chọn <i>catima.zip</i> được xuất từ Catima để nhập liệu.
\nTập tin này có thể tạo bằng cách vào menu Nhập/Xuất dữ liệu → bấm Xuất dữ liệu ở ứng dụng Catima khác.</string>
<string name="importCatimaMessage">Chọn tập tin được xuất từ Catima để nhập liệu.\nTạo tập tin từ menu Nhập/Xuất dữ liệu ở ứng dụng Catima khác và bấm Xuất dữ liệu.</string>
<plurals name="balancePoints">
<item quantity="other"><xliff:g>%s</xliff:g> điểm</item>
</plurals>
<string name="importFidmeMessage">Chọn <i>fidme-export-request-xxxxxx.zip</i> được xuất từ FidMe để nhập liệu, sau đó chọn mã vạch thủ công.
\nTập tin này có thể tạo bằng cách vào FidMe profile → Data Protection → bấm Extract my data.</string>
<string name="importFidmeMessage">Chọn tập tin được xuất từ FidMe để nhập liệu, sau đó chọn thủ công loại mã vạch. \nTạo tập tin này bằng cách vào tài khoản FidMe, chọn Data Protection, rồi bấm Extract my data.</string>
<string name="action_add">Thêm</string>
<string name="updateBarcodeQuestionTitle">Cập nhật giá trị cho mã vạch chứ\?</string>
<string name="deleteTitle">Xóa thẻ</string>
@@ -238,14 +234,14 @@
<string name="rate_this_app">Đánh giá ứng dụng</string>
<string name="credits">Ghi nhận</string>
<string name="app_name">Catima</string>
<string name="openFrontImageInGalleryApp">Mở hình ảnh phía trước trong ứng dụng thư viện</string>
<string name="openFrontImageInGalleryApp">Mở hình ảnh mặt trước trong ứng dụng thư viện ảnh</string>
<string name="and_data_usage">và sử dụng dữ liệu</string>
<string name="show_validity">Hiển thị tính hợp lệ</string>
<string name="barcodeLongPressMessage">Chỉ có thể mở hình ảnh trong ứng dụng thư viện</string>
<string name="source_repository">Kho lưu trữ nguồn</string>
<string name="switchToBackImage">Chuyển sang hình ảnh phía sau</string>
<string name="switchToFrontImage">Chuyển sang hình ảnh phía trước</string>
<string name="openBackImageInGalleryApp">Mở lại hình ảnh trong ứng dụng thư viện</string>
<string name="openBackImageInGalleryApp">Mở hình ảnh mặt sau trong ứng dụng thư viện ảnh</string>
<string name="failedToRetrieveImageFile">Không thể truy xuất tệp hình ảnh</string>
<string name="app_contributors">Được thực hiện bởi: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="app_license">Phần mềm miễn phí có bản quyền theo giấy phép GPLv3+</string>
@@ -254,12 +250,12 @@
<string name="spend">Tiêu</string>
<string name="receive">Nhận được</string>
<string name="amountParsingFailed">Số tiền không hợp lệ</string>
<string name="add_manually_warning_message">Đối với một số cửa hàng, giá trị mã vạch khác với số ghi trên thẻ. Vì lý do này, việc nhập mã vạch theo cách thủ công không phải lúc nào cũng hiệu quả. Thay vào đó, bạn nên quét mã vạch bằng máy ảnh của mình. Bạn vẫn muốn tiếp tục chứ?</string>
<string name="add_manually_warning_message">Đối với một số thẻ, giá trị mã vạch khác với số ghi trên thẻ. Vì lý do này, việc nhập mã vạch theo cách thủ công không phải lúc nào cũng hiệu quả. Thay vào đó, bạn nên quét mã vạch bằng máy ảnh của mình. Bạn vẫn muốn tiếp tục chứ?</string>
<string name="addFromPdfFile">Chọn tệp PDF</string>
<string name="errorReadingFile">Không thể đọc tệp</string>
<string name="errorReadingFile">Không thể đọc tập tin</string>
<string name="pageWithNumber">Page <xliff:g>%d</xliff:g></string>
<string name="multipleBarcodesFoundPleaseChooseOne">Bạn muốn sử dụng mã vạch nào được tìm thấy?</string>
<string name="failedLaunchingFileManager">Không thể tìm thấy trình quản lý tệp được hỗ trợ</string>
<string name="failedLaunchingFileManager">Không thể tìm thấy trình quản lý tập tin được hỗ trợ</string>
<string name="noCameraFoundGuideText">Có vẻ như thiết bị của bạn không có camera. Nếu có, hãy thử khởi động lại thiết bị. Nếu không, hãy sử dụng nút Tùy chọn khác bên dưới để thêm mã vạch theo cách khác.</string>
<string name="useFrontImage">Sử dụng hình ảnh phía trước</string>
<string name="useBackImage">Sử dụng hình ảnh phía sau</string>
@@ -279,10 +275,28 @@
<string name="settings_column_count_6">6</string>
<string name="settings_column_count_7">7</string>
<string name="sort_by_valid_from">Có hiệu lực từ</string>
<string name="addFromPkpass">Chọn tệp Passbook (.pkpass)</string>
<string name="addFromPkpass">Chọn tập tin Passbook (.pkpass / .pkpasses)</string>
<string name="unsupportedFile">Tập tin này không được hỗ trợ</string>
<string name="generic_error_please_retry">Xin lỗi, có gì đó không ổn, vui lòng thử lại...</string>
<string name="generic_error_please_retry"> lỗi xảy ra</string>
<string name="width">Chiều rộng</string>
<string name="setBarcodeWidth">Đặt chiều rộng mã vạch</string>
<string name="card_list_widget_name">Danh sách thẻ</string>
<string name="card_list_widget_empty">Sau khi được nhập vào Catima, thẻ hội viên của bạn sẽ xuất hiện ở đây. Hãy đảm bảo tất cả các thẻ không ở trạng thái đã lưu trữ.</string>
<string name="cardWithNumber">Thẻ <xliff:g>%d</xliff:g></string>
<string name="cardWithNumberAndLocale">Thẻ <xliff:g>%d</xliff:g> (<xliff:g>%s</xliff:g>)</string>
<string name="pleaseDoNotRotateTheDevice">Vui lòng không quay thiết bị, thao tác này sẽ huỷ hành động</string>
<string name="acra_catima_has_crashed">Rất tiếc, <xliff:g id="app_name">%s</xliff:g> đã bị lỗi. Vui lòng giúp chúng tôi sửa vấn đề này bằng cách gửi báo cáo lỗi.</string>
<string name="acra_explain_crash">Nếu được, bạn vui lòng mô tả rõ hơn về thao tác đã thực hiện tại đây:</string>
<string name="acra_crash_email_subject">Báo cáo lỗi <xliff:g id="app_name">%s</xliff:g></string>
<string name="pref_enable_acra">Yêu cầu gửi báo cáo lỗi</string>
<string name="pref_enable_acra_summary">Khi nhấn cho phép, bạn sẽ được yêu cầu gửi báo cáo khi lỗi xảy ra. Báo cáo lỗi sẽ không bao giờ được tự động gửi đi.</string>
<string name="copy_value">Sao chép giá trị</string>
<string name="copied_to_clipboard">Sao chép vào bộ nhớ tạm</string>
<string name="nothing_to_copy">Không tìm thấy giá trị</string>
<string name="barcodeEncoding">Mã hoá mã vạch</string>
<string name="back">Quay lại</string>
<string name="settings_disable_nfc_while_viewing_card">Tạm dừng NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Tạm dừng NFC để tránh tự động kích hoạt thanh toán NFC khi đang xem một thẻ</string>
<string name="nfc_blocked_while_viewing_card">Đã tạm dừng NFC</string>
<string name="change_settings">Thay đổi cài đặt</string>
</resources>
+5 -1
View File
@@ -282,7 +282,7 @@
<string name="setBarcodeWidth">设置条码宽度</string>
<string name="card_list_widget_name">卡片列表</string>
<string name="card_list_widget_empty">在 Catima 中添加了一些会员卡后,它们会出现在这里。如果你有卡片,确保不是所有都已归档。</string>
<string name="cardWithNumber"><xliff:g>%d</xliff:g></string>
<string name="cardWithNumber"><xliff:g>%d</xliff:g></string>
<string name="cardWithNumberAndLocale"><xliff:g>%d</xliff:g> <xliff:g>%s</xliff:g></string>
<string name="pleaseDoNotRotateTheDevice">请不要旋转设备,这样做会取消操作</string>
<string name="acra_catima_has_crashed">抱歉,但 <xliff:g id="app_name">%s</xliff:g>崩溃了。请发送错误报告帮助修复这个问题。</string>
@@ -295,4 +295,8 @@
<string name="nothing_to_copy">没找到值</string>
<string name="barcodeEncoding">条形码编码</string>
<string name="back">返回</string>
<string name="settings_disable_nfc_while_viewing_card">暂停 NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">暂停 NFC 防止在查看卡片时触发 NFC 支付</string>
<string name="nfc_blocked_while_viewing_card">NFC 已暂停</string>
<string name="change_settings">更改设置</string>
</resources>
@@ -294,4 +294,8 @@
<string name="nothing_to_copy">未找到值</string>
<string name="barcodeEncoding">條碼編碼</string>
<string name="back">返回</string>
<string name="settings_disable_nfc_while_viewing_card">暫停 NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">暫停 NFC,以防止在檢視卡片時觸發 NFC 付款</string>
<string name="nfc_blocked_while_viewing_card">NFC 已暫停</string>
<string name="change_settings">變更設定</string>
</resources>
+6
View File
@@ -101,6 +101,9 @@
<string name="settings_key_keep_screen_on" translatable="false">pref_keep_screen_on</string>
<string name="settings_disable_lockscreen_while_viewing_card">Prevent screen lock</string>
<string name="settings_disable_lockscreen_while_viewing_card_summary">Disables screen lock while viewing a card</string>
<string name="settings_disable_nfc_while_viewing_card">Pause NFC</string>
<string name="settings_disable_nfc_while_viewing_card_summary">Pauses NFC to prevent NFC payments from triggering while viewing a card</string>
<string name="settings_key_disable_nfc_while_viewing_card" translatable="false">pref_disable_nfc_while_viewing_card</string>
<string name="settings_allow_content_provider_read_title">Allow other apps to access my data</string>
<string name="settings_allow_content_provider_read_summary">Apps will still have to request permission to be granted access</string>
<string name="settings_key_disable_lockscreen_while_viewing_card" translatable="false">pref_disable_lockscreen_while_viewing_card</string>
@@ -345,4 +348,7 @@
<string name="nothing_to_copy">No value found</string>
<string name="barcodeEncoding">Barcode encoding</string>
<string name="back">Back</string>
<string name="nfc_blocked_while_viewing_card">NFC is paused</string>
<string name="change_settings">Change settings</string>
<string name="nfc_block_system_error">Failed to pause NFC</string>
</resources>
+9
View File
@@ -109,6 +109,15 @@
android:title="@string/settings_disable_lockscreen_while_viewing_card"
app:iconSpaceReserved="false"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="true"
android:key="@string/settings_key_disable_nfc_while_viewing_card"
android:summary="@string/settings_disable_nfc_while_viewing_card_summary"
android:title="@string/settings_disable_nfc_while_viewing_card"
app:iconSpaceReserved="false"
app:singleLineTitle="false" />
</PreferenceCategory>
<PreferenceCategory
@@ -7,6 +7,7 @@ import android.content.pm.ApplicationInfo
import android.content.pm.ResolveInfo
import android.view.View
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.Robolectric
@@ -61,6 +62,12 @@ class ImportExportActivityTest {
assertEquals(state, buttonView.visibility)
}
@Test
fun testExportFilenameHasTimestamp() {
val filename = ImportExportActivity.getExportFilename()
assertTrue(filename.matches(Regex("catima_\\d{8}\\.zip")))
}
@Test
fun testAllOptionsAvailable() {
registerIntentHandler(Intent.ACTION_PICK)
@@ -51,6 +51,7 @@ import com.google.android.material.textfield.TextInputLayout;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.client.android.Intents;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -71,13 +72,19 @@ import java.text.DateFormat;
import java.text.ParseException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Currency;
import java.util.Date;
import java.util.List;
import protect.card_locker.cardview.LoyaltyCardViewActivity;
@RunWith(RobolectricTestRunner.class)
public class LoyaltyCardViewActivityTest {
private final String BARCODE_DATA = "428311627547";
private final CatimaBarcode BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A);
private final List<ActivityController<? extends Activity>> activityControllers = new ArrayList<>();
private final List<DBHelper> dbHelpers = new ArrayList<>();
private final String EAN_BARCODE_DATA = "4763705295336";
private final CatimaBarcode EAN_BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.EAN_13);
@@ -101,6 +108,30 @@ public class LoyaltyCardViewActivityTest {
ShadowLog.stream = System.out;
}
@After
public void tearDown() {
for (int index = activityControllers.size() - 1; index >= 0; index--) {
ActivityController<? extends Activity> activityController = activityControllers.get(index);
try {
activityController.pause().stop().destroy();
} catch (RuntimeException ignored) {
try {
activityController.destroy();
} catch (RuntimeException ignoredAgain) {
}
}
}
activityControllers.clear();
for (int index = dbHelpers.size() - 1; index >= 0; index--) {
try {
dbHelpers.get(index).close();
} catch (RuntimeException ignored) {
}
}
dbHelpers.clear();
}
/**
* Register a handler in the package manager for a image capture intent
*/
@@ -137,87 +168,110 @@ public class LoyaltyCardViewActivityTest {
final String barcodeType,
final String barcodeEncoding,
boolean creatingNewCard) throws ParseException {
SQLiteDatabase database = new DBHelper(activity).getWritableDatabase();
if (creatingNewCard) {
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
} else {
DBHelper dbHelper = new DBHelper(activity);
SQLiteDatabase database = dbHelper.getWritableDatabase();
try {
if (creatingNewCard) {
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
} else {
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
}
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final TextInputLayout validFromView = activity.findViewById(R.id.validFromView);
final TextInputLayout expiryView = activity.findViewById(R.id.expiryView);
final EditText balanceView = activity.findViewById(R.id.balanceField);
final EditText balanceCurrencyField = activity.findViewById(R.id.balanceCurrencyField);
final TextView cardIdField = activity.findViewById(R.id.cardIdView);
final TextView barcodeIdField = activity.findViewById(R.id.barcodeIdField);
final TextView barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final TextView barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField);
storeField.setText(store);
noteField.setText(note);
validFromView.setTag(validFrom);
expiryView.setTag(expiry);
balanceView.setText(balance.toPlainString());
balanceCurrencyField.setText(balanceType);
cardIdField.setText(cardId);
barcodeIdField.setText(barcodeId);
barcodeTypeField.setText(barcodeType);
barcodeEncodingField.setText(barcodeEncoding);
assertEquals(false, activity.isFinishing());
activity.findViewById(R.id.fabSave).performClick();
assertEquals(true, activity.isFinishing());
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), database, 1);
assertEquals(store, card.store);
assertEquals(note, card.note);
assertEquals(balance, card.balance);
// The special "Any date" string shouldn't actually be written to the loyalty card
if (validFrom.equals(activity.getApplicationContext().getString(R.string.anyDate))) {
assertEquals(null, card.validFrom);
} else {
assertEquals(DateFormat.getDateInstance().parse(validFrom), card.validFrom);
}
// The special "Never" string shouldn't actually be written to the loyalty card
if (expiry.equals(activity.getApplicationContext().getString(R.string.never))) {
assertEquals(null, card.expiry);
} else {
assertEquals(DateFormat.getDateInstance().parse(expiry), card.expiry);
}
// The special "Points" string shouldn't actually be written to the loyalty card
if (balanceType.equals(activity.getApplicationContext().getString(R.string.points))) {
assertEquals(null, card.balanceType);
} else {
assertEquals(Currency.getInstance(balanceType), card.balanceType);
}
assertEquals(cardId, card.cardId);
// The special "Same as barcode ID" string shouldn't actually be written to the loyalty card
if (barcodeId.equals(activity.getApplicationContext().getString(R.string.sameAsCardId))) {
assertEquals(null, card.barcodeId);
} else {
assertEquals(barcodeId, card.barcodeId);
}
// The special "No barcode" string shouldn't actually be written to the loyalty card
if (barcodeType.equals(activity.getApplicationContext().getString(R.string.noBarcode))) {
assertEquals(null, card.barcodeType);
} else {
assertEquals(CatimaBarcode.fromName(barcodeType).format(), card.barcodeType.format());
}
assertEquals(Charset.forName(barcodeEncoding), card.barcodeEncoding);
assertNotNull(card.headerColor);
} finally {
dbHelper.close();
}
}
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final TextInputLayout validFromView = activity.findViewById(R.id.validFromView);
final TextInputLayout expiryView = activity.findViewById(R.id.expiryView);
final EditText balanceView = activity.findViewById(R.id.balanceField);
final EditText balanceCurrencyField = activity.findViewById(R.id.balanceCurrencyField);
final TextView cardIdField = activity.findViewById(R.id.cardIdView);
final TextView barcodeIdField = activity.findViewById(R.id.barcodeIdField);
final TextView barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final TextView barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField);
private SQLiteDatabase getWritableEmptyDatabase(Context context) {
DBHelper dbHelper = TestHelpers.getEmptyDb(context);
dbHelpers.add(dbHelper);
return dbHelper.getWritableDatabase();
}
storeField.setText(store);
noteField.setText(note);
validFromView.setTag(validFrom);
expiryView.setTag(expiry);
balanceView.setText(balance.toPlainString());
balanceCurrencyField.setText(balanceType);
cardIdField.setText(cardId);
barcodeIdField.setText(barcodeId);
barcodeTypeField.setText(barcodeType);
barcodeEncodingField.setText(barcodeEncoding);
private <T extends Activity> ActivityController<T> trackActivityController(ActivityController<T> activityController) {
activityControllers.add(activityController);
return activityController;
}
assertEquals(false, activity.isFinishing());
activity.findViewById(R.id.fabSave).performClick();
assertEquals(true, activity.isFinishing());
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), database, 1);
assertEquals(store, card.store);
assertEquals(note, card.note);
assertEquals(balance, card.balance);
// The special "Any date" string shouldn't actually be written to the loyalty card
if (validFrom.equals(activity.getApplicationContext().getString(R.string.anyDate))) {
assertEquals(null, card.validFrom);
private void checkFieldType(final Activity activity, final int id, FieldTypeView fieldTypeView) {
final View view = activity.findViewById(id);
if (fieldTypeView == FieldTypeView.TextView) {
assertTrue(view instanceof TextView);
} else {
assertEquals(DateFormat.getDateInstance().parse(validFrom), card.validFrom);
assertTrue(view instanceof TextInputLayout || view instanceof ImageView);
}
// The special "Never" string shouldn't actually be written to the loyalty card
if (expiry.equals(activity.getApplicationContext().getString(R.string.never))) {
assertEquals(null, card.expiry);
} else {
assertEquals(DateFormat.getDateInstance().parse(expiry), card.expiry);
}
// The special "Points" string shouldn't actually be written to the loyalty card
if (balanceType.equals(activity.getApplicationContext().getString(R.string.points))) {
assertEquals(null, card.balanceType);
} else {
assertEquals(Currency.getInstance(balanceType), card.balanceType);
}
assertEquals(cardId, card.cardId);
// The special "Same as barcode ID" string shouldn't actually be written to the loyalty card
if (barcodeId.equals(activity.getApplicationContext().getString(R.string.sameAsCardId))) {
assertEquals(null, card.barcodeId);
} else {
assertEquals(barcodeId, card.barcodeId);
}
// The special "No barcode" string shouldn't actually be written to the loyalty card
if (barcodeType.equals(activity.getApplicationContext().getString(R.string.noBarcode))) {
assertEquals(null, card.barcodeType);
} else {
assertEquals(CatimaBarcode.fromName(barcodeType).format(), card.barcodeType.format());
}
assertEquals(Charset.forName(barcodeEncoding), card.barcodeEncoding);
assertNotNull(card.headerColor);
database.close();
}
/**
@@ -357,7 +411,7 @@ public class LoyaltyCardViewActivityTest {
@Test
@Config(qualifiers="de")
public void noCrashOnRegionlessLocale() {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
final Context context = activity.getApplicationContext();
@@ -375,107 +429,110 @@ public class LoyaltyCardViewActivityTest {
@Test
public void noDataLossOnResumeOrRotate() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
try {
registerMediaStoreIntentHandler();
registerMediaStoreIntentHandler();
Integer cardId;
Integer cardId;
for (boolean newCard : new boolean[]{false, true}) {
System.out.println();
System.out.println("=====");
System.out.println("New card? " + newCard);
System.out.println("=====");
System.out.println();
for (boolean newCard : new boolean[]{false, true}) {
System.out.println();
System.out.println("=====");
System.out.println("New card? " + newCard);
System.out.println("=====");
System.out.println();
if (!newCard) {
cardId = (int) DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0);
} else {
cardId = null;
}
if (!newCard) {
cardId = (int) DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0);
} else {
cardId = null;
ActivityController activityController = createActivityWithLoyaltyCard(true, cardId);
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
activityController.start();
activityController.visible();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check default settings
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.prettyName(), newCard ? "ISO-8859-1" : "UTF-8", null, null);
// Change everything
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final EditText validFromField = activity.findViewById(R.id.validFromField);
final EditText expiryField = activity.findViewById(R.id.expiryField);
final EditText balanceField = activity.findViewById(R.id.balanceField);
final EditText balanceTypeField = activity.findViewById(R.id.balanceCurrencyField);
final EditText cardIdField = activity.findViewById(R.id.cardIdView);
final EditText barcodeField = activity.findViewById(R.id.barcodeIdField);
final EditText barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final EditText barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField);
final ImageView frontImageView = activity.findViewById(R.id.frontImage);
final ImageView backImageView = activity.findViewById(R.id.backImage);
Currency currency = Currency.getInstance("EUR");
Date validFromDate = Date.from(Instant.now().minus(20, ChronoUnit.DAYS));
Date expiryDate = new Date();
Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle);
Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_done);
storeField.setText("correct store");
noteField.setText("correct note");
LoyaltyCardEditActivity.formatDateField(context, validFromField, validFromDate);
activity.setLoyaltyCardValidFrom(validFromDate);
LoyaltyCardEditActivity.formatDateField(context, expiryField, expiryDate);
activity.setLoyaltyCardExpiry(expiryDate);
balanceField.setText("100");
balanceTypeField.setText(currency.getSymbol());
cardIdField.setText("12345678");
barcodeField.setText("87654321");
barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName());
barcodeEncodingField.setText(StandardCharsets.ISO_8859_1.name());
activity.setCardImage(ImageLocationType.front, frontImageView, frontBitmap, true);
activity.setCardImage(ImageLocationType.back, backImageView, backBitmap, true);
shadowOf(getMainLooper()).idle();
// Check if changed
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Resume
activityController.pause();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Rotate to landscape
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
activity.recreate();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Rotate to portrait
shadowOf(getMainLooper()).idle();
activity.recreate();
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
}
ActivityController activityController = createActivityWithLoyaltyCard(true, cardId);
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
activityController.start();
activityController.visible();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check default settings
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.prettyName(), newCard ? "ISO-8859-1" : "UTF-8", null, null);
// Change everything
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final EditText validFromField = activity.findViewById(R.id.validFromField);
final EditText expiryField = activity.findViewById(R.id.expiryField);
final EditText balanceField = activity.findViewById(R.id.balanceField);
final EditText balanceTypeField = activity.findViewById(R.id.balanceCurrencyField);
final EditText cardIdField = activity.findViewById(R.id.cardIdView);
final EditText barcodeField = activity.findViewById(R.id.barcodeIdField);
final EditText barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final EditText barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField);
final ImageView frontImageView = activity.findViewById(R.id.frontImage);
final ImageView backImageView = activity.findViewById(R.id.backImage);
Currency currency = Currency.getInstance("EUR");
Date validFromDate = Date.from(Instant.now().minus(20, ChronoUnit.DAYS));
Date expiryDate = new Date();
Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle);
Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_done);
storeField.setText("correct store");
noteField.setText("correct note");
LoyaltyCardEditActivity.formatDateField(context, validFromField, validFromDate);
activity.setLoyaltyCardValidFrom(validFromDate);
LoyaltyCardEditActivity.formatDateField(context, expiryField, expiryDate);
activity.setLoyaltyCardExpiry(expiryDate);
balanceField.setText("100");
balanceTypeField.setText(currency.getSymbol());
cardIdField.setText("12345678");
barcodeField.setText("87654321");
barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName());
barcodeEncodingField.setText(StandardCharsets.ISO_8859_1.name());
activity.setCardImage(ImageLocationType.front, frontImageView, frontBitmap, true);
activity.setCardImage(ImageLocationType.back, backImageView, backBitmap, true);
shadowOf(getMainLooper()).idle();
// Check if changed
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Resume
activityController.pause();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Rotate to landscape
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
activity.recreate();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Rotate to portrait
shadowOf(getMainLooper()).idle();
activity.recreate();
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
} finally {
database.close();
}
}
@Test
public void startWithoutParametersCheckFieldsAvailable() {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -489,9 +546,9 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersCannotCreateLoyaltyCard() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -519,7 +576,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersBack() {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -535,7 +592,7 @@ public class LoyaltyCardViewActivityTest {
public void startWithoutParametersCaptureBarcodeCreateLoyaltyCard() throws IOException, ParseException {
registerMediaStoreIntentHandler();
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -559,7 +616,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersCaptureBarcodeFailure() throws IOException {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -580,7 +637,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersCaptureBarcodeCancel() throws IOException {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -631,13 +688,13 @@ public class LoyaltyCardViewActivityTest {
intent.putExtras(bundle);
return Robolectric.buildActivity(clazz, intent).create();
return trackActivityController(Robolectric.buildActivity(clazz, intent).create());
}
@Test
public void startWithLoyaltyCardEditModeCheckDisplay() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -656,7 +713,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardViewModeCheckDisplay() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0);
@@ -675,7 +732,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardWithBarcodeUpdateBarcode() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0);
@@ -700,7 +757,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardWithReceiptUpdateReceiptCancel() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -739,7 +796,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardNoExpirySetExpiry() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -772,7 +829,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardExpirySetNoExpiry() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -797,7 +854,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardNoBalanceSetBalance() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -848,7 +905,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardBalanceSetNoBalance() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -889,7 +946,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardSameAsCardIDUpdateBarcodeID() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -921,7 +978,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardSameAsCardIDUpdateCardID() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -955,7 +1012,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDUpdate() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -992,7 +1049,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDDoNotUpdate() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1029,7 +1086,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void checkMenu() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1074,7 +1131,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersViewBack() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1095,7 +1152,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutColors() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, null, 0, null, 0);
@@ -1116,7 +1173,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startLoyaltyCardWithoutColorsSave() throws IOException, ParseException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, null, 0, null, 0);
@@ -1136,7 +1193,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startLoyaltyCardWithExplicitNoBarcodeSave() throws IOException, ParseException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1156,7 +1213,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void removeBarcodeFromLoyaltyCard() throws IOException, ParseException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1187,7 +1244,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void checkPushStarIcon() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1224,7 +1281,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void checkBarcodeFullscreenWorkflow() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1320,7 +1377,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void checkNoBarcodeFullscreenWorkflow() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1366,7 +1423,7 @@ public class LoyaltyCardViewActivityTest {
Intent intent = new Intent();
intent.setData(importUri);
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class, intent).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class, intent).create());
activityController.start();
activityController.visible();
@@ -1388,7 +1445,7 @@ public class LoyaltyCardViewActivityTest {
Intent intent = new Intent();
intent.setData(importUri);
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class, intent).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class, intent).create());
activityController.start();
activityController.visible();
@@ -22,19 +22,20 @@ public class TestHelpers {
SQLiteDatabase database = db.getWritableDatabase();
// Make sure no files remain
Cursor cursor = DBHelper.getLoyaltyCardCursor(database);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
int cardID = cursor.getColumnIndex(DBHelper.LoyaltyCardDbIds.ID);
try (Cursor cursor = DBHelper.getLoyaltyCardCursor(database)) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
int cardID = cursor.getColumnIndex(DBHelper.LoyaltyCardDbIds.ID);
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
try {
Utils.saveCardImage(context.getApplicationContext(), null, cardID, imageLocationType);
} catch (FileNotFoundException ignored) {
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
try {
Utils.saveCardImage(context.getApplicationContext(), null, cardID, imageLocationType);
} catch (FileNotFoundException ignored) {
}
}
}
cursor.moveToNext();
cursor.moveToNext();
}
}
// Make sure DB is empty
+5 -5
View File
@@ -11,13 +11,13 @@ if [ -z "${ANDROID_HOME:-}" ]; then
fi
if [ -z "${JAVA_HOME:-}" ]; then
echo "JAVA_HOME is not set, setting to Java 21"
echo "JAVA_HOME is not set, setting to Java 25"
if [ -f "/etc/debian_version" ]; then
echo "Debian-based distro, Java 21 is /usr/lib/jvm/java-21-openjdk-amd64"
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
echo "Debian-based distro, Java 25 is /usr/lib/jvm/java-25-openjdk-amd64"
export JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64
else
echo "Not Debian-based, assuming Fedora and setting Java 21 as /usr/lib/jvm/java-21-openjdk"
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
echo "Not Debian-based, assuming Fedora and setting Java 25 as /usr/lib/jvm/java-25-openjdk"
export JAVA_HOME=/usr/lib/jvm/java-25-openjdk
fi
fi
@@ -1 +1 @@
إصلاح التفاف النص في مربع حوار الإضافة
- إصلاح ملف النص في حوار الإضافة
@@ -1 +1 @@
- Opravena změna vzniknuvší ve verzi 2.41.0, která rozbila podpo
- Opravena změna vzniknuvší ve verzi 2.41.0, která rozbila podporu některých čteček u čárových kódů v jiném formátu než UTF-8
@@ -0,0 +1,3 @@
- Zakázání NFC ve výchozím nastavení během zobrazování karty
- Požádání klávesnice o velké písmeno na začátku každého slova při úpravě názvu
- Do názvu souboru s exportem umístěno datum
@@ -0,0 +1,3 @@
- NFC standardmäßig deaktivieren während eine Karte gezeigt wird
- Jedes Wort des Namens einer Karte im Bearbeitungsbildschirm in Kapitälchen speichern
- Datum dem Namen der Exportdatei hinzufügen
@@ -1,2 +1,2 @@
- Hinzufügen von Unterstützung für das Hinzufügen von Treuekarten-Verknüpfungen über den Launcher/Homescreen. (Pull #161 (https://github.com/brarcher/loyalty-card-locker/pull/161))
- Entfernen Sie die Unterstützung für das Hinzufügen von Treuekartenverknüpfungen aus der App selbst. Damit entfällt die Notwendigkeit für die Verknüpfungsberechtigung. (Pull #163 (https://github.com/brarcher/loyalty-card-locker/pull/163))
- Unterstützung für das Hinzufügen von Treuekarten-Verknüpfungen über den Launcher/Homescreen. (Pull #161 (https://github.com/brarcher/loyalty-card-locker/pull/161))
- Unterstützung entfernt für das Hinzufügen von Treuekartenverknüpfungen aus der App selbst. Damit entfällt die Notwendigkeit für die Berechtigung für Verknüpfungen. (Pull #163 (https://github.com/brarcher/loyalty-card-locker/pull/163))
@@ -1,2 +1,2 @@
- Behebung eines Problems unter Android SDK 24+, bei dem die Verwendung der Importoption der Dateiauswahl zu einem Absturz führte. (Pull #170 (https://github.com/brarcher/loyalty-card-locker/pull/170))
- Behebung eines Fehlers mit Android SDK 24+, bei dem die Verwendung der Importoption der Dateiauswahl zu einem Absturz führte. (Pull #170 (https://github.com/brarcher/loyalty-card-locker/pull/170))
- Neues Symbol und Farbschema. (Pull #171 (https://github.com/brarcher/loyalty-card-locker/pull/171))
@@ -0,0 +1,3 @@
- Disable NFC while showing a card by default
- Ask keyboard to capitalize each word in store name in edit screen
- Put date in export file name
@@ -0,0 +1 @@
- Prevent crash on devices with misbehaving NFC
@@ -1,2 +1,2 @@
- Un cambio en la versión 0.11 redujo el uso de memoria para el dibujo de códigos de barras, pero afectó las dimensiones de los códigos de barras. Esto ahora se modificó para mantener las dimensiones de los códigos de barras y reducir el uso de memoria. (pull n.° 126 (https://github.com/brarcher/loyalty-card-locker/pull/126))
- Actualización de las traducciones al alemán y al francés. (pull #122 (https://github.com/brarcher/loyalty-card-locker/pull/122), pull #124 (https://github.com/brarcher/loyalty-card-locker/pull/124), pull #125 (https://github.com/brarcher/loyalty-card-locker/pull/125))
Un cambio en la versión v0.11 redujo el uso de memoria para el dibujo de códigos de barras, pero afectó las dimensiones de los códigos de barras. Esto ahora se modificó para mantener las dimensiones de los códigos de barras y reducir el uso de memoria.
Actualización de las traducciones al alemán y al francés
@@ -1,3 +1,3 @@
- Opción de bloquear orientación de la pantalla añadida cuando se muestra una tarjeta. Si esta bloqueada, la pantalla volteará a su orientación "natural" y rotación de esta será bloqueada. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
- Si una tarjeta es seleccionada de la pantalla principal pero no carga, la aplicación falla y enseña un mensaje. (pull #132 (https://github.com/brarcher/loyalty-card-locker/pull/132))
- Caso arreglado donde los ID's de disposición para el asistente de introducción no podían encontrarse. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
Opción de bloquear orientación de la pantalla añadida cuando se muestra una tarjeta. Si esta bloqueada, la pantalla volteará a su orientación "natural" y rotación de esta será bloqueada.
Si una tarjeta es seleccionada de la pantalla principal pero no carga, la aplicación falla y enseña un mensaje.
Caso arreglado donde los ID de disposición para el asistente de introducción no podían encontrarse.
@@ -0,0 +1,2 @@
Copia el ID de la tarjeta al portapapeles desde el cuadro de diálogo de visualización o mantén pulsado
Intercambia los campos de saldo y moneda para intentar reducir el redondeo no deseado
@@ -0,0 +1 @@
Corregir el estado y el color de la barra de navegación en la nueva actividad Acerca de
@@ -0,0 +1 @@
Se corrigió un cambio introducido en la versión 2.41.0 que provocó que algunos escáneres dejaran de ser compatibles con códigos de barras que no son UTF-8
@@ -0,0 +1,5 @@
Se agregó compatibilidad para añadir accesos directos a la pantalla de inicio al añadir o editar una tarjeta.
Se eliminó el widget, ya que no era un buen sustituto de los accesos directos.
Se corrigió la exportación de respaldos en Android 7+.
Se informó un tipo mime más preciso al exportar datos de respaldo.
Se corrigió un error que impedía editar una tarjeta
@@ -0,0 +1,2 @@
Seguimiento de la corrección en la versión 2.41.2 para tarjetas configuradas explícitamente en ISO-8859-1
Migrar tarjetas antiguas a ISO-8859-1 para corregir cambios repentinos de comportamiento en las tarjetas existentes
@@ -0,0 +1 @@
Desactive temporalmente la detección automática de codificación de códigos de barras (provoca fallos en demasiadas tarjetas)
@@ -0,0 +1,5 @@
Se corrigió un error que provocaba que el widget de lista abriera a veces la tarjeta incorrecta
Se corrigieron varios errores relacionados con el manejo de accesos directos
Se corrigió un error que impedía que la actividad "Acerca de" utilizara una barra de título en negra en modo OLED
Se eliminó por completo la detección automática de codificación de códigos de barras
Se expuso la codificación de códigos de barras a través de ContentProvider (utilizado por Gadgetbridge)
@@ -0,0 +1,2 @@
- Detectar automáticamente las URL en el ID de la tarjeta y hacerlas pulsables en la ventana emergente de detalles del ID de la tarjeta
- Corregir la actividad del selector de códigos de barras que mostraba cuadrados blancos en lugar de códigos de barras
@@ -0,0 +1,4 @@
A partir de esta versión, Android 5.0 y 5.1 ya no son compatibles. Si desea usar Catima en estas versiones, utilice la versión 2.41.6.
- Se corrigió un error que provocaba un cierre inesperado al cambiar de tarjeta con los botones de volumen si solo había una tarjeta disponible.
- Se corrigió un error que provocaba que el acceso directo volviera a la tarjeta anterior después de rotarla.
@@ -0,0 +1,3 @@
- Desactivar NFC al mostrar una tarjeta por defecto
- Solicitar al teclado que ponga en mayúscula cada palabra del nombre de la tienda en la pantalla de edición
- Incluir la fecha en el nombre del archivo de exportación
@@ -0,0 +1,3 @@
Se corrigió un error que provocaba el cierre inesperado de la aplicación al importar ciertos tipos de archivos CSV dañados.
Se corrigió la importación de copias de seguridad directamente desde el sistema de archivos.
Se corrigió la importación de copias de seguridad desde ciertos proveedores de contenido
@@ -0,0 +1,3 @@
Agregar un espacio en blanco al principio/final de los códigos de barras.
Agregar opciones para configurar los colores utilizados para la fuente y el fondo del nombre de la tienda.
Agregar opciones para ajustar el tamaño de la fuente en la página de listado de tarjetas y en la página de cada tarjeta individual
@@ -0,0 +1,4 @@
Actualizar las traducciones. (pull #208
Actualizaciones de presentación de códigos de barras:
Recargar la actividad de vista de la tarjeta cuando la pantalla está rota, por lo que la imagen de código de barras es el tamaño correcto.
Render códigos de barras 1D en un espacio más grande, permitiéndoles rellenar mejor la pantalla.
@@ -1,2 +1,2 @@
- Reducir el espacio en el encabezado al visualizar una tarjeta.
- Desactivar el pitido al escanear un código de barras.
Reducir el espacio en el encabezado al visualizar una tarjeta.
Desactivar el pitido al escanear un código de barras.
@@ -0,0 +1 @@
- Evita que la aplicación se bloquee cuando la renderización de un código de barras agota su memoria. (pull #219 (https://github.com/brarcher/loyalty-card-locker/pull/219))
@@ -0,0 +1,2 @@
- Un aproximadamente el diálogo puede ser abierto de la pantalla principal, el cual da detalles sobre la aplicación y proyecto encima GitHub
- Dejar información de carta de la lealtad para ser importado de/exportado a un archivo CSV en almacenamiento externo
@@ -0,0 +1,4 @@
- Agrega mantenimiento para escalada de la barra de código cuando se mueva a la cima que quepa aún más escáneres pequeños
- Corrige la capa inferior que salta después de cambiar a pantalla completa
- Encabezamiento de Marca en vista pequeña de tarjeta de la lealtad en modo de paisaje
- Corrige cartas no quedándose en agrupar cuando el grupo obtiene renombrado
@@ -0,0 +1 @@
- Reparado Cuelgue en versiones antes de que Androide 7
@@ -0,0 +1,3 @@
- Apoyar Bóveda de Vale importador (https://github.com/tim-smart/vouchervault/) exportaciones
- Opción para mantener la pantalla encima mientras viendo una carta de lealtad
- Opción para suspender la pantalla de cerradura mientras viendo una carta de lealtad
@@ -0,0 +1,4 @@
- Apoya importar Fidme (https://play.google.com/store/apps/details?id=fr.snapp.fidme) exportaciones
- Dejar importando una carta de un cuadro almacenado en la galería de Androide del usuario
- Fijar multilinea nota cutoff
- Cambio "Gracias" texto encima diálogo de intimidad para "Aceptar" porque Huawei es demasiado pedante
@@ -0,0 +1,6 @@
- Añadir opción para establecer un valor de código de barras separado del ID de tarjeta
- Simplifique la configuración de tamaño de fuentes
- Varias pequeñas UI fija
- Use icono de letra para atajos también
- Mostrar siempre todos los tipos de códigos de barras en la entrada manual
- Eliminar la política de privacidad primero iniciar diálogo
@@ -0,0 +1,4 @@
- Apoyo a la nueva exportación PDF417 de Voucher Vault
- Soporte copiando múltiples códigos de barras a la vez
- Apoyo compartir múltiples tarjetas de fidelidad a la vez
- Solicitar actualizar el valor de código de barras si cambia el ID de tarjeta
@@ -0,0 +1,3 @@
- Agregue el ID de código de barras que falta para exportar
- No muestre la actualización del diálogo de códigos de barras si el valor es igual al ID de tarjeta
- Añadir traducción finlandesa
@@ -0,0 +1,2 @@
- Pulsación larga de una carta trae arriba opción para copiar carta ID al portapapeles. (atracción #49 (https://github.com/brarcher/loyalty-card-locker/issues/49))
- Botón Posterior encima vista/de Exportación de la Importación ahora obras, moviendo usuario a vista principal
Loaded 100 of 203 files, more files were not shown because too many files have changed in this diff. Show more