Compare commits

...

182 Commits

Author SHA1 Message Date
Sylvia van Os
7c54c01dfe Release Catima 2.5.0 2021-09-10 20:58:17 +02:00
Sylvia van Os
5709c8dbec Fix spotBugs 2021-09-10 19:30:10 +02:00
Sylvia van Os
0f434d7fe7 Merge pull request #387 from TheLastProject/create-pull-request/patch-1631269680
Update contributors
2021-09-10 12:29:51 +02:00
TheLastProject
a2d7e70431 Update contributors 2021-09-10 10:28:00 +00:00
Sylvia van Os
0c0c462372 Merge pull request #386 from weblate/weblate-catima-catima
Translations update from Weblate
2021-09-10 12:27:31 +02:00
Oğuz Ersen
f630539d9a Translated using Weblate (Turkish)
Currently translated at 9.8% (8 of 81 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-09-10 07:35:44 +02:00
Oğuz Ersen
7e27ddcc94 Translated using Weblate (Turkish)
Currently translated at 100.0% (199 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-09-10 07:35:43 +02:00
Nyatsuki
f9b61c24e9 Translated using Weblate (Japanese)
Currently translated at 99.4% (198 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-09-10 07:35:41 +02:00
IllusiveMan196
d26a138e3e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (199 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-09-10 07:35:40 +02:00
solokot
e695a4e993 Translated using Weblate (Russian)
Currently translated at 100.0% (199 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-09-10 07:35:40 +02:00
Heimen Stoffels
8cae6aed4a Translated using Weblate (Dutch)
Currently translated at 100.0% (199 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-09-10 07:35:40 +02:00
Allan Nordhøy
56b72dd544 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.4% (198 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-09-10 07:35:40 +02:00
Gediminas Murauskas
b935b30e00 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (199 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-09-10 07:35:40 +02:00
J. Lavoie
b9a6c6248d Translated using Weblate (Italian)
Currently translated at 100.0% (199 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-09-10 07:35:39 +02:00
J. Lavoie
09d8703545 Translated using Weblate (French)
Currently translated at 100.0% (199 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-09-10 07:35:39 +02:00
J. Lavoie
6e25211f12 Translated using Weblate (German)
Currently translated at 100.0% (199 of 199 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-09-10 07:35:39 +02:00
Sylvia van Os
6f1dc74f66 Consistent barcode naming 2021-09-10 00:49:06 +02:00
Sylvia van Os
61b1317fc5 Fix dots increasing each onResume 2021-09-09 22:48:02 +02:00
Sylvia van Os
129ee2d5aa Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-09-08 23:14:00 +02:00
Sylvia van Os
2358ea1f89 Swipe logic fixes 2021-09-08 23:13:43 +02:00
Sylvia van Os
87a172afd5 Merge pull request #384 from TheLastProject/create-pull-request/patch-1631124290
Update Fastlane changelogs
2021-09-08 20:05:30 +02:00
TheLastProject
5a64b6996e Update Fastlane changelogs 2021-09-08 18:04:50 +00:00
Sylvia van Os
9ba07982bf Don't reset group on back button press 2021-09-08 20:04:19 +02:00
Sylvia van Os
98c41ec003 Merge pull request #383 from TheLastProject/create-pull-request/patch-1631118155
Update contributors
2021-09-08 18:23:16 +02:00
TheLastProject
bc9875e7fc Update contributors 2021-09-08 16:22:34 +00:00
Sylvia van Os
b8bc7eded3 Merge pull request #382 from weblate/weblate-catima-catima
Translations update from Weblate
2021-09-08 18:22:06 +02:00
Oğuz Ersen
6625deadf7 Added translation using Weblate (Turkish) 2021-09-08 16:28:03 +02:00
Sylvia van Os
c781e4ff4e Merge pull request #380 from weblate/weblate-catima-catima
Translations update from Weblate
2021-09-07 19:51:37 +02:00
Joel A
b5a2508027 Translated using Weblate (Swedish)
Currently translated at 4.9% (4 of 81 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2021-09-07 19:51:22 +02:00
github-actions[bot]
4916917ac9 Update Fastlane changelogs (#381)
Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-09-07 19:51:19 +02:00
Sylvia van Os
4f9b1dae04 Show first image as main (#377) 2021-09-07 19:50:26 +02:00
Sylvia van Os
9b841399f7 Merge pull request #379 from TheLastProject/create-pull-request/patch-1630965291
Update contributors
2021-09-06 23:55:36 +02:00
TheLastProject
45fdc81aa7 Update contributors 2021-09-06 21:54:51 +00:00
Sylvia van Os
fdb28a3e52 Merge pull request #378 from weblate/weblate-catima-catima
Translations update from Weblate
2021-09-06 23:54:23 +02:00
Joel A
a151a9334e Translated using Weblate (Swedish)
Currently translated at 3.7% (3 of 81 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2021-09-06 23:34:40 +02:00
Sylvia van Os
618c7a294d Merge pull request #376 from TheLastProject/create-pull-request/patch-1630874360
Update contributors
2021-09-05 22:39:57 +02:00
TheLastProject
f926d61213 Update contributors 2021-09-05 20:39:19 +00:00
Sylvia van Os
d572add506 Merge pull request #375 from weblate/weblate-catima-catima
Translations update from Weblate
2021-09-05 22:38:51 +02:00
Joel A
012da7397f Translated using Weblate (Swedish)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-09-05 22:34:42 +02:00
109247019824
92e4908ea8 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-09-05 22:34:42 +02:00
IllusiveMan196
a051d628ab Translated using Weblate (Ukrainian)
Currently translated at 3.7% (3 of 81 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2021-09-05 22:34:42 +02:00
Nyatsuki
0116346035 Translated using Weblate (Japanese)
Currently translated at 99.4% (197 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-09-05 22:34:41 +02:00
IllusiveMan196
3049b7b0ae Translated using Weblate (Ukrainian)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-09-05 22:34:41 +02:00
solokot
0c484d26ee Translated using Weblate (Russian)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-09-05 22:34:41 +02:00
Heimen Stoffels
55bea5262e Translated using Weblate (Dutch)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-09-05 22:34:40 +02:00
Allan Nordhøy
f64d0dcc16 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.4% (197 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-09-05 22:34:40 +02:00
Gediminas Murauskas
ad23a671a2 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-09-05 22:34:40 +02:00
J. Lavoie
718e6b433d Translated using Weblate (Italian)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-09-05 22:34:40 +02:00
J. Lavoie
65e2965df2 Translated using Weblate (French)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-09-05 22:34:39 +02:00
J. Lavoie
2bf815942c Translated using Weblate (German)
Currently translated at 100.0% (198 of 198 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-09-05 22:34:39 +02:00
Sylvia van Os
b5547c5cdf Merge pull request #371 from TheLastProject/create-pull-request/patch-1630770974
Update Fastlane changelogs
2021-09-04 17:58:08 +02:00
TheLastProject
371fd00606 Update Fastlane changelogs 2021-09-04 15:56:14 +00:00
Sylvia van Os
4f2a448e7e Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-09-04 17:55:52 +02:00
Sylvia van Os
2755641e6b Fix could not read image not always appearing 2021-09-04 17:55:38 +02:00
Sylvia van Os
3e80066a68 Don't crash when selecting video in scan activity 2021-09-04 17:55:21 +02:00
Sylvia van Os
2e78f77be6 Merge pull request #368 from TheLastProject/create-pull-request/patch-1630691444
Update Fastlane changelogs
2021-09-03 19:52:24 +02:00
TheLastProject
d042d9a7e8 Update Fastlane changelogs 2021-09-03 17:50:44 +00:00
Sylvia van Os
c4064a2ed1 Fix various small accessibility issues 2021-09-03 19:50:17 +02:00
Sylvia van Os
0ac0fad091 Merge pull request #366 from weblate/weblate-catima-catima
Translations update from Weblate
2021-09-02 23:50:05 +02:00
mondstern
7fdad67ea4 Translated using Weblate (Slovak)
Currently translated at 35.0% (69 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2021-09-02 21:32:45 +02:00
Sylvia van Os
be21bc1654 Merge pull request #365 from TheLastProject/create-pull-request/patch-1630602047
Update contributors
2021-09-02 19:02:28 +02:00
TheLastProject
e65fb4390f Update contributors 2021-09-02 17:00:46 +00:00
Sylvia van Os
9f7bd4a0bd Update CONTRIBUTING.md 2021-09-02 19:00:07 +02:00
Sylvia van Os
b43817cbde Merge pull request #363 from weblate/weblate-catima-catima
Translations update from Weblate
2021-09-01 18:06:34 +02:00
Sylvia van Os
da0e2ebb99 Fix bad escaping 2021-09-01 17:23:29 +02:00
mondstern
aa87f33676 Translated using Weblate (Swedish)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-09-01 17:14:49 +02:00
mondstern
4e7d4383e8 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-09-01 17:14:49 +02:00
mondstern
0702aa1c79 Translated using Weblate (Esperanto)
Currently translated at 53.8% (106 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/eo/
2021-09-01 17:14:49 +02:00
mondstern
cd97f89d90 Translated using Weblate (Finnish)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2021-09-01 17:14:49 +02:00
Heimen Stoffels
eab6c4d2bd Translated using Weblate (Dutch)
Currently translated at 5.0% (4 of 80 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2021-09-01 17:14:49 +02:00
mondstern
20775cbc79 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-09-01 17:14:49 +02:00
mondstern
90ecb1997f Translated using Weblate (Slovenian)
Currently translated at 57.8% (114 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2021-09-01 17:14:49 +02:00
Allan Nordhøy
64b1483fa5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.4% (196 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-09-01 17:14:49 +02:00
mondstern
8365a719d8 Translated using Weblate (Spanish)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2021-09-01 17:14:49 +02:00
mondstern
068e793682 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-09-01 17:14:49 +02:00
Sylvia van Os
2e1c72e401 Fail build on bad translations 2021-09-01 17:14:38 +02:00
Sylvia van Os
3e213c6996 Unit tests are very unstable, retry once on fail 2021-09-01 12:32:30 +02:00
Sylvia van Os
ec65abadc3 PR consistency 2021-09-01 12:27:06 +02:00
Sylvia van Os
d24b56b5c1 Merge pull request #360 from TheLastProject/create-pull-request/patch
Update Fastlane changelogs
2021-08-31 20:38:09 +02:00
TheLastProject
b56f4e1653 Update Fastlane changelogs 2021-08-31 18:36:29 +00:00
Sylvia van Os
efba8773c5 Convert Markdown to simple link for Fastlane 2021-08-31 20:30:21 +02:00
Sylvia van Os
15339a8c44 Merge pull request #358 from TheLastProject/create-pull-request/patch
Update contributors
2021-08-31 18:13:47 +02:00
TheLastProject
050021de5c Update contributors 2021-08-31 16:12:42 +00:00
Sylvia van Os
16cff71cfb Merge pull request #357 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-31 18:12:10 +02:00
Heimen Stoffels
76226a319f Translated using Weblate (Dutch)
Currently translated at 5.0% (4 of 80 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2021-08-31 16:33:12 +02:00
Maciej Błędkowski
eed138a2fb Translated using Weblate (Polish)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2021-08-31 16:33:12 +02:00
Sylvia van Os
fd202fc940 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-08-30 21:36:29 +02:00
Sylvia van Os
5364b57cee Make PR instead of auto-committing 2021-08-30 21:35:51 +02:00
Sylvia van Os
3136b80f26 Merge pull request #356 from TheLastProject/create-pull-request/patch
Update Fastlane changelogs
2021-08-30 21:29:33 +02:00
TheLastProject
f3471b082f Update Fastlane changelogs 2021-08-30 19:28:21 +00:00
Sylvia van Os
9d24ef7791 Move to correct location 2021-08-30 21:27:55 +02:00
Sylvia van Os
6223ccd4bc Automatically Convert CHANGELOG to Fastlane 2021-08-30 21:26:30 +02:00
Sylvia van Os
a81cc27414 Add badges showing current available versions 2021-08-29 23:39:04 +02:00
Sylvia van Os
78481516b0 Bump versioncode 2021-08-29 16:38:07 +02:00
Sylvia van Os
423b74273e Release 2.4.0 2021-08-29 16:28:00 +02:00
Sylvia van Os
83e0a988d9 Improve contrast of cards 2021-08-29 16:14:32 +02:00
Sylvia van Os
1adea88ff1 Merge pull request #352 from TheLastProject/feature/cardLayout
Main screen card layout
2021-08-29 01:33:06 +02:00
Sylvia van Os
dda912c8c5 Update CHANGELOG 2021-08-29 01:27:47 +02:00
Sylvia van Os
f3b31bb306 Update screenshots 2021-08-29 01:27:10 +02:00
Sylvia van Os
3b31c4e05a Set min-height for long store names 2021-08-29 01:16:31 +02:00
Sylvia van Os
1155108086 Fix title layout issue 2021-08-29 00:46:36 +02:00
Sylvia van Os
73bb7ded09 Fix recyclerview not rendering all in unit test 2021-08-28 01:51:44 +02:00
Sylvia van Os
d8655eb631 Don't make cards bigger than needed 2021-08-28 01:42:19 +02:00
Sylvia van Os
55cddfef91 Fix incorrect data due to recycling 2021-08-28 01:39:33 +02:00
Sylvia van Os
c35dc736f4 Cleanup buggy code 2021-08-28 01:03:25 +02:00
Sylvia van Os
23b762a500 2 colums in landscape 2021-08-28 00:05:33 +02:00
Sylvia van Os
b9b638de45 Initial card layout 2021-08-27 23:42:03 +02:00
thelastproject/contributors-to-file
5f57507dda Update contributor list 2021-08-27 20:40:38 +00:00
Sylvia van Os
852eb6612c Merge pull request #351 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-27 22:40:04 +02:00
solokot
d96aac7bbf Translated using Weblate (Russian)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-08-27 22:32:54 +02:00
Allan Nordhøy
9018479959 Translated using Weblate (Norwegian Bokmål)
Currently translated at 90.8% (179 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-08-27 22:32:54 +02:00
Gediminas Murauskas
ce8a99e840 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-08-27 22:32:54 +02:00
J. Lavoie
9236f66bc6 Translated using Weblate (Italian)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-08-27 22:32:53 +02:00
J. Lavoie
37b3964351 Translated using Weblate (French)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-08-27 22:32:53 +02:00
J. Lavoie
a60d902fda Translated using Weblate (German)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-08-27 22:32:53 +02:00
Petr Novák
a97ce6f9aa Translated using Weblate (Czech)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2021-08-27 22:32:53 +02:00
waffshappen
a15bce04e8 German Translation (#349) 2021-08-26 00:03:39 +02:00
thelastproject/contributors-to-file
34fa68f852 Update contributor list 2021-08-25 21:31:08 +00:00
Sylvia van Os
e5fef55fc7 Ignore bots 2021-08-25 23:30:41 +02:00
Sylvia van Os
c5cca1b14d Merge pull request #348 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-25 23:24:45 +02:00
Heimen Stoffels
f34ec1cc4b Translated using Weblate (Dutch)
Currently translated at 100.0% (197 of 197 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-08-25 23:23:34 +02:00
solokot
95aafa5c99 Translated using Weblate (Russian)
Currently translated at 100.0% (196 of 196 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-08-25 23:23:34 +02:00
Heimen Stoffels
00160b0c45 Translated using Weblate (Dutch)
Currently translated at 100.0% (196 of 196 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-08-25 23:23:34 +02:00
Allan Nordhøy
a7e6d56bc9 Translated using Weblate (Norwegian Bokmål)
Currently translated at 91.3% (179 of 196 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-08-25 23:23:34 +02:00
Gediminas Murauskas
9dc8d5e2f4 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (196 of 196 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-08-25 23:23:34 +02:00
thelastproject/contributors-to-file
cf7cf679e0 Update contributor list 2021-08-25 21:23:31 +00:00
Sylvia van Os
4e7e0d9480 Fix pagination in contributors-to-file 2021-08-25 23:23:05 +02:00
thelastproject/contributors-to-file
fbb3013b20 Update contributor list 2021-08-25 20:57:46 +00:00
waffshappen
ca37e2aa84 Introduce a fallback text when a group is empty (#347) 2021-08-25 22:57:22 +02:00
Sylvia van Os
e6bf60d457 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-08-25 21:39:10 +02:00
Sylvia van Os
35835fda34 Make spotBugs happy 2021-08-25 21:38:52 +02:00
Sylvia van Os
a3133de6cf Merge pull request #346 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-25 21:27:31 +02:00
solokot
40fb10a2ec Translated using Weblate (Russian)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-08-25 21:18:16 +02:00
Sylvia van Os
856c735ba3 Add all contributors to About screen
You all are amazing, thank you for helping me make this app :)
2021-08-25 21:17:55 +02:00
thelastproject/contributors-to-file
16fb0df55d Update contributor list 2021-08-25 18:40:47 +00:00
Sylvia van Os
5658acbb07 Update contributor list on push not on schedule 2021-08-25 20:38:51 +02:00
Sylvia van Os
8b5faac0e0 Fix filename 2021-08-25 20:37:39 +02:00
Sylvia van Os
10be9b58ce Write contributors to file 2021-08-25 20:37:24 +02:00
Sylvia van Os
832840be08 Merge pull request #345 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-25 12:10:31 +02:00
Quentin PAGÈS
5806156495 Translated using Weblate (Occitan)
Currently translated at 37.4% (73 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/oc/
2021-08-25 11:32:59 +02:00
Petr Novák
0be9b908ab Translated using Weblate (Czech)
Currently translated at 66.6% (2 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2021-08-25 11:32:59 +02:00
IllusiveMan196
718d2b7567 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-08-25 11:32:58 +02:00
IllusiveMan196
fed9754908 Translated using Weblate (Russian)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-08-25 11:32:58 +02:00
solokot
c0e09ca429 Translated using Weblate (Russian)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-08-25 11:32:58 +02:00
Heimen Stoffels
4a3737b846 Translated using Weblate (Dutch)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-08-25 11:32:57 +02:00
Gediminas Murauskas
b4add4a0ea Translated using Weblate (Lithuanian)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-08-25 11:32:57 +02:00
J. Lavoie
5aabbd629e Translated using Weblate (Italian)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-08-25 11:32:57 +02:00
J. Lavoie
a5ef50317d Translated using Weblate (French)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-08-25 11:32:56 +02:00
J. Lavoie
48a8cc927a Translated using Weblate (German)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-08-25 11:32:56 +02:00
Petr Novák
cbb97d7d57 Translated using Weblate (Czech)
Currently translated at 100.0% (195 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2021-08-25 11:32:56 +02:00
Sylvia van Os
5eee344035 Don't close ScanActivity on camera error 2021-08-25 00:29:40 +02:00
Sylvia van Os
4c7e0c7174 Fix build 2021-08-23 18:40:48 +02:00
Sylvia van Os
37bb9c86f4 More small cleanups 2021-08-23 00:59:31 +02:00
Sylvia van Os
83ea6ffbf7 Cleanups 2021-08-22 16:16:27 +02:00
Sylvia van Os
f4945c2cd2 Merge pull request #342 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-22 10:45:01 +02:00
IllusiveMan196
24d9c7825a Translated using Weblate (Ukrainian)
Currently translated at 97.9% (191 of 195 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-08-22 02:43:38 +02:00
Sylvia van Os
2aa7bb4639 Update CHANGELOG 2021-08-22 01:29:14 +02:00
Subhashish Anand
110b3bcef3 Add theme colour support 2021-08-22 01:14:24 +02:00
Sylvia van Os
f625efc76d Merge pull request #341 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-21 21:36:27 +02:00
Sylvia van Os
22608a9802 Translated using Weblate (Dutch)
Currently translated at 100.0% (175 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-08-21 21:35:36 +02:00
Sylvia van Os
abf6c1328d Update importers list 2021-08-20 22:33:26 +02:00
Sylvia van Os
225058ab2b Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-08-19 21:26:04 +02:00
Sylvia van Os
275dc6caa2 Release Catima 2.3.0 2021-08-19 21:25:35 +02:00
Sylvia van Os
ceb7b12154 Merge pull request #335 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-18 17:41:48 +02:00
Luna Jernberg
849da26198 Translated using Weblate (Swedish)
Currently translated at 99.4% (174 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-08-18 17:36:39 +02:00
solokot
5808c991bb Translated using Weblate (Russian)
Currently translated at 100.0% (175 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-08-18 17:36:39 +02:00
Heimen Stoffels
e8554cb221 Translated using Weblate (Dutch)
Currently translated at 100.0% (175 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-08-18 17:36:39 +02:00
Allan Nordhøy
46092c060d Translated using Weblate (Norwegian Bokmål)
Currently translated at 90.2% (158 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-08-18 17:36:38 +02:00
Gediminas Murauskas
736eebd45c Translated using Weblate (Lithuanian)
Currently translated at 100.0% (175 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-08-18 17:36:38 +02:00
J. Lavoie
f72db53345 Translated using Weblate (Italian)
Currently translated at 100.0% (175 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-08-18 17:36:38 +02:00
J. Lavoie
b8c017259e Translated using Weblate (French)
Currently translated at 100.0% (175 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-08-18 17:36:38 +02:00
J. Lavoie
4b4a237b9a Translated using Weblate (German)
Currently translated at 100.0% (175 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-08-18 17:36:37 +02:00
Petr Novák
17034e992f Translated using Weblate (Czech)
Currently translated at 60.0% (105 of 175 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2021-08-18 17:36:37 +02:00
Sylvia van Os
bf143038b0 Update CHANGELOG 2021-08-17 22:46:53 +02:00
Sylvia van Os
73805ad3bb Fix importing images from export 2021-08-17 22:46:03 +02:00
Sylvia van Os
7006e35ebf Remove pages managed in Catima-Website repository 2021-08-16 18:23:03 +02:00
Sylvia van Os
fc598018b2 Remove duplicate Privacy Policy
It is managed in https://github.com/TheLastProject/Catima-Website/ now
2021-08-16 18:21:36 +02:00
Sylvia van Os
d01ec85c32 Merge pull request #332 from weblate/weblate-catima-catima
Translations update from Weblate
2021-08-15 22:23:59 +02:00
Nyatsuki
04ee918152 Translated using Weblate (Japanese)
Currently translated at 100.0% (172 of 172 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-08-15 22:18:44 +02:00
Tymofii Lytvynenko
943b70647b Translated using Weblate (Ukrainian)
Currently translated at 100.0% (172 of 172 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-08-15 22:18:44 +02:00
Sylvia van Os
edba5d5dca Add locale chooser (#304)
* Add locale chooser

* Prevent AppBundle crashes

* Reload activity on language change

* Make spotBugs happy
2021-08-15 22:18:40 +02:00
Sylvia van Os
86be5d1994 Update image-actions 2021-08-15 17:44:42 +02:00
184 changed files with 2732 additions and 1128 deletions

View File

@@ -13,6 +13,8 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Fail on bad translations
run: if grep -ri "&lt;xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
- uses: gradle/wrapper-validation-action@v1
- name: set up JDK 11
uses: actions/setup-java@v2
@@ -24,7 +26,7 @@ jobs:
- name: Check lint
run: ./gradlew lintRelease
- name: Run unit tests
run: ./gradlew testReleaseUnitTest
run: ./gradlew testReleaseUnitTest || ./gradlew testReleaseUnitTest
- name: SpotBugs
run: ./gradlew spotbugsRelease
- name: Archive test results

View File

@@ -10,20 +10,23 @@ on:
- '**.webp'
jobs:
build:
# Only run on Pull Requests within the same repository, and not from forks.
if: github.event.pull_request.head.repo.full_name == github.repository
name: calibreapp/image-actions
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
uses: actions/checkout@v2
- name: Compress Images
id: calibre
uses: calibreapp/image-actions@master
uses: calibreapp/image-actions@1.1.0
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
ignorePaths: 'app/src/test'
compressOnly: true
- name: Create New Pull Request If Needed
if: steps.calibre.outputs.markdown != ''
uses: peter-evans/create-pull-request@master
uses: peter-evans/create-pull-request@v3
with:
title: Compressed Images
branch-suffix: timestamp

View File

@@ -0,0 +1,25 @@
name: Convert CHANGELOG to Fastlane
on:
push:
branches: [ master ]
jobs:
convert_changelog_to_fastlane:
runs-on: ubuntu-latest
name: Convert CHANGELOG to Fastlane
steps:
- name: Checkout repo
id: checkout
uses: actions/checkout@v2
- name: Setup Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Run converter script
run: python .scripts/changelog_to_fastlane.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
title: "Update Fastlane changelogs"
commit-message: "Update Fastlane changelogs"
branch-suffix: timestamp

View File

@@ -0,0 +1,24 @@
name: Write contributors to file
on:
push:
branches: [ master ]
jobs:
contributors_to_file:
runs-on: ubuntu-latest
name: Write contributors to file
steps:
- name: Checkout repo
id: checkout
uses: actions/checkout@v2
- name: Update contributors
id: update_contributors
uses: TheLastProject/contributors-to-file-action@v2
with:
file_in_repo: app/src/main/res/raw/contributors.txt
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
title: "Update contributors"
commit-message: "Update contributors"
branch-suffix: timestamp

1
.gitignore vendored
View File

@@ -7,3 +7,4 @@ build/
captures/
**/release
**/debug
app/*.log

View File

@@ -0,0 +1,28 @@
#!/usr/bin/python3
import os
import re
changelogs = {}
with open('CHANGELOG.md') as changelog:
version_code = None
text = []
for line in changelog:
if line.startswith("## "):
if version_code != None:
changelogs[version_code] = text
text = []
match = re.match("## \S* - (\d*) \(\d{4}-\d{2}-\d{2}\)", line)
if not match:
raise ValueError(f"Invalid version line: {line}")
version_code = match.group(1)
elif line:
# Turn Markdown [links](to_url) into links (to_url)
text.append(re.sub(r'\[(.*?)\]\((.*?)\)', r'\1 (\2)', line))
for version, description in changelogs.items():
with open(os.path.join("fastlane", "metadata", "android", "en-US", "changelogs", f"{version}.txt"), "w") as fastlane_file:
fastlane_file.write("".join(description).strip())

View File

@@ -1,80 +1,77 @@
# Changelog
## v2.2.3 (2021-08-13)
## v2.5.0 - 82 (2021-09-10)
Changes:
- Improved support for screen readers
- Don't crash when trying to open a video from gallery
- Swipe support on loyalty card view screen
- Don't reset group on back button press
## v2.4.0 - 81 (2021-08-29)
- Improve card list for landscape and tablet display
- Add theming colour support (thanks, Subhashish Anand!)
- Don't close scan activity on camera error (so manual entry is still possible)
- Add all contributors to the about dialog
## v2.3.0 - 80 (2021-08-19)
- Fix images not imported from backup
- Option to override language
## v2.2.3 - 79 (2021-08-13)
- Fix widget creating different-looking shortcut than app shortcuts
- Replace default Android black screen with splash screen
## v2.2.2 (2021-08-08)
Changes:
## v2.2.2 - 78 (2021-08-08)
- Fix crash on rotation in loyalty card edit activity
## v2.2.1 (2021-08-07)
Changes:
## v2.2.1 - 77 (2021-08-07)
- Improve Stocard importer
- Fix importing Catima export with multiline note
- Scale card title in acceptable range
- Animation improvements
## v2.2.0 (2021-08-02)
Changes:
## v2.2.0 - 76 (2021-08-02)
- Make links in notes clickable
- Pre-select group the user is currently in when creating a new card
- Comma-separate group names in loyalty card view
- Fix maximize button appearing on no barcode
## v2.1.0 (2021-08-01)
Changes:
## v2.1.0 - 75 (2021-08-01)
- Fix selected colour in colour changing dialog
- Support for deleting multiple cards at once
- Fix possible ArithmeticException when resizing image
- Fix fullscreen is closed when rotating device
## v2.0.4 (2021-07-27)
Changes:
## v2.0.4 - 74 (2021-07-27)
- Fix shortcut creation
- Generate card-specific shortcut icon
- Fix ability to change loyalty card colour
## v2.0.3 (2021-07-25)
Changes:
## v2.0.3 - 73 (2021-07-25)
- Fix loading photos when editing existing card
## v2.0.2 (2021-07-25)
Changes:
## v2.0.2 - 72 (2021-07-25)
- Fix inability to configure photos in new loyalty card
## v2.0.1 (2021-07-21)
Changes:
## v2.0.1 - 71 (2021-07-21)
- Several minor translation and UI fixes
- Fix crash in import/sharing loyalty card on Android 6
## v2.0 (2021-07-14)
Breaking changes:
- The backup format changed, see https://github.com/TheLastProject/Catima/wiki/Export-format
- The URL sharing format changed, see https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format
Changes:
## v2.0 - 70 (2021-07-14)
- BREAKING CHANGE: The backup format changed, see https://github.com/TheLastProject/Catima/wiki/Export-format
- BREAKING CHANGE: The URL sharing format changed, see https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format
- Make it possible to enable or disable the flashlight while scanning
- Add UPC-E support
- Support adding a front and back photo to each card
@@ -85,26 +82,20 @@ Changes:
- Fix Floating Action Buttons being behind other UI elements on Android 4
- Fix loyalty card viewer appbar top margin
## v1.14.1 (2021-06-14)
Changes:
## v1.14.1 - 69 (2021-06-14)
- Add missing barcode ID to export
- Don't show update barcode dialog if value is the same as card ID
- Add Finnish translation
## v1.14 (2021-06-07)
Changes:
## v1.14 - 68 (2021-06-07)
- Support new PDF417 export from Voucher Vault
- Support copying multiple barcodes at once
- Support sharing multiple loyalty cards at once
- Ask to update barcode value if card ID changes
## v1.13 (2021-04-10)
Changes:
## v1.13 - 67 (2021-04-10)
- Add option to set a separate barcode value from card ID
- Simplify font sizing configuration
@@ -113,175 +104,125 @@ Changes:
- Always show all barcode types in manual entry
- Remove privacy policy first start dialog
## v1.12 (2021-03-30)
Changes:
## v1.12 - 66 (2021-03-30)
- Support importing [Fidme](https://play.google.com/store/apps/details?id=fr.snapp.fidme) exports
- Allow importing a card from a picture stored in the user's Android gallery
- Fix multiline note cutoff
- Change "Thank you" text on privacy dialog to "Accept" because Huawei is overly pedantic
## v1.11 (2021-03-21)
Changes:
## v1.11 - 64 (2021-03-21)
- Add privacy policy dialog on first start (required by Huawei)
## v1.10 (2021-03-07)
Changes:
## v1.10 - 63 (2021-03-07)
- Support importing [Voucher Vault](https://github.com/tim-smart/vouchervault/) exports
- Option to keep the screen on while viewing a loyalty card
- Option to suspend the lock screen while viewing a loyalty card
## v1.9.2 (2021-02-24)
Changes:
## v1.9.2 - 62 (2021-02-24)
- Fix parsing balance for countries using space as separator
## v1.9.1 (2021-02-23)
Changes:
## v1.9.1 - 61 (2021-02-23)
- Improve balance parsing logic
- Fix currency decimal display on main screen
## v1.9 (2021-02-22)
Changes:
## v1.9 - 59 (2021-02-22)
- Add balance support
- Reorganize barcode tab of edit view
## v1.8.1 (2021-02-12)
Changes:
## v1.8.1 - 58 (2021-02-12)
- Fix Crash on versions before Android 7
## v1.8 (2021-01-28)
Changes:
## v1.8 - 57 (2021-01-28)
- Add support for scaling the barcode when moving to top to fit even more small scanners
- Fix bottom sheet jumping after switching to fullscreen
- Make header in loyalty card view small in landscape mode
- Fix cards not staying in group when group gets renamed
## v1.7.1 (2021-01-18)
Changes:
## v1.7.1 - 56 (2021-01-18)
- Fix crash on switching to barcode tab in edit view if there is no barcode
## v1.7.0 (2021-01-18)
Changes:
## v1.7.0 - 55 (2021-01-18)
- Separate edit UI in tabs to make it feel more spacious
- Add expiry field support
## v1.6.2 (2021-01-04)
Changes:
## v1.6.2 - 54 (2021-01-04)
- Fix edit button or more info bottom sheet drawing over barcode ID
## v1.6.1 (2020-12-16)
Changes:
## v1.6.1 - 64 (2020-12-16)
- Fix regression causing manual barcode entry to not be saved
## v1.6.0 (2020-12-15)
Changes:
## v1.6.0 - 52 (2020-12-15)
- Automatically focus text field when creating or editing a group
- Fix blurry icons (use SVG everywhere)
- Always open camera but add manual scan button to camera view
## v1.5.1 (2020-12-03)
Changes:
## v1.5.1 - 51 (2020-12-03)
- Fix bottomsheet background being transparent
## v1.5.0 (2020-12-03)
Changes:
## v1.5.0 - 50 (2020-12-03)
- Improve contrast by always using white text on red buttons
- Draggable bottom sheet in loyalty card view
## v1.4.1 (2020-12-01)
Changes:
## v1.4.1 - 49 (2020-12-01)
- Improved translations
- Small UI fixes
## v1.4.0 (2020-11-28)
Changes:
## v1.4.0 - 48 (2020-11-28)
- Move About screen into its own activity
- Ask user if they want to use their camera or manually enter ID on add/edit card
- Make group ordering manual instead of forced alphabetically
## v1.3.0 (2020-11-22)
Changes:
## v1.3.0 - 47 (2020-11-22)
- Always show all import/export options and show a toast on actual issues (improves compat with XPrivacyLua)
- Ask for confirmation when leaving edit view after making changes without saving
## v1.2.2 (2020-11-19)
Changes:
## v1.2.2 - 46 (2020-11-19)
- Remember active group tab between screens and sessions
## v1.2.1 (2020-11-17)
Changes:
## v1.2.1 - 45 (2020-11-17)
- Fix home screen swiping triggering during vertical swipes too
## v1.2.0 (2020-11-17)
Changes:
## v1.2.0 - 44 (2020-11-17)
- Add swiping between groups on the home screen
- Fix crash with cards lacking header colour
## v1.1.0 (2020-11-11)
Changes:
## v1.1.0 - 43 (2020-11-11)
- Improved edit UI
- Removed header text colour option (now automatically generated based on brightness)
- Updated translations
## v1.0.1 (2020-11-07)
Changes:
## v1.0.1 - 42 (2020-11-07)
- Fix crash in search with no groups
## v1.0 (2020-11-06)
Changes:
## v1.0 - 41 (2020-11-06)
- Added rounded edges to card icons on main overview
- Added support for grouping entries
## v0.29 (2020-10-29)
Changes:
## v0.29 - 40 (2020-10-29)
- Rebrand to Catima
- Removed intro
@@ -290,31 +231,23 @@ Changes:
- Add favourites support
- Fix disabled auto-rotate being ignored
## v0.28 (2020-03-09)
Changes:
## v0.28 - 39 (2020-03-09)
- Fix barcode centering when exiting full screen ([#351](https://github.com/brarcher/loyalty-card-locker/pull/351))
- Allow backup export location to be selected ([#352](https://github.com/brarcher/loyalty-card-locker/pull/352))
- Update translations ([#357](https://github.com/brarcher/loyalty-card-locker/pull/357)) & ([#362](https://github.com/brarcher/loyalty-card-locker/pull/362))
## v0.27 (2020-01-26)
Changes:
## v0.27 - 38 (2020-01-26)
- Tapping on a barcode now moves it to the top of the screen ([#348](https://github.com/brarcher/loyalty-card-locker/pull/348))
- Add white space around barcodes to improve scanning in dark mode ([#328](https://github.com/brarcher/loyalty-card-locker/issues/328))
- Fix swapped import buttons. ([#346](https://github.com/brarcher/loyalty-card-locker/pull/346))
## v0.26.1 (2020-01-09)
Changes:
## v0.26.1 - 37 (2020-01-09)
- Fix issue with sharing cards without background color ([#343](https://github.com/brarcher/loyalty-card-locker/pull/343))
## v0.26 (2020-01-05)
Changes:
## v0.26 - 36 (2020-01-05)
- Add ability to search for a card ([#320](https://github.com/brarcher/loyalty-card-locker/pull/320))
- Add ability to share and receive loyalty cards ([#321](https://github.com/brarcher/loyalty-card-locker/pull/321))
@@ -331,57 +264,41 @@ Changes:
- Polish
- Russian
## v0.25.4 (2019-10-04)
Changes:
## v0.25.4 - 35 (2019-10-04)
- Enable app backups
- Update French and Slovenian translations
## v0.25.3 (2019-03-02)
Changes:
## v0.25.3 - 34 (2019-03-02)
- Update Russian translations
## v0.25.2 (2019-01-05)
Changes:
## v0.25.2 - 33 (2019-01-05)
- Update and add translations
## v0.25.1 (2018-10-14)
Changes:
## v0.25.1 - 32 (2018-10-14)
- Fix creating new card by manually entering barcode ([issue #272](https://github.com/brarcher/loyalty-card-locker/issues/272))
## v0.25 (2018-10-07)
Changes:
## v0.25 - 31 (2018-10-07)
- Sort card list case insensitive ([pull #266](https://github.com/brarcher/loyalty-card-locker/pull/266))
- Add setting to lock orientation for all cards ([pull #269](https://github.com/brarcher/loyalty-card-locker/pull/269)
## v0.24 (2018-07-31)
Changes:
## v0.24 - 30 (2018-07-31)
- Add a setting to control screen brightness when displaying a barcode ([pull #259](https://github.com/brarcher/loyalty-card-locker/pull/259))
- Add Greek translations ([pull #252](https://github.com/brarcher/loyalty-card-locker/pull/252))
- Add Slovenian translations ([pull #260](https://github.com/brarcher/loyalty-card-locker/pull/260))
- Update translations ([pull #260](https://github.com/brarcher/loyalty-card-locker/pull/260), [pull #254](https://github.com/brarcher/loyalty-card-locker/pull/254))
## v0.23.4 (2018-05-12)
Changes:
## v0.23.4 - 29 (2018-05-12)
- Fix Spanish translations ([pull #244](https://github.com/brarcher/loyalty-card-locker/pull/244))
- Update translations ([pull #244](https://github.com/brarcher/loyalty-card-locker/pull/244))
## v0.23.3 (2018-05-05)
Changes:
## v0.23.3 - 28 (2018-05-05)
- Added translations
- Polish ([pull #232](https://github.com/brarcher/loyalty-card-locker/pull/232))
@@ -389,87 +306,63 @@ Changes:
- Slovak ([pull #232](https://github.com/brarcher/loyalty-card-locker/pull/232))
- Updated translations ([pull #239](https://github.com/brarcher/loyalty-card-locker/pull/239))
## v0.23.2 (2018-03-11)
Changes:
## v0.23.2 - 27 (2018-03-11)
- Reduce min SDK from 17 to 15. ([pull #226](https://github.com/brarcher/loyalty-card-locker/pull/226))
- Remove usage of legacy apache library, used only in unit tests but no longer needed. ([pull #225](https://github.com/brarcher/loyalty-card-locker/pull/225))
## v0.23.1 (2018-03-07)
Changes:
## v0.23.1 - 26 (2018-03-07)
- Prevent crash when rendering a barcode exhausts the application's memory. ([pull #219](https://github.com/brarcher/loyalty-card-locker/pull/219))
## v0.23 (2018-02-28)
Changes:
## v0.23 - 25 (2018-02-28)
- Reduce space in header when viewing a card. ([pull #213](https://github.com/brarcher/loyalty-card-locker/pull/213))
- Disable beep when scanning a barcode. ([pull #216](https://github.com/brarcher/loyalty-card-locker/pull/216))
## v0.22 (2018-02-19)
Changes:
## v0.22 - 24 (2018-02-19)
- Update translations. ([pull #208](https://github.com/brarcher/loyalty-card-locker/pull/208))
- Barcode rendering updates: ([pull #209](https://github.com/brarcher/loyalty-card-locker/pull/209))
- Reload card view activity when screen is rotated, so barcode image is correct size.
- Render 1D barcodes in a larger space, allowing them to better fill the screen.
## v0.21 (2018-02-17)
Changes:
## v0.21 - 23 (2018-02-17)
- Add quiet space at the start/end of barcodes. ([pull #200](https://github.com/brarcher/loyalty-card-locker/pull/200))
- Add options to configure the colors used for the store name font and background. ([pull #203](https://github.com/brarcher/loyalty-card-locker/pull/203))
- Add options to adjust font sizes on the card listing page and single card page. ([pull #204](https://github.com/brarcher/loyalty-card-locker/pull/204))
## v0.20 (2018-02-10)
Changes:
## v0.20 - 22 (2018-02-10)
- Changes to Card view to display the note, allow the card ID to take multiple lines, and show the store name. ([pull #197](https://github.com/brarcher/loyalty-card-locker/pull/197))
## v0.19 (2018-02-01)
Changes:
## v0.19 - 21 (2018-02-01)
- Improved layout for card list. ([pull #188](https://github.com/brarcher/loyalty-card-locker/pull/188))
- Improved layout when viewing a card. ([pull #190](https://github.com/brarcher/loyalty-card-locker/pull/190))
## v0.18.1 (2018-01-24)
Changes:
## v0.18.1 - 20 (2018-01-24)
- Workaround crash during install on some Android versions (likely Android 5 and below). ([pull #184](https://github.com/brarcher/loyalty-card-locker/pull/184))
## v0.18 (2018-01-19)
Changes:
## v0.18 - 19 (2018-01-19)
- Fix crash when importing certain types of corrupted CSV files. ([pull #177](https://github.com/brarcher/loyalty-card-locker/pull/177))
- Fix importing backups directly from the file system. ([pull #180](https://github.com/brarcher/loyalty-card-locker/pull/180))
- Fix importing backups from certain types of content providers. ([pull #179](https://github.com/brarcher/loyalty-card-locker/pull/179))
## v0.17 (2018-01-11)
Changes:
## v0.17 - 18 (2018-01-11)
- Fix issue on Android SDK 24+ where using the file chooser import option would cause a crash. ([pull #170](https://github.com/brarcher/loyalty-card-locker/pull/170))
- New icon and color scheme. ([pull #171](https://github.com/brarcher/loyalty-card-locker/pull/171))
## v0.16 (2017-11-29)
Changes:
## v0.16 - 17 (2017-11-29)
- Add support for adding loyalty card shortcuts from the launcher/homescreen. ([pull #161](https://github.com/brarcher/loyalty-card-locker/pull/161))
- Remove support for adding loyalty card shortcuts from the app itself. This removes the need for the shortcut permission. ([pull #163](https://github.com/brarcher/loyalty-card-locker/pull/163))
## v0.15 (2017-11-25)
Changes:
## v0.15 - 16 (2017-11-25)
- Add support for adding shortcuts to home screen when adding or editing a card. ([pull #155](https://github.com/brarcher/loyalty-card-locker/pull/155))
- Remove widget, as it was a poor substitute for shortcuts. ([pull #155](https://github.com/brarcher/loyalty-card-locker/pull/155))
@@ -477,37 +370,27 @@ Changes:
- Report more accurate mime type when exporting backup data. ([pull #156](https://github.com/brarcher/loyalty-card-locker/pull/156))
- Fix bug where a card could not be edited. ([pull #155](https://github.com/brarcher/loyalty-card-locker/pull/155))
## v0.14 (2017-10-26)
Changes:
## v0.14 - 15 (2017-10-26)
- Add support for app shortcuts (Android 7.1+), where the most recently used cards will appear as shortcuts. ([pull #145](https://github.com/brarcher/loyalty-card-locker/pull/145))
- Add a widget which works like a pinned app shortcut, to support devices which run below Android 7.1. ([pull #142](https://github.com/brarcher/loyalty-card-locker/pull/142))
## v0.13 (2017-07-25)
Changes:
## v0.13 - 14 (2017-07-25)
- Add screen rotation lock menu option when displaying a card. If locked, the screen will transition to its "natural" orientation and further screen rotation will be blocked. ([pull #128](https://github.com/brarcher/loyalty-card-locker/pull/128))
- If a card is selected from the main screen but cannot be loaded, the application fails gracefully and posts a message. ([pull #132](https://github.com/brarcher/loyalty-card-locker/pull/132))
- Fix case where layout IDs for intro wizard could not be found. ([pull #128](https://github.com/brarcher/loyalty-card-locker/pull/128))
## v0.12 (2017-07-16)
Changes:
## v0.12 - 13 (2017-07-16)
- A change in v0.11 reduced the memory usage of barcode drawing, but affected the barcode dimensions. This is now changed to maintain the barcode dimensions while reducing memory usage. ([pull #126](https://github.com/brarcher/loyalty-card-locker/pull/126))
- Update German and French translations. ([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))
## v0.11.1 (2017-06-29)
Changes:
## v0.11.1 - 12 (2017-06-29)
- Prevent a crash when rotation the screen in the first run intro wizard.
## v0.11 (2017-06-26)
Improvements:
## v0.11 - 11 (2017-06-26)
- When editing a card ID, pre-populate the existing ID to start. ([pull #94](https://github.com/brarcher/loyalty-card-locker/pull/94))
- Limit the width of generated barcodes to reduce memory usage and out of memory errors. ([pull #103](https://github.com/brarcher/loyalty-card-locker/pull/103))
@@ -515,15 +398,13 @@ Improvements:
- Change the color scheme to be softer and compatible with the app icon, and change the layout when viewing a card to be cleaner. ([pull #107](https://github.com/brarcher/loyalty-card-locker/pull/107))
- Add an intro wizard which launches on the app's first launch. ([pull #108](https://github.com/brarcher/loyalty-card-locker/pull/108))
## v0.10 (2017-02-12)
Improvements:
## v0.10 - 10 (2017-02-12)
- Changed the default import/export filename. ([pull #84](https://github.com/brarcher/loyalty-card-locker/pull/84))
- Correct string on the import/export page. ([pull #87](https://github.com/brarcher/loyalty-card-locker/pull/87))
- Improve layout of card view page. The text should be easier to read, and is selectable with a long click. ([pull #91](https://github.com/brarcher/loyalty-card-locker/pull/91))
## v0.9 (2017-01-17)
## v0.9 - 9 (2017-01-17)
The "Locker" part of the name was not intuitive. To help remedy this a new application icon was created by betsythefc which better represents the purpose of the application: to store loyalty cards which use barcodes. Along with this new icon the name of the application has been changed to "Loyalty Card Keychain".
@@ -533,55 +414,36 @@ Additional features/improvements:
- Translations for Lithuanian added. ([pull #62](https://github.com/brarcher/loyalty-card-locker/pull/62))
- Translations for French added. ([pull #80](https://github.com/brarcher/loyalty-card-locker/pull/80))
## v0.8 (2016-11-22)
New features/improvements:
## v0.8 - 8 (2016-11-22)
- Screen brightness increased to its maximum when displaying a card, to help barcode scanners successfully capture the barcode. ([pull #54](https://github.com/brarcher/loyalty-card-locker/pull/54))
- Add a delete confirmation when deleting a card. ([pull #55](https://github.com/brarcher/loyalty-card-locker/pull/55))
- Add translations for German ([pull #57](https://github.com/brarcher/loyalty-card-locker/pull/57)) and Czech ([pull #58](https://github.com/brarcher/loyalty-card-locker/pull/58)).
- Clarification change for Italian translation. ([pull #66](https://github.com/brarcher/loyalty-card-locker/pull/66))
## v0.7 (2016-07-14)
New features/improvements:
## v0.7 - 7 (2016-07-14)
- Long-click of a card brings up option to copy card ID to the clipboard. ([pull #49](https://github.com/brarcher/loyalty-card-locker/issues/49))
Bug fixes:
- Back button on Input/Export view now works, moving user to main view
## v0.6 (2016-05-23)
New features/improvements:
## v0.6 - 6 (2016-05-23)
- Allow user to enter barcode manually. If a user elects to enter a barcode manually, a list of all valid and supported barcode images is displayed. The user then may select the barcode image which matches what the user wants. [issue #33](https://github.com/brarcher/loyalty-card-locker/issues/33), [pull #44](https://github.com/brarcher/loyalty-card-locker/pull/44)
Bug fixes:
- Resolve issue where some displayed barcodes were blurry. ([issue #37](https://github.com/brarcher/loyalty-card-locker/issues/37))
## v0.5 (2016-05-16)
New features/improvements:
## v0.5 - 5 (2016-05-16)
- An about dialog can be opened from the main screen, which gives details about the application and project on GitHub ([issue #19](https://github.com/brarcher/loyalty-card-locker/issues/19))
- Allow loyalty card information to be imported from/exported to a CSV file in external storage ([issue #36](https://github.com/brarcher/loyalty-card-locker/issues/36), [issue #20](https://github.com/brarcher/loyalty-card-locker/issues/20))
## v0.4 (2016-04-09)
New features/improvements:
## v0.4 - 4 (2016-04-09)
- Dutch translation
- Allow name field to be editable after adding loyalty card
- Add an optional note field
Bug fixes:
- Resolve all issues identified by FindBugs and require all FindBugs issues be resolved prior to pull request acceptance
## v0.3 (2016-02-11)
## v0.3 - 3 (2016-02-11)
- Now officially supports the following list of 1D and 2D barcodes:
- AZTEC
@@ -598,13 +460,13 @@ Bug fixes:
- Generated barcodes are larger, easier to scan from a scanning device
## v0.2 (2016-02-07)
## v0.2 - 2 (2016-02-07)
- Italian translations
- Support for all 1D barcode types. (Originally only product 1D barcodes were supported)
- Add required camera permission, which was initially missing.
## v0.1 (2016-01-30)
## v0.1 - 1 (2016-01-30)
- Ability to create/edit/delete loyalty cards
- Capture barcode of loyalty card using a camera

View File

@@ -1,9 +1,9 @@
How to Submit Patches to the Loyalty Card Keychain Project
How to Submit Patches to the Catima Project
===============================================================================
https://github.com/brarcher/budget-watch
https://github.com/TheLastProject/Catima
This document is intended to act as a guide to help you contribute to the
Loyalty Card Keychain project. It is not perfect, and there will always be exceptions
Catima project. It is not perfect, and there will always be exceptions
to the rules described here, but by following the instructions below you
should have a much easier time getting your work merged with the upstream
project.
@@ -21,16 +21,16 @@ These are the Android lint checker, run using:
# ./gradlew lintRelease
and FindBugs, run using:
and SpotBugs, run using:
# ./gradlew findbugs
# ./gradlew spotbugsRelease
The final check is by testing the application on a live device and verifying
the basic functionality works as expected.
## Make Sure Your Code is Tested
The Loyalty Card Keychain code uses a fair number of unit tests to verify that
The Catima code uses a fair number of unit tests to verify that
the basic functionality is working. Submissions which add functionality
or significantly change the existing code should include additional tests
to verify the proper operation of the proposed changes.
@@ -85,7 +85,7 @@ your real name, saying:
## Submit Patch(es) for Review
Finally, you will need to submit your patches so that they can be reviewed
and potentially merged into the main Loyalty Card Keychain repository. The preferred
way to do this is to submit a Pull Request to the Loyalty Card Keychain project.
and potentially merged into the main Catima repository. The preferred
way to do this is to submit a Pull Request to the Catima project.
Changes need to apply cleanly onto the master branch and pass all
unit tests and produce no errors during static analysis.

View File

@@ -18,8 +18,8 @@ android {
applicationId "me.hackerchick.catima"
minSdkVersion 19
targetSdkVersion 30
versionCode 79
versionName "2.2.3"
versionCode 82
versionName "2.5.0"
vectorDrawables.useSupportLibrary true
multiDexEnabled true
@@ -37,6 +37,12 @@ android {
}
}
bundle {
language {
enableSplit = false
}
}
compileOptions {
encoding "UTF-8"

View File

@@ -83,7 +83,8 @@
android:windowSoftInputMode="stateHidden"/>
<activity
android:name=".preferences.SettingsActivity"
android:label="@string/settings"/>
android:label="@string/settings"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".ImportExportActivity"
android:label="@string/importExport"

View File

@@ -8,16 +8,19 @@ import android.util.Log;
import android.view.MenuItem;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.text.HtmlCompat;
public class AboutActivity extends AppCompatActivity
public class AboutActivity extends CatimaAppCompatActivity
{
private static final String TAG = "Catima";
@@ -25,6 +28,7 @@ public class AboutActivity extends AppCompatActivity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle(R.string.about);
setContentView(R.layout.about_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -34,6 +38,24 @@ public class AboutActivity extends AppCompatActivity
actionBar.setDisplayHomeAsUpEnabled(true);
}
StringBuilder contributors = new StringBuilder().append("<br/>");
BufferedReader reader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.contributors), StandardCharsets.UTF_8));
try {
while (true) {
String tmp = reader.readLine();
if (tmp == null || tmp.isEmpty()) {
reader.close();
break;
}
contributors.append("<br/>");
contributors.append(tmp);
}
} catch (IOException ignored) {}
final List<ThirdPartyInfo> USED_LIBRARIES = new ArrayList<>();
USED_LIBRARIES.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
@@ -48,13 +70,13 @@ public class AboutActivity extends AppCompatActivity
StringBuilder libs = new StringBuilder().append("<br/>");
for (ThirdPartyInfo entry : USED_LIBRARIES)
{
libs.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")<br/>");
libs.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")");
}
StringBuilder resources = new StringBuilder().append("<br/>");
for (ThirdPartyInfo entry : USED_ASSETS)
{
resources.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")<br/>");
resources.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")");
}
String appName = getString(R.string.app_name);
@@ -87,6 +109,8 @@ public class AboutActivity extends AppCompatActivity
"<br/><br/>" +
getString(R.string.app_license) +
"<br/><br/>" +
String.format(getString(R.string.app_contributors), contributors.toString()) +
"<br/><br/>" +
String.format(getString(R.string.app_libraries), libs.toString()) +
"<br/><br/>" +
String.format(getString(R.string.app_resources), resources.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));

View File

@@ -1,5 +1,6 @@
package protect.card_locker;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff;
@@ -26,6 +27,7 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
private static final String TAG = "Catima";
private static final int IS_VALID = 999;
private Context mContext;
private boolean isSuccesful;
// When drawn in a smaller window 1D barcodes for some reason end up
@@ -36,16 +38,18 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
private final WeakReference<ImageView> imageViewReference;
private final WeakReference<TextView> textViewReference;
private String cardId;
private final BarcodeFormat format;
private final CatimaBarcode format;
private final int imageHeight;
private final int imageWidth;
private final boolean showFallback;
private final Runnable callback;
BarcodeImageWriterTask(ImageView imageView, String cardIdString,
BarcodeFormat barcodeFormat, TextView textView,
BarcodeImageWriterTask(Context context, ImageView imageView, String cardIdString,
CatimaBarcode barcodeFormat, TextView textView,
boolean showFallback, Runnable callback)
{
mContext = context;
isSuccesful = true;
this.callback = callback;
@@ -74,9 +78,9 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
this.showFallback = showFallback;
}
private int getMaxWidth(BarcodeFormat format)
private int getMaxWidth(CatimaBarcode format)
{
switch(format)
switch(format.format())
{
// 2D barcodes
case AZTEC:
@@ -104,9 +108,9 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
}
}
private String getFallbackString(BarcodeFormat format)
private String getFallbackString(CatimaBarcode format)
{
switch(format)
switch(format.format())
{
// 2D barcodes
case AZTEC:
@@ -153,7 +157,7 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
{
try
{
bitMatrix = writer.encode(cardId, format, imageWidth, imageHeight, null);
bitMatrix = writer.encode(cardId, format.format(), imageWidth, imageHeight, null);
}
catch(Exception e)
{
@@ -243,9 +247,12 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
return;
}
String formatPrettyName = format.prettyName();
imageView.setTag(isSuccesful);
imageView.setImageBitmap(result);
imageView.setContentDescription(mContext.getString(R.string.barcodeImageDescriptionWithType, formatPrettyName));
TextView textView = textViewReference.get();
if(result != null)
@@ -261,7 +268,7 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
if (textView != null) {
textView.setVisibility(View.VISIBLE);
textView.setText(format.name());
textView.setText(formatPrettyName);
}
}
else

View File

@@ -24,7 +24,6 @@ import java.util.LinkedList;
import java.util.Map;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
/**
@@ -33,7 +32,7 @@ import androidx.appcompat.widget.Toolbar;
* the data. The user may then select any barcode, where its
* data and type will be returned to the caller.
*/
public class BarcodeSelectorActivity extends AppCompatActivity
public class BarcodeSelectorActivity extends CatimaAppCompatActivity
{
private static final String TAG = "Catima";
@@ -41,25 +40,6 @@ public class BarcodeSelectorActivity extends AppCompatActivity
public static final String BARCODE_CONTENTS = "contents";
public static final String BARCODE_FORMAT = "format";
// These are all the barcode types that the zxing library
// is able to generate a barcode for, and thus should be
// the only barcodes which we should attempt to scan.
public static final Collection<String> SUPPORTED_BARCODE_TYPES = Collections.unmodifiableList(
Arrays.asList(
BarcodeFormat.AZTEC.name(),
BarcodeFormat.CODE_39.name(),
BarcodeFormat.CODE_128.name(),
BarcodeFormat.CODABAR.name(),
BarcodeFormat.DATA_MATRIX.name(),
BarcodeFormat.EAN_8.name(),
BarcodeFormat.EAN_13.name(),
BarcodeFormat.ITF.name(),
BarcodeFormat.PDF_417.name(),
BarcodeFormat.QR_CODE.name(),
BarcodeFormat.UPC_A.name(),
BarcodeFormat.UPC_E.name()
));
private Map<String, Pair<Integer, Integer>> barcodeViewMap;
private LinkedList<AsyncTask> barcodeGeneratorTasks = new LinkedList<>();
@@ -67,7 +47,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle(R.string.selectBarcodeTitle);
setContentView(R.layout.barcode_selector_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -137,47 +117,34 @@ public class BarcodeSelectorActivity extends AppCompatActivity
private void setButtonListener(final View button, final String cardId)
{
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "Selected no barcode");
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, "");
result.putExtra(BARCODE_CONTENTS, cardId);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
}
button.setOnClickListener(view -> {
Log.d(TAG, "Selected no barcode");
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, "");
result.putExtra(BARCODE_CONTENTS, cardId);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
});
}
private void createBarcodeOption(final ImageView image, final String formatType, final String cardId, final TextView text)
{
final BarcodeFormat format = BarcodeFormat.valueOf(formatType);
if(format == null)
{
Log.w(TAG, "Unsupported barcode format: " + formatType);
return;
}
final CatimaBarcode format = CatimaBarcode.fromName(formatType);
image.setImageBitmap(null);
image.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.d(TAG, "Selected barcode type " + formatType);
image.setOnClickListener(v -> {
Log.d(TAG, "Selected barcode type " + formatType);
if (!((boolean) image.getTag())) {
Toast.makeText(BarcodeSelectorActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
return;
}
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, formatType);
result.putExtra(BARCODE_CONTENTS, cardId);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
if (!((boolean) image.getTag())) {
Toast.makeText(BarcodeSelectorActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
return;
}
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, formatType);
result.putExtra(BARCODE_CONTENTS, cardId);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
});
if(image.getHeight() == 0)
@@ -194,7 +161,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity
image.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text, true, null);
BarcodeImageWriterTask task = new BarcodeImageWriterTask(getApplicationContext(), image, cardId, format, text, true, null);
barcodeGeneratorTasks.add(task);
task.execute();
}
@@ -203,7 +170,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity
else
{
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text, true, null);
BarcodeImageWriterTask task = new BarcodeImageWriterTask(getApplicationContext(), image, cardId, format, text, true, null);
barcodeGeneratorTasks.add(task);
task.execute();
}

View File

@@ -0,0 +1,53 @@
package protect.card_locker;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.util.TypedValue;
import java.util.HashMap;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
public class CatimaAppCompatActivity extends AppCompatActivity {
SharedPreferences pref;
HashMap<String, Integer> supportedThemes;
@Override
protected void attachBaseContext(Context base) {
// Apply chosen language
super.attachBaseContext(Utils.updateBaseContextLocale(base));
}
@Override
public Resources.Theme getTheme() {
if (supportedThemes == null) {
supportedThemes = new HashMap<>();
supportedThemes.put(getString(R.string.settings_key_blue_theme), R.style.AppTheme_blue);
supportedThemes.put(getString(R.string.settings_key_brown_theme), R.style.AppTheme_brown);
supportedThemes.put(getString(R.string.settings_key_green_theme), R.style.AppTheme_green);
supportedThemes.put(getString(R.string.settings_key_grey_theme), R.style.AppTheme_grey);
supportedThemes.put(getString(R.string.settings_key_magenta_theme), R.style.AppTheme_magenta);
supportedThemes.put(getString(R.string.settings_key_pink_theme), R.style.AppTheme_pink);
supportedThemes.put(getString(R.string.settings_key_sky_blue_theme), R.style.AppTheme_sky_blue);
supportedThemes.put(getString(R.string.settings_key_violet_theme), R.style.AppTheme_violet);
}
Resources.Theme theme = super.getTheme();
pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String themeName = pref.getString(getString(R.string.setting_key_theme_color), getString(R.string.settings_key_catima_theme));
theme.applyStyle(Utils.mapGetOrDefault(supportedThemes, themeName, R.style.AppTheme_NoActionBar), true);
return theme;
}
public int getThemeColor() {
TypedValue typedValue = new TypedValue();
Resources.Theme theme = getTheme();
theme.resolveAttribute(R.attr.colorPrimary, typedValue, true);
return typedValue.data;
}
}

View File

@@ -0,0 +1,77 @@
package protect.card_locker;
import com.google.zxing.BarcodeFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class CatimaBarcode {
public static final List<BarcodeFormat> barcodeFormats = Collections.unmodifiableList(Arrays.asList(
BarcodeFormat.AZTEC,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_128,
BarcodeFormat.CODABAR,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.EAN_8,
BarcodeFormat.EAN_13,
BarcodeFormat.ITF,
BarcodeFormat.PDF_417,
BarcodeFormat.QR_CODE,
BarcodeFormat.UPC_A,
BarcodeFormat.UPC_E
));
public static final List<String> barcodePrettyNames = Collections.unmodifiableList(Arrays.asList(
"Aztec",
"Code 39",
"Code 128",
"Codabar",
"Data Matrix",
"EAN 8",
"EAN 13",
"ITF",
"PDF 417",
"QR Code",
"UPC A",
"UPC E"
));
private final BarcodeFormat mBarcodeFormat;
private CatimaBarcode(BarcodeFormat barcodeFormat) {
mBarcodeFormat = barcodeFormat;
}
public static CatimaBarcode fromBarcode(BarcodeFormat barcodeFormat) {
return new CatimaBarcode(barcodeFormat);
}
public static CatimaBarcode fromName(String name) {
return new CatimaBarcode(BarcodeFormat.valueOf(name));
}
public static CatimaBarcode fromPrettyName(String prettyName) {
try {
return new CatimaBarcode(barcodeFormats.get(barcodePrettyNames.indexOf(prettyName)));
} catch (IndexOutOfBoundsException e) {
throw new IllegalArgumentException("No barcode type with pretty name " + prettyName + " known!");
}
}
public boolean isSupported() {
return barcodeFormats.contains(mBarcodeFormat);
}
public BarcodeFormat format() {
return mBarcodeFormat;
}
public String name() {
return mBarcodeFormat.name();
}
public String prettyName() {
return barcodePrettyNames.get(barcodeFormats.indexOf(mBarcodeFormat));
}
}

View File

@@ -0,0 +1,24 @@
package protect.card_locker;
import android.app.Activity;
import android.widget.Toast;
import com.journeyapps.barcodescanner.CaptureManager;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
public class CatimaCaptureManager extends CaptureManager {
private Activity activity;
public CatimaCaptureManager(Activity activity, DecoratedBarcodeView barcodeView) {
super(activity, barcodeView);
this.activity = activity;
}
@Override
protected void displayFrameworkBugMessageAndExit(String message) {
// We don't want to exit, as we also have a enter from card image and add manually button here
// So we show a toast instead
Toast.makeText(activity, message, Toast.LENGTH_LONG).show();
}
}

View File

@@ -8,8 +8,6 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import com.google.zxing.BarcodeFormat;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.util.ArrayList;
@@ -257,7 +255,7 @@ public class DBHelper extends SQLiteOpenHelper
public long insertLoyaltyCard(final String store, final String note, final Date expiry,
final BigDecimal balance, final Currency balanceType,
final String cardId, final String barcodeId,
final BarcodeFormat barcodeType, final Integer headerColor,
final CatimaBarcode barcodeType, final Integer headerColor,
final int starStatus)
{
SQLiteDatabase db = getWritableDatabase();
@@ -269,7 +267,7 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.toString() : null);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
return db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
@@ -278,7 +276,7 @@ public class DBHelper extends SQLiteOpenHelper
public long insertLoyaltyCard(final SQLiteDatabase db, final String store,
final String note, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final BarcodeFormat barcodeType,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus)
{
ContentValues contentValues = new ContentValues();
@@ -289,7 +287,7 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.toString() : null);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus);
return db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
@@ -298,7 +296,7 @@ public class DBHelper extends SQLiteOpenHelper
public long insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store,
final String note, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final BarcodeFormat barcodeType,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus)
{
ContentValues contentValues = new ContentValues();
@@ -310,7 +308,7 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.toString() : null);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus);
return db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
@@ -319,7 +317,7 @@ public class DBHelper extends SQLiteOpenHelper
public boolean updateLoyaltyCard(final int id, final String store, final String note,
final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final BarcodeFormat barcodeType,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor)
{
SQLiteDatabase db = getWritableDatabase();
@@ -331,7 +329,7 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.toString() : null);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID), withArgs(id));

View File

@@ -27,14 +27,13 @@ import java.util.List;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
public class ImportExportActivity extends AppCompatActivity
public class ImportExportActivity extends CatimaAppCompatActivity
{
private static final String TAG = "Catima";
@@ -52,6 +51,7 @@ public class ImportExportActivity extends AppCompatActivity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle(R.string.importExport);
setContentView(R.layout.import_export_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

View File

@@ -63,7 +63,7 @@ public class ImportURIHelper {
try {
// These values are allowed to be null
BarcodeFormat barcodeType = null;
CatimaBarcode barcodeType = null;
Date expiry = null;
BigDecimal balance = new BigDecimal("0");
Currency balanceType = null;
@@ -97,7 +97,7 @@ public class ImportURIHelper {
String unparsedBarcodeType = kv.get(BARCODE_TYPE);
if(unparsedBarcodeType != null && !unparsedBarcodeType.equals(""))
{
barcodeType = BarcodeFormat.valueOf(unparsedBarcodeType);
barcodeType = CatimaBarcode.fromName(unparsedBarcodeType);
}
String unparsedBalance = kv.get(BALANCE);
@@ -164,7 +164,7 @@ public class ImportURIHelper {
}
if(loyaltyCard.barcodeType != null) {
fragment = appendFragment(fragment, BARCODE_TYPE, loyaltyCard.barcodeType.toString());
fragment = appendFragment(fragment, BARCODE_TYPE, loyaltyCard.barcodeType.name());
}
if(loyaltyCard.headerColor != null) {
fragment = appendFragment(fragment, HEADER_COLOR, loyaltyCard.headerColor.toString());

View File

@@ -25,7 +25,7 @@ public class LoyaltyCard implements Parcelable {
public final String barcodeId;
@Nullable
public final BarcodeFormat barcodeType;
public final CatimaBarcode barcodeType;
@Nullable
public final Integer headerColor;
@@ -34,7 +34,7 @@ public class LoyaltyCard implements Parcelable {
public LoyaltyCard(final int id, final String store, final String note, final Date expiry,
final BigDecimal balance, final Currency balanceType, final String cardId,
@Nullable final String barcodeId, @Nullable final BarcodeFormat barcodeType, @Nullable final Integer headerColor,
@Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType, @Nullable final Integer headerColor,
final int starStatus)
{
this.id = id;
@@ -61,7 +61,7 @@ public class LoyaltyCard implements Parcelable {
cardId = in.readString();
barcodeId = in.readString();
String tmpBarcodeType = in.readString();
barcodeType = !tmpBarcodeType.isEmpty() ? BarcodeFormat.valueOf(tmpBarcodeType) : null;
barcodeType = !tmpBarcodeType.isEmpty() ? CatimaBarcode.fromName(tmpBarcodeType) : null;
int tmpHeaderColor = in.readInt();
headerColor = tmpHeaderColor != -1 ? tmpHeaderColor : null;
starStatus = in.readInt();
@@ -77,7 +77,7 @@ public class LoyaltyCard implements Parcelable {
parcel.writeValue(balanceType);
parcel.writeString(cardId);
parcel.writeString(barcodeId);
parcel.writeString(barcodeType != null ? barcodeType.toString() : "");
parcel.writeString(barcodeType != null ? barcodeType.name() : "");
parcel.writeInt(headerColor != null ? headerColor : -1);
parcel.writeInt(starStatus);
}
@@ -97,14 +97,14 @@ public class LoyaltyCard implements Parcelable {
int balanceTypeColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE);
int headerColorColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR);
BarcodeFormat barcodeType = null;
CatimaBarcode barcodeType = null;
Currency balanceType = null;
Date expiry = null;
Integer headerColor = null;
if (cursor.isNull(barcodeTypeColumn) == false)
{
barcodeType = BarcodeFormat.valueOf(cursor.getString(barcodeTypeColumn));
barcodeType = CatimaBarcode.fromName(cursor.getString(barcodeTypeColumn));
}
if (cursor.isNull(balanceTypeColumn) == false)

View File

@@ -4,6 +4,7 @@ import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.util.SparseBooleanArray;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
@@ -14,19 +15,19 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.google.android.material.card.MaterialCardView;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import androidx.cardview.widget.CardView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder>
{
private static int mCurrentSelectedIndex = -1;
private int mCurrentSelectedIndex = -1;
private Cursor mCursor;
Settings mSettings;
boolean mDarkModeEnabled;
@@ -70,6 +71,9 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
}
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
// Invisible until we want to show something more
inputHolder.mDivider.setVisibility(View.GONE);
if (mDarkModeEnabled) {
inputHolder.mStarIcon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
}
@@ -87,34 +91,39 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
}
if (!loyaltyCard.balance.equals(new BigDecimal("0"))) {
inputHolder.mDivider.setVisibility(View.VISIBLE);
inputHolder.mBalanceField.setVisibility(View.VISIBLE);
inputHolder.mBalanceField.setText(mContext.getString(R.string.balanceSentence, Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType)));
if (mDarkModeEnabled) {
inputHolder.mBalanceField.getCompoundDrawables()[0].setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
}
inputHolder.mBalanceField.setText(Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType));
inputHolder.mBalanceField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
} else {
inputHolder.mBalanceField.setVisibility(View.GONE);
}
if (loyaltyCard.expiry != null)
{
if (loyaltyCard.expiry != null) {
inputHolder.mDivider.setVisibility(View.VISIBLE);
inputHolder.mExpiryField.setVisibility(View.VISIBLE);
int expiryString = R.string.expiryStateSentence;
if(Utils.hasExpired(loyaltyCard.expiry)) {
expiryString = R.string.expiryStateSentenceExpired;
inputHolder.mExpiryField.setTextColor(mContext.getResources().getColor(R.color.alert));
Drawable expiryIcon = inputHolder.mExpiryField.getCompoundDrawables()[0];
if (Utils.hasExpired(loyaltyCard.expiry)) {
expiryIcon.setColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP);
inputHolder.mExpiryField.setTextColor(Color.RED);
} else if (mDarkModeEnabled) {
expiryIcon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
}
inputHolder.mExpiryField.setText(mContext.getString(expiryString, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry)));
inputHolder.mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry));
inputHolder.mExpiryField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
} else {
inputHolder.mExpiryField.setVisibility(View.GONE);
}
inputHolder.mStarIcon.setVisibility((loyaltyCard.starStatus != 0) ? View.VISIBLE : View.GONE);
inputHolder.mStarIcon.setVisibility(loyaltyCard.starStatus != 0 ? View.VISIBLE : View.GONE);
inputHolder.mCardIcon.setImageBitmap(Utils.generateIcon(mContext, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile());
inputHolder.itemView.setActivated(mSelectedItems.get(inputCursor.getPosition(), false));
applyIconAnimation(inputHolder, inputCursor.getPosition());
applyClickEvents(inputHolder, inputCursor.getPosition());
}
private void applyClickEvents(LoyaltyCardListItemViewHolder inputHolder, final int inputPosition)
@@ -178,7 +187,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mAnimationItemsIndex.clear();
}
@SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
public void toggleSelection(int inputPosition)
{
mCurrentSelectedIndex = inputPosition;
@@ -192,7 +201,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mSelectedItems.put(inputPosition, true);
mAnimationItemsIndex.put(inputPosition, true);
}
notifyItemChanged(inputPosition);
notifyDataSetChanged();
}
public void clearSelections()
@@ -241,7 +250,8 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public LinearLayout mInformationContainer;
public ImageView mCardIcon, mStarIcon;
public CardView mThumbnailContainer;
public ConstraintLayout mRow;
public MaterialCardView mRow;
public View mDivider;
public RelativeLayout mThumbnailFrontContainer, mThumbnailBackContainer;
public LoyaltyCardListItemViewHolder(View inputView)
@@ -249,6 +259,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
super(inputView);
mThumbnailContainer = inputView.findViewById(R.id.thumbnail_container);
mRow = inputView.findViewById(R.id.row);
mDivider = inputView.findViewById(R.id.info_divider);
mThumbnailFrontContainer = inputView.findViewById(R.id.thumbnail_front);
mThumbnailBackContainer = inputView.findViewById(R.id.thumbnail_back);
mInformationContainer = inputView.findViewById(R.id.information_container);

View File

@@ -66,13 +66,12 @@ import java.util.concurrent.Callable;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.FileProvider;
import androidx.exifinterface.media.ExifInterface;
import androidx.fragment.app.DialogFragment;
public class LoyaltyCardEditActivity extends AppCompatActivity
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity
{
private static final String TAG = "Catima";
@@ -151,7 +150,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
(Currency) (fieldName == LoyaltyCardField.balanceType ? value : loyaltyCard.balanceType),
(String) (fieldName == LoyaltyCardField.cardId ? value : loyaltyCard.cardId),
(String) (fieldName == LoyaltyCardField.barcodeId ? value : loyaltyCard.barcodeId),
(BarcodeFormat) (fieldName == LoyaltyCardField.barcodeType ? value : loyaltyCard.barcodeType),
(CatimaBarcode) (fieldName == LoyaltyCardField.barcodeType ? value : loyaltyCard.barcodeType),
(Integer) (fieldName == LoyaltyCardField.headerColor ? value : loyaltyCard.headerColor),
(int) (fieldName == LoyaltyCardField.starStatus ? value : loyaltyCard.starStatus)
);
@@ -240,6 +239,8 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
cardImageBack = findViewById(R.id.backImage);
enterButton = findViewById(R.id.enterButton);
cardImageFront.setBackgroundColor(getThemeColor());
cardImageBack.setBackgroundColor(getThemeColor());
warnOnInvalidBarcodeType = () -> {
if (!(boolean) barcodeImage.getTag()) {
@@ -461,11 +462,11 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
updateTempState(LoyaltyCardField.barcodeType, null);
} else {
try {
BarcodeFormat barcodeFormat = BarcodeFormat.valueOf(s.toString());
CatimaBarcode barcodeFormat = CatimaBarcode.fromPrettyName(s.toString());
updateTempState(LoyaltyCardField.barcodeType, barcodeFormat);
if (!BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES.contains(barcodeFormat.name())) {
if (!barcodeFormat.isSupported()) {
Toast.makeText(LoyaltyCardEditActivity.this, getString(R.string.unsupportedBarcodeType), Toast.LENGTH_LONG).show();
}
} catch (IllegalArgumentException e) {}
@@ -477,7 +478,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
@Override
public void afterTextChanged(Editable s) {
ArrayList<String> barcodeList = new ArrayList<>(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES);
ArrayList<String> barcodeList = new ArrayList<>(CatimaBarcode.barcodePrettyNames);
barcodeList.add(0, getString(R.string.noBarcode));
ArrayAdapter<String> barcodeAdapter = new ArrayAdapter<>(LoyaltyCardEditActivity.this, android.R.layout.select_dialog_item, barcodeList);
barcodeTypeField.setAdapter(barcodeAdapter);
@@ -559,7 +560,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
formatBalanceCurrencyField(tempLoyaltyCard.balanceType);
cardIdFieldView.setText(tempLoyaltyCard.cardId);
barcodeIdField.setText(tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : getString(R.string.sameAsCardId));
barcodeTypeField.setText(tempLoyaltyCard.barcodeType != null ? tempLoyaltyCard.barcodeType.name() : getString(R.string.noBarcode));
barcodeTypeField.setText(tempLoyaltyCard.barcodeType != null ? tempLoyaltyCard.barcodeType.prettyName() : getString(R.string.noBarcode));
if(groupsChips.getChildCount() == 0)
{
@@ -619,7 +620,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
// Update from intent
if (barcodeType != null) {
try {
barcodeTypeField.setText(BarcodeFormat.valueOf(barcodeType).name());
barcodeTypeField.setText(CatimaBarcode.fromName(barcodeType).prettyName());
} catch (IllegalArgumentException e) {
barcodeTypeField.setText(getString(R.string.noBarcode));
}
@@ -1079,6 +1080,8 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
hasChanged = true;
} else {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
}
} else if (requestCode == Utils.CARD_IMAGE_FROM_FILE_FRONT || requestCode == Utils.CARD_IMAGE_FROM_FILE_BACK) {
Bitmap bitmap = null;
@@ -1087,7 +1090,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
}
if (bitmap != null) {
@@ -1099,6 +1101,8 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
hasChanged = true;
} else {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
}
} else {
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
@@ -1122,16 +1126,16 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
private void generateOrHideBarcode() {
String cardIdString = tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : tempLoyaltyCard.cardId;
BarcodeFormat barcodeFormat = tempLoyaltyCard.barcodeType;
CatimaBarcode barcodeFormat = tempLoyaltyCard.barcodeType;
if (barcodeFormat == null || cardIdString.isEmpty() || !BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES.contains(barcodeFormat.name())) {
if (barcodeFormat == null || cardIdString.isEmpty() || !barcodeFormat.isSupported()) {
hideBarcode();
} else {
generateBarcode(cardIdString, barcodeFormat);
}
}
private void generateBarcode(String cardIdString, BarcodeFormat barcodeFormat) {
private void generateBarcode(String cardIdString, CatimaBarcode barcodeFormat) {
if (barcodeImage.getHeight() == 0) {
Log.d(TAG, "ImageView size is not known known at start, waiting for load");
// The size of the ImageView is not yet available as it has not
@@ -1143,12 +1147,12 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known");
new BarcodeImageWriterTask(barcodeImage, cardIdString, barcodeFormat, null, false, warnOnInvalidBarcodeType).execute();
new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, warnOnInvalidBarcodeType).execute();
}
});
} else {
Log.d(TAG, "ImageView size known known, creating barcode");
new BarcodeImageWriterTask(barcodeImage, cardIdString, barcodeFormat, null, false, warnOnInvalidBarcodeType).execute();
new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, warnOnInvalidBarcodeType).execute();
}
showBarcode();

View File

@@ -12,8 +12,10 @@ import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
@@ -39,7 +41,6 @@ import java.util.List;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar;
@@ -48,26 +49,25 @@ import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.TextViewCompat;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardViewActivity extends AppCompatActivity
public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements GestureDetector.OnGestureListener
{
private static final String TAG = "Catima";
private GestureDetector mGestureDetector;
TextView cardIdFieldView;
BottomSheetBehavior behavior;
View bottomSheet;
View bottomSheetContentWrapper;
ImageView bottomSheetButton;
View frontImageView;
ImageView frontImage;
View backImageView;
ImageView backImage;
TextView noteView;
TextView groupsView;
TextView balanceView;
TextView expiryView;
AppCompatTextView storeName;
ImageButton maximizeButton;
ImageView barcodeImage;
ImageView mainImage;
LinearLayout dotIndicator;
ImageButton minimizeButton;
View collapsingToolbarLayout;
AppBarLayout appBarLayout;
@@ -80,7 +80,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
String cardIdString;
String barcodeIdString;
BarcodeFormat format;
CatimaBarcode format;
FloatingActionButton editButton;
@@ -92,12 +92,89 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
boolean starred;
boolean backgroundNeedsDarkIcons;
FullscreenType fullscreenType = FullscreenType.NONE;
boolean isFullscreen = false;
int mainImageIndex = 0;
List<ImageType> imageTypes;
private ImageView[] dots;
boolean isBarcodeSupported = true;
static final String STATE_FULLSCREENTYPE = "fullscreenType";
static final String STATE_IMAGEINDEX = "imageIndex";
static final String STATE_FULLSCREEN = "isFullscreen";
enum FullscreenType {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (imageTypes.size() > 1) {
Toast.makeText(this, getString(R.string.swipeToSwitchImages), Toast.LENGTH_SHORT).show();
}
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// Also switch on long-press for accessibility
setMainImage(true, true);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d(TAG, "On fling");
if (Math.abs(velocityY) > (0.75 * Math.abs(velocityX))) {
// Vertical swipe
// Swipe up
if (velocityY < -150) {
if (!isFullscreen) {
setFullscreen(true);
}
return false;
}
// Swipe down
if (velocityY > 150) {
if (isFullscreen) {
setFullscreen(false);
}
return false;
}
} else if (Math.abs(velocityX) > (0.75 * Math.abs(velocityY))) {
// Horizontal swipe
// Swipe right
if (velocityX < -150) {
setMainImage(true, false);
return false;
}
// Swipe left
if (velocityX > 150) {
setMainImage(false, false);
return false;
}
}
if (imageTypes.size() > 1) {
Toast.makeText(this, getString(R.string.swipeToSwitchImages), Toast.LENGTH_SHORT).show();
}
return true;
}
enum ImageType {
NONE,
BARCODE,
IMAGE_FRONT,
@@ -111,6 +188,15 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
Log.d(TAG, "View activity: id=" + loyaltyCardId);
}
private Drawable getDotIcon(boolean active) {
Drawable unwrappedIcon = AppCompatResources.getDrawable(this, active ? R.drawable.active_dot : R.drawable.inactive_dot);
assert unwrappedIcon != null;
Drawable wrappedIcon = DrawableCompat.wrap(unwrappedIcon);
DrawableCompat.setTint(wrappedIcon, getResources().getColor(R.color.iconColor));
return wrappedIcon;
}
private Drawable getIcon(int icon, boolean dark)
{
Drawable unwrappedIcon = AppCompatResources.getDrawable(this, icon);
@@ -134,7 +220,8 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
fullscreenType = FullscreenType.valueOf(savedInstanceState.getString(STATE_FULLSCREENTYPE));
mainImageIndex = savedInstanceState.getInt(STATE_IMAGEINDEX);
isFullscreen = savedInstanceState.getBoolean(STATE_FULLSCREEN);
}
settings = new Settings(this);
@@ -150,17 +237,14 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
bottomSheet = findViewById(R.id.bottom_sheet);
bottomSheetContentWrapper = findViewById(R.id.bottomSheetContentWrapper);
bottomSheetButton = findViewById(R.id.bottomSheetButton);
frontImageView = findViewById(R.id.frontImageView);
frontImage = findViewById(R.id.frontImage);
backImageView = findViewById(R.id.backImageView);
backImage = findViewById(R.id.backImage);
noteView = findViewById(R.id.noteView);
groupsView = findViewById(R.id.groupsView);
balanceView = findViewById(R.id.balanceView);
expiryView = findViewById(R.id.expiryView);
storeName = findViewById(R.id.storeName);
maximizeButton = findViewById(R.id.maximizeButton);
barcodeImage = findViewById(R.id.barcode);
mainImage = findViewById(R.id.mainImage);
dotIndicator = findViewById(R.id.dotIndicator);
minimizeButton = findViewById(R.id.minimizeButton);
collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout);
appBarLayout = findViewById(R.id.app_bar_layout);
@@ -169,6 +253,9 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
centerGuideline.setGuidelinePercent(0.5f);
barcodeScaler = findViewById(R.id.barcodeScaler);
barcodeScaler.setProgress(100);
maximizeButton.setBackgroundColor(getThemeColor());
minimizeButton.setBackgroundColor(getThemeColor());
bottomSheetButton.setBackgroundColor(getThemeColor());
barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@@ -177,7 +264,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
float scale = (float) progress / (float) barcodeScaler.getMax();
Log.d(TAG, "Scaling to " + scale);
if (fullscreenType == FullscreenType.BARCODE) {
if (imageTypes.get(mainImageIndex) == ImageType.BARCODE) {
redrawBarcodeAfterResize();
}
centerGuideline.setGuidelinePercent(0.5f * scale);
@@ -197,29 +284,8 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
rotationEnabled = true;
// Allow making barcode fullscreen on tap
maximizeButton.setOnClickListener(v -> setFullscreen(FullscreenType.BARCODE));
barcodeImage.setOnClickListener(view -> {
if (fullscreenType != FullscreenType.NONE) {
setFullscreen(FullscreenType.NONE);
} else {
setFullscreen(FullscreenType.BARCODE);
}
});
frontImageView.setOnClickListener(view -> {
if (fullscreenType != FullscreenType.IMAGE_FRONT) {
setFullscreen(FullscreenType.IMAGE_FRONT);
} else {
setFullscreen(FullscreenType.NONE);
}
});
backImageView.setOnClickListener(view -> {
if (fullscreenType != FullscreenType.IMAGE_BACK) {
setFullscreen(FullscreenType.IMAGE_BACK);
} else {
setFullscreen(FullscreenType.NONE);
}
});
minimizeButton.setOnClickListener(v -> setFullscreen(FullscreenType.NONE));
maximizeButton.setOnClickListener(v -> setFullscreen(true));
minimizeButton.setOnClickListener(v -> setFullscreen(false));
editButton = findViewById(R.id.fabEdit);
editButton.setOnClickListener(v -> {
@@ -244,7 +310,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
editButton.hide();
} else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24);
if (fullscreenType == FullscreenType.NONE) {
if (!isFullscreen) {
editButton.show();
}
@@ -283,6 +349,10 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
);
}
});
mGestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
mainImage.setOnTouchListener(gestureTouchListener);
}
@Override
@@ -296,7 +366,8 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putString(STATE_FULLSCREENTYPE, String.valueOf(fullscreenType));
savedInstanceState.putInt(STATE_IMAGEINDEX, mainImageIndex);
savedInstanceState.putBoolean(STATE_FULLSCREEN, isFullscreen);
super.onSaveInstanceState(savedInstanceState);
}
@@ -353,22 +424,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
settings.getFontSizeMin(settings.getLargeFont()), settings.getFontSizeMax(settings.getLargeFont()),
1, TypedValue.COMPLEX_UNIT_SP);
frontImageBitmap = Utils.retrieveCardImage(this, loyaltyCard.id, true);
if (frontImageBitmap != null) {
frontImageView.setVisibility(View.VISIBLE);
frontImage.setImageBitmap(frontImageBitmap);
} else {
frontImageView.setVisibility(View.GONE);
}
backImageBitmap = Utils.retrieveCardImage(this, loyaltyCard.id, false);
if (backImageBitmap != null) {
backImageView.setVisibility(View.VISIBLE);
backImage.setImageBitmap(backImageBitmap);
} else {
backImageView.setVisibility(View.GONE);
}
if(loyaltyCard.note.length() > 0)
{
noteView.setVisibility(View.VISIBLE);
@@ -424,7 +479,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
}
expiryView.setTag(loyaltyCard.expiry);
if (fullscreenType == FullscreenType.NONE) {
if (!isFullscreen) {
makeBottomSheetVisibleIfUseful();
}
@@ -483,20 +538,56 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
// Set shadow colour of store text so even same color on same color would be readable
storeName.setShadowLayer(1, 1, 1, backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE);
if (format != null && !BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES.contains(format.name())) {
if (format != null && !format.isSupported()) {
isBarcodeSupported = false;
Toast.makeText(this, getString(R.string.unsupportedBarcodeType), Toast.LENGTH_LONG).show();
} else if (format == null) {
isBarcodeSupported = false;
}
setFullscreen(fullscreenType);
imageTypes = new ArrayList<>();
if (isBarcodeSupported) {
imageTypes.add(ImageType.BARCODE);
}
frontImageBitmap = Utils.retrieveCardImage(this, loyaltyCard.id, true);
backImageBitmap = Utils.retrieveCardImage(this, loyaltyCard.id, false);
if (frontImageBitmap != null) {
imageTypes.add(ImageType.IMAGE_FRONT);
}
if (backImageBitmap != null) {
imageTypes.add(ImageType.IMAGE_BACK);
}
dotIndicator.removeAllViews();
if (imageTypes.size() >= 2) {
dots = new ImageView[imageTypes.size()];
for (int i = 0; i < imageTypes.size(); i++) {
dots[i] = new ImageView(this);
dots[i].setImageDrawable(getDotIcon(false));
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(8, 0, 8, 0);
dotIndicator.addView(dots[i], params);
}
dotIndicator.setVisibility(View.VISIBLE);
}
setFullscreen(isFullscreen);
}
@Override
public void onBackPressed() {
if (fullscreenType != FullscreenType.NONE)
if (isFullscreen)
{
setFullscreen(FullscreenType.NONE);
setFullscreen(false);
return;
}
@@ -616,6 +707,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
private void setOrientatonLock(MenuItem item, boolean lock)
{
if(lock)
@@ -635,7 +727,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
private void makeBottomSheetVisibleIfUseful()
{
if (frontImageView.getVisibility() == View.VISIBLE || backImageView.getVisibility() == View.VISIBLE || noteView.getVisibility() == View.VISIBLE || groupsView.getVisibility() == View.VISIBLE || balanceView.getVisibility() == View.VISIBLE || expiryView.getVisibility() == View.VISIBLE) {
if (noteView.getVisibility() == View.VISIBLE || groupsView.getVisibility() == View.VISIBLE || balanceView.getVisibility() == View.VISIBLE || expiryView.getVisibility() == View.VISIBLE) {
bottomSheet.setVisibility(View.VISIBLE);
}
else
@@ -644,51 +736,98 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
}
}
private void redrawBarcodeAfterResize()
{
private void drawBarcode() {
if (format != null) {
barcodeImage.getViewTreeObserver().addOnGlobalLayoutListener(
new BarcodeImageWriterTask(
getApplicationContext(),
mainImage,
barcodeIdString != null ? barcodeIdString : cardIdString,
format,
null,
false,
null)
.execute();
}
}
private void redrawBarcodeAfterResize() {
if (format != null) {
mainImage.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
mainImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known");
new BarcodeImageWriterTask(
barcodeImage,
barcodeIdString != null ? barcodeIdString : cardIdString,
format,
null,
false,
null)
.execute();
drawBarcode();
}
});
};
}
private void drawMainImage(int index, boolean waitForResize) {
if (imageTypes.isEmpty()) {
mainImage.setVisibility(View.GONE);
return;
}
if (dots != null) {
for (int i = 0; i < dots.length; i++) {
dots[i].setImageDrawable(getDotIcon(i == index));
}
}
ImageType wantedImageType = imageTypes.get(index);
if (wantedImageType == ImageType.BARCODE) {
if (waitForResize) {
redrawBarcodeAfterResize();
} else {
drawBarcode();
}
mainImage.setBackgroundColor(Color.WHITE);
} else if (wantedImageType == ImageType.IMAGE_FRONT) {
mainImage.setImageBitmap(frontImageBitmap);
mainImage.setBackgroundColor(Color.TRANSPARENT);
} else if (wantedImageType == ImageType.IMAGE_BACK) {
mainImage.setImageBitmap(backImageBitmap);
mainImage.setBackgroundColor(Color.TRANSPARENT);
} else {
throw new IllegalArgumentException("Unknown image type: " + wantedImageType);
}
mainImage.setVisibility(View.VISIBLE);
}
private void setMainImage(boolean next, boolean overflow) {
int newIndex = mainImageIndex + (next ? 1 : -1);
if (newIndex >= imageTypes.size() && overflow) {
newIndex = 0;
}
if (newIndex == -1 || newIndex >= imageTypes.size()) {
return;
}
mainImageIndex = newIndex;
drawMainImage(newIndex, false);
}
/**
* When enabled, hides the status bar and moves the barcode to the top of the screen.
*
* The purpose of this function is to make sure the barcode can be scanned from the phone
* by machines which offer no space to insert the complete device.
*/
private void setFullscreen(FullscreenType fullscreenType)
{
private void setFullscreen(boolean enabled) {
ActionBar actionBar = getSupportActionBar();
if (fullscreenType != FullscreenType.NONE) {
if (enabled && !imageTypes.isEmpty()) {
Log.d(TAG, "Move into fullscreen");
if (fullscreenType == FullscreenType.IMAGE_FRONT) {
barcodeImage.setImageBitmap(frontImageBitmap);
barcodeImage.setVisibility(View.VISIBLE);
} else if (fullscreenType == FullscreenType.IMAGE_BACK) {
barcodeImage.setImageBitmap(backImageBitmap);
barcodeImage.setVisibility(View.VISIBLE);
} else {
// Prepare redraw after size change
redrawBarcodeAfterResize();
}
drawMainImage(mainImageIndex, true);
// Hide maximize and show minimize button and scaler
maximizeButton.setVisibility(View.GONE);
@@ -730,17 +869,11 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
// Reset center guideline
barcodeScaler.setProgress(100);
// Prepare redraw after size change
if (format != null && isBarcodeSupported) {
redrawBarcodeAfterResize();
} else {
barcodeImage.setVisibility(View.GONE);
}
drawMainImage(mainImageIndex, true);
// Show maximize and hide minimize button and scaler
if (format != null && isBarcodeSupported) {
maximizeButton.setVisibility(View.VISIBLE);
}
maximizeButton.setVisibility(imageTypes.isEmpty() ? View.GONE : View.VISIBLE);
minimizeButton.setVisibility(View.GONE);
barcodeScaler.setVisibility(View.GONE);
@@ -770,6 +903,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
);
}
this.fullscreenType = fullscreenType;
isFullscreen = enabled;
}
}

View File

@@ -25,17 +25,14 @@ import java.io.UnsupportedEncodingException;
import java.util.List;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends AppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener
{
private static final String TAG = "Catima";
@@ -49,6 +46,7 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
private RecyclerView mCardList;
private View mHelpText;
private View mNoMatchingCardsText;
private View mNoGroupCardsText;
private ActionMode.Callback mCurrentActionModeCallback = new ActionMode.Callback()
{
@@ -179,6 +177,7 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
{
setTheme(R.style.AppTheme_NoActionBar);
super.onCreate(inputSavedInstanceState);
setTitle(R.string.app_name);
setContentView(R.layout.main_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -212,26 +211,17 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
mGestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(final View v, final MotionEvent event){
return mGestureDetector.onTouchEvent(event);
}
};
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
mHelpText = findViewById(R.id.helpText);
mNoMatchingCardsText = findViewById(R.id.noMatchingCardsText);
mNoGroupCardsText = findViewById(R.id.noGroupCardsText);
mCardList = findViewById(R.id.list);
mHelpText.setOnTouchListener(gestureTouchListener);
mNoMatchingCardsText.setOnTouchListener(gestureTouchListener);
mCardList.setOnTouchListener(gestureTouchListener);
// Init card list
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
mCardList.setLayoutManager(mLayoutManager);
mCardList.setItemAnimator(new DefaultItemAnimator());
mAdapter = new LoyaltyCardCursorAdapter(this, null, this);
mCardList.setAdapter(mAdapter);
registerForContextMenu(mCardList);
@@ -366,27 +356,16 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
@Override
public void onBackPressed()
{
if (mMenu == null)
{
super.onBackPressed();
return;
}
if (mMenu != null) {
SearchView searchView = (SearchView) mMenu.findItem(R.id.action_search).getActionView();
SearchView searchView = (SearchView) mMenu.findItem(R.id.action_search).getActionView();
if (!searchView.isIconified())
{
searchView.setIconified(true);
} else {
TabLayout groupsTabLayout = findViewById(R.id.groups);
if (groupsTabLayout.getVisibility() == View.VISIBLE && selectedTab != 0) {
selectedTab = 0;
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(0));
} else {
super.onBackPressed();
if (!searchView.isIconified()) {
searchView.setIconified(true);
return;
}
}
super.onBackPressed();
}
private void updateLoyaltyCardList(String filterText, Object tag)
@@ -405,13 +384,22 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
// the keyboard
mCardList.setVisibility(View.VISIBLE);
mHelpText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.GONE);
if(mAdapter.getItemCount() > 0)
{
mNoMatchingCardsText.setVisibility(View.GONE);
}
else
{
mNoMatchingCardsText.setVisibility(View.VISIBLE);
if(!filterText.isEmpty()) {
// Actual Empty Search Result
mNoMatchingCardsText.setVisibility(View.VISIBLE);
mNoGroupCardsText.setVisibility(View.GONE);
} else {
// Group Tab with no Group Cards
mNoMatchingCardsText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.VISIBLE);
}
}
}
else
@@ -419,6 +407,7 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
mCardList.setVisibility(View.GONE);
mHelpText.setVisibility(View.VISIBLE);
mNoMatchingCardsText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.GONE);
}
if (mCurrentActionMode != null) {
@@ -702,4 +691,4 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
startActivityForResult(i, Utils.MAIN_REQUEST);
}
}
}
}

View File

@@ -16,13 +16,12 @@ import java.util.List;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class ManageGroupsActivity extends AppCompatActivity implements GroupCursorAdapter.GroupAdapterListener
public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener
{
private static final String TAG = "Catima";
@@ -35,6 +34,7 @@ public class ManageGroupsActivity extends AppCompatActivity implements GroupCurs
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle(R.string.groups);
setContentView(R.layout.manage_groups_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -110,7 +110,7 @@ public class ManageGroupsActivity extends AppCompatActivity implements GroupCurs
}
private void createGroup() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.AlertDialogTheme);
builder.setTitle(R.string.enter_group_name);
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);

View File

@@ -9,6 +9,7 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.google.zxing.ResultPoint;
import com.google.zxing.client.android.Intents;
@@ -20,7 +21,6 @@ import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import java.util.List;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
/**
@@ -29,7 +29,7 @@ import androidx.appcompat.widget.Toolbar;
* Based on https://github.com/journeyapps/zxing-android-embedded/blob/0fdfbce9fb3285e985bad9971c5f7c0a7a334e7b/sample/src/main/java/example/zxing/CustomScannerActivity.java
* originally licensed under Apache 2.0
*/
public class ScanActivity extends AppCompatActivity {
public class ScanActivity extends CatimaAppCompatActivity {
private static final String TAG = "Catima";
private CaptureManager capture;
@@ -49,6 +49,7 @@ public class ScanActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.scanCardBarcode);
setContentView(R.layout.scan_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -67,7 +68,7 @@ public class ScanActivity extends AppCompatActivity {
// Even though we do the actual decoding with the barcodeScannerView
// CaptureManager needs to be running to show the camera and scanning bar
capture = new CaptureManager(this, barcodeScannerView);
capture = new CatimaCaptureManager(this, barcodeScannerView);
Intent captureIntent = new Intent();
Bundle captureIntentBundle = new Bundle();
captureIntentBundle.putBoolean(Intents.Scan.BEEP_ENABLED, false);
@@ -80,7 +81,7 @@ public class ScanActivity extends AppCompatActivity {
Intent scanResult = new Intent();
Bundle scanResultBundle = new Bundle();
scanResultBundle.putString(BarcodeSelectorActivity.BARCODE_CONTENTS, result.getText());
scanResultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, result.getBarcodeFormat().toString());
scanResultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, result.getBarcodeFormat().name());
if (addGroup != null) {
scanResultBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup);
}
@@ -145,8 +146,7 @@ public class ScanActivity extends AppCompatActivity {
setResult(Activity.RESULT_CANCELED);
finish();
return true;
} else if (item.getItemId() == R.id.action_toggle_flashlight)
{
} else if (item.getItemId() == R.id.action_toggle_flashlight) {
if (torch) {
torch = false;
barcodeScannerView.setTorchOff();
@@ -168,7 +168,14 @@ public class ScanActivity extends AppCompatActivity {
{
super.onActivityResult(requestCode, resultCode, intent);
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
BarcodeValues barcodeValues;
try {
barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
} catch (NullPointerException e) {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return;
}
if (!barcodeValues.isEmpty()) {
Intent manualResult = new Intent();

View File

@@ -3,10 +3,14 @@ package protect.card_locker;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.Build;
import android.os.LocaleList;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;
@@ -30,10 +34,12 @@ import java.util.Calendar;
import java.util.Currency;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import androidx.core.graphics.ColorUtils;
import androidx.exifinterface.media.ExifInterface;
import protect.card_locker.preferences.Settings;
public class Utils {
private static final String TAG = "Catima";
@@ -332,15 +338,42 @@ public class Utils {
return retrieveCardImage(context, getCardImageFileName(loyaltyCardId, front));
}
static public Object hashmapGetOrDefault(HashMap hashMap, Object key, Object defaultValue, Class keyType) {
Object value = hashMap.get(keyType.cast(key));
static public <T,U> U mapGetOrDefault(Map<T,U> map, T key, U defaultValue) {
U value = map.get(key);
if (value == null) {
return defaultValue;
}
return value;
}
static public Object hashmapGetOrDefault(HashMap hashMap, String key, Object defaultValue) {
return hashmapGetOrDefault(hashMap, key, defaultValue, String.class);
static public Locale stringToLocale(String localeString) {
String[] localeParts = localeString.split("-");
if (localeParts.length == 1) {
return new Locale(localeParts[0]);
}
if (localeParts[1].startsWith("r")) {
localeParts[1] = localeParts[1].substring(1);
}
return new Locale(localeParts[0], localeParts[1]);
}
static public Context updateBaseContextLocale(Context context) {
Settings settings = new Settings(context);
Locale chosenLocale = settings.getLocale();
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
configuration.locale = chosenLocale != null ? chosenLocale : Locale.getDefault();
res.updateConfiguration(configuration, res.getDisplayMetrics());
return context;
}
LocaleList localeList = chosenLocale != null ? new LocaleList(chosenLocale) : LocaleList.getDefault();
LocaleList.setDefault(localeList);
configuration.setLocales(localeList);
return context.createConfigurationContext(configuration);
}
}

View File

@@ -143,7 +143,7 @@ public class CatimaExporter implements Exporter
card.balanceType,
card.cardId,
card.barcodeId,
card.barcodeType,
card.barcodeType != null ? card.barcodeType.name() : "",
card.headerColor,
card.starStatus);

View File

@@ -2,6 +2,7 @@ package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import com.google.zxing.BarcodeFormat;
@@ -26,6 +27,7 @@ import java.util.Currency;
import java.util.Date;
import java.util.List;
import protect.card_locker.CatimaBarcode;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
import protect.card_locker.Group;
@@ -47,24 +49,27 @@ public class CatimaImporter implements Importer
// First, check if this is a zip file
ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream);
LocalFileHeader localFileHeader = zipInputStream.getNextEntry();
if (localFileHeader == null) {
boolean isZipFile = false;
LocalFileHeader localFileHeader;
while ((localFileHeader = zipInputStream.getNextEntry()) != null) {
isZipFile = true;
String fileName = Uri.parse(localFileHeader.getFileName()).getLastPathSegment();
if (fileName.equals("catima.csv")) {
importCSV(context, db, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8)));
} else if (fileName.endsWith(".png")) {
Utils.saveCardImage(context, ZipUtils.readImage(zipInputStream), fileName);
} else {
throw new FormatException("Unexpected file in import: " + fileName);
}
}
if (!isZipFile) {
// This is not a zip file, try importing as bare CSV
bufferedInputStream.reset();
importCSV(context, db, bufferedInputStream);
return;
}
importZipFile(context, db, zipInputStream, localFileHeader);
}
public void importZipFile(Context context, DBHelper db, ZipInputStream input, LocalFileHeader localFileHeader) throws IOException, FormatException, InterruptedException {
String fileName = localFileHeader.getFileName();
if (fileName.equals("catima.csv")) {
importCSV(context, db, new ByteArrayInputStream(ZipUtils.read(input).getBytes(StandardCharsets.UTF_8)));
} else {
Utils.saveCardImage(context, ZipUtils.readImage(input), fileName);
}
}
@@ -327,11 +332,11 @@ public class CatimaImporter implements Importer
barcodeId = null;
}
BarcodeFormat barcodeType = null;
CatimaBarcode barcodeType = null;
String unparsedBarcodeType = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, record, "");
if(!unparsedBarcodeType.isEmpty())
{
barcodeType = BarcodeFormat.valueOf(unparsedBarcodeType);
barcodeType = CatimaBarcode.fromName(unparsedBarcodeType);
}
Integer headerColor = null;

View File

@@ -20,6 +20,7 @@ import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import protect.card_locker.CatimaBarcode;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
@@ -127,7 +128,7 @@ public class FidmeImporter implements Importer
// Sadly, Fidme exports don't contain the card type
// I guess they have an online DB of all the different companies and what type they use
// TODO: Hook this into our own loyalty card DB if we ever get one
BarcodeFormat barcodeType = null;
CatimaBarcode barcodeType = null;
// No favourite data in the export either
int starStatus = 0;

View File

@@ -23,6 +23,7 @@ import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.util.HashMap;
import protect.card_locker.CatimaBarcode;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
import protect.card_locker.R;
@@ -162,15 +163,15 @@ public class StocardImporter implements Importer
HashMap<String, String> providerData = providers.get(providerId);
String store = providerData != null ? providerData.get("name") : providerId;
String note = (String) Utils.hashmapGetOrDefault(loyaltyCardData, "note", "");
String note = (String) Utils.mapGetOrDefault(loyaltyCardData, "note", "");
String cardId = (String) loyaltyCardData.get("cardId");
String barcodeTypeString = (String) Utils.hashmapGetOrDefault(loyaltyCardData, "barcodeType", providerData != null ? providerData.get("barcodeFormat") : null);
BarcodeFormat barcodeType = null;
String barcodeTypeString = (String) Utils.mapGetOrDefault(loyaltyCardData, "barcodeType", providerData != null ? providerData.get("barcodeFormat") : null);
CatimaBarcode barcodeType = null;
if (barcodeTypeString != null) {
if (barcodeTypeString.equals("RSS_DATABAR_EXPANDED")) {
barcodeType = BarcodeFormat.RSS_EXPANDED;
barcodeType = CatimaBarcode.fromBarcode(BarcodeFormat.RSS_EXPANDED);
} else {
barcodeType = BarcodeFormat.valueOf(barcodeTypeString);
barcodeType = CatimaBarcode.fromName(barcodeTypeString);
}
}

View File

@@ -23,6 +23,7 @@ import java.util.Currency;
import java.util.Date;
import java.util.TimeZone;
import protect.card_locker.CatimaBarcode;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
@@ -74,24 +75,24 @@ public class VoucherVaultImporter implements Importer
String cardId = jsonCard.getString("code");
BarcodeFormat barcodeType = null;
CatimaBarcode barcodeType = null;
String codeTypeFromJSON = jsonCard.getString("codeType");
switch (codeTypeFromJSON) {
case "CODE128":
barcodeType = BarcodeFormat.CODE_128;
barcodeType = CatimaBarcode.fromBarcode(BarcodeFormat.CODE_128);
break;
case "CODE39":
barcodeType = BarcodeFormat.CODE_39;
barcodeType = CatimaBarcode.fromBarcode(BarcodeFormat.CODE_39);
break;
case "EAN13":
barcodeType = BarcodeFormat.EAN_13;
barcodeType = CatimaBarcode.fromBarcode(BarcodeFormat.EAN_13);
break;
case "PDF417":
barcodeType = BarcodeFormat.PDF_417;
barcodeType = CatimaBarcode.fromBarcode(BarcodeFormat.PDF_417);
break;
case "QR":
barcodeType = BarcodeFormat.QR_CODE;
barcodeType = CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE);
break;
case "TEXT":
break;

View File

@@ -3,11 +3,14 @@ package protect.card_locker.preferences;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.Locale;
import androidx.annotation.IntegerRes;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.preference.PreferenceManager;
import protect.card_locker.R;
import protect.card_locker.Utils;
public class Settings
{
@@ -45,6 +48,17 @@ public class Settings
return settings.getBoolean(getResString(keyId), defaultValue);
}
public Locale getLocale()
{
String value = getString(R.string.settings_key_locale, "");
if (value.length() == 0) {
return null;
}
return Utils.stringToLocale(value);
}
public int getTheme()
{
String value = getString(R.string.settings_key_theme, getResString(R.string.settings_key_system_theme));

View File

@@ -1,28 +1,38 @@
package protect.card_locker.preferences;
import android.os.Bundle;
import android.view.MenuItem;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import nl.invissvenska.numberpickerpreference.NumberDialogPreference;
import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment;
import protect.card_locker.CatimaAppCompatActivity;
import protect.card_locker.R;
import protect.card_locker.Utils;
public class SettingsActivity extends AppCompatActivity
public class SettingsActivity extends CatimaAppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle(R.string.settings);
setContentView(R.layout.settings_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
@@ -30,8 +40,10 @@ public class SettingsActivity extends AppCompatActivity
}
// Display the fragment as the main content.
SettingsFragment fragment = new SettingsFragment();
fragment.setParentReference(this);
getSupportFragmentManager().beginTransaction()
.replace(R.id.settings_container, new SettingsFragment())
.replace(R.id.settings_container, fragment)
.commit();
}
@@ -52,46 +64,72 @@ public class SettingsActivity extends AppCompatActivity
public static class SettingsFragment extends PreferenceFragmentCompat
{
private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment";
private SettingsActivity parent;
public void setParentReference(SettingsActivity settingsActivity) {
parent = settingsActivity;
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
{
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
// Show pretty names
ListPreference localePreference = findPreference(getResources().getString(R.string.settings_key_locale));
assert localePreference != null;
CharSequence[] entryValues = localePreference.getEntryValues();
List<CharSequence> entries = new ArrayList<>();
for (CharSequence entry : entryValues) {
if (entry.length() == 0) {
entries.add(getResources().getString(R.string.settings_system_locale));
} else {
Locale entryLocale = Utils.stringToLocale(entry.toString());
entries.add(entryLocale.getDisplayName(entryLocale));
}
}
localePreference.setEntries(entries.toArray(new CharSequence[entryValues.length]));
Preference themePreference = findPreference(getResources().getString(R.string.settings_key_theme));
assert themePreference != null;
themePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
{
@Override
public boolean onPreferenceChange(Preference preference, Object o)
{
if(o.toString().equals(getResources().getString(R.string.settings_key_light_theme)))
{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
else if(o.toString().equals(getResources().getString(R.string.settings_key_dark_theme)))
{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
else
{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
return true;
themePreference.setOnPreferenceChangeListener((preference, o) -> {
if (o.toString().equals(getResources().getString(R.string.settings_key_light_theme))) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else if (o.toString().equals(getResources().getString(R.string.settings_key_dark_theme))) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
return true;
});
Preference colorPreference = findPreference(getResources().getString(R.string.setting_key_theme_color));
assert colorPreference != null;
colorPreference.setOnPreferenceChangeListener((preference, o) -> {
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
return true;
});
localePreference.setOnPreferenceChangeListener((preference, newValue) -> {
// Refresh the activity
parent.finish();
startActivity(parent.getIntent());
return true;
});
}
@Override
public void onDisplayPreferenceDialog(Preference preference)
{
if (preference instanceof NumberDialogPreference)
{
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof NumberDialogPreference) {
NumberDialogPreference dialogPreference = (NumberDialogPreference) preference;
DialogFragment dialogFragment = NumberPickerPreferenceDialogFragment
.newInstance(
@@ -103,9 +141,7 @@ public class SettingsActivity extends AppCompatActivity
);
dialogFragment.setTargetFragment(this, 0);
dialogFragment.show(getParentFragmentManager(), DIALOG_FRAGMENT_TAG);
}
else
{
} else {
super.onDisplayPreferenceDialog(preference);
}
}

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" android:useLevel="true"
android:dither="true">
<size android:height="12dip" android:width="12dip"/>
<solid android:color="@android:color/white"/>
</shape>

View File

@@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
<path
android:fillColor="@android:color/white"
android:pathData="M12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z"/>
</vector>

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M19,14L19,6c0,-1.1 -0.9,-2 -2,-2L3,4c-1.1,0 -2,0.9 -2,2v8c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM10,13c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM23,7v11c0,1.1 -0.9,2 -2,2L4,20v-2h17L21,7h2z"/>
</vector>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" android:useLevel="true"
android:dither="true">
<size android:height="8dip" android:width="8dip"/>
<solid android:color="@android:color/white"/>
</shape>

View File

@@ -82,7 +82,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/aztecBarcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/aztecBarcodeText"
@@ -103,7 +102,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/code39Barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/code39BarcodeText"
@@ -124,7 +122,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/code128Barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/code128BarcodeText"
@@ -145,7 +142,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/codabarBarcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/codabarBarcodeText"
@@ -166,7 +162,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/datamatrixBarcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/datamatrixBarcodeText"
@@ -187,7 +182,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/ean8Barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/ean8BarcodeText"
@@ -208,7 +202,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/ean13Barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/ean13BarcodeText"
@@ -229,7 +222,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/itfBarcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/itfBarcodeText"
@@ -250,7 +242,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/pdf417Barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/pdf417BarcodeText"
@@ -271,7 +262,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/qrcodeBarcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/qrcodeBarcodeText"
@@ -292,7 +282,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/upcaBarcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/upcaBarcodeText"
@@ -313,7 +302,6 @@
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/upceBarcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
<TextView
android:id="@+id/upceBarcodeText"

View File

@@ -26,12 +26,24 @@
android:gravity="center"
android:text="@string/noMatchingGiftCards"
android:visibility="gone"/>
<TextView
style="@style/AppTheme.TextView.NoData"
android:id="@+id/noGroupCardsText"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/noGroupCards"
android:visibility="gone"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
app:layoutManager="androidx.recyclerview.widget.StaggeredGridLayoutManager"
app:spanCount="@integer/main_view_card_columns"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:visibility="gone" />
android:background="@color/mainLoyaltyCardBackground"
android:visibility="gone"/>
</RelativeLayout>

View File

@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabSave"
@@ -312,7 +313,6 @@
android:padding="10.0dp"
android:background="#ffffff"
android:id="@+id/barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
</LinearLayout>
@@ -365,7 +365,6 @@
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:minHeight="50dp"
android:background="@color/colorPrimary"
android:contentDescription="@string/frontImageDescription"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_camera_white" />
@@ -401,7 +400,6 @@
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:minHeight="50dp"
android:background="@color/colorPrimary"
android:contentDescription="@string/backImageDescription"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_camera_white" />

View File

@@ -1,118 +1,137 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.google.android.material.card.MaterialCardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/row"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="0.5dp"
android:background="@drawable/list_row"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/activity_margin">
android:layout_margin="8dp">
<LinearLayout
android:id="@+id/information_container"
android:layout_width="0dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_margin"
android:layout_marginLeft="@dimen/activity_margin"
android:layout_toEndOf="@+id/thumbnail_container"
android:layout_toRightOf="@+id/thumbnail_container"
android:layout_weight="1"
android:clickable="true"
android:focusable="true"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@+id/thumbnail_container"
app:layout_constraintEnd_toStartOf="@+id/star"
app:layout_constraintStart_toEndOf="@+id/thumbnail_container"
app:layout_constraintTop_toTopOf="@+id/thumbnail_container">
android:orientation="vertical">
<TextView
android:id="@+id/store"
android:layout_width="wrap_content"
<LinearLayout
android:id="@+id/information_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/storeNameTextSize"
android:textStyle="bold" />
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/note"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textSize="@dimen/noteTextSize" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/balance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textSize="@dimen/noteTextSize" />
<androidx.cardview.widget.CardView
android:id="@+id/thumbnail_container"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
app:cardCornerRadius="4dp"
android:layout_alignParentStart="true">
<TextView
android:id="@+id/expiry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textSize="@dimen/noteTextSize" />
<RelativeLayout
android:id="@+id/thumbnail_front"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize">
<ImageView
android:id="@+id/thumbnail"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:contentDescription="@string/thumbnailDescription"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/thumbnail_back"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize">
<ImageView
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_centerHorizontal="true"
android:contentDescription="@string/thumbnailDescription"
app:srcCompat="@drawable/ic_done" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
<LinearLayout
android:minHeight="@dimen/cardThumbnailSize"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_vertical"
android:layout_toEndOf="@+id/thumbnail_container">
<TextView
android:id="@+id/store"
android:paddingStart="16dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="left"
android:textAppearance="?attr/textAppearanceHeadline6" />
</LinearLayout>
<ImageView
android:id="@+id/star"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
app:srcCompat="@drawable/ic_starred_white"
android:contentDescription="@string/starImage"
app:tint="?attr/colorControlNormal"
android:layout_alignParentEnd="true"
android:visibility="gone" />
</RelativeLayout>
<TextView
android:id="@+id/note"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textAppearance="?attr/textAppearanceBody2"
android:textColor="?android:attr/textColorSecondary"
android:visibility="gone" />
<View android:id="@+id/info_divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="?android:attr/dividerVertical"
android:visibility="gone" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/balance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="8dp"
android:textAppearance="?attr/textAppearanceBody2"
android:textColor="?android:attr/textColorSecondary"
app:drawableLeftCompat="@drawable/ic_baseline_payments_24"
android:drawablePadding="4dp"
android:layout_alignParentStart="true"
android:visibility="gone" />
<TextView
android:id="@+id/expiry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?attr/textAppearanceBody2"
android:textColor="?android:attr/textColorSecondary"
app:drawableLeftCompat="@drawable/ic_baseline_access_time_24"
android:drawablePadding="4dp"
android:layout_toEndOf="@+id/balance"
android:visibility="gone" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<androidx.cardview.widget.CardView
android:id="@+id/thumbnail_container"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
app:cardCornerRadius="4dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<RelativeLayout
android:id="@+id/thumbnail_front"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize">
<ImageView
android:id="@+id/thumbnail"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:contentDescription="@string/thumbnailDescription"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/thumbnail_back"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize">
<ImageView
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_centerHorizontal="true"
android:contentDescription="@string/thumbnailDescription"
app:srcCompat="@drawable/ic_done" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
<ImageView
android:id="@+id/star"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_marginLeft="@dimen/activity_margin"
app:srcCompat="@drawable/ic_starred_white"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/activity_margin"
android:contentDescription="@string/starImage"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:tint="#000000" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>

View File

@@ -55,25 +55,24 @@
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24"
android:contentDescription="@string/moveBarcodeToTopOfScreen"
app:tint="#ffffff"
android:background="@color/colorPrimary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/barcode"
app:layout_constraintBottom_toTopOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/barcode"
android:layout_width="0dp"
android:id="@+id/mainImage"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
android:padding="10dp"
android:background="#ffffff"
app:layout_constraintBottom_toTopOf="@+id/centerGuideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/maximizeButton"
android:contentDescription="@string/barcodeImageDescription"/>
app:layout_constraintTop_toBottomOf="@+id/maximizeButton"/>
<ImageButton
android:id="@+id/minimizeButton"
@@ -82,15 +81,31 @@
android:layout_height="40dp"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
android:layout_marginTop="10dp"
android:padding="0dp"
app:srcCompat="@drawable/ic_baseline_arrow_drop_down_24"
android:contentDescription="@string/moveBarcodeToCenterOfScreen"
app:tint="#ffffff"
android:background="@color/colorPrimary"
app:layout_constraintTop_toBottomOf="@+id/barcode"
app:layout_constraintTop_toBottomOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<LinearLayout
android:id="@+id/dotIndicator"
android:visibility="gone"
android:gravity="center_vertical"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/minimizeButton"/>
<SeekBar
android:id="@+id/barcodeScaler"
android:visibility="gone"
@@ -112,7 +127,7 @@
android:layout_marginLeft="10.0dip"
android:layout_marginRight="10.0dip"
android:paddingBottom="80dp"
app:layout_constraintTop_toBottomOf="@+id/minimizeButton"
app:layout_constraintTop_toBottomOf="@+id/dotIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -149,8 +164,8 @@
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="top|start"
android:background="@color/colorPrimary"
android:scaleType="fitCenter"
android:contentDescription="@string/toggleMoreInfo"
app:tint="#ffffff"
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24" />
@@ -164,60 +179,6 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:id="@+id/frontImageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="@dimen/activity_margin"
android:layout_marginTop="@dimen/activity_margin"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_marginBottom="@dimen/activity_margin"
android:paddingHorizontal="@dimen/inputPadding"
android:layout_weight="1"
app:cardCornerRadius="4dp"
app:cardElevation="0dp">
<ImageView
android:id="@+id/frontImage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:contentDescription="@string/frontImageDescription"
android:scaleType="fitCenter" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/backImageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="@dimen/activity_margin"
android:layout_marginTop="@dimen/activity_margin"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_marginBottom="@dimen/activity_margin"
android:paddingHorizontal="@dimen/inputPadding"
android:layout_weight="1"
app:cardCornerRadius="4dp"
app:cardElevation="0dp">
<ImageView
android:id="@+id/backImage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:contentDescription="@string/backImageDescription"
android:scaleType="fitCenter" />
</androidx.cardview.widget.CardView>
</LinearLayout>
<TextView
android:id="@+id/noteView"
android:autoLink="all"

View File

@@ -2,8 +2,23 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/settings_container"
android:layout_width="match_parent"

View File

@@ -0,0 +1,63 @@
Sylvia van Os
Branden Archer
J. Lavoie
Allan Nordhøy
Heimen Stoffels
solokot
mondstern
Taco
Gediminas Murauskas
IllusiveMan196
Samantaz Fox
arno-github
Sergio Paredes
Joel A
Nyatsuki
StoyanDimitrov
arshbeerSingh
huuhaa
Michael Moroni
Petr Novák
betsythefc
K. Herbert
Oğuz Ersen
Quentin PAGÈS
Yurical
Adolfo Jayme-Barrientos
Alessandro Mandelli
KovalevArtem
Clonewayx
D. Domig
Diego
Jane Kong
Lukas Grassauer
Michalis
schirinowski
String E. Fighter
inesre
lgasp
phlostically
waffshappen
Kevin Sicong Jiang
Miha Frangež
Airat
BMN
Franciszek Stefan
Izzy
Karol Kosek
bittin
Maciej Błędkowski
Mattia
pbeckmann
Peer Beckmann
Rose Liverman
Simone Dotto
Subhashish Anand
Tymofii Lytvynenko
Tjipke van der Heide
opsik
psa-jforestier
Robin
sergio
Marcus
techwebpd

View File

@@ -28,7 +28,6 @@
<string name="frontImageDescription">Снимка на предната страна на карта</string>
<string name="backImageDescription">Снимка на задната страна на карта</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> не изглежда истинска наличност.</string>
<string name="barcodeImageDescription">Изображение на щрихкода на картата</string>
<string name="no">Не</string>
<string name="yes">Да</string>
<string name="setBackImage">Снимка на задната страна</string>
@@ -175,4 +174,20 @@
<item quantity="one">Изтриване на тази <xliff:g>%d</xliff:g> карта завинаги\?</item>
<item quantity="other">Изтриване на тези <xliff:g>%d</xliff:g> карти за постоянно\?</item>
</plurals>
<string name="app_contributors">Осъществено от: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Браун</string>
<string name="settings_grey_theme">Сив</string>
<string name="settings_green_theme">Зелен</string>
<string name="settings_sky_blue_theme">Небесно синьо</string>
<string name="settings_blue_theme">Синьо</string>
<string name="settings_violet_theme">Виолет</string>
<string name="settings_magenta_theme">Магента</string>
<string name="settings_pink_theme">Розов</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Цвят на темата</string>
<string name="settings_system_locale">Система</string>
<string name="settings_locale">Език</string>
<string name="noGroupCards">Тази група не съдържа карти</string>
<string name="toggleMoreInfo">Превключване на повече информация</string>
<string name="barcodeImageDescriptionWithType">Изображение на щрихкод на карта от вида <xliff:g>%s</xliff:g></string>
</resources>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Přidat</string>
<string name="noGiftCards">Klepnutím na tlačítko + plus přidáte kartu nebo ji nejprve importujete z nabídky⋮.</string>
<string name="storeName">Název</string>
@@ -16,7 +16,6 @@
<string name="editCardTitle">Editovat věrnostní kartu</string>
<string name="addCardTitle">Přidat věrnostní kartu</string>
<string name="scanCardBarcode">Skenování Čárový Kód Karty</string>
<string name="barcodeImageDescription">Obrázek čárového kódu karty</string>
<string name="noStoreError">Zadáno žádné jméno</string>
<string name="noCardIdError">Žádné ID karty zadáno</string>
<string name="importExport">Import/Export</string>
@@ -72,4 +71,125 @@
<string name="barcodeType">Typ čárového kódu</string>
<string name="noMatchingGiftCards">Nic jsem nenašel. Zkuste změnit vyhledávání.</string>
<string name="action_search">Vyhledávání</string>
<string name="thumbnailDescription">Miniatura karty</string>
<string name="card_ids_copied">Zkopírované ID karty(karet)</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Opravdu chcete kartu <xliff:g>%d</xliff:g> trvale odstranit\?</item>
<item quantity="few">Opravdu chcete karty <xliff:g>%d</xliff:g> trvale odstranit\?</item>
<item quantity="other">Opravdu chcete karty <xliff:g>%d</xliff:g> trvale odstranit\?</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="one">Odstranit kartu <xliff:g>%d</xliff:g></item>
<item quantity="few">Odstranit karty <xliff:g>%d</xliff:g></item>
<item quantity="other">Odstranit karty <xliff:g>%d</xliff:g></item>
</plurals>
<string name="importSuccessful">Data karty importována</string>
<string name="intent_import_card_from_url_share_text">Chci s Vámi sdílet kartu</string>
<string name="settings_disable_lockscreen_while_viewing_card">Bránit uzamykání obrazovky</string>
<string name="settings_keep_screen_on">Udržovat obrazovku zapnutou</string>
<string name="settings_lock_barcode_orientation">Zamknout orientaci čárového kódu</string>
<string name="settings_max_font_size_scale">Maximální velikost písma</string>
<string name="settings_dark_theme">Tmavý</string>
<string name="settings_light_theme">Světlý</string>
<string name="settings_system_theme">Systém</string>
<string name="settings_theme">Vzhled</string>
<string name="settings_category_title_ui">Uživatelské rozhraní</string>
<string name="settings">Nastavení</string>
<string name="card">Karta</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> bodů</string>
<string name="balanceSentence">Zůstatek: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Platnost vypršela: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Platí do: <xliff:g>%s</xliff:g></string>
<string name="moveDown">Přesunout dolů</string>
<string name="moveUp">Přesunout nahoru</string>
<string name="enterBarcodeInstructions">Zadejte ID karty a níže vyberte typ čárového kódu nebo \"Tato karta nemá čárový kód\".</string>
<string name="settings_brown_theme">Hnědá</string>
<string name="settings_grey_theme">Šedá</string>
<string name="settings_green_theme">Zelená</string>
<string name="settings_sky_blue_theme">Azurová</string>
<string name="settings_blue_theme">Modrá</string>
<string name="settings_violet_theme">Fialová</string>
<string name="settings_magenta_theme">Purpurová</string>
<string name="settings_pink_theme">Růžová</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Barva motivu</string>
<string name="settings_system_locale">Systém</string>
<string name="settings_locale">Jazyk</string>
<string name="turn_flashlight_off">Vypnout světlo</string>
<string name="turn_flashlight_on">Zapnout světlo</string>
<string name="failedGeneratingShareURL">Nepodařilo se vygenerovat sdílenou adresu URL. Nahlaste to prosím.</string>
<string name="passwordRequired">Zadejte prosím heslo</string>
<string name="no">Ne</string>
<string name="yes">Ano</string>
<string name="updateBarcodeQuestionText">Změnili jste ID karty. Chcete také aktualizovat čárový kód, aby používal stejnou hodnotu\?</string>
<string name="updateBarcodeQuestionTitle">Aktualizovat hodnotu čárového kódu\?</string>
<string name="takePhoto">Pořídit fotku</string>
<string name="removeImage">Odstranit obrázek</string>
<string name="setBackImage">Nastavit obrázek zadní strany</string>
<string name="setFrontImage">Nastavit obrázek přední strany</string>
<string name="photos">Fotky</string>
<string name="backImageDescription">Obrázek zadní strany karty</string>
<string name="frontImageDescription">Obrázek přední strany karty</string>
<string name="intent_import_card_from_url_share_multiple_text">Chci s Vámi sdílet kartu</string>
<string name="copy_to_clipboard_multiple_toast">ID karty zkopírováno do schránky</string>
<string name="wrongValueForBarcodeType">Hodnota není platná pro vybraný typ čárového kódu</string>
<string name="unsupportedBarcodeType">Tento typ čárového kódu zatím nelze zobrazit. Možná bude podporován v pozdější verzi aplikace.</string>
<string name="barcodeId">Hodnota čárového kódu</string>
<string name="setBarcodeId">Nastavení hodnoty čárového kódu</string>
<string name="sameAsCardId">Stejné jako ID karty</string>
<string name="importVoucherVaultMessage">Vyberte svůj <i>vouchervault.json</i> export z Voucher Vault, který chcete importovat.
\nNebo jej vytvořte tak, že nejprve stisknete tlačítko Exportovat v aplikaci Voucher Vault.</string>
<string name="importVoucherVault">Import z Voucher Vault</string>
<string name="importStocardMessage">Vyberte svůj <i>***-sync.zip</i> export z aplikace Stocard, který chcete importovat.
\nNebo jej získáte zasláním e-mailu na adresu support@stocardapp.com s žádostí o export vašich dat.</string>
<string name="importStocard">Import ze Stocard</string>
<string name="importLoyaltyCardKeychainMessage">Vyberte export <i>LoyaltyCardKeychain.csv</i> z klíčenky věrnostních karet, který chcete importovat.
\nNebo jej vytvořte z nabídky Import/Export v Loyalty Card Keychain tak, že tam nejprve stisknete tlačítko Exportovat.</string>
<string name="importLoyaltyCardKeychain">Import z Loyalty Card Keychain</string>
<string name="importFidmeMessage">Vyberte svůj <i>fidme-export-request-xxxxxx.zip</i> export z FidMe k importu a poté vyberte typy čárových kódů ručně.
\nNebo jej vytvořte ze svého profilu FidMe tak, že nejprve zvolíte možnost Ochrana dat a poté stisknete tlačítko Extract moje data.</string>
<string name="importFidme">Import z FidMe</string>
<string name="importCatimaMessage">Vyberte export <i>catima.zip</i> z programu Catima, který chcete importovat.
\nNebo jej vytvořte z nabídky Import/Export jiné aplikace Catima tak, že v ní nejprve stisknete tlačítko Exportovat.</string>
<string name="importCatima">Import z Catima</string>
<string name="accept">Přijmout</string>
<string name="privacy_policy_popup_text">Oznámení o zásadách ochrany osobních údajů (vyžadováno některými obchody s aplikacemi):
\n
\nNejsou shromažďovány žádné údaje, což může potvrdit každý, protože naše aplikace je libre software.</string>
<string name="privacy_policy">Zásady soukromí</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="chooseImportType">Importovat data z\?</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> se nezdá být platným zůstatkem.</string>
<string name="points">Body</string>
<string name="currency">Měna</string>
<string name="balance">Zůstatek</string>
<string name="errorReadingImage">Obrázek se nepodařilo přečíst</string>
<string name="noBarcodeFound">Čarový kód nenalezen</string>
<string name="groupsList">Skupiny: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Výběr obrázku z galerie</string>
<string name="addManually">Ruční zadání ID karty</string>
<string name="leaveWithoutSaveConfirmation">Ukončit bez uložení\?</string>
<string name="leaveWithoutSaveTitle">Ukončit</string>
<string name="failedOpeningFileManager">Nejprve si nainstalujte správce souborů.</string>
<string name="deleteConfirmationGroup">Smazat skupinu\?</string>
<string name="all">Všechny</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> karta</item>
<item quantity="few"><xliff:g>%d</xliff:g> karty</item>
<item quantity="other"><xliff:g>%d</xliff:g> karet</item>
</plurals>
<string name="noGroups">Kliknutím na tlačítko + plus nejprve přidejte skupiny pro kategorizaci.</string>
<string name="groups">Skupiny</string>
<string name="enter_group_name">Zadejte název skupiny</string>
<string name="exportSuccessful">Data karty exportována</string>
<string name="settings_display_barcode_max_brightness">Rozjasněné zobrazení čárového kódu</string>
<string name="starImage">Oblíbená hvězda</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<plurals name="selectedCardCount">
<item quantity="one">Vybrána <xliff:g>%d</xliff:g> karta</item>
<item quantity="few">Vybrány <xliff:g>%d</xliff:g> karty</item>
<item quantity="other">Vybráno <xliff:g>%d</xliff:g> karet</item>
</plurals>
<string name="app_contributors">Přispěli: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Tato skupina neobsahuje žádné karty</string>
</resources>

View File

@@ -2,8 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">Suchen</string>
<string name="action_add">Hinzufügen</string>
<string name="noGiftCards">Klicken Sie auf das Pluszeichen +, um eine Karte hinzuzufügen, oder importieren Sie zunächst einige aus dem ⋮ Menü.</string>
<string name="noMatchingGiftCards">Nichts gefunden. Versuchen Sie, Ihre Suche zu ändern.</string>
<string name="noGiftCards">Füge eine Karte mit + hinzu oder importiere welche über das ⋮ Menü.</string>
<string name="noMatchingGiftCards">Nichts gefunden. Versuche, deine Suche zu ändern.</string>
<string name="storeName">Name</string>
<string name="note">Notiz</string>
<string name="cardId">Kartennummer</string>
@@ -12,25 +12,24 @@
<string name="edit">Bearbeiten</string>
<string name="delete">Löschen</string>
<string name="confirm">Bestätigen</string>
<string name="lockScreen">Rotation blockieren</string>
<string name="unlockScreen">Rotation zulassen</string>
<string name="lockScreen">Rotation sperren</string>
<string name="unlockScreen">Rotation erlauben</string>
<string name="star">Zu den Favoriten hinzufügen</string>
<string name="unstar">Aus der Favoritenliste entfernen</string>
<string name="unstar">Aus den Favoriten entfernen</string>
<string name="ok">OK</string>
<string name="copy_to_clipboard">Nummer in die Zwischenablage kopieren</string>
<string name="copy_to_clipboard">Kartennummer in die Zwischenablage kopieren</string>
<string name="sendLabel">Senden </string>
<string name="editCardTitle">Kundenkarte bearbeiten</string>
<string name="addCardTitle">Neue Kundenkarte</string>
<string name="scanCardBarcode">Strichcode scannen</string>
<string name="editCardTitle">Karte bearbeiten</string>
<string name="addCardTitle">Neue Karte</string>
<string name="scanCardBarcode">Barcode scannen</string>
<string name="cardShortcut">Shortcut zu einer Karte</string>
<string name="noCardsMessage">Fügen Sie zuerst eine Karte hinzu</string>
<string name="barcodeImageDescription">Bild des Strichcodes</string>
<string name="noCardsMessage">Füge zuerst eine Karte hinzu</string>
<string name="noStoreError">Kein Name eingegeben</string>
<string name="noCardIdError">Keine Kartennummer angegeben</string>
<string name="noCardExistsError">Karte konnte nicht gefunden werden</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Exportieren</string>
<string name="importExportHelp">Durch das Sichern Ihrer Karten können Sie sie auf ein anderes Gerät verschieben.</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Durch das Sichern deiner Karten kannst du sie auf ein anderes Gerät übertragen.</string>
<string name="importSuccessfulTitle">Importiert</string>
<string name="importFailedTitle">Import fehlgeschlagen</string>
<string name="importFailed">Karten konnten nicht importiert werden</string>
@@ -39,51 +38,52 @@
<string name="exportFailed">Karten konnten nicht exportiert werden</string>
<string name="importing">Importiere…</string>
<string name="exporting">Exportiere…</string>
<string name="noExternalStoragePermissionError">Erteilen Sie zuerst die Erlaubnis zur externen Speicherung, um Karten zu importieren oder zu exportieren</string>
<string name="importOptionFilesystemTitle">Importiere aus Dateisystem</string>
<string name="importOptionFilesystemExplanation">Wähle eine Datei aus dem Speicher aus.</string>
<string name="importOptionFilesystemButton">Aus Dateisystem</string>
<string name="importOptionApplicationTitle">Andere Anwendung verwenden</string>
<string name="importOptionApplicationExplanation">Verwenden Sie eine beliebige Anwendung oder Ihren bevorzugten Dateiverwaltungsprogramm, um eine Datei zu öffnen.</string>
<string name="importOptionApplicationButton">Andere Anwendung verwenden</string>
<string name="noExternalStoragePermissionError">Erlaube Speicherzugriff um Karten zu importieren oder exportieren</string>
<string name="importOptionFilesystemTitle">Importiere aus dem Dateisystem</string>
<string name="importOptionFilesystemExplanation">Wähle eine Datei vom Dateisystem aus.</string>
<string name="importOptionFilesystemButton">Wähle vom Dateisystem</string>
<string name="importOptionApplicationTitle">Andere Anwendungen</string>
<string name="importOptionApplicationExplanation">Beliebige Anwendung oder deinen bevorzugten Dateimanager zur Dateiauswahl verwenden.</string>
<string name="importOptionApplicationButton">Aus anderer Anwendung</string>
<string name="about">Über</string>
<string name="app_license">Freie Software, lizensiert unter der GPLv3+.</string>
<string name="about_title_fmt">Über <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informationen zu dieser Version: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Strichcode auswählen</string>
<string name="copy_to_clipboard_toast">Nummer in die Zwischenablage kopiert</string>
<string name="app_revision_fmt">Revisionsinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Barcode auswählen</string>
<string name="copy_to_clipboard_toast">Kartennummer in die Zwischenablage kopiert</string>
<string name="thumbnailDescription">Vorschaubild für die Karte</string>
<string name="settings">Einstellungen</string>
<string name="settings_category_title_ui">Benutzeroberfläche</string>
<string name="settings_display_barcode_max_brightness">Helligkeit bei Strichcode Ansicht erhöhen</string>
<string name="settings_lock_barcode_orientation">Strichcodeausrichtung sperren</string>
<string name="settings_display_barcode_max_brightness">Barcodeansicht aufhellen</string>
<string name="settings_lock_barcode_orientation">Barcoderotation sperren</string>
<string name="exportSuccessful">Kartendaten exportiert</string>
<string name="importSuccessful">Kartendaten importiert</string>
<string name="intent_import_card_from_url_share_text">Ich will eine Karte mit Ihnen teilen</string>
<string name="intent_import_card_from_url_share_text">Ich würde gerne diese Karte mit dir teilen</string>
<string name="settings_dark_theme">Dunkel</string>
<string name="settings_light_theme">Hell</string>
<string name="settings_system_theme">System</string>
<string name="settings_theme">Design</string>
<string name="enterBarcodeInstructions">Geben Sie die Karten-ID ein und wählen Sie unten entweder den Strichcodetyp oder „Diese Karte hat keinen Strichcode“.</string>
<string name="settings_theme">Theme</string>
<string name="enterBarcodeInstructions">Gib die Kartennummer ein und wähle entweder den Barcode-Typ unten oder wähle \"Diese Karte hat keinen Barcode\" aus.</string>
<string name="app_copyright_old">Basierend auf Loyalty Card Keychain
\nCopyright © 2016-2020 Branden Archer.</string>
<string name="exportOptionExplanation">Die Daten werden an einen Ort Ihrer Wahl geschrieben.</string>
<string name="failedParsingImportUriError">Der Import-URI konnte nicht analysiert werden</string>
<string name="exportOptionExplanation">Die Daten werden an einen Ort deiner Wahl geschrieben.</string>
<string name="failedParsingImportUriError">Die Import-URI konnte nicht verarbeitet werden</string>
<string name="share">Teilen</string>
<string name="barcodeNoBarcode">Diese Karte hat keinen Strichcode</string>
<string name="barcodeType">Strichcode-Typ</string>
<string name="barcodeNoBarcode">Diese Karte hat keinen Barcode</string>
<string name="barcodeType">Barcodetyp</string>
<string name="starImage">Favoritenstern</string>
<string name="deleteConfirmationGroup">Gruppe löschen\?</string>
<string name="deleteConfirmationGroup">Gruppe löschen?</string>
<string name="all">Alle</string>
<string name="noGroups">Klicken Sie auf das Pluszeichen +, um zunächst Gruppen zur Kategorisierung hinzuzufügen.</string>
<string name="noGroups">Klicke auf das Pluszeichen + um eine Gruppe hinzuzufügen.</string>
<string name="noGroupCards">Diese Gruppe hat noch keine Karten</string>
<string name="groups">Gruppen</string>
<string name="enter_group_name">Geben Sie den Gruppennamen ein</string>
<string name="enter_group_name">Gib einen Gruppennamen ein</string>
<string name="leaveWithoutSaveConfirmation">Beenden ohne zu speichern\?</string>
<string name="leaveWithoutSaveTitle">Beenden</string>
<string name="failedOpeningFileManager">Installieren Sie zunächst ein Dateiverwaltungsprogramm.</string>
<string name="noBarcode">Kein Strichcode</string>
<string name="addManually">Die Karten-ID manuell eingeben</string>
<string name="failedOpeningFileManager">Installiere zuerst einen Dateimanager.</string>
<string name="noBarcode">Kein Barcode</string>
<string name="addManually">Kartennummer manuell eingeben</string>
<string name="moveDown">Nach unten verschieben</string>
<string name="moveUp">Nach oben verschieben</string>
<plurals name="groupCardCount">
@@ -91,18 +91,18 @@
<item quantity="other"><xliff:g>%d</xliff:g> Karten</item>
</plurals>
<string name="groupsList">Gruppen: <xliff:g>%s</xliff:g></string>
<string name="app_loyalty_card_keychain">Bonuskartenschlüsselring</string>
<string name="chooseImportType">Daten importieren aus\?</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="chooseImportType">Daten importieren aus?</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> scheint kein gültiges Guthaben zu sein.</string>
<string name="points">Punkte</string>
<string name="currency">Währung</string>
<string name="balance">Guthaben</string>
<string name="moveBarcodeToCenterOfScreen">Strichcode auf dem Bildschirm zentrieren</string>
<string name="moveBarcodeToTopOfScreen">Strichcode auf dem Bildschirm nach oben schieben</string>
<string name="moveBarcodeToCenterOfScreen">Barcode auf dem Bildschirm zentrieren</string>
<string name="moveBarcodeToTopOfScreen">Barcode auf dem Bildschirm oben fixieren</string>
<string name="chooseExpiryDate">Ablaufdatum wählen</string>
<string name="never">Nie</string>
<string name="expiryDate">Ablaufdatum</string>
<string name="editBarcode">Strichcode bearbeiten</string>
<string name="editBarcode">Barcode ändern</string>
<string name="barcode">Strichcode</string>
<string name="card">Karte</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> Punkte</string>
@@ -110,7 +110,7 @@
<string name="expiryStateSentenceExpired">Abgelaufen: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Läuft ab: <xliff:g>%s</xliff:g></string>
<string name="settings_disable_lockscreen_while_viewing_card">Sperrbildschirm verhindern</string>
<string name="settings_keep_screen_on">Bildschirm eingeschaltet halten</string>
<string name="settings_keep_screen_on">Bildschirm aktiv halten</string>
<string name="privacy_policy_popup_text">Hinweis zum Datenschutz (oft gefordert):
\n
\nKEINE DATEN WERDEN GESAMMELT, was jeder bestätigen kann, da unsere Anwendung eine freie Software ist.</string>
@@ -128,45 +128,45 @@
<string name="importCatimaMessage">Wählen Sie Ihren <i>catima.zip</i>-Export aus Catima zum Importieren aus.
\nOder erstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken.</string>
<string name="importCatima">Aus Catima importieren</string>
<string name="setBarcodeId">Strichcodewert setzen</string>
<string name="sameAsCardId">Gleich wie Karten-ID</string>
<string name="barcodeId">Strichcodewert</string>
<string name="errorReadingImage">Das Bild konnte nicht gelesen werden</string>
<string name="noBarcodeFound">Kein Strichcode gefunden</string>
<string name="addFromImage">Bild aus der Galerie auswählen</string>
<string name="settings_max_font_size_scale">Max. Schriftgröße</string>
<string name="unsupportedBarcodeType">Dieser Strichcodetyp kann noch nicht angezeigt werden. Er wird möglicherweise in einer späteren Version der Anwendung unterstützt.</string>
<string name="wrongValueForBarcodeType">Der Wert ist für den gewählten Strichcodetyp nicht gültig</string>
<string name="setBarcodeId">Manuell eingeben</string>
<string name="sameAsCardId">Entspricht Kartennummer</string>
<string name="barcodeId">Barcodewert</string>
<string name="errorReadingImage">Bildverarbeitung fehlgeschlagen</string>
<string name="noBarcodeFound">Kein Barcode erkannt</string>
<string name="addFromImage">Bild aus der Galerie wählen</string>
<string name="settings_max_font_size_scale">Maximale Schriftgröße</string>
<string name="unsupportedBarcodeType">Dieser Barcodetyp kann noch nicht angezeigt werden. Wir hoffen das Format in einer zukünftigen Version zu unterstützen.</string>
<string name="wrongValueForBarcodeType">Der Wert ist für den gewählten Barcodetyp leider nicht gültig</string>
<string name="app_resources">Freie Ressourcen von Drittanbietern: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Freie Bibliotheken von Drittanbietern: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="intent_import_card_from_url_share_multiple_text">Ich möchte Karten mit dir teilen</string>
<string name="intent_import_card_from_url_share_multiple_text">Ich möchte diese Karten mit dir teilen</string>
<string name="copy_to_clipboard_multiple_toast">Kartennummern in die Zwischenablage kopiert</string>
<string name="card_ids_copied">Kartennummer(n) kopiert</string>
<string name="no">Nein</string>
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionText">Sie haben die Karten-ID geändert. Möchten Sie auch den Strichcode aktualisieren, um denselben Wert zu verwenden\?</string>
<string name="updateBarcodeQuestionTitle">Strichcodewert aktualisieren\?</string>
<string name="updateBarcodeQuestionText">Kartennummer geändert. Möchtest du auch den Barcode auf den gleichen Wert ändern?</string>
<string name="updateBarcodeQuestionTitle">Barcodewert aktualisieren?</string>
<string name="takePhoto">Foto aufnehmen</string>
<string name="removeImage">Bild entfernen</string>
<string name="setBackImage">Rückseitenbild einstellen</string>
<string name="setFrontImage">Vorderseitenbild einstellen</string>
<string name="setBackImage">Kartenrückseite</string>
<string name="setFrontImage">Kartenvorderseite</string>
<string name="photos">Fotos</string>
<string name="frontImageDescription">Bild der Kartenvorderseite</string>
<string name="backImageDescription">Bild der Kartenrückseite</string>
<string name="passwordRequired">Bitte geben Sie das Passwort ein</string>
<string name="passwordRequired">Bitte gib das Passwort ein</string>
<string name="importStocardMessage">Wählen Sie Ihren <i>***-sync.zip</i>-Export aus Stocard zum Importieren aus.
\nOder Sie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten.</string>
<string name="importStocard">Von Stocard importieren</string>
<string name="turn_flashlight_off">Taschenlampe ausschalten</string>
<string name="turn_flashlight_on">Taschenlampe einschalten</string>
<string name="failedGeneratingShareURL">Keine teilbare URL konnte generiert werden. Bitte melden Sie dies.</string>
<string name="turn_flashlight_off">Licht ausschalten</string>
<string name="turn_flashlight_on">Licht einschalten</string>
<string name="failedGeneratingShareURL">URL konnte nicht erstellt werden. Bitte melde das an uns.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> Karte ausgewählt</item>
<item quantity="other"><xliff:g>%d</xliff:g> Karten ausgewählt</item>
</plurals>
<string name="deleteTitle">Karte entfernen</string>
<string name="deleteConfirmation">Diese Karte löschen\?</string>
<string name="deleteTitle">Karte löschen</string>
<string name="deleteConfirmation">Diese Karte wirklich löschen?</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Diese <xliff:g>%d</xliff:g> Karte endgültig löschen\?</item>
<item quantity="other">Diese <xliff:g>%d</xliff:g> Karten endgültig löschen\?</item>
@@ -175,4 +175,20 @@
<item quantity="one"><xliff:g>%d</xliff:g> Karte löschen</item>
<item quantity="other"><xliff:g>%d</xliff:g> Karten löschen</item>
</plurals>
<string name="settings_system_locale">System</string>
<string name="settings_locale">Sprache</string>
<string name="settings_brown_theme">Braun</string>
<string name="settings_grey_theme">Grau</string>
<string name="settings_green_theme">Grün</string>
<string name="settings_sky_blue_theme">Himmelblau</string>
<string name="settings_blue_theme">Blau</string>
<string name="settings_violet_theme">Violett</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Rosa</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Designfarbe</string>
<string name="app_contributors">Ermöglicht durch: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="toggleMoreInfo">Umschalten, um weitere Informationen anzuzeigen</string>
<string name="barcodeImageDescriptionWithType">Bild des Kartenstrichcodes des Typs <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Wischen oder langes Drücken zum Wechseln der Bilder</string>
</resources>

View File

@@ -20,7 +20,6 @@
<string name="scanCardBarcode">Σαρώστε τον κωδικό της κάρτας</string>
<string name="cardShortcut">Συντόμευση Κάρτας</string>
<string name="noCardsMessage">Δεν υπάρχουν κάρτες. προσθέστε μία πρώτα</string>
<string name="barcodeImageDescription">Εικόνα του barcode της κάρτας</string>
<string name="noStoreError">Δεν δώσατε κατάστημα</string>
<string name="noCardIdError">Δεν δώσατε κωδικό κάρτας</string>
<string name="noCardExistsError">Δεν ήταν δυνατό να εντοπιστεί κάρτα</string>

View File

@@ -52,4 +52,31 @@
<string name="action_search">Serĉi</string>
<string name="deleteConfirmation">Ĉu forigi ĉi tiun karton\?</string>
<string name="deleteTitle">Forigi karton</string>
<string name="settings_lock_barcode_orientation">Seruro barcode orientiĝo</string>
<string name="settings_display_barcode_max_brightness">Heligi barcode vido</string>
<string name="settings_max_font_size_scale">Max. tiparo grandeco</string>
<string name="starImage">Preferata stelo</string>
<string name="thumbnailDescription">Bildeto por karto</string>
<string name="app_copyright_old">Bazita sur Lojaleco Karto Keychain
\nkopirajto © 2016-2020 Branden Archer.</string>
<string name="importOptionApplicationButton">Uzi alian app</string>
<string name="importOptionApplicationExplanation">Uzi ajna app aŭ via preferata dosiera # mana\? ero por malfermi dosieron.</string>
<string name="importOptionApplicationTitle">Uzi alian app</string>
<string name="importOptionFilesystemExplanation">Elektu specifa dosiero de la dosiersistemo.</string>
<string name="exportOptionExplanation">La datumoj estos skribita al loko de via elekto.</string>
<string name="noExternalStoragePermissionError">Grant ekstera stokado permeso de importado aŭ eksportado kartoj unua</string>
<string name="exportFailed">Ne povis eksporti kartoj</string>
<string name="importFailed">Ne povis importi kartoj</string>
<string name="importExportHelp">Subtenanta supre vian kartoj permesas vin movi ilin al alia aparato.</string>
<string name="failedParsingImportUriError">Ne eblis analizi la importado URI</string>
<string name="noCardExistsError">Ne eblis trovi karto</string>
<string name="noCardIdError">Neniu karto ID eniris</string>
<string name="noStoreError">Neniu eniris nomo</string>
<string name="noCardsMessage">Aldoni karto unua</string>
<string name="cardShortcut">Karto Mallongirejo</string>
<string name="scanCardBarcode">Scintigrafio Barcode Card</string>
<string name="share">Interŝanĝado</string>
<string name="unlockScreen">Malbloki Rotacio</string>
<string name="lockScreen">Bloko Rotacio</string>
<string name="star">Aldoni al miaj plej ŝatataj</string>
</resources>

View File

@@ -20,7 +20,6 @@
<string name="scanCardBarcode">Escanear código de barras de la tarjeta</string>
<string name="cardShortcut">Atajo de tarjeta</string>
<string name="noCardsMessage">Añada una tarjeta primero</string>
<string name="barcodeImageDescription">Imagen del código de barras de la tarjeta</string>
<string name="noStoreError">No se proporcionó ningún nombre</string>
<string name="noCardIdError">Id. de tarjeta no especificado</string>
<string name="noCardExistsError">No se ha podido encontrar la tarjeta</string>
@@ -113,7 +112,7 @@
\nO créalo primero desde tu perfil de FidMe eligiendo Protección de datos y pulsa Extraer mis datos.</string>
<string name="importLoyaltyCardKeychainMessage">Seleccione su <i>LoyaltyCardKeychain.csv</i> exportado desde Loyalty Card Keychain para importarlo.
\nO créalo primero desde el menú Importar/Exportar en Loyalty Card Keychain pulsando Exportar desde allí.</string>
<string name="importStocardMessage">Seleccione su <i>*-sync.zip</i> exportado de Stocard para importarla, y selecciona los tipos de códigos de barras manualmente después.
<string name="importStocardMessage">Seleccione su exportación <i>*-sync.zip</i> de Stocard para importarla.
\nO consígalo enviando un correo electrónico a support@stocardapp.com solicitando una exportación de sus datos.</string>
<string name="importVoucherVaultMessage">Seleccione su <i>vouchervault.json</i> exportado desde Voucher Vault para importarlo.
\nO créalo pulsando primero Exportar en Voucher Vault.</string>
@@ -175,4 +174,18 @@
<item quantity="one">Borrar <xliff:g>%d</xliff:g> tarjeta</item>
<item quantity="other">Borrar <xliff:g>%d</xliff:g> tarjetas</item>
</plurals>
<string name="app_contributors">Hecho posible por: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Marrón</string>
<string name="settings_grey_theme">Gris</string>
<string name="settings_green_theme">Verde</string>
<string name="settings_sky_blue_theme">Azul cielo</string>
<string name="settings_blue_theme">Azul</string>
<string name="settings_violet_theme">Violeta</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Rosa</string>
<string name="settings_theme_color">Color del tema</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_system_locale">Sistema</string>
<string name="settings_locale">Lengua</string>
<string name="noGroupCards">Este grupo no contiene ninguna tarjeta</string>
</resources>

View File

@@ -117,7 +117,6 @@
<string name="noCardExistsError">Korttia ei löytynyt</string>
<string name="noCardIdError">Kortin ID-tunnusta ei annettu</string>
<string name="noStoreError">Nimeä ei annettu</string>
<string name="barcodeImageDescription">Kuva kortin viivakoodista</string>
<string name="card_ids_copied">Kopioidut korttitunnukset</string>
<string name="noCardsMessage">Lisää ensin kortti</string>
<string name="cardShortcut">Kortin pikakuvake</string>
@@ -175,4 +174,18 @@
<string name="failedGeneratingShareURL">Ei pystynyt luomaan jaettavaa URL-osoitetta. Ilmoita tästä.</string>
<string name="turn_flashlight_on">Sytytä taskulamppu</string>
<string name="turn_flashlight_off">Sammuta salamavalo</string>
<string name="app_contributors">Mahdollistanut: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Ruskea</string>
<string name="settings_grey_theme">Harmaa</string>
<string name="settings_green_theme">Vihreä</string>
<string name="settings_sky_blue_theme">Taivaan sininen</string>
<string name="settings_blue_theme">Siniset</string>
<string name="settings_violet_theme">Violetti</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Pinkki</string>
<string name="settings_theme_color">Teeman väri</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_system_locale">Järjestelmä</string>
<string name="settings_locale">Kieli</string>
<string name="noGroupCards">Tämä ryhmä ei sisällä kortteja</string>
</resources>

View File

@@ -20,7 +20,6 @@
<string name="scanCardBarcode">Scanner le code-barres</string>
<string name="cardShortcut">Raccourci de carte</string>
<string name="noCardsMessage">Ajoutez d\'abord une carte</string>
<string name="barcodeImageDescription">Image du code-barres</string>
<string name="noStoreError">Aucun nom saisi</string>
<string name="noCardIdError">Aucun numéro de carte saisi</string>
<string name="noCardExistsError">Aucune carte trouvée</string>
@@ -175,4 +174,21 @@
<item quantity="one">Supprimer <xliff:g>%d</xliff:g> carte</item>
<item quantity="other">Supprimer <xliff:g>%d</xliff:g> cartes</item>
</plurals>
<string name="settings_system_locale">Système</string>
<string name="settings_locale">Langue</string>
<string name="settings_brown_theme">Marron</string>
<string name="settings_grey_theme">Gris</string>
<string name="settings_green_theme">Vert</string>
<string name="settings_sky_blue_theme">Bleu ciel</string>
<string name="settings_blue_theme">Bleu</string>
<string name="settings_violet_theme">Violet</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Rose</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Couleur du thème</string>
<string name="app_contributors">Rendu possible par : <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Ce groupe ne contient pas de cartes</string>
<string name="toggleMoreInfo">Activer/désactiver l\'affichage de plus d\'infos</string>
<string name="barcodeImageDescriptionWithType">Image du code-barres de la carte de type <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Balayez ou appuyez longuement pour changer d\'image</string>
</resources>

View File

@@ -24,7 +24,6 @@
<string name="scanCardBarcode">Scansiona il codice carta</string>
<string name="cardShortcut">Scorciatoia per la carta</string>
<string name="noCardsMessage">Aggiungi prima una carta</string>
<string name="barcodeImageDescription">Immagine del codice della carta</string>
<string name="noStoreError">Nessun nome inserito</string>
<string name="noCardIdError">Nessun codice carta inserito</string>
<string name="noCardExistsError">Impossibile trovare la carta</string>
@@ -175,4 +174,21 @@
<item quantity="one">Elimina <xliff:g>%d</xliff:g> carta</item>
<item quantity="other">Elimina <xliff:g>%d</xliff:g> carte</item>
</plurals>
<string name="settings_system_locale">Sistema</string>
<string name="settings_locale">Lingua</string>
<string name="settings_brown_theme">Marrone</string>
<string name="settings_grey_theme">Grigio</string>
<string name="settings_green_theme">Verde</string>
<string name="settings_sky_blue_theme">Azzurro</string>
<string name="settings_blue_theme">Blu</string>
<string name="settings_violet_theme">Viola</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Rosa</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Colore del tema</string>
<string name="app_contributors">Reso possibile da: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Questo gruppo non contiene carte</string>
<string name="toggleMoreInfo">Attiva/disattiva la visualizzazione di altre informazioni</string>
<string name="barcodeImageDescriptionWithType">Immagine del codice a barre della carta del tipo <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Scorri o premi a lungo per cambiare immagine</string>
</resources>

View File

@@ -110,7 +110,6 @@
<string name="noCardExistsError">カードが見つかりません</string>
<string name="noCardIdError">カード番号が入力されていません</string>
<string name="noStoreError">名前が入力されていません</string>
<string name="barcodeImageDescription">バーコードの画像</string>
<string name="noCardsMessage">カードを追加</string>
<string name="cardShortcut">カードのショートカット</string>
<string name="scanCardBarcode">カードのバーコードをスキャン</string>
@@ -126,7 +125,7 @@
<string name="delete">削除</string>
<string name="edit">編集</string>
<string name="save">保存</string>
<string name="cancel">り消し</string>
<string name="cancel"></string>
<string name="unstar">お気に入りから削除</string>
<string name="star">お気に入りに追加</string>
<string name="noBarcode">バーコードなし</string>
@@ -141,10 +140,10 @@
<string name="action_search">検索</string>
<string name="intent_import_card_from_url_share_multiple_text">カードを共有しましょう</string>
<string name="copy_to_clipboard_multiple_toast">カード番号をクリップボードにコピーしました</string>
<string name="card_ids_copied">コピーしたカード</string>
<string name="card_ids_copied">カード番号をコピーしました</string>
<string name="turn_flashlight_off">ライトをオフにする</string>
<string name="turn_flashlight_on">ライトをオンにする</string>
<string name="failedGeneratingShareURL">共有URLの生成に失敗しました。バグを報告してください。</string>
<string name="failedGeneratingShareURL">共有URLの生成を生成できませんでした。バグを報告してください。</string>
<string name="passwordRequired">パスワードを入力してください</string>
<string name="no">いいえ</string>
<string name="yes">はい</string>
@@ -157,7 +156,7 @@
<string name="photos">フォト</string>
<string name="backImageDescription">裏面</string>
<string name="frontImageDescription">表面</string>
<string name="importStocardMessage">Stocardでエクスポートした<i>***-sync.zip</i>ファイルを選択し、手動でバーコード形式を選択してください。
<string name="importStocardMessage">Stocardでエクスポートした<i>***-sync.zip</i>ファイルを選択してください。
\nファイルがない場合、e-mailing support@stocardapp.comにデータのエクスポートを要求してください。</string>
<string name="importStocard">Stocardからインポート</string>
<plurals name="selectedCardCount">
@@ -165,4 +164,27 @@
</plurals>
<string name="deleteConfirmation">このカードを削除しますか?</string>
<string name="deleteTitle">カードの削除</string>
<plurals name="deleteCardsConfirmation">
<item quantity="other"><xliff:g>%d</xliff:g> 枚のカードを削除しますか?</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="other"><xliff:g>%d</xliff:g> 枚のカードの削除</item>
</plurals>
<string name="barcodeImageDescriptionWithType">バーコード形式の画像 <xliff:g>%s</xliff:g></string>
<string name="toggleMoreInfo">詳細を表示する</string>
<string name="app_contributors">Made possible by: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Brown</string>
<string name="settings_grey_theme">Gray</string>
<string name="settings_green_theme">Green</string>
<string name="settings_sky_blue_theme">Sky Blue</string>
<string name="settings_blue_theme">Blue</string>
<string name="settings_violet_theme">Violet</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Pink</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">テーマカラー</string>
<string name="settings_system_locale">システム</string>
<string name="settings_locale">言語</string>
<string name="noGroupCards">このグループにはカードがありません</string>
<string name="swipeToSwitchImages">画像を切り替えるには長押し、またはスワイプ</string>
</resources>

View File

@@ -63,7 +63,6 @@
<string name="importFailedTitle">가져오기 실패</string>
<string name="importSuccessfulTitle">가져오기 완료</string>
<string name="noCardIdError">카드 ID를 입력하지 않음</string>
<string name="barcodeImageDescription">카드 바코드 이미지</string>
<string name="storeName">매장</string>
<string name="thumbnailDescription">카드 섬네일</string>
<string name="importOptionApplicationButton">외부 앱 사용</string>

View File

@@ -15,7 +15,6 @@
<string name="editCardTitle">Redaguoti lojalumo kortelę</string>
<string name="addCardTitle">Pridėti lojalumo kortelę</string>
<string name="scanCardBarcode">Skenuoti kortelės brūkšninį kodą</string>
<string name="barcodeImageDescription">Kortelės brūkšninio kodo vaizdas</string>
<string name="noStoreError">Neįvestas pavadinimas</string>
<string name="noCardIdError">Neįvestas kortelės ID</string>
<string name="importExport">Importuoti/Exportuoti</string>
@@ -179,4 +178,21 @@
<item quantity="few">Ištrinti <xliff:g>%d</xliff:g> korteles</item>
<item quantity="other">Ištrinti <xliff:g>%d</xliff:g> kortelių</item>
</plurals>
<string name="settings_system_locale">Sistemos</string>
<string name="settings_locale">Kalba</string>
<string name="settings_brown_theme">Ruda</string>
<string name="settings_grey_theme">Pilka</string>
<string name="settings_green_theme">Žalia</string>
<string name="settings_sky_blue_theme">Dangaus mėlynumo</string>
<string name="settings_blue_theme">Mėlyna</string>
<string name="settings_violet_theme">Violetinė</string>
<string name="settings_magenta_theme">Rausvai raudona</string>
<string name="settings_pink_theme">Rožinė</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Temos spalva</string>
<string name="app_contributors">Tapo įmanoma su pagalba: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Šioje grupėje nėra jokių kortelių</string>
<string name="toggleMoreInfo">Perjungti išsamios informacijos rodymą</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> tipo kortelės brūkšninio kodo vaizdas</string>
<string name="swipeToSwitchImages">Perbraukite arba ilgai palaikykite paspaudę, kad perjungtumėte vaizdus</string>
</resources>

View File

@@ -21,7 +21,6 @@
<string name="scanCardBarcode">Skann kortets strekkode</string>
<string name="cardShortcut">Kort-snarvei</string>
<string name="noCardsMessage">Legg til et kort først</string>
<string name="barcodeImageDescription">Bilde av kortets strekkode</string>
<string name="noStoreError">Navn ikke angitt</string>
<string name="noCardIdError">Ingen kort-ID innskrevet</string>
<string name="noCardExistsError">Kunne ikke finne kort</string>
@@ -118,7 +117,7 @@
<string name="privacy_policy">Personvernspraksis</string>
<string name="importFidme">Importer fra FidMe</string>
<string name="importCatima">Importer fra Catima</string>
<string name="errorReadingImage">Klarte ikke å lese bildet</string>
<string name="errorReadingImage">Kunne ikke lese bildet</string>
<string name="noBarcodeFound">Fant ingen strekkode</string>
<string name="addFromImage">Velg bilde fra galleri</string>
<string name="unsupportedBarcodeType">Denne strekkodetypen kan ikke vises for øyeblikket. Støtte kan bli lagt til i en senere versjon av programmet.</string>
@@ -128,17 +127,17 @@
<string name="importVoucherVaultMessage">Finn en fil som antagelig heter <i>voucher.vault.json</i> å importere.
\nEller opprett den ved å trykke «Eksport» i Voucher Vault først.</string>
<string name="importVoucherVault">Importer fra Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Finn en fil som antagelig heter <i>LoyaltyCardKeychain.csv</i> å importere.
\nEller opprett den i Import/eksport-menyen i Kundekortknippe ved å trykke «Eksporter» der først.</string>
<string name="importLoyaltyCardKeychainMessage">Velg din <i>LoyaltyCardKeychain.csv - </i> eksporter fra kundekort Nøkkelring til import.
\nEller lage det fra Import/Eksport-menyen i lojalitetskort Nøkkelringen ved å trykke Eksport det første.</string>
<string name="importLoyaltyCardKeychain">Importer fra Kundekortknippe</string>
<string name="importFidmeMessage">Finn en fil som antagelig heter <i>fidme.export-request-xxxxx.zip</i> å importere, for så å velge strekkodetypene manuelt etterpå-
\nEller opprett den i din FidMe-profil ved å velge «Databeskyttelse», for så å trykke «Pakk ut dataen min» først.</string>
<string name="importFidmeMessage">Velg din <i>fidme-eksport-be-xxxxxx.zip</i> eksporter fra FidMe til å importere, og velg strekkode typer manuelt etterpå.
\nEller lage den fra FidMe profil ved å velge Beskyttelse av Data og deretter trykke Trekke ut dataene mine første.</string>
<string name="importCatimaMessage">Finn en fil som antagelig heter <i>Catima.csv</i> å importere.
\nEller opprett den i Import/eksport-menyen i et annet Catima-program ved å trykke «Eksporter» der først.</string>
<string name="settings_max_font_size_scale">Maksimal skriftstørrelse</string>
<string name="settings_max_font_size_scale">Maks. skriftstørrelse</string>
<string name="wrongValueForBarcodeType">Verdien er ikke gyldig for valgt strekkodetype</string>
<string name="intent_import_card_from_url_share_multiple_text">Jeg ønsker å dele noen kort med deg</string>
<string name="copy_to_clipboard_multiple_toast">Kopierte kort-ID-er til utklippstavle</string>
<string name="intent_import_card_from_url_share_multiple_text">Jeg vil dele noen kort med deg</string>
<string name="copy_to_clipboard_multiple_toast">Kort-ID-er kopiert til utklippstavle</string>
<string name="app_resources">Frie tredjepartsressurser: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Frie tredjepartsbibliotek: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="card_ids_copied">Kopierte kort-ID(er)</string>
@@ -161,18 +160,35 @@
<string name="failedGeneratingShareURL">Klarte ikke å lage delbar nettadresse. Rapporter denne feilen.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kort valgt</item>
<item quantity="other"><xliff:g>%d</xliff:g> kort valgt</item>
<item quantity="other"><xliff:g>%d</xliff:g> korten valgt</item>
</plurals>
<string name="deleteConfirmation">Slett dette kortet\?</string>
<string name="deleteConfirmation">Slett dette kortet for godt\?</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Slett dette kortet for godt\?</item>
<item quantity="other">Slett disse <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> kortene for godt\?</item>
<item quantity="other">Slett disse <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g> kortene for godt\?</item>
</plurals>
<string name="turn_flashlight_on">Skru på lommelykten</string>
<string name="turn_flashlight_off">Skru av lommelykten</string>
<string name="deleteTitle">Fjern kundekort</string>
<string name="deleteTitle">Slett kort</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Slett <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> kort</item>
<item quantity="other">Slett <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> kort</item>
<item quantity="one">Slett <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g> kort</item>
<item quantity="other">Slett <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g> kort</item>
</plurals>
</resources>
<string name="settings_system_locale">System</string>
<string name="settings_locale">Språk</string>
<string name="settings_violet_theme">Fiolett</string>
<string name="settings_magenta_theme">Magentarød</string>
<string name="app_contributors">Muliggjort av: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Brun</string>
<string name="settings_grey_theme">Grå</string>
<string name="settings_green_theme">Grønn</string>
<string name="settings_sky_blue_theme">Himmelblå</string>
<string name="settings_blue_theme">Blå</string>
<string name="settings_pink_theme">Rosa</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Draktfarge</string>
<string name="noGroupCards">Denne gruppen inneholder ikke noen kort</string>
<string name="toggleMoreInfo">Veksle visning av mer info</string>
<string name="barcodeImageDescriptionWithType">Bilde av kortstrekkode av typen <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Dra eller hold lenge for å bygge bilder</string>
</resources>

View File

@@ -19,4 +19,6 @@
<color name="inputDividerBorder">#666666</color>
<color name="iconColor">#ffffff</color>
<color name="mainLoyaltyCardBackground">#000000</color>
</resources>

View File

@@ -25,7 +25,6 @@
<string name="scanCardBarcode">Scan de barcode van de kaart</string>
<string name="cardShortcut">Kaartsnelkoppeling</string>
<string name="noCardsMessage">Voeg eerst een kaart toe</string>
<string name="barcodeImageDescription">Afbeelding van barcode</string>
<string name="noStoreError">Geen naam ingevoerd</string>
<string name="noCardIdError">Geen kaartnummer ingevoerd</string>
<string name="noCardExistsError">De kaart is niet aangetroffen</string>
@@ -44,7 +43,7 @@
<string name="noExternalStoragePermissionError">Verleen het recht externe opslag om kaarten te kunnen im- of exporteren</string>
<string name="exportOptionExplanation">De gegevens worden weggeschreven op een locatie naar keuze.</string>
<string name="importOptionFilesystemTitle">Importeren uit bestandssysteem</string>
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand vanop het bestandssysteem.</string>
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand van het bestandssysteem.</string>
<string name="importOptionFilesystemButton">Van bestandssysteem</string>
<string name="importOptionApplicationTitle">Andere app gebruiken</string>
<string name="importOptionApplicationExplanation">Open een bestand middels een app of je favoriete bestandsbeheerder.</string>
@@ -55,7 +54,7 @@
<string name="debug_version_fmt">Versie: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Versie-informatie: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Barcode toevoegen</string>
<string name="enterBarcodeInstructions">Voer de kaart-id in en kies daarna het soort barcode druk op “Deze kaart heeft geen barcode”.</string>
<string name="enterBarcodeInstructions">Voer de kaart-id in en kies daarna het soort barcode of druk op “Deze kaart heeft geen barcode”.</string>
<string name="copy_to_clipboard_toast">De kaart-id is gekopieerd naar het klembord</string>
<string name="thumbnailDescription">Miniatuurvoorbeeld van kaart</string>
<string name="settings">Instellingen</string>
@@ -175,4 +174,21 @@
<item quantity="one">Weet je zeker dat je deze <xliff:g>%d</xliff:g> kaart wilt verwijderen\?</item>
<item quantity="other">Weet je zeker dat je deze <xliff:g>%d</xliff:g> kaarten wilt verwijderen\?</item>
</plurals>
<string name="settings_system_locale">Systeemtaal</string>
<string name="settings_locale">Taal</string>
<string name="settings_brown_theme">Bruin</string>
<string name="settings_grey_theme">Grijs</string>
<string name="settings_green_theme">Groen</string>
<string name="settings_sky_blue_theme">Hemelsblauw</string>
<string name="settings_blue_theme">Blauw</string>
<string name="settings_violet_theme">Violet</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Roze</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Themakleur</string>
<string name="app_contributors">Mede mogelijk gemaakt door: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Deze groep bevat geen kaarten</string>
<string name="toggleMoreInfo">Meer informatie tonen/verbergen</string>
<string name="barcodeImageDescriptionWithType">Afbeelding van de barcode, type <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Veeg of houd lang ingedrukt om te bladeren</string>
</resources>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="exporting">Exportacion…</string>
<string name="importing">Importacion…</string>
<string name="exportFailed">Exportacion pas possibla</string>
@@ -14,7 +14,6 @@
<string name="noCardExistsError">Cap de carta pas trobada</string>
<string name="noCardIdError">Cap de numèro de carta pas picat</string>
<string name="noStoreError">Cap de nom pas picat</string>
<string name="barcodeImageDescription">Imatge del còdi de barras</string>
<string name="card_ids_copied">Num. de la carta copiada</string>
<string name="noCardsMessage">Apondètz den primièr una carta</string>
<string name="cardShortcut">Acorchi de carta</string>
@@ -38,4 +37,17 @@
<string name="storeName">Nom</string>
<string name="action_add">Apondre</string>
<string name="action_search">Recercar</string>
<string name="ok">D\'acòrdi</string>
<string name="deleteConfirmation">Suprimir aquesta carta\?</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Suprimir <xliff:g>%d</xliff:g> carta</item>
<item quantity="other">Suprimir <xliff:g>%d</xliff:g> cartas</item>
</plurals>
<string name="deleteTitle">Suprimir la carta</string>
<string name="noBarcode">Cap de còdi de barras</string>
<string name="barcodeNoBarcode">Aquesta carta a pas cap de còdi de barras</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> carta seleccionada</item>
<item quantity="other"><xliff:g>%d</xliff:g> cartas seleccionadas</item>
</plurals>
</resources>

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">Szukaj</string>
<string name="action_add">Dodaj</string>
<string name="noGiftCards">W tej chwili nie masz żadnych kart lojalnościowych. Kliknij przycisk \"+\" (plus) u góry, aby rozpocząć. \n\nLoyalty Locker Card pozwala nosić karty lojalnościowe w telefonie, dzięki czemu są zawsze w zasięgu ręki.</string>
<string name="noGiftCards">Kliknij przycisk + plus, aby dodać kartę lub zaimportuj jakieś z ⋮ menu w pierwszej kolejności.</string>
<string name="noMatchingGiftCards">Nic nie znaleziono. Spróbuj zmienić wyszukiwanie.</string>
<string name="storeName">Sklep</string>
<string name="storeName">Nazwa</string>
<string name="note">Notatka</string>
<string name="cardId">Identyfikator karty</string>
<string name="barcodeNoBarcode">Ta karta nie ma kodu kreskowego</string>
@@ -24,8 +24,7 @@
<string name="scanCardBarcode">Zeskanuj kod kreskowy karty lojalnościowej</string>
<string name="cardShortcut">Skrót karty</string>
<string name="noCardsMessage">Najpierw dodaj kartę</string>
<string name="barcodeImageDescription">Obraz kodu kreskowego karty</string>
<string name="noStoreError">Nie wprowadzono nazwy sklepu</string>
<string name="noStoreError">Nie wprowadzono nazwy</string>
<string name="noCardIdError">Nie wprowadzono identyfikatora karty</string>
<string name="noCardExistsError">Nie można wyszukać karty lojalnościowej</string>
<string name="failedParsingImportUriError">Nie można przeanalizować identyfikatora importu URI</string>
@@ -44,17 +43,17 @@
<string name="importOptionFilesystemTitle">Importuj z systemu plików</string>
<string name="importOptionFilesystemExplanation">Wybierz określony plik z systemu plików.</string>
<string name="importOptionFilesystemButton">Z systemu plików</string>
<string name="importOptionApplicationTitle">Użyj zewnętrznej aplikacji</string>
<string name="importOptionApplicationTitle">Użyj innej aplikacji</string>
<string name="importOptionApplicationExplanation">Użyj dowolnej aplikacji lub ulubionego menedżera plików, aby otworzyć plik.</string>
<string name="importOptionApplicationButton">Użyj zewnętrznej aplikacji</string>
<string name="importOptionApplicationButton">Użyj innej aplikacji</string>
<string name="about">O aplikacji</string>
<string name="app_license">Wolne oprogramowanie copylefted, licencjonowane GPLv3 +.</string>
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Wersja: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Info o wydaniu: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_revision_url">%s</xliff:g></string>
<string name="app_revision_fmt">Info o wydaniu: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Wybierz kod kreskowy</string>
<string name="enterBarcodeInstructions">Wprowadź identyfikator karty, a następnie wybierz obraz reprezentujący kod kreskowy, którego chcesz użyć, lub wybierz „Ta karta nie ma kodu kreskowego”, aby nie używać kodu kreskowego.</string>
<string name="copy_to_clipboard_toast">Skopiowano identyfikator karty do schowka</string>
<string name="enterBarcodeInstructions">Wprowadź ID karty, a następnie wybierz typ kodu kreskowego, którego chcesz użyć lub wybierz „Ta karta nie ma kodu kreskowego”.</string>
<string name="copy_to_clipboard_toast">Skopiowano ID karty do schowka</string>
<string name="thumbnailDescription">Miniaturka karty</string>
<string name="settings">Ustawienia</string>
<string name="settings_category_title_ui">Interfejs użytkownika</string>
@@ -65,22 +64,136 @@
<string name="settings_display_barcode_max_brightness">Rozjaśnij widok kodu kreskowego</string>
<string name="settings_lock_barcode_orientation">Zablokuj autoobracanie kodów kreskowych</string>
<string name="intent_import_card_from_url_share_text">Chcę udostępnić Ci kartę lojalnościową</string>
<string name="deleteConfirmationGroup">Potwierdź, że chcesz usunąć grupę</string>
<string name="deleteConfirmationGroup">Usunąć grupę\?</string>
<string name="all">Wszystko</string>
<string name="noGroups">Kliknij przycisk + (plus), aby najpierw dodać grupy.
\n
\nGrupy ułatwiają wyszukiwanie.</string>
<string name="noGroups">Najpierw kliknij przycisk + plus, aby dodać grupy dla kategoryzacji.</string>
<string name="groups">Grupy</string>
<string name="enter_group_name">Wpisz nazwę grupy</string>
<string name="exportSuccessful">Dane karty zostały wyeksportowane</string>
<string name="importSuccessful">Zaimportowano dane karty</string>
<string name="starImage">Ulubiona gwiazda</string>
<string name="app_copyright_old">Na podstawie Loyalty Card Keychain, prawa autorskie 20162020 Branden Archer.</string>
<string name="app_copyright_old">Na podstawie Loyalty Card Keychain
\nWszelkie prawa zastrzeżone © 20162020 Branden Archer.</string>
<string name="exportOptionExplanation">Dane zostaną zapisane w wybranym przez Ciebie miejscu.</string>
<string name="unstar">Usuń z ulubionych</string>
<string name="star">Dodaj do ulubionych</string>
<string name="noBarcode">Brak kodu kreskowego</string>
<string name="barcodeType">Typ kodu kreskowego</string>
<string name="deleteTitle">Usuń kartę lojalnościową</string>
<string name="deleteConfirmation">Potwierdź, że chcesz usunąć tę kartę.</string>
<string name="deleteTitle">Usuń kartę</string>
<string name="deleteConfirmation">Usunąć tę kartę na stałe\?</string>
<string name="app_contributors">Możliwe dzięki: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Brązowy</string>
<string name="settings_grey_theme">Szary</string>
<string name="settings_green_theme">Zielony</string>
<string name="settings_sky_blue_theme">Błękitny</string>
<string name="settings_blue_theme">Niebieski</string>
<string name="settings_violet_theme">Fioletowy</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Różowy</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Kolor motywu</string>
<string name="settings_system_locale">System</string>
<string name="settings_locale">Język</string>
<string name="turn_flashlight_off">Wyłącz latarkę</string>
<string name="turn_flashlight_on">Włącz latarkę</string>
<string name="failedGeneratingShareURL">Nie można wygenerować adresu URL do udostępnienia. Proszę to zgłosić.</string>
<string name="passwordRequired">Proszę wpisać hasło</string>
<string name="no">Nie</string>
<string name="yes">Tak</string>
<string name="updateBarcodeQuestionText">Zmieniłeś ID karty. Czy chcesz zaktualizować kod kreskowy, aby używał tej samej wartości\?</string>
<string name="updateBarcodeQuestionTitle">Zaktualizować wartość kodu kreskowego\?</string>
<string name="takePhoto">Zrób zdjęcie</string>
<string name="removeImage">Usuń zdjęcie</string>
<string name="setBackImage">Ustaw tylne zdjęcie</string>
<string name="setFrontImage">Ustaw zdjęcie przednie</string>
<string name="photos">Zdjęcia</string>
<string name="backImageDescription">Zdjęcie tylne karty</string>
<string name="frontImageDescription">Zdjęcie przednie karty</string>
<string name="intent_import_card_from_url_share_multiple_text">Chcę Ci udostępnić karty</string>
<string name="copy_to_clipboard_multiple_toast">Skopiowano ID karty do schowka</string>
<string name="wrongValueForBarcodeType">Wartość nie jest prawidłowa dla wybranego typu kodu kreskowego</string>
<string name="unsupportedBarcodeType">Nie można jeszcze wyświetlić tego typu kodu kreskowego. Być może będzie on obsługiwany w nowszej wersji aplikacji.</string>
<string name="setBarcodeId">Ustaw wartość kodu kreskowego</string>
<string name="sameAsCardId">Taki sam jak ID karty</string>
<string name="barcodeId">Wartość kodu kreskowego</string>
<string name="importVoucherVaultMessage">Wybierz swój <i>vouchervault.json</i> z Voucher Vault, aby zaimportować.
\nLub utwórz go wpierw klikając Eksportuj w Voucher Vault.</string>
<string name="importVoucherVault">Importuj z Voucher Vault</string>
<string name="importStocardMessage">Wybierz swój <i>***-sync.zip</i> z Stocard, aby zaimportować.
\nLub uzyskaj go, wysyłając email na adres support@stocardapp.com, z prośbą o eksport Twoich danych.</string>
<string name="importStocard">Importuj z Stocard</string>
<string name="importLoyaltyCardKeychainMessage">Wybierz swój <i>LoyaltyCardKeychain.csv</i> z Loyalty Card Keychain, aby zaimportować.
\nLub utwórz go z menu Importuj/Eksportuj w Loyalty Card Keychain, wpierw klikając tam Eksportuj.</string>
<string name="importLoyaltyCardKeychain">Importuj z Loyalty Card Keychain</string>
<string name="importFidmeMessage">Wybierz swój <i>fidme-export-request-xxxxxx.zip</i> z FidMe, aby zaimportować, po czym wybierz typy kodów kreskowych.
\nLub stwórz go ze swojego profilu FidMe, wybierając wpierw Ochrona Danych, a następnie naciskając Wyodrębnij moje dane.</string>
<string name="importFidme">Importuj z FidMe</string>
<string name="importCatimaMessage">Wybierz swój <i>catima.zip</i> z Catima, aby zaimportować.
\nLub utwórz go z menu Importuj/Eksportuj innej aplikacji Catima, wpierw klikając tam Eksportuj.</string>
<string name="importCatima">Importuj z Catima</string>
<string name="accept">Zaakceptuj</string>
<string name="privacy_policy_popup_text">Informacja o polityce prywatności (wymagana przez niektóre sklepy z aplikacjami):
\n
\nŻADNE DANE NIE SĄ ZBIERANE, co może potwierdzić każdy, gdyż nasza aplikacja jest wolnym oprogramowaniem.</string>
<string name="privacy_policy">Polityka prywatności</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="chooseImportType">Importuj dane z ...\?</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> nie wydaje się być prawidłową wartością.</string>
<string name="points">Punkty</string>
<string name="currency">Waluta</string>
<string name="balance">Saldo</string>
<string name="errorReadingImage">Nie udało się odczytać zdjęcia</string>
<string name="noBarcodeFound">Nie znaleziono kodu kreskowego</string>
<string name="moveBarcodeToCenterOfScreen">Wyśrodkuj kod kreskowy na ekranie</string>
<string name="moveBarcodeToTopOfScreen">Przenieś kod kreskowy na górę ekranu</string>
<string name="chooseExpiryDate">Wybierz datę ważności</string>
<string name="never">Nigdy</string>
<string name="expiryDate">Data wygaśnięcia</string>
<string name="editBarcode">Edytuj kod kreskowy</string>
<string name="barcode">Kod kreskowy</string>
<string name="card">Karta</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> punkty</string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Wygasło: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Wygasa: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Grupy: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Wybierz zdjęcie z galerii</string>
<string name="addManually">Wpisz ręcznie ID karty</string>
<string name="leaveWithoutSaveConfirmation">Wyjść bez zapisywania\?</string>
<string name="leaveWithoutSaveTitle">Wyjdź</string>
<string name="moveDown">Przesuń w dół</string>
<string name="moveUp">Przesuń w górę</string>
<string name="failedOpeningFileManager">Najpierw zainstaluj menadżera plików.</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> karta</item>
<item quantity="few"><xliff:g>%d</xliff:g> karty</item>
<item quantity="many"><xliff:g>%d</xliff:g> kart</item>
<item quantity="other"><xliff:g>%d</xliff:g> kart</item>
</plurals>
<string name="noGroupCards">Ta grupa nie zawiera żadnych kart</string>
<string name="settings_disable_lockscreen_while_viewing_card">Zapobiegaj blokowaniu ekranu</string>
<string name="settings_keep_screen_on">Pozostaw ekran włączony</string>
<string name="settings_max_font_size_scale">Maks. rozmiar czcionki</string>
<string name="app_resources">Otwarte zewnętrzne zasoby: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Otwarte zewnętrzne biblioteki: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Wszelkie prawa zastrzeżone © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="card_ids_copied">Skopiowano ID karty</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Usunąć tą <xliff:g>%d</xliff:g> kartę permamentnie\?</item>
<item quantity="few">Usunąć te <xliff:g>%d</xliff:g> karty permamentnie\?</item>
<item quantity="many">Usunąć tych <xliff:g>%d</xliff:g> kart permamentnie\?</item>
<item quantity="other">Usunąć tych <xliff:g>%d</xliff:g> kart permamentnie\?</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="one">Usuń <xliff:g>%d</xliff:g> kartę</item>
<item quantity="few">Usuń <xliff:g>%d</xliff:g> karty</item>
<item quantity="many">Usuń <xliff:g>%d</xliff:g> kart</item>
<item quantity="other">Usuń <xliff:g>%d</xliff:g> kart</item>
</plurals>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> wybrana karta</item>
<item quantity="few"><xliff:g>%d</xliff:g> wybrane karty</item>
<item quantity="many"><xliff:g>%d</xliff:g> wybranych kart</item>
<item quantity="other"><xliff:g>%d</xliff:g> wybranych kart</item>
</plurals>
</resources>

View File

@@ -25,14 +25,13 @@
<string name="scanCardBarcode">Отсканируйте штрих-код</string>
<string name="cardShortcut">Ярлык карты</string>
<string name="noCardsMessage">Сначала добавьте карту</string>
<string name="barcodeImageDescription">Изображение штрих-кода карты</string>
<string name="noStoreError">Название не указано</string>
<string name="noCardIdError">Номер карты не указан</string>
<string name="noCardExistsError">Карта не найдена</string>
<string name="failedParsingImportUriError">Невозможно разобрать импортируемый URI</string>
<string name="importExport">Импорт/Экспорт</string>
<string name="exportName">Экспорт</string>
<string name="importExportHelp">Резервное копирование карт позволяет переместить их на другое устройство.</string>
<string name="importExportHelp">Резервное копирование карт позволяет перенести их на другое устройство.</string>
<string name="importSuccessfulTitle">Импортировано</string>
<string name="importFailedTitle">Импорт не выполнен</string>
<string name="importFailed">Невозможно импортировать карты</string>
@@ -183,4 +182,21 @@
<item quantity="many">Удаление <xliff:g>%d</xliff:g> карт</item>
<item quantity="other">Удаление <xliff:g>%d</xliff:g> карт</item>
</plurals>
<string name="settings_system_locale">Системный</string>
<string name="settings_locale">Язык</string>
<string name="settings_sky_blue_theme">Голубой</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_brown_theme">Коричневый</string>
<string name="settings_grey_theme">Серый</string>
<string name="settings_green_theme">Зелёный</string>
<string name="settings_blue_theme">Синий</string>
<string name="settings_violet_theme">Фиолетовый</string>
<string name="settings_magenta_theme">Пурпурный</string>
<string name="settings_pink_theme">Розовый</string>
<string name="settings_theme_color">Цвет темы</string>
<string name="app_contributors">Создано при поддержке: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">В группе нет карт</string>
<string name="barcodeImageDescriptionWithType">Изображение штрих-кода карты типа <xliff:g>%s</xliff:g></string>
<string name="toggleMoreInfo">Переключение отображения дополнительной информации</string>
<string name="swipeToSwitchImages">Смахивание или долгое нажатие для переключения изображений</string>
</resources>

View File

@@ -1,8 +1,6 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_add">Pridať</string>
<string name="noGiftCards">Zatiaľ nemáte žiadne vernostné karty. Kliknite na tlačidlo \"+\" (plus) vyššie a začnite.\n\nAplikácia Vernostné karty umožňuje nosiť svoje vernostné karty v telefóne, kde sú vždy na dosah.</string>
<string name="storeName">Obchod</string>
<string name="note">Poznámka</string>
@@ -16,15 +14,12 @@
<string name="unlockScreen">Povoliť rotáciu</string>
<string name="ok">Áno</string>
<string name="copy_to_clipboard">Kopírovať ID do schránky</string>
<string name="sendLabel">Odoslať&#8230;</string>
<string name="sendLabel">Odoslať</string>
<string name="editCardTitle">Upraviť kartu</string>
<string name="addCardTitle">Pridať kartu</string>
<string name="scanCardBarcode">Zosnímajte čiarový kód na karte</string>
<string name="cardShortcut">Skratka</string>
<string name="noCardsMessage">Nie sú uložené žiadne karty, vložte prvú</string>
<string name="barcodeImageDescription">Obrázok čiarového kódu karty</string>
<string name="noStoreError">Nebol zadaný obchod</string>
<string name="noCardIdError">Nebolo zadané ID karty</string>
<string name="noCardExistsError">Nie je možné vyhľadať vernostnú kartu</string>
@@ -37,8 +32,8 @@
<string name="exportSuccessfulTitle">Export bol úspešný</string>
<string name="exportFailedTitle">Export zlyhal</string>
<string name="exportFailed">Zlyhal export</string>
<string name="importing">Importujem&#8230;</string>
<string name="exporting">Exportujem&#8230;</string>
<string name="importing">Importujem</string>
<string name="exporting">Exportujem</string>
<string name="noExternalStoragePermissionError">Nie je možné importovať a exportovať karty bez prístupu k externému úložisku</string>
<string name="importOptionFilesystemTitle">Import zo súborového systému.</string>
<string name="importOptionFilesystemExplanation">Vyberte súbor zo súborového systému.</string>
@@ -46,22 +41,24 @@
<string name="importOptionApplicationTitle">Použite externú aplikáciu</string>
<string name="importOptionApplicationExplanation">Na otvorenie súboru použite externú aplikáciu, ako Dropbox, Disk Google, alebo Vášho obľúbeného správcu súborov.</string>
<string name="importOptionApplicationButton">Použiť externú aplikáciu</string>
<string name="about">O aplikácii</string>
<string name="app_license">Licencované GPLv3.</string>
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verzia: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informácia pri revízii: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Vyberte čiarový kód</string>
<string name="copy_to_clipboard_toast">ID karty skopírované do schránky</string>
<string name="thumbnailDescription">Náhľad karty</string>
<string name="settings">Nastavenia</string>
<string name="settings_category_title_ui">Používateľské prostredie</string>
<string name="settings_display_barcode_max_brightness">Zvýšiť jas pri zobrazení čiarového kódu </string>
<string name="settings_lock_barcode_orientation">Uzamkni orientáciu čiarového kódu</string>
<string name="deleteTitle">Odstrániť kartu</string>
<string name="deleteConfirmation">Naozaj chcete túto kartu odstrániť?</string>
</resources>
<string name="star">Pridať k obľúbeným</string>
<string name="noBarcode">Žiadny čiarový kód</string>
<string name="barcodeNoBarcode">Táto karta nemá čiarový kód</string>
<string name="barcodeType">Typ čiarových kódov</string>
<string name="noMatchingGiftCards">Nenašiel som nič. Skúste zmeniť vyhľadávanie.</string>
<string name="action_search">Vyhľadávanie</string>
</resources>

View File

@@ -19,8 +19,7 @@
<string name="addCardTitle">Dodaj kartico zvestobe</string>
<string name="scanCardBarcode">Skeniraj črtno kodo</string>
<string name="cardShortcut">Bližnjica do kartice</string>
<string name="noCardsMessage">Trenutno ni na voljo nobene kartice. Najprej jih je potrebno dodati.</string>
<string name="barcodeImageDescription">Slika črtne kode na kartici</string>
<string name="noCardsMessage">Najprej dodajte kartico</string>
<string name="noStoreError">Ime trgovine ni bilo vnešeno</string>
<string name="noCardIdError">Številka kartice ni bila vnešena</string>
<string name="noCardExistsError">Te kartice zvestobe ni bilo moč najti</string>
@@ -37,7 +36,7 @@
<string name="exporting">Izvažanje…</string>
<string name="noExternalStoragePermissionError">Izvažanje in uvažanje je nemogoče brez omogočenega dostopa do zunanje shrambe</string>
<string name="importOptionFilesystemTitle">Uvozi iz datotečnega sistema</string>
<string name="importOptionFilesystemExplanation">Izberite specifično datoteko iz datotečnega sistema</string>
<string name="importOptionFilesystemExplanation">Izberite specifično datoteko iz datotečnega sistema.</string>
<string name="importOptionFilesystemButton">Iz datotečnega sistema</string>
<string name="importOptionApplicationTitle">Uporabi zunanjo aplikacijo</string>
<string name="importOptionApplicationExplanation">Uporabi zunanjo aplikacijo, kot npr. Dropbox, Google Drive ali ostale upravljalnike datotek, za odpiranje datoteko.</string>
@@ -55,5 +54,44 @@
<string name="settings_display_barcode_max_brightness">Povečaj osvetljenost prikaza črtne kode</string>
<string name="settings_lock_barcode_orientation">Zakleni orientacijo črtne kode</string>
<string name="deleteTitle">Odstrani kartico zvestobe</string>
<string name="deleteConfirmation">Prosim potrdite, če želite izbrisati to kartico.</string>
<string name="deleteConfirmation">Prosim potrdite, če želite izbrisati to kartico\?</string>
<string name="card">Kartica</string>
<string name="addFromImage">Izberite sliko iz galerije</string>
<string name="addManually">Ročno vnesite ID kartice</string>
<string name="leaveWithoutSaveConfirmation">Zapustite brez shranjevanja\?</string>
<string name="leaveWithoutSaveTitle">Izhod</string>
<string name="moveDown">Premikanje navzdol</string>
<string name="moveUp">Premik navzgor</string>
<string name="failedOpeningFileManager">Najprej namestite upravitelja datotek.</string>
<string name="deleteConfirmationGroup">Brisanje skupine\?</string>
<string name="all">Vse</string>
<string name="noGroupCards">Ta skupina ne vsebuje kartic</string>
<string name="noGroups">Kliknite gumb + plus, če želite najprej dodati skupine za kategorizacijo.</string>
<string name="groups">Skupine</string>
<string name="enter_group_name">Vnesite ime skupine</string>
<string name="exportSuccessful">Izvoženi podatki o karticah</string>
<string name="importSuccessful">Uvoženi podatki o karticah</string>
<string name="intent_import_card_from_url_share_text">Želim z vami deliti kartico</string>
<string name="settings_disable_lockscreen_while_viewing_card">Preprečitev zaklepanja zaslona</string>
<string name="settings_keep_screen_on">Ohranite zaslon vklopljen</string>
<string name="enterBarcodeInstructions">Vnesite ID kartice in spodaj izberite vrsto črtne kode ali \"Ta kartica nima črtne kode\".</string>
<string name="settings_max_font_size_scale">Največja velikost pisave</string>
<string name="settings_dark_theme">Temno</string>
<string name="settings_light_theme">Luč</string>
<string name="settings_system_theme">Sistem</string>
<string name="settings_theme">Tema</string>
<string name="starImage">Najljubša zvezda</string>
<string name="app_copyright_old">Na podlagi kartice zvestobe obesek za ključe
\ncopyright © 2016-2020 Branden Archer.</string>
<string name="exportOptionExplanation">Podatki bodo zapisani na izbrano mesto.</string>
<string name="failedParsingImportUriError">Ni bilo mogoče razčleniti URI uvoza</string>
<string name="card_ids_copied">Kopirana kartica ID(s)</string>
<string name="share">Delite</string>
<string name="unstar">Odstrani iz priljubljenih</string>
<string name="star">Dodaj med priljubljene</string>
<string name="noBarcode">Brez črtne kode</string>
<string name="barcodeNoBarcode">Ta kartica nima črtne kode</string>
<string name="barcodeType">Vrsta črtne kode</string>
<string name="noMatchingGiftCards">Ničesar nisem našel. Poskusite spremeniti iskanje.</string>
<string name="action_search">Iskanje</string>
</resources>

View File

@@ -15,7 +15,6 @@
<string name="errorReadingImage">Kunde inte läsa bilden</string>
<string name="currency">Valuta</string>
<string name="failedGeneratingShareURL">Kunde inte skapa en delningsbar URL. Var snäll och rapportera detta.</string>
<string name="barcodeImageDescription">Bild av kortets streckkod</string>
<string name="card_ids_copied">Kopierade kort ID:n</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kort valt</item>
@@ -32,7 +31,7 @@
<string name="groups">Grupper</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kort</item>
<item quantity="other"><xliff:g>%d</xliff:g> kort</item>
<item quantity="other"><xliff:g>%d</xliff:g> korten</item>
</plurals>
<string name="all">Alla</string>
<string name="deleteConfirmationGroup">Ta bort grupp\?</string>
@@ -174,4 +173,21 @@
<string name="importSuccessful">Kortdata importerad</string>
<string name="failedParsingImportUriError">Kunde inte tolka import-URI:n</string>
<string name="note">Anteckning</string>
<string name="settings_system_locale">System</string>
<string name="settings_locale">Språk</string>
<string name="noExternalStoragePermissionError">Bevilja tillstånd för extern lagring för att först importera eller exportera kort</string>
<string name="app_contributors">Möjliggjordes av: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Brunt</string>
<string name="settings_grey_theme">Grått</string>
<string name="settings_green_theme">Grönt</string>
<string name="settings_sky_blue_theme">Himmelblått</string>
<string name="settings_blue_theme">Blått</string>
<string name="settings_violet_theme">Violett</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Rosa</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Temafärg</string>
<string name="noGroupCards">Denna grupp innehåller inga kort</string>
<string name="toggleMoreInfo">Växla mellan att visa mer info</string>
<string name="barcodeImageDescriptionWithType">Bild av kortstreckkod av typen <xliff:g>%s</xliff:g></string>
</resources>

View File

@@ -0,0 +1,194 @@
<?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="swipeToSwitchImages">Resimler arasında geçiş yapmak için kaydırın veya uzun basın</string>
<string name="toggleMoreInfo">Daha fazla bilgi göstermeyi aç/kapat</string>
<string name="app_contributors">Katkıda bulunanlar: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Kahverengi</string>
<string name="settings_grey_theme">Gri</string>
<string name="settings_green_theme">Yeşil</string>
<string name="settings_sky_blue_theme">Gök mavisi</string>
<string name="settings_blue_theme">Mavi</string>
<string name="settings_violet_theme">Mor</string>
<string name="settings_magenta_theme">Eflatun</string>
<string name="settings_pink_theme">Pembe</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Tema rengi</string>
<string name="settings_system_locale">Sistem</string>
<string name="settings_locale">Dil</string>
<string name="turn_flashlight_off">El fenerini kapat</string>
<string name="turn_flashlight_on">El fenerini aç</string>
<string name="failedGeneratingShareURL">Paylaşılabilir URL oluşturulamadı. Lütfen bunu bildirin.</string>
<string name="passwordRequired">Lütfen parolayı girin</string>
<string name="no">Hayır</string>
<string name="yes">Evet</string>
<string name="updateBarcodeQuestionText">Kart numarasını değiştirdiniz. Aynı değeri kullanmak için barkodu da güncellemek ister misiniz\?</string>
<string name="updateBarcodeQuestionTitle">Barkod değeri güncellensin mi\?</string>
<string name="takePhoto">Fotoğraf çek</string>
<string name="backImageDescription">Kartın arka resmi</string>
<string name="frontImageDescription">Kartın ön resmi</string>
<string name="removeImage">Resmi kaldır</string>
<string name="setBackImage">Arka resmi ayarla</string>
<string name="setFrontImage">Ön resmi ayarla</string>
<string name="photos">Fotoğraflar</string>
<string name="intent_import_card_from_url_share_multiple_text">Seninle birkaç kart paylaşmak istiyorum</string>
<string name="copy_to_clipboard_multiple_toast">Kart numaraları panoya kopyalandı</string>
<string name="wrongValueForBarcodeType">Değer, seçilen barkod türü için geçerli değil</string>
<string name="unsupportedBarcodeType">Bu barkod türü henüz görüntülenemiyor. Uygulamanın sonraki bir sürümünde desteklenebilir.</string>
<string name="setBarcodeId">Barkod değerini ayarla</string>
<string name="sameAsCardId">Kart numarasıyla aynı</string>
<string name="barcodeId">Barkod değeri</string>
<string name="importVoucherVaultMessage">İçe aktarmak için Voucher Vault\'tan dışa aktardığınız <i>vouchervault.json</i> dosyasını seçin.
\nVeya önce Voucher Vault\'ta \"Dışa aktar\" düğmesine basarak bir tane oluşturun.</string>
<string name="importVoucherVault">Voucher Vault\'tan içe aktar</string>
<string name="importStocardMessage">İçe aktarmak için Stocard\'dan dışa aktardığınız <i>***-sync.zip</i> dosyasını seçin.
\nVeya support@stocardapp.com adresine e-posta göndererek verilerinizin dışa aktarılmasını isteyerek edinin.</string>
<string name="importStocard">Stocard\'dan içe aktar</string>
<string name="importLoyaltyCardKeychainMessage">İçe aktarmak için Loyalty Card Keychain\'den dışa aktardığınız <i>LoyaltyCardKeychain.csv</i> dosyasını seçin.
\nVeya Loyalty Card Keychain uygulamasının İçe/Dışa aktar menüsündeki \"Dışa aktar\" düğmesine basarak bir tane oluşturun.</string>
<string name="importLoyaltyCardKeychain">Loyalty Card Keychain\'den içe aktar</string>
<string name="importFidmeMessage">FidMe\'den içe aktarmak için dışa aktardığınız <i>fidme-export-request-xxxxxx.zip</i> dosyasını seçin ve ardından barkod türlerini elle seçin.
\nVeya FidMe profilinizden Veri Koruma seçeneğini seçip ardından \"Verilerimi çıkar\" düğmesine basarak bir tane oluşturun.</string>
<string name="importFidme">FidMe\'den içe aktar</string>
<string name="importCatimaMessage">İçe aktarmak için Catima\'dan dışa aktardığınız <i>catima.zip</i> dosyasını seçin.
\nVeya başka bir Catima uygulamasının İçe/Dışa aktar menüsündeki \"Dışa aktar\" düğmesine basarak bir tane oluşturun.</string>
<string name="importCatima">Catima\'dan içe aktar</string>
<string name="accept">Kabul et</string>
<string name="privacy_policy_popup_text">Gizlilik politikası bildirimi (bazı uygulama mağazaları için gerekli):
\n
\nHİÇBİR VERİ TOPLANMAMAKTADIR ve uygulamamız özgür yazılım olduğu için bunu herkes doğrulayabilir.</string>
<string name="privacy_policy">Gizlilik Politikası</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="chooseImportType">Veriler nereden içe aktarılsın\?</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> geçerli bir bakiye gibi görünmüyor.</string>
<string name="points">Puan</string>
<string name="currency">Para birimi</string>
<string name="balance">Bakiye</string>
<string name="errorReadingImage">Resim okunamadı</string>
<string name="noBarcodeFound">Barkod bulunamadı</string>
<string name="moveBarcodeToCenterOfScreen">Barkodu ekranda ortala</string>
<string name="moveBarcodeToTopOfScreen">Barkodu ekranın en üstüne taşı</string>
<string name="chooseExpiryDate">Son kullanma tarihi seç</string>
<string name="never">Hiçbir zaman</string>
<string name="expiryDate">Son kullanma tarihi</string>
<string name="editBarcode">Barkodu düzenle</string>
<string name="barcode">Barkod</string>
<string name="card">Kart</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> puan</string>
<string name="balanceSentence">Bakiye: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Süresi doldu: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Son kullanma tarihi: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Gruplar: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Galeriden resim seç</string>
<string name="addManually">Kart numarasını elle gir</string>
<string name="leaveWithoutSaveConfirmation">Kaydetmeden çıkılsın mı\?</string>
<string name="leaveWithoutSaveTitle">Çıkış</string>
<string name="moveDown">Aşağı git</string>
<string name="moveUp">Yukarı git</string>
<string name="failedOpeningFileManager">Önce bir dosya yöneticisi kurun.</string>
<string name="deleteConfirmationGroup">Grup silinsin mi\?</string>
<string name="all">Tümü</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kart</item>
<item quantity="other"><xliff:g>%d</xliff:g> kart</item>
</plurals>
<string name="noGroupCards">Bu grup hiç kart içermiyor</string>
<string name="noGroups">Önce kategorilere ayırmak üzere gruplar eklemek için + artı düğmesine tıklayın.</string>
<string name="groups">Gruplar</string>
<string name="enter_group_name">Grup adını girin</string>
<string name="exportSuccessful">Kart verileri dışa aktarıldı</string>
<string name="importSuccessful">Kart verileri içe aktarıldı</string>
<string name="intent_import_card_from_url_share_text">Seninle bir kart paylaşmak istiyorum</string>
<string name="settings_disable_lockscreen_while_viewing_card">Ekran kilidini engelle</string>
<string name="settings_keep_screen_on">Ekranıık tut</string>
<string name="settings_lock_barcode_orientation">Barkod yönünü kilitle</string>
<string name="settings_display_barcode_max_brightness">Barkod görünümünü aydınlat</string>
<string name="settings_max_font_size_scale">Azami yazı tipi boyutu</string>
<string name="settings_dark_theme">Koyu</string>
<string name="settings_light_theme">ık</string>
<string name="settings_system_theme">Sistem</string>
<string name="settings_theme">Tema</string>
<string name="settings_category_title_ui">Kullanıcı arayüzü</string>
<string name="settings">Ayarlar</string>
<string name="starImage">Sık kullanılan yıldız</string>
<string name="thumbnailDescription">Kart için küçük resim</string>
<string name="copy_to_clipboard_toast">Kart numarası panoya kopyalandı</string>
<string name="enterBarcodeInstructions">Kart numarasını girin ve aşağıdan barkod türünü veya “Bu kartın barkodu yok” seçeneğini seçin.</string>
<string name="selectBarcodeTitle">Barkod Seç</string>
<string name="app_resources">Özgür üçüncü taraf kaynakları: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Özgür üçüncü taraf kütüphaneleri: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_revision_fmt">Değişiklik Bilgileri: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="debug_version_fmt">Sürüm: <xliff:g id="version">%s</xliff:g></string>
<string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g> hakkında</string>
<string name="app_license">GPLv3+ altında lisanslanan copyleft özgür yazılım.</string>
<string name="app_copyright_old">Loyalty Card Keychain temel alınmıştır
\nTelif Hakkı © 20162020 Branden Archer.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Telif Hakkı © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="about">Hakkında</string>
<string name="importOptionApplicationButton">Başka bir uygulama kullan</string>
<string name="importOptionApplicationExplanation">Bir dosyayı açmak için herhangi bir uygulamayı veya en sevdiğiniz dosya yöneticisini kullanın.</string>
<string name="importOptionApplicationTitle">Başka bir uygulama kullan</string>
<string name="importOptionFilesystemButton">Dosya sisteminden</string>
<string name="importOptionFilesystemExplanation">Dosya sisteminden belirli bir dosya seçin.</string>
<string name="importOptionFilesystemTitle">Dosya sisteminden içe aktar</string>
<string name="exportOptionExplanation">Veriler seçtiğiniz bir konuma yazılacak.</string>
<string name="noExternalStoragePermissionError">Kartları içe veya dışa aktarmak için önce harici depolama izni verin</string>
<string name="exporting">Dışa aktarılıyor…</string>
<string name="importing">İçe aktarılıyor…</string>
<string name="exportFailed">Kartlar dışa aktarılamadı</string>
<string name="exportFailedTitle">Dışa aktarılamadı</string>
<string name="exportSuccessfulTitle">Dışa aktarıldı</string>
<string name="importFailed">Kartlar içe aktarılamadı</string>
<string name="importFailedTitle">İçe aktarılamadı</string>
<string name="importSuccessfulTitle">İçe aktarıldı</string>
<string name="importExportHelp">Kartlarınızı yedeklemek, onları başka bir aygıta taşımanıza olanak tanır.</string>
<string name="exportName">Dışa aktar</string>
<string name="importExport">İçe/Dışa aktar</string>
<string name="failedParsingImportUriError">İçe aktarma URI\'si ayrıştırılamadı</string>
<string name="noCardExistsError">Kart bulunamadı</string>
<string name="noCardIdError">Kart numarası girilmedi</string>
<string name="noStoreError">Ad girilmedi</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> türündeki kart barkodunun görüntüsü</string>
<string name="card_ids_copied">Kart numara(lar)ı kopyalandı</string>
<string name="copy_to_clipboard">Numarayı panoya kopyala</string>
<string name="cardId">Kart numarası</string>
<string name="noCardsMessage">Önce bir kart ekleyin</string>
<string name="cardShortcut">Kart Kısayolu</string>
<string name="scanCardBarcode">Kart Barkodunu Tara</string>
<string name="addCardTitle">Kart Ekle</string>
<string name="editCardTitle">Kartı Düzenle</string>
<string name="sendLabel">Gönder…</string>
<string name="share">Paylaş</string>
<string name="ok">Tamam</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Bu <xliff:g>%d</xliff:g> kart kalıcı olarak silinsin mi\?</item>
<item quantity="other">Bu <xliff:g>%d</xliff:g> kart kalıcı olarak silinsin mi\?</item>
</plurals>
<string name="deleteConfirmation">Bu kart kalıcı olarak silinsin mi\?</string>
<plurals name="deleteCardsTitle">
<item quantity="one"><xliff:g>%d</xliff:g> kartı sil</item>
<item quantity="other"><xliff:g>%d</xliff:g> kartı sil</item>
</plurals>
<string name="deleteTitle">Kartı sil</string>
<string name="unlockScreen">Döndürme Engelini Kaldır</string>
<string name="lockScreen">Döndürmeyi Engelle</string>
<string name="confirm">Doğrula</string>
<string name="delete">Sil</string>
<string name="edit">Düzenle</string>
<string name="save">Kaydet</string>
<string name="cancel">İptal</string>
<string name="unstar">Sık kullanılanlardan kaldır</string>
<string name="star">Sık kullanılanlara ekle</string>
<string name="noBarcode">Barkod yok</string>
<string name="barcodeNoBarcode">Bu kartın barkodu yok</string>
<string name="barcodeType">Barkod türü</string>
<string name="note">Not</string>
<string name="storeName">Ad</string>
<string name="noMatchingGiftCards">Hiçbir şey bulunamadı. Aramanızı değiştirmeyi deneyin.</string>
<string name="noGiftCards">Bir kart eklemek için + artı düğmesine tıklayın veya önce ⋮ menüsünden birkaçını içe aktarın.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kart seçildi</item>
<item quantity="other"><xliff:g>%d</xliff:g> kart seçildi</item>
</plurals>
<string name="action_add">Ekle</string>
<string name="action_search">Ara</string>
</resources>

View File

@@ -7,7 +7,6 @@
<string name="settings_display_barcode_max_brightness">Яскравіший штрих-код</string>
<string name="enterBarcodeInstructions">Введіть ID карти та оберіть тип штрих-коду чи \"Ця карта не має штрих-коду\".</string>
<string name="selectBarcodeTitle">Оберіть штрих-код</string>
<string name="barcodeImageDescription">Зображення штрих-коду карти</string>
<string name="scanCardBarcode">Відсканувати штрих-код карти</string>
<string name="noBarcode">Без штрих-коду</string>
<string name="barcodeNoBarcode">Ця карта не має штрих-коду</string>
@@ -76,7 +75,7 @@
<string name="enter_group_name">Введіть ім\'я групи</string>
<string name="exportSuccessful">Дані картки/карток експортовано</string>
<string name="importSuccessful">Дані картки/карток імпортовано</string>
<string name="intent_import_card_from_url_share_text">Я хочу поділитися картою з тобою</string>
<string name="intent_import_card_from_url_share_text">Я хочу поділитися з тобою картою</string>
<string name="settings_disable_lockscreen_while_viewing_card">Не блокувати екран</string>
<string name="settings_keep_screen_on">Не вимикати екран</string>
<string name="settings_lock_barcode_orientation">Заблокувати орієнтацію штрих-коду</string>
@@ -106,7 +105,7 @@
<string name="importOptionApplicationExplanation">Використайте іншу програму чи ваш улюблений файл-менеджер для відкриття файлу.</string>
<string name="importOptionApplicationTitle">Використати іншу програму</string>
<string name="importOptionFilesystemButton">З провідника</string>
<string name="importOptionFilesystemExplanation">Оберіть конкретний файл у провіднику.</string>
<string name="importOptionFilesystemExplanation">Оберіть файл у провіднику.</string>
<string name="importOptionFilesystemTitle">Імпорт з провідника</string>
<string name="exportOptionExplanation">Дані буде записано до локації обраної вами.</string>
<string name="noExternalStoragePermissionError">Надайте дозвіл на доступ до пам\'яті пристрою для імпорту чи експорту карток</string>
@@ -140,7 +139,7 @@
<string name="delete">Видалити</string>
<string name="edit">Редагувати</string>
<string name="save">Зберегти</string>
<string name="cancel">Відмінити</string>
<string name="cancel">Скасувати</string>
<string name="unstar">Видалити з улюблених</string>
<string name="star">Додати до улюблених</string>
<string name="cardId">ID картки</string>
@@ -166,8 +165,8 @@
<plurals name="selectedCardCount">
<item quantity="one">Обрано: <xliff:g>%d</xliff:g> карта</item>
<item quantity="few">Обрано: <xliff:g>%d</xliff:g> карти</item>
<item quantity="many">Обрано: <xliff:g>%d</xliff:g> карт</item>
<item quantity="other">Обрано: <xliff:g>%d</xliff:g> карт</item>
<item quantity="many">Обрано: <xliff:g>%d</xliff:g> карток</item>
<item quantity="other">Обрано: <xliff:g>%d</xliff:g> карток</item>
</plurals>
<string name="deleteTitle">Видалити картку</string>
<string name="deleteConfirmation">Бажаєте видалити карту\?</string>
@@ -183,4 +182,21 @@
<item quantity="many">Видаліть ці <xliff:g>%d</xliff:g> карти назавжди\?</item>
<item quantity="other">Видаліть ці <xliff:g>%d</xliff:g> карти назавжди\?</item>
</plurals>
<string name="settings_blue_theme">Синій</string>
<string name="settings_violet_theme">Фіолетовий</string>
<string name="settings_magenta_theme">Пурпуровий</string>
<string name="settings_pink_theme">Рожевий</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Колір теми</string>
<string name="settings_system_locale">Системна</string>
<string name="settings_locale">Мова</string>
<string name="settings_brown_theme">Коричневий</string>
<string name="settings_grey_theme">Сірий</string>
<string name="settings_green_theme">Зелений</string>
<string name="settings_sky_blue_theme">Небесно-синій</string>
<string name="app_contributors">Стало можливим завдяки: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Ця група не містить жодних карток</string>
<string name="toggleMoreInfo">Показувати додаткову інформацію</string>
<string name="barcodeImageDescriptionWithType">Зображення штрих-коду карти типу <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Свайп чи довге натискання для зміни зображень</string>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="main_view_card_columns">2</integer>
</resources>

View File

@@ -1,6 +0,0 @@
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen>
</resources>

View File

@@ -15,7 +15,6 @@
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="importOptionApplicationButton">使用其他应用</string>
<string name="importOptionFilesystemButton">从文件系统</string>
<string name="barcodeImageDescription">卡片二维码图像</string>
<string name="unstar">从收藏中删除</string>
<string name="intent_import_card_from_url_share_multiple_text">我想和你分享一些卡片</string>
<string name="copy_to_clipboard_multiple_toast">已将卡号复制到剪贴板</string>

View File

@@ -4,6 +4,7 @@
<color name="colorPrimary">#B53F3F</color>
<color name="colorPrimaryLight">#E87575</color>
<color name="colorPrimaryDark">#840000</color>
<color name="colorPrimaryDisabled">#484848</color>
<color name="colorSecondary">#ffc107</color>
<color name="colorSecondaryLight">#fff350</color>
<color name="colorSecondaryDark">#c79100</color>
@@ -20,4 +21,6 @@
<color name="iconColor">#000000</color>
<color name="alert">#FF0000</color>
<color name="mainLoyaltyCardBackground">#F8F8F8</color>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="main_view_card_columns">1</integer>
</resources>

View File

@@ -12,6 +12,59 @@
<item>@string/settings_dark_theme</item>
</string-array>
<string-array name="color_values">
<item>@string/settings_key_catima_theme</item>
<item>@string/settings_key_pink_theme</item>
<item>@string/settings_key_magenta_theme</item>
<item>@string/settings_key_violet_theme</item>
<item>@string/settings_key_blue_theme</item>
<item>@string/settings_key_sky_blue_theme</item>
<item>@string/settings_key_green_theme</item>
<item>@string/settings_key_grey_theme</item>
<item>@string/settings_key_brown_theme</item>
</string-array>
<string-array name="color_value_strings">
<item>@string/settings_catima_theme</item>
<item>@string/settings_pink_theme</item>
<item>@string/settings_magenta_theme</item>
<item>@string/settings_violet_theme</item>
<item>@string/settings_blue_theme</item>
<item>@string/settings_sky_blue_theme</item>
<item>@string/settings_green_theme</item>
<item>@string/settings_grey_theme</item>
<item>@string/settings_brown_theme</item>
</string-array>
<string-array name="locale_values">
<item />
<item>bg</item>
<item>cs</item>
<item>de</item>
<item>el-rGR</item>
<item>eo</item>
<item>es-rAR</item>
<item>es</item>
<item>fi</item>
<item>fr</item>
<item>he-rIL</item>
<item>it</item>
<item>ja</item>
<item>ko</item>
<item>lt</item>
<item>nb-rNO</item>
<item>nl</item>
<item>oc</item>
<item>pl</item>
<item>ro-rRO</item>
<item>ru</item>
<item>sk</item>
<item>sl</item>
<item>uk</item>
<item>zh-rCN</item>
</string-array>
<array name="letter_tile_colors">
<item>#f16364</item>
<item>#f58559</item>

View File

@@ -56,7 +56,7 @@
<string name="noCardsMessage">Add a card first</string>
<string name="card_ids_copied">Copied Card ID(s)</string>
<string name="barcodeImageDescription">Image of card barcode</string>
<string name="barcodeImageDescriptionWithType">Image of card barcode of type <xliff:g>%s</xliff:g></string>
<string name="noStoreError">No name entered</string>
<string name="noCardIdError">No card ID entered</string>
@@ -138,6 +138,7 @@
<string name="enter_group_name">Enter group name</string>
<string name="groups">Groups</string>
<string name="noGroups">Click the + plus button to add groups for categorization first.</string>
<string name="noGroupCards">This group does not contain any cards</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> card</item>
<item quantity="other"><xliff:g>%d</xliff:g> cards</item>
@@ -213,4 +214,32 @@
<string name="failedGeneratingShareURL">Could not generate sharable URL. Please report this.</string>
<string name="turn_flashlight_on">Turn flashlight on</string>
<string name="turn_flashlight_off">Turn flashlight off</string>
<string name="settings_locale">Language</string>
<string name="settings_key_locale" translatable="false">pref_locale</string>
<string name="settings_system_locale">System</string>
<string name="setting_key_theme_color" translatable="false">pref_theme_color</string>
<string name="settings_theme_color">Theme color</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_pink_theme">Pink</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_violet_theme">Violet</string>
<string name="settings_blue_theme">Blue</string>
<string name="settings_sky_blue_theme">Sky blue</string>
<string name="settings_green_theme">Green</string>
<string name="settings_grey_theme">Grey</string>
<string name="settings_brown_theme">Brown</string>
<string name="settings_key_catima_theme" translatable="false">catima_theme</string>
<string name="settings_key_pink_theme" translatable="false">pink_theme</string>
<string name="settings_key_magenta_theme" translatable="false">magenta_theme</string>
<string name="settings_key_violet_theme" translatable="false">violet_theme</string>
<string name="settings_key_blue_theme" translatable="false">blue_theme</string>
<string name="settings_key_sky_blue_theme" translatable="false">sky_blue_theme</string>
<string name="settings_key_green_theme" translatable="false">green_theme</string>
<string name="settings_key_grey_theme" translatable="false">grey_theme</string>
<string name="settings_key_brown_theme" translatable="false">brown_theme</string>
<string name="app_contributors">Made possible by: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="toggleMoreInfo">Toggle showing more info</string>
<string name="swipeToSwitchImages">Swipe or long press to switch images</string>
</resources>

View File

@@ -1,16 +1,82 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="android:disabledAlpha">1.5</item>
<item name="colorSecondary">@color/colorSecondary</item>
<item name="colorAccent">@color/colorSecondary</item>
<item name="colorAccent">@color/colorPrimary</item>
<item name="actionModeBackground">@color/colorPrimary</item>
<item name="windowActionModeOverlay">true</item>
<item name="actionModeCloseDrawable">@drawable/ic_close</item>
</style>
<style name="AppTheme_pink" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/pink_colorPrimary</item>
<item name="colorPrimaryDark">@color/pink_colorPrimaryDark</item>
<item name="colorAccent">@color/pink_colorPrimary</item>
<item name="actionModeBackground">@color/pink_colorPrimary</item>
</style>
<style name="AppTheme_magenta" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/magenta_colorPrimary</item>
<item name="colorPrimaryDark">@color/magenta_colorPrimaryDark</item>
<item name="colorAccent">@color/magenta_colorPrimary</item>
<item name="actionModeBackground">@color/magenta_colorPrimary</item>
</style>
<style name="AppTheme_violet" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/violet_colorPrimary</item>
<item name="colorPrimaryDark">@color/violet_colorPrimaryDark</item>
<item name="colorAccent">@color/violet_colorPrimary</item>
<item name="actionModeBackground">@color/violet_colorPrimary</item>
</style>
<style name="AppTheme_blue" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/blue_colorPrimary</item>
<item name="colorPrimaryDark">@color/blue_colorPrimaryDark</item>
<item name="colorAccent">@color/blue_colorPrimary</item>
<item name="actionModeBackground">@color/blue_colorPrimary</item>
</style>
<style name="AppTheme_sky_blue" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/skyblue_colorPrimary</item>
<item name="colorPrimaryDark">@color/skyblue_colorPrimaryDark</item>
<item name="colorAccent">@color/skyblue_colorPrimary</item>
<item name="actionModeBackground">@color/skyblue_colorPrimary</item>
</style>
<style name="AppTheme_green" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/green_colorPrimary</item>
<item name="colorPrimaryDark">@color/green_colorPrimaryDark</item>
<item name="colorAccent">@color/green_colorPrimary</item>
<item name="actionModeBackground">@color/green_colorPrimary</item>
</style>
<style name="AppTheme_grey" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/grey_colorPrimary</item>
<item name="colorPrimaryDark">@color/grey_colorPrimaryDark</item>
<item name="colorAccent">@color/grey_colorPrimary</item>
<item name="actionModeBackground">@color/grey_colorPrimary</item>
</style>
<style name="AppTheme_brown" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/brown_colorPrimary</item>
<item name="colorPrimaryDark">@color/brown_colorPrimaryDark</item>
<item name="colorAccent">@color/brown_colorPrimary</item>
<item name="actionModeBackground">@color/brown_colorPrimary</item>
</style>
<style name="AppTheme.NoActionBar" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
@@ -35,4 +101,49 @@
<item name="android:padding">@dimen/no_data_padding</item>
<item name="android:textSize">@dimen/no_data_textSize</item>
</style>
<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
<item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
<item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>
<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
<item name="android:textColor">@color/colorSecondaryText</item>
</style>
<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
<item name="android:textColor">@color/colorSecondaryText</item>
</style>
<color name="red_colorPrimary">#ff0000</color>
<color name="red_colorPrimaryDark">#DF0000</color>
<color name="pink_colorPrimary">#e91e63</color>
<color name="pink_colorPrimaryDark">#CB1755</color>
<color name="magenta_colorPrimary">#9b26af</color>
<color name="magenta_colorPrimaryDark">#7a1ea1</color>
<color name="violet_colorPrimary">#6639b6</color>
<color name="violet_colorPrimaryDark">#502ca7</color>
<color name="blue_colorPrimary">#3F51B5</color>
<color name="blue_colorPrimaryDark">#3445A2</color>
<color name="skyblue_colorPrimary">#03A9F4</color>
<color name="skyblue_colorPrimaryDark">#0094D7</color>
<color name="green_colorPrimary">#4CAF50</color>
<color name="green_colorPrimaryDark">#419744</color>
<!--<color name="colorPrimary">#3F51B5</color>-->
<!--<color name="colorPrimaryDark">#3445A2</color>-->
<color name="grey_colorPrimary">#9d9d9d</color>
<color name="grey_colorPrimaryDark">#606060</color>
<color name="grey_colorAccent">#f90</color>
<color name="brown_colorPrimary">#795548</color>
<color name="brown_colorPrimaryDark">#63453B</color>
<color name="brown_colorAccent">#e81d62</color>
</resources>

View File

@@ -16,6 +16,25 @@
app:iconSpaceReserved="false"
app:singleLineTitle="false" />
<ListPreference
android:key="@string/setting_key_theme_color"
android:title="@string/settings_theme_color"
android:defaultValue="@string/settings_key_catima_theme"
android:entries="@array/color_value_strings"
android:entryValues="@array/color_values"
app:iconSpaceReserved="false"
app:singleLineTitle="false" />
<ListPreference
android:key="@string/settings_key_locale"
android:title="@string/settings_locale"
android:defaultValue=""
android:entries="@array/locale_values"
android:entryValues="@array/locale_values"
app:iconSpaceReserved="false"
app:singleLineTitle="false" />
<nl.invissvenska.numberpickerpreference.NumberDialogPreference
android:key="@string/settings_key_max_font_size_scale"
android:title="@string/settings_max_font_size_scale"

View File

@@ -45,7 +45,7 @@ public class DatabaseTest
public void addRemoveOneGiftCard()
{
assertEquals(0, db.getLoyaltyCardCount());
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, DEFAULT_HEADER_COLOR, 0);
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, db.getLoyaltyCardCount());
@@ -59,7 +59,7 @@ public class DatabaseTest
assertEquals(null, loyaltyCard.balanceType);
assertEquals("cardId", loyaltyCard.cardId);
assertEquals(null, loyaltyCard.barcodeId);
assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType);
assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType.format());
assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor);
assertEquals(0, loyaltyCard.starStatus);
@@ -72,12 +72,12 @@ public class DatabaseTest
@Test
public void updateGiftCard()
{
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, DEFAULT_HEADER_COLOR, 0);
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, db.getLoyaltyCardCount());
result = db.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, BarcodeFormat.AZTEC, DEFAULT_HEADER_COLOR);
result = db.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR);
assertTrue(result);
assertEquals(1, db.getLoyaltyCardCount());
@@ -90,7 +90,7 @@ public class DatabaseTest
assertEquals(Currency.getInstance("EUR"), loyaltyCard.balanceType);
assertEquals("cardId1", loyaltyCard.cardId);
assertEquals(null, loyaltyCard.barcodeId);
assertEquals(BarcodeFormat.AZTEC, loyaltyCard.barcodeType);
assertEquals(BarcodeFormat.AZTEC, loyaltyCard.barcodeType.format());
assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor);
assertEquals(0, loyaltyCard.starStatus);
}
@@ -98,7 +98,7 @@ public class DatabaseTest
@Test
public void updateGiftCardOnlyStar()
{
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, DEFAULT_HEADER_COLOR, 0);
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, db.getLoyaltyCardCount());
@@ -116,7 +116,7 @@ public class DatabaseTest
assertEquals(null, loyaltyCard.balanceType);
assertEquals("cardId", loyaltyCard.cardId);
assertEquals(null, loyaltyCard.barcodeId);
assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType);
assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType.format());
assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor);
assertEquals(1, loyaltyCard.starStatus);
}
@@ -127,7 +127,7 @@ public class DatabaseTest
assertEquals(0, db.getLoyaltyCardCount());
boolean result = db.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1",
null, BarcodeFormat.UPC_A, DEFAULT_HEADER_COLOR);
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR);
assertEquals(false, result);
assertEquals(0, db.getLoyaltyCardCount());
}
@@ -164,7 +164,7 @@ public class DatabaseTest
for(int index = CARDS_TO_ADD-1; index >= 0; index--)
{
long id = db.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
null, BarcodeFormat.UPC_A, index, 0);
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0);
boolean result = (id != -1);
assertTrue(result);
}
@@ -210,12 +210,12 @@ public class DatabaseTest
{
if (index == CARDS_TO_ADD-1) {
id = db.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
null, BarcodeFormat.UPC_A, index, 1);
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1);
}
else {
id = db.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
null, BarcodeFormat.UPC_A, index, 0);
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0);
}
boolean result = (id != -1);
assertTrue(result);
@@ -316,7 +316,7 @@ public class DatabaseTest
{
// Create card
assertEquals(0, db.getLoyaltyCardCount());
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, DEFAULT_HEADER_COLOR, 0);
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, db.getLoyaltyCardCount());
@@ -433,7 +433,7 @@ public class DatabaseTest
{
// Create card
assertEquals(0, db.getLoyaltyCardCount());
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, DEFAULT_HEADER_COLOR, 0);
long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, db.getLoyaltyCardCount());
@@ -499,7 +499,7 @@ public class DatabaseTest
assertEquals(null, card.balanceType);
assertEquals("cardId", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.UPC_A, card.barcodeType);
assertEquals(BarcodeFormat.UPC_A, card.barcodeType.format());
assertEquals(null, card.headerColor);
assertEquals(0, card.starStatus);

View File

@@ -63,7 +63,7 @@ public class ImportExportTest
private final int MONTHS_PER_YEAR = 12;
private final String BARCODE_DATA = "428311627547";
private final BarcodeFormat BARCODE_TYPE = BarcodeFormat.UPC_A;
private final CatimaBarcode BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A);
@Before
public void setUp()
@@ -138,7 +138,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals(BARCODE_DATA, card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BARCODE_TYPE, card.barcodeType);
assertEquals(BARCODE_TYPE.format(), card.barcodeType.format());
assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus);
@@ -154,7 +154,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals(BARCODE_DATA, card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BARCODE_TYPE, card.barcodeType);
assertEquals(BARCODE_TYPE.format(), card.barcodeType.format());
assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus);
@@ -171,7 +171,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals(BARCODE_DATA, card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BARCODE_TYPE, card.barcodeType);
assertEquals(BARCODE_TYPE.format(), card.barcodeType.format());
assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus);
@@ -189,7 +189,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals(BARCODE_DATA, card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BARCODE_TYPE, card.barcodeType);
assertEquals(BARCODE_TYPE.format(), card.barcodeType.format());
assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus);
@@ -234,7 +234,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals(BARCODE_DATA, card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BARCODE_TYPE, card.barcodeType);
assertEquals(BARCODE_TYPE.format(), card.barcodeType.format());
assertEquals(Integer.valueOf(index), card.headerColor);
assertEquals(0, card.starStatus);
@@ -268,7 +268,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals(BARCODE_DATA, card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BARCODE_TYPE, card.barcodeType);
assertEquals(BARCODE_TYPE.format(), card.barcodeType.format());
assertEquals(Integer.valueOf(index), card.headerColor);
assertEquals(1, card.starStatus);
@@ -290,7 +290,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals(BARCODE_DATA, card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BARCODE_TYPE, card.barcodeType);
assertEquals(BARCODE_TYPE.format(), card.barcodeType.format());
assertEquals(Integer.valueOf(index), card.headerColor);
assertEquals(0, card.starStatus);
@@ -626,7 +626,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals("12345", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format());
assertNull(card.headerColor);
assertEquals(0, card.starStatus);
@@ -664,7 +664,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals("12345", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format());
assertNull(card.headerColor);
assertEquals(0, card.starStatus);
@@ -765,7 +765,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals("12345", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format());
assertEquals(1, (long) card.headerColor);
assertEquals(1, card.starStatus);
@@ -803,7 +803,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals("12345", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format());
assertEquals(1, (long) card.headerColor);
assertEquals(0, card.starStatus);
@@ -860,7 +860,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals("12345", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType);
assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format());
assertEquals(1, (long) card.headerColor);
assertEquals(0, card.starStatus);
@@ -884,7 +884,7 @@ public class ImportExportTest
HashMap<Integer, Bitmap> loyaltyCardBackImages = new HashMap<>();
// Create card 1
int loyaltyCardId = (int) db.insertLoyaltyCard("Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", BarcodeFormat.QR_CODE, 1, 0);
int loyaltyCardId = (int) db.insertLoyaltyCard("Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0);
loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId));
db.insertGroup("One");
List<Group> groups = Arrays.asList(db.getGroup("One"));
@@ -925,7 +925,7 @@ public class ImportExportTest
assertEquals(loyaltyCard.cardId, dbLoyaltyCard.cardId);
assertEquals(loyaltyCard.barcodeId, dbLoyaltyCard.barcodeId);
assertEquals(loyaltyCard.starStatus, dbLoyaltyCard.starStatus);
assertEquals(loyaltyCard.barcodeType, dbLoyaltyCard.barcodeType);
assertEquals(loyaltyCard.barcodeType != null ? loyaltyCard.barcodeType.format() : null, dbLoyaltyCard.barcodeType != null? dbLoyaltyCard.barcodeType.format() : null);
assertEquals(loyaltyCard.balanceType, dbLoyaltyCard.balanceType);
assertEquals(loyaltyCard.headerColor, dbLoyaltyCard.headerColor);
@@ -933,11 +933,10 @@ public class ImportExportTest
assertEquals(
groupsToGroupNames(
(List<Group>) Utils.hashmapGetOrDefault(
(List<Group>) Utils.mapGetOrDefault(
loyaltyCardGroups,
loyaltyCardID,
emptyGroup,
Integer.class
emptyGroup
)
),
groupsToGroupNames(
@@ -1028,7 +1027,7 @@ public class ImportExportTest
assertEquals(Currency.getInstance("USD"), card1.balanceType);
assertEquals("1234", card1.cardId);
assertEquals("5432", card1.barcodeId);
assertEquals(BarcodeFormat.QR_CODE, card1.barcodeType);
assertEquals(BarcodeFormat.QR_CODE, card1.barcodeType.format());
assertEquals(1, (long) card1.headerColor);
assertEquals(0, card1.starStatus);
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, true));
@@ -1103,7 +1102,7 @@ public class ImportExportTest
assertEquals(null, card5.balanceType);
assertEquals("98765432", card5.cardId);
assertEquals("23456", card5.barcodeId);
assertEquals(BarcodeFormat.CODE_128, card5.barcodeType);
assertEquals(BarcodeFormat.CODE_128, card5.barcodeType.format());
assertEquals(-10902850, (long) card5.headerColor);
assertEquals(0, card5.starStatus);
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, true));
@@ -1118,7 +1117,7 @@ public class ImportExportTest
assertEquals(Currency.getInstance("EUR"), card6.balanceType);
assertEquals("a", card6.cardId);
assertEquals("-5317", card6.barcodeId);
assertEquals(BarcodeFormat.AZTEC, card6.barcodeType);
assertEquals(BarcodeFormat.AZTEC, card6.barcodeType.format());
assertEquals(null, card6.headerColor);
assertEquals(0, card6.starStatus);
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card6.id, true));
@@ -1199,7 +1198,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals("55555", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.EAN_13, card.barcodeType);
assertEquals(BarcodeFormat.EAN_13, card.barcodeType.format());
assertEquals(0, card.starStatus);
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, true));
@@ -1214,7 +1213,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals("7649484", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.EAN_13, card.barcodeType);
assertEquals(BarcodeFormat.EAN_13, card.barcodeType.format());
assertEquals(0, card.starStatus);
assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-front.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 2, true)));
@@ -1230,7 +1229,7 @@ public class ImportExportTest
assertEquals(null, card.balanceType);
assertEquals("(01)09010374000019(21)02097564604859211217(10)01231287693", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.RSS_EXPANDED, card.barcodeType);
assertEquals(BarcodeFormat.RSS_EXPANDED, card.barcodeType.format());
assertEquals(0, card.starStatus);
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, true));
@@ -1282,7 +1281,7 @@ public class ImportExportTest
assertEquals(Currency.getInstance("USD"), card.balanceType);
assertEquals("123456", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.CODE_128, card.barcodeType);
assertEquals(BarcodeFormat.CODE_128, card.barcodeType.format());
assertEquals(Color.GRAY, (long) card.headerColor);
assertEquals(0, card.starStatus);
@@ -1295,7 +1294,7 @@ public class ImportExportTest
assertEquals(Currency.getInstance("USD"), card.balanceType);
assertEquals("26846363", card.cardId);
assertEquals(null, card.barcodeId);
assertEquals(BarcodeFormat.CODE_39, card.barcodeType);
assertEquals(BarcodeFormat.CODE_39, card.barcodeType.format());
assertEquals(Color.rgb(128, 0, 128), (long) card.headerColor);
assertEquals(0, card.starStatus);

View File

@@ -42,7 +42,7 @@ public class ImportURITest {
// Generate card
Date date = new Date();
db.insertLoyaltyCard("store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), BarcodeFormat.QR_CODE, Color.BLACK, 1);
db.insertLoyaltyCard("store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1);
// Get card
LoyaltyCard card = db.getLoyaltyCard(1);
@@ -61,7 +61,7 @@ public class ImportURITest {
assertEquals(card.balanceType, parsedCard.balanceType);
assertEquals(card.cardId, parsedCard.cardId);
assertEquals(card.barcodeId, parsedCard.barcodeId);
assertEquals(card.barcodeType, parsedCard.barcodeType);
assertEquals(card.barcodeType.format(), parsedCard.barcodeType.format());
assertEquals(card.headerColor, parsedCard.headerColor);
// No export of starStatus for export URL foreseen therefore 0 will be imported
assertEquals(0, parsedCard.starStatus);
@@ -70,7 +70,7 @@ public class ImportURITest {
@Test
public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, UnsupportedEncodingException {
// Generate card
db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, BarcodeFormat.QR_CODE, null, 0);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0);
// Get card
LoyaltyCard card = db.getLoyaltyCard(1);
@@ -89,7 +89,7 @@ public class ImportURITest {
assertEquals(card.balanceType, parsedCard.balanceType);
assertEquals(card.cardId, parsedCard.cardId);
assertEquals(card.barcodeId, parsedCard.barcodeId);
assertEquals(card.barcodeType, parsedCard.barcodeType);
assertEquals(card.barcodeType.format(), parsedCard.barcodeType.format());
assertNull(parsedCard.headerColor);
// No export of starStatus for export URL foreseen therefore 0 will be imported
assertEquals(0, parsedCard.starStatus);
@@ -148,7 +148,7 @@ public class ImportURITest {
assertEquals(null, parsedCard.balanceType);
assertEquals("12345", parsedCard.cardId);
assertEquals(null, parsedCard.barcodeId);
assertEquals(BarcodeFormat.ITF, parsedCard.barcodeType);
assertEquals(BarcodeFormat.ITF, parsedCard.barcodeType.format());
assertEquals(Integer.valueOf(-416706), parsedCard.headerColor);
assertEquals(0, parsedCard.starStatus);
}

View File

@@ -25,9 +25,6 @@ import java.util.Currency;
import java.util.Date;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.preferences.Settings;
import static org.junit.Assert.assertEquals;
@@ -123,7 +120,7 @@ public class LoyaltyCardCursorAdapterTest
@Test
public void TestCursorAdapterEmptyNote()
{
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
@@ -139,7 +136,7 @@ public class LoyaltyCardCursorAdapterTest
@Test
public void TestCursorAdapterWithNote()
{
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
@@ -157,9 +154,9 @@ public class LoyaltyCardCursorAdapterTest
{
final Context context = activity.getApplicationContext();
Date expiryDate = new Date();
String dateString = context.getString(R.string.expiryStateSentence, DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate));
String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate);
db.insertLoyaltyCard("store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
@@ -180,9 +177,9 @@ public class LoyaltyCardCursorAdapterTest
@Test
public void TestCursorAdapterStarring()
{
assertNotEquals(-1, db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0));
assertNotEquals(-1, db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1));
assertNotEquals(-1, db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1));
assertNotEquals(-1, db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0));
assertNotEquals(-1, db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1));
assertNotEquals(-1, db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1));
assertEquals(3, db.getLoyaltyCardCount());
@@ -223,7 +220,7 @@ public class LoyaltyCardCursorAdapterTest
@Test
public void TestCursorAdapter0Points()
{
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
@@ -239,7 +236,7 @@ public class LoyaltyCardCursorAdapterTest
@Test
public void TestCursorAdapter0EUR()
{
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
@@ -255,7 +252,7 @@ public class LoyaltyCardCursorAdapterTest
@Test
public void TestCursorAdapter100Points()
{
db.insertLoyaltyCard("store", "note", null, new BigDecimal("100"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
@@ -263,7 +260,7 @@ public class LoyaltyCardCursorAdapterTest
View view = createView(cursor);
checkView(view, card.store, card.note, "", "Balance: 100 points",false);
checkView(view, card.store, card.note, "", "100 points",false);
cursor.close();
}
@@ -271,7 +268,7 @@ public class LoyaltyCardCursorAdapterTest
@Test
public void TestCursorAdapter10USD()
{
db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
@@ -279,7 +276,7 @@ public class LoyaltyCardCursorAdapterTest
View view = createView(cursor);
checkView(view, card.store, card.note, "", "Balance: $10.00",false);
checkView(view, card.store, card.note, "", "$10.00",false);
cursor.close();
}

View File

@@ -23,6 +23,7 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
@@ -69,10 +70,10 @@ import static org.robolectric.Shadows.shadowOf;
public class LoyaltyCardViewActivityTest
{
private final String BARCODE_DATA = "428311627547";
private final BarcodeFormat BARCODE_TYPE = BarcodeFormat.UPC_A;
private final CatimaBarcode BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A);
private final String EAN_BARCODE_DATA = "4763705295336";
private final BarcodeFormat EAN_BARCODE_TYPE = BarcodeFormat.EAN_13;
private final CatimaBarcode EAN_BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.EAN_13);
enum ViewMode
{
@@ -208,7 +209,7 @@ public class LoyaltyCardViewActivityTest
}
else
{
assertEquals(BarcodeFormat.valueOf(barcodeType), card.barcodeType);
assertEquals(CatimaBarcode.fromName(barcodeType).format(), card.barcodeType.format());
}
assertNotNull(card.headerColor);
@@ -237,7 +238,7 @@ public class LoyaltyCardViewActivityTest
Intent resultIntent = new Intent(intent);
Bundle resultBundle = new Bundle();
resultBundle.putString(BarcodeSelectorActivity.BARCODE_CONTENTS, BARCODE_DATA);
resultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, String.valueOf(BARCODE_TYPE));
resultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, BARCODE_TYPE.name());
resultIntent.putExtras(resultBundle);
// Respond to image capture, success
@@ -378,7 +379,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
// Check default settings
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", 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.name(), null, null);
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", 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(), null, null);
// Change everything
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
@@ -404,14 +405,14 @@ public class LoyaltyCardViewActivityTest
balanceTypeField.setText(currency.getSymbol());
cardIdField.setText("12345678");
barcodeField.setText("87654321");
barcodeTypeField.setText(BarcodeFormat.QR_CODE.name());
barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName());
LoyaltyCardEditActivity.setCardImage(frontImageView, frontBitmap);
LoyaltyCardEditActivity.setCardImage(backImageView, backBitmap);
shadowOf(getMainLooper()).idle();
// Check if changed
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.name(), frontBitmap, backBitmap);
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap);
// Resume
activityController.pause();
@@ -420,7 +421,7 @@ public class LoyaltyCardViewActivityTest
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(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.name(), frontBitmap, backBitmap);
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap);
// Rotate to landscape
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
@@ -428,7 +429,7 @@ public class LoyaltyCardViewActivityTest
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(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.name(), frontBitmap, backBitmap);
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap);
// Rotate to portrait
shadowOf(getMainLooper()).idle();
@@ -436,7 +437,7 @@ public class LoyaltyCardViewActivityTest
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(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.name(), frontBitmap, backBitmap);
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap);
}
}
@@ -516,7 +517,7 @@ public class LoyaltyCardViewActivityTest
// Complete barcode capture successfully
captureBarcodeWithResult(activity, true);
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
shadowOf(getMainLooper()).idle();
@@ -561,7 +562,7 @@ public class LoyaltyCardViewActivityTest
// Complete barcode capture successfully
captureBarcodeWithResult(activity, true);
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
// Cancel the loyalty card creation
assertEquals(false, activity.isFinishing());
@@ -617,7 +618,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -655,12 +656,12 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Complete barcode capture successfully
captureBarcodeWithResult(activity, true);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -679,12 +680,12 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Complete barcode capture successfully
captureBarcodeWithResult(activity, true);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
// Cancel the loyalty card creation
assertEquals(false, activity.isFinishing());
@@ -717,7 +718,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Set date to today
MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField);
@@ -731,7 +732,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -750,13 +751,13 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Set date to never
MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField);
expiryField.setText(expiryField.getAdapter().getItem(0).toString(), false);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -775,7 +776,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Set balance to 10 points
EditText balanceField = activity.findViewById(R.id.balanceField);
@@ -826,7 +827,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "10.00", "$", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "10.00", "$", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
shadowOf(getMainLooper()).idle();
@@ -848,7 +849,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", "", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", "", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -867,7 +868,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Change barcode ID
EditText barcodeField = activity.findViewById(R.id.barcodeIdField);
@@ -880,7 +881,7 @@ public class LoyaltyCardViewActivityTest
AlertDialog updateBarcodeIdDialog = (AlertDialog) (ShadowDialog.getLatestDialog());
assertNull(updateBarcodeIdDialog);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -899,7 +900,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView);
@@ -914,7 +915,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -933,7 +934,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
// Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView);
@@ -951,7 +952,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -970,7 +971,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
// Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView);
@@ -988,7 +989,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
}
@@ -1094,7 +1095,7 @@ public class LoyaltyCardViewActivityTest
activityController.resume();
// Save and check the loyalty card
saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), false);
saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), BARCODE_TYPE.name(), false);
db.close();
}
@@ -1131,7 +1132,7 @@ public class LoyaltyCardViewActivityTest
activityController.resume();
// First check if the card is as expected
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
// Complete empty barcode selection successfully
selectBarcodeWithResult(activity, BARCODE_DATA, "", true);
@@ -1270,11 +1271,12 @@ public class LoyaltyCardViewActivityTest
assertEquals(false, activity.isFinishing());
ImageView barcodeImage = activity.findViewById(R.id.barcode);
ImageView mainImage = activity.findViewById(R.id.mainImage);
View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout);
View bottomSheet = activity.findViewById(R.id.bottom_sheet);
ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton);
ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton);
LinearLayout dotIndicator = activity.findViewById(R.id.dotIndicator);
FloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler);
@@ -1290,9 +1292,10 @@ public class LoyaltyCardViewActivityTest
assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Click barcode to toggle fullscreen
barcodeImage.performClick();
// Click maximize button to activate fullscreen
maximizeButton.performClick();
shadowOf(getMainLooper()).idle();
// Android should be in fullscreen mode
@@ -1307,9 +1310,10 @@ public class LoyaltyCardViewActivityTest
assertEquals(View.VISIBLE, minimizeButton.getVisibility());
assertEquals(View.GONE, editButton.getVisibility());
assertEquals(View.VISIBLE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Clicking barcode again should deactivate fullscreen mode
barcodeImage.performClick();
// Clicking minimize button should deactivate fullscreen mode
minimizeButton.performClick();
shadowOf(getMainLooper()).idle();
uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions);
@@ -1320,9 +1324,10 @@ public class LoyaltyCardViewActivityTest
assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Another click back to fullscreen
barcodeImage.performClick();
maximizeButton.performClick();
shadowOf(getMainLooper()).idle();
uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();
assertEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions);
@@ -1333,6 +1338,7 @@ public class LoyaltyCardViewActivityTest
assertEquals(View.VISIBLE, minimizeButton.getVisibility());
assertEquals(View.GONE, editButton.getVisibility());
assertEquals(View.VISIBLE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// In full screen mode, back button should disable fullscreen
activity.onBackPressed();
@@ -1346,6 +1352,7 @@ public class LoyaltyCardViewActivityTest
assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Pressing back when not in full screen should finish activity
activity.onBackPressed();
@@ -1420,7 +1427,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", DateFormat.getDateInstance(DateFormat.LONG).format(date), "10.00", "$", "123456", context.getString(R.string.sameAsCardId), "AZTEC", null, null);
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", DateFormat.getDateInstance(DateFormat.LONG).format(date), "10.00", "$", "123456", context.getString(R.string.sameAsCardId), "Aztec", null, null);
assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor());
}
@@ -1441,7 +1448,7 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), "AZTEC", null, null);
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), "Aztec", null, null);
assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor());
}
}

View File

@@ -95,7 +95,7 @@ public class MainActivityTest
assertEquals(0, list.getAdapter().getItemCount());
DBHelper db = TestHelpers.getEmptyDb(mainActivity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
assertEquals(View.VISIBLE, helpText.getVisibility());
assertEquals(View.GONE, noMatchingCardsText.getVisibility());
@@ -130,10 +130,10 @@ public class MainActivityTest
assertEquals(0, list.getAdapter().getItemCount());
DBHelper db = TestHelpers.getEmptyDb(mainActivity);
db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("storeD", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1);
db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1);
db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
db.insertLoyaltyCard("storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1);
db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1);
assertEquals(View.VISIBLE, helpText.getVisibility());
assertEquals(View.GONE, noMatchingCardsText.getVisibility());
@@ -148,6 +148,11 @@ public class MainActivityTest
assertEquals(View.VISIBLE, list.getVisibility());
assertEquals(4, list.getAdapter().getItemCount());
// Make sure there is enough space to render all
list.measure(0, 0);
list.layout(0, 0, 100, 1000);
assertEquals("storeC", ((TextView) list.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.store)).getText());
assertEquals("storeD", ((TextView) list.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.store)).getText());
assertEquals("storeA", ((TextView) list.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.store)).getText());
@@ -221,8 +226,8 @@ public class MainActivityTest
TabLayout groupTabs = mainActivity.findViewById(R.id.groups);
DBHelper db = TestHelpers.getEmptyDb(mainActivity);
db.insertLoyaltyCard("The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0);
db.insertLoyaltyCard("The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
db.insertLoyaltyCard("The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0);
db.insertGroup("Group one");
List<Group> groups = new ArrayList<>();

View File

@@ -9,7 +9,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.0'
classpath 'com.android.tools.build:gradle:7.0.1'
classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.0'
// NOTE: Do not place your application dependencies here; they belong

View File

@@ -1 +0,0 @@
catima.app

View File

@@ -2,6 +2,10 @@
Copylefted libre software (GPLv3+) card management app.
[![GitHub Version](https://img.shields.io/github/v/release/TheLastProject/Catima.svg?logo=github&label=GitHub)](https://github.com/TheLastProject/Catima/releases)
[![F-Droid Version](https://img.shields.io/f-droid/v/me.hackerchick.catima.svg?logo=f-droid&label=F-Droid)](https://f-droid.org/packages/me.hackerchick.catima/)
[![Google Play Store Version](https://img.shields.io/endpoint?label=Play%20Store&style=flat&cacheSeconds=65536&url=https%3A%2F%2Fplaystore-jsapi.herokuapp.com%2Fsep%2Fme.hackerchick.catima)](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
![Android CI](https://github.com/TheLastProject/Catima/workflows/Android%20CI/badge.svg)
[![Translation status](https://hosted.weblate.org/widgets/catima/-/svg-badge.svg)](https://hosted.weblate.org/engage/catima/)
@@ -47,7 +51,7 @@ Supported barcodes:
# Moving data from other apps
Within the app you can import cards and codes from files, Catima, Loyalty Card Keychain, Voucher Vault, and FidMe.
Within the app you can import cards and codes from files, Catima, FidMe, Loyalty Card Keychain, Voucher Vault, and Stocard.
For FidMe you need to select the barcode type for each entry afterwards.
# Building

View File

@@ -1 +0,0 @@
theme: jekyll-theme-cayman

View File

@@ -1 +0,0 @@
README.md

View File

@@ -1,70 +0,0 @@
# PRIVACY POLICY FOR CATIMA
This privacy policy governs your use of the software application Catima (“Application”) for mobile devices
that was created by Sylvia van Os. The Application is designed to store and display barcodes.
# What information does the Application obtain and how is it used?
The Application allows a user to create store entries with a barcode. When a store is later selected the
corresponding barcode is displayed. This user data remains on the device and is not transmitted off of the
device.
If a crash occurs, a dialog may appear with crash details and a suggestion to transmit the details
to the developer. A user has the option to not send the crash details; a user must 'opt-in' to
sending such details.
# User Provided Information
The Application does not have a registration option. The only information which is obtained
is (1) crash details which a user intentionally send to the developer via the app, and
(2) any information provided by the App Store that the application was downloaded from.
# Automatically Collected Information
No information is automatically collected from the Application and transmitted off of the mobile device,
either automatically or manually.
# Does the Application collect precise real time location information of the device?
No.
# Do third parties see and/or have access to information obtained by the Application?
Any crash data which is intentionally submitted by a user to the developer is stored on an email server
which is not owned by the developer. Crash details may be uploaded to a third-party development tool
such as GitHub. In such a case the email address of the user is not uploaded, unless specifically requested
by the user. Besides this, no other data is transmitted off of the mobile device by the Application.
# What are my opt-out rights?
The only data collection is that of crash details, and submitting these to the developer is only opt-in. To
opt-out, a user would have to not submit crash details via the app.
# Data Retention Policy, Managing Your Information
Crash details submitted by a user are stored on a third-party email service, and the retention policy is to
not delete such emails.
# Children
This Application is not used to knowingly solicit data from or market to children under the age of 13. If a parent or
guardian becomes aware that his or her child has provided us with information without their consent, they should
contact us at sylvia+googleplay@hackerchick.me. We will delete such information from our files within a reasonable time.
# Security
We are concerned about safeguarding the confidentiality of your information. The only information which could
be sent to the developer is crash details, and these are opt-in. If a user is presented with the option to
submit details on a crash, all the information which would be submitted is presented to the user. The only
personally identifiable information is the email address of the user which is used to send the crash details.
# Changes
This Privacy Policy may be updated from time to time for any reason. We will notify you of any changes to our
Privacy Policy by posting the new Privacy Policy here. You are advised to consult this Privacy Policy regularly
for any changes, as continued use is deemed approval of all changes. You can check the history of this policy by
checking this history of this file in GitHub.
# Contact us
If you have any questions regarding privacy while using the Application, or have questions about our practices,
please contact us via email at sylvia+googleplay@hackerchick.me.

View File

@@ -1,10 +0,0 @@
# Shared Card
Someone wants to share a card with you. To import this card, you will first need to install the Catima app. It is free, Open Source and contains no ads.
<a href="https://play.google.com/store/apps/details?id=me.hackerchick.catima" target="_blank">
<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="90"/></a>
<a href="https://f-droid.org/repository/browse/?fdid=me.hackerchick.catima" target="_blank">
<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="90"/></a>
After installing the app, just click the link you were given again and choose "Import into Catima".

View File

@@ -0,0 +1,23 @@
Přestaňte hledat plastové věrnostní karty při placení v obchodě nebo ve webovém obchodě.
<b>Naskenujte si čárové kódy do svého zařízení pomocí jeho fotoaparátu a zapomeňte na karty.</b>
😺
Zapomeňte na peněženku nebo ji mějte ultralehkou na cennosti.
😺
S tímto nezbytným nástrojem pro každodenní nošení (EDC) můžete nahradit zbytečné plasty hotovostí.
😺
- Vyhněte se špehování s velmi malým počtem oprávnění. Žádný přístup k internetu a žádné reklamy.
- Přidejte karty nebo kódy se jmény a přizpůsobitelnými barvami.
- Ruční zadání kódu, pokud není čárový kód k uložení nebo jej nelze použít.
- Import karet a kódů ze souborů, Catima, FidMe, klíčenky věrnostních karet, Stocard a trezoru voucherů.
- Vytvořte si zálohu všech karet a v případě potřeby je přeneste do nového zařízení.
- Sdílejte kupony, exkluzivní nabídky, propagační kódy nebo karty a kódy pomocí libovolné aplikace.
- Tmavé téma a možnosti přístupnosti pro uživatele se zrakovým postižením.
- Vytvořeno pro všechny komunitou svobodného softwaru.
- Lokalizované ruční překlady pro více než 20 jazyků.
- Zdarma, podporováno příspěvky komunity.
- Používejte, studujte, měňte a sdílejte dle libosti; <i>se všemi</i>.
- Nejen svobodný software / open source. <i>Copylefted</i> libre software (GPLv3+) správa karet.
😺
Zjednodušte si život a nakupování a už nikdy neztraťte papírovou účtenku, dárkovou kartu pro platbu v obchodě nebo letenku.
Vezměte si s sebou všechny své odměny a bonusy a šetřete za pochodu.
😺

View File

@@ -0,0 +1,3 @@
- Changed the default import/export filename. (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84))
- Correct string on the import/export page. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87))
- Improve layout of card view page. The text should be easier to read, and is selectable with a long click. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91))

View File

@@ -0,0 +1,5 @@
- When editing a card ID, pre-populate the existing ID to start. (pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
- Limit the width of generated barcodes to reduce memory usage and out of memory errors. (pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
- When editing a card, change the "Enter Card" button to say "Edit Card" if a card ID already exists. (pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
- Change the color scheme to be softer and compatible with the app icon, and change the layout when viewing a card to be cleaner. (pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
- Add an intro wizard which launches on the app's first launch. (pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))

View File

@@ -0,0 +1 @@
- Prevent a crash when rotation the screen in the first run intro wizard.

View File

@@ -0,0 +1,2 @@
- A change in v0.11 reduced the memory usage of barcode drawing, but affected the barcode dimensions. This is now changed to maintain the barcode dimensions while reducing memory usage. (pull #126 (https://github.com/brarcher/loyalty-card-locker/pull/126))
- Update German and French translations. (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))

View File

@@ -0,0 +1,3 @@
- Add screen rotation lock menu option when displaying a card. If locked, the screen will transition to its "natural" orientation and further screen rotation will be blocked. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
- If a card is selected from the main screen but cannot be loaded, the application fails gracefully and posts a message. (pull #132 (https://github.com/brarcher/loyalty-card-locker/pull/132))
- Fix case where layout IDs for intro wizard could not be found. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))

View File

@@ -0,0 +1,2 @@
- Add support for app shortcuts (Android 7.1+), where the most recently used cards will appear as shortcuts. (pull #145 (https://github.com/brarcher/loyalty-card-locker/pull/145))
- Add a widget which works like a pinned app shortcut, to support devices which run below Android 7.1. (pull #142 (https://github.com/brarcher/loyalty-card-locker/pull/142))

View File

@@ -0,0 +1,5 @@
- Add support for adding shortcuts to home screen when adding or editing a card. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
- Remove widget, as it was a poor substitute for shortcuts. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
- Fix exporting backups on Android 7+. (pull #153 (https://github.com/brarcher/loyalty-card-locker/pull/153))
- Report more accurate mime type when exporting backup data. (pull #156 (https://github.com/brarcher/loyalty-card-locker/pull/156))
- Fix bug where a card could not be edited. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))

View File

@@ -0,0 +1,2 @@
- Add support for adding loyalty card shortcuts from the launcher/homescreen. (pull #161 (https://github.com/brarcher/loyalty-card-locker/pull/161))
- Remove support for adding loyalty card shortcuts from the app itself. This removes the need for the shortcut permission. (pull #163 (https://github.com/brarcher/loyalty-card-locker/pull/163))

View File

@@ -0,0 +1,2 @@
- Fix issue on Android SDK 24+ where using the file chooser import option would cause a crash. (pull #170 (https://github.com/brarcher/loyalty-card-locker/pull/170))
- New icon and color scheme. (pull #171 (https://github.com/brarcher/loyalty-card-locker/pull/171))

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