Compare commits

...

142 Commits

Author SHA1 Message Date
Sylvia van Os
e781e00256 Release Catima 2.19.0 2022-08-14 14:26:12 +02:00
Sylvia van Os
e630333e8d Merge pull request #982 from CatimaLoyalty/create-pull-request/patch-1660454689
Update contributors
2022-08-14 08:48:18 +02:00
TheLastProject
7eb827a219 Update contributors 2022-08-14 05:24:49 +00:00
Sylvia van Os
e251b4bc01 Merge pull request #981 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-08-13 15:45:23 +02:00
Oğuz Ersen
644f9e1f78 Translated using Weblate (Turkish)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-08-13 14:19:41 +02:00
109247019824
396d90c499 Translated using Weblate (Bulgarian)
Currently translated at 9.9% (11 of 111 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-08-13 14:19:41 +02:00
109247019824
ff6e93ea2c Translated using Weblate (Bulgarian)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-08-13 14:19:40 +02:00
unstartdev
fb97617de6 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-08-13 14:19:40 +02:00
Michał
ff47ab0a04 Translated using Weblate (Polish)
Currently translated at 2.7% (3 of 111 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-08-13 14:19:40 +02:00
Slávek Banko
ff98dae886 Translated using Weblate (Czech)
Currently translated at 100.0% (111 of 111 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-08-13 14:19:39 +02:00
Michael Moroni
deae7681f8 Translated using Weblate (Italian)
Currently translated at 16.2% (18 of 111 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-08-13 14:19:36 +02:00
solokot
849c1d8bec Translated using Weblate (Russian)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-08-13 14:19:35 +02:00
Michał
b88f0e9a82 Translated using Weblate (Polish)
Currently translated at 99.6% (260 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-08-13 14:19:35 +02:00
Heimen Stoffels
5ea2972ca1 Translated using Weblate (Dutch)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-08-13 14:19:35 +02:00
Allan Nordhøy
08ad6aaa85 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.4% (257 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-08-13 14:19:34 +02:00
Michael Moroni
8ba32a0196 Translated using Weblate (Italian)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-08-13 14:19:34 +02:00
J. Lavoie
68ce3ce01c Translated using Weblate (French)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-08-13 14:19:34 +02:00
J. Lavoie
fb47beb380 Translated using Weblate (German)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-08-13 14:19:34 +02:00
Slávek Banko
73a1464d5b Translated using Weblate (Czech)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-08-13 14:19:33 +02:00
Sylvia van Os
75b1225b38 Merge pull request #976 from CatimaLoyalty/create-pull-request/patch-1659903315
Update Fastlane changelogs
2022-08-07 22:17:01 +02:00
TheLastProject
07a4c4b7a4 Update Fastlane changelogs 2022-08-07 20:15:15 +00:00
Sylvia van Os
cbf9295225 Update CHANGELOG 2022-08-07 22:14:58 +02:00
bors[bot]
19d7fae814 Merge #974
974: use black/white for cardview fab icon, change floppy icon to check mark r=TheLastProject a=Kethen

#969
#970
please review
<img src="https://user-images.githubusercontent.com/22017945/183081280-7fd41f40-bdad-4d1f-bf11-3bf518104a99.png" width="280px">
<img src="https://user-images.githubusercontent.com/22017945/183081328-6684b342-45b0-41c2-a423-a79240ebe309.png" width="280px">
<img src="https://user-images.githubusercontent.com/22017945/183081700-c11c8db9-adef-4f4a-bbcc-01798730fec4.png" width="280px">
<img src="https://user-images.githubusercontent.com/22017945/183081591-fd668aaa-13ef-420c-9748-16dd0fe03ded.png" width="280px">


Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-08-07 15:28:46 +00:00
Sylvia van Os
d9db571362 Metadata updates 2022-08-07 17:23:07 +02:00
Sylvia van Os
91e44d9418 Merge pull request #975 from CatimaLoyalty/create-pull-request/patch-1659849694
Update contributors
2022-08-07 12:54:57 +02:00
TheLastProject
e30b95dd6c Update contributors 2022-08-07 05:21:33 +00:00
Katharine Chui
ddf27e619d use black/white for cardview fab icon, change floppy icon to check mark 2022-08-05 20:56:39 +08:00
Sylvia van Os
ebbcbf324f Merge pull request #968 from CatimaLoyalty/create-pull-request/patch-1659471282
Update Fastlane changelogs
2022-08-02 22:18:12 +02:00
TheLastProject
c161d4d781 Update Fastlane changelogs 2022-08-02 20:14:41 +00:00
Sylvia van Os
da01730c73 View activity refactor with previous/next (#937)
- Implement new bottom bar in card view with previous/next
- Refactor info sheet into info button in new bottom bar
- Make fav icon mutable before tinting, add prev/next transitions
- Update metadata

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2022-08-02 22:14:20 +02:00
Sylvia van Os
f0d76f1bc2 Merge pull request #966 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-07-31 13:05:06 +02:00
Sylvia van Os
3d5b1d00f0 Merge pull request #965 from CatimaLoyalty/create-pull-request/patch-1659245466
Update contributors
2022-07-31 13:01:25 +02:00
Slávek Banko
a098839060 Translated using Weblate (Czech)
Currently translated at 100.0% (110 of 110 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-07-31 09:19:33 +02:00
Giovanni Donisi
d3fac95701 Translated using Weblate (Italian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-07-31 09:19:33 +02:00
TheLastProject
37590dc5ee Update contributors 2022-07-31 05:31:06 +00:00
Sylvia van Os
8dfbc0b5e6 Release Catima 2.18.2 2022-07-29 19:37:58 +02:00
bors[bot]
0a9b292d12 Merge #962
962: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)

Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
2022-07-29 17:20:16 +00:00
IllusiveMan196
e7d4228c0c Translated using Weblate (Ukrainian)
Currently translated at 38.5% (42 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-07-29 19:18:30 +02:00
IllusiveMan196
a1836e5433 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-07-29 19:18:30 +02:00
Sylvia van Os
52e0496e36 Update screenshots 2022-07-29 19:14:41 +02:00
Sylvia van Os
50e6e28277 Merge pull request #961 from CatimaLoyalty/dependabot/gradle/androidx.core-core-splashscreen-1.0.0
Bump core-splashscreen from 1.0.0-rc01 to 1.0.0
2022-07-28 17:11:32 +02:00
dependabot[bot]
4cf770837b Bump core-splashscreen from 1.0.0-rc01 to 1.0.0
Bumps core-splashscreen from 1.0.0-rc01 to 1.0.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-28 02:27:22 +00:00
Sylvia van Os
38fb9f7fb8 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-07-27 21:37:59 +02:00
Sylvia van Os
7a6232c8b6 Make spotBugs happy 2022-07-27 21:37:44 +02:00
Sylvia van Os
13e62f3b38 Merge pull request #960 from CatimaLoyalty/create-pull-request/patch-1658949821
Update Fastlane changelogs
2022-07-27 21:29:28 +02:00
TheLastProject
d5590d37e3 Update Fastlane changelogs 2022-07-27 19:23:40 +00:00
Sylvia van Os
fd21806456 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-07-27 21:23:14 +02:00
Sylvia van Os
34bbfffdaf Make the possibility to set a custom header more visible 2022-07-27 21:22:59 +02:00
Sylvia van Os
56bbb4a786 Merge pull request #959 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-07-27 12:42:21 +02:00
Michael Moroni
2b92d200ca Translated using Weblate (Italian)
Currently translated at 10.0% (11 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-07-27 09:21:00 +02:00
Sylvia van Os
d4154e51d3 Merge pull request #958 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-07-25 12:48:11 +02:00
Oğuz Ersen
7d69e63dc9 Translated using Weblate (Turkish)
Currently translated at 67.8% (74 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-07-25 10:22:39 +02:00
Sylvia van Os
0189f13ee6 Retag 2.18.0 as 2.18.1
I accidentally built the .apk and uploaded it to Google Play before
doing a "git pull" or my main branch. So the 2.18.0 I uploaded to Google
Play was wrong. Because Google doesn't allow me to undo a release that
not a single person has installed yet, I'm retagging 2.18.0 as 2.18.1 to
keep it consistent on all platforms.
2022-07-24 19:56:38 +02:00
Sylvia van Os
11e32712f3 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-07-24 19:40:58 +02:00
Sylvia van Os
d124894d34 Release Catima 2.18.0 2022-07-24 19:40:39 +02:00
Sylvia van Os
84bfcf2b3f Merge pull request #956 from CatimaLoyalty/create-pull-request/patch-1658682152
Update Fastlane changelogs
2022-07-24 19:04:34 +02:00
TheLastProject
8e96096353 Update Fastlane changelogs 2022-07-24 17:02:32 +00:00
Sylvia van Os
a4739b2001 Merge pull request #955 from CatimaLoyalty/fix/currencyParsing
Fixes to currency parsing
2022-07-24 19:02:16 +02:00
Sylvia van Os
d3f5f33b53 Document parsing fix 2022-07-24 18:52:54 +02:00
Sylvia van Os
11bb1aa126 Remove unused imports 2022-07-24 18:42:16 +02:00
Sylvia van Os
688010cae4 Fixes to currency parsing 2022-07-24 18:14:49 +02:00
Sylvia van Os
150482eb56 Merge pull request #954 from CatimaLoyalty/create-pull-request/patch-1658639980
Update contributors
2022-07-24 12:37:26 +02:00
TheLastProject
c5e98c62ec Update contributors 2022-07-24 05:19:40 +00:00
Sylvia van Os
7b2f8885b1 Enable Arabic translation 2022-07-24 00:00:03 +02:00
Sylvia van Os
d4a7c33787 Merge pull request #952 from CatimaLoyalty/create-pull-request/patch-1658612341
Update Fastlane changelogs
2022-07-23 23:40:28 +02:00
TheLastProject
0cd245cafc Update Fastlane changelogs 2022-07-23 21:39:00 +00:00
Sylvia van Os
7487993537 Document Arabic language support in CHANGELOG 2022-07-23 23:38:41 +02:00
bors[bot]
33b7829b88 Merge #951
951: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)

Co-authored-by: Yousef Ryan <youssefryan3@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-07-23 21:31:43 +00:00
Sylvia van Os
7531853548 Translated using Weblate (Arabic)
Currently translated at 2.7% (3 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2022-07-23 23:30:48 +02:00
Yousef Ryan
3b77cf6f8a Translated using Weblate (Arabic)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2022-07-23 23:24:40 +02:00
Sylvia van Os
7b0f459337 Merge pull request #949 from CatimaLoyalty/create-pull-request/patch-1658590793
Update Fastlane changelogs
2022-07-23 17:41:25 +02:00
TheLastProject
b498ffd66e Update Fastlane changelogs 2022-07-23 15:39:52 +00:00
Sylvia van Os
6c8440a95f Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-07-23 17:39:10 +02:00
Sylvia van Os
6bb8cc8bc9 Fix back icon direction on RTL layouts 2022-07-23 17:38:51 +02:00
bors[bot]
dad531876a Merge #947
947: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)

Co-authored-by: Yousef Ryan <youssefryan3@gmail.com>
2022-07-22 23:00:05 +00:00
Yousef Ryan
205a629071 Added translation using Weblate (Arabic) 2022-07-23 00:56:48 +02:00
Sylvia van Os
b7704cc55e Merge pull request #946 from CatimaLoyalty/create-pull-request/patch-1658437884
Update Fastlane changelogs
2022-07-21 23:11:57 +02:00
TheLastProject
84ddbef585 Update Fastlane changelogs 2022-07-21 21:11:24 +00:00
Sylvia van Os
3bed947ba9 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-07-21 23:11:02 +02:00
Sylvia van Os
23d2faf107 Hack to not crash in RTL
I don't understand why it can be null. I don't understand why everything
still looks fine when I do this. But it fixes a crash so hey, that's
good right?
2022-07-21 23:09:56 +02:00
Sylvia van Os
b1d06a0be1 Merge pull request #944 from CatimaLoyalty/create-pull-request/patch-1658434626
Update Fastlane changelogs
2022-07-21 22:19:46 +02:00
TheLastProject
83ad3e2200 Update Fastlane changelogs 2022-07-21 20:17:06 +00:00
Sylvia van Os
84dcce6018 Update CHANGELOG 2022-07-21 22:16:48 +02:00
Sylvia van Os
d447ea7ff8 Merge pull request #943 from SamarthAsthan/master
Added new look to selected card
2022-07-21 22:14:59 +02:00
Samarth Asthan
91f8856efe Selected card fix 2022-07-22 00:26:54 +05:30
bors[bot]
77e45626bb Merge #942
942: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)

Co-authored-by: Slávek Banko <slavek.banko@axis.cz>
2022-07-19 20:19:30 +00:00
Slávek Banko
a61304a72a Translated using Weblate (Czech)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-07-19 22:16:46 +02:00
Sylvia van Os
7336075860 Merge pull request #940 from CatimaLoyalty/create-pull-request/patch-1658035831
Update contributors
2022-07-17 11:06:50 +02:00
TheLastProject
6dbd70fced Update contributors 2022-07-17 05:30:31 +00:00
bors[bot]
81c7d8a259 Merge #938
938: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)

Co-authored-by: Freddo espresso <weblate.3n7cf@simplelogin.co>
Co-authored-by: SC <lalocas@protonmail.com>
2022-07-14 19:23:45 +00:00
SC
a6a899e696 Translated using Weblate (Portuguese)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-07-14 21:18:05 +02:00
Freddo espresso
4ae314b3a0 Translated using Weblate (Greek)
Currently translated at 1.8% (2 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/el/
2022-07-14 21:18:05 +02:00
Freddo espresso
16ac55fd67 Translated using Weblate (Greek)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2022-07-14 21:18:05 +02:00
Sylvia van Os
c659065986 Merge pull request #936 from CatimaLoyalty/create-pull-request/patch-1657430685
Update contributors
2022-07-10 11:33:44 +02:00
TheLastProject
f1a6b5a7a8 Update contributors 2022-07-10 05:24:45 +00:00
Sylvia van Os
036de26e2a Merge pull request #935 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-07-08 23:50:02 +02:00
Oğuz Ersen
5ca0919546 Translated using Weblate (Turkish)
Currently translated at 67.8% (74 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-07-08 22:18:15 +02:00
Oğuz Ersen
4430df50fe Translated using Weblate (Turkish)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-07-08 22:18:15 +02:00
109247019824
4ff7913283 Translated using Weblate (Bulgarian)
Currently translated at 9.1% (10 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-07-08 22:18:15 +02:00
109247019824
0376245dbc Translated using Weblate (Bulgarian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-07-08 22:18:15 +02:00
J. Lavoie
3052c40359 Translated using Weblate (Finnish)
Currently translated at 98.0% (254 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2022-07-08 22:18:15 +02:00
Slávek Banko
64af34ca71 Translated using Weblate (Czech)
Currently translated at 100.0% (109 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-07-08 22:18:15 +02:00
solokot
aba95bbd8a Translated using Weblate (Russian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-07-08 22:18:15 +02:00
Heimen Stoffels
5de2a40a54 Translated using Weblate (Dutch)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-07-08 22:18:15 +02:00
J. Lavoie
c12c5a6cc4 Translated using Weblate (Italian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-07-08 22:18:15 +02:00
J. Lavoie
8674520d46 Translated using Weblate (French)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-07-08 22:18:15 +02:00
J. Lavoie
06d3a5fe54 Translated using Weblate (German)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-07-08 22:18:15 +02:00
Slávek Banko
6c485af249 Translated using Weblate (Czech)
Currently translated at 100.0% (259 of 259 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-07-08 22:18:15 +02:00
Sylvia van Os
f0ed989463 Merge pull request #934 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-07-07 21:21:22 +02:00
J. Lavoie
05de9d6941 Translated using Weblate (Finnish)
Currently translated at 98.0% (253 of 258 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2022-07-07 20:14:46 +02:00
Sylvia van Os
2ddebc5970 Merge pull request #933 from CatimaLoyalty/create-pull-request/patch-1657142599
Update Fastlane changelogs
2022-07-06 23:24:59 +02:00
TheLastProject
f1265bf84e Update Fastlane changelogs 2022-07-06 21:23:19 +00:00
Sylvia van Os
dc4c4be4c7 Document group archive count 2022-07-06 23:23:00 +02:00
alajemba-vik
d5100b97f3 Show groups archived count (#930)
Fixes #924
2022-07-06 23:21:59 +02:00
Sylvia van Os
31dc05f6b2 Merge pull request #932 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-07-05 18:57:40 +02:00
Oğuz Ersen
ca7ee9e694 Translated using Weblate (Turkish)
Currently translated at 100.0% (258 of 258 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-07-05 12:18:21 +02:00
109247019824
7acc2e28cd Translated using Weblate (Bulgarian)
Currently translated at 100.0% (258 of 258 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-07-05 12:18:21 +02:00
Slávek Banko
7eff64bf26 Translated using Weblate (Czech)
Currently translated at 100.0% (109 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-07-05 12:18:20 +02:00
solokot
d5d3cfa4e8 Translated using Weblate (Russian)
Currently translated at 100.0% (258 of 258 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-07-05 12:18:20 +02:00
Heimen Stoffels
2b937eda7c Translated using Weblate (Dutch)
Currently translated at 100.0% (258 of 258 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-07-05 12:18:20 +02:00
Giovanni Donisi
118b5a90b6 Translated using Weblate (Italian)
Currently translated at 100.0% (258 of 258 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-07-05 12:18:20 +02:00
J. Lavoie
d9c9295220 Translated using Weblate (French)
Currently translated at 100.0% (258 of 258 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-07-05 12:18:20 +02:00
Slávek Banko
eb4b6f276e Translated using Weblate (Czech)
Currently translated at 100.0% (258 of 258 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-07-05 12:18:20 +02:00
Sylvia van Os
52e68df515 Merge pull request #931 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-07-04 17:11:39 +02:00
Oğuz Ersen
c23973086c Translated using Weblate (Turkish)
Currently translated at 67.8% (74 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-07-04 11:18:49 +02:00
Slávek Banko
34be79f3d2 Translated using Weblate (Czech)
Currently translated at 100.0% (109 of 109 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-07-04 11:18:49 +02:00
bors[bot]
a8082748ad Merge #920
920: Crash on clicking "Add from image" button in scan activity #856 r=TheLastProject a=alajemba-vik

This PR contains a fix for issue #856, which concerns a crash that occurs when no activity can handle the intent to pick an image file.

### The simplest way to reproduce
* Disable all the gallery apps (e.g., Google Photos)
* Go to the ScanActivity by clicking the FAB on the home screen
* The app crashes when you click the button "Select image from gallery"

### Expected behavior
Clicking that button should have launched a gallery app, or displayed a disambiguation dialog if there is more than one app that can handle the intent being invoked.

### Solution
Wrapped the call to launch in a try-catch block.

Co-authored-by: Alajemba <alajemba.dev@gmail.com>
2022-07-03 17:18:36 +00:00
Sylvia van Os
08a4de919f Merge pull request #929 from CatimaLoyalty/create-pull-request/patch-1656825915
Update contributors
2022-07-03 16:48:37 +02:00
TheLastProject
7ce54ec0d3 Update contributors 2022-07-03 05:25:15 +00:00
bors[bot]
ce7dad0c8e Merge #928
928: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)

Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Artem <artem@molotov.work>
2022-07-02 08:21:48 +00:00
Artem
e059ed361d Translated using Weblate (Ukrainian)
Currently translated at 32.7% (35 of 107 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-07-02 10:17:51 +02:00
solokot
d12d641913 Translated using Weblate (Russian)
Currently translated at 2.8% (3 of 107 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2022-07-02 10:17:51 +02:00
Artem
5336b37133 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-07-02 10:17:51 +02:00
solokot
1819476a71 Translated using Weblate (Russian)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-07-02 10:17:51 +02:00
Alajemba
e2c621ec1f Wrapped call to launch photo picker in LoyaltyCardEditActivity in try-catch block 2022-06-30 20:57:26 +00:00
Sylvia van Os
854bca27ae Merge pull request #922 from CatimaLoyalty/create-pull-request/patch-1656531042
Update Fastlane changelogs
2022-06-29 21:43:51 +02:00
TheLastProject
b1dd9fa38a Update Fastlane changelogs 2022-06-29 19:30:42 +00:00
Sylvia van Os
8776ed61e9 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-06-29 21:30:19 +02:00
Sylvia van Os
c35fe166ed Fix custom theme not applying to main screen correctly
We were using the SplashScreen incorrectly. While it isn't consistently
documented, I managed to find a small note on
https://developer.android.com/reference/kotlin/androidx/core/splashscreen/SplashScreen#usage-of-the-core-splashscreen-library:
which states that installSplashScreen has to be called BEFORE onCreate.
Doing this fixing some theming bugs and allows deleting a hacky and
buggy workaround.
2022-06-29 21:28:56 +02:00
Sylvia van Os
0126b6d6da Merge pull request #921 from CatimaLoyalty/dependabot/gradle/com.android.tools-desugar_jdk_libs-1.1.6
Bump desugar_jdk_libs from 1.1.5 to 1.1.6
2022-06-29 20:28:41 +02:00
dependabot[bot]
4ecb877e27 Bump desugar_jdk_libs from 1.1.5 to 1.1.6
Bumps [desugar_jdk_libs](https://github.com/google/desugar_jdk_libs) from 1.1.5 to 1.1.6.
- [Release notes](https://github.com/google/desugar_jdk_libs/releases)
- [Changelog](https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/desugar_jdk_libs/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-29 02:23:13 +00:00
Alajemba
4f7f72f213 Fix for 'Crash on clicking "Add from image" button in scan activity #856' 2022-06-28 06:33:36 +00:00
131 changed files with 1527 additions and 871 deletions

View File

@@ -1,5 +1,25 @@
# Changelog
## v2.19.0 - 113
- Add previous and next buttons to the loyalty card view
- Fix foreground colour on edit button
- Replace floppy disk save icon with checkmark
## v2.18.2 - 112
- Make the possibility to set a custom header more visible
## v2.18.1 - 111
- Arabic language support
- Display archived card count in group overview
- Fix balance parsing bugs (made cards not savable in Arabic and other language with non-Western numbers)
- Fix custom theme not applying to main screen correctly
- Improve display of selected cards
- Fix crash when leaving cardview in RTL layouts for cards with expiry or balance
- Fix back arrow in card view pointing the wrong way in RTL layouts
## v2.17.1 - 109
- Fix incorrect text colour on "No barcode" button

View File

@@ -18,8 +18,8 @@ android {
applicationId "me.hackerchick.catima"
minSdkVersion 21
targetSdkVersion 31
versionCode 109
versionName "2.17.1"
versionCode 113
versionName "2.19.0"
vectorDrawables.useSupportLibrary true
multiDexEnabled true
@@ -87,10 +87,10 @@ dependencies {
implementation 'androidx.preference:preference:1.2.0'
implementation 'com.google.android.material:material:1.6.1'
implementation 'com.github.yalantis:ucrop:2.2.8'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6'
// Splash Screen
implementation 'androidx.core:core-splashscreen:1.0.0-rc01'
implementation 'androidx.core:core-splashscreen:1.0.0'
// Third-party
implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar'

View File

@@ -8,7 +8,6 @@ import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;

View File

@@ -16,13 +16,13 @@ import android.service.controls.actions.ControlAction;
import android.service.controls.templates.StatelessTemplate;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import java.util.List;
import java.util.concurrent.Flow;
import java.util.function.Consumer;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
@RequiresApi(Build.VERSION_CODES.R)
public class CardsOnPowerScreenService extends ControlsProviderService {

View File

@@ -19,10 +19,7 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// XXX splash screen activity has to do this after installing splash screen before view inflate
if (!this.getClass().getSimpleName().equals(MainActivity.class.getSimpleName())) {
Utils.patchColors(this);
}
Utils.patchColors(this);
}
@Override

View File

@@ -577,6 +577,22 @@ public class DBHelper extends SQLiteOpenHelper {
whereAttrs(LoyaltyCardDbIds.ARCHIVE_STATUS), withArgs(1));
}
public static int getArchivedCardsCount(SQLiteDatabase database, final String groupName) {
Cursor data = database.rawQuery(
"select * from " + LoyaltyCardDbIds.TABLE + " c " +
" LEFT JOIN " + LoyaltyCardDbIdsGroups.TABLE + " cg " +
" ON c." + LoyaltyCardDbIds.ID + " = cg." + LoyaltyCardDbIdsGroups.cardID +
" where " + LoyaltyCardDbIds.ARCHIVE_STATUS + " = 1" +
" AND " + LoyaltyCardDbIdsGroups.groupID + "= ?",
withArgs(groupName)
);
int count = data.getCount();
data.close();
return count;
}
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database) {
// An empty string will match everything
return getLoyaltyCardCursor(database, LoyaltyCardArchiveFilter.All);

View File

@@ -1,6 +1,7 @@
package protect.card_locker;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
@@ -43,8 +44,18 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
inputHolder.mName.setText(group._id);
int groupCardCount = DBHelper.getGroupCardCount(mDatabase, group._id);
inputHolder.mCardCount.setText(mContext.getResources().getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount));
int archivedCardCount = DBHelper.getArchivedCardsCount(mDatabase, group._id);
Resources resources = mContext.getResources();
String cardCountText;
if (archivedCardCount > 0) {
cardCountText = resources.getQuantityString(R.plurals.groupCardCountWithArchived, groupCardCount, groupCardCount, archivedCardCount);
} else {
cardCountText = resources.getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount);
}
inputHolder.mCardCount.setText(cardCountText);
inputHolder.mName.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
inputHolder.mCardCount.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));

View File

@@ -16,6 +16,12 @@ import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
@@ -23,15 +29,6 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;

View File

@@ -16,12 +16,6 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.card.MaterialCardView;
import java.math.BigDecimal;
@@ -30,6 +24,10 @@ import java.util.ArrayList;
import java.util.Currency;
import java.util.Date;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder> {
@@ -170,14 +168,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
private void applyIconAnimation(LoyaltyCardListItemViewHolder inputHolder, int inputPosition) {
if (itemSelected(inputPosition)) {
inputHolder.mCardIcon.setVisibility(View.GONE);
inputHolder.mTickIcon.setVisibility(View.VISIBLE);
if (mCurrentSelectedIndex == inputPosition) {
resetCurrentIndex();
}
} else {
inputHolder.mTickIcon.setVisibility(View.GONE);
inputHolder.mCardIcon.setVisibility(View.VISIBLE);
if ((mReverseAllAnimations && mAnimationItemsIndex.get(inputPosition, false)) || mCurrentSelectedIndex == inputPosition) {
resetCurrentIndex();
}
@@ -290,10 +286,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mDivider.setVisibility(View.VISIBLE);
mBalanceField.setVisibility(View.VISIBLE);
Drawable balanceIcon = mBalanceField.getCompoundDrawables()[0];
balanceIcon.setBounds(0, 0, drawableSize, drawableSize);
mBalanceField.setCompoundDrawablesRelative(balanceIcon, null, null, null);
if (mDarkModeEnabled) {
balanceIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
if (balanceIcon != null) {
balanceIcon.setBounds(0, 0, drawableSize, drawableSize);
mBalanceField.setCompoundDrawablesRelative(balanceIcon, null, null, null);
if (mDarkModeEnabled) {
balanceIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
}
mBalanceField.setText(Utils.formatBalance(mContext, balance, balanceType));
mBalanceField.setTextSize(size);
@@ -310,15 +308,19 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mDivider.setVisibility(View.VISIBLE);
mExpiryField.setVisibility(View.VISIBLE);
Drawable expiryIcon = mExpiryField.getCompoundDrawables()[0];
expiryIcon.setBounds(0, 0, drawableSize, drawableSize);
mExpiryField.setCompoundDrawablesRelative(expiryIcon, null, null, null);
if (Utils.hasExpired(expiry)) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP));
mExpiryField.setTextColor(Color.RED);
} else if (mDarkModeEnabled) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
if (expiryIcon != null) {
expiryIcon.setBounds(0, 0, drawableSize, drawableSize);
mExpiryField.setCompoundDrawablesRelative(expiryIcon, null, null, null);
if (Utils.hasExpired(expiry)) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP));
} else if (mDarkModeEnabled) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
}
mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(expiry));
if (Utils.hasExpired(expiry)) {
mExpiryField.setTextColor(Color.RED);
}
mExpiryField.setTextSize(size);
}
mExpiryField.requestLayout();

View File

@@ -5,10 +5,10 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
@@ -51,6 +51,7 @@ import java.io.IOException;
import java.io.InvalidObjectException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
@@ -75,8 +76,6 @@ import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.exifinterface.media.ExifInterface;
import androidx.fragment.app.DialogFragment;
import androidx.palette.graphics.Palette;
import protect.card_locker.async.TaskHandler;
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
@@ -118,6 +117,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
TabLayout tabs;
ImageView thumbnail;
ImageView thumbnailEditIcon;
EditText storeFieldEdit;
EditText noteFieldEdit;
ChipGroup groupsChips;
@@ -316,6 +316,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
tabs = findViewById(R.id.tabs);
thumbnail = findViewById(R.id.thumbnail);
thumbnailEditIcon = findViewById(R.id.thumbnailEditIcon);
storeFieldEdit = findViewById(R.id.storeNameEdit);
noteFieldEdit = findViewById(R.id.noteEdit);
groupsChips = findViewById(R.id.groupChips);
@@ -401,11 +402,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
try {
BigDecimal balance = Utils.parseCurrency(s.toString(), Utils.currencyHasDecimals(tempLoyaltyCard.balanceType));
BigDecimal balance = Utils.parseBalance(s.toString(), tempLoyaltyCard.balanceType);
updateTempState(LoyaltyCardField.balance, balance);
validBalance = true;
} catch (NumberFormatException e) {
} catch (ParseException e) {
validBalance = false;
e.printStackTrace();
}
@@ -864,12 +864,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
updateTempState(LoyaltyCardField.headerColor, Utils.getRandomHeaderColor(this));
}
// It can't be null because we set it in updateTempState but SpotBugs insists it can be
// NP_NULL_ON_SOME_PATH: Possible null pointer dereference
if (tempLoyaltyCard.headerColor != null) {
thumbnail.setOnClickListener(new ChooseCardImage());
}
// Update from intent
if (barcodeType != null) {
try {
@@ -916,13 +910,28 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
generateIcon(storeFieldEdit.getText().toString());
// It can't be null because we set it in updateTempState but SpotBugs insists it can be
// NP_NULL_ON_SOME_PATH: Possible null pointer dereference and
// NP_NULL_PARAM_DEREF: Method call passes null for non-null parameter
Integer headerColor = tempLoyaltyCard.headerColor;
if (headerColor != null) {
thumbnail.setOnClickListener(new ChooseCardImage());
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
}
onResuming = false;
}
protected void setColorFromIcon() {
Object icon = thumbnail.getTag();
if (icon != null && (icon instanceof Bitmap)) {
updateTempState(LoyaltyCardField.headerColor, Utils.getHeaderColorFromImage((Bitmap) icon, tempLoyaltyCard.headerColor != null ? tempLoyaltyCard.headerColor : R.attr.colorPrimary));
int headerColor = Utils.getHeaderColorFromImage((Bitmap) icon, tempLoyaltyCard.headerColor != null ? tempLoyaltyCard.headerColor : R.attr.colorPrimary);
updateTempState(LoyaltyCardField.headerColor, headerColor);
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(headerColor) ? Color.WHITE : Color.BLACK);
} else {
Log.d("setColorFromIcon", "attempting header color change from icon but icon does not exist");
}
@@ -1104,6 +1113,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
public void onColorSelected(int dialogId, int color) {
updateTempState(LoyaltyCardField.headerColor, color);
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(color) ? Color.BLACK : Color.WHITE);
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(color) ? Color.WHITE : Color.BLACK);
// Unset image if set
thumbnail.setTag(null);
@@ -1171,7 +1183,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
Intent i = new Intent(Intent.ACTION_PICK);
i.setType("image/*");
mPhotoPickerLauncher.launch(i);
try {
mPhotoPickerLauncher.launch(i);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
return null;
});

View File

@@ -3,9 +3,6 @@ package protect.card_locker;
import android.app.Application;
import androidx.appcompat.app.AppCompatDelegate;
import com.google.android.material.color.DynamicColors;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardLockerApplication extends Application {

View File

@@ -8,10 +8,15 @@ import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.text.util.Linkify;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
@@ -19,7 +24,6 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver;
import android.view.Window;
@@ -31,19 +35,6 @@ import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources;
@@ -52,12 +43,23 @@ import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Guideline;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.NestedScrollView;
import androidx.core.widget.TextViewCompat;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.bottomappbar.BottomAppBar;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.preferences.Settings;
@@ -69,14 +71,10 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
CoordinatorLayout coordinatorLayout;
ConstraintLayout mainLayout;
TextView cardIdFieldView;
BottomSheetBehavior behavior;
LinearLayout bottomSheet;
NestedScrollView bottomSheetContentWrapper;
ImageView bottomSheetButton;
TextView noteView;
TextView groupsView;
TextView balanceView;
TextView expiryView;
BottomAppBar bottomAppBar;
ImageButton bottomAppBarInfoButton;
ImageButton bottomAppBarPreviousButton;
ImageButton bottomAppBarNextButton;
AppCompatTextView storeName;
ImageButton maximizeButton;
ImageView mainImage;
@@ -85,10 +83,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
View collapsingToolbarLayout;
AppBarLayout appBarLayout;
ImageView iconImage;
Toolbar portraitToolbar;
Toolbar landscapeToolbar;
int loyaltyCardId;
ArrayList<Integer> cardList;
LoyaltyCard loyaltyCard;
List<Group> loyaltyCardGroups;
boolean rotationEnabled;
SQLiteDatabase database;
ImportURIHelper importURIHelper;
@@ -114,11 +116,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private ImageView[] dots;
boolean isBarcodeSupported = true;
int bottomSheetState;
static final String STATE_IMAGEINDEX = "imageIndex";
static final String STATE_FULLSCREEN = "isFullscreen";
static final String STATE_BOTTOMSHEET = "bottomSheetState";
private final int HEADER_FILTER_ALPHA = 127;
@@ -208,6 +207,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void extractIntentFields(Intent intent) {
final Bundle b = intent.getExtras();
loyaltyCardId = b != null ? b.getInt("id") : 0;
cardList = b != null ? b.getIntegerArrayList("cardList") : null;
Log.d(TAG, "View activity: id=" + loyaltyCardId);
}
@@ -228,6 +228,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
Drawable unwrappedIcon = AppCompatResources.getDrawable(this, icon);
assert unwrappedIcon != null;
Drawable wrappedIcon = DrawableCompat.wrap(unwrappedIcon);
wrappedIcon.mutate();
if (dark) {
DrawableCompat.setTint(wrappedIcon, Color.BLACK);
} else {
@@ -250,6 +251,18 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null) {
Intent incomingIntent = getIntent();
int transitionRight = incomingIntent.getExtras().getInt("transition_right", -1);
if (transitionRight == 1) {
// right side transition
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
} else if (transitionRight == 0) {
// left side transition
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
}
}
super.onCreate(savedInstanceState);
settings = new Settings(this);
@@ -268,10 +281,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
if (savedInstanceState != null) {
mainImageIndex = savedInstanceState.getInt(STATE_IMAGEINDEX);
isFullscreen = savedInstanceState.getBoolean(STATE_FULLSCREEN);
bottomSheetState = savedInstanceState.getInt(STATE_BOTTOMSHEET);
}
extractIntentFields(getIntent());
setContentView(R.layout.loyalty_card_view_layout);
@@ -282,13 +293,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
coordinatorLayout = findViewById(R.id.coordinator_layout);
mainLayout = findViewById(R.id.mainLayout);
cardIdFieldView = findViewById(R.id.cardIdView);
bottomSheet = findViewById(R.id.bottom_sheet);
bottomSheetContentWrapper = findViewById(R.id.bottomSheetContentWrapper);
bottomSheetButton = findViewById(R.id.bottomSheetButton);
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);
mainImage = findViewById(R.id.mainImage);
@@ -297,9 +301,15 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
minimizeButton = findViewById(R.id.minimizeButton);
collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout);
appBarLayout = findViewById(R.id.app_bar_layout);
bottomAppBar = findViewById(R.id.bottom_app_bar);
iconImage = findViewById(R.id.icon_image);
portraitToolbar = findViewById(R.id.toolbar);
landscapeToolbar = findViewById(R.id.toolbar_landscape);
bottomAppBarInfoButton = findViewById(R.id.button_show_info);
bottomAppBarPreviousButton = findViewById(R.id.button_previous);
bottomAppBarNextButton = findViewById(R.id.button_next);
barcodeImageGenerationFinishedCallback = () -> {
if (!(boolean) mainImage.getTag()) {
mainImage.setVisibility(View.GONE);
@@ -364,33 +374,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
});
editButton.bringToFront();
behavior = BottomSheetBehavior.from(bottomSheet);
behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
changeUiToBottomSheetState(newState);
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
});
bottomSheetButton.setOnClickListener(v -> {
if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
} else {
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
});
appBarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
adjustLayoutHeights();
}
});
appBarLayout.setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
@@ -399,61 +382,144 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
});
bottomAppBarInfoButton.setOnClickListener(view -> showInfoDialog());
bottomAppBarPreviousButton.setOnClickListener(view -> prevNextCard(false));
bottomAppBarNextButton.setOnClickListener(view -> prevNextCard(true));
mGestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
mainImage.setOnTouchListener(gestureTouchListener);
}
private void changeUiToBottomSheetState(int newState) {
if (newState == BottomSheetBehavior.STATE_DRAGGING) {
editButton.hide();
} else if (newState == BottomSheetBehavior.STATE_EXPANDED) {
bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24);
bottomSheetButton.setContentDescription(getString(R.string.hideMoreInfo));
mainLayout.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
editButton.hide();
} else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24);
bottomSheetButton.setContentDescription(getString(R.string.showMoreInfo));
mainLayout.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
if (!isFullscreen) {
editButton.show();
}
// Scroll bottomsheet content back to top
bottomSheetContentWrapper.setScrollY(0);
}
bottomSheetState = newState;
}
private void adjustLayoutHeights() {
// use getLayoutParams instead of getHeight when heights are pre-determined in xml! getHeight could return 0 if a View is not inflated
if (appBarLayout.getHeight() != 0 && iconImage.getLayoutParams().height != appBarLayout.getHeight()) {
Log.d("adjustLayoutHeights", "setting imageIcon height from: " + iconImage.getLayoutParams().height + " to: " + appBarLayout.getHeight());
iconImage.setLayoutParams(new CoordinatorLayout.LayoutParams(
CoordinatorLayout.LayoutParams.MATCH_PARENT, appBarLayout.getHeight())
);
}
int bottomSheetHeight = getResources().getDisplayMetrics().heightPixels - appBarLayout.getHeight() - bottomSheetButton.getLayoutParams().height;
ViewGroup.LayoutParams params = bottomSheetContentWrapper.getLayoutParams();
if (params.height != bottomSheetHeight || params.width != LinearLayout.LayoutParams.MATCH_PARENT) {
// XXX android 5 - 9 has so much quirks with setting bottomSheetContent height
// just invalidate the wrapper works on 10 onward
// bottomSheetContentWrapper.invalidate();
// The below worked on android 5 but not 6, reloading the card then it breaks again on 6, entirely random :(
// for (int i = 0; i < bottomSheetContentWrapper.getChildCount(); i++) {
// bottomSheetContentWrapper.getChildAt(i).invalidate();
// }
// since it's basically allergic to getting enlarged then shrunk again, and setting it at all when fullscreen makes no sense
if (!isFullscreen) {
Log.d("adjustLayoutHeights", "setting bottomSheet height from: " + params.height + " to: " + bottomSheetHeight);
bottomSheetContentWrapper.setLayoutParams(
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, bottomSheetHeight)
appBarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
iconImage.setLayoutParams(new CoordinatorLayout.LayoutParams(
CoordinatorLayout.LayoutParams.MATCH_PARENT, appBarLayout.getHeight())
);
iconImage.setClipBounds(new Rect(left, top, right, bottom));
}
});
}
private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) {
if (spannableStringBuilder.length() > 0) {
spannableStringBuilder.append("\n\n");
}
return spannableStringBuilder;
}
private boolean hasBalance(LoyaltyCard loyaltyCard) {
return !loyaltyCard.balance.equals(new BigDecimal(0));
}
private void showInfoDialog() {
AlertDialog.Builder infoDialog = new AlertDialog.Builder(this);
TextView infoTitleView = new TextView(this);
infoTitleView.setPadding(20, 20, 20, 20);
infoTitleView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
infoTitleView.setText(loyaltyCard.store);
infoDialog.setCustomTitle(infoTitleView);
infoDialog.setTitle(loyaltyCard.store);
TextView infoTextview = new TextView(this);
infoTextview.setPadding(20, 0, 20, 0);
infoTextview.setAutoLinkMask(Linkify.ALL);
infoTextview.setTextIsSelectable(true);
SpannableStringBuilder infoText = new SpannableStringBuilder();
if (!loyaltyCard.note.isEmpty()) {
infoText.append(loyaltyCard.note);
}
if (loyaltyCardGroups.size() > 0) {
List<String> groupNames = new ArrayList<>();
for (Group group : loyaltyCardGroups) {
groupNames.add(group._id);
}
padSpannableString(infoText);
infoText.append(getString(R.string.groupsList, TextUtils.join(", ", groupNames)));
}
if (hasBalance(loyaltyCard)) {
padSpannableString(infoText);
infoText.append(getString(R.string.balanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
}
if (loyaltyCard.expiry != null) {
String formattedExpiry = DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry);
padSpannableString(infoText);
if (Utils.hasExpired(loyaltyCard.expiry)) {
int start = infoText.length();
infoText.append(getString(R.string.expiryStateSentenceExpired, formattedExpiry));
infoText.setSpan(new ForegroundColorSpan(Color.RED), start, infoText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
} else {
infoText.append(getString(R.string.expiryStateSentence, formattedExpiry));
}
}
infoTextview.setText(infoText);
infoDialog.setView(infoTextview);
infoDialog.setPositiveButton(R.string.ok, (dialogInterface, i) -> dialogInterface.dismiss());
infoDialog.create().show();
}
private void setBottomAppBarButtonState() {
if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.expiry != null) {
bottomAppBarInfoButton.setVisibility(View.VISIBLE);
} else {
bottomAppBarInfoButton.setVisibility(View.GONE);
}
if (cardList == null || cardList.size() == 1) {
bottomAppBarPreviousButton.setVisibility(View.GONE);
bottomAppBarNextButton.setVisibility(View.GONE);
} else {
bottomAppBarPreviousButton.setVisibility(View.VISIBLE);
bottomAppBarNextButton.setVisibility(View.VISIBLE);
}
}
private void prevNextCard(boolean next) {
// If we're in RTL layout, we want the "left" button to be "next" instead of "previous"
// So we swap next around
boolean transitionRight = next;
if (getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
next = !next;
}
int cardListPosition = cardList.indexOf(loyaltyCardId);
if (next) {
if (cardListPosition == cardList.size() - 1) {
cardListPosition = 0;
} else {
cardListPosition = cardListPosition + 1;
}
} else {
if (cardListPosition == 0) {
cardListPosition = cardList.size() - 1;
} else {
cardListPosition = cardListPosition - 1;
}
}
loyaltyCardId = cardList.get(cardListPosition);
// Restart activity with new card id and index
Intent intent = getIntent();
Bundle b = intent.getExtras();
b.putInt("id", loyaltyCardId);
b.putInt("transition_right", transitionRight ? 1 : 0);
intent.putExtras(b);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
@Override
public void onNewIntent(Intent intent) {
@@ -467,7 +533,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt(STATE_IMAGEINDEX, mainImageIndex);
savedInstanceState.putBoolean(STATE_FULLSCREEN, isFullscreen);
savedInstanceState.putInt(STATE_BOTTOMSHEET, bottomSheetState);
super.onSaveInstanceState(savedInstanceState);
}
@@ -509,6 +574,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return;
}
loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId);
setupOrientation();
format = loyaltyCard.barcodeType;
@@ -520,56 +587,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
settings.getFontSizeMin(settings.getLargeFont()), settings.getFontSizeMax(settings.getLargeFont()),
1, TypedValue.COMPLEX_UNIT_SP);
if (loyaltyCard.note.length() > 0) {
noteView.setVisibility(View.VISIBLE);
noteView.setText(loyaltyCard.note);
noteView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
} else {
noteView.setVisibility(View.GONE);
}
List<Group> loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId);
if (loyaltyCardGroups.size() > 0) {
List<String> groupNames = new ArrayList<>();
for (Group group : loyaltyCardGroups) {
groupNames.add(group._id);
}
groupsView.setVisibility(View.VISIBLE);
groupsView.setText(getString(R.string.groupsList, TextUtils.join(", ", groupNames)));
groupsView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
} else {
groupsView.setVisibility(View.GONE);
}
if (!loyaltyCard.balance.equals(new BigDecimal(0))) {
balanceView.setVisibility(View.VISIBLE);
balanceView.setText(getString(R.string.balanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
balanceView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
} else {
balanceView.setVisibility(View.GONE);
}
if (loyaltyCard.expiry != null) {
expiryView.setVisibility(View.VISIBLE);
int expiryString = R.string.expiryStateSentence;
if (Utils.hasExpired(loyaltyCard.expiry)) {
expiryString = R.string.expiryStateSentenceExpired;
expiryView.setTextColor(Color.RED);
}
expiryView.setText(getString(expiryString, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry)));
expiryView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
} else {
expiryView.setVisibility(View.GONE);
}
expiryView.setTag(loyaltyCard.expiry);
if (!isFullscreen) {
makeBottomSheetVisibleIfUseful();
}
storeName.setText(loyaltyCard.store);
storeName.setTextSize(settings.getFontSizeMax(settings.getLargeFont()));
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
@@ -601,22 +618,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
barcodeScaler.setThumbTintList(ColorStateList.valueOf(darkenedColor));
maximizeButton.setBackgroundColor(darkenedColor);
minimizeButton.setBackgroundColor(darkenedColor);
bottomSheetButton.setBackgroundColor(darkenedColor);
bottomAppBar.setBackgroundColor(darkenedColor);
maximizeButton.setColorFilter(textColor);
minimizeButton.setColorFilter(textColor);
bottomSheetButton.setColorFilter(textColor);
int complementaryColor = Utils.getComplementaryColor(darkenedColor);
editButton.setBackgroundTintList(ColorStateList.valueOf(complementaryColor));
Drawable editButtonIcon = editButton.getDrawable();
editButtonIcon.mutate();
int colorPrimary = MaterialColors.getColor(this, R.attr.colorPrimary, ContextCompat.getColor(this, R.color.md_theme_light_primary));
int colorOnPrimary = MaterialColors.getColor(this, R.attr.colorOnPrimary, ContextCompat.getColor(this, R.color.md_theme_light_onPrimary));
boolean darkMode = Utils.isDarkModeEnabled(this);
if (Utils.needsDarkForeground(complementaryColor)) {
editButtonIcon.setTint(darkMode ? colorOnPrimary : colorPrimary);
} else {
editButtonIcon.setTint(darkMode ? colorPrimary : colorOnPrimary);
}
editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
editButton.setImageDrawable(editButtonIcon);
Bitmap icon = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon);
@@ -637,9 +646,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeAsUpIndicator(getIcon(R.drawable.ic_arrow_back_white, backgroundNeedsDarkIcons));
actionBar.setHomeAsUpIndicator(getIcon(R.drawable.home_arrow_back_white, backgroundNeedsDarkIcons));
}
fixImageButtonColor(bottomAppBarInfoButton);
fixImageButtonColor(bottomAppBarPreviousButton);
fixImageButtonColor(bottomAppBarNextButton);
setBottomAppBarButtonState();
// Make notification area light if dark icons are needed
if (Build.VERSION.SDK_INT >= 23) {
window.getDecorView().setSystemUiVisibility(backgroundNeedsDarkIcons ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : 0);
@@ -676,16 +690,17 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
imageTypes.add(ImageType.IMAGE_BACK);
}
setDotIndicator(darkMode);
setDotIndicator(Utils.isDarkModeEnabled(this));
setFullscreen(isFullscreen);
// restore bottomSheet UI states from changing orientation
changeUiToBottomSheetState(bottomSheetState);
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
}
private void fixImageButtonColor(ImageButton imageButton) {
imageButton.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE, BlendModeCompat.SRC_ATOP));
}
@Override
public void onBackPressed() {
if (isFullscreen) {
@@ -699,14 +714,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.card_view_menu, menu);
loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId);
starred = loyaltyCard.starStatus != 0;
if(loyaltyCard.archiveStatus != 0){
if (loyaltyCard.archiveStatus != 0) {
menu.findItem(R.id.action_unarchive).setVisible(true);
menu.findItem(R.id.action_archive).setVisible(false);
}
else{
} else {
menu.findItem(R.id.action_unarchive).setVisible(false);
menu.findItem(R.id.action_archive).setVisible(true);
}
@@ -735,75 +748,75 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:
if (id == android.R.id.home) {
finish();
} else if (id == R.id.action_share) {
try {
importURIHelper.startShareIntent(Arrays.asList(loyaltyCard));
} catch (UnsupportedEncodingException e) {
Toast.makeText(LoyaltyCardViewActivity.this, R.string.failedGeneratingShareURL, Toast.LENGTH_LONG).show();
e.printStackTrace();
}
return true;
} else if (id == R.id.action_duplicate) {
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("id", loyaltyCardId);
bundle.putBoolean("duplicateId", true);
intent.putExtras(bundle);
startActivity(intent);
return true;
} else if (id == R.id.action_star_unstar) {
starred = !starred;
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0);
// Re-init loyaltyCard with new data from DB
onResume();
return true;
} else if (id == R.id.action_archive) {
DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 1);
Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show();
// Re-init loyaltyCard with new data from DB
onResume();
return true;
} else if (id == R.id.action_unarchive) {
DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 0);
Toast.makeText(LoyaltyCardViewActivity.this, R.string.unarchived, Toast.LENGTH_LONG).show();
// Re-init loyaltyCard with new data from DB
onResume();
return true;
} else if (id == R.id.action_delete) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.deleteTitle);
builder.setMessage(R.string.deleteConfirmation);
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
Log.e(TAG, "Deleting card: " + loyaltyCardId);
DBHelper.deleteLoyaltyCard(database, LoyaltyCardViewActivity.this, loyaltyCardId);
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
finish();
break;
dialog.dismiss();
});
builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
case R.id.action_share:
try {
importURIHelper.startShareIntent(Arrays.asList(loyaltyCard));
} catch (UnsupportedEncodingException e) {
Toast.makeText(LoyaltyCardViewActivity.this, R.string.failedGeneratingShareURL, Toast.LENGTH_LONG).show();
e.printStackTrace();
}
return true;
case R.id.action_duplicate:
loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId);
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("id", loyaltyCardId);
bundle.putBoolean("duplicateId", true);
intent.putExtras(bundle);
startActivity(intent);
return true;
case R.id.action_star_unstar:
starred = !starred;
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0);
invalidateOptionsMenu();
return true;
case R.id.action_archive:
DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 1);
Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show();
invalidateOptionsMenu();
return true;
case R.id.action_unarchive:
DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 0);
Toast.makeText(LoyaltyCardViewActivity.this, R.string.unarchived, Toast.LENGTH_LONG).show();
invalidateOptionsMenu();
return true;
case R.id.action_delete:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.deleteTitle);
builder.setMessage(R.string.deleteConfirmation);
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
Log.e(TAG, "Deleting card: " + loyaltyCardId);
DBHelper.deleteLoyaltyCard(database, LoyaltyCardViewActivity.this, loyaltyCardId);
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
finish();
dialog.dismiss();
});
builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
return true;
return true;
}
return super.onOptionsItemSelected(item);
}
private void setupOrientation() {
Toolbar portraitToolbar = findViewById(R.id.toolbar);
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.d(TAG, "Detected landscape mode");
@@ -832,14 +845,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
}
private void makeBottomSheetVisibleIfUseful() {
if (noteView.getVisibility() == View.VISIBLE || groupsView.getVisibility() == View.VISIBLE || balanceView.getVisibility() == View.VISIBLE || expiryView.getVisibility() == View.VISIBLE) {
bottomSheet.setVisibility(View.VISIBLE);
} else {
bottomSheet.setVisibility(View.GONE);
}
}
private void drawBarcode(boolean addPadding) {
mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false);
if (format != null) {
@@ -980,10 +985,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
// Hide toolbars
//
// Appbar needs to be invisible and have padding removed
// Or the barcode will be centered instead of on top of the screen
// Don't ask me why...
appBarLayout.setVisibility(View.INVISIBLE);
iconImage.setVisibility(View.INVISIBLE);
collapsingToolbarLayout.setVisibility(View.GONE);
@@ -991,12 +992,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// Hide other UI elements
cardIdFieldView.setVisibility(View.GONE);
bottomSheet.setVisibility(View.GONE);
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
editButton.hide();
// android 5-9, avoid padding growing on top of bottomSheet
coordinatorLayout.removeView(bottomSheet);
bottomAppBar.setVisibility(View.GONE);
editButton.setVisibility(View.GONE);
// Set Android to fullscreen mode
getWindow().getDecorView().setSystemUiVisibility(
@@ -1024,15 +1021,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
}
// Show appropriate toolbar
// And restore 24dp paddingTop for appBarLayout
appBarLayout.setVisibility(View.VISIBLE);
setupOrientation();
iconImage.setVisibility(View.VISIBLE);
// Show other UI elements
cardIdFieldView.setVisibility(View.VISIBLE);
makeBottomSheetVisibleIfUseful();
editButton.show();
editButton.setVisibility(View.VISIBLE);
bottomAppBar.setVisibility(View.VISIBLE);
// Unset fullscreen mode
getWindow().getDecorView().setSystemUiVisibility(
@@ -1040,11 +1036,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
& ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
& ~View.SYSTEM_UI_FLAG_FULLSCREEN
);
// android 5-9, avoid padding growing on top of bottomSheet
if (bottomSheet.getParent() != coordinatorLayout) {
coordinatorLayout.addView(bottomSheet);
}
}
Log.d("setFullScreen", "Is full screen enabled? " + enabled + " Zoom Level = " + barcodeScaler.getProgress());

View File

@@ -19,6 +19,14 @@ import android.view.View;
import android.widget.CheckBox;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
@@ -33,6 +41,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@@ -218,8 +227,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
@Override
protected void onCreate(Bundle inputSavedInstanceState) {
extractIntentFields(getIntent());
super.onCreate(inputSavedInstanceState);
SplashScreen.installSplashScreen(this);
super.onCreate(inputSavedInstanceState);
if(!mArchiveMode) {
setTitle(R.string.app_name);
setContentView(R.layout.main_activity);
@@ -228,8 +237,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
setTitle(R.string.archiveList);
setContentView(R.layout.archive_activity);
}
// XXX color patching has to be done again after setting splash screen
Utils.patchColors(this);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -242,8 +250,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
mDatabase = new DBHelper(this).getWritableDatabase();
TabLayout groupsTabLayout = findViewById(R.id.groups);
groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
@@ -854,15 +860,22 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
return;
}
Intent i = new Intent(this, LoyaltyCardViewActivity.class);
i.setAction("");
Intent intent = new Intent(this, LoyaltyCardViewActivity.class);
intent.setAction("");
final Bundle b = new Bundle();
b.putInt("id", loyaltyCard.id);
i.putExtras(b);
ArrayList<Integer> cardList = new ArrayList<>();
for (int i = 0; i < mAdapter.getItemCount(); i++) {
cardList.add(mAdapter.getCard(i).id);
}
b.putIntegerArrayList("cardList", cardList);
intent.putExtras(b);
ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard);
startActivity(i);
startActivity(intent);
}
}
}

View File

@@ -8,8 +8,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import androidx.recyclerview.widget.RecyclerView;
public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
private HashMap<Integer, Integer> mIndexCardMap;
private HashMap<Integer, Boolean> mInGroupOverlay;

View File

@@ -1,6 +1,7 @@
package protect.card_locker;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
@@ -206,6 +207,11 @@ public class ScanActivity extends CatimaAppCompatActivity {
public void addFromImage(View view) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
photoPickerLauncher.launch(photoPickerIntent);
try {
photoPickerLauncher.launch(photoPickerIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
}

View File

@@ -10,15 +10,15 @@ import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.textview.MaterialTextView;
import com.yalantis.ucrop.UCropActivity;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.textview.MaterialTextView;
import com.yalantis.ucrop.UCropActivity;
public class UCropWrapper extends UCropActivity {
public static final String UCROP_TOOLBAR_TYPEFACE_STYLE = "ucop_toolbar_typeface_style";

View File

@@ -16,7 +16,6 @@ import android.os.LocaleList;
import android.provider.MediaStore;
import android.util.Log;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
@@ -37,6 +36,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Currency;
import java.util.Date;
@@ -48,7 +48,6 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.graphics.ColorUtils;
import androidx.exifinterface.media.ExifInterface;
import androidx.palette.graphics.Palette;
import protect.card_locker.preferences.Settings;
@@ -239,32 +238,19 @@ public class Utils {
return numberFormat.format(value);
}
static public Boolean currencyHasDecimals(Currency currency) {
static public BigDecimal parseBalance(String value, Currency currency) throws ParseException {
NumberFormat numberFormat = NumberFormat.getInstance();
if (currency == null) {
return false;
numberFormat.setMaximumFractionDigits(0);
} else {
numberFormat.setMinimumFractionDigits(currency.getDefaultFractionDigits());
numberFormat.setMaximumFractionDigits(currency.getDefaultFractionDigits());
}
return currency.getDefaultFractionDigits() != 0;
}
Log.d(TAG, numberFormat.parse(value).toString());
static public BigDecimal parseCurrency(String value, Boolean hasDecimals) throws NumberFormatException {
// If there are no decimals expected, remove all separators before parsing
if (!hasDecimals) {
value = value.replaceAll("[^0-9]", "");
return new BigDecimal(value);
}
// There are many ways users can write a currency, so we fix it up a bit
// 1. Replace all non-numbers with dots
value = value.replaceAll("[^0-9]", ".");
// 2. Remove all but the last dot
while (value.split("\\.").length > 2) {
value = value.replaceFirst("\\.", "");
}
// Parse as BigDecimal
return new BigDecimal(value);
return new BigDecimal(numberFormat.parse(value).toString());
}
static public byte[] bitmapToByteArray(Bitmap bitmap) {

View File

@@ -4,7 +4,6 @@ import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.io.IOException;
import java.io.OutputStream;
public class MultiFormatExporter {

View File

@@ -6,13 +6,7 @@ import android.util.Log;
import net.lingala.zip4j.exception.ZipException;
import org.json.JSONException;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import protect.card_locker.FormatException;
public class MultiFormatImporter {
private static final String TAG = "Catima";

View File

@@ -9,7 +9,6 @@ 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;

View File

@@ -6,6 +6,8 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import com.google.android.material.color.DynamicColors;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -18,9 +20,6 @@ import androidx.fragment.app.DialogFragment;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import com.google.android.material.color.DynamicColors;
import nl.invissvenska.numberpickerpreference.NumberDialogPreference;
import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment;
import protect.card_locker.CatimaAppCompatActivity;

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- https://stackoverflow.com/questions/5151591/android-left-to-right-slide-animation/5151774#5151774 -->
<translate
android:duration="200"
android:fromXDelta="-100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />
</set>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- https://stackoverflow.com/questions/5151591/android-left-to-right-slide-animation/5151774#5151774 -->
<translate
android:duration="200"
android:fromXDelta="100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />
</set>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- https://stackoverflow.com/questions/5151591/android-left-to-right-slide-animation/5151774#5151774 -->
<translate
android:duration="200"
android:fromXDelta="0%"
android:fromYDelta="0%"
android:toXDelta="-100%"
android:toYDelta="0%" />
</set>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- https://stackoverflow.com/questions/5151591/android-left-to-right-slide-animation/5151774#5151774 -->
<translate
android:duration="200"
android:fromXDelta="0%"
android:fromYDelta="0%"
android:toXDelta="100%"
android:toYDelta="0%" />
</set>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
<vector android:autoMirrored="true" android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
</vector>

View File

@@ -2,8 +2,7 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/>

View File

@@ -1,5 +0,0 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z"/>
</vector>

View File

@@ -7,14 +7,15 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="protect.card_locker.ManageGroupActivity">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:srcCompat="@drawable/save_24dp"
android:layout_margin="16dp"
android:contentDescription="@string/save"
android:layout_margin="16dp" />
app:srcCompat="@drawable/ic_done" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -12,9 +12,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:srcCompat="@drawable/save_24dp"
android:layout_margin="16dp"
android:contentDescription="@string/save"
android:layout_margin="16dp" />
app:srcCompat="@drawable/ic_done" />
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
@@ -82,6 +82,17 @@
android:contentDescription="@string/thumbnailDescription"
android:src="@mipmap/ic_launcher"/>
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/thumbnailEditIcon"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Material3.FloatingActionButton"
android:layout_width="@dimen/cardThumbnailEditOverlaySize"
android:layout_height="@dimen/cardThumbnailEditOverlaySize"
android:layout_gravity="bottom|end"
android:layout_margin="4dp"
app:contentPadding="4dp"
android:alpha="0.8"
android:src="@drawable/ic_mode_edit_white_24dp"/>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.textfield.TextInputLayout

View File

@@ -47,7 +47,8 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_done" />
app:srcCompat="@drawable/ic_done"
android:background="@color/md_theme_dark_onSelected" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/star"

View File

@@ -8,239 +8,6 @@
android:layout_height="fill_parent"
android:fitsSystemWindows="true">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:srcCompat="@drawable/ic_mode_edit_white_24dp"
android:contentDescription="@string/edit"
android:layout_margin="16dp" />
<FrameLayout
android:clipChildren="false"
android:clipToPadding="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/mainLayout"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/centerGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/scalerGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.75"/>
<ImageButton
android:id="@+id/maximizeButton"
android:visibility="gone"
android:layout_width="match_parent"
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_up_24"
android:contentDescription="@string/moveBarcodeToTopOfScreen"
app:tint="?attr/colorOnPrimary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:background="?attr/colorPrimary" />
<ImageView
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"
app:layout_constraintBottom_toTopOf="@+id/centerGuideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/maximizeButton"/>
<ImageButton
android:id="@+id/minimizeButton"
android:visibility="gone"
android:layout_width="match_parent"
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="?attr/colorOnPrimary"
app:layout_constraintTop_toBottomOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:background="?attr/colorPrimary" />
<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:contentDescription="@string/set_scale"
android:id="@+id/barcodeScaler"
android:visibility="gone"
android:max="100"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/inputPadding"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
app:layout_constraintTop_toBottomOf="@+id/scalerGuideline"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/cardIdView"
android:enabled="true"
android:textIsSelectable="true"
android:focusable="true"
android:longClickable="true"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="10.0dip"
android:layout_marginRight="10.0dip"
android:paddingBottom="80dp"
app:layout_constraintTop_toBottomOf="@+id/dotIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textAlignment="center"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="@dimen/singleCardCardIdTextSizeMin"
app:autoSizeMaxTextSize="@dimen/singleCardCardIdTextSizeMax"
android:ellipsize="end"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/drop_shadow_actionbar"
android:layout_width="fill_parent"
android:layout_height="5.0dip"
android:layout_gravity="top"/>
</FrameLayout>
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:colorBackground"
android:orientation="vertical"
android:paddingTop="0px"
android:visibility="gone"
app:behavior_hideable="false"
app:behavior_peekHeight="80dp"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
tools:visibility="visible">
<ImageButton
android:id="@+id/bottomSheetButton"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_gravity="top|start"
android:contentDescription="@string/showMoreInfo"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24"
app:tint="?attr/colorOnPrimary"
android:background="?attr/colorPrimary" />
<androidx.core.widget.NestedScrollView
android:id="@+id/bottomSheetContentWrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/noteView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="all"
android:enabled="true"
android:focusable="true"
android:gravity="center"
android:longClickable="true"
android:padding="20dp"
android:textIsSelectable="true"
android:textSize="@dimen/singleCardNoteTextSizeMin" />
<TextView
android:id="@+id/groupsView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="true"
android:focusable="true"
android:gravity="center"
android:longClickable="true"
android:padding="20dp"
android:textIsSelectable="true"
android:textSize="@dimen/singleCardNoteTextSizeMin" />
<TextView
android:id="@+id/balanceView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="true"
android:focusable="true"
android:gravity="center"
android:longClickable="true"
android:padding="20dp"
android:textIsSelectable="true"
android:textSize="@dimen/singleCardNoteTextSizeMin" />
<TextView
android:id="@+id/expiryView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="true"
android:focusable="true"
android:gravity="center"
android:longClickable="true"
android:padding="20dp"
android:textIsSelectable="true"
android:textSize="@dimen/singleCardNoteTextSizeMin" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="fill_parent"
@@ -249,8 +16,7 @@
android:clipChildren="false"
android:clipToPadding="false"
android:fitsSystemWindows="true"
android:weightSum="1.0"
>
android:weightSum="1.0">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_landscape"
@@ -310,5 +76,202 @@
app:srcCompat="@drawable/ic_launcher_foreground"
tools:ignore="ContentDescription" />
<FrameLayout
android:clipChildren="false"
android:clipToPadding="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/mainLayout"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/centerGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/scalerGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.75"/>
<ImageButton
android:id="@+id/maximizeButton"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:background="?attr/colorPrimary"
android:contentDescription="@string/moveBarcodeToTopOfScreen"
android:padding="0dp"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24"
app:tint="?attr/colorOnPrimary"
tools:visibility="visible" />
<ImageView
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"
app:layout_constraintBottom_toTopOf="@+id/centerGuideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/maximizeButton"/>
<ImageButton
android:id="@+id/minimizeButton"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:background="?attr/colorPrimary"
android:contentDescription="@string/moveBarcodeToCenterOfScreen"
android:padding="0dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mainImage"
app:srcCompat="@drawable/ic_baseline_arrow_drop_down_24"
app:tint="?attr/colorOnPrimary"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/dotIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/minimizeButton"
tools:visibility="visible" />
<SeekBar
android:id="@+id/barcodeScaler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/inputPadding"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
android:contentDescription="@string/set_scale"
android:max="100"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/scalerGuideline" />
<TextView
android:id="@+id/cardIdView"
android:enabled="true"
android:textIsSelectable="true"
android:focusable="true"
android:longClickable="true"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="10.0dip"
android:layout_marginRight="10.0dip"
android:paddingBottom="80dp"
app:layout_constraintTop_toBottomOf="@+id/dotIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textAlignment="center"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="@dimen/singleCardCardIdTextSizeMin"
app:autoSizeMaxTextSize="@dimen/singleCardCardIdTextSizeMax"
android:ellipsize="end"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/drop_shadow_actionbar"
android:layout_width="fill_parent"
android:layout_height="5.0dip"
android:layout_gravity="top"/>
</FrameLayout>
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottom_app_bar"
style="@style/Widget.MaterialComponents.BottomAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?attr/colorPrimary"
app:contentInsetLeft="0dp"
app:contentInsetStart="0dp"
app:contentInsetRight="0dp"
app:contentInsetEnd="0dp"
app:fabAlignmentMode="center">
<ImageButton
android:id="@+id/button_previous"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="left"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:background="@android:color/transparent"
android:src="@drawable/ic_baseline_chevron_left_24"
android:tooltipText="@string/previousCard"
android:visibility="gone" />
<ImageButton
android:id="@+id/button_show_info"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:background="@android:color/transparent"
android:src="@drawable/ic_baseline_info_24"
android:tooltipText="@string/showMoreInfo"
android:visibility="gone" />
<ImageButton
android:id="@+id/button_next"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:background="@android:color/transparent"
android:src="@drawable/ic_baseline_chevron_right_24"
android:tooltipText="@string/nextCard"
android:visibility="gone" />
</com.google.android.material.bottomappbar.BottomAppBar>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_mode_edit_white_24dp"
android:contentDescription="@string/edit"
app:layout_anchor="@id/bottom_app_bar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -2,20 +2,21 @@ Sylvia van Os
Branden Archer
J. Lavoie
Allan Nordhøy
Heimen Stoffels
solokot
Heimen Stoffels
Katharine Chui
Oğuz Ersen
mondstern
Altonss
IllusiveMan196
Altonss
StoyanDimitrov
Petr Novák
Joel A
Taco
Gediminas Murauskas
Nyatsuki
Michael Moroni
Nyatsuki
SlavekB
Samantaz Fox
arno-github
Ankit Tiwari
@@ -26,6 +27,7 @@ arshbeerSingh
Quentin PAGÈS
Miha Frangež
sr093906
Freddo espresso
mdvhimself
Maciej Błędkowski
Olivia (Zoe)
@@ -33,28 +35,31 @@ betsythefc
Silvério Santos
waffshappen
ati3
Giovanni
Jane Kong
K. Herbert
SlavekB
Still Hsu
String E. Fighter
Yurical
rr-vesp
alajemba-vik
/usr/local/ΕΨΗΕΛΩΝ
Adolfo Jayme-Barrientos
Alessandro Mandelli
KovalevArtem
Artem M.
Astrohops1
Clonewayx
D. Domig
Diego
Freddo espresso
Lukas Grassauer
Marnick L'Eau
Michalis
Michał
Rosdyana Kusuma
umoenks
Thomas Bertels
Runner
inesre
lgasp
phlostically
@@ -70,7 +75,6 @@ Kasina Dheeraj
Eric
Flav
Franciszek Stefan
Giovanni
Grzegorz
Izzy
Karol Kosek
@@ -87,11 +91,12 @@ Reza
Rohan Babbar
Ronak Upadhyay
Rose Liverman
Samarth Asthan
Simone Dotto
Subhashish Anand
darkodo
Tymofii Lytvynenko
Tjipke van der Heide
Vancha March
Yevgeny M
Avik Kundu
opsik
@@ -101,3 +106,4 @@ Robin
sergio
Marcus
techwebpd
unstartdev

View File

@@ -0,0 +1,272 @@
<?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="action_search">بحث</string>
<string name="action_add">اضف</string>
<string name="noGiftCards">اضغط علي زر + لاضافة بطاقة, او استورد بعض منهم من قائمة ال ⋮.</string>
<string name="noMatchingGiftCards">لا نتائج. حاول تغيير بحثك.</string>
<string name="storeName">اسم</string>
<string name="note">مذكرة</string>
<string name="cardId">بطاقة شخصية</string>
<string name="barcodeType">نوع الباركود</string>
<string name="barcodeNoBarcode">لا يوجد باركود</string>
<string name="noBarcode">لا يوجد باركود</string>
<string name="star">اضف الي المفضلة</string>
<string name="unstar">حذف من المفضلة</string>
<string name="cancel">الغاء</string>
<string name="save">حفظ</string>
<string name="edit">تعديل</string>
<string name="delete">مسح</string>
<string name="confirm">تأكيد</string>
<string name="deleteConfirmation">مسح هذة البطاقة نهائيا؟</string>
<string name="ok">حسنا</string>
<string name="copy_to_clipboard">نسخ البطاقة الشخصية الي الحافظة</string>
<string name="share">شارك</string>
<string name="sendLabel">ارسل…</string>
<string name="editCardTitle">عدل بطاقة</string>
<string name="addCardTitle">اضف بطاقة</string>
<string name="scanCardBarcode">مسح باركود</string>
<string name="cardShortcut">اختصار البطاقة</string>
<string name="noCardsMessage">اضف بطاقة أولا</string>
<string name="card_ids_copied">البطاقة(ات) الشخصية المنسوخة</string>
<string name="barcodeImageDescriptionWithType">صورة <xliff:g>%s</xliff:g> باركود</string>
<string name="noStoreError">لا يوجد اسم مدخل</string>
<string name="noCardIdError">لا يوجد بطاقة شخصية مدخلة</string>
<string name="noCardExistsError">لا يمكن العثور علي هذه البطاقة</string>
<string name="failedParsingImportUriError">لا يمكن تحليل الرابط المستورد</string>
<string name="importExport">استيراد/تصدير</string>
<string name="importExportHelp">عمل نسخ احتطياتي لبياناتك يسمح نقلها لجهاز اخر.</string>
<string name="importFailed">لا يمكن عمل الاستيراد</string>
<string name="exportSuccessfulTitle">متصدر</string>
<string name="exportFailedTitle">فشل التصدير</string>
<string name="exportFailed">لا يمكن عمل التصدير</string>
<string name="noExternalStoragePermissionError">امنح التخزين الخارجي اذن لاستيراد وتصدير البيانات</string>
<string name="exportOptionExplanation">ستتم كتابة البيانات في الموقع الذي تختاره.</string>
<string name="importOptionFilesystemButton">من نظام الملفات</string>
<string name="importOptionApplicationTitle">استخدم تطبيقًا آخر</string>
<string name="importOptionApplicationExplanation">استخدم أي تطبيق أو مدير الملفات المفضل لديك لفتح ملف.</string>
<string name="importOptionApplicationButton">استخدم تطبيقًا آخر</string>
<string name="about">حول</string>
<string name="app_copyright_old">بناء على Loyalty Card Keychain
\nحقوق النشر © 2016-2020 Branden Archer</string>
<string name="app_license">البرمجيات الحرة متروكة الحقوق, ترخيص +GPLv3</string>
<string name="app_revision_fmt">معلومات المراجعة: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries">مكتبات الطرف الثالث الحرة: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">اختار الباركود</string>
<string name="enterBarcodeInstructions">أدخل بطاقة هوية ، واختر نوع الباركود أدناه ، أو \"لا يوجد باركود\".</string>
<string name="copy_to_clipboard_toast">تم نسخ بطاقة الهوية إلى الحافظة</string>
<string name="thumbnailDescription">صورة مصغرة</string>
<string name="starImage">نجم مفضل</string>
<string name="settings">اعدادات</string>
<string name="settings_category_title_ui">واجهة المستخدم</string>
<string name="settings_light_theme">فاتح</string>
<string name="settings_dark_theme">داكن</string>
<string name="settings_card_orientation">اتجاه الباركود</string>
<string name="settings_portrait_orientation">الوضع الرأسي</string>
<string name="settings_landscape_orientation">الوضع الأفقي</string>
<string name="settings_theme">مظهر</string>
<string name="settings_max_font_size_scale">اقصي. حجم الخط</string>
<string name="settings_display_barcode_max_brightness">عرض مشرق علي الباركود</string>
<string name="importSuccessful">تم استيراد البيانات</string>
<string name="exportSuccessful">تم تصدير البيانات</string>
<string name="enter_group_name">أدخل اسم المجموعة</string>
<string name="group_edit">تعديل المجموعة</string>
<string name="noGroups">اضغط زر + لإضافة مجموعات للتصنيف.</string>
<string name="noGroupCards">هذه المجموعة فارغة</string>
<string name="group_name_already_in_use">اسم المجموعة قيد الاستخدام بالفعل</string>
<string name="group_name_is_empty">لا يمكن أن يكون اسم المجموعة فارغًا</string>
<string name="group_updated">تم تحديث المجموعة</string>
<string name="all">الكل</string>
<string name="deleteConfirmationGroup">هل تريد حذف المجموعة؟</string>
<string name="failedOpeningFileManager">قم بتثبيت مدير الملفات أولاً.</string>
<string name="moveUp">تحرك لأعلى</string>
<string name="addFromImage">حدد صورة من المعرض</string>
<string name="balance">الرصيد</string>
<string name="currency">العملة</string>
<string name="points">نقاط</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> لا يبدو أنه رصيد صالح.</string>
<string name="chooseImportType">استيراد البيانات من</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="privacy_policy">سياسة الخصوصية</string>
<string name="accept">قبول</string>
<string name="importCatima">الاستيراد من Catima</string>
<string name="importCatimaMessage">حدد ملفك <i>catima.zip</i> تصدير من Catima للاستيراد.
\nقم بإنشائه من قائمة الاستيراد / التصدير لتطبيق Catima آخر بالضغط على تصدير هناك أولاً.</string>
<string name="importFidme">الاستيراد من FidMe</string>
<string name="importFidmeMessage">حدد ملفك <i>fidme-export-request-xxxxxx.zip</i> تصدير من FidMe للاستيراد ، ثم حدد أنواع الباركود يدويًا بعد ذلك.
\nقم بإنشائه من ملف تعريف FidMe الخاص بك عن طريق اختيار حماية البيانات ثم الضغط على استخراج بياناتي أولاً.</string>
<string name="importStocardMessage">حدد ملفك <i>***-sync.zip</i> تصدير من Stocard للاستيراد.
\nاحصل عليه عن طريق إرسال بريد إلكتروني إلى support@stocardapp.com لطلب تصدير بياناتك.</string>
<string name="importVoucherVault">الاستيراد من Voucher Vault</string>
<string name="importVoucherVaultMessage">حدد ملفك <i>vouchervault.json</i> تصدير من Voucher Vault للاستيراد.
\nقم بإنشائه بالضغط على تصدير في Voucher Vault أولاً.</string>
<string name="barcodeId">قيمة الباركود</string>
<string name="sameAsCardId">نفس بطاقة الهوية</string>
<string name="setBarcodeId">قم بتعيين قيمة الباركود</string>
<string name="unsupportedBarcodeType">لا يمكن عرض نوع الباركود هذا. قد يكون مدعومًا في إصدار أحدث من التطبيق.</string>
<string name="wrongValueForBarcodeType">القيمة غير صالحة لنوع الباركود المحدد</string>
<string name="copy_to_clipboard_multiple_toast">تم نسخ بطاقات الهوية إلى الحافظة</string>
<string name="intent_import_card_from_url_share_multiple_text">أريد مشاركة بعض البطاقات معك</string>
<string name="frontImageDescription">الصورة الأمامية</string>
<string name="backImageDescription">الصورة الخلفية</string>
<string name="photos">الصور</string>
<string name="setFrontImage">تعيين الصورة الأمامية</string>
<string name="setBackImage">الصورة الخلفية</string>
<string name="removeImage">إزالة الصورة</string>
<string name="takePhoto">التقاط صورة</string>
<string name="updateBarcodeQuestionTitle">هل تريد تحديث قيمة الباركود؟</string>
<string name="updateBarcodeQuestionText">لقد قمت بتغيير بطاقة الهوية. هل تريد أيضًا تحديث الباركود لاستخدام نفس القيمة؟</string>
<string name="yes">نعم</string>
<string name="no">لا</string>
<string name="passwordRequired">الرجاء إدخال كلمة المرور</string>
<string name="exportPassword">قم بتعيين كلمة مرور لحماية التصدير (اختياري)</string>
<string name="exportPasswordHint">أدخل كلمة المرور</string>
<string name="turn_flashlight_on">قم بتشغيل المصباح</string>
<string name="turn_flashlight_off">أطفئ المصباح</string>
<string name="settings_locale">لغة</string>
<string name="settings_system_locale">النظام</string>
<string name="setIcon">تعيين رمز</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_pink_theme">زهري</string>
<string name="settings_magenta_theme">أرجواني</string>
<string name="settings_violet_theme">البنفسجي</string>
<string name="settings_blue_theme">أزرق</string>
<string name="settings_sky_blue_theme">أزرق سماوي</string>
<string name="settings_green_theme">أخضر</string>
<string name="settings_grey_theme">رمادي</string>
<string name="settings_brown_theme">بني</string>
<string name="app_contributors">أصبح ممكنًا بواسطة: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="sort">فرز</string>
<string name="showMoreInfo">اظهر المعلومات</string>
<string name="hideMoreInfo">إخفاء المعلومات</string>
<string name="swipeToSwitchImages">اسحب أو اضغط لفترة طويلة لتبديل الصور</string>
<string name="sort_by_balance">الرصيد</string>
<string name="reverse">... بترتيب معكوس</string>
<string name="sort_by">صنف حسب</string>
<string name="settings_oled_dark">خلفية سوداء نقية لمظهر داكن</string>
<string name="credits">الاعتمادات</string>
<string name="source_repository">مستودع المصدر</string>
<string name="and_data_usage">واستخدام البيانات</string>
<string name="rate_this_app">قيم هذا التطبيق</string>
<string name="translate_platform">على Weblate</string>
<string name="shortcutSelectCard">اختر بطاقة</string>
<string name="options">خيارات</string>
<string name="starred">مميز بنجمة</string>
<string name="set_scale">ضبط النطاق</string>
<string name="include_if_asking_support">إذا كنت ترغب في طلب الدعم ، فقم بتضمين المعلومات التالية:</string>
<string name="duplicateCard">كرر</string>
<string name="archive">ضع الي الأرشيف</string>
<string name="unarchive">أخرج من الأرشيف</string>
<string name="archived">تمت أرشفة البطاقة</string>
<string name="unarchived">البطاقة غير مؤرشفة</string>
<string name="archiveList">أرشيف</string>
<string name="failedLaunchingPhotoPicker">تعذر العثور على تطبيق معرض مدعوم</string>
<string name="noGiftCardsGroup">انشئ بعض من البطاقات, و عيينهم لهذة المجموعة.</string>
<string name="deleteTitle">مسح بطاقة</string>
<plurals name="selectedCardCount">
<item quantity="zero"><xliff:g>%d</xliff:g> محدد</item>
<item quantity="one"><xliff:g>%d</xliff:g> محددة</item>
<item quantity="two"><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>
</plurals>
<string name="importing">جار الاستيراد…</string>
<string name="exportName">تصدير</string>
<string name="exporting">جار التصدير…</string>
<string name="importSuccessfulTitle">مستورد</string>
<string name="importFailedTitle">فشل الاستيراد</string>
<string name="sort_by_most_recently_used">الأكثر أستعمالا مؤخرا</string>
<string name="license">رخصة</string>
<string name="sort_by_name">اسم</string>
<string name="version_history">تاريخ النسخة</string>
<string name="action_hide_details">أخف التفاصيل</string>
<plurals name="groupCardCountWithArchived">
<item quantity="zero"><xliff:g>%1$d</xliff:g> بطاقة ( <xliff:g id="archivedCount">%2$d</xliff:g> مؤرشفة)</item>
<item quantity="one"><xliff:g>%1$d</xliff:g> بطاقة ( <xliff:g id="archivedCount">%2$d</xliff:g> مؤرشفة)</item>
<item quantity="two"><xliff:g>%1$d</xliff:g> بطاقة ( <xliff:g id="archivedCount">%2$d</xliff:g> مؤرشفة)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> بطاقات ( <xliff:g id="archivedCount">%2$d</xliff:g> مؤرشفة)</item>
<item quantity="many"><xliff:g>%1$d</xliff:g> بطاقات ( <xliff:g id="archivedCount">%2$d</xliff:g> مؤرشفة)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> بطاقات ( <xliff:g id="archivedCount">%2$d</xliff:g> مؤرشفة)</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="zero">مسح <xliff:g>%d</xliff:g> بطاقة</item>
<item quantity="one">مسح <xliff:g>%d</xliff:g> بطاقة</item>
<item quantity="two">مسح <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>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="zero">مسح هذه <xliff:g>%d</xliff:g> بطاقة نهائيا؟</item>
<item quantity="one">مسح هذه <xliff:g>%d</xliff:g> بطاقة نهائيا؟</item>
<item quantity="two">مسح هذه <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>
</plurals>
<string name="importOptionFilesystemTitle">الاستيراد من نظام الملفات</string>
<string name="importOptionFilesystemExplanation">اختر ملفًا محددًا من نظام الملفات.</string>
<string name="about_title_fmt">حول <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">نسخة: <xliff:g id="version">%s</xliff:g></string>
<string name="settings_system_theme">نظام</string>
<string name="settings_lock_on_opening_orientation">قفل على الاتجاه عند فتح البطاقة</string>
<string name="app_resources">موارد الطرف الثالث الحرة: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="settings_follow_system_orientation">نظام المتابعة</string>
<string name="groups">مجموعات</string>
<string name="barcode">باركود</string>
<string name="settings_keep_screen_on">حافظ على الشاشة قيد التشغيل</string>
<string name="intent_import_card_from_url_share_text">اريد مشاركة بطاقة معك</string>
<string name="groupsList">مجموعات: <xliff:g>%s</xliff:g></string>
<string name="settings_disable_lockscreen_while_viewing_card">منع قفل الشاشة</string>
<string name="leaveWithoutSaveTitle">خروج</string>
<string name="editGroup">مجموعة التعديل: <xliff:g>%s</xliff:g></string>
<plurals name="groupCardCount">
<item quantity="zero"><xliff:g>%d</xliff:g> بطاقة</item>
<item quantity="one"><xliff:g>%d</xliff:g> بطاقة</item>
<item quantity="two"><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>
</plurals>
<string name="moveDown">تحرك لأسفل</string>
<string name="leaveWithoutSaveConfirmation">المغادرة دون حفظ؟</string>
<string name="addManually">أدخل بطاقة الهوية يدويًا</string>
<string name="moveBarcodeToTopOfScreen">انقل الباركود إلى أعلى الشاشة</string>
<string name="balanceSentence">الرصيد: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">تنتهي: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">منتهي الصلاحية: <xliff:g>%s</xliff:g></string>
<string name="moveBarcodeToCenterOfScreen">قم بتوسيط الرمز الشريطي على الشاشة</string>
<plurals name="balancePoints">
<item quantity="zero"><xliff:g>%s</xliff:g> نقطة</item>
<item quantity="one"><xliff:g>%s</xliff:g> نقطة</item>
<item quantity="two"><xliff:g>%s</xliff:g> نقطة</item>
<item quantity="few"><xliff:g>%s</xliff:g> نقطات</item>
<item quantity="many"><xliff:g>%s</xliff:g> نقطات</item>
<item quantity="other"><xliff:g>%s</xliff:g> نقطات</item>
</plurals>
<string name="card">بطاقة</string>
<string name="selectColor">إختر لون</string>
<string name="editBarcode">تعديل الباركود</string>
<string name="expiryDate">تاريخ انتهاء الصلاحية</string>
<string name="never">أبداً</string>
<string name="chooseExpiryDate">اختر تاريخ انتهاء الصلاحية</string>
<string name="errorReadingImage">لا يمكن قراءة الصورة</string>
<string name="noBarcodeFound">لم يتم العثور على باركود</string>
<string name="on_github">على GitHub</string>
<string name="report_error">الإبلاغ عن خطأ</string>
<string name="sort_by_expiry">انقضاء</string>
<string name="noUnarchivedCardsMessage">لا توجد بطاقات غير مؤرشفة موجودة</string>
<string name="importLoyaltyCardKeychain">الاستيراد من Loyalty Card Keychain</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="importLoyaltyCardKeychainMessage">حدد ملفك <i>LoyaltyCardKeychain.csv</i> التصدير من Loyalty Card Keychain للاستيراد.
\nقم بإنشائه من قائمة الاستيراد / التصدير في Loyalty Card Keychain بالضغط على تصدير هناك أولاً.</string>
<string name="importStocard">الاستيراد من Stocard</string>
<string name="privacy_policy_popup_text">إشعار سياسة الخصوصية (مطلوب من قبل بعض متاجر التطبيقات):
\n
\nلا يتم جمع أي بيانات على الإطلاق ، والتي يمكن لأي شخص تأكيدها لأن تطبيقنا هو برنامج حر.</string>
<string name="failedGeneratingShareURL">تعذر إنشاء عنوان URL قابل للمشاركة. الرجاء الإبلاغ عن هذا.</string>
<string name="help_translate_this_app">ساعد في ترجمة هذا التطبيق</string>
<string name="action_show_details">اظهر التفاصيل</string>
<string name="on_google_play">على Google Play</string>
<string name="settings_theme_color">لون المظهر</string>
</resources>

View File

@@ -10,7 +10,7 @@
<string name="cancel">Отказ</string>
<string name="unstar">Премахва от любими</string>
<string name="star">Добавя към любими</string>
<string name="noBarcode">Без щрихкод</string>
<string name="noBarcode">Липсва щрихкод</string>
<string name="barcodeNoBarcode">Липсва щрихкод</string>
<string name="barcodeType">Вид на щрихкод</string>
<string name="cardId">Идентификатор на карта</string>
@@ -158,7 +158,7 @@
<string name="importLoyaltyCardKeychainMessage">Изберете файла <i>LoyaltyCardKeychain.csv</i>, предварително изнесен от Loyalty Card Keychain.
\nСъздайте такъв файл от меню Внасяне/изнасяне от друго устройство с Loyalty Card Keychain като изберете Изнасяне.</string>
<string name="failedParsingImportUriError">Препратката не може да бъде анализирана за внасяне</string>
<string name="failedGeneratingShareURL">Грешка при създаване на адрес за споделяне. Изпратете доклад за дефект.</string>
<string name="failedGeneratingShareURL">Не може да бъде генериран адрес за споделяне. Изпратете доклад за дефект.</string>
<string name="deleteTitle">Премахване на карта</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Изтриване на <xliff:g>%d</xliff:g> карта</item>
@@ -240,4 +240,11 @@
<string name="unarchived">Карта е извадена от архива</string>
<string name="archiveList">Архив</string>
<string name="noUnarchivedCardsMessage">Няма карти извън архива</string>
<string name="failedLaunchingPhotoPicker">Не е намерено поддържано приложение за галерия.</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> карта (<xliff:g id="archivedCount">%2$d</xliff:g> архивирана)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> карти (<xliff:g id="archivedCount">%2$d</xliff:g> архивирани)</item>
</plurals>
<string name="previousCard">Предишна</string>
<string name="nextCard">Следваща</string>
</resources>

View File

@@ -13,40 +13,40 @@
<string name="ok">Ano</string>
<string name="copy_to_clipboard">Kopírovat ID do schránky</string>
<string name="sendLabel">Odeslat…</string>
<string name="editCardTitle">Editovat věrnostní kartu</string>
<string name="addCardTitle">Přidat věrnostní kartu</string>
<string name="editCardTitle">Editovat kartu</string>
<string name="addCardTitle">Přidat kartu</string>
<string name="scanCardBarcode">Skenování čárového kódu</string>
<string name="noStoreError">Zadáno žádné jméno</string>
<string name="noCardIdError">ID nezadáno</string>
<string name="noStoreError">Nezadáno žádné jméno</string>
<string name="noCardIdError">Nezadáno ID</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Zálohování dat vám umožní přesunout je do jiného zařízení.</string>
<string name="importSuccessfulTitle">Importováno</string>
<string name="importFailedTitle">Import selhal</string>
<string name="importFailed">Nelze provést import</string>
<string name="importFailed">Import nelze provést</string>
<string name="exportSuccessfulTitle">Exportováno</string>
<string name="exportFailedTitle">Export selhal</string>
<string name="exportFailed">Nelze provést export</string>
<string name="exportFailed">Export nelze provést</string>
<string name="importing">Importuji…</string>
<string name="exporting">Exportuji…</string>
<string name="noExternalStoragePermissionError">Udělit oprávnění přístupu k externímu úložišti pro import nebo export dat</string>
<string name="importOptionFilesystemTitle">Import ze souborového systému</string>
<string name="importOptionFilesystemExplanation">Vyberte konkrétní soubor v uložišti.</string>
<string name="importOptionFilesystemExplanation">Vyberte konkrétní soubor v úložišti.</string>
<string name="importOptionFilesystemButton">Ze souborového systému</string>
<string name="importOptionApplicationTitle">Použijte jinou aplikaci</string>
<string name="importOptionApplicationTitle">Použitím jiné aplikace</string>
<string name="importOptionApplicationExplanation">K otevření souboru použijte libovolnou aplikaci nebo svého oblíbeného správce souborů.</string>
<string name="importOptionApplicationButton">Použijte jinou aplikaci</string>
<string name="importOptionApplicationButton">Použít jinou aplikaci</string>
<string name="about">O aplikaci</string>
<string name="app_license">Copyleftovaný svobodný software s licencí GPLv3+</string>
<string name="about_title_fmt">O aplikaci <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verze: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informace o revizi: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Vyberte čárový kód</string>
<string name="copy_to_clipboard_toast">ID zkopírované do schránky</string>
<string name="copy_to_clipboard_toast">ID zkopírováno do schránky</string>
<string name="deleteTitle">Smazat kartu</string>
<string name="deleteConfirmation">Opravdu chcete smazat tuto věrnostní kartu?</string>
<string name="moveBarcodeToCenterOfScreen">Střed čárového kódu na obrazovce</string>
<string name="moveBarcodeToTopOfScreen">Přesuňte čárový kód do horní části obrazovky</string>
<string name="deleteConfirmation">Opravdu chcete smazat tuto kartu\?</string>
<string name="moveBarcodeToCenterOfScreen">Vycentrovat čárový kód na obrazovce</string>
<string name="moveBarcodeToTopOfScreen">Přesunout čárový kód do horní části obrazovky</string>
<string name="chooseExpiryDate">Zvolte datum vypršení platnosti</string>
<string name="never">Nikdy</string>
<string name="expiryDate">Platnost</string>
@@ -58,9 +58,9 @@
\ncopyright © 20162020 Branden Archer</string>
<string name="exportOptionExplanation">Data budou zapsána na místo podle vašeho výběru.</string>
<string name="failedParsingImportUriError">Nelze analyzovat import URI</string>
<string name="noCardExistsError">Kartu nelze najít</string>
<string name="noCardExistsError">Takovou kartu nelze najít</string>
<string name="noCardsMessage">Nejprve přidejte kartu</string>
<string name="cardShortcut">Zástupce Karty</string>
<string name="cardShortcut">Zástupce karty</string>
<string name="share">Podíl</string>
<string name="unstar">Odebrat z oblíbených</string>
<string name="star">Přidat do oblíbených</string>
@@ -70,16 +70,16 @@
<string name="noMatchingGiftCards">Nic nenalezeno. Zkuste změnit vyhledávání.</string>
<string name="action_search">Vyhledávání</string>
<string name="thumbnailDescription">Miniatura</string>
<string name="card_ids_copied">Zkopírované ID</string>
<string name="card_ids_copied">ID zkopírováno</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>
<item quantity="one">Opravdu chcete <xliff:g>%d</xliff:g> kartu trvale odstranit\?</item>
<item quantity="few">Opravdu chcete <xliff:g>%d</xliff:g> karty trvale odstranit\?</item>
<item quantity="other">Opravdu chcete <xliff:g>%d</xliff:g> karet 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>
<item quantity="one">Odstranit <xliff:g>%d</xliff:g> kartu</item>
<item quantity="few">Odstranit <xliff:g>%d</xliff:g> karty</item>
<item quantity="other">Odstranit <xliff:g>%d</xliff:g> karet</item>
</plurals>
<string name="importSuccessful">Data importována</string>
<string name="intent_import_card_from_url_share_text">Chci s Vámi sdílet kartu</string>
@@ -88,7 +88,7 @@
<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_system_theme">Podle systému</string>
<string name="settings_theme">Vzhled</string>
<string name="settings_category_title_ui">Uživatelské rozhraní</string>
<string name="settings">Nastavení</string>
@@ -98,7 +98,7 @@
<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 a níže vyberte typ čárového kódu nebo \"Tato karta nemá čárový kód\".</string>
<string name="enterBarcodeInstructions">Zadejte ID 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>
@@ -109,7 +109,7 @@
<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_system_locale">Podle systému</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>
@@ -126,27 +126,27 @@
<string name="photos">Fotky</string>
<string name="backImageDescription">Obrázek zadní strany</string>
<string name="frontImageDescription">Obrázek přední strany</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 zkopírováno do schránky</string>
<string name="intent_import_card_from_url_share_multiple_text">Chci s vámi sdílet karty</string>
<string name="copy_to_clipboard_multiple_toast">ID zkopírována 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</string>
<string name="importVoucherVaultMessage">Vyberte svůj <i>vouchervault.json</i> export z Voucher Vault, který chcete importovat.
\nVytvořte jej tak, že nejprve stisknete tlačítko Exportovat v aplikaci Voucher Vault.</string>
<string name="importVoucherVaultMessage">Vyberte svůj <i>vouchervault.json</i> exportovaný z Voucher Vault, který chcete importovat.
\nVytvoříte jej 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.
\nZískejte ji zasláním e-mailu na adresu support@stocardapp.com s žádostí o export vašich dat.</string>
<string name="importStocardMessage">Vyberte svůj <i>***-sync.zip</i> exportovaný z aplikace Stocard, který chcete importovat.
\nZískejte ji 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.
\nVytvořte jej z nabídky Import/Export v Loyalty Card Keychain tak, že tam nejprve stisknete tlačítko Exportovat.</string>
<string name="importLoyaltyCardKeychainMessage">Vyberte <i>LoyaltyCardKeychain.csv</i> exportovaný z Loyalty Card Keychain, který chcete importovat.
\nVytvoříte jej 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ě.
\nVytvořte jej 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="importFidmeMessage">Vyberte svůj <i>fidme-export-request-xxxxxx.zip</i> exportovaný z FidMe k importu a poté vyberte typy čárových kódů ručně.
\nVytvoříte jej ze svého profilu FidMe tak, že nejprve zvolíte možnost Ochrana dat a poté stisknete tlačítko Extrahovat 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.
\nVytvořte jej z nabídky Import/Export jiné aplikace Catima tak, že v ní nejprve stisknete tlačítko Exportovat.</string>
<string name="importCatimaMessage">Vyberte <i>catima.zip</i> exportovaný z aplikace Catima, který chcete importovat.
\nVytvoříte jej 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):
@@ -160,7 +160,7 @@
<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="noBarcodeFound">Čárový 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</string>
@@ -200,7 +200,7 @@
<string name="version_history">Historie verzí</string>
<string name="rate_this_app">Ohodnoťte tuto aplikaci</string>
<string name="and_data_usage">a využití dat</string>
<string name="credits">Kredity</string>
<string name="credits">Zásluhy</string>
<string name="on_github">na GitHubu</string>
<string name="source_repository">Úložiště zdrojů</string>
<string name="license">Licence</string>
@@ -209,10 +209,10 @@
<string name="on_google_play">na Google Play</string>
<string name="exportPassword">Nastavení hesla pro ochranu exportu (volitelné)</string>
<string name="exportPasswordHint">Zadejte heslo</string>
<string name="selectColor">Vyberte barvu</string>
<string name="selectColor">Vybrat barvu</string>
<string name="setIcon">Nastavit ikonu</string>
<string name="group_edit">Upravit skupinu</string>
<string name="group_name_already_in_use">Již použitý název skupiny</string>
<string name="group_name_already_in_use">Název skupiny je již použitý</string>
<string name="group_name_is_empty">Název skupiny nemůže být prázdný</string>
<string name="group_updated">Skupina aktualizována</string>
<string name="editGroup">Úprava skupiny: <xliff:g>%s</xliff:g></string>
@@ -245,4 +245,12 @@
<string name="settings_landscape_orientation">Na šířku</string>
<string name="duplicateCard">Duplikovat</string>
<string name="archived">Karta archivována</string>
<string name="failedLaunchingPhotoPicker">Nepodařilo se najít podporovanou aplikaci galerie</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> karta (<xliff:g id="archivedCount">%2$d</xliff:g> archivovaná)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> karty (<xliff:g id="archivedCount">%2$d</xliff:g> archivované)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> karet (<xliff:g id="archivedCount">%2$d</xliff:g> archivovaných)</item>
</plurals>
<string name="previousCard">Předchozí</string>
<string name="nextCard">Následující</string>
</resources>

View File

@@ -240,4 +240,11 @@
<string name="archive">Archivieren</string>
<string name="archived">Karte archiviert</string>
<string name="settings_lock_on_opening_orientation">Kartenausrichtung nach dem Öffnen beibehalten</string>
</resources>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> Karte (<xliff:g id="archivedCount">%2$d</xliff:g> archiviert)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> Karten (<xliff:g id="archivedCount">%2$d</xliff:g> archiviert)</item>
</plurals>
<string name="failedLaunchingPhotoPicker">Es konnte keine unterstützte Galerie-Anwendung gefunden werden</string>
<string name="previousCard">Vorherige</string>
<string name="nextCard">Nächste</string>
</resources>

View File

@@ -1,8 +1,8 @@
<?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">Προσθήκη</string>
<string name="noGiftCards">Δεν έχετε κάρτες προς το παρόν. Πατήστε το κουμπί \"+\" (συν) στο πάνω μέρος για να ξεκινήσετε.\n\nΤο Loyalty Card Keychain σας δίνει τη δυνατότητα να έχετε τις κάρτες σας στο τηλέφωνο σας, έτσι ώστε να τις έχετε πάντα μαζί σας.</string>
<string name="storeName">Κατάστημα</string>
<string name="noGiftCards">Κάντε κλικ στο + κουμπί για να προσθέσετε μία κάρτα ή εισάγετε κάρτες από το ⋮ μενού.</string>
<string name="storeName">Όνομα</string>
<string name="note">Σημείωση</string>
<string name="cardId">Κωδικός Κάρτας</string>
<string name="cancel">Άκυρο</string>
@@ -15,46 +15,46 @@
<string name="sendLabel">Αποστολή…</string>
<string name="editCardTitle">Επεξεργασία Κάρτας</string>
<string name="addCardTitle">Προσθήκη Κάρτας</string>
<string name="scanCardBarcode">Σαρώστε τον κωδικό της κάρτας</string>
<string name="scanCardBarcode">Σαρώστε τον γραμμοκώδικα (bardcode)</string>
<string name="cardShortcut">Συντόμευση Κάρτας</string>
<string name="noCardsMessage">Δεν υπάρχουν κάρτες. προσθέστε μία πρώτα</string>
<string name="noStoreError">Δεν δώσατε κατάστημα</string>
<string name="noCardIdError">Δεν δώσατε κωδικό κάρτας</string>
<string name="noCardExistsError">Δεν ήταν δυνατό να εντοπιστεί κάρτα</string>
<string name="noCardsMessage">Προσθέστε μία κάρτα πρώτα</string>
<string name="noStoreError">Δεν έχει εισαχθεί όνομα</string>
<string name="noCardIdError">Δεν έχει εισαχθεί κωδικός</string>
<string name="noCardExistsError">Δεν ήταν δυνατό να εντοπιστεί η κάρτα</string>
<string name="importExport">Εισαγωγή/Εξαγωγή</string>
<string name="exportName">Εξαγωγή</string>
<string name="importExportHelp">Τα εφεδρικά δεδομένα σας δίνουν την δυνατότητα να μεταφέρετε τις κάρτες σας σε μία άλλη συσκευή.</string>
<string name="importSuccessfulTitle">Εισαγωγή επιτυχής</string>
<string name="importExportHelp">Τα αντίγραφα ασφαλείας, σας επιτρέπουν να τα εισάγετε σε άλλη συσκευή.</string>
<string name="importSuccessfulTitle">Εισήχθησαν</string>
<string name="importFailedTitle">Εισαγωγή ανεπιτυχής</string>
<string name="importFailed">Δεν εισήχθει</string>
<string name="importFailed">Δεν ήταν δυνατή η εισαγωγή</string>
<string name="exportSuccessfulTitle">Εξαγωγή επιτυχής</string>
<string name="exportFailedTitle">Εξαγωγή ανεπιτυχής</string>
<string name="exportFailed">Δεν εξήχθη</string>
<string name="exportFailed">Δεν ήταν δυνατή η εξαγωγή</string>
<string name="importing">Γίνεται εισαγωγή του…</string>
<string name="exporting">Γίνεται εξαγωγή του…</string>
<string name="noExternalStoragePermissionError">Δεν είναι δυνατή η εισαγωγή ή εξαγωγή καρτών χωρίς την άδεια πρόσβασης στον εξωτερικό χώρο αποθήκευσης</string>
<string name="noExternalStoragePermissionError">Εγκρίνετε την άδεια εξωτερικής αποθήκευσης για να εισάγετε ή εξάγετε δεδομένα</string>
<string name="importOptionFilesystemTitle">Εισαγωγή από το σύστημα αρχείων</string>
<string name="importOptionFilesystemExplanation">Επιλέξτε ένα συγκεκριμένο αρχείο από το σύστημα αρχείων.</string>
<string name="importOptionFilesystemButton">Από το σύστημα αρχείων</string>
<string name="importOptionApplicationTitle">Χρήση εξωτερικής εφαρμογής</string>
<string name="importOptionApplicationExplanation">Κάντε χρήση μίας εξωτερικής εφαρμογής όπως είναι τα Dropbox, Google Drive ή ο αγαπημένος σας διαχειριστής αρχείων για να ανοίξετε ένα αρχείο.</string>
<string name="importOptionApplicationButton">Χρήση εξωτερικής εφαρμογής</string>
<string name="importOptionApplicationTitle">Χρήση άλλης εφαρμογής</string>
<string name="importOptionApplicationExplanation">Χρησιμοποιήστε οποιαδήποτε εφαρμογή ή τον αγαπημένο περιηγητή αρχείων σας, για να ανοίξετε ένα αρχείο.</string>
<string name="importOptionApplicationButton">Χρήσης άλλης εφαρμογής</string>
<string name="about">Σχετικά</string>
<string name="app_license">Άδεια χρήσης υπό το GPLv3.</string>
<string name="app_license">Άδεια χρήσης υπό GPLv3+</string>
<string name="about_title_fmt">Σχετικά με <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Έκδοση: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Πληροφορίες Αναθεώρησης: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Επιλέξτε Barcode</string>
<string name="copy_to_clipboard_toast">Ο κωδικός της κάρτας αντιγράφτηκε στο πρόχειρο</string>
<string name="thumbnailDescription">Μικρογραφία κάρτας</string>
<string name="copy_to_clipboard_toast">Ο κωδικός αντιγράφτηκε στο πρόχειρο</string>
<string name="thumbnailDescription">Μικρογραφία</string>
<string name="settings">Ρυθμίσεις</string>
<string name="settings_category_title_ui">Διεπαφή χρήστη</string>
<string name="settings_dark_theme">Σκοτεινό</string>
<string name="settings_light_theme">Φωτεινό</string>
<string name="settings_system_theme">Σύστημα</string>
<string name="barcode">Γραμμικός κώδικας</string>
<string name="deleteTitle">Αφαίρεση Κάρτας</string>
<string name="deleteConfirmation">Παρακαλώ επιβεβαιώστε ότι θέλετε να διαγράψετε αυτή την κάρτα.</string>
<string name="deleteTitle">Διαγραφή Κάρτας</string>
<string name="deleteConfirmation">Μόνιμη διαγραφή της κάρτας;</string>
<string name="action_search">Αναζήτηση</string>
<string name="noMatchingGiftCards">Κανένα αποτέλεσμα. Δοκίμασε με διαφορετικές λέξεις.</string>
<plurals name="selectedCardCount">
@@ -62,4 +62,187 @@
<item quantity="other"><xliff:g>%d</xliff:g> επιλέγχθηκαν</item>
</plurals>
<string name="noGiftCardsGroup">Δημιούργησε κάρτες και βάλτες σε αυτή την ομάδα.</string>
<string name="barcodeNoBarcode">Δεν υπάρχει barcode</string>
<string name="addManually">Χειροκίνητη εισαγωγή κωδικού</string>
<string name="never">Ποτέ</string>
<string name="share">Κοινοποίηση</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> πόντος</item>
<item quantity="other"><xliff:g>%s</xliff:g> πόντοι</item>
</plurals>
<string name="exportOptionExplanation">Τα δεδομένα θα μεταφερθούν σε τοποθεσία της επιλογής σας.</string>
<string name="settings_theme">Θέμα</string>
<string name="groupsList">Ομάδες: <xliff:g>%s</xliff:g></string>
<string name="barcodeId">Τιμή γραμμοκώδικα</string>
<string name="sort">Ταξινόμηση</string>
<string name="deleteConfirmationGroup">Διαγραφή ομάδας;</string>
<string name="moveDown">Προχώρα κάτω</string>
<string name="accept">Αποδοχή</string>
<string name="yes">Ναι</string>
<string name="no">Όχι</string>
<string name="addFromImage">Επιλογή εικόνας από την συλλογή</string>
<string name="expiryStateSentence">Λήγει: <xliff:g>%s</xliff:g></string>
<string name="expiryDate">Ημερομηνία λήξης</string>
<string name="settings_keep_screen_on">Κράτα την οθόνη ανοιχτή</string>
<string name="leaveWithoutSaveTitle">Έξοδος</string>
<string name="swipeToSwitchImages">Σύρετε ή πατήστε παρατεταμένα για να αλλάξετε εικόνες</string>
<string name="sort_by_balance">Υπόλοιπο</string>
<string name="reverse">... σε αντίθετη σειρά</string>
<string name="version_history">Ιστορικό έκδοσης</string>
<string name="sort_by">Ταξινόμηση κατά</string>
<string name="credits">Πιστώσεις</string>
<string name="help_translate_this_app">Βοηθήστε να μεταφραστεί η εφαρμογή</string>
<string name="source_repository">Αποθήκη κώδικα</string>
<string name="on_github">στο GitHub</string>
<string name="on_google_play">στο Google Play</string>
<string name="report_error">Αναφορά Σφάλματος</string>
<string name="starred">Αγαπημένα</string>
<string name="translate_platform">στο Weblate</string>
<string name="set_scale">Ορίστε κλίμακα</string>
<string name="importLoyaltyCardKeychain">Εισαγωγή από Loyalty Card Keychain</string>
<string name="importLoyaltyCardKeychainMessage">Επιλέξτε την <i>LoyaltyCardKeychain.csv</i> εξαγωγή από το Loyalty Card Keychain για εισαγωγή.
\nΔημιουργήστε το από το μενού Εισαγωγής/Εξαγωγής στο Loyalty Card Keychain επιλέγοντας Εξαγωγή.</string>
<string name="importFidme">Εισαγωγή από FidMe</string>
<string name="importFidmeMessage">Επιλέξτε την <i>fidme-export-request-xxxxxx.zip</i> εξαγωγή από το FidMe για εισαγωγή και επιλέξτε χειροκίνητα τους τύπους γραμμοκώδικα μετέπειτα.
\nΔημιουργήστε το από το FidMe προφίλ επιλέγοντας Προστασία Δεδομένων και διαλέγοντας εξαγωγή δεδομένων.</string>
<string name="setBarcodeId">Επιλέξτε τιμή γραμμοκώδικα</string>
<string name="wrongValueForBarcodeType">Η τιμή δεν είναι έγκυρη για αυτού του τύπου γραμμοκώδικα</string>
<string name="copy_to_clipboard_multiple_toast">Οι κωδικοί αντιγράφηκαν στο πρόχειρο</string>
<string name="setBackImage">Επιλογή οπίσθιας εικόνας</string>
<string name="removeImage">Αφαίρεση εικόνας</string>
<string name="takePhoto">Τραβήξτε μια φωτογραφία</string>
<string name="updateBarcodeQuestionText">Αλλάξατε τον κωδικό. Θέλετε να ενημερώσετε και τον γραμμοκώδικα στην ίδια τιμή;</string>
<string name="action_show_details">Εμφάνιση λεπτομερειών</string>
<string name="options">Επιλογές</string>
<string name="hideMoreInfo">Απόκρυψη πληροφοριών</string>
<string name="noGroupCards">Αυτή η ομάδα είναι άδεια</string>
<string name="settings_display_barcode_max_brightness">Επιπλέον φωτισμός γραμμοκώδικα</string>
<string name="group_name_is_empty">Το όνομα ομάδας δεν γίνεται να είναι κενό</string>
<string name="group_edit">Επεξεργασία ομάδας</string>
<string name="star">Προσθήκη στα αγαπημένα</string>
<string name="unstar">Αφαίρεση από τα αγαπημένα</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Διαγραφή <xliff:g>%d</xliff:g> κάρτας</item>
<item quantity="other">Διαγραφή <xliff:g>%d</xliff:g> καρτών</item>
</plurals>
<string name="card_ids_copied">Αντιγραμμένη/ες ταυτότητα/ες</string>
<string name="errorReadingImage">Δεν ήταν δυνατό να διαβαστεί η εικόνα</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> δεν φαίνεται να είναι έγκυρο το υπόλοιπο.</string>
<string name="currency">Νόμισμα</string>
<string name="privacy_policy">Πολιτική απορρήτου</string>
<string name="chooseImportType">Εισαγωγή δεδομένων από</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="privacy_policy_popup_text">Σημείωμα πολιτικής απορρήτου ( υποχρεωτικό σε κάποια \"μαγαζιά\" εφαρμογών)
\n
\nΜΗΔΕΝΙΚΆ ΔΕΔΟΜΈΝΑ ΣΥΛΛΈΓΟΝΤΑΙ, ο οποιοσδήποτε μπορεί να το επιβεβαιώσει μιας και η εφαρμογή είναι ελεύθερο λογισμικό.</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> κάρτα ( <xliff:g id="archivedCount">%2$d</xliff:g> αρχειοθετήθηκε)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> κάρτες ( <xliff:g id="archivedCount">%2$d</xliff:g> αρχειοθετήθηκαν)</item>
</plurals>
<string name="importCatimaMessage">Επιλέξτε την <i>catima.zip</i> εξαγωγή από το Catima για εισαγωγή
\nΔημιουργήστε το από το μενού Εισαγωγής/Εξαγωγής μιας άλλης εφαρμογής Catima κάνοντας εξαγωγή εκεί πρώτα.</string>
<string name="importStocardMessage">Επιλέξτε την <i>***-sync.zip</i> εξαγωγή από το Stocard για εισαγωγή.
\nΠάρτε το στέλνοντας email στο: support@stocardapp.com ζητώντας μια εξαγωγή αρχείων των δεδομένων σας.</string>
<string name="intent_import_card_from_url_share_multiple_text">Θέλω να μοιραστώ μερικές κάρτες μαζί σου</string>
<string name="editGroup">Επεξεργασία Ομάδας: <xliff:g>%s</xliff:g></string>
<string name="setFrontImage">Επιλογή μπροστινής εικόνας</string>
<string name="importVoucherVaultMessage">Επιλέξτε την <i>vouchervault.json</i> εξαγωγή από το Voucher Vault για εισαγωγή.
\nΔημιουργήστε το επιλέγοντας Εξαγωγή στο Voucher Vault.</string>
<string name="unsupportedBarcodeType">Ο τύπος γραμμοκώδικα δεν γίνεται να εμφανιστεί ακόμα. Μπορεί να υποστηρίζεται σε μια μελλοντική έκδοση της εφαρμογής.</string>
<string name="frontImageDescription">Μπροστινή εικόνα</string>
<string name="photos">Φωτογραφίες</string>
<string name="backImageDescription">Οπίσθια εικόνα</string>
<string name="updateBarcodeQuestionTitle">Ενημέρωση τιμής γραμμοκώδικα;</string>
<string name="passwordRequired">Παρακαλώ εισάγετε τον κωδικό</string>
<string name="sort_by_most_recently_used">Χρησιμοποιήθηκαν πρόσφατα</string>
<string name="shortcutSelectCard">Επιλέξτε μία κάρτα</string>
<string name="barcodeImageDescriptionWithType">Εικόνα <xliff:g>%s</xliff:g> γραμμοκώδικα</string>
<string name="app_libraries">Ελεύθερες βιβλιοθήκες τρίτων: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="license">Άδεια</string>
<string name="include_if_asking_support">Αν θέλετε να ζητήσετε υποστήριξη, συμπεριλάβετε τις ακόλουθες πληροφορίες:</string>
<string name="action_hide_details">Απόκρυψη λεπτομερειών</string>
<string name="importSuccessful">Δεδομένα εισήχθησαν</string>
<string name="moveUp">Προχώρα πάνω</string>
<string name="barcodeType">Τύπος γραμμοκώδικα</string>
<string name="app_resources">Ελεύθερες πηγές τρίτων: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectColor">Επιλογή χρώματος</string>
<string name="setIcon">Ορισμός εικονιδίου</string>
<string name="settings_sky_blue_theme">Γαλάζιο</string>
<string name="settings_green_theme">Πράσινο</string>
<string name="settings_grey_theme">Γκρι</string>
<string name="settings_brown_theme">Καφέ</string>
<string name="sort_by_expiry">Λήξη</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> κάρτα</item>
<item quantity="other"><xliff:g>%d</xliff:g> κάρτες</item>
</plurals>
<string name="points">Πόντοι</string>
<string name="exportSuccessful">Δεδομένα εξήχθησαν</string>
<string name="settings_disable_lockscreen_while_viewing_card">Αποτροπή κλειδώματος οθόνης</string>
<string name="failedLaunchingPhotoPicker">Δεν βρέθηκε υποστηριζόμενη εφαρμογή συλλογής</string>
<string name="noBarcode">Χωρίς barcode</string>
<string name="starImage">Αγαπημένο αστέρι</string>
<string name="balanceSentence">Υπόλοιπο: <xliff:g>%s</xliff:g></string>
<string name="failedParsingImportUriError">Δεν ήταν δυνατή η ανάλυση του εισαγόμενου URL</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Διαγραφή της κάρτας <xliff:g>%d</xliff:g> μόνιμα;</item>
<item quantity="other">Διαγραφή των καρτρών <xliff:g>%d</xliff:g> μόνιμα;</item>
</plurals>
<string name="app_copyright_old">Βασισμένο στο Loyalty Card Keychain
\nπνευματικά δικαιώματα © 2016-2020 Branden Archer</string>
<string name="enterBarcodeInstructions">Εισάγετε τον κωδικό και διαλέξτε έναν είδος γραμμοκώδικα από κάτω ή \"Δεν υπάρχει γραμμοκώδικας\".</string>
<string name="settings_follow_system_orientation">Ακολούθηση συστήματος</string>
<string name="settings_card_orientation">Προσανατολισμός γραμμοκώδικα</string>
<string name="settings_portrait_orientation">Πορτραίτο</string>
<string name="settings_landscape_orientation">Οριζόντια</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Πνευματικά δικαιώματα © 2019-<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="settings_lock_on_opening_orientation">Κλείδωμα τωρινού προσανατολισμού όταν ανοίγει μία κάρτα</string>
<string name="settings_max_font_size_scale">Μέγιστο μέγεθος γραμματοσειράς</string>
<string name="intent_import_card_from_url_share_text">Θέλω να μοιραστώ μία κάρτα μαζί σου</string>
<string name="enter_group_name">Εισάγετε όνομα ομάδας</string>
<string name="groups">Ομάδες</string>
<string name="noGroups">Κάντε κλικ στο + κουμπί ώστε να προσθέσετε ομάδες για κατηγοριοποίηση.</string>
<string name="group_name_already_in_use">Αυτό το όνομα υπάρχει ήδη</string>
<string name="group_updated">Η ομάδα ενημερώθηκε</string>
<string name="all">Όλες</string>
<string name="failedOpeningFileManager">Εγκαταστήστε έναν διαχειριστή αρχείων πρώτα.</string>
<string name="leaveWithoutSaveConfirmation">Έξοδος χωρίς αποθήκευση;</string>
<string name="expiryStateSentenceExpired">Έληξε: <xliff:g>%s</xliff:g></string>
<string name="card">Κάρτα</string>
<string name="editBarcode">Επεξεργασία γραμμοκώδικα</string>
<string name="chooseExpiryDate">Επιλέξτε ημερομηνία λήξης</string>
<string name="moveBarcodeToTopOfScreen">Μετακίνηση του γραμμοκώδικα στο πάνω μέρος της οθόνης</string>
<string name="moveBarcodeToCenterOfScreen">Κεντράρισμα του γραμμοκώδικα στην οθόνη</string>
<string name="noBarcodeFound">Δεν βρέθηκε γραμμοκώδικας</string>
<string name="balance">Υπόλοιπο</string>
<string name="importCatima">Εισαγωγή από Catima</string>
<string name="importStocard">Εισαγωγή από Stocard</string>
<string name="importVoucherVault">Εισαγωγή από Voucher Vault</string>
<string name="sameAsCardId">Ίδιος κωδικός</string>
<string name="exportPassword">Προσθέστε έναν κωδικό για προστασία της εξαγωγής (προαιρετικά)</string>
<string name="exportPasswordHint">Εισαγωγή κωδικού</string>
<string name="failedGeneratingShareURL">Δεν ήταν δυνατή η δημιουργία κοινοποιούμενου URL. Παρακαλώ αναφέρετε το.</string>
<string name="turn_flashlight_on">Ενεργοποίηση φακού</string>
<string name="turn_flashlight_off">Απενεργοποίηση φακού</string>
<string name="settings_locale">Γλώσσα</string>
<string name="settings_oled_dark">Απόλυτο μαύρο φόντο για το μαύρο θέμα</string>
<string name="settings_system_locale">Σύστημα</string>
<string name="settings_theme_color">Χρώμα θέματος</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_pink_theme">Ροζ</string>
<string name="settings_magenta_theme">Φούξια</string>
<string name="settings_violet_theme">Βιολετί</string>
<string name="settings_blue_theme">Μπλε</string>
<string name="app_contributors">Δημιουργήθηκε από: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="showMoreInfo">Εμφάνιση πληροφοριών</string>
<string name="sort_by_name">Όνομα</string>
<string name="and_data_usage">και δεδομένα χρήσης</string>
<string name="rate_this_app">Βαθμολογήστε την εφαρμογή</string>
<string name="duplicateCard">Αντίγραφο</string>
<string name="archive">Αρχειοθετήστε</string>
<string name="archived">Η κάρτα αρχειοθετήθηκε</string>
<string name="unarchived">Η κάρτα αφαιρέθηκε από το αρχείο</string>
<string name="unarchive">Αφαίρεση από το αρχείο</string>
<string name="archiveList">Αρχείο</string>
<string name="noUnarchivedCardsMessage">Δεν υπάρχουν αρχειοθετημένες κάρτες</string>
</resources>

View File

@@ -228,4 +228,19 @@
<string name="rate_this_app">Arvostele tämä sovellus</string>
<string name="noGiftCardsGroup">Lisää kortteja ja lisää ne ryhmään täällä.</string>
<string name="barcodeImageDescriptionWithType">Image <xliff:g>%s</xliff:g> viivakoodi</string>
<string name="settings_follow_system_orientation">Seuraa järjestelmää</string>
<string name="settings_portrait_orientation">Muotokuva</string>
<string name="settings_landscape_orientation">Maisema</string>
<string name="unarchived">Kortti on poistettu arkistosta</string>
<string name="noUnarchivedCardsMessage">Arkistoimattomia kortteja ei ole olemassa</string>
<string name="unarchive">Poista arkistosta</string>
<string name="archived">Kortti arkistoitu</string>
<string name="failedLaunchingPhotoPicker">Tuettua galleriasovellusta ei löytynyt</string>
<string name="settings_card_orientation">Viivakoodin suuntaus</string>
<string name="archiveList">Arkisto</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kortti (<xliff:g id="archivedCount">%2$d</xliff:g> arkistoitu)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> korttia (<xliff:g id="archivedCount">%2$d</xliff:g> arkistoitu)</item>
</plurals>
<string name="duplicateCard">Duplikaatti</string>
</resources>

View File

@@ -240,4 +240,11 @@
<string name="unarchived">Carte désarchivée</string>
<string name="archiveList">Archives</string>
<string name="noUnarchivedCardsMessage">Il n\'existe aucune carte non archivée</string>
</resources>
<string name="failedLaunchingPhotoPicker">Impossible de trouver une application de galerie prise en charge</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> carte (<xliff:g id="archivedCount">%2$d</xliff:g> archivée)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> cartes (<xliff:g id="archivedCount">%2$d</xliff:g> archivées)</item>
</plurals>
<string name="nextCard">Suivant</string>
<string name="previousCard">Précédent</string>
</resources>

View File

@@ -39,7 +39,6 @@
<string name="cardShortcut">קיצור דרך</string>
<string name="noCardsMessage">תחילה הוסף כרטיס</string>
<string name="card_ids_copied">מזהי כרטיס הועתקו</string>
<string name="barcodeImageDescriptionWithType"></string>
<string name="noStoreError">לא הוכנס שם חנות</string>
<string name="noCardExistsError">כרטיס לא נמצא</string>
<string name="importExport">ייבוא/ייצוא</string>

View File

@@ -237,7 +237,14 @@
<string name="noUnarchivedCardsMessage">Non esistono schede non archiviate</string>
<string name="unarchived">Carta non archiviata</string>
<string name="archived">Carta archiviata</string>
<string name="settings_portrait_orientation">Ritratto</string>
<string name="settings_landscape_orientation">Paesaggio</string>
<string name="settings_lock_on_opening_orientation">Blocco da utilizzare per l\'apertura della carta</string>
<string name="settings_portrait_orientation">Verticale</string>
<string name="settings_landscape_orientation">Orizzontale</string>
<string name="settings_lock_on_opening_orientation">Blocca sull\'orientamento utilizzato all\'apertura della carta</string>
<string name="failedLaunchingPhotoPicker">Impossibile trovare un\'app galleria supportata</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> scheda (<xliff:g id="archivedCount">%2$d</xliff:g> archiviata)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> schede (<xliff:g id="archivedCount">%2$d</xliff:g> archiviate)</item>
</plurals>
<string name="previousCard">Precedente</string>
<string name="nextCard">Successivo</string>
</resources>

View File

@@ -240,4 +240,11 @@
<string name="archiveList">Arkiv</string>
<string name="settings_follow_system_orientation">Følg systemet</string>
<string name="settings_portrait_orientation">Stående</string>
<string name="failedLaunchingPhotoPicker">Fant ikke noe støttet galleriprogram</string>
<string name="previousCard">Forrige</string>
<string name="nextCard">Neste</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kort (<xliff:g id="archivedCount">%2$d</xliff:g> arkivert)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kort (<xliff:g id="archivedCount">%2$d</xliff:g> arkivert)</item>
</plurals>
</resources>

View File

@@ -240,4 +240,11 @@
<string name="archiveList">Archief</string>
<string name="settings_landscape_orientation">Horizontaal</string>
<string name="noUnarchivedCardsMessage">Er zijn geen gedearchiveerde kaarten</string>
<string name="failedLaunchingPhotoPicker">Er is geen ondersteunde galerij-app aangetroffen</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kaart (<xliff:g id="archivedCount">%2$d</xliff:g> gearchiveerd)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kaarten (<xliff:g id="archivedCount">%2$d</xliff:g> gearchiveerd)</item>
</plurals>
<string name="previousCard">Vorige</string>
<string name="nextCard">Volgende</string>
</resources>

View File

@@ -250,4 +250,7 @@
<string name="unarchived">Karta odarchiwizowana</string>
<string name="archiveList">Archiwum</string>
<string name="noUnarchivedCardsMessage">Nie istnieją żadne niezarchiwizowane karty</string>
</resources>
<string name="failedLaunchingPhotoPicker">Nie można odnaleźć aplikacji galerii</string>
<string name="previousCard">Poprzedni</string>
<string name="nextCard">Następny</string>
</resources>

View File

@@ -240,4 +240,9 @@
<string name="unarchived">Cartão desarquivado</string>
<string name="archiveList">Arquivar</string>
<string name="noUnarchivedCardsMessage">Não existem cartões desarquivados</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> cartão (<xliff:g id="archivedCount">%2$d</xliff:g> arquivado)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> cartões (<xliff:g id="archivedCount">%2$d</xliff:g> arquivados)</item>
</plurals>
<string name="failedLaunchingPhotoPicker">Não foi encontrada nenhuma aplicação de galeria de imagens</string>
</resources>

View File

@@ -12,7 +12,7 @@
<string name="cancel">Отмена</string>
<string name="save">Сохранить</string>
<string name="edit">Изменить</string>
<string name="delete">Удалить карту</string>
<string name="delete">Удалить</string>
<string name="confirm">Подтвердить</string>
<string name="ok">ОК</string>
<string name="copy_to_clipboard">Копировать номер карты</string>
@@ -250,4 +250,13 @@
<string name="settings_card_orientation">Ориентация штрих-кода</string>
<string name="archived">Карта архивирована</string>
<string name="unarchived">Карта разархивирована</string>
<string name="failedLaunchingPhotoPicker">Не найдено поддерживаемое приложение галереи</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> карта (<xliff:g id="archivedCount">%2$d</xliff:g> архивирована)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> карты (<xliff:g id="archivedCount">%2$d</xliff:g> архивированы)</item>
<item quantity="many"><xliff:g>%1$d</xliff:g> карт (<xliff:g id="archivedCount">%2$d</xliff:g> архивировано)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> карт (<xliff:g id="archivedCount">%2$d</xliff:g> архивировано)</item>
</plurals>
<string name="nextCard">Следующая</string>
<string name="previousCard">Предыдущая</string>
</resources>

View File

@@ -240,4 +240,11 @@
<string name="settings_lock_on_opening_orientation">Kartı açarken kullanılan yönü kilitle</string>
<string name="unarchived">Kart arşivden çıkarıldı</string>
<string name="archive">Arşivle</string>
<string name="failedLaunchingPhotoPicker">Desteklenen bir galeri uygulaması bulunamadı</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kart (<xliff:g id="archivedCount">%2$d</xliff:g> tane arşivlendi)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kart (<xliff:g id="archivedCount">%2$d</xliff:g> tane arşivlendi)</item>
</plurals>
<string name="previousCard">Önceki</string>
<string name="nextCard">Sonraki</string>
</resources>

View File

@@ -148,11 +148,11 @@
<string name="turn_flashlight_on">Увімкнути спалах</string>
<string name="failedGeneratingShareURL">Збій створення URL обміну. Будь ласка повідомте про цю помилку.</string>
<string name="passwordRequired">Будь ласка введіть пароль</string>
<string name="takePhoto">Зробити фото</string>
<string name="takePhoto">Зробити світлину</string>
<string name="removeImage">Видалити зображення</string>
<string name="setBackImage">Встановити зображення тильної сторони</string>
<string name="setFrontImage">Встановити зображення лицьової сторони</string>
<string name="photos">Фото</string>
<string name="photos">Світлини</string>
<string name="backImageDescription">Тильна сторона</string>
<string name="frontImageDescription">Лицьова сторона</string>
<string name="importStocardMessage">Виберіть експорт <i> ***-sync.zip </i> зі Stocard для імпорту.
@@ -238,4 +238,23 @@
<item quantity="other"><xliff:g>%s</xliff:g> балів</item>
</plurals>
<string name="include_if_asking_support">Якщо ви хочете отримати техпідтримку, додайте цю інформацію:</string>
<string name="unarchive">Розархівувати</string>
<string name="settings_card_orientation">Орієнтація штрих-коду</string>
<string name="settings_follow_system_orientation">Як у системі</string>
<string name="duplicateCard">Дублювати</string>
<string name="archive">Архівувати</string>
<string name="settings_portrait_orientation">Поличчя</string>
<string name="settings_landscape_orientation">Краєвид</string>
<string name="settings_lock_on_opening_orientation">Блокування орієнтації при відкритті картки</string>
<string name="archived">Картка архівована</string>
<string name="unarchived">Картка розархівована</string>
<string name="archiveList">Архів</string>
<string name="noUnarchivedCardsMessage">Немає не архівованих карток</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> карту (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> карти (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
<item quantity="many"><xliff:g>%1$d</xliff:g> карт (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> карт (<xliff:g id="archivedCount">%2$d</xliff:g> заархівовано)</item>
</plurals>
<string name="failedLaunchingPhotoPicker">Підтримувану програму галереї не знайдено</string>
</resources>

View File

@@ -215,4 +215,30 @@
<string name="exportPassword">设置密码来保护导出的内容(可选)</string>
<string name="settings_magenta_theme">紫红</string>
<string name="settings_violet_theme">紫色</string>
<string name="action_show_details">显示详情</string>
<string name="action_hide_details">隐藏详情</string>
<string name="set_scale">设置大小</string>
<string name="app_contributors">因他们而存在: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="and_data_usage">和数据使用方法</string>
<string name="failedLaunchingPhotoPicker">找不到支持的图库应用</string>
<string name="previousCard">前一张</string>
<string name="nextCard">下一张</string>
<string name="settings_card_orientation">条形码朝向</string>
<string name="settings_landscape_orientation">横向</string>
<string name="settings_follow_system_orientation">跟随系统</string>
<string name="settings_lock_on_opening_orientation">使用上次打开卡片时的朝向</string>
<string name="settings_portrait_orientation">竖向</string>
<plurals name="groupCardCountWithArchived">
<item quantity="other"><xliff:g>%1$d</xliff:g> 张卡 (<xliff:g id="archivedCount">%2$d</xliff:g> 张已归档)</item>
</plurals>
<string name="license">许可证</string>
<string name="credits">鸣谢</string>
<string name="starred">已收藏</string>
<string name="duplicateCard">创建副本</string>
<string name="archive">归档</string>
<string name="unarchive">移出归档</string>
<string name="archived">卡片已归档</string>
<string name="unarchived">卡片未归档</string>
<string name="archiveList">已归档卡</string>
<string name="noUnarchivedCardsMessage">没有未归档卡</string>
</resources>

View File

@@ -51,6 +51,7 @@
<color name="md_theme_dark_inverseOnSurface">#201A1A</color>
<color name="md_theme_dark_inverseSurface">#ECDFDE</color>
<color name="md_theme_dark_primaryInverse">#A83536</color>
<color name="md_theme_dark_onSelected">#80201A1A</color>
<color name="seed">#B53F3F</color>
<color name="error">#BA1B1B</color>
</resources>

View File

@@ -28,6 +28,7 @@
<dimen name="cardThumbnailSize">46dp</dimen>
<dimen name="cardThumbnailSizeLarge">200dp</dimen>
<dimen name="cardThumbnailEditOverlaySize">21dp</dimen>
<dimen name="activity_margin_small">8dp</dimen>
<dimen name="activity_margin">16dp</dimen>

View File

@@ -60,6 +60,7 @@
<string-array name="locale_values">
<item />
<item>ar</item>
<item>bg</item>
<item>bn-rIN</item>
<item>bs</item>

View File

@@ -285,4 +285,11 @@
<string name="archiveList">Archive</string>
<string name="overflowMenu" translatable="false">Overflow menu</string>
<string name="noUnarchivedCardsMessage">No unarchived cards exist</string>
</resources>
<string name="failedLaunchingPhotoPicker">Could not find a supported gallery app</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> archived)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> cards (<xliff:g id="archivedCount">%2$d</xliff:g> archived)</item>
</plurals>
<string name="previousCard">Previous</string>
<string name="nextCard">Next</string>
</resources>

View File

@@ -39,7 +39,6 @@ import java.text.ParseException;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Currency;
import java.util.Date;
import java.util.HashMap;

View File

@@ -1,13 +1,11 @@
package protect.card_locker;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.zxing.BarcodeFormat;
@@ -26,10 +24,7 @@ import java.util.Currency;
import java.util.Date;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.preference.PreferenceManager;
import protect.card_locker.preferences.Settings;
import static org.junit.Assert.assertEquals;

View File

@@ -18,7 +18,6 @@ import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
@@ -28,6 +27,7 @@ import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import com.google.android.material.bottomappbar.BottomAppBar;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.textfield.MaterialAutoCompleteTextView;
@@ -382,7 +382,7 @@ public class LoyaltyCardViewActivityTest {
Currency currency = Currency.getInstance("EUR");
Date expiryDate = new Date();
Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle);
Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.save_24dp);
Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_done);
storeField.setText("correct store");
noteField.setText("correct note");
@@ -1195,9 +1195,8 @@ public class LoyaltyCardViewActivityTest {
assertEquals(false, activity.isFinishing());
ImageView mainImage = activity.findViewById(R.id.mainImage);
View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout);
View bottomSheet = activity.findViewById(R.id.bottom_sheet);
BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar);
ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton);
ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton);
LinearLayout dotIndicator = activity.findViewById(R.id.dotIndicator);
@@ -1211,7 +1210,7 @@ public class LoyaltyCardViewActivityTest {
// Elements should be visible (except minimize button and scaler)
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomSheet.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, maximizeButton.getVisibility());
assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility());
@@ -1229,7 +1228,7 @@ public class LoyaltyCardViewActivityTest {
// Elements should not be visible (except minimize button and scaler)
assertEquals(View.GONE, collapsingToolbarLayout.getVisibility());
assertEquals(View.GONE, bottomSheet.getVisibility());
assertEquals(View.GONE, bottomAppBar.getVisibility());
assertEquals(View.GONE, maximizeButton.getVisibility());
assertEquals(View.VISIBLE, minimizeButton.getVisibility());
assertEquals(View.GONE, editButton.getVisibility());
@@ -1243,7 +1242,7 @@ public class LoyaltyCardViewActivityTest {
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions);
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions);
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomSheet.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, maximizeButton.getVisibility());
assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility());
@@ -1257,7 +1256,7 @@ public class LoyaltyCardViewActivityTest {
assertEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions);
assertEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions);
assertEquals(View.GONE, collapsingToolbarLayout.getVisibility());
assertEquals(View.GONE, bottomSheet.getVisibility());
assertEquals(View.GONE, bottomAppBar.getVisibility());
assertEquals(View.GONE, maximizeButton.getVisibility());
assertEquals(View.VISIBLE, minimizeButton.getVisibility());
assertEquals(View.GONE, editButton.getVisibility());
@@ -1271,7 +1270,7 @@ public class LoyaltyCardViewActivityTest {
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions);
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions);
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomSheet.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, maximizeButton.getVisibility());
assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility());
@@ -1300,9 +1299,8 @@ public class LoyaltyCardViewActivityTest {
assertEquals(false, activity.isFinishing());
ImageView barcodeImage = activity.findViewById(R.id.barcode);
View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout);
View bottomSheet = activity.findViewById(R.id.bottom_sheet);
BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar);
ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton);
ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton);
FloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
@@ -1315,7 +1313,7 @@ public class LoyaltyCardViewActivityTest {
// Elements should be visible (except minimize/maximize buttons and barcode and scaler)
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomSheet.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.GONE, maximizeButton.getVisibility());
assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility());

View File

@@ -1,98 +0,0 @@
package protect.card_locker;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.math.BigDecimal;
import java.util.Currency;
import static org.junit.Assert.assertEquals;
@RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class UtilsTest {
@Test
public void parseBalances() {
assertEquals("1", Utils.parseCurrency("1", false).toPlainString());
assertEquals("1", Utils.parseCurrency("1", true).toPlainString());
assertEquals("1.00", Utils.parseCurrency("1.00", true).toPlainString());
assertEquals("1.00", Utils.parseCurrency("1,00", true).toPlainString());
assertEquals("1.00", Utils.parseCurrency("1 00", true).toPlainString());
assertEquals("25", Utils.parseCurrency("2.5", false).toPlainString());
assertEquals("25", Utils.parseCurrency("2,5", false).toPlainString());
assertEquals("25", Utils.parseCurrency("2 5", false).toPlainString());
assertEquals("205", Utils.parseCurrency("2.05", false).toPlainString());
assertEquals("205", Utils.parseCurrency("2,05", false).toPlainString());
assertEquals("205", Utils.parseCurrency("2 05", false).toPlainString());
assertEquals("2.5", Utils.parseCurrency("2.5", true).toPlainString());
assertEquals("2.5", Utils.parseCurrency("2,5", true).toPlainString());
assertEquals("2.5", Utils.parseCurrency("2 5", true).toPlainString());
assertEquals("2.05", Utils.parseCurrency("2.05", true).toPlainString());
assertEquals("2.05", Utils.parseCurrency("2,05", true).toPlainString());
assertEquals("2.05", Utils.parseCurrency("2 05", true).toPlainString());
assertEquals("2.50", Utils.parseCurrency("2.50", true).toPlainString());
assertEquals("2.50", Utils.parseCurrency("2,50", true).toPlainString());
assertEquals("2.50", Utils.parseCurrency("2 50", true).toPlainString());
assertEquals("995", Utils.parseCurrency("9.95", false).toPlainString());
assertEquals("995", Utils.parseCurrency("9,95", false).toPlainString());
assertEquals("995", Utils.parseCurrency("9 95", false).toPlainString());
assertEquals("9.95", Utils.parseCurrency("9.95", true).toPlainString());
assertEquals("9.95", Utils.parseCurrency("9,95", true).toPlainString());
assertEquals("9.95", Utils.parseCurrency("9 95", true).toPlainString());
assertEquals("1234", Utils.parseCurrency("1234", false).toPlainString());
assertEquals("1234", Utils.parseCurrency("1.234", false).toPlainString());
assertEquals("1234", Utils.parseCurrency("1,234", false).toPlainString());
assertEquals("1234", Utils.parseCurrency("1 234", false).toPlainString());
assertEquals("1234", Utils.parseCurrency("1234", true).toPlainString());
assertEquals("1234.00", Utils.parseCurrency("1234.00", true).toPlainString());
assertEquals("1234.00", Utils.parseCurrency("1.234.00", true).toPlainString());
assertEquals("1234.00", Utils.parseCurrency("1.234,00", true).toPlainString());
assertEquals("1234.00", Utils.parseCurrency("1,234.00", true).toPlainString());
assertEquals("1234.00", Utils.parseCurrency("1,234,00", true).toPlainString());
assertEquals("1234.00", Utils.parseCurrency("1 234,00", true).toPlainString());
assertEquals("1234.00", Utils.parseCurrency("1 234,00", true).toPlainString());
assertEquals("1234.00", Utils.parseCurrency("1 234 00", true).toPlainString());
}
@Test
public void formatBalances() {
Currency euro = Currency.getInstance("EUR");
assertEquals("1", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1"), null));
assertEquals("1.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1"), euro));
assertEquals("25", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("25"), null));
assertEquals("25.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("25"), euro));
assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.5"), null));
assertEquals("2.50", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.5"), euro));
assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.05"), null));
assertEquals("2.05", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.05"), euro));
assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.50"), null));
assertEquals("2.50", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.50"), euro));
assertEquals("995", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("995"), null));
assertEquals("995.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("995"), euro));
assertEquals("10", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("9.95"), null));
assertEquals("9.95", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("9.95"), euro));
assertEquals("1,234", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234"), null));
assertEquals("1,234.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234"), euro));
assertEquals("1,234", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234.00"), null));
assertEquals("1,234.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234.00"), euro));
}
}

View File

@@ -0,0 +1,22 @@
أوقف البحث عن بطاقات المكافآت البلاستيكية أثناء الخروج من المتجر أو المتجر الإلكتروني.
<b> امسح الباركود ضوئيًا إلى جهازك باستخدام الكاميرا الخاصة به ، وتجاهل البطاقات. </b>
انس محفظتك ، أو اجعلها خفيفة للغاية للأشياء الثمينة.
باستخدام أداة الحمل اليومية الأساسية، يمكنك استبدال البلاستيك عديم الفائدة بالنقود.
- تجنب التجسس بأذونات قليلة جدًا. لا يوجد اتصال بالإنترنت ولا إعلانات.
- إضافة بطاقات أو أكواد بأسماء وألوان قابلة للتخصيص.
- إدخال رمز يدويًا إذا لم يكن هناك رمز شريطي لتخزينه ، أو لا يمكن استخدامه.
- استيراد البطاقات والأكواد من الملفات، Stocard, Loyalty Card Keychain, FidMe, Catima و Voucher Vault.
- قم بعمل نسخة احتياطية لجميع بطاقاتك وانقلها إلى جهاز جديد إذا أردت.
- شارك القسائم والعروض الحصرية والرموز الترويجية أو البطاقات والرموز باستخدام أي تطبيق.
- المظهر الداكن وخيارات إمكانية الوصول للمستخدمين ضعاف البصر.
- صنع للجميع من قبل مجتمع البرمجيات الحرة.
- ترجمات محلية الصنع لأكثر من 20 لغة.
- مجانا ، بدعم من مساهمات المجتمع.
- استخدمها وادرسها وقم بتغييرها وشاركها كما يحلو لك ؛ <i> مع الجميع </i>.
- ليس فقط البرمجيات الحرة / المصدر المفتوح. إدارة بطاقات <i>متروكة الحقوق</i> البرمجيات الحرة (+GPLv3).
قم بتبسيط حياتك والتسوق ، ولا تفقد الإيصال الورقي أو بطاقة هدايا الدفع في المتجر أو تذكرة الطائرة مرة أخرى.
خذ كل مكافآتك ومكافآتك معك ، واحفظها كما تذهب.

View File

@@ -0,0 +1 @@
للباركود والعضويات وبرامج الولاء والقسائم والتذاكر.

View File

@@ -0,0 +1 @@
Catima

View File

@@ -0,0 +1 @@
- Поправяне на някои последователности от знаци, които се показват като един знак

View File

@@ -0,0 +1 @@
- Поправяне на цвета на надписа на бутона „Липсва щрихкод“

View File

@@ -0,0 +1,2 @@
- Поправяне на случая, в който потребителската тема не се прилага правилно към основния екран
- Показване на броя на архивираните карти в прегледа на групата

View File

@@ -0,0 +1,3 @@
- Добавяне на битон за предишна и следваща карта
- Поправяне на цвета на текста на бутона за редактиране
- Заменяне на пиктограмата с флопи диск с отметка

View File

@@ -0,0 +1 @@
- Oprava nesprávné barvy textu na tlačítku „Žádný čárový kód“

View File

@@ -0,0 +1,2 @@
- Oprava, aby vlastní motiv byl správně aplikován na hlavní obrazovku
- Zobrazení počtu archivovaných karet v přehledu skupin

View File

@@ -0,0 +1 @@
- Umožnit nastavit vlastní záhlaví více viditelnější

View File

@@ -0,0 +1,3 @@
- Do zobrazení věrnostních karet přidána tlačítka Předchozí a Následující
- Oprava barvy popředí na tlačítku Upravit
- Nahrazena ikona uložení z diskety na značku zaškrtnutí

View File

@@ -1,3 +1,3 @@
- Přidejte tichou mezeru na začátek/konec čárových kódů. (pull #200 (https://github.com/brarcher/loyalty-card-locker/pull/200))
- Přidání tiché mezery na začátku/konci čárových kódů. (pull #200 (https://github.com/brarcher/loyalty-card-locker/pull/200))
- Přidání možností konfigurace barev použitých pro písmo a pozadí názvu obchodu. (pull #203 (https://github.com/brarcher/loyalty-card-locker/pull/203))
- Přidání možností nastavení velikosti písma na stránce s výpisem karet a na stránce s jednotlivými kartami. (pull #204 (https://github.com/brarcher/loyalty-card-locker/pull/204))
- Přidání možností nastavení velikosti písma na stránce s výpisem karet a na stránce s jednotlivými kartami. (pull #204 (https://github.com/brarcher/loyalty-card-locker/pull/204))

View File

@@ -1,4 +1,4 @@
- Aktualizace překladů. (pull #208 (https://github.com/brarcher/loyalty-card-locker/pull/208))
- Aktualizace vykreslování čárových kódů: (pull #209 (https://github.com/brarcher/loyalty-card-locker/pull/209))
- Při otočení obrazovky znovu načte aktivitu zobrazení karty, aby měl obrázek čárového kódu správnou velikost.
- Při otočení obrazovky se znovu načte aktivita zobrazení karty, aby měl obrázek čárového kódu správnou velikost.
- Vykreslování 1D čárových kódů ve větším prostoru, což umožní lépe vyplnit obrazovku.

View File

@@ -1,2 +1,2 @@
- Zmenšení prostoru v záhlaví při zobrazení karty. (pull #213 (https://github.com/brarcher/loyalty-card-locker/pull/213))
- Zakázat pípání při skenování čárového kódu. (pull #216 (https://github.com/brarcher/loyalty-card-locker/pull/216))
- Zmenšení prostoru v záhlaví při zobrazení karty. (pull #213 (https://github.com/brarcher/loyalty-card-locker/pull/213))
- Zakázáno pípání při skenování čárového kódu. (pull #216 (https://github.com/brarcher/loyalty-card-locker/pull/216))

View File

@@ -1,2 +1,2 @@
- Snížení min SDK ze 17 na 15. (pull #226 (https://github.com/brarcher/loyalty-card-locker/pull/226))
- Odstranit použití starší knihovny apache, která se používá pouze v unit testech, ale již není potřeba. (pull #225 (https://github.com/brarcher/loyalty-card-locker/pull/225))
- Odstranění použití starší knihovny apache, která se používá pouze v unit testech, ale již není potřeba. (pull #225 (https://github.com/brarcher/loyalty-card-locker/pull/225))

View File

@@ -1,2 +1,2 @@
- Oprava španělských překladů (pull #244 (https://github.com/brarcher/loyalty-card-locker/pull/244))
- Aktualizovat překlady (pull #244 (https://github.com/brarcher/loyalty-card-locker/pull/244))
- Aktualizace překladů (pull #244 (https://github.com/brarcher/loyalty-card-locker/pull/244))

View File

@@ -1,4 +1,4 @@
- Přidání nastavení pro ovládání jasu obrazovky při zobrazení čárového kódu (pull #259)
- Přidání překladů do řečtiny (pull #252)
- Přidat slovinské překlady (pull #260)
- Přidání překladů do slovinštiny (pull #260)
- Aktualizace překladů (pull #260, pull #254)

View File

@@ -1 +1 @@
- Aktualizace ruského překladu
- Aktualizace překladu do ruštiny

View File

@@ -1,14 +1,14 @@
- Přidání možnosti vyhledat kartu
- Přidání možnosti sdílet a přijímat věrnostní karty
- Podpora tmavého režimu
- Věrnostní karty mohou být nyní bez čárového kódu (např. bez čárového kódu)
- Věrnostní karty mohou být nyní bez čárového kódu
- Poznámky mohou přesahovat více řádků
- Vylepšení velikosti poznámek
- Zlepšení viditelnosti oznámení a ikon aplikací
- Aktualizace cílového SDK na Android 10
- Vylepšení následujících překladů:
- Němčina
- Italština
- němčina
- italština
- nizozemština
- Polština
- polština
- ruština

View File

@@ -1,3 +1,3 @@
- Klepnutím na čárový kód jej nyní přesunete do horní části obrazovky (#348 (https://github.com/brarcher/loyalty-card-locker/pull/348))
- Přidání bílého prostoru kolem čárových kódů pro lepší skenování v tmavém režimu (#328 (https://github.com/brarcher/loyalty-card-locker/issues/328))
- Klepnutí na čárový kód jej nyní přesune do horní části obrazovky (#348 (https://github.com/brarcher/loyalty-card-locker/pull/348))
- Přidání bílého prostoru kolem čárových kódů pro lepší skenování v tmavém režimu (#328 (https://github.com/brarcher/loyalty-card-locker/issues/328))
- Oprava prohozených tlačítek importu. (#346 (https://github.com/brarcher/loyalty-card-locker/pull/346))

View File

@@ -1,3 +1,3 @@
- Oprava centrování čárového kódu při návratu z celé obrazovky (#351 (https://github.com/brarcher/loyalty-card-locker/pull/351))
- Umožnit výběr umístění pro export zálohy (#352 (https://github.com/brarcher/loyalty-card-locker/pull/352))
- Aktualizace překladů (#357 (https://github.com/brarcher/loyalty-card-locker/pull/357)) & (#362 (https://github.com/brarcher/loyalty-card-locker/pull/362))
- Oprava centrování čárového kódu při návratu z celé obrazovky (#351 (https://github.com/brarcher/loyalty-card-locker/pull/351))
- Umožnění výběru umístění pro export zálohy (#352 (https://github.com/brarcher/loyalty-card-locker/pull/352))
- Aktualizace překladů (#357 (https://github.com/brarcher/loyalty-card-locker/pull/357)) a (#362 (https://github.com/brarcher/loyalty-card-locker/pull/362))

View File

@@ -1,4 +1,4 @@
- Překlad do nizozemštiny
- Umožnit editaci pole se jménem po přidání věrnostní karty
- Přidat nepovinné pole pro poznámku
- Vyřešit všechny problémy identifikované nástrojem FindBugs a vyžadovat vyřešení všech problémů FindBugs před přijetím požadavku na stažení
- Umožnění editace pole se jménem po přidání věrnostní karty
- Přidání nepovinného pole pro poznámku
- Vyřešení všech problémů identifikovaných nástrojem FindBugs a vyžadování vyřešení všech problémů FindBugs před přijetím požadavku na natažení

View File

@@ -1,2 +1,2 @@
- Přidání zaoblených okrajů na ikony karet v hlavním přehledu
- Přidání zaoblených okrajů na ikony karet v hlavním přehledu
- Přidána podpora pro seskupování záznamů

View File

@@ -1,3 +1,3 @@
- Vylepšené uživatelské rozhraní pro úpravy
- Odstraněna možnost barvy textu záhlaví (nyní se automaticky generuje na základě jasu).
- Aktualizované překlady
- Odstraněna volba barvy textu záhlaví (nyní se automaticky generuje na základě jasu).
- Aktualizace překladů

View File

@@ -1,2 +1,2 @@
- Vždy zobrazit všechny možnosti importu/exportu a zobrazit přípitek na aktuální problémy (zlepšuje kompatibilitu s XPrivacyLua)
- Požádat o potvrzení při opuštění zobrazení úprav po provedení změn bez uložení
- Vždy zobrazit všechny možnosti importu/exportu a zobrazit toast na aktuální problémy (zlepšuje kompatibilitu s XPrivacyLua)
- Požádat o potvrzení při opuštění pohledu úprav po provedení změn bez uložení

View File

@@ -1,3 +1,3 @@
- Přesunutí obrazovky Informace do vlastní aktivity
- Zeptat se uživatele, zda chce použít svůj fotoaparát, nebo ručně zadat ID na přidání/úpravu karty.
- Vytvořit ruční řazení skupin namísto nuceného abecedního řazení
- Zeptat se uživatele, zda chce použít fotoaparát, nebo ručně zadat ID při přidání/úpravě karty
- Vytvoření ručního řazení skupin namísto nuceného abecedního řazení

View File

@@ -1,2 +1,2 @@
- Z hlavní obrazovky lze otevřít dialogové okno o aplikaci, které poskytuje podrobnosti o aplikaci a projektu na GitHubu (issue #19 (https://github.com/brarcher/loyalty-card-locker/issues/19)).
- Umožnění importu informací o věrnostních kartách z/do souboru CSV v externím úložišti (issue #36 (https://github.com/brarcher/loyalty-card-locker/issues/36), issue #20 (https://github.com/brarcher/loyalty-card-locker/issues/20))
- Z hlavní obrazovky lze otevřít dialogové okno o aplikaci, které poskytuje podrobnosti o aplikaci a projektu na GitHubu (issue #19 (https://github.com/brarcher/loyalty-card-locker/issues/19)).
- Umožnění importu informací o věrnostních kartách z/do souboru CSV v externím úložišti (issue #36 (https://github.com/brarcher/loyalty-card-locker/issues/36), issue #20 (https://github.com/brarcher/loyalty-card-locker/issues/20))

View File

@@ -1,2 +1,2 @@
- Zlepšete kontrast tím, že na červených tlačítkách vždy použijete bílý text.
- Přetahovací spodní list v zobrazení věrnostní karty
- Zlepše kontrastu tím, že na červených tlačítkách je vždy použit bílý text.
- Přetahovací spodní list v zobrazení věrnostní karty

View File

@@ -1,3 +1,3 @@
- Automatické zaostření textového pole při vytváření nebo úpravě skupiny
- Oprava rozmazaných ikon (všude používejte SVG)
- Vždy otevřít fotoaparát, ale přidat tlačítko ručního skenování do zobrazení fotoaparátu
- Automatické zaření textového pole při vytváření nebo úpravě skupiny
- Oprava rozmazaných ikon (všude použito SVG)
- Vždy otevřít fotoaparát, ale přidáno tlačítko ručního skenování do zobrazení fotoaparátu

View File

@@ -1,2 +1,2 @@
- Oddělení uživatelského rozhraní pro úpravy na kartách, aby bylo prostornější.
- Přidání podpory polí s vypršením platnosti
- Oddělení uživatelského rozhraní pro úpravy na kartách, aby bylo prostornější
- Přidání podpory polí s vypršením platnosti

View File

@@ -1 +1 @@
- Oprava pádu při přepnutí na kartu s čárovým kódem v zobrazení úprav, pokud není k dispozici žádný čárový kód
- Oprava pádu při přepnutí na kartu s čárovým kódem v pohledu úprav, pokud není k dispozici žádný čárový kód

View File

@@ -1,4 +1,4 @@
- Přidání podpory pro škálování čárového kódu při přesunu na horní stranu, aby se vešel i do menších skenerů
- Oprava přeskakování spodního listu po přepnutí na celou obrazovku
- Zmenšit záhlaví v zobrazení věrnostních karet v režimu na šířku
- Zmenšit záhlaví v zobrazení věrnostních karet v režimu na šířku
- Oprava karet, které nezůstávají ve skupině, když se skupina přejmenuje

View File

@@ -1,2 +1,2 @@
- Přidání podpory rovnováhy
- Reorganizace karty čárového kódu v zobrazení úprav
- Přidání podpory zůstatku
- Přeuspořádání karty čárového kódu v pohledu úprav

View File

@@ -1,2 +1,2 @@
- Zlepšení logiky rozboru vyvážení
- Zlepšení logiky rozboru zůstatku
- Oprava zobrazení desetinných míst měny na hlavní obrazovce

View File

@@ -1 +1 @@
- Oprava vyváženosti parsování pro země používající mezeru jako oddělovač
- Oprava rozboru zůstatku pro země používající mezeru jako oddělovač

View File

@@ -1,3 +1,3 @@
- Podpora importu exportů z Voucher Vault (https://github.com/tim-smart/vouchervault/)
- Podpora importu exportů z Voucher Vault (https://github.com/tim-smart/vouchervault/)
- Možnost ponechat obrazovku zapnutou při prohlížení věrnostní karty
- Možnost pozastavit uzamčenou obrazovku při prohlížení věrnostní karty

View File

@@ -1,4 +1,4 @@
- Podpora importu exportů Fidme (https://play.google.com/store/apps/details?id=fr.snapp.fidme)
- Umožňuje importovat kartu z obrázku uloženého v galerii systému Android uživatele.
- Umožnění importovat kartu z obrázku uloženého v uživatelovo galerii v systému Android
- Oprava odříznutí víceřádkové poznámky
- Změnit text "Děkuji" v dialogu o ochraně osobních údajů na "Přijímám", protože Huawei je příliš pedantský
- Změnit text Děkuji v dialogu o ochraně osobních údajů na Přijímám, protože Huawei je příliš pedantský

View File

@@ -1,4 +1,4 @@
- Podpora nového exportu do PDF417 z Trezoru poukázek
- Podpora nového exportu do PDF417 z Voucher Vault
- Podpora kopírování více čárových kódů najednou
- Podpora sdílení více věrnostních karet najednou
- Požádat o aktualizaci hodnoty čárového kódu, pokud se změní ID karty

View File

@@ -0,0 +1 @@
Catima — Κάρτες επιβράβευσης

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