Compare commits

...

84 Commits

Author SHA1 Message Date
Sylvia van Os
a434397551 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into fix/deprecatedProgressDialog 2021-12-18 14:48:13 +01:00
Sylvia van Os
d84ce6ff82 Remove Google-declined title 2021-12-17 16:59:50 +01:00
Sylvia van Os
d4e388cf5d Fix some crashes after DB refactor 2021-12-16 22:49:22 +01:00
bors[bot]
34fcedfa28 Merge #688
688: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Nyatsuki <Odamaki@yandex.ru>
2021-12-16 16:23:48 +00:00
Nyatsuki
c75eed56f0 Translated using Weblate (Japanese)
Currently translated at 99.1% (232 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-12-16 10:51:04 +01:00
bors[bot]
8ce0ce82ef Merge #680
680: Cleanup DBHelper r=TheLastProject a=TheLastProject

Should fix #661 

Supersedes #678 

While #678 does fix the issue too, the real issue was that an importer could cause such a state issue. So I've instead been seriously cleaning up. While all the tests pass, I do want to test this slightly longer before merging it into master.

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-12-14 19:24:29 +00:00
bors[bot]
304754f991 Merge #677
677: 671 adding English to list of languages, 672, 607 relaunch main activity after language, theme change r=TheLastProject a=Kethen

#671, #672 please review
added #607

Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-12-14 17:38:17 +00:00
Katharine Chui
ab6e90d9f6 reload main activity with splash screen skip 2021-12-15 00:38:17 +08:00
Katharine
9df22f18f0 671 adding English to list of languages, 672 relaunch main activity after language change 2021-12-15 00:33:15 +08:00
bors[bot]
2eeec777d7 Merge #684
684: 681 fix star icon vector graphics, star color by theme when selected r=TheLastProject a=Kethen

#681 please review
![image](https://user-images.githubusercontent.com/22017945/145991885-991e09d5-913f-499d-94b1-03ae6326eb9f.png)
![image](https://user-images.githubusercontent.com/22017945/145992155-589f45d0-218b-4ab9-b351-2a58d19990bc.png)

![image](https://user-images.githubusercontent.com/22017945/145992048-a08f8e88-bce3-4bfc-a112-35dd991f4516.png)
![image](https://user-images.githubusercontent.com/22017945/145992074-e7699e72-e4d4-44d5-851c-5cd3c453a745.png)


Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-12-14 16:27:57 +00:00
Katharine Chui
1d41039de2 674 currency symbol order fixes (#679) 2021-12-14 17:26:18 +01:00
Katharine Chui
112b4a034c fix card icon layout 2021-12-14 20:16:36 +08:00
Katharine Chui
8c06427976 681 fix vector graphics, star color by theme when selected 2021-12-14 19:41:11 +08:00
bors[bot]
486a2b887e Merge #682
682: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Altons <marsupilami450@gmail.com>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Eric <spice2wolf@gmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-14 07:44:19 +00:00
Oğuz Ersen
3f3f289f62 Translated using Weblate (Turkish)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-12-14 02:53:59 +01:00
Joel A
bf2b28065d Translated using Weblate (Swedish)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-12-14 02:53:58 +01:00
Eric
d00d25ad00 Translated using Weblate (Chinese (Simplified))
Currently translated at 80.7% (189 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2021-12-14 02:53:58 +01:00
solokot
f1371daecb Translated using Weblate (Russian)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-14 02:53:58 +01:00
Heimen Stoffels
2fecc524f0 Translated using Weblate (Dutch)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-14 02:53:58 +01:00
Altons
f5beffcad5 Translated using Weblate (French)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-14 02:53:58 +01:00
Altons
b78bdb3ced Translated using Weblate (German)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-12-14 02:53:57 +01:00
bors[bot]
f16b3ca119 Merge #675
675: 635 android 5 stuck row height, 619 star icon color r=TheLastProject a=Kethen

please review, for #635 and #619

https://user-images.githubusercontent.com/22017945/145800150-b3afa43e-de80-4172-bbdd-5d06af6276d1.mp4




Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
2021-12-13 22:06:26 +00:00
Sylvia van Os
f2e820f7bb Cleanup DBHelper 2021-12-13 22:47:12 +01:00
Katharine
cf38357f3e spotbug 2021-12-13 17:32:44 +08:00
Katharine
9862a9912f 619 adapt star color to card icon 2021-12-13 16:52:21 +08:00
Katharine
990968a67b 635 trigger requestLayout on possible card text view shrink 2021-12-13 15:08:46 +08:00
Sylvia van Os
3331cf9ccf Make spotBugs happy 2021-12-12 19:25:51 +01:00
Sylvia van Os
8a45222783 Simplify card shortcut code 2021-12-12 19:18:13 +01:00
bors[bot]
d92efc020b Merge #670
670: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
2021-12-12 10:48:38 +00:00
Michael Moroni
deb1edb7a6 Translated using Weblate (Italian)
Currently translated at 4.2% (4 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2021-12-12 11:45:54 +01:00
Heimen Stoffels
3265a9eb4d Translated using Weblate (Dutch)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-12 11:45:54 +01:00
Michael Moroni
c0ed86818f Translated using Weblate (Italian)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-12-12 11:45:54 +01:00
bors[bot]
67d8a242b5 Merge #673
673: Update contributors r=TheLastProject a=github-actions[bot]

Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-12-12 10:41:17 +00:00
TheLastProject
d12a4bf75d Update contributors 2021-12-12 05:16:31 +00:00
bors[bot]
e86db3887b Merge #667
667: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Altons <marsupilami450@gmail.com>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-09 21:00:45 +00:00
Oğuz Ersen
ce8488e515 Translated using Weblate (Turkish)
Currently translated at 28.4% (27 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-09 21:53:29 +01:00
Oğuz Ersen
5ef9aad5a7 Translated using Weblate (Turkish)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-12-09 21:53:28 +01:00
Joel A
d9fd3fd001 Translated using Weblate (Swedish)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-12-09 21:53:28 +01:00
J. Lavoie
f9f3efe1e2 Translated using Weblate (Finnish)
Currently translated at 71.6% (167 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2021-12-09 21:53:27 +01:00
Altons
c5b9399fc4 Translated using Weblate (French)
Currently translated at 5.2% (5 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2021-12-09 21:53:27 +01:00
IllusiveMan196
19ad303508 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-12-09 21:53:27 +01:00
solokot
d5b9bb9ca1 Translated using Weblate (Russian)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-09 21:53:26 +01:00
Heimen Stoffels
c50661f1bd Translated using Weblate (Dutch)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-09 21:53:26 +01:00
J. Lavoie
afd8d2e675 Translated using Weblate (Italian)
Currently translated at 99.5% (232 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-12-09 21:53:26 +01:00
Altons
be8765aab1 Translated using Weblate (French)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-09 21:53:25 +01:00
J. Lavoie
5656751a14 Translated using Weblate (French)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-09 21:53:25 +01:00
Altons
12b81f7fe5 Translated using Weblate (German)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-12-09 21:53:24 +01:00
J. Lavoie
3ff64d9abc Translated using Weblate (German)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-12-09 21:53:24 +01:00
Altons
0a39a8bb5b Translated using Weblate (English)
Currently translated at 100.0% (233 of 233 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2021-12-09 21:53:24 +01:00
bors[bot]
64f68d5c19 Merge #666
666: Add long press to add card to group r=TheLastProject a=Altonss

Fixed issue #649.

Co-authored-by: Altonss <66519591+Altonss@users.noreply.github.com>
2021-12-09 18:48:15 +00:00
Altonss
2975c46f96 Update ManageGroupActivity.java
Fix long press to add card to group
2021-12-09 19:28:00 +01:00
bors[bot]
f6762df1cf Merge #665
665: Bump gradle from 7.0.3 to 7.0.4 r=TheLastProject a=dependabot[bot]

Bumps gradle from 7.0.3 to 7.0.4.


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.android.tools.build:gradle&package-manager=gradle&previous-version=7.0.3&new-version=7.0.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting ``@dependabot` rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- ``@dependabot` rebase` will rebase this PR
- ``@dependabot` recreate` will recreate this PR, overwriting any edits that have been made to it
- ``@dependabot` merge` will merge this PR after your CI passes on it
- ``@dependabot` squash and merge` will squash and merge this PR after your CI passes on it
- ``@dependabot` cancel merge` will cancel a previously requested merge and block automerging
- ``@dependabot` reopen` will reopen this PR if it is closed
- ``@dependabot` close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- ``@dependabot` ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- ``@dependabot` ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- ``@dependabot` ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-09 16:30:19 +00:00
dependabot[bot]
1aa0585909 Bump gradle from 7.0.3 to 7.0.4
Bumps gradle from 7.0.3 to 7.0.4.

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-09 02:19:09 +00:00
bors[bot]
1cb20eeab3 Merge #663
663: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Andreas Blaser <andreas.blaser@outlook.com>
Co-authored-by: Altons <marsupilami450@gmail.com>
2021-12-08 19:31:49 +00:00
Altons
c8acee2fbd Translated using Weblate (German)
Currently translated at 3.1% (3 of 94 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2021-12-08 20:31:13 +01:00
Andreas Blaser
ff35773eed Translated using Weblate (German)
Currently translated at 3.1% (3 of 94 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2021-12-08 20:31:13 +01:00
Sylvia van Os
48403399ab Merge pull request #664 from TheLastProject/create-pull-request/patch-1638991178
Update Fastlane changelogs
2021-12-08 20:31:10 +01:00
TheLastProject
96dafeab70 Update Fastlane changelogs 2021-12-08 19:19:37 +00:00
Sylvia van Os
d10e358e7d Document CODE 93 support 2021-12-08 20:19:20 +01:00
Altonss
71eb8c53bc Add code 93 (#659) 2021-12-08 20:18:15 +01:00
bors[bot]
186c2d1d56 Merge #657
657: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Marco <magliano32@gmail.com>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: Eric <spice2wolf@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-07 17:34:52 +00:00
Oğuz Ersen
2efa35504f Translated using Weblate (Turkish)
Currently translated at 99.5% (231 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-12-07 18:32:34 +01:00
Eric
ca1996da53 Translated using Weblate (Chinese (Simplified))
Currently translated at 81.4% (189 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2021-12-07 18:32:34 +01:00
Heimen Stoffels
b8d0724446 Translated using Weblate (Dutch)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-07 18:32:34 +01:00
Marco
c9a08e4f5b Translated using Weblate (Italian)
Currently translated at 89.2% (207 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-12-07 18:32:34 +01:00
Altonss
4920b67d0c Add translation platform details in about page (#656) 2021-12-07 18:32:28 +01:00
bors[bot]
e8eb3fce5c Merge #655
655: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

* [Catima/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: Sylvia van Os <sylvia@hackerchick.me>
Co-authored-by: Altons <marsupilami450@gmail.com>
2021-12-06 23:11:18 +00:00
solokot
aaccae647a Translated using Weblate (Russian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-07 00:06:32 +01:00
Altons
df4e851bfe Translated using Weblate (French)
Currently translated at 90.0% (209 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-07 00:06:31 +01:00
Sylvia van Os
05c85dac14 Translated using Weblate (Russian)
Currently translated at 87.9% (204 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-06 21:03:58 +01:00
solokot
86d953bb74 Translated using Weblate (Russian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-12-06 20:34:00 +01:00
Allan Nordhøy
1ecc39bea5 Less verbose strings (#645) 2021-12-06 20:33:56 +01:00
Sylvia van Os
4c9182eb0b Merge pull request #651 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2021-12-05 13:36:48 +01:00
Oğuz Ersen
62fafaff95 Translated using Weblate (Turkish)
Currently translated at 27.6% (26 of 94 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-05 12:53:33 +01:00
Oğuz Ersen
aa0fdcc6b6 Translated using Weblate (Turkish)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-12-05 12:53:32 +01:00
Heimen Stoffels
6c33dba401 Translated using Weblate (Dutch)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-12-05 12:53:32 +01:00
Allan Nordhøy
c07d9805e4 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.8% (227 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-12-05 12:53:31 +01:00
Arco
941a123db0 Translated using Weblate (French)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-12-05 12:53:31 +01:00
Arco
2e58421a80 Translated using Weblate (English)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2021-12-05 12:53:31 +01:00
Sylvia van Os
ae28e02cce Merge pull request #650 from TheLastProject/create-pull-request/patch-1638681427
Update contributors
2021-12-05 12:17:48 +01:00
TheLastProject
e5d8dc8d59 Update contributors 2021-12-05 05:17:07 +00:00
Sylvia van Os
b85de0e089 Merge pull request #647 from TheLastProject/create-pull-request/patch-1638623066
Update Fastlane changelogs
2021-12-04 14:04:59 +01:00
TheLastProject
4264155837 Update Fastlane changelogs 2021-12-04 13:04:25 +00:00
Sylvia van Os
ae1ccab059 Replace ProgressDialog with notification 2021-11-28 21:48:48 +01:00
97 changed files with 1549 additions and 1376 deletions

View File

@@ -1,5 +1,9 @@
# Changelog
## Unreleased - 96
- Add CODE 93 support
## v2.11.2 - 95 (2021-12-04)
- Fix crash on sharing card

View File

@@ -120,6 +120,8 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
return "C0C";
case CODE_39:
return "CODE_39";
case CODE_93:
return "CODE_93";
case CODE_128:
return "CODE_128";
case EAN_8:

View File

@@ -1,19 +1,16 @@
package protect.card_locker;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
/**
@@ -21,48 +18,41 @@ import androidx.recyclerview.widget.RecyclerView;
*/
public class CardShortcutConfigure extends AppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
static final String TAG = "Catima";
final DBHelper mDb = new DBHelper(this);
private SQLiteDatabase mDatabase;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
mDatabase = new DBHelper(this).getReadableDatabase();
// Set the result to CANCELED. This will cause nothing to happen if the
// aback button is pressed.
setResult(RESULT_CANCELED);
setContentView(R.layout.main_activity);
setContentView(R.layout.simple_toolbar_list_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setVisibility(View.GONE);
// Hide new button because it won't work here anyway
FloatingActionButton newFab = findViewById(R.id.fabAdd);
newFab.setVisibility(View.GONE);
final DBHelper db = new DBHelper(this);
toolbar.setTitle(R.string.shortcutSelectCard);
// If there are no cards, bail
if (db.getLoyaltyCardCount() == 0) {
if (DBHelper.getLoyaltyCardCount(mDatabase) == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show();
finish();
}
final RecyclerView cardList = findViewById(R.id.list);
GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager();
if (layoutManager != null) {
layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns));
}
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
cardList.setLayoutManager(mLayoutManager);
cardList.setItemAnimator(new DefaultItemAnimator());
cardList.setVisibility(View.VISIBLE);
Cursor cardCursor = db.getLoyaltyCardCursor();
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase);
final LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(this, cardCursor, this);
cardList.setAdapter(adapter);
}
private void onClickAction(int position) {
Cursor selected = mDb.getLoyaltyCardCursor();
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase);
selected.moveToPosition(position);
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(selected);

View File

@@ -5,6 +5,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.os.Build;
@@ -27,12 +28,19 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
public static final String PREFIX = "catima-";
static final String TAG = "Catima";
private final DBHelper dbHelper = new DBHelper(this);
private SQLiteDatabase mDatabase;
@Override
public void onCreate() {
super.onCreate();
mDatabase = new DBHelper(this).getReadableDatabase();
}
@NonNull
@Override
public Flow.Publisher<Control> createPublisherForAllAvailable() {
Cursor loyaltyCardCursor = dbHelper.getLoyaltyCardCursor();
Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(mDatabase);
return subscriber -> {
while (loyaltyCardCursor.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(loyaltyCardCursor);
@@ -64,7 +72,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
try {
Integer cardId = this.controlIdToCardId(controlId);
LoyaltyCard card = dbHelper.getLoyaltyCard(cardId);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId);
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("id", card.id);

View File

@@ -5,11 +5,11 @@ import android.content.SharedPreferences;
import android.content.res.Resources;
import android.util.TypedValue;
import java.util.HashMap;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
import java.util.HashMap;
public class CatimaAppCompatActivity extends AppCompatActivity {
SharedPreferences pref;

View File

@@ -10,6 +10,7 @@ public class CatimaBarcode {
public static final List<BarcodeFormat> barcodeFormats = Collections.unmodifiableList(Arrays.asList(
BarcodeFormat.AZTEC,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_93,
BarcodeFormat.CODE_128,
BarcodeFormat.CODABAR,
BarcodeFormat.DATA_MATRIX,
@@ -25,6 +26,7 @@ public class CatimaBarcode {
public static final List<String> barcodePrettyNames = Collections.unmodifiableList(Arrays.asList(
"Aztec",
"Code 39",
"Code 93",
"Code 128",
"Codabar",
"Data Matrix",

View File

@@ -111,7 +111,6 @@ public class DBHelper extends SQLiteOpenHelper {
"tokenize=unicode61);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2 && newVersion >= 2) {
@@ -305,7 +304,7 @@ public class DBHelper extends SQLiteOpenHelper {
}
}
private ContentValues generateFTSContentValues(final int id, final String store, final String note) {
private static ContentValues generateFTSContentValues(final int id, final String store, final String note) {
// FTS on Android is severely limited and can only search for word starting with a certain string
// So for each word, we grab every single substring
// This makes it possible to find Décathlon by searching both de and cat, for example
@@ -337,22 +336,21 @@ public class DBHelper extends SQLiteOpenHelper {
return ftsContentValues;
}
private void insertFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
private static void insertFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
db.insert(LoyaltyCardDbFTS.TABLE, null, generateFTSContentValues(id, store, note));
}
private void updateFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
private static void updateFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
db.update(LoyaltyCardDbFTS.TABLE, generateFTSContentValues(id, store, note),
whereAttrs(LoyaltyCardDbFTS.ID), withArgs(id));
}
public long insertLoyaltyCard(final String store, final String note, final Date expiry,
final BigDecimal balance, final Currency balanceType,
final String cardId, final String barcodeId,
final CatimaBarcode barcodeType, final Integer headerColor,
final int starStatus, final Long lastUsed) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
public static long insertLoyaltyCard(
final SQLiteDatabase database, final String store, final String note, final Date expiry,
final BigDecimal balance, final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType, final Integer headerColor,
final int starStatus, final Long lastUsed) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
@@ -367,56 +365,23 @@ public class DBHelper extends SQLiteOpenHelper {
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
long id = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
long id = database.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, (int) id, store, note);
insertFTS(database, (int) id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return id;
}
public long insertLoyaltyCard(final SQLiteDatabase db, final String store,
final String note, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus,
final Long lastUsed) {
db.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STORE, store);
contentValues.put(LoyaltyCardDbIds.NOTE, note);
contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null);
contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
long id = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, (int) id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
return id;
}
public long insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store,
final String note, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus,
final Long lastUsed) {
db.beginTransaction();
public static long insertLoyaltyCard(
final SQLiteDatabase database, final int id, final String store, final String note,
final Date expiry, final BigDecimal balance, final Currency balanceType,
final String cardId, final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus, final Long lastUsed) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
@@ -432,24 +397,23 @@ public class DBHelper extends SQLiteOpenHelper {
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
database.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, id, store, note);
insertFTS(database, id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return id;
}
public boolean updateLoyaltyCard(final int id, final String store, final String note,
final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
public static boolean updateLoyaltyCard(
SQLiteDatabase database, final int id, final String store, final String note,
final Date expiry, final BigDecimal balance, final Currency balanceType,
final String cardId, final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
@@ -462,53 +426,49 @@ public class DBHelper extends SQLiteOpenHelper {
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID), withArgs(id));
// FTS
updateFTS(db, id, store, note);
updateFTS(database, id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardStarStatus(final int id, final int starStatus) {
SQLiteDatabase db = getWritableDatabase();
public static boolean updateLoyaltyCardStarStatus(SQLiteDatabase database, final int id, final int starStatus) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardLastUsed(final int id) {
SQLiteDatabase db = getWritableDatabase();
public static boolean updateLoyaltyCardLastUsed(SQLiteDatabase database, final int id) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.LAST_USED, System.currentTimeMillis() / 1000);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardZoomLevel(int loyaltyCardId, int zoomLevel) {
SQLiteDatabase db = getWritableDatabase();
public static boolean updateLoyaltyCardZoomLevel(SQLiteDatabase database, int loyaltyCardId, int zoomLevel) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.ZOOM_LEVEL, zoomLevel);
Log.d("updateLoyaltyCardZLevel", "Card Id = " + loyaltyCardId + " Zoom level= " + zoomLevel);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(loyaltyCardId));
Log.d("updateLoyaltyCardZLevel", "Rows changed = " + rowsUpdated);
return (rowsUpdated == 1);
}
public LoyaltyCard getLoyaltyCard(final int id) {
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) {
Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
LoyaltyCard card = null;
@@ -522,9 +482,8 @@ public class DBHelper extends SQLiteOpenHelper {
return card;
}
public List<Group> getLoyaltyCardGroups(final int id) {
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " +
public static List<Group> getLoyaltyCardGroups(SQLiteDatabase database, final int id) {
Cursor data = database.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " +
" LEFT JOIN " + LoyaltyCardDbIdsGroups.TABLE + " ig ON ig." + LoyaltyCardDbIdsGroups.groupID + " = g." + LoyaltyCardDbGroups.ID +
" where " + LoyaltyCardDbIdsGroups.cardID + "=?" +
" ORDER BY " + LoyaltyCardDbIdsGroups.groupID, withArgs(id));
@@ -547,11 +506,9 @@ public class DBHelper extends SQLiteOpenHelper {
return groups;
}
public void setLoyaltyCardGroups(final int id, List<Group> groups) {
SQLiteDatabase db = getWritableDatabase();
public static void setLoyaltyCardGroups(SQLiteDatabase database, final int id, List<Group> groups) {
// First delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
@@ -560,39 +517,23 @@ public class DBHelper extends SQLiteOpenHelper {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIdsGroups.cardID, id);
contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id);
db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
database.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
}
}
public void setLoyaltyCardGroups(final SQLiteDatabase db, final int id, List<Group> groups) {
// First delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
// Then create entries for selected values
for (Group group : groups) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIdsGroups.cardID, id);
contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id);
db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
}
}
public boolean deleteLoyaltyCard(Context context, final int id) {
SQLiteDatabase db = getWritableDatabase();
public static boolean deleteLoyaltyCard(SQLiteDatabase database, Context context, final int id) {
// Delete card
int rowsDeleted = db.delete(LoyaltyCardDbIds.TABLE,
int rowsDeleted = database.delete(LoyaltyCardDbIds.TABLE,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
// And delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
// Delete FTS table entries
db.delete(LoyaltyCardDbFTS.TABLE,
database.delete(LoyaltyCardDbFTS.TABLE,
whereAttrs(LoyaltyCardDbFTS.ID),
withArgs(id));
@@ -608,9 +549,9 @@ public class DBHelper extends SQLiteOpenHelper {
return (rowsDeleted == 1);
}
public Cursor getLoyaltyCardCursor() {
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database) {
// An empty string will match everything
return getLoyaltyCardCursor("");
return getLoyaltyCardCursor(database, "");
}
/**
@@ -619,8 +560,8 @@ public class DBHelper extends SQLiteOpenHelper {
* @param filter
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(final String filter) {
return getLoyaltyCardCursor(filter, null);
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, final String filter) {
return getLoyaltyCardCursor(database, filter, null);
}
/**
@@ -630,8 +571,8 @@ public class DBHelper extends SQLiteOpenHelper {
* @param group
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(final String filter, Group group) {
return getLoyaltyCardCursor(filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending);
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, final String filter, Group group) {
return getLoyaltyCardCursor(database, filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending);
}
/**
@@ -642,14 +583,12 @@ public class DBHelper extends SQLiteOpenHelper {
* @param order
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
StringBuilder groupFilter = new StringBuilder();
String limitString = "";
SQLiteDatabase db = getReadableDatabase();
if (group != null) {
List<Integer> allowedIds = getGroupCardIds(group._id);
List<Integer> allowedIds = getGroupCardIds(database, group._id);
// Empty group
if (!allowedIds.isEmpty()) {
@@ -669,7 +608,7 @@ public class DBHelper extends SQLiteOpenHelper {
String orderField = getFieldForOrder(order);
return db.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE +
return database.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE +
" JOIN " + LoyaltyCardDbFTS.TABLE +
" ON " + LoyaltyCardDbFTS.TABLE + "." + LoyaltyCardDbFTS.ID + " = " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.ID +
(filter.trim().isEmpty() ? " " : " AND " + LoyaltyCardDbFTS.TABLE + " MATCH ? ") +
@@ -686,9 +625,8 @@ public class DBHelper extends SQLiteOpenHelper {
*
* @return Integer
*/
public int getLoyaltyCardCount() {
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIds.TABLE);
public static int getLoyaltyCardCount(SQLiteDatabase database) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIds.TABLE);
}
/**
@@ -696,15 +634,13 @@ public class DBHelper extends SQLiteOpenHelper {
*
* @return Cursor
*/
public Cursor getGroupCursor() {
SQLiteDatabase db = getReadableDatabase();
return db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
public static Cursor getGroupCursor(SQLiteDatabase database) {
return database.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
" ORDER BY " + LoyaltyCardDbGroups.ORDER + " ASC," + LoyaltyCardDbGroups.ID + " COLLATE NOCASE ASC", null, null);
}
public List<Group> getGroups() {
Cursor data = getGroupCursor();
public static List<Group> getGroups(SQLiteDatabase database) {
Cursor data = getGroupCursor(database);
List<Group> groups = new ArrayList<>();
@@ -722,15 +658,14 @@ public class DBHelper extends SQLiteOpenHelper {
return groups;
}
public void reorderGroups(final List<Group> groups) {
public static void reorderGroups(SQLiteDatabase database, final List<Group> groups) {
Integer order = 0;
SQLiteDatabase db = getWritableDatabase();
for (Group group : groups) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ORDER, order);
db.update(LoyaltyCardDbGroups.TABLE, contentValues,
database.update(LoyaltyCardDbGroups.TABLE, contentValues,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(group._id));
@@ -738,9 +673,8 @@ public class DBHelper extends SQLiteOpenHelper {
}
}
public Group getGroup(final String groupName) {
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbGroups.TABLE, null,
public static Group getGroup(SQLiteDatabase database, final String groupName) {
Cursor data = database.query(LoyaltyCardDbGroups.TABLE, null,
whereAttrs(LoyaltyCardDbGroups.ID), withArgs(groupName), null, null, null);
Group group = null;
@@ -753,14 +687,12 @@ public class DBHelper extends SQLiteOpenHelper {
return group;
}
public int getGroupCount() {
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbGroups.TABLE);
public static int getGroupCount(SQLiteDatabase database) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbGroups.TABLE);
}
public List<Integer> getGroupCardIds(final String groupName) {
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbIdsGroups.TABLE, withArgs(LoyaltyCardDbIdsGroups.cardID),
public static List<Integer> getGroupCardIds(SQLiteDatabase database, final String groupName) {
Cursor data = database.query(LoyaltyCardDbIdsGroups.TABLE, withArgs(LoyaltyCardDbIdsGroups.cardID),
whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName), null, null, null);
List<Integer> cardIds = new ArrayList<>();
@@ -779,99 +711,85 @@ public class DBHelper extends SQLiteOpenHelper {
return cardIds;
}
public long insertGroup(final String name) {
public static long insertGroup(SQLiteDatabase database, final String name) {
if (name.isEmpty()) return -1;
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, name);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
return db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount(database));
return database.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
}
public boolean insertGroup(final SQLiteDatabase db, final String name) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, name);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
final long newId = db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
return newId != -1;
}
public boolean updateGroup(final String groupName, final String newName) {
public static boolean updateGroup(SQLiteDatabase database, final String groupName, final String newName) {
if (newName.isEmpty()) return false;
boolean success = false;
SQLiteDatabase db = getWritableDatabase();
ContentValues groupContentValues = new ContentValues();
groupContentValues.put(LoyaltyCardDbGroups.ID, newName);
ContentValues lookupContentValues = new ContentValues();
lookupContentValues.put(LoyaltyCardDbIdsGroups.groupID, newName);
db.beginTransaction();
database.beginTransaction();
try {
// Update group name
int groupsChanged = db.update(LoyaltyCardDbGroups.TABLE, groupContentValues,
int groupsChanged = database.update(LoyaltyCardDbGroups.TABLE, groupContentValues,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(groupName));
// Also update lookup tables
db.update(LoyaltyCardDbIdsGroups.TABLE, lookupContentValues,
database.update(LoyaltyCardDbIdsGroups.TABLE, lookupContentValues,
whereAttrs(LoyaltyCardDbIdsGroups.groupID),
withArgs(groupName));
if (groupsChanged == 1) {
db.setTransactionSuccessful();
database.setTransactionSuccessful();
success = true;
}
} catch (SQLiteException e) {
} catch (SQLiteException ignored) {
} finally {
db.endTransaction();
database.endTransaction();
}
return success;
}
public boolean deleteGroup(final String groupName) {
public static boolean deleteGroup(SQLiteDatabase database, final String groupName) {
boolean success = false;
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
database.beginTransaction();
try {
// Delete group
int groupsDeleted = db.delete(LoyaltyCardDbGroups.TABLE,
int groupsDeleted = database.delete(LoyaltyCardDbGroups.TABLE,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(groupName));
// And delete lookup table entries associated with this group
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.groupID),
withArgs(groupName));
if (groupsDeleted == 1) {
db.setTransactionSuccessful();
database.setTransactionSuccessful();
success = true;
}
} finally {
db.endTransaction();
database.endTransaction();
}
// Reorder after delete to ensure no bad order IDs
reorderGroups(getGroups());
reorderGroups(database, getGroups(database));
return success;
}
public int getGroupCardCount(final String groupName) {
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIdsGroups.TABLE,
public static int getGroupCardCount(SQLiteDatabase database, final String groupName) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName));
}
private String whereAttrs(String... attrs) {
static private String whereAttrs(String... attrs) {
if (attrs.length == 0) {
return null;
}
@@ -882,13 +800,13 @@ public class DBHelper extends SQLiteOpenHelper {
return whereClause.toString();
}
private String[] withArgs(Object... object) {
static private String[] withArgs(Object... object) {
return Arrays.stream(object)
.map(String::valueOf)
.toArray(String[]::new);
}
private String getFieldForOrder(LoyaltyCardOrder order) {
private static String getFieldForOrder(LoyaltyCardOrder order) {
if (order == LoyaltyCardOrder.Alpha) {
return LoyaltyCardDbIds.STORE;
}
@@ -904,7 +822,7 @@ public class DBHelper extends SQLiteOpenHelper {
throw new IllegalArgumentException("Unknown order " + order);
}
private String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
private static String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
if (order == LoyaltyCardOrder.LastUsed) {
// We want the default sorting to put the most recently used first
return direction == LoyaltyCardOrderDirection.Descending ? "ASC" : "DESC";

View File

@@ -2,6 +2,7 @@ package protect.card_locker;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -16,7 +17,7 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
Settings mSettings;
private final Context mContext;
private final GroupAdapterListener mListener;
DBHelper mDb;
SQLiteDatabase mDatabase;
public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupAdapterListener inputListener) {
super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER);
@@ -24,7 +25,7 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
mSettings = new Settings(inputContext);
mContext = inputContext.getApplicationContext();
mListener = inputListener;
mDb = new DBHelper(inputContext);
mDatabase = new DBHelper(inputContext).getReadableDatabase();
swapCursor(inputCursor);
}
@@ -41,7 +42,7 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
inputHolder.mName.setText(group._id);
int groupCardCount = mDb.getGroupCardCount(group._id);
int groupCardCount = DBHelper.getGroupCardCount(mDatabase, group._id);
inputHolder.mCardCount.setText(mContext.getResources().getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount));
inputHolder.mName.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));

View File

@@ -1,7 +1,10 @@
package protect.card_locker;
import android.Manifest;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -22,6 +25,7 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;
import java.io.FileInputStream;
@@ -54,6 +58,12 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
final private TaskHandler mTasks = new TaskHandler();
private NotificationManager mNotifyManager;
private NotificationCompat.Builder mBuilder;
private static final int NOTIFICATION_IMPORT = 1;
private static final int NOTIFICATION_EXPORT = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -94,7 +104,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
try {
OutputStream writer = getContentResolver().openOutputStream(uri);
Log.e(TAG, "Starting file export with: " + result.toString());
startExport(writer, uri, exportPassword.toCharArray(), true);
startExport(writer, uri, exportPassword != null ? exportPassword.toCharArray() : null, true);
} catch (IOException e) {
Log.e(TAG, "Failed to export file: " + result.toString(), e);
onExportComplete(ImportExportResult.GenericFailure, uri);
@@ -256,22 +266,59 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
builder.show();
}
private void startProgressNotification(boolean importing) {
mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this, NotificationType.getImportExportChannel(this));
mBuilder.setContentTitle(getString(importing ? R.string.importing : R.string.exporting))
.setContentText(null)
.setSmallIcon(R.drawable.ic_import_export_white_24dp)
.setColor(getThemeColor())
.setProgress(0, 0, true);
mNotifyManager.notify(importing ? NOTIFICATION_IMPORT : NOTIFICATION_EXPORT, mBuilder.build());
}
private void endProgressNotification(boolean importing, ImportExportResult result, PendingIntent sendIntent) {
String notificationTitle;
String notificationMessage;
if (result.equals(ImportExportResult.Success)) {
notificationTitle = getString(importing ? R.string.importSuccessfulTitle : R.string.exportSuccessfulTitle);
notificationMessage = getString(importing ? R.string.importSuccessful : R.string.exportSuccessful);
} else {
int reason = R.string.unknown_failure;
if (result.equals(ImportExportResult.BadPassword)) {
reason = R.string.incorrect_password;
}
notificationTitle = getString(importing ? R.string.importFailedTitle : R.string.exportFailedTitle);
notificationMessage = String.format(getString(importing ? R.string.importFailed : R.string.exportFailed), getString(reason));
}
mBuilder.setContentTitle(notificationTitle)
.setContentText(notificationMessage)
.setProgress(0,0, false);
if (sendIntent != null) {
mBuilder.addAction(R.drawable.ic_share, getString(R.string.sendLabel), sendIntent);
}
mNotifyManager.notify(importing ? NOTIFICATION_IMPORT : NOTIFICATION_EXPORT, mBuilder.build());
}
private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password, final boolean closeWhenDone) {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() {
@Override
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
onImportComplete(result, targetUri, dataFormat);
if (closeWhenDone) {
try {
target.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
ImportExportTask.TaskCompleteListener listener = (result, dataFormat1) -> {
onImportComplete(result, targetUri, dataFormat1);
if (closeWhenDone) {
try {
target.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
};
startProgressNotification(true);
importExporter = new ImportExportTask(ImportExportActivity.this,
dataFormat, target, password, listener);
mTasks.executeTask(TaskHandler.TYPE.IMPORT, importExporter);
@@ -279,20 +326,18 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
private void startExport(final OutputStream target, final Uri targetUri, char[] password, final boolean closeWhenDone) {
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false);
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() {
@Override
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
onExportComplete(result, targetUri);
if (closeWhenDone) {
try {
target.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
ImportExportTask.TaskCompleteListener listener = (result, dataFormat) -> {
onExportComplete(result, targetUri);
if (closeWhenDone) {
try {
target.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
};
startProgressNotification(false);
importExporter = new ImportExportTask(ImportExportActivity.this,
DataFormat.Catima, target, password, listener);
mTasks.executeTask(TaskHandler.TYPE.EXPORT, importExporter);
@@ -358,72 +403,27 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
}
private void onImportComplete(ImportExportResult result, Uri path, DataFormat dataFormat) {
endProgressNotification(true, result, null);
if (result == ImportExportResult.BadPassword) {
retryWithPassword(dataFormat, path);
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
int messageId;
if (result == ImportExportResult.Success) {
builder.setTitle(R.string.importSuccessfulTitle);
messageId = R.string.importSuccessful;
} else {
builder.setTitle(R.string.importFailedTitle);
messageId = R.string.importFailed;
}
final String message = getResources().getString(messageId);
builder.setMessage(message);
builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
private void onExportComplete(ImportExportResult result, final Uri path) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
int messageId;
PendingIntent pendingIntent = null;
if (result == ImportExportResult.Success) {
builder.setTitle(R.string.exportSuccessfulTitle);
messageId = R.string.exportSuccessful;
} else {
builder.setTitle(R.string.exportFailedTitle);
messageId = R.string.exportFailed;
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, path);
sendIntent.setType("text/csv");
// set flag to give temporary permission to external app to use the FileProvider
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
pendingIntent = PendingIntent.getActivity(this, NOTIFICATION_EXPORT, sendIntent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
final String message = getResources().getString(messageId);
builder.setMessage(message);
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
if (result == ImportExportResult.Success) {
final CharSequence sendLabel = ImportExportActivity.this.getResources().getText(R.string.sendLabel);
builder.setPositiveButton(sendLabel, (dialog, which) -> {
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, path);
sendIntent.setType("text/csv");
// set flag to give temporary permission to external app to use the FileProvider
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
ImportExportActivity.this.startActivity(Intent.createChooser(sendIntent,
sendLabel));
dialog.dismiss();
});
}
builder.create().show();
endProgressNotification(false, result, pendingIntent);
}
}

View File

@@ -1,9 +1,10 @@
package protect.card_locker;
import android.app.Activity;
import android.app.ProgressDialog;
import android.app.NotificationManager;
import android.content.Context;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.io.IOException;
@@ -12,6 +13,7 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import androidx.core.app.NotificationCompat;
import protect.card_locker.async.CompatCallable;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
@@ -21,15 +23,13 @@ import protect.card_locker.importexport.MultiFormatImporter;
public class ImportExportTask implements CompatCallable<ImportExportResult> {
private static final String TAG = "Catima";
private Activity activity;
private boolean doImport;
private DataFormat format;
private final Activity activity;
private final boolean doImport;
private final DataFormat format;
private OutputStream outputStream;
private InputStream inputStream;
private char[] password;
private TaskCompleteListener listener;
private ProgressDialog progress;
private final char[] password;
private final TaskCompleteListener listener;
/**
* Constructor which will setup a task for exporting to the given file
@@ -59,20 +59,20 @@ public class ImportExportTask implements CompatCallable<ImportExportResult> {
this.listener = listener;
}
private ImportExportResult performImport(Context context, InputStream stream, DBHelper db, char[] password) {
ImportExportResult importResult = MultiFormatImporter.importData(context, db, stream, format, password);
private ImportExportResult performImport(Context context, InputStream stream, SQLiteDatabase database, char[] password) {
ImportExportResult result = MultiFormatImporter.importData(context, database, stream, format, password);
Log.i(TAG, "Import result: " + importResult.name());
Log.i(TAG, "Import result: " + result.name());
return importResult;
return result;
}
private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db, char[] password) {
private ImportExportResult performExport(Context context, OutputStream stream, SQLiteDatabase database, char[] password) {
ImportExportResult result = ImportExportResult.GenericFailure;
try {
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
result = MultiFormatExporter.exportData(context, db, stream, format, password);
result = MultiFormatExporter.exportData(context, database, stream, format, password);
writer.close();
} catch (IOException e) {
Log.e(TAG, "Unable to export file", e);
@@ -83,43 +83,31 @@ public class ImportExportTask implements CompatCallable<ImportExportResult> {
return result;
}
public void onPreExecute() {
progress = new ProgressDialog(activity);
progress.setTitle(doImport ? R.string.importing : R.string.exporting);
progress.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
ImportExportTask.this.stop();
}
});
progress.show();
}
protected ImportExportResult doInBackground(Void... nothing) {
final DBHelper db = new DBHelper(activity);
final SQLiteDatabase database = new DBHelper(activity).getWritableDatabase();
ImportExportResult result;
if (doImport) {
result = performImport(activity.getApplicationContext(), inputStream, db, password);
result = performImport(activity.getApplicationContext(), inputStream, database, password);
} else {
result = performExport(activity.getApplicationContext(), outputStream, db, password);
result = performExport(activity.getApplicationContext(), outputStream, database, password);
}
database.close();
return result;
}
public void onPostExecute(Object castResult) {
listener.onTaskComplete((ImportExportResult) castResult, format);
ImportExportResult result = (ImportExportResult) castResult;
listener.onTaskComplete(result, format);
progress.dismiss();
Log.i(TAG, (doImport ? "Import" : "Export") + " Complete");
}
protected void onCancelled() {
progress.dismiss();
Log.i(TAG, (doImport ? "Import" : "Export") + " Cancelled");
@Override
public void onPreExecute() {
}
protected void stop() {

View File

@@ -15,6 +15,7 @@ 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;
@@ -25,6 +26,8 @@ import com.google.android.material.card.MaterialCardView;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Currency;
import java.util.Date;
import protect.card_locker.preferences.Settings;
@@ -77,57 +80,25 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
// Invisible until we want to show something more
inputHolder.mDivider.setVisibility(View.GONE);
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
if (mDarkModeEnabled) {
inputHolder.mStarIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor);
inputHolder.mStoreField.setText(loyaltyCard.store);
inputHolder.mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
inputHolder.setStoreField(loyaltyCard.store);
if (mShowDetails && !loyaltyCard.note.isEmpty()) {
inputHolder.mNoteField.setVisibility(View.VISIBLE);
inputHolder.mNoteField.setText(loyaltyCard.note);
inputHolder.mNoteField.setTextSize(size);
inputHolder.setNoteField(loyaltyCard.note);
} else {
inputHolder.mNoteField.setVisibility(View.GONE);
inputHolder.setNoteField(null);
}
if (mShowDetails && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
int drawableSize = dpToPx((size * 24) / 14, mContext);
inputHolder.mDivider.setVisibility(View.VISIBLE);
inputHolder.mBalanceField.setVisibility(View.VISIBLE);
Drawable balanceIcon = inputHolder.mBalanceField.getCompoundDrawables()[0];
balanceIcon.setBounds(0, 0, drawableSize, drawableSize);
inputHolder.mBalanceField.setCompoundDrawablesRelative(balanceIcon, null, null, null);
if (mDarkModeEnabled) {
balanceIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
inputHolder.mBalanceField.setText(Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType));
inputHolder.mBalanceField.setTextSize(size);
inputHolder.setBalanceField(loyaltyCard.balance, loyaltyCard.balanceType);
} else {
inputHolder.mBalanceField.setVisibility(View.GONE);
inputHolder.setBalanceField(null, null);
}
if (mShowDetails && loyaltyCard.expiry != null) {
int drawableSize = dpToPx((size * 24) / 14, mContext);
inputHolder.mDivider.setVisibility(View.VISIBLE);
inputHolder.mExpiryField.setVisibility(View.VISIBLE);
Drawable expiryIcon = inputHolder.mExpiryField.getCompoundDrawables()[0];
expiryIcon.setBounds(0, 0, drawableSize, drawableSize);
inputHolder.mExpiryField.setCompoundDrawablesRelative(expiryIcon, null, null, null);
if (Utils.hasExpired(loyaltyCard.expiry)) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP));
inputHolder.mExpiryField.setTextColor(Color.RED);
} else if (mDarkModeEnabled) {
expiryIcon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.WHITE, BlendModeCompat.SRC_ATOP));
}
inputHolder.mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry));
inputHolder.mExpiryField.setTextSize(size);
inputHolder.setExpiryField(loyaltyCard.expiry);
} else {
inputHolder.mExpiryField.setVisibility(View.GONE);
inputHolder.setExpiryField(null);
}
Bitmap cardIcon = Utils.retrieveCardImage(mContext, loyaltyCard.id, ImageLocationType.icon);
@@ -138,9 +109,9 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.mCardIcon.setImageBitmap(Utils.generateIcon(mContext, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile());
inputHolder.mCardIcon.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
inputHolder.mIconLayout.setBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : ContextCompat.getColor(mContext, R.color.colorPrimary));
inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : ContextCompat.getColor(mContext, R.color.colorPrimary));
inputHolder.mStarIcon.setVisibility(loyaltyCard.starStatus != 0 ? View.VISIBLE : View.GONE);
inputHolder.toggleStar(loyaltyCard.starStatus != 0, itemSelected(inputCursor.getPosition()));
inputHolder.itemView.setActivated(mSelectedItems.get(inputCursor.getPosition(), false));
applyIconAnimation(inputHolder, inputCursor.getPosition());
@@ -160,8 +131,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
});
}
private boolean itemSelected(int inputPosition) {
return mSelectedItems.get(inputPosition, false);
}
private void applyIconAnimation(LoyaltyCardListItemViewHolder inputHolder, int inputPosition) {
if (mSelectedItems.get(inputPosition, false)) {
if (itemSelected(inputPosition)) {
inputHolder.mCardIcon.setVisibility(View.GONE);
inputHolder.mTickIcon.setVisibility(View.VISIBLE);
if (mCurrentSelectedIndex == inputPosition) {
@@ -221,17 +196,19 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
void onRowLongClicked(int inputPosition);
}
public static class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mStoreField, mNoteField, mBalanceField, mExpiryField;
public ImageView mCardIcon, mStarIcon, mTickIcon;
public MaterialCardView mIconLayout, mRow;
public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon;
public MaterialCardView mRow;
public ConstraintLayout mStar;
public View mDivider;
public LoyaltyCardListItemViewHolder(View inputView, CardAdapterListener inputListener) {
private int mIconBackgroundColor;
protected LoyaltyCardListItemViewHolder(View inputView, CardAdapterListener inputListener) {
super(inputView);
mRow = inputView.findViewById(R.id.row);
mIconLayout = inputView.findViewById(R.id.icon_layout);
mDivider = inputView.findViewById(R.id.info_divider);
mStoreField = inputView.findViewById(R.id.store);
mNoteField = inputView.findViewById(R.id.note);
@@ -239,7 +216,9 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mExpiryField = inputView.findViewById(R.id.expiry);
mCardIcon = inputView.findViewById(R.id.thumbnail);
mStarIcon = inputView.findViewById(R.id.star);
mStar = inputView.findViewById(R.id.star);
mStarBackground = inputView.findViewById(R.id.star_background);
mStarBorder = inputView.findViewById(R.id.star_border);
mTickIcon = inputView.findViewById(R.id.selected_thumbnail);
inputView.setOnLongClickListener(view -> {
inputListener.onRowClicked(getAdapterPosition());
@@ -247,6 +226,101 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
return true;
});
}
public void setStoreField(String text) {
mStoreField.setText(text);
mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
mStoreField.requestLayout();
}
public void setNoteField(String text) {
if (text == null) {
mNoteField.setVisibility(View.GONE);
} else {
mNoteField.setVisibility(View.VISIBLE);
mNoteField.setText(text);
mNoteField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
}
mNoteField.requestLayout();
}
public void setBalanceField(BigDecimal balance, Currency balanceType) {
if (balance == null) {
mBalanceField.setVisibility(View.GONE);
} else {
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
int drawableSize = dpToPx((size * 24) / 14, mContext);
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));
}
mBalanceField.setText(Utils.formatBalance(mContext, balance, balanceType));
mBalanceField.setTextSize(size);
}
mBalanceField.requestLayout();
}
public void setExpiryField(Date expiry) {
if (expiry == null) {
mExpiryField.setVisibility(View.GONE);
} else {
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
int drawableSize = dpToPx((size * 24) / 14, mContext);
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));
}
mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(expiry));
mExpiryField.setTextSize(size);
}
mExpiryField.requestLayout();
}
public void toggleStar(boolean enable, boolean colorByTheme) {
/* the below code does not work in android 5! hence the change of drawable instead
boolean needDarkForeground = Utils.needsDarkForeground(mIconBackgroundColor);
Drawable borderDrawable = mStarBorder.getDrawable().mutate();
Drawable backgroundDrawable = mStarBackground.getDrawable().mutate();
DrawableCompat.setTint(borderDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
DrawableCompat.setTint(backgroundDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
mStarBorder.setImageDrawable(borderDrawable);
mStarBackground.setImageDrawable(backgroundDrawable);
*/
boolean dark = Utils.needsDarkForeground(mIconBackgroundColor);
if (colorByTheme) {
dark = !mDarkModeEnabled;
}
if (dark) {
mStarBorder.setImageResource(R.drawable.ic_unstarred_black);
mStarBackground.setImageResource(R.drawable.ic_starred_black);
} else {
mStarBorder.setImageResource(R.drawable.ic_unstarred_white);
mStarBackground.setImageResource(R.drawable.ic_starred_white);
}
if (enable) {
mStar.setVisibility(View.VISIBLE);
} else {
mStar.setVisibility(View.GONE);
}
mStarBorder.invalidate();
mStarBackground.invalidate();
}
public void setIconBackgroundColor(int color) {
mIconBackgroundColor = color;
mCardIcon.setBackgroundColor(color);
}
}
public int dpToPx(int dp, Context mContext) {

View File

@@ -9,6 +9,7 @@ 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;
import android.graphics.Color;
@@ -73,6 +74,7 @@ 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 {
@@ -141,7 +143,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
Uri importLoyaltyCardUri = null;
DBHelper db;
SQLiteDatabase mDatabase;
ImportURIHelper importUriHelper;
boolean hasChanged = false;
@@ -176,6 +178,16 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
final private TaskHandler mTasks = new TaskHandler();
// store system locale for Build.VERSION.SDK_INT < Build.VERSION_CODES.N
private Locale mSystemLocale;
@Override
protected void attachBaseContext(Context base) {
// store system locale
mSystemLocale = Locale.getDefault();
super.attachBaseContext(base);
}
private static LoyaltyCard updateTempState(LoyaltyCard loyaltyCard, LoyaltyCardField fieldName, Object value) {
return new LoyaltyCard(
(int) (fieldName == LoyaltyCardField.id ? value : loyaltyCard.id),
@@ -281,9 +293,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
actionBar.setDisplayHomeAsUpEnabled(true);
}
mDatabase = new DBHelper(this).getWritableDatabase();
extractIntentFields(getIntent());
db = new DBHelper(this);
importUriHelper = new ImportURIHelper(this);
for (Currency currency : Currency.getAvailableCurrencies()) {
@@ -426,14 +439,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList locales = getApplicationContext().getResources().getConfiguration().getLocales();
for (int i = locales.size() - 1; i > 0; i--) {
for (int i = locales.size() - 1; i >= 0; i--) {
Locale locale = locales.get(i);
String currencySymbol = Currency.getInstance(locale).getSymbol();
currencyList.remove(currencySymbol);
currencyList.add(0, currencySymbol);
}
} else {
String currencySymbol = Currency.getInstance(getApplicationContext().getResources().getConfiguration().locale).getSymbol();
String currencySymbol = Currency.getInstance(mSystemLocale).getSymbol();
currencyList.remove(currencySymbol);
currencyList.add(0, currencySymbol);
}
@@ -729,7 +742,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
if (tempLoyaltyCard == null) {
if (updateLoyaltyCard) {
tempLoyaltyCard = db.getLoyaltyCard(loyaltyCardId);
tempLoyaltyCard = DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId);
if (tempLoyaltyCard == null) {
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
@@ -792,9 +805,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
barcodeTypeField.setText(tempLoyaltyCard.barcodeType != null ? tempLoyaltyCard.barcodeType.prettyName() : getString(R.string.noBarcode));
if (groupsChips.getChildCount() == 0) {
List<Group> existingGroups = db.getGroups();
List<Group> existingGroups = DBHelper.getGroups(mDatabase);
List<Group> loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId);
List<Group> loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, loyaltyCardId);
if (existingGroups.isEmpty()) {
groupsChips.setVisibility(View.GONE);
@@ -802,7 +815,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
groupsChips.setVisibility(View.VISIBLE);
}
for (Group group : db.getGroups()) {
for (Group group : DBHelper.getGroups(mDatabase)) {
Chip chip = (Chip) getLayoutInflater().inflate(R.layout.layout_chip_choice, groupsChips, false);
chip.setText(group._id);
chip.setTag(group);
@@ -1258,7 +1271,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
if (updateLoyaltyCard) { //update of "starStatus" not necessary, since it cannot be changed in this activity (only in ViewActivity)
db.updateLoyaltyCard(loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor);
DBHelper.updateLoyaltyCard(mDatabase, loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor);
try {
Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, ImageLocationType.front);
Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, ImageLocationType.back);
@@ -1268,7 +1281,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId);
} else {
loyaltyCardId = (int) db.insertLoyaltyCard(tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, tempLoyaltyCard.lastUsed);
loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, tempLoyaltyCard.lastUsed);
try {
Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, ImageLocationType.front);
Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, ImageLocationType.back);
@@ -1278,9 +1291,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
}
db.setLoyaltyCardGroups(loyaltyCardId, selectedGroups);
DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, selectedGroups);
ShortcutHelper.updateShortcuts(this, db.getLoyaltyCard(loyaltyCardId));
ShortcutHelper.updateShortcuts(this, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId));
finish();
}
@@ -1312,8 +1325,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
Log.e(TAG, "Deleting card: " + loyaltyCardId);
DBHelper db = new DBHelper(LoyaltyCardEditActivity.this);
db.deleteLoyaltyCard(LoyaltyCardEditActivity.this, loyaltyCardId);
DBHelper.deleteLoyaltyCard(mDatabase, LoyaltyCardEditActivity.this, loyaltyCardId);
ShortcutHelper.removeShortcut(LoyaltyCardEditActivity.this, loyaltyCardId);

View File

@@ -3,6 +3,7 @@ package protect.card_locker;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Outline;
@@ -84,7 +85,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
int loyaltyCardId;
LoyaltyCard loyaltyCard;
boolean rotationEnabled;
DBHelper db;
SQLiteDatabase database;
ImportURIHelper importURIHelper;
Settings settings;
@@ -257,7 +258,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
setContentView(R.layout.loyalty_card_view_layout);
db = new DBHelper(this);
database = new DBHelper(this).getWritableDatabase();
importURIHelper = new ImportURIHelper(this);
coordinatorLayout = findViewById(R.id.coordinator_layout);
@@ -297,7 +298,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
Log.d(TAG, "Scaling to " + scale);
loyaltyCard.zoomLevel = progress;
db.updateLoyaltyCardZoomLevel(loyaltyCardId, loyaltyCard.zoomLevel);
DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel);
setCenterGuideline(loyaltyCard.zoomLevel);
@@ -466,7 +467,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
window.setAttributes(attributes);
}
loyaltyCard = db.getLoyaltyCard(loyaltyCardId);
loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId);
if (loyaltyCard == null) {
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
@@ -493,7 +494,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
noteView.setVisibility(View.GONE);
}
List<Group> loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId);
List<Group> loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId);
if (loyaltyCardGroups.size() > 0) {
List<String> groupNames = new ArrayList<>();
@@ -640,7 +641,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// restore bottomSheet UI states from changing orientation
changeUiToBottomSheetState(bottomSheetState);
db.updateLoyaltyCardLastUsed(loyaltyCard.id);
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
}
@Override
@@ -665,7 +666,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
item.setVisible(false);
}
loyaltyCard = db.getLoyaltyCard(loyaltyCardId);
loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId);
starred = loyaltyCard.starStatus != 0;
menu.findItem(R.id.action_share).setIcon(getIcon(R.drawable.ic_share_white, backgroundNeedsDarkIcons));
@@ -716,7 +717,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
case R.id.action_star_unstar:
starred = !starred;
db.updateLoyaltyCardStarStatus(loyaltyCardId, starred ? 1 : 0);
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0);
invalidateOptionsMenu();
return true;
}

View File

@@ -1,13 +1,14 @@
package protect.card_locker;
import android.app.Activity;
import android.app.SearchManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.CursorIndexOutOfBoundsException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
@@ -18,14 +19,6 @@ 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.AlertDialog;
@@ -35,12 +28,21 @@ import androidx.appcompat.widget.Toolbar;
import androidx.core.splashscreen.SplashScreen;
import androidx.recyclerview.widget.RecyclerView;
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 protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener {
private static final String TAG = "Catima";
public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent";
private final DBHelper mDB = new DBHelper(this);
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
private ActionMode mCurrentActionMode;
private SearchView mSearchView;
@@ -56,6 +58,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
private View mNoGroupCardsText;
private ActivityResultLauncher<Intent> mBarcodeScannerLauncher;
private ActivityResultLauncher<Intent> mSettingsLauncher;
private ActionMode.Callback mCurrentActionModeCallback = new ActionMode.Callback() {
@Override
@@ -142,7 +145,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.e(TAG, "Deleting card: " + loyaltyCard.id);
db.deleteLoyaltyCard(MainActivity.this, loyaltyCard.id);
DBHelper.deleteLoyaltyCard(mDatabase, MainActivity.this, loyaltyCard.id);
ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id);
}
@@ -180,6 +183,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDatabase = new DBHelper(this).getWritableDatabase();
TabLayout groupsTabLayout = findViewById(R.id.groups);
groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
@@ -277,6 +282,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
startActivity(newIntent);
}
});
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
Intent intent = result.getData();
if (intent != null && intent.getBooleanExtra(RESTART_ACTIVITY_INTENT, false)) {
recreate();
}
}
});
}
@Override
@@ -354,9 +368,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
group = (Group) mGroup;
}
mAdapter.swapCursor(mDB.getLoyaltyCardCursor(mFilter, group, mOrder, mOrderDirection));
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase, mFilter, group, mOrder, mOrderDirection));
if (mDB.getLoyaltyCardCount() > 0) {
if (DBHelper.getLoyaltyCardCount(mDatabase) > 0) {
// We want the cardList to be visible regardless of the filtered match count
// to ensure that the noMatchingCardsText doesn't end up being shown below
// the keyboard
@@ -390,9 +404,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
public void updateTabGroups(TabLayout groupsTabLayout) {
final DBHelper db = new DBHelper(this);
List<Group> newGroups = db.getGroups();
List<Group> newGroups = DBHelper.getGroups(mDatabase);
if (newGroups.size() == 0) {
groupsTabLayout.removeAllTabs();
@@ -528,7 +540,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
if (id == R.id.action_settings) {
Intent i = new Intent(getApplicationContext(), SettingsActivity.class);
startActivity(i);
mSettingsLauncher.launch(i);
return true;
}

View File

@@ -2,6 +2,7 @@ package protect.card_locker;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
@@ -25,7 +26,7 @@ import androidx.recyclerview.widget.RecyclerView;
public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener {
private final DBHelper mDB = new DBHelper(this);
private SQLiteDatabase mDatabase;
private ManageGroupCursorAdapter mAdapter;
private final String SAVE_INSTANCE_ADAPTER_STATE = "adapterState";
@@ -45,6 +46,8 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDatabase = new DBHelper(this).getWritableDatabase();
mHelpText = findViewById(R.id.helpText);
mCardList = findViewById(R.id.list);
FloatingActionButton saveButton = findViewById(R.id.fabSave);
@@ -70,7 +73,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
return;
}
if (!mGroup._id.equals(currentGroupName)) {
if (mDB.getGroup(currentGroupName) != null) {
if (DBHelper.getGroup(mDatabase, currentGroupName) != null) {
mGroupNameNotInUse = false;
mGroupNameText.setError(getResources().getText(R.string.group_name_already_in_use));
} else {
@@ -86,7 +89,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
throw (new IllegalArgumentException("this activity expects a group loaded into it's intent"));
}
Log.d("groupId", "groupId: " + groupId);
mGroup = mDB.getGroup(groupId);
mGroup = DBHelper.getGroup(mDatabase, groupId);
if (mGroup == null) {
throw (new IllegalArgumentException("cannot load group " + groupId + " from database"));
}
@@ -123,7 +126,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
mAdapter.commitToDatabase();
if (!currentGroupName.equals(mGroup._id)) {
mDB.updateGroup(mGroup._id, currentGroupName);
DBHelper.updateGroup(mDatabase, mGroup._id, currentGroupName);
}
Toast.makeText(getApplicationContext(), R.string.group_updated, Toast.LENGTH_SHORT).show();
finish();
@@ -163,7 +166,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
}
private void updateLoyaltyCardList() {
mAdapter.swapCursor(mDB.getLoyaltyCardCursor());
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase));
if (mAdapter.getItemCount() == 0) {
mCardList.setVisibility(View.GONE);
@@ -205,7 +208,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
@Override
public void onRowLongClicked(int inputPosition) {
// do nothing for now
mAdapter.toggleSelection(inputPosition);
}
@Override

View File

@@ -2,6 +2,7 @@ package protect.card_locker;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.HashMap;
import java.util.List;
@@ -13,13 +14,13 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
private HashMap<Integer, Boolean> mIsLoyaltyCardInGroupCache;
private HashMap<Integer, List<Group>> mGetGroupCache;
final private Group mGroup;
final private DBHelper mDb;
final private SQLiteDatabase mDatabase;
public ManageGroupCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener, Group group) {
super(inputContext, inputCursor, inputListener);
mGroup = new Group(group._id, group.order);
mInGroupOverlay = new HashMap<>();
mDb = new DBHelper(inputContext);
mDatabase = new DBHelper(inputContext).getWritableDatabase();
}
@Override
@@ -47,7 +48,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
if (cache != null) {
return cache;
}
List<Group> groups = mDb.getLoyaltyCardGroups(cardId);
List<Group> groups = DBHelper.getLoyaltyCardGroups(mDatabase, cardId);
mGetGroupCache.put(cardId, groups);
return groups;
}
@@ -94,7 +95,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
} else {
groups.remove(mGroup);
}
mDb.setLoyaltyCardGroups(cardId, groups);
DBHelper.setLoyaltyCardGroups(mDatabase, cardId, groups);
}
}

View File

@@ -3,6 +3,7 @@ package protect.card_locker;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
@@ -26,7 +27,7 @@ import androidx.recyclerview.widget.RecyclerView;
public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener {
private static final String TAG = "Catima";
private final DBHelper mDb = new DBHelper(this);
private SQLiteDatabase mDatabase;
private TextView mHelpText;
private RecyclerView mGroupList;
GroupCursorAdapter mAdapter;
@@ -42,6 +43,8 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
mDatabase = new DBHelper(this).getWritableDatabase();
}
@Override
@@ -72,9 +75,9 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
}
private void updateGroupList() {
mAdapter.swapCursor(mDb.getGroupCursor());
mAdapter.swapCursor(DBHelper.getGroupCursor(mDatabase));
if (mDb.getGroupCount() == 0) {
if (DBHelper.getGroupCount(mDatabase) == 0) {
mGroupList.setVisibility(View.GONE);
mHelpText.setVisibility(View.VISIBLE);
@@ -118,11 +121,11 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
Toast.makeText(getApplicationContext(), R.string.group_name_is_empty, Toast.LENGTH_SHORT).show();
return;
}
if (mDb.getGroup(inputString) != null) {
if (DBHelper.getGroup(mDatabase, inputString) != null) {
Toast.makeText(getApplicationContext(), R.string.group_name_already_in_use, Toast.LENGTH_SHORT).show();
return;
}
mDb.insertGroup(inputString);
DBHelper.insertGroup(mDatabase, inputString);
updateGroupList();
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
@@ -138,10 +141,10 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
}
private void moveGroup(View view, boolean up) {
List<Group> groups = mDb.getGroups();
List<Group> groups = DBHelper.getGroups(mDatabase);
final String groupName = getGroupName(view);
int currentIndex = mDb.getGroup(groupName).order;
int currentIndex = DBHelper.getGroup(mDatabase, groupName).order;
int newIndex;
// Reinsert group in correct position
@@ -160,7 +163,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
groups.add(newIndex, group);
// Update database
mDb.reorderGroups(groups);
DBHelper.reorderGroups(mDatabase, groups);
// Update UI
updateGroupList();
@@ -195,7 +198,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
builder.setMessage(groupName);
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
mDb.deleteGroup(groupName);
DBHelper.deleteGroup(mDatabase, groupName);
updateGroupList();
// Delete may change ordering, so invalidate
invalidateHomescreenActiveTab();

View File

@@ -0,0 +1,29 @@
package protect.card_locker;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;
public class NotificationType {
private final static String NOTIFICATION_IMPORT_EXPORT = "NOTIFICATION_IMPORT_EXPORT";
public static String getImportExportChannel(Context context) {
createNotificationChannel(context, NOTIFICATION_IMPORT_EXPORT, context.getString(R.string.importExport), context.getString(R.string.importExportDescription), NotificationManager.IMPORTANCE_HIGH);
return NOTIFICATION_IMPORT_EXPORT;
}
private static void createNotificationChannel(Context context, String channelId, CharSequence name, String description, int importance) {
// Create the NotificationType, but only on API 26+ because
// the NotificationType class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
}

View File

@@ -2,6 +2,7 @@ package protect.card_locker;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -45,7 +46,7 @@ class ShortcutHelper {
static void updateShortcuts(Context context, LoyaltyCard card) {
LinkedList<ShortcutInfoCompat> list = new LinkedList<>(ShortcutManagerCompat.getDynamicShortcuts(context));
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase database = new DBHelper(context).getReadableDatabase();
String shortcutId = Integer.toString(card.id);
@@ -88,7 +89,7 @@ class ShortcutHelper {
for (int index = 0; index < list.size(); index++) {
ShortcutInfoCompat prevShortcut = list.get(index);
LoyaltyCard loyaltyCard = dbHelper.getLoyaltyCard(Integer.parseInt(prevShortcut.getId()));
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(database, Integer.parseInt(prevShortcut.getId()));
ShortcutInfoCompat updatedShortcut = createShortcutBuilder(context, loyaltyCard)
.setRank(index)

View File

@@ -2,6 +2,7 @@ package protect.card_locker.importexport;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import net.lingala.zip4j.io.outputstream.ZipOutputStream;
@@ -31,7 +32,7 @@ import protect.card_locker.Utils;
* format.
*/
public class CatimaExporter implements Exporter {
public void exportData(Context context, DBHelper db, OutputStream output, char[] password) throws IOException, InterruptedException {
public void exportData(Context context, SQLiteDatabase database, OutputStream output, char[] password) throws IOException, InterruptedException {
// Necessary vars
int readLen;
byte[] readBuffer = new byte[InternalZipConstants.BUFF_SIZE];
@@ -48,7 +49,7 @@ public class CatimaExporter implements Exporter {
// Generate CSV
ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream();
OutputStreamWriter catimaOutputStreamWriter = new OutputStreamWriter(catimaOutputStream, StandardCharsets.UTF_8);
writeCSV(db, catimaOutputStreamWriter);
writeCSV(database, catimaOutputStreamWriter);
// Add CSV to zip file
ZipParameters csvZipParameters = createZipParameters("catima.csv", password);
@@ -60,7 +61,7 @@ public class CatimaExporter implements Exporter {
zipOutputStream.closeEntry();
// Loop over all cards again
Cursor cardCursor = db.getLoyaltyCardCursor();
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
while (cardCursor.moveToNext()) {
// For each card
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor);
@@ -94,7 +95,7 @@ public class CatimaExporter implements Exporter {
return zipParameters;
}
private void writeCSV(DBHelper db, OutputStreamWriter output) throws IOException, InterruptedException {
private void writeCSV(SQLiteDatabase database, OutputStreamWriter output) throws IOException, InterruptedException {
CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180);
// Print the version
@@ -105,7 +106,7 @@ public class CatimaExporter implements Exporter {
// Print the header for groups
printer.printRecord(DBHelper.LoyaltyCardDbGroups.ID);
Cursor groupCursor = db.getGroupCursor();
Cursor groupCursor = DBHelper.getGroupCursor(database);
while (groupCursor.moveToNext()) {
Group group = Group.toGroup(groupCursor);
@@ -136,7 +137,7 @@ public class CatimaExporter implements Exporter {
DBHelper.LoyaltyCardDbIds.STAR_STATUS,
DBHelper.LoyaltyCardDbIds.LAST_USED);
Cursor cardCursor = db.getLoyaltyCardCursor();
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
while (cardCursor.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor);
@@ -168,12 +169,12 @@ public class CatimaExporter implements Exporter {
printer.printRecord(DBHelper.LoyaltyCardDbIdsGroups.cardID,
DBHelper.LoyaltyCardDbIdsGroups.groupID);
Cursor cardCursor2 = db.getLoyaltyCardCursor();
Cursor cardCursor2 = DBHelper.getLoyaltyCardCursor(database);
while (cardCursor2.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor2);
for (Group group : db.getLoyaltyCardGroups(card.id)) {
for (Group group : DBHelper.getLoyaltyCardGroups(database, card.id)) {
printer.printRecord(card.id, group._id);
}

View File

@@ -40,7 +40,7 @@ import protect.card_locker.ZipUtils;
* A header is expected for the each table showing the names of the columns.
*/
public class CatimaImporter implements Importer {
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, InterruptedException {
InputStream bufferedInputStream = new BufferedInputStream(input);
bufferedInputStream.mark(100);
@@ -55,7 +55,7 @@ public class CatimaImporter implements Importer {
String fileName = Uri.parse(localFileHeader.getFileName()).getLastPathSegment();
if (fileName.equals("catima.csv")) {
importCSV(context, db, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8)));
importCSV(context, database, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8)));
} else if (fileName.endsWith(".png")) {
Utils.saveCardImage(context, ZipUtils.readImage(zipInputStream), fileName);
} else {
@@ -66,11 +66,11 @@ public class CatimaImporter implements Importer {
if (!isZipFile) {
// This is not a zip file, try importing as bare CSV
bufferedInputStream.reset();
importCSV(context, db, bufferedInputStream);
importCSV(context, database, bufferedInputStream);
}
}
public void importCSV(Context context, DBHelper db, InputStream input) throws IOException, FormatException, InterruptedException {
public void importCSV(Context context, SQLiteDatabase database, InputStream input) throws IOException, FormatException, InterruptedException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
bufferedReader.mark(100);
@@ -87,10 +87,10 @@ public class CatimaImporter implements Importer {
switch (version) {
case 1:
parseV1(context, db, bufferedReader);
parseV1(context, database, bufferedReader);
break;
case 2:
parseV2(context, db, bufferedReader);
parseV2(context, database, bufferedReader);
break;
default:
throw new FormatException(String.format("No code to parse version %s", version));
@@ -99,15 +99,12 @@ public class CatimaImporter implements Importer {
bufferedReader.close();
}
public void parseV1(Context context, DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException {
public void parseV1(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
final CSVParser parser = new CSVParser(input, CSVFormat.RFC4180.builder().setHeader().build());
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
try {
for (CSVRecord record : parser) {
importLoyaltyCard(context, database, db, record);
importLoyaltyCard(context, database, record);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
@@ -115,19 +112,12 @@ public class CatimaImporter implements Importer {
}
parser.close();
database.setTransactionSuccessful();
} catch (IllegalArgumentException | IllegalStateException e) {
throw new FormatException("Issue parsing CSV data", e);
} finally {
database.endTransaction();
database.close();
}
}
public void parseV2(Context context, DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException {
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
public void parseV2(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
Integer part = 0;
String stringPart = "";
@@ -145,7 +135,7 @@ public class CatimaImporter implements Importer {
break;
case 1:
try {
parseV2Groups(db, database, stringPart);
parseV2Groups(database, stringPart);
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -153,7 +143,7 @@ public class CatimaImporter implements Importer {
break;
case 2:
try {
parseV2Cards(context, db, database, stringPart);
parseV2Cards(context, database, stringPart);
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -161,7 +151,7 @@ public class CatimaImporter implements Importer {
break;
case 3:
try {
parseV2CardGroups(db, database, stringPart);
parseV2CardGroups(database, stringPart);
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -185,16 +175,12 @@ public class CatimaImporter implements Importer {
stringPart += tmp + "\n";
}
}
database.setTransactionSuccessful();
} catch (FormatException e) {
throw new FormatException("Issue parsing CSV data", e);
} finally {
database.endTransaction();
database.close();
}
}
public void parseV2Groups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
public void parseV2Groups(SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse groups
final CSVParser groupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
@@ -215,11 +201,11 @@ public class CatimaImporter implements Importer {
}
for (CSVRecord record : records) {
importGroup(database, db, record);
importGroup(database, record);
}
}
public void parseV2Cards(Context context, DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
public void parseV2Cards(Context context, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse cards
final CSVParser cardParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
@@ -240,11 +226,11 @@ public class CatimaImporter implements Importer {
}
for (CSVRecord record : records) {
importLoyaltyCard(context, database, db, record);
importLoyaltyCard(context, database, record);
}
}
public void parseV2CardGroups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
public void parseV2CardGroups(SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse card group mappings
final CSVParser cardGroupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
@@ -265,7 +251,7 @@ public class CatimaImporter implements Importer {
}
for (CSVRecord record : records) {
importCardGroupMapping(database, db, record);
importCardGroupMapping(database, record);
}
}
@@ -273,7 +259,7 @@ public class CatimaImporter implements Importer {
* Import a single loyalty card into the database using the given
* session.
*/
private void importLoyaltyCard(Context context, SQLiteDatabase database, DBHelper helper, CSVRecord record)
private void importLoyaltyCard(Context context, SQLiteDatabase database, CSVRecord record)
throws IOException, FormatException {
int id = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ID, record, false);
@@ -343,31 +329,29 @@ public class CatimaImporter implements Importer {
// We catch this exception so we can still import old backups
}
helper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed);
DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed);
}
/**
* Import a single group into the database using the given
* session.
*/
private void importGroup(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException {
private void importGroup(SQLiteDatabase database, CSVRecord record) throws FormatException {
String id = CSVHelpers.extractString(DBHelper.LoyaltyCardDbGroups.ID, record, null);
helper.insertGroup(database, id);
DBHelper.insertGroup(database, id);
}
/**
* Import a single card to group mapping into the database using the given
* session.
*/
private void importCardGroupMapping(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException {
private void importCardGroupMapping(SQLiteDatabase database, CSVRecord record) throws FormatException {
Integer cardId = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIdsGroups.cardID, record, false);
String groupId = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIdsGroups.groupID, record, null);
List<Group> cardGroups = helper.getLoyaltyCardGroups(cardId);
cardGroups.add(helper.getGroup(groupId));
helper.setLoyaltyCardGroups(database, cardId, cardGroups);
List<Group> cardGroups = DBHelper.getLoyaltyCardGroups(database, cardId);
cardGroups.add(DBHelper.getGroup(database, groupId));
DBHelper.setLoyaltyCardGroups(database, cardId, cardGroups);
}
}

View File

@@ -1,6 +1,7 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import java.io.IOException;
import java.io.OutputStream;
@@ -17,5 +18,5 @@ public interface Exporter {
*
* @throws IOException
*/
void exportData(Context context, DBHelper db, OutputStream output, char[] password) throws IOException, InterruptedException;
void exportData(Context context, SQLiteDatabase database, OutputStream output, char[] password) throws IOException, InterruptedException;
}

View File

@@ -30,7 +30,7 @@ import protect.card_locker.FormatException;
* A header is expected for the each table showing the names of the columns.
*/
public class FidmeImporter implements Importer {
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
// We actually retrieve a .zip file
ZipInputStream zipInputStream = new ZipInputStream(input, password);
@@ -52,14 +52,11 @@ public class FidmeImporter implements Importer {
throw new FormatException("Couldn't find loyalty_programs.csv in zip file or it is empty");
}
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
final CSVParser fidmeParser = new CSVParser(new StringReader(loyaltyCards.toString()), CSVFormat.RFC4180.builder().setDelimiter(';').setHeader().build());
try {
for (CSVRecord record : fidmeParser) {
importLoyaltyCard(database, db, record);
importLoyaltyCard(database, record);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
@@ -71,10 +68,6 @@ public class FidmeImporter implements Importer {
fidmeParser.close();
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
zipInputStream.close();
}
@@ -82,8 +75,8 @@ public class FidmeImporter implements Importer {
* Import a single loyalty card into the database using the given
* session.
*/
private void importLoyaltyCard(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException {
private void importLoyaltyCard(SQLiteDatabase database, CSVRecord record)
throws FormatException {
// A loyalty card export from Fidme contains the following fields:
// Retailer (store name)
// Program (program name)
@@ -129,6 +122,6 @@ public class FidmeImporter implements Importer {
// TODO: Front and back image
helper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus, null);
DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus, null);
}
}

View File

@@ -1,6 +1,7 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import org.json.JSONException;
@@ -8,7 +9,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
/**
@@ -23,5 +23,5 @@ public interface Importer {
* @throws IOException
* @throws FormatException
*/
void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException;
void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException;
}

View File

@@ -1,6 +1,7 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.io.IOException;
@@ -21,7 +22,7 @@ public class MultiFormatExporter {
* another ImportExportResult otherwise. If not Success, partial data may have been
* written to the output stream, and it should be discarded.
*/
public static ImportExportResult exportData(Context context, DBHelper db, OutputStream output, DataFormat format, char[] password) {
public static ImportExportResult exportData(Context context, SQLiteDatabase database, OutputStream output, DataFormat format, char[] password) {
Exporter exporter = null;
switch (format) {
@@ -35,7 +36,7 @@ public class MultiFormatExporter {
if (exporter != null) {
try {
exporter.exportData(context, db, output, password);
exporter.exportData(context, database, output, password);
return ImportExportResult.Success;
} catch (IOException e) {
Log.e(TAG, "Failed to export data", e);

View File

@@ -1,6 +1,7 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import net.lingala.zip4j.exception.ZipException;
@@ -28,7 +29,7 @@ public class MultiFormatImporter {
* or another result otherwise. If no Success, no data was written to
* the database.
*/
public static ImportExportResult importData(Context context, DBHelper db, InputStream input, DataFormat format, char[] password) {
public static ImportExportResult importData(Context context, SQLiteDatabase database, InputStream input, DataFormat format, char[] password) {
Importer importer = null;
switch (format) {
@@ -47,15 +48,18 @@ public class MultiFormatImporter {
}
if (importer != null) {
database.beginTransaction();
try {
importer.importData(context, db, input, password);
importer.importData(context, database, input, password);
database.setTransactionSuccessful();
return ImportExportResult.Success;
} catch (ZipException e) {
return ImportExportResult.BadPassword;
} catch (IOException | FormatException | InterruptedException | JSONException | ParseException | NullPointerException e) {
Log.e(TAG, "Failed to import data", e);
} finally {
database.endTransaction();
}
} else {
Log.e(TAG, "Unsupported data format imported: " + format.name());
}

View File

@@ -39,7 +39,7 @@ import protect.card_locker.ZipUtils;
* A header is expected for the each table showing the names of the columns.
*/
public class StocardImporter implements Importer {
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
HashMap<String, HashMap<String, Object>> loyaltyCardHashMap = new HashMap<>();
HashMap<String, HashMap<String, String>> providers = new HashMap<>();
@@ -153,9 +153,6 @@ public class StocardImporter implements Importer {
throw new FormatException("Couldn't find any loyalty cards in this Stocard export.");
}
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
for (HashMap<String, Object> loyaltyCardData : loyaltyCardHashMap.values()) {
String providerId = (String) loyaltyCardData.get("_providerId");
HashMap<String, String> providerData = providers.get(providerId);
@@ -173,7 +170,7 @@ public class StocardImporter implements Importer {
}
}
long loyaltyCardInternalId = db.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0, null);
long loyaltyCardInternalId = DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0, null);
if (loyaltyCardData.containsKey("frontImage")) {
Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("frontImage"), (int) loyaltyCardInternalId, ImageLocationType.front);
@@ -183,10 +180,6 @@ public class StocardImporter implements Importer {
}
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
zipInputStream.close();
}

View File

@@ -36,7 +36,7 @@ import protect.card_locker.Utils;
* A header is expected for the each table showing the names of the columns.
*/
public class VoucherVaultImporter implements Importer {
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
@@ -46,9 +46,6 @@ public class VoucherVaultImporter implements Importer {
}
JSONArray jsonArray = new JSONArray(sb.toString());
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
// See https://github.com/tim-smart/vouchervault/issues/4#issuecomment-788226503 for more info
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonCard = jsonArray.getJSONObject(i);
@@ -129,13 +126,9 @@ public class VoucherVaultImporter implements Importer {
throw new FormatException("Unknown colour type found: " + colorFromJSON);
}
db.insertLoyaltyCard(store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime());
DBHelper.insertLoyaltyCard(database, store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime());
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
bufferedReader.close();
}
}

View File

@@ -1,30 +1,36 @@
package protect.card_locker.preferences;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.DialogFragment;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import nl.invissvenska.numberpickerpreference.NumberDialogPreference;
import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment;
import protect.card_locker.CatimaAppCompatActivity;
import protect.card_locker.MainActivity;
import protect.card_locker.R;
import protect.card_locker.Utils;
public class SettingsActivity extends CatimaAppCompatActivity {
private final static String RELOAD_MAIN_STATE = "mReloadMain";
private SettingsFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -38,10 +44,21 @@ public class SettingsActivity extends CatimaAppCompatActivity {
}
// Display the fragment as the main content.
SettingsFragment fragment = new SettingsFragment();
fragment = new SettingsFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.settings_container, fragment)
.commit();
// restore reload main state
if (savedInstanceState != null) {
fragment.mReloadMain = savedInstanceState.getBoolean(RELOAD_MAIN_STATE);
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(RELOAD_MAIN_STATE, fragment.mReloadMain);
}
@Override
@@ -49,16 +66,34 @@ public class SettingsActivity extends CatimaAppCompatActivity {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
finishSettingsActivity();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
finishSettingsActivity();
}
private void finishSettingsActivity() {
if (fragment.mReloadMain) {
Intent intent = new Intent();
intent.putExtra(MainActivity.RESTART_ACTIVITY_INTENT, true);
setResult(Activity.RESULT_OK, intent);
} else {
setResult(Activity.RESULT_OK);
}
finish();
}
public static class SettingsFragment extends PreferenceFragmentCompat {
private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment";
public boolean mReloadMain;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
// Load the preferences from an XML resource
@@ -91,32 +126,29 @@ public class SettingsActivity extends CatimaAppCompatActivity {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
return true;
});
Preference colorPreference = findPreference(getResources().getString(R.string.setting_key_theme_color));
assert colorPreference != null;
colorPreference.setOnPreferenceChangeListener((preference, o) -> {
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
refreshActivity(true);
return true;
});
localePreference.setOnPreferenceChangeListener((preference, newValue) -> {
// Refresh the activity
Intent intent = new Intent(getContext(), SettingsActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
getContext().startActivity(intent);
refreshActivity(true);
return true;
});
}
private void refreshActivity(boolean reloadMain) {
mReloadMain = reloadMain || mReloadMain;
Activity activity = getActivity();
if (activity != null) {
activity.recreate();
}
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof NumberDialogPreference) {

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
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,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
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="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
</vector>

View File

@@ -131,6 +131,17 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/translate_sub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp"
android:text="@string/translate_platform"
android:layout_marginEnd="20dp"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/translate_main"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@@ -16,48 +16,72 @@
android:id="@+id/icon_layout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="85.6f:53.98f"
android:outlineProvider="none"
app:cardCornerRadius="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/store">
app:layout_constraintBottom_toTopOf="@+id/store"
app:layout_constraintDimensionRatio="85.6f:53.98f"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/thumbnail"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/thumbnailDescription"
android:scaleType="fitCenter"
android:src="@mipmap/ic_launcher"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/selected_thumbnail"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/thumbnailDescription"
app:srcCompat="@drawable/ic_done"
app:layout_constraintTop_toTopOf="parent"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<ImageView
android:id="@+id/star"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_gravity="end"
app:srcCompat="@drawable/ic_starred_white"
android:contentDescription="@string/starImage"
app:tint="?attr/colorControlNormal"
android:visibility="gone"
tools:visibility="visible"
android:elevation="4dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
app:srcCompat="@drawable/ic_done" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/star"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end">
<ImageView
android:id="@+id/star_background"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_gravity="end"
android:alpha="0.5"
android:contentDescription="@string/starImage"
android:elevation="4dp"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_starred_white"
tools:ignore="ImageContrastCheck" />
<ImageView
android:id="@+id/star_border"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_gravity="end"
android:alpha="0.5"
android:contentDescription="@string/starImage"
android:elevation="4dp"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_unstarred_white"
tools:ignore="ImageContrastCheck" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<TextView

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="1"
android:layout_height="match_parent"
android:layout_width="match_parent" />
</RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -14,6 +14,7 @@ Gediminas Murauskas
Joel A
StoyanDimitrov
Nyatsuki
Altonss
Samantaz Fox
arno-github
Ankit Tiwari
@@ -26,6 +27,7 @@ Michael Moroni
Olivia (Zoe)
betsythefc
waffshappen
sr093906
K. Herbert
Quentin PAGÈS
String E. Fighter
@@ -37,7 +39,6 @@ KovalevArtem
Clonewayx
D. Domig
Diego
sr093906
Jane Kong
Lukas Grassauer
Marnick L'Eau
@@ -51,6 +52,7 @@ phlostically
Aditya Das
Kevin Sicong Jiang
Airat
Andreas Blaser
BMN
Biren
Kasina Dheeraj
@@ -60,11 +62,12 @@ Izzy
Karol Kosek
bittin
Maciej Błędkowski
Marco
Mattia
Michael Gangolf
pbeckmann
Peer Beckmann
QuangDNguyen2211
Quang Nguyen
Reza
Rohan Babbar
Ronak Upadhyay

View File

@@ -106,9 +106,9 @@
<string name="importOptionApplicationButton">Избиране чрез приложение</string>
<string name="importing">Внасяне…</string>
<string name="exporting">Изнасяне…</string>
<string name="exportFailed">Картите не могат да бъдат изнесени</string>
<string name="exportFailed">Картите не могат да бъдат изнесени: <xliff:g>%s</xliff:g></string>
<string name="exportFailedTitle">Грешка при изнасяне</string>
<string name="importFailed">Картите не могат да бъдат внесени</string>
<string name="importFailed">Картите не могат да бъдат внесени: <xliff:g>%s</xliff:g></string>
<string name="importFailedTitle">Грешка при внасяне</string>
<string name="exportSuccessfulTitle">Резултат от изнасяне</string>
<string name="importSuccessfulTitle">Резултат от внасяне</string>

View File

@@ -23,10 +23,10 @@
<string name="importExportHelp">Zálohování karet 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 importovat karty</string>
<string name="importFailed">Nelze importovat karty: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Exportovat</string>
<string name="exportFailedTitle">Export selhal</string>
<string name="exportFailed">Nelze exportovat karty</string>
<string name="exportFailed">Nelze exportovat karty: <xliff:g>%s</xliff:g></string>
<string name="importing">Importuji…</string>
<string name="exporting">Exportuji…</string>
<string name="noExternalStoragePermissionError">Udělit povolení externího úložiště pro import nebo export karet jako první</string>

View File

@@ -41,10 +41,10 @@
<string name="importExportHelp">Hvis du sikkerhedskopierer dine kort, kan du flytte dem til en anden enhed.</string>
<string name="importSuccessfulTitle">Importeret</string>
<string name="importFailedTitle">Import mislykkedes</string>
<string name="importFailed">Kunne ikke importere kort</string>
<string name="importFailed">Kunne ikke importere kort: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Eksporteret</string>
<string name="exportFailedTitle">Eksport mislykkedes</string>
<string name="exportFailed">Kunne ikke eksportere kort</string>
<string name="exportFailed">Kunne ikke eksportere kort: <xliff:g>%s</xliff:g></string>
<string name="importing">Importere…</string>
<string name="exporting">Eksportere…</string>
<string name="settings_dark_theme">Mørk</string>

View File

@@ -3,7 +3,7 @@
<string name="action_search">Suchen</string>
<string name="action_add">Hinzufügen</string>
<string name="noGiftCards">Füge eine Karte mit + hinzu oder importiere welche über das ⋮ Menü.</string>
<string name="noMatchingGiftCards">Nichts gefunden. Versuche, deine Suche zu ändern.</string>
<string name="noMatchingGiftCards">Keine Ergebnisse. Versuche, deine Suche zu ändern.</string>
<string name="storeName">Name</string>
<string name="note">Notiz</string>
<string name="cardId">Kartennummer</string>
@@ -25,20 +25,20 @@
<string name="cardShortcut">Shortcut zu einer Karte</string>
<string name="noCardsMessage">Füge zuerst eine Karte hinzu</string>
<string name="noStoreError">Kein Name eingegeben</string>
<string name="noCardIdError">Keine Kartennummer angegeben</string>
<string name="noCardExistsError">Karte konnte nicht gefunden werden</string>
<string name="noCardIdError">Keine ID eingegeben</string>
<string name="noCardExistsError">Diese Karte konnte nicht gefunden werden</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Durch das Sichern deiner Karten kannst du sie auf ein anderes Gerät übertragen.</string>
<string name="importExportHelp">Wenn du deine Daten sicherst, kannst du sie auf ein anderes Gerät übertragen.</string>
<string name="importSuccessfulTitle">Importiert</string>
<string name="importFailedTitle">Import fehlgeschlagen</string>
<string name="importFailed">Karten konnten nicht importiert werden</string>
<string name="importFailed">Karten konnten nicht importiert werden: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Exportiert</string>
<string name="exportFailedTitle">Export fehlgeschlagen</string>
<string name="exportFailed">Karten konnten nicht exportiert werden</string>
<string name="exportFailed">Karten konnten nicht exportiert werden: <xliff:g>%s</xliff:g></string>
<string name="importing">Importiere…</string>
<string name="exporting">Exportiere…</string>
<string name="noExternalStoragePermissionError">Erlaube Speicherzugriff um Karten zu importieren oder exportieren</string>
<string name="noExternalStoragePermissionError">Berechtigung für den externen Speicher zum Importieren oder Exportieren von Daten erteilen</string>
<string name="importOptionFilesystemTitle">Importiere aus dem Dateisystem</string>
<string name="importOptionFilesystemExplanation">Wähle eine Datei vom Dateisystem aus.</string>
<string name="importOptionFilesystemButton">Wähle vom Dateisystem</string>
@@ -51,39 +51,39 @@
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revisionsinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Barcode auswählen</string>
<string name="copy_to_clipboard_toast">Kartennummer in die Zwischenablage kopiert</string>
<string name="thumbnailDescription">Vorschaubild für die Karte</string>
<string name="copy_to_clipboard_toast">ID in die Zwischenablage kopiert</string>
<string name="thumbnailDescription">Vorschaubild</string>
<string name="settings">Einstellungen</string>
<string name="settings_category_title_ui">Benutzeroberfläche</string>
<string name="settings_display_barcode_max_brightness">Barcodeansicht aufhellen</string>
<string name="settings_lock_barcode_orientation">Barcoderotation sperren</string>
<string name="exportSuccessful">Kartendaten exportiert</string>
<string name="importSuccessful">Kartendaten importiert</string>
<string name="exportSuccessful">Daten exportiert</string>
<string name="importSuccessful">Daten importiert</string>
<string name="intent_import_card_from_url_share_text">Ich würde gerne diese Karte mit dir teilen</string>
<string name="settings_dark_theme">Dunkel</string>
<string name="settings_light_theme">Hell</string>
<string name="settings_system_theme">System</string>
<string name="settings_theme">Farbschema</string>
<string name="enterBarcodeInstructions">Gib die Kartennummer ein und wähle entweder den Barcode-Typ unten oder wähle \"Diese Karte hat keinen Barcode\" aus.</string>
<string name="enterBarcodeInstructions">Gib die ID ein und wähle unten entweder einen Barcodetyp oder „Es gibt keinen Barcode.</string>
<string name="app_copyright_old">Basierend auf Loyalty Card Keychain
\nCopyright © 2016-2020 Branden Archer</string>
<string name="exportOptionExplanation">Die Daten werden an einen Ort deiner Wahl geschrieben.</string>
<string name="failedParsingImportUriError">Die Import-URI konnte nicht verarbeitet werden</string>
<string name="share">Teilen</string>
<string name="barcodeNoBarcode">Diese Karte hat keinen Barcode</string>
<string name="barcodeNoBarcode">Es gibt keinen Barcode</string>
<string name="barcodeType">Barcodetyp</string>
<string name="starImage">Favoritenstern</string>
<string name="deleteConfirmationGroup">Gruppe löschen?</string>
<string name="all">Alle</string>
<string name="noGroups">Klicke auf das Pluszeichen + um eine Gruppe hinzuzufügen.</string>
<string name="noGroupCards">Diese Gruppe hat noch keine Karten</string>
<string name="noGroups">Klicke auf das Pluszeichen +, um eine Gruppe hinzuzufügen.</string>
<string name="noGroupCards">Diese Gruppe ist leer</string>
<string name="groups">Gruppen</string>
<string name="enter_group_name">Gib einen Gruppennamen ein</string>
<string name="leaveWithoutSaveConfirmation">Beenden ohne zu speichern\?</string>
<string name="leaveWithoutSaveTitle">Beenden</string>
<string name="failedOpeningFileManager">Installiere zuerst einen Dateimanager.</string>
<string name="noBarcode">Kein Barcode</string>
<string name="addManually">Kartennummer manuell eingeben</string>
<string name="addManually">ID manuell eingeben</string>
<string name="moveDown">Nach unten verschieben</string>
<string name="moveUp">Nach oben verschieben</string>
<plurals name="groupCardCount">
@@ -116,17 +116,17 @@
\nKEINE DATEN WERDEN GESAMMELT, was jeder bestätigen kann, da unsere Anwendung eine freie Software ist.</string>
<string name="accept">Annehmen</string>
<string name="privacy_policy">Datenschutzrichtlinie</string>
<string name="importVoucherVaultMessage">Wählen Sie Ihren <i>vouchervault.json</i>-Export aus Voucher Vault zum Importieren aus.
\nErstellen Sie ihn, indem Sie zuerst auf Export in Voucher Vault drücken.</string>
<string name="importVoucherVaultMessage">Wähle deinen <i>vouchervault.json</i>-Export aus Voucher Vault zum Importieren aus.
\nErstellen Sie ihn, indem du zuerst auf Export in Voucher Vault drückst.</string>
<string name="importVoucherVault">Aus Voucher Vault importieren</string>
<string name="importLoyaltyCardKeychainMessage">Wählen Sie Ihren <i>LoyaltyCardKeychain.csv</i>-Export aus Loyalty Card Keychain zum Importieren aus.
\nErstellen Sie ihn über das Menü Import/Export in Loyalty Card Keychain, indem Sie dort zuerst auf Export drücken.</string>
<string name="importLoyaltyCardKeychainMessage">Wählen du deinen <i>LoyaltyCardKeychain.csv</i>-Export aus Loyalty Card Keychain zum Importieren aus.
\nErstelle ihn über das Menü Import/Export in Loyalty Card Keychain, indem du dort zuerst auf Export drückst.</string>
<string name="importLoyaltyCardKeychain">Aus Loyalty Card Keychain importieren</string>
<string name="importFidmeMessage">Wählen Sie Ihren <i>fidme-export-request-xxxxxx.zip</i>-Export aus FidMe zum Importieren aus und wählen Sie anschließend die Strichcodetypen manuell aus.
\nOder erstellen Sie ihn aus Ihrem FidMe-Profil, indem Sie Datenschutz wählen und dann zuerst auf Meine Daten extrahieren drücken.</string>
<string name="importFidmeMessage">Wähle deinen <i>fidme-export-request-xxxxxx.zip</i>-Export aus FidMe zum Importieren aus und wähle anschließend die Strichcodetypen manuell aus.
\nOder erstelle ihn aus deinem FidMe-Profil, indem du Datenschutz wählst und dann zuerst auf Meine Daten extrahieren drückst.</string>
<string name="importFidme">Aus FidMe importieren</string>
<string name="importCatimaMessage">Wählen Sie Ihren <i>catima.zip</i>-Export aus Catima zum Importieren aus.
\nErstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken.</string>
<string name="importCatimaMessage">Wähle deinen <i>catima.zip</i>-Export aus Catima zum Importieren aus.
\nErstelle ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem du dort zuerst Export drückst.</string>
<string name="importCatima">Aus Catima importieren</string>
<string name="setBarcodeId">Manuell eingeben</string>
<string name="sameAsCardId">Entspricht Kartennummer</string>
@@ -142,28 +142,28 @@
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Ich möchte diese Karten mit dir teilen</string>
<string name="copy_to_clipboard_multiple_toast">Kartennummern in die Zwischenablage kopiert</string>
<string name="card_ids_copied">Kartennummer(n) kopiert</string>
<string name="card_ids_copied">ID(s) kopiert</string>
<string name="no">Nein</string>
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionText">Kartennummer geändert. Möchtest du auch den Barcode auf den gleichen Wert ändern?</string>
<string name="updateBarcodeQuestionText">Kartennummer geändert. Möchtest du auch den Barcode auf den gleichen Wert ändern\?</string>
<string name="updateBarcodeQuestionTitle">Barcodewert aktualisieren?</string>
<string name="takePhoto">Foto aufnehmen</string>
<string name="removeImage">Bild entfernen</string>
<string name="setBackImage">Kartenrückseite</string>
<string name="setFrontImage">Kartenvorderseite</string>
<string name="photos">Fotos</string>
<string name="frontImageDescription">Bild der Kartenvorderseite</string>
<string name="backImageDescription">Bild der Kartenrückseite</string>
<string name="frontImageDescription">Bild auf der Vorseite</string>
<string name="backImageDescription">Bild auf der Rückseite</string>
<string name="passwordRequired">Bitte gib das Passwort ein</string>
<string name="importStocardMessage">Wählen Sie Ihren <i>***-sync.zip</i>-Export aus Stocard zum Importieren aus.
\nSie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten.</string>
<string name="importStocardMessage">Wähle deinen <i>***-sync.zip</i>-Export aus Stocard zum Importieren aus.
\nSie erhalten ihn, indem du eine E-Mail an support@stocardapp.com sendest und um einen Export deiner Daten bitten.</string>
<string name="importStocard">Von Stocard importieren</string>
<string name="turn_flashlight_off">Licht ausschalten</string>
<string name="turn_flashlight_on">Licht einschalten</string>
<string name="failedGeneratingShareURL">URL konnte nicht erstellt werden. Bitte melde das an uns.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> Karte ausgewählt</item>
<item quantity="other"><xliff:g>%d</xliff:g> Karten ausgewählt</item>
<item quantity="one"><xliff:g>%d</xliff:g> ausgewählt</item>
<item quantity="other"><xliff:g>%d</xliff:g> ausgewählt</item>
</plurals>
<string name="deleteTitle">Karte löschen</string>
<string name="deleteConfirmation">Diese Karte wirklich löschen?</string>
@@ -189,7 +189,7 @@
<string name="settings_theme_color">Designfarbe</string>
<string name="app_contributors">Ermöglicht durch: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="toggleMoreInfo">Umschalten, um weitere Informationen anzuzeigen</string>
<string name="barcodeImageDescriptionWithType">Bild des Kartenstrichcodes des Typs <xliff:g>%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Bild <xliff:g>%s</xliff:g> Barcode</string>
<string name="swipeToSwitchImages">Wischen oder langes Drücken zum Wechseln der Bilder</string>
<string name="sort_by">Sortieren nach</string>
<string name="sort_by_balance">Kontostand</string>
@@ -197,7 +197,7 @@
<string name="sort_by_most_recently_used">Zuletzt verwendet</string>
<string name="sort_by_name">Name</string>
<string name="sort">Sortieren</string>
<string name="reverse">Umgekehrt</string>
<string name="reverse"> in umgekehrter Reihenfolge</string>
<string name="version_history">Versionshistorie</string>
<string name="credits">Dank an</string>
<string name="help_translate_this_app">Hilfe bei der Übersetzung</string>
@@ -208,16 +208,18 @@
<string name="source_repository">Quellcode</string>
<string name="on_github">auf GitHub</string>
<string name="report_error">Fehler melden</string>
<string name="exportPassword">Legen Sie ein Passwort fest, um Ihren Export zu schützen (optional)</string>
<string name="exportPassword">Lege ein Passwort fest, um deinen Export zu schützen (optional)</string>
<string name="exportPasswordHint">Passwort eingeben</string>
<string name="group_name_already_in_use">Der Gruppenname wird bereits verwendet</string>
<string name="group_name_is_empty">Gruppenname darf nicht leer sein</string>
<string name="group_updated">Gruppe aktualisiert</string>
<string name="editGroup">Gruppe wird bearbeitet: <xliff:g>%s</xliff:g></string>
<string name="group_edit">Gruppe bearbeiten</string>
<string name="noGiftCardsGroup">Sie haben noch keine Kundenkarten. Sobald Sie welche hinzugefügt haben, können Sie sie hier der Gruppe zuordnen.</string>
<string name="noGiftCardsGroup">Erstelle einige Karten und ordne sie dann hier der Gruppe zu.</string>
<string name="setIcon">Symbol einstellen</string>
<string name="selectColor">Farbe auswählen</string>
<string name="action_show_details">Details anzeigen</string>
<string name="action_hide_details">Details ausblenden</string>
</resources>
<string name="translate_platform">auf Weblate</string>
<string name="shortcutSelectCard">Wählen Sie eine Karte</string>
</resources>

View File

@@ -28,10 +28,10 @@
<string name="importExportHelp">Τα εφεδρικά δεδομένα σας δίνουν την δυνατότητα να μεταφέρετε τις κάρτες σας σε μία άλλη συσκευή.</string>
<string name="importSuccessfulTitle">Εισαγωγή επιτυχής</string>
<string name="importFailedTitle">Εισαγωγή ανεπιτυχής</string>
<string name="importFailed">Δεν εισήχθει</string>
<string name="importFailed">Δεν εισήχθει: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Εξαγωγή επιτυχής</string>
<string name="exportFailedTitle">Εξαγωγή ανεπιτυχής</string>
<string name="exportFailed">Δεν εξήχθη</string>
<string name="exportFailed">Δεν εξήχθη: <xliff:g>%s</xliff:g></string>
<string name="importing">Γίνεται εισαγωγή του…</string>
<string name="exporting">Γίνεται εξαγωγή του…</string>
<string name="noExternalStoragePermissionError">Δεν είναι δυνατή η εισαγωγή ή εξαγωγή καρτών χωρίς την άδεια πρόσβασης στον εξωτερικό χώρο αποθήκευσης</string>

View File

@@ -65,8 +65,8 @@
<string name="importOptionFilesystemExplanation">Elektu specifa dosiero de la dosiersistemo.</string>
<string name="exportOptionExplanation">La datumoj estos skribita al loko de via elekto.</string>
<string name="noExternalStoragePermissionError">Grant ekstera stokado permeso de importado aŭ eksportado kartoj unua</string>
<string name="exportFailed">Ne povis eksporti kartoj</string>
<string name="importFailed">Ne povis importi kartoj</string>
<string name="exportFailed">Ne povis eksporti kartoj: <xliff:g>%s</xliff:g></string>
<string name="importFailed">Ne povis importi kartoj: <xliff:g>%s</xliff:g></string>
<string name="importExportHelp">Subtenanta supre vian kartoj permesas vin movi ilin al alia aparato.</string>
<string name="failedParsingImportUriError">Ne eblis analizi la importado URI</string>
<string name="noCardExistsError">Ne eblis trovi karto</string>

View File

@@ -28,10 +28,10 @@
<string name="importExportHelp">El respaldo le permite transferir sus tarjetas a otro dispositivo.</string>
<string name="importSuccessfulTitle">Importado</string>
<string name="importFailedTitle">Falló la importación</string>
<string name="importFailed">No se han podido importar tarjetas</string>
<string name="importFailed">No se han podido importar tarjetas: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Exportado</string>
<string name="exportFailedTitle">Falló la exportación</string>
<string name="exportFailed">No se han podido exportar las tarjetas</string>
<string name="exportFailed">No se han podido exportar las tarjetas: <xliff:g>%s</xliff:g></string>
<string name="importing">Importando…</string>
<string name="exporting">Exportando…</string>
<string name="noExternalStoragePermissionError">Otorgar permiso de almacenamiento para importar o exportar tarjetas</string>

View File

@@ -104,10 +104,10 @@
<string name="exportOptionExplanation">Tiedot kirjoitetaan valitsemaasi sijaintiin.</string>
<string name="exporting">Viedään…</string>
<string name="importing">Tuodaan…</string>
<string name="exportFailed">Kortteja ei voitu viedä</string>
<string name="exportFailed">Kortteja ei voitu viedä: <xliff:g>%s</xliff:g></string>
<string name="exportFailedTitle">Vienti epäonnistui</string>
<string name="exportSuccessfulTitle">Vienti valmis</string>
<string name="importFailed">Kortteja ei voitu tuoda</string>
<string name="importFailed">Kortteja ei voitu tuoda: <xliff:g>%s</xliff:g></string>
<string name="importFailedTitle">Tuonti epäonnistui</string>
<string name="importSuccessfulTitle">Tuonti valmis</string>
<string name="importExportHelp">Varmuuskopioimalla korttisi, voit siirtää ne toiseen laitteeseen.</string>
@@ -143,7 +143,7 @@
<string name="note">Lisätieto</string>
<string name="storeName">Nimi</string>
<string name="noMatchingGiftCards">Ei hakutuloksia, kokeile toisella hakutermillä.</string>
<string name="noGiftCards">Lisää ensin kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta.</string>
<string name="noGiftCards">Lisää kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta.</string>
<string name="action_add">Lisää</string>
<string name="action_search">Hae</string>
<string name="takePhoto">Ota valokuva</string>
@@ -164,8 +164,8 @@
<item quantity="other">Poista <xliff:g>%d</xliff:g>kortit</item>
</plurals>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> Kortti valittu</item>
<item quantity="other"><xliff:g>%d</xliff:g> kortit valitut</item>
<item quantity="one"><xliff:g>%d</xliff:g> valittu</item>
<item quantity="other"><xliff:g>%d</xliff:g> valitut</item>
</plurals>
<string name="importStocard">Tuo Stocardista</string>
<string name="importStocardMessage">Valitse tuotava <i>***-sync.zip</i>-vienti Stocardista.

View File

@@ -1,7 +1,7 @@
<?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_add">Ajouter</string>
<string name="noGiftCards">Cliquez sur le bouton + plus pour ajouter une carte, ou importez les depuis le menu ⋮</string>
<string name="noGiftCards">Cliquez sur le bouton + plus pour ajouter une carte, ou importez les depuis le menu ⋮.</string>
<string name="storeName">Nom</string>
<string name="note">Notes</string>
<string name="cardId">Numéro</string>
@@ -19,22 +19,22 @@
<string name="addCardTitle">Ajouter une carte de fidélité</string>
<string name="scanCardBarcode">Scanner le code-barres</string>
<string name="cardShortcut">Raccourci de carte</string>
<string name="noCardsMessage">Ajoutez d\'abord une carte</string>
<string name="noCardsMessage">Ajoutez dabord une carte</string>
<string name="noStoreError">Aucun nom saisi</string>
<string name="noCardIdError">Aucun numéro de carte saisi</string>
<string name="noCardExistsError">Aucune carte trouvée</string>
<string name="noCardIdError">Aucun identifiant saisi</string>
<string name="noCardExistsError">Impossible de trouver cette carte</string>
<string name="importExport">Importer/Exporter</string>
<string name="exportName">Exporter</string>
<string name="importExportHelp">Exporter vos cartes vous permet de les récupérer sur un autre appareil.</string>
<string name="importExportHelp">La sauvegarde de vos données permet de les déplacer sur un autre appareil.</string>
<string name="importSuccessfulTitle">Importé</string>
<string name="importFailedTitle">Échec de l\'import</string>
<string name="importFailed">Impossible d\'importer les cartes</string>
<string name="importFailed">Impossible d\'importer les cartes: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Exporté</string>
<string name="exportFailedTitle">Échec de l\'export</string>
<string name="exportFailed">Impossible d\'exporter les cartes</string>
<string name="exportFailed">Impossible d\'exporter les cartes: <xliff:g>%s</xliff:g></string>
<string name="importing">Import …</string>
<string name="exporting">Export …</string>
<string name="noExternalStoragePermissionError">Veuillez autoriser l\'accès au stockage externe avant d\'importer/exporter les données</string>
<string name="noExternalStoragePermissionError">Accorder au stockage externe lautorisation dimporter ou dexporter des données</string>
<string name="importOptionFilesystemTitle">Importer depuis le système de fichiers</string>
<string name="importOptionFilesystemExplanation">Choisissez le fichier à importer.</string>
<string name="importOptionFilesystemButton">Système de fichiers</string>
@@ -47,26 +47,26 @@
<string name="debug_version_fmt">Version : <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Notes de version : <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Choisissez le code-barres</string>
<string name="copy_to_clipboard_toast">Numéro de carte copié dans le presse-papier</string>
<string name="thumbnailDescription">Miniature de la carte</string>
<string name="copy_to_clipboard_toast">Identifiant copié dans le presse-papiers</string>
<string name="thumbnailDescription">Miniature</string>
<string name="settings">Paramètres</string>
<string name="settings_category_title_ui">Interface utilisateur</string>
<string name="settings_display_barcode_max_brightness">Augmenter la luminosité du code-barres</string>
<string name="settings_lock_barcode_orientation">Verrouiller l\'orientation du code-barres</string>
<string name="exportSuccessful">Carte exportée avec succès</string>
<string name="importSuccessful">Carte de fidélité importée</string>
<string name="settings_lock_barcode_orientation">Verrouiller lorientation du code-barres</string>
<string name="exportSuccessful">Données exportées</string>
<string name="importSuccessful">Données importées</string>
<string name="intent_import_card_from_url_share_text">Je veux partager une carte avec toi</string>
<string name="settings_dark_theme">Sombre</string>
<string name="settings_light_theme">Clair</string>
<string name="settings_system_theme">Système</string>
<string name="settings_theme">Thème</string>
<string name="enterBarcodeInstructions">Entrez lidentifiant de la carte et choisissez le type de code-barres ci-dessous, ou « Cette carte na pas de code-barres ».</string>
<string name="enterBarcodeInstructions">Entrez lidentifiant, et choisissez un type de code-barres ci-dessous, ou « Il ny a pas de code-barres ».</string>
<string name="app_copyright_old">Basé sur Loyalty Card Keychain
\ncopyright © 2016-2020 Branden Archer</string>
<string name="exportOptionExplanation">Les données seront exportées vers l\'emplacement de votre choix.</string>
<string name="failedParsingImportUriError">Impossible d\'analyser l\'URI d\'importation</string>
<string name="exportOptionExplanation">Les données seront exportées vers lemplacement de votre choix.</string>
<string name="failedParsingImportUriError">Impossible danalyser lURI dimportation</string>
<string name="share">Partager</string>
<string name="barcodeNoBarcode">Cette carte n\'a pas de code-barres</string>
<string name="barcodeNoBarcode">Il ny a pas de code-barres</string>
<string name="barcodeType">Type de code-barres</string>
<string name="noMatchingGiftCards">Aucun résultat. Essayez de modifier votre recherche.</string>
<string name="action_search">Rechercher</string>
@@ -82,7 +82,7 @@
<string name="leaveWithoutSaveConfirmation">Quitter sans enregistrer \?</string>
<string name="leaveWithoutSaveTitle">Quitter</string>
<string name="failedOpeningFileManager">Installez dabord un gestionnaire de fichiers.</string>
<string name="addManually">Entrer manuellement l\'identifiant de la carte</string>
<string name="addManually">Entrer manuellement lidentifiant</string>
<string name="moveDown">Descendre</string>
<string name="moveUp">Monter</string>
<plurals name="groupCardCount">
@@ -91,7 +91,7 @@
</plurals>
<string name="groupsList">Groupes : <xliff:g>%s</xliff:g></string>
<string name="accept">Accepter</string>
<string name="privacy_policy_popup_text">Avis sur la politique de confidentialité (exigé par certains magasins d\'applications) :
<string name="privacy_policy_popup_text">Avis sur la politique de confidentialité (exigé par certains magasins dapplications) :
\n
\nAUCUNE DONNÉE NEST COLLECTÉE, ce que tout le monde peut confirmer puisque notre application est un logiciel libre.</string>
<string name="privacy_policy">Politique de confidentialité</string>
@@ -101,11 +101,11 @@
<string name="points">Points</string>
<string name="currency">Monnaie</string>
<string name="balance">Solde</string>
<string name="moveBarcodeToCenterOfScreen">Centrer le code-barres sur l\'écran</string>
<string name="moveBarcodeToTopOfScreen">Déplacez le code-barres vers le haut de l\'écran</string>
<string name="chooseExpiryDate">Choisissez la date d\'expiration</string>
<string name="moveBarcodeToCenterOfScreen">Centrer le code-barres sur lécran</string>
<string name="moveBarcodeToTopOfScreen">Déplacez le code-barres vers le haut de lécran</string>
<string name="chooseExpiryDate">Choisissez la date dexpiration</string>
<string name="never">Jamais</string>
<string name="expiryDate">Date d\'expiration</string>
<string name="expiryDate">Date dexpiration</string>
<string name="editBarcode">Modifier le code-barres</string>
<string name="barcode">Code-barres</string>
<string name="card">Carte</string>
@@ -128,21 +128,21 @@
\nCréez-la à partir du menu Importer/Exporter dune autre application Catima en appuyant dabord sur Exporter.</string>
<string name="importCatima">Importer depuis Catima</string>
<string name="addFromImage">Sélectionner dans la galerie</string>
<string name="errorReadingImage">Impossible de lire l\'image</string>
<string name="noBarcodeFound">Aucun code-barres n\'a été trouvé</string>
<string name="errorReadingImage">Impossible de lire limage</string>
<string name="noBarcodeFound">Aucun code-barres na été trouvé</string>
<string name="setBarcodeId">Définir la valeur du code-barres</string>
<string name="sameAsCardId">Identique à lidentifiant de la carte</string>
<string name="sameAsCardId">Identique à lidentifiant</string>
<string name="barcodeId">Valeur du code-barres</string>
<string name="settings_max_font_size_scale">Taille max. de la police</string>
<string name="unsupportedBarcodeType">Ce type de code-barres ne peut pas encore être affiché. Il sera peut-être pris en charge dans une version ultérieure de lapplication.</string>
<string name="wrongValueForBarcodeType">La valeur n\'est pas valide pour le type de code-barres sélectionné</string>
<string name="wrongValueForBarcodeType">La valeur nest pas valide pour le type de code-barres sélectionné</string>
<string name="app_resources">Ressources tierces libres : <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Bibliothèques tierces libres : <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Je veux partager des cartes avec vous</string>
<string name="copy_to_clipboard_multiple_toast">Identifiants des cartes copiés dans le presse-papiers</string>
<string name="card_ids_copied">Num. de la carte copié(s)</string>
<string name="updateBarcodeQuestionText">Vous avez changé l\'identifiant de la carte. Voulez-vous également mettre à jour le code-barres pour utiliser la même valeur \?</string>
<string name="copy_to_clipboard_multiple_toast">Identifiants copiés dans le presse-papiers</string>
<string name="card_ids_copied">Numéro(s) copié(s)</string>
<string name="updateBarcodeQuestionText">Vous avez changé lidentifiant. Voulez-vous également mettre à jour le code-barres pour utiliser la même valeur \?</string>
<string name="no">Non</string>
<string name="yes">Oui</string>
<string name="updateBarcodeQuestionTitle">Mettre à jour la valeur du code-barres \?</string>
@@ -151,8 +151,8 @@
<string name="setBackImage">Définir limage verso</string>
<string name="setFrontImage">Définir limage recto</string>
<string name="photos">Photos</string>
<string name="backImageDescription">Image verso de la carte</string>
<string name="frontImageDescription">Image recto de la carte</string>
<string name="backImageDescription">Image du verso</string>
<string name="frontImageDescription">Image du recto</string>
<string name="passwordRequired">Veuillez entrer le mot de passe</string>
<string name="importStocardMessage">Sélectionnez votre exportation <i>***-sync.zip</i> de Stocard pour limporter.
\nVous pouvez lobtenir en envoyant un courriel à support@stocardapp.com pour demander une exportation de vos données.</string>
@@ -161,8 +161,8 @@
<string name="turn_flashlight_on">Allumer la lampe de poche</string>
<string name="failedGeneratingShareURL">Impossible de générer une URL partageable. Veuillez signaler ceci.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> carte sélectionnée</item>
<item quantity="other"><xliff:g>%d</xliff:g> cartes sélectionnées</item>
<item quantity="one"><xliff:g>%d</xliff:g> sélectionnée</item>
<item quantity="other"><xliff:g>%d</xliff:g> sélectionnées</item>
</plurals>
<string name="deleteTitle">Supprimer la carte</string>
<string name="deleteConfirmation">Supprimer cette carte \?</string>
@@ -187,14 +187,14 @@
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Couleur du thème</string>
<string name="app_contributors">Rendu possible par : <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Ce groupe ne contient pas de cartes</string>
<string name="toggleMoreInfo">Activer/désactiver l\'affichage de plus d\'infos</string>
<string name="barcodeImageDescriptionWithType">Image du code-barres de la carte de type <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Balayez ou appuyez longuement pour changer d\'image</string>
<string name="noGroupCards">Ce groupe est vide</string>
<string name="toggleMoreInfo">Activer/désactiver laffichage de plus dinfos</string>
<string name="barcodeImageDescriptionWithType">Image <xliff:g>%s</xliff:g> code-barres</string>
<string name="swipeToSwitchImages">Balayez ou appuyez longuement pour changer dimage</string>
<string name="sort">Trier</string>
<string name="sort_by">Trier par</string>
<string name="reverse">Inversé</string>
<string name="sort_by_expiry">Date d\'expiration</string>
<string name="reverse"> dans lordre inverse</string>
<string name="sort_by_expiry">Date dexpiration</string>
<string name="sort_by_most_recently_used">Les plus récemment utilisées</string>
<string name="sort_by_name">Nom</string>
<string name="sort_by_balance">Solde</string>
@@ -211,13 +211,15 @@
<string name="exportPassword">Définissez un mot de passe pour protéger vos exportations (facultatif)</string>
<string name="exportPasswordHint">Entrez le mot de passe</string>
<string name="editGroup">Modification du groupe : <xliff:g> %s </xliff:g></string>
<string name="noGiftCardsGroup">Vous n\'avez pas encore de cartes de fidélité. Une fois que vous en aurez ajouté, vous pourrez les affecter au groupe ici.</string>
<string name="noGiftCardsGroup">Créez des cartes, puis affectez-les au groupe ici.</string>
<string name="group_edit">Modifier le groupe</string>
<string name="group_name_already_in_use">Nom de groupe déjà utilisé</string>
<string name="group_updated">Groupe mis à jour</string>
<string name="group_name_is_empty">Le nom du groupe ne peut pas être vide</string>
<string name="setIcon">Définir l\'icône</string>
<string name="setIcon">Définir licône</string>
<string name="selectColor">Sélectionnez la couleur</string>
<string name="action_show_details">Afficher les détails</string>
<string name="action_hide_details">Masquer les détails</string>
</resources>
<string name="translate_platform">sur Weblate</string>
<string name="shortcutSelectCard">Sélectionnez une carte</string>
</resources>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="unstar">Ukloni iz favorita</string>
<string name="action_search">Pretraživanje</string>
<string name="save">Spremi</string>
@@ -38,7 +38,7 @@
<string name="importExportHelp">Sigurnosno kopiranje kartica omogućuje vam da ih premjestite na drugi uređaj.</string>
<string name="importSuccessfulTitle">Uvezeno</string>
<string name="importFailedTitle">Nije moguće uvesti</string>
<string name="importFailed">Nije moguće uvesti karte</string>
<string name="importFailed">Nije moguće uvesti karte: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Izvezeno</string>
<string name="about">Oh</string>
<string name="importOptionApplicationButton">Koristite drugu aplikaciju</string>
@@ -51,7 +51,7 @@
<string name="importOptionApplicationTitle">Koristite drugu aplikaciju</string>
<string name="settings">Postavke</string>
<string name="settings_dark_theme">Tamno</string>
<string name="exportFailed">Nije moguće izvesti karte</string>
<string name="exportFailed">Nije moguće izvesti karte: <xliff:g>%s</xliff:g></string>
<string name="importing">Uvoz…</string>
<string name="importOptionFilesystemTitle">Uvoz iz datotečnog sustava</string>
<string name="importOptionFilesystemButton">Iz datotečnog sustava</string>

View File

@@ -90,10 +90,10 @@
<string name="exportName">Ekspor</string>
<string name="importSuccessfulTitle">Sudah diimpor</string>
<string name="importFailedTitle">Impor gagal</string>
<string name="importFailed">Tidak dapat mengimpor kartu</string>
<string name="importFailed">Tidak dapat mengimpor kartu: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Sudah diekspor</string>
<string name="exportFailedTitle">Ekspor gagal</string>
<string name="exportFailed">Tidak dapat mengekspor kartu</string>
<string name="exportFailed">Tidak dapat mengekspor kartu: <xliff:g>%s</xliff:g></string>
<string name="importing">Mengimpor…</string>
<string name="exporting">Mengekspor…</string>
<string name="noExternalStoragePermissionError">Berikan izin penyimpanan eksternal untuk mengimpor atau mengekspor kartu terlebih dahulu</string>

View File

@@ -2,12 +2,12 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">Cerca</string>
<string name="action_add">Aggiungi</string>
<string name="noGiftCards">Clicca il pulsante + più per aggiungere una carta, o importane alcune dal menù ⋮ prima.</string>
<string name="noMatchingGiftCards">Non ho trovato niente. Prova a cambiare la tua ricerca.</string>
<string name="noGiftCards">Premi il pulsante + per aggiungere una carta oppure importane alcune dal menù ⋮.</string>
<string name="noMatchingGiftCards">Nessun risultato. Prova a cambiare la tua ricerca.</string>
<string name="storeName">Nome</string>
<string name="note">Note</string>
<string name="cardId">Codice</string>
<string name="barcodeNoBarcode">Questa carta non ha un codice a barre</string>
<string name="barcodeNoBarcode">Non c\'è un codice a barre</string>
<string name="cancel">Annulla</string>
<string name="save">Salva</string>
<string name="edit">Modifica</string>
@@ -15,71 +15,71 @@
<string name="confirm">Conferma</string>
<string name="lockScreen">Blocca rotazione</string>
<string name="unlockScreen">Sblocca rotazione</string>
<string name="ok">OK</string>
<string name="copy_to_clipboard">Copia ID negli appunti</string>
<string name="ok">Ok</string>
<string name="copy_to_clipboard">Copia codice negli appunti</string>
<string name="share">Condividi</string>
<string name="sendLabel">Invia…</string>
<string name="editCardTitle">Modifica carta</string>
<string name="addCardTitle">Aggiungi carta</string>
<string name="scanCardBarcode">Scansiona il codice carta</string>
<string name="scanCardBarcode">Scansiona il codice</string>
<string name="cardShortcut">Scorciatoia per la carta</string>
<string name="noCardsMessage">Aggiungi prima una carta</string>
<string name="noStoreError">Nessun nome inserito</string>
<string name="noCardIdError">Nessun codice carta inserito</string>
<string name="noCardExistsError">Impossibile trovare la carta</string>
<string name="failedParsingImportUriError">Impossibile analizzare l\'URI</string>
<string name="noCardIdError">Nessun codice inserito</string>
<string name="noCardExistsError">Impossibile trovare quella carta</string>
<string name="failedParsingImportUriError">Impossibile analizzare l\'URI di importazione</string>
<string name="importExport">Importa/Esporta</string>
<string name="exportName">Esporta</string>
<string name="importExportHelp">Il backup delle carte ti consente di spostarle su un altro dispositivo.</string>
<string name="importExportHelp">Il backup dei dati permette di spostarli su un altro dispositivo.</string>
<string name="importSuccessfulTitle">Importato</string>
<string name="importFailedTitle">Importazione fallita</string>
<string name="importFailed">Impossibile importare le carte</string>
<string name="importFailed">Impossibile importare le carte: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Esportato</string>
<string name="exportFailedTitle">Esportazione fallita</string>
<string name="exportFailed">Impossibile esportare le carte</string>
<string name="exportFailed">Impossibile esportare le carte: <xliff:g>%s</xliff:g></string>
<string name="importing">Importazione in corso…</string>
<string name="exporting">Esportazione in corso…</string>
<string name="noExternalStoragePermissionError">Concedi l\'autorizzazione all\'archiviazione esterna per importare o esportare prima le carte</string>
<string name="noExternalStoragePermissionError">Concedi il permesso di archiviazione esterna per importare o esportare dati</string>
<string name="importOptionFilesystemTitle">Importa dall\'archivio</string>
<string name="importOptionFilesystemExplanation">Scegli un file dall\'archivio.</string>
<string name="importOptionFilesystemButton">Dall\'archivio</string>
<string name="importOptionApplicationTitle">Usa unaltra app</string>
<string name="importOptionApplicationTitle">Usa un\'altra app</string>
<string name="importOptionApplicationExplanation">Usa qualsiasi app o il tuo gestore di file preferito per aprire un file.</string>
<string name="importOptionApplicationButton">Usa unaltra app</string>
<string name="importOptionApplicationButton">Usa un\'altra app</string>
<string name="about">Informazioni</string>
<string name="app_license">Software libero con copyleft, licenza GPLv3+</string>
<string name="about_title_fmt">Informazioni su <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versione: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informazioni sulla revisione: <xliff:g id="app_revision_url"> %s </xliff:g></string>
<string name="selectBarcodeTitle">Seleziona codice a barre</string>
<string name="enterBarcodeInstructions">Inserisci lID della carta, e scegli il suo tipo di codice a barre qui sotto, oppure «Questa carta non ha codice a barre».</string>
<string name="copy_to_clipboard_toast">Numero della carta copiato negli appunti</string>
<string name="thumbnailDescription">Miniatura carta</string>
<string name="enterBarcodeInstructions">Inserisci il codice e scegli un tipo di codice a barre sotto oppure seleziona «Non c\'è un codice a barre».</string>
<string name="copy_to_clipboard_toast">Codice copiato negli appunti</string>
<string name="thumbnailDescription">Miniatura</string>
<string name="settings">Impostazioni</string>
<string name="settings_category_title_ui">Interfaccia utente</string>
<string name="settings_theme">Tema</string>
<string name="settings_system_theme">Sistema</string>
<string name="settings_light_theme">Chiaro</string>
<string name="settings_dark_theme">Scuro</string>
<string name="settings_display_barcode_max_brightness">Aumenta luminosità dello schermo quando apro un codice a barre</string>
<string name="settings_display_barcode_max_brightness">Aumenta luminosità dello schermo quando viene aperto un codice a barre</string>
<string name="settings_lock_barcode_orientation">Blocca orientamento del codice a barre</string>
<string name="intent_import_card_from_url_share_text">Voglio condividere una carta fedeltà con te</string>
<string name="exportSuccessful">Dati della carta importati</string>
<string name="importSuccessful">Dati della carta importati</string>
<string name="exportSuccessful">Dati della carta esportati</string>
<string name="importSuccessful">Dati importati</string>
<string name="app_copyright_old">Basato su Loyalty Card Keychain
\ncopyright © 20162020 Branden Archer</string>
<string name="exportOptionExplanation">I dati verranno scritti in una posizione a tua scelta.</string>
<string name="barcodeType">Tipo di codice a barre</string>
<string name="unstar">Rimuovi dai preferiti</string>
<string name="star">Aggiungi ai preferiti</string>
<string name="starImage">Stella preferita</string>
<string name="starImage">Stella dei preferiti</string>
<string name="deleteConfirmationGroup">Eliminare il gruppo\?</string>
<string name="all">Tutti</string>
<string name="noGroups">Clicca sul pulsante + più per aggiungere prima i gruppi per la categorizzazione.</string>
<string name="noGroups">Clicca sul pulsante + per aggiungere i gruppi per la categorizzazione.</string>
<string name="groups">Gruppi</string>
<string name="enter_group_name">Inserisci il nome del gruppo</string>
<string name="groupsList">Gruppi: <xliff:g>%s</xliff:g></string>
<string name="addManually">Inserisci manualmente l\'ID della carta</string>
<string name="addManually">Inserisci manualmente il codice</string>
<string name="leaveWithoutSaveConfirmation">Uscire senza salvare\?</string>
<string name="leaveWithoutSaveTitle">Esci</string>
<string name="moveDown">Sposta in basso</string>
@@ -105,70 +105,70 @@
<string name="balancePoints"><xliff:g>%s</xliff:g> punti</string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Scaduta: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Scade: <xliff:g>%s</xliff:g></string>
<string name="settings_keep_screen_on">Tieni schermo attivo</string>
<string name="expiryStateSentence">Scadenza: <xliff:g>%s</xliff:g></string>
<string name="settings_keep_screen_on">Mantieni lo schermo attivo</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="chooseImportType">Importare i dati da\?</string>
<string name="settings_disable_lockscreen_while_viewing_card">Impedisci blocco schermo</string>
<string name="chooseImportType">Importa i dati da</string>
<string name="settings_disable_lockscreen_while_viewing_card">Impedisci il blocco dello schermo</string>
<string name="accept">Accetta</string>
<string name="privacy_policy_popup_text">Informativa sulla riservatezza (spesso richiesta):
<string name="privacy_policy_popup_text">Informativa sulla riservatezza (richiesta da alcuni app store):
\n
\nNESSUN DATO VIENE RACCOLTO, cosa che chiunque può confermare dato che la nostra applicazione è un software libero.</string>
<string name="privacy_policy">Informativa sulla riservatezza</string>
<string name="importVoucherVaultMessage">Seleziona la tua esportazione <i>vouchervault.json</i> da Voucher Vault da importare.
<string name="importVoucherVaultMessage">Seleziona il tuo file di esportazione <i>vouchervault.json</i> da Voucher Vault per importarlo.
\nCrealo premendo prima Esporta in Voucher Vault.</string>
<string name="importVoucherVault">Importa da Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Seleziona la tua esportazione <i>LoyaltyCardKeychain.csv</i> da Loyalty Card Keychain per importarla.
\nCreatelo dal menù Importazione/Esportazione in Loyalty Card Keychain premendo prima su Esporta.</string>
<string name="importLoyaltyCardKeychainMessage">Seleziona il tuo file di esportazione <i>LoyaltyCardKeychain.csv</i> da Loyalty Card Keychain per importarlo.
\nCrealo dal menù Importa/Esporta in Loyalty Card Keychain premendo prima su Esporta.</string>
<string name="importLoyaltyCardKeychain">Importa da Loyalty Card Keychain</string>
<string name="importFidmeMessage">Seleziona la tua esportazione <i>fidme-export-request-xxxxxx.zip</i> da FidMe per importare, e seleziona i tipi di codice a barre manualmente dopo.
\nCrearlo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima.</string>
<string name="importFidmeMessage">Seleziona il tuo file di esportazione <i>fidme-export-request-xxxxxx.zip</i> da FidMe per importare e seleziona successivamente i tipi di codice a barre manualmente.
\nCrealo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima.</string>
<string name="importFidme">Importa da FidMe</string>
<string name="importCatimaMessage">Seleziona la tua esportazione <i>catima.zip</i> da Catima per importarla.
\nCrealo dal menù Importazione/Esportazione di un\'altra applicazione Catima premendo prima Esporta.</string>
<string name="importCatimaMessage">Seleziona il file di esportazione <i>catima.zip</i> per importarlo.
\nCrealo dal menù Importa/Esporta di un\'altra applicazione Catima premendo prima Esporta.</string>
<string name="importCatima">Importa da Catima</string>
<string name="setBarcodeId">Imposta il valore del codice a barre</string>
<string name="sameAsCardId">Uguale all\'ID della carta</string>
<string name="sameAsCardId">Uguale al codice</string>
<string name="barcodeId">Valore del codice a barre</string>
<string name="errorReadingImage">Impossibile leggere l\'immagine</string>
<string name="noBarcodeFound">Nessun codice a barre trovato</string>
<string name="addFromImage">Seleziona immagine dalla galleria</string>
<string name="settings_max_font_size_scale">Dimensione mass. caratteri</string>
<string name="settings_max_font_size_scale">Dimensione massima del carattere</string>
<string name="unsupportedBarcodeType">Questo tipo di codice a barre non può ancora essere visualizzato. Potrebbe essere supportato in una versione successiva dell\'applicazione.</string>
<string name="wrongValueForBarcodeType">Il valore non è valido per il tipo di codice a barre selezionato</string>
<string name="app_resources">Risorse libre di terze parti: <xliff:g id="app_resources_list"> %s </xliff:g></string>
<string name="app_libraries">Librerie libre di terze parti: <xliff:g id="app_libraries_list"> %s </xliff:g></string>
<string name="app_resources">Risorse libere di terze parti: <xliff:g id="app_resources_list"> %s </xliff:g></string>
<string name="app_libraries">Librerie libere di terze parti: <xliff:g id="app_libraries_list"> %s </xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Voglio condividere alcune carte con te</string>
<string name="copy_to_clipboard_multiple_toast">Numeri delle carte copiati negli appunti</string>
<string name="card_ids_copied">Numero/i della carta copiato/i</string>
<string name="copy_to_clipboard_multiple_toast">Codici copiati negli appunti</string>
<string name="card_ids_copied">Codice/i copiato/i</string>
<string name="no">No</string>
<string name="yes"></string>
<string name="updateBarcodeQuestionText">Hai cambiato l\'ID della carta. Vuoi anche aggiornare il codice a barre per usare lo stesso valore\?</string>
<string name="updateBarcodeQuestionText">Hai cambiato il codice. Vuoi anche aggiornare il codice a barre per usare lo stesso valore\?</string>
<string name="updateBarcodeQuestionTitle">Aggiornare il valore del codice a barre\?</string>
<string name="takePhoto">Scatta una foto</string>
<string name="removeImage">Rimuovi limmagine</string>
<string name="removeImage">Rimuovi l\'immagine</string>
<string name="setBackImage">Imposta immagine posteriore</string>
<string name="setFrontImage">Imposta immagine frontale</string>
<string name="photos">Foto</string>
<string name="backImageDescription">Immagine posteriore della carta</string>
<string name="frontImageDescription">Immagine frontale della carta</string>
<string name="backImageDescription">Immagine posteriore</string>
<string name="frontImageDescription">Immagine frontale</string>
<string name="passwordRequired">Si prega di inserire la password</string>
<string name="importStocardMessage">Seleziona la tua esportazione <i>***-sync.zip</i> da Stocard per importare.
<string name="importStocardMessage">Seleziona il tuo file di esportazione <i>***-sync.zip</i> da Stocard per importarlo.
\nOttienilo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati.</string>
<string name="importStocard">Importa da Stocard</string>
<string name="turn_flashlight_off">Spegni la torcia</string>
<string name="turn_flashlight_on">Accendi la torcia</string>
<string name="failedGeneratingShareURL">Impossibile generare un URL condivisibile. Si prega di segnalarlo.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> carta selezionata</item>
<item quantity="other"><xliff:g>%d</xliff:g> carte selezionate</item>
<item quantity="one"><xliff:g>%d</xliff:g> selezionata</item>
<item quantity="other"><xliff:g>%d</xliff:g> selezionate</item>
</plurals>
<string name="deleteTitle">Rimuovi la carta</string>
<string name="deleteConfirmation">Eliminare questa carta\?</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Eliminare definitivamente questa scheda <xliff:g>%d</xliff:g>\?</item>
<item quantity="other">Eliminare definitivamente queste schede <xliff:g>%d</xliff:g>\?</item>
<item quantity="one">Eliminare definitivamente questa <xliff:g>%d</xliff:g> carta\?</item>
<item quantity="other">Eliminare definitivamente queste <xliff:g>%d</xliff:g> carte\?</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="one">Elimina <xliff:g>%d</xliff:g> carta</item>
@@ -187,19 +187,19 @@
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Colore del tema</string>
<string name="app_contributors">Reso possibile da: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Questo gruppo non contiene carte</string>
<string name="noGroupCards">Questo gruppo è vuoto</string>
<string name="toggleMoreInfo">Attiva/disattiva la visualizzazione di altre informazioni</string>
<string name="barcodeImageDescriptionWithType">Immagine del codice a barre della carta del tipo <xliff:g>%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Immagine del codice a barre in formato <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Scorri o premi a lungo per cambiare immagine</string>
<string name="sort_by">Ordina per</string>
<string name="reverse">Inverti</string>
<string name="reverse">…in ordine inverso</string>
<string name="sort_by_balance">Saldo</string>
<string name="sort_by_expiry">Scadenza</string>
<string name="sort_by_most_recently_used">Usate più di recente</string>
<string name="sort_by_most_recently_used">Usate più recentemente</string>
<string name="sort_by_name">Nome</string>
<string name="sort">Ordina</string>
<string name="license">Licenza</string>
<string name="source_repository">Repository fonti</string>
<string name="source_repository">Repository del codice sorgente</string>
<string name="on_github">su GitHub</string>
<string name="exportPasswordHint">Inserisci la password</string>
<string name="on_google_play">su Google Play</string>
@@ -210,14 +210,15 @@
<string name="and_data_usage">e utilizzo dei dati</string>
<string name="rate_this_app">Valuta questa applicazione</string>
<string name="report_error">Segnala un errore</string>
<string name="editGroup">Gruppo di modifica: <xliff:g>%s</xliff:g></string>
<string name="editGroup">Modifica del gruppo: <xliff:g>%s</xliff:g></string>
<string name="group_name_is_empty">Il nome del gruppo non può essere vuoto</string>
<string name="noGiftCardsGroup">Non hai ancora nessuna carta fedeltà. Una volta che ne hai aggiunte, puoi assegnarle al gruppo qui.</string>
<string name="noGiftCardsGroup">Crea alcune carte e poi assegnale al gruppo qui.</string>
<string name="group_edit">Modifica il gruppo</string>
<string name="group_name_already_in_use">Nome del gruppo già in uso</string>
<string name="group_name_already_in_use">Il nome del gruppo è già in uso</string>
<string name="group_updated">Gruppo aggiornato</string>
<string name="selectColor">Seleziona il colore</string>
<string name="setIcon">Imposta l\'icona</string>
<string name="action_show_details">Mostra i dettagli</string>
<string name="action_hide_details">Nascondi i dettagli</string>
</resources>
<string name="translate_platform">su Weblate</string>
</resources>

View File

@@ -53,8 +53,8 @@
<string name="noGroups">+ボタンを押してグループを追加してください。</string>
<string name="groups">グループ</string>
<string name="enter_group_name">グループ名を入力</string>
<string name="exportSuccessful">カードのデータがエクスポートされました</string>
<string name="importSuccessful">カードのデータがインポートされました</string>
<string name="exportSuccessful">データがエクスポートされました</string>
<string name="importSuccessful">データがインポートされました</string>
<string name="intent_import_card_from_url_share_text">カード共有をしましょう</string>
<string name="settings_disable_lockscreen_while_viewing_card">バーコード表示中は画面をロックしない</string>
<string name="settings_keep_screen_on">バーコード表示中は画面を消灯しない</string>
@@ -68,7 +68,7 @@
<string name="settings_category_title_ui">外観</string>
<string name="settings">設定</string>
<string name="starImage">お気に入りのスター</string>
<string name="thumbnailDescription">カードのサムネイル</string>
<string name="thumbnailDescription">サムネイル</string>
<string name="copy_to_clipboard_toast">カード番号をクリップボードにコピーしました</string>
<string name="enterBarcodeInstructions">カード番号を入力し、バーコード形式を選択してください。</string>
<string name="selectBarcodeTitle">バーコード選択</string>
@@ -89,10 +89,10 @@
<string name="importOptionFilesystemExplanation">ストレージからファイルを選択してください。</string>
<string name="importOptionFilesystemTitle">ストレージからインポート</string>
<string name="exportOptionExplanation">選択した場所にデータを出力します。</string>
<string name="noExternalStoragePermissionError">カードをインポート/エクスポートするために外部ストレージへのアクセスを許可してください</string>
<string name="noExternalStoragePermissionError">データをインポート/エクスポートするために外部ストレージへのアクセスを許可してください</string>
<string name="exporting">エクスポート中…</string>
<string name="importing">インポート中…</string>
<string name="exportFailed">カードをエクスポートできませんでした</string>
<string name="exportFailed">カードをエクスポートできませんでした: <xliff:g>%s</xliff:g></string>
<string name="exportFailedTitle">エクスポートに失敗しました</string>
<string name="exportSuccessfulTitle">エクスポートしました</string>
<string name="sameAsCardId">カード番号に合わせる</string>
@@ -100,10 +100,10 @@
<string name="importVoucherVaultMessage">Voucher Vaultでエクスポートした <i>vouchervault.json</i>ファイルを選択してください。
\nファイルがない場合、Voucher Vaultでファイルをエクスポートしてください。</string>
<string name="importVoucherVault">Voucher Vaultからインポート</string>
<string name="importFailed">カードをインポートできません</string>
<string name="importFailed">カードをインポートできません: <xliff:g>%s</xliff:g></string>
<string name="importFailedTitle">インポートに失敗しました</string>
<string name="importSuccessfulTitle">インポートしました</string>
<string name="importExportHelp">カードをバックアップすると、他のデバイスにカードを移すことができます。</string>
<string name="importExportHelp">データをバックアップすると、他のデバイスにカードを移すことができます。</string>
<string name="exportName">エクスポート</string>
<string name="importExport">インポート/エクスポート</string>
<string name="failedParsingImportUriError">インポートURIを解析できません</string>
@@ -112,7 +112,7 @@
<string name="noStoreError">名前が入力されていません</string>
<string name="noCardsMessage">カードを追加</string>
<string name="cardShortcut">カードのショートカット</string>
<string name="scanCardBarcode">カードのバーコードをスキャン</string>
<string name="scanCardBarcode">バーコードをスキャン</string>
<string name="addCardTitle">カードの追加</string>
<string name="editCardTitle">カードの編集</string>
<string name="sendLabel">送信先を選択…</string>
@@ -129,7 +129,7 @@
<string name="unstar">お気に入りから削除</string>
<string name="star">お気に入りに追加</string>
<string name="noBarcode">バーコードなし</string>
<string name="barcodeNoBarcode">バーコード指定なし</string>
<string name="barcodeNoBarcode">バーコードなし</string>
<string name="barcodeType">バーコード形式</string>
<string name="cardId">カード番号</string>
<string name="note">メモ</string>
@@ -154,8 +154,8 @@
<string name="setBackImage">裏面の画像を設定</string>
<string name="setFrontImage">オモテ面の画像を設定</string>
<string name="photos">フォト</string>
<string name="backImageDescription">カードの裏面</string>
<string name="frontImageDescription">カードのオモテ面</string>
<string name="backImageDescription"></string>
<string name="frontImageDescription"></string>
<string name="importStocardMessage">Stocardでエクスポートした<i>***-sync.zip</i>ファイルを選択してください。
\nファイルがない場合、e-mailing support@stocardapp.comにデータのエクスポートを要求してください。</string>
<string name="importStocard">Stocardからインポート</string>
@@ -215,4 +215,6 @@
<string name="group_edit">グループ編集</string>
<string name="group_name_already_in_use">このグループ名は既に使用されています</string>
<string name="group_name_is_empty">グループ名を入力してください</string>
<string name="shortcutSelectCard">カードを選択してください</string>
<string name="translate_platform">on Weblate</string>
</resources>

View File

@@ -55,11 +55,11 @@
<string name="importOptionApplicationTitle">외부 앱 사용</string>
<string name="importOptionFilesystemExplanation">파일 시스템에서 파일을 선택합니다.</string>
<string name="importOptionFilesystemTitle">파일 시스템에서 가져오기</string>
<string name="exportFailed">카드를 내보낼 수 없음</string>
<string name="exportFailed">카드를 내보낼 수 없음: <xliff:g>%s</xliff:g></string>
<string name="importOptionApplicationExplanation">다른 파일 관리자 또는 앱을 사용하여 파일을 엽니다.</string>
<string name="exportFailedTitle">내보내기 실패</string>
<string name="exportSuccessfulTitle">내보내기 완료</string>
<string name="importFailed">카드를 가져올 수 없음</string>
<string name="importFailed">카드를 가져올 수 없음: <xliff:g>%s</xliff:g></string>
<string name="importFailedTitle">가져오기 실패</string>
<string name="importSuccessfulTitle">가져오기 완료</string>
<string name="noCardIdError">카드 ID를 입력하지 않음</string>

View File

@@ -22,7 +22,7 @@
<string name="cardShortcut">Kaart Bréck</string>
<string name="exportSuccessfulTitle">Exportéieren</string>
<string name="exportFailedTitle">Export fehlgeschlagen</string>
<string name="exportFailed">Kaarten konnten net exportéiert ginn</string>
<string name="exportFailed">Kaarten konnten net exportéiert ginn: <xliff:g>%s</xliff:g></string>
<string name="importing">Importéieren…</string>
<string name="importOptionFilesystemTitle">Import aus dem Dateisystem</string>
<string name="importOptionFilesystemExplanation">Wielt eng bestëmmte Datei aus dem Dateisystem.</string>
@@ -59,7 +59,7 @@
<string name="unsupportedBarcodeType">Dee barcode-Typ kann net ugewise ginn. Et kann zu enger spéiderer Versioun vun der App ënnerstëtzt ginn.</string>
<string name="yes">Jo</string>
<string name="importFailedTitle">Import fehlgeschlagen</string>
<string name="importFailed">Kaarten konnten net anere sproochen ginn</string>
<string name="importFailed">Kaarten konnten net anere sproochen ginn: <xliff:g>%s</xliff:g></string>
<string name="exporting">Ausführende…</string>
<string name="exportOptionExplanation">D \' Donnéeë ginn op eng Plaz vun Hirer Wal geschriwwen.</string>
<string name="importOptionApplicationExplanation">Benotzen Se eng beliebige App oder Hire bevorzugten Dateimanager, fir eng Datei ze opmaachen.</string>

View File

@@ -19,8 +19,8 @@
<string name="noCardIdError">Neįvestas kortelės ID</string>
<string name="importExport">Importuoti/Exportuoti</string>
<string name="exportName">Exportuoti</string>
<string name="importFailed">Nepavyko importuoti kortelių</string>
<string name="exportFailed">Nepavyko eksportuoti kortelių</string>
<string name="importFailed">Nepavyko importuoti kortelių: <xliff:g>%s</xliff:g></string>
<string name="exportFailed">Nepavyko eksportuoti kortelių: <xliff:g>%s</xliff:g></string>
<string name="importing">Importuoja…</string>
<string name="exporting">Eksportuoja…</string>
<string name="noExternalStoragePermissionError">Pirmiausia suteikite išorinės saugyklos leidimą, kad galėtumėte importuoti arba eksportuoti korteles</string>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_search">Meklēšana</string>
<string name="action_add">Pievienot</string>
<string name="noGiftCards">Noklikšķiniet uz pogas + plus, lai pievienotu karti, vai vispirms importējiet dažus no ⋮ izvēlnes.</string>
@@ -44,10 +44,10 @@
<string name="importExportHelp">Jūsu Karšu dublēšana ļauj pārvietot tās uz citu ierīci.</string>
<string name="importSuccessfulTitle">Importēts</string>
<string name="importFailedTitle">Neizdevās importēt</string>
<string name="importFailed">Nevarēja importēt kartes</string>
<string name="importFailed">Nevarēja importēt kartes: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Eksports</string>
<string name="exportFailedTitle">Eksports neizdevās</string>
<string name="exportFailed">Nevarēja eksportēt kartes</string>
<string name="exportFailed">Nevarēja eksportēt kartes: <xliff:g>%s</xliff:g></string>
<string name="importing">Imports…</string>
<string name="exporting">Eksports…</string>
<string name="noExternalStoragePermissionError">Piešķiriet ārējai atmiņai atļauju vispirms importēt vai eksportēt kartes</string>

View File

@@ -29,10 +29,10 @@
<string name="importExportHelp">Sikkerhetskopiering av kort lar deg flytte dem til en annen enhet.</string>
<string name="importSuccessfulTitle">Importert</string>
<string name="importFailedTitle">Kunne ikke importere</string>
<string name="importFailed">Klarte ikke å importere kort</string>
<string name="importFailed">Klarte ikke å importere kort: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Eksportert</string>
<string name="exportFailedTitle">Kunne ikke eksportere</string>
<string name="exportFailed">Kunne ikke eksportere kort</string>
<string name="exportFailed">Kunne ikke eksportere kort: <xliff:g>%s</xliff:g></string>
<string name="importing">Importerer…</string>
<string name="exporting">Exporterer…</string>
<string name="noExternalStoragePermissionError">Innvilg lagringstilgang til eksternlager for å importere eller eksportere kort først</string>
@@ -158,7 +158,7 @@
<string name="failedGeneratingShareURL">Klarte ikke å lage delbar nettadresse. Rapporter denne feilen.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kort valgt</item>
<item quantity="other"><xliff:g>%d</xliff:g> korten valgt</item>
<item quantity="other"><xliff:g>%d</xliff:g> kort valgt</item>
</plurals>
<string name="deleteConfirmation">Slett dette kortet for godt?</string>
<plurals name="deleteCardsConfirmation">

View File

@@ -8,7 +8,7 @@
<string name="note">Aantekening</string>
<string name="cardId">Kaartnummer</string>
<string name="barcodeType">Soort barcode</string>
<string name="barcodeNoBarcode">Deze kaart heeft geen barcode</string>
<string name="barcodeNoBarcode">Er is geen barcode</string>
<string name="cancel">Annuleren</string>
<string name="save">Opslaan</string>
<string name="edit">Bewerken</string>
@@ -22,25 +22,25 @@
<string name="sendLabel">Versturen…</string>
<string name="editCardTitle">Kaart bewerken</string>
<string name="addCardTitle">Kaart toevoegen</string>
<string name="scanCardBarcode">Scan de barcode van de kaart</string>
<string name="scanCardBarcode">Barcode scannen</string>
<string name="cardShortcut">Kaartsnelkoppeling</string>
<string name="noCardsMessage">Voeg eerst een kaart toe</string>
<string name="noStoreError">Geen naam ingevoerd</string>
<string name="noCardIdError">Geen kaartnummer ingevoerd</string>
<string name="noCardIdError">Geen id ingevoerd</string>
<string name="noCardExistsError">De kaart is niet aangetroffen</string>
<string name="failedParsingImportUriError">Kan de import-uri niet verwerken</string>
<string name="importExport">Importeren/Exporteren</string>
<string name="exportName">Exporteren</string>
<string name="importExportHelp">Door je kaarten te back-uppen, kun je ze overzetten naar een ander apparaat.</string>
<string name="importExportHelp">Door je gegevens te back-uppen, kun je ze overzetten naar een ander apparaat.</string>
<string name="importSuccessfulTitle">Importeren voltooid</string>
<string name="importFailedTitle">Importeren mislukt</string>
<string name="importFailed">Het importeren is mislukt</string>
<string name="importFailed">Het importeren is mislukt: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Exporteren voltooid</string>
<string name="exportFailedTitle">Exporteren mislukt</string>
<string name="exportFailed">Het exporteren is mislukt</string>
<string name="exportFailed">Het exporteren is mislukt: <xliff:g>%s</xliff:g></string>
<string name="importing">Bezig met importeren…</string>
<string name="exporting">Bezig met exporteren…</string>
<string name="noExternalStoragePermissionError">Verleen het recht externe opslag om kaarten te kunnen im- of exporteren</string>
<string name="noExternalStoragePermissionError">Verleen het recht externe opslag om gegevens te kunnen im- of exporteren</string>
<string name="exportOptionExplanation">De gegevens worden weggeschreven op een locatie naar keuze.</string>
<string name="importOptionFilesystemTitle">Importeren uit bestandssysteem</string>
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand van het bestandssysteem.</string>
@@ -56,7 +56,7 @@
<string name="selectBarcodeTitle">Barcode toevoegen</string>
<string name="enterBarcodeInstructions">Voer de kaart-id in en kies daarna het soort barcode of druk op “Deze kaart heeft geen barcode”.</string>
<string name="copy_to_clipboard_toast">De kaart-id is gekopieerd naar het klembord</string>
<string name="thumbnailDescription">Miniatuurvoorbeeld van kaart</string>
<string name="thumbnailDescription">Miniatuurvoorbeeld</string>
<string name="settings">Instellingen</string>
<string name="settings_category_title_ui">Vormgeving</string>
<string name="settings_theme">Thema</string>
@@ -67,10 +67,10 @@
<string name="settings_lock_barcode_orientation">Barcode-oriëntatie vergrendelen</string>
<string name="intent_import_card_from_url_share_text">Ik wil een klantenkaart met je delen</string>
<string name="all">Alles</string>
<string name="importSuccessful">De kaartgegevens zijn geïmporteerd</string>
<string name="importSuccessful">De gegevens zijn geïmporteerd</string>
<string name="deleteConfirmationGroup">Groep verwijderen\?</string>
<string name="noGroups">Druk op de plusknop (+) om een groep toe te voegen.</string>
<string name="exportSuccessful">De kaartgegevens zijn geëxporteerd</string>
<string name="exportSuccessful">De gegevens zijn geëxporteerd</string>
<string name="groups">Groepen</string>
<string name="enter_group_name">Voer een groepsnaam in</string>
<string name="starImage">Favoriete ster</string>
@@ -78,7 +78,7 @@
\ncopyright ©20162020 Branden Archer</string>
<string name="unstar">Verwijderen uit favorieten</string>
<string name="star">Toevoegen aan favorieten</string>
<string name="addManually">Kaartnummer handmatig invoeren</string>
<string name="addManually">ID handmatig invoeren</string>
<string name="leaveWithoutSaveConfirmation">Weet je zeker dat je niet wilt opslaan\?</string>
<string name="leaveWithoutSaveTitle">Afsluiten</string>
<string name="moveDown">Omlaag verplaatsen</string>
@@ -108,7 +108,7 @@
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="chooseImportType">Gegevens importeren uit…\?</string>
<string name="app_loyalty_card_keychain">Klantenkaartkluis</string>
<string name="settings_disable_lockscreen_while_viewing_card">Vergrendelscherm uitschakelen</string>
<string name="settings_disable_lockscreen_while_viewing_card">Schermvergrendeling uitschakelen</string>
<string name="settings_keep_screen_on">Scherm niet uitschakelen</string>
<string name="privacy_policy_popup_text">Privacybeleid (vereist door sommige appwinkels):
\n
@@ -151,8 +151,8 @@
<string name="setFrontImage">Voorzijde kiezen</string>
<string name="setBackImage">Achterzijde kiezen</string>
<string name="photos">Afbeeldingen</string>
<string name="backImageDescription">Achterzijde van de kaart</string>
<string name="frontImageDescription">Voorzijde van de kaart</string>
<string name="backImageDescription">Achterzijde van kaart</string>
<string name="frontImageDescription">Voorzijde van kaart</string>
<string name="passwordRequired">Voer het wachtwoord in</string>
<string name="importStocardMessage">Kies het te importeren Stocard-exportbestand genaamd <i>***-sync.zip</i>.
\nStuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand.</string>
@@ -161,8 +161,8 @@
<string name="turn_flashlight_off">Zaklamp uitzetten</string>
<string name="turn_flashlight_on">Zaklamp aanzetten</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kaart geselecteerd</item>
<item quantity="other"><xliff:g>%d</xliff:g> kaarten geselecteerd</item>
<item quantity="one"><xliff:g>%d</xliff:g> geselecteerd</item>
<item quantity="other"><xliff:g>%d</xliff:g> geselecteerd</item>
</plurals>
<string name="deleteTitle">Kaart verwijderen</string>
<plurals name="deleteCardsTitle">
@@ -189,10 +189,10 @@
<string name="app_contributors">Mede mogelijk gemaakt door: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Deze groep bevat geen kaarten</string>
<string name="toggleMoreInfo">Meer informatie tonen/verbergen</string>
<string name="barcodeImageDescriptionWithType">Afbeelding van de barcode, type <xliff:g>%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Afbeelding van barcode <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Veeg of houd lang ingedrukt om te bladeren</string>
<string name="sort_by">Sorteren op</string>
<string name="reverse">Omdraaien</string>
<string name="reverse">…in omgekeerde volgorde</string>
<string name="sort_by_balance">Op saldo</string>
<string name="sort_by_expiry">Op vervaldatum</string>
<string name="sort_by_most_recently_used">Op onlangs gebruikt</string>
@@ -214,10 +214,12 @@
<string name="group_updated">De groep is bijgewerkt</string>
<string name="group_name_is_empty">Voer een groepsnaam in</string>
<string name="editGroup">Groep bewerken: <xliff:g>%s</xliff:g></string>
<string name="noGiftCardsGroup">Je hebt nog geen klantenkaarten toegevoegd. Voeg kaarten toe om ze hier te kunnen groeperen.</string>
<string name="noGiftCardsGroup">Voeg kaarten toe om ze hier te kunnen groeperen.</string>
<string name="group_edit">Groep bewerken</string>
<string name="setIcon">Kies een pictogram</string>
<string name="selectColor">Kies een kleur</string>
<string name="action_show_details">Details tonen</string>
<string name="action_hide_details">Details verbergen</string>
<string name="translate_platform">op Weblate</string>
<string name="shortcutSelectCard">Kies een kaart</string>
</resources>

View File

@@ -2,9 +2,9 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="exporting">Exportacion…</string>
<string name="importing">Importacion…</string>
<string name="exportFailed">Exportacion pas possibla</string>
<string name="exportFailed">Exportacion pas possibla: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Exportat</string>
<string name="importFailed">Importacion de vòstras cartas impossibla</string>
<string name="importFailed">Importacion de vòstras cartas impossibla: <xliff:g>%s</xliff:g></string>
<string name="importFailedTitle">Fracàs de limportacion</string>
<string name="importSuccessfulTitle">Importat</string>
<string name="importExportHelp">Exportar vòstras cartas vos permet de las recuperar sus un autre aparelh.</string>

View File

@@ -33,10 +33,10 @@
<string name="importExportHelp">Zarchiwizowane dane umożliwiają przeniesienie kart na inne urządzenie.</string>
<string name="importSuccessfulTitle">Zaimportowano</string>
<string name="importFailedTitle">Import nie powiódł się</string>
<string name="importFailed">Nie udało się zaimportować</string>
<string name="importFailed">Nie udało się zaimportować: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Wyeksportowano</string>
<string name="exportFailedTitle">Eksport nie powiódł się</string>
<string name="exportFailed">Nie udało się wyeksportować</string>
<string name="exportFailed">Nie udało się wyeksportować: <xliff:g>%s</xliff:g></string>
<string name="importing">Importowanie…</string>
<string name="exporting">Eksportowanie…</string>
<string name="noExternalStoragePermissionError">Najpierw przyznaj uprawnienia pamięci zewnętrznej do importowania lub eksportowania kart</string>

View File

@@ -78,10 +78,10 @@
<string name="importExportHelp">A cópia de segurança dos seus cartões permite-lhe movê-los para outro dispositivo.</string>
<string name="importSuccessfulTitle">Importado</string>
<string name="importFailedTitle">A importação falhou</string>
<string name="importFailed">Não foi possível importar os cartões</string>
<string name="importFailed">Não foi possível importar os cartões: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Exportado</string>
<string name="exportFailedTitle">A exportação falhou</string>
<string name="exportFailed">Não foi possível exportar os cartões</string>
<string name="exportFailed">Não foi possível exportar os cartões: <xliff:g>%s</xliff:g></string>
<string name="importing">A importar…</string>
<string name="exporting">A exportar…</string>
<string name="settings_sky_blue_theme">Azul céu</string>

View File

@@ -35,9 +35,9 @@
<string name="exportName">Exportați</string>
<string name="importSuccessfulTitle">Importat</string>
<string name="importFailedTitle">Importul a eșuat</string>
<string name="importFailed">Nu s-a putut importa carduri</string>
<string name="importFailed">Nu s-a putut importa carduri: <xliff:g>%s</xliff:g></string>
<string name="noCardIdError">Nu s-a introdus niciun ID de card</string>
<string name="exportFailed">Nu s-a putut exporta carduri</string>
<string name="exportFailed">Nu s-a putut exporta carduri: <xliff:g>%s</xliff:g></string>
<string name="importing">Importul…</string>
<string name="exporting">Exportul…</string>
<string name="noExternalStoragePermissionError">Acordați mai întâi permisiunea de stocare externă pentru a importa sau exporta carduri</string>

View File

@@ -8,7 +8,7 @@
<string name="note">Примечание</string>
<string name="cardId">Номер карты</string>
<string name="barcodeType">Тип штрих-кода</string>
<string name="barcodeNoBarcode">Эта карта без штрих-кода</string>
<string name="barcodeNoBarcode">Нет штрих-кода</string>
<string name="cancel">Отмена</string>
<string name="save">Сохранить</string>
<string name="edit">Изменить</string>
@@ -26,21 +26,21 @@
<string name="cardShortcut">Ярлык карты</string>
<string name="noCardsMessage">Сначала добавьте карту</string>
<string name="noStoreError">Название не указано</string>
<string name="noCardIdError">Номер карты не указан</string>
<string name="noCardIdError">Номер не указан</string>
<string name="noCardExistsError">Карта не найдена</string>
<string name="failedParsingImportUriError">Невозможно разобрать импортируемый URI</string>
<string name="importExport">Импорт/Экспорт</string>
<string name="exportName">Экспорт</string>
<string name="importExportHelp">Резервное копирование карт позволяет перенести их на другое устройство.</string>
<string name="importExportHelp">Резервное копирование данных позволяет перенести их на другое устройство.</string>
<string name="importSuccessfulTitle">Импортировано</string>
<string name="importFailedTitle">Импорт не выполнен</string>
<string name="importFailed">Невозможно импортировать карты</string>
<string name="importFailed">Невозможно импортировать карты: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Экспортировано</string>
<string name="exportFailedTitle">Экспорт не выполнен</string>
<string name="exportFailed">Невозможно экспортировать карты</string>
<string name="exportFailed">Невозможно экспортировать карты: <xliff:g>%s</xliff:g></string>
<string name="importing">Импорт…</string>
<string name="exporting">Экспорт…</string>
<string name="noExternalStoragePermissionError">Импорт или экспорт невозможен без разрешения на доступ к хранилищу</string>
<string name="noExternalStoragePermissionError">Импорт или экспорт данных невозможен без разрешения на доступ к хранилищу</string>
<string name="exportOptionExplanation">Данные будут записаны в выбранное место.</string>
<string name="importOptionFilesystemTitle">Импорт из файловой системы</string>
<string name="importOptionFilesystemExplanation">Выберете файл на файловой системе.</string>
@@ -54,9 +54,9 @@
<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">Выбор штрих-кода</string>
<string name="enterBarcodeInstructions">Введите номер карты и выберите тип штрих-кода (или выберите \"Эта карта без штрих-кода\").</string>
<string name="copy_to_clipboard_toast">Номер карты скопирован в буфер обмена</string>
<string name="thumbnailDescription">Логотип карты</string>
<string name="enterBarcodeInstructions">Введите номер и выберите тип штрих-кода (или выберите \"Нет штрих-кода\").</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_theme">Тема</string>
@@ -66,12 +66,12 @@
<string name="settings_display_barcode_max_brightness">Максимальная яркость при показе карты</string>
<string name="settings_lock_barcode_orientation">Портретная ориентация экрана при показе карты</string>
<string name="intent_import_card_from_url_share_text">Я хочу поделиться с вами картой</string>
<string name="exportSuccessful">Данные карт успешно экспортированы</string>
<string name="exportSuccessful">Данные успешно экспортированы</string>
<string name="all">Все</string>
<string name="noGroups">Нажмите кнопку \"+\", чтобы добавить группы для упорядочивания записей.</string>
<string name="noGroups">Нажмите кнопку \"+\", чтобы добавить группы для распределения записей.</string>
<string name="groups">Группы</string>
<string name="enter_group_name">Введите название группы</string>
<string name="importSuccessful">Данные карт успешно импортированы</string>
<string name="importSuccessful">Данные успешно импортированы</string>
<string name="starImage">Звезда избранного</string>
<string name="app_copyright_old">На основе Loyalty Card Keychain
\nавторские права © 20162020 Branden Archer</string>
@@ -88,7 +88,7 @@
<string name="expiryStateSentence">Срок действия истекает: <xliff:g>%s</xliff:g></string>
<string name="points">Баллы</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> не похож на правильный баланс.</string>
<string name="addManually">Ручной ввод номера карты</string>
<string name="addManually">Ручной ввод номера</string>
<string name="privacy_policy_popup_text">Уведомление о политике конфиденциальности (требуется некоторыми магазинами приложений):
\n
\nНИКАКИЕ ДАННЫЕ НЕ СОБИРАЮТСЯ ВООБЩЕ, что может подтвердить любой, так как наше приложение является свободным программным обеспечением.</string>
@@ -133,7 +133,7 @@
<string name="noBarcodeFound">Штрих-код не найден</string>
<string name="addFromImage">Выбрать изображение из галереи</string>
<string name="setBarcodeId">Указать значение</string>
<string name="sameAsCardId">Как номер карты</string>
<string name="sameAsCardId">Как номер</string>
<string name="barcodeId">Значение штрих-кода</string>
<string name="settings_max_font_size_scale">Максимальный размер шрифта</string>
<string name="unsupportedBarcodeType">В настоящее время данный тип штрих-кодов не отображается. Его поддержка может быть добавлена в следующих версиях приложения.</string>
@@ -142,9 +142,9 @@
<string name="app_libraries">Свободные сторонние библиотеки: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Авторские права © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Поделиться картами</string>
<string name="card_ids_copied">Скопированные номера карт</string>
<string name="copy_to_clipboard_multiple_toast">Номера карт скопированы в буфер обмена</string>
<string name="updateBarcodeQuestionText">Вы изменили номер карты. Обновить также значение штрих-кода, чтобы использовалось одинаковое значение\?</string>
<string name="card_ids_copied">Скопированные номера</string>
<string name="copy_to_clipboard_multiple_toast">Номера скопированы в буфер обмена</string>
<string name="updateBarcodeQuestionText">Вы изменили номер. Обновить также значение штрих-кода, чтобы использовалось одинаковое значение\?</string>
<string name="no">Нет</string>
<string name="yes">Да</string>
<string name="updateBarcodeQuestionTitle">Обновить значение штрих-кода\?</string>
@@ -152,8 +152,8 @@
<string name="setFrontImage">Изображение лицевой стороны</string>
<string name="takePhoto">Сфотографировать</string>
<string name="removeImage">Удалить изображение</string>
<string name="backImageDescription">Задняя сторона карты</string>
<string name="frontImageDescription">Лицевая сторона карты</string>
<string name="backImageDescription">Задняя сторона</string>
<string name="frontImageDescription">Лицевая сторона</string>
<string name="photos">Фото</string>
<string name="importStocardMessage">Выберите для импортирования файл <i>***-sync.zip</i>.
\nЭтот файл можно получить по электронной почте от support@stocardapp.com, предварительно запросив экспорт ваших данных.</string>
@@ -163,10 +163,10 @@
<string name="turn_flashlight_off">Отключить вспышку</string>
<string name="turn_flashlight_on">Включить вспышку</string>
<plurals name="selectedCardCount">
<item quantity="one">Выбрано: <xliff:g>%d</xliff:g> карта</item>
<item quantity="few">Выбрано: <xliff:g>%d</xliff:g> карты</item>
<item quantity="many">Выбрано: <xliff:g>%d</xliff:g> карт</item>
<item quantity="other">Выбрано: <xliff:g>%d</xliff:g> карт</item>
<item quantity="one"><xliff:g>%d</xliff:g> выбрана</item>
<item quantity="few"><xliff:g>%d</xliff:g> выбраны</item>
<item quantity="many"><xliff:g>%d</xliff:g> выбрано</item>
<item quantity="other"><xliff:g>%d</xliff:g> выбрано</item>
</plurals>
<string name="deleteTitle">Удаление карты</string>
<string name="deleteConfirmation">Удалить карту\?</string>
@@ -195,13 +195,13 @@
<string name="settings_pink_theme">Розовый</string>
<string name="settings_theme_color">Цвет темы</string>
<string name="app_contributors">Создано при поддержке: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">В группе нет карт</string>
<string name="barcodeImageDescriptionWithType">Изображение штрих-кода карты типа <xliff:g>%s</xliff:g></string>
<string name="noGroupCards">Группа пуста</string>
<string name="barcodeImageDescriptionWithType">Изображение штрих-кода <xliff:g>%s</xliff:g></string>
<string name="toggleMoreInfo">Переключение отображения дополнительной информации</string>
<string name="swipeToSwitchImages">Смахивание или долгое нажатие для переключения изображений</string>
<string name="sort_by_expiry">Срок действия</string>
<string name="sort_by">Сортировать по</string>
<string name="reverse">Обратный порядок</string>
<string name="reverse">…в обратном порядке</string>
<string name="sort_by_balance">Баланс</string>
<string name="sort_by_most_recently_used">Частота использования</string>
<string name="sort_by_name">Название</string>
@@ -223,9 +223,11 @@
<string name="editGroup">Редактирование группы: <xliff:g>%s</xliff:g></string>
<string name="group_edit">Изменить группу</string>
<string name="group_name_already_in_use">Такое название группы уже существует</string>
<string name="noGiftCardsGroup">У вас ещё нет ни одной карты. Как только появится несколько карт, вы сможете добавить их в группу здесь.</string>
<string name="noGiftCardsGroup">Создайте несколько карт, а затем распределите их по группам здесь.</string>
<string name="setIcon">Выбор значка</string>
<string name="selectColor">Выбрать цвет</string>
<string name="action_hide_details">Скрыть детали</string>
<string name="action_show_details">Показать детали</string>
</resources>
<string name="translate_platform">на Weblate</string>
<string name="shortcutSelectCard">Выбор карты</string>
</resources>

View File

@@ -28,10 +28,10 @@
<string name="importExportHelp">Zálohovanie dát Vám umožní presunúť Vaše uložené karty na iné zariadenie.</string>
<string name="importSuccessfulTitle">Import bol úspešný</string>
<string name="importFailedTitle">Import zlyhal</string>
<string name="importFailed">Zlyhal import</string>
<string name="importFailed">Zlyhal import: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Export bol úspešný</string>
<string name="exportFailedTitle">Export zlyhal</string>
<string name="exportFailed">Zlyhal export</string>
<string name="exportFailed">Zlyhal export: <xliff:g>%s</xliff:g></string>
<string name="importing">Importujem…</string>
<string name="exporting">Exportujem…</string>
<string name="noExternalStoragePermissionError">Nie je možné importovať a exportovať karty bez prístupu k externému úložisku</string>

View File

@@ -28,10 +28,10 @@
<string name="importExportHelp">Varnostna kopija omogoča varen prenos kartic na druge naprave.</string>
<string name="importSuccessfulTitle">Uvoz je bil uspešen</string>
<string name="importFailedTitle">Uvoz ni uspel</string>
<string name="importFailed">Napaka pri uvozu</string>
<string name="importFailed">Napaka pri uvozu: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Izvoz je uspel</string>
<string name="exportFailedTitle">Izvoz ni uspel</string>
<string name="exportFailed">Napaka pri izvozu</string>
<string name="exportFailed">Napaka pri izvozu: <xliff:g>%s</xliff:g></string>
<string name="importing">Uvažanje…</string>
<string name="exporting">Izvažanje…</string>
<string name="noExternalStoragePermissionError">Izvažanje in uvažanje je nemogoče brez omogočenega dostopa do zunanje shrambe</string>

View File

@@ -4,21 +4,21 @@
<string name="settings_display_barcode_max_brightness">Gör streckkodsvyn ljusare</string>
<string name="settings_max_font_size_scale">Max. teckenstorlek</string>
<string name="settings_keep_screen_on">Håll skärmen påslagen</string>
<string name="enterBarcodeInstructions">Ange kortets ID och välj antingen streckkodstyp nedan, eller \"Detta kort har ingen streckkod\".</string>
<string name="enterBarcodeInstructions">Ange ID:t och välj antingen streckkodstyp nedan, eller \"Det finns ingen streckkod\".</string>
<string name="importFidmeMessage">Välj den exporterade <i>fidme-export-request-xxxxxx.zip</i> från FidMe som du vill importera och välj streckkodstyper manuellt efteråt.
\nSkapa den från din FidMe-profil först genom att välja \"Data Protection\" och sen trycka på \"Extract my data\".</string>
<string name="importOptionApplicationExplanation">Använd vilken app som helst eller den filhanterare du föredrar för att öppna en fil.</string>
<string name="importOptionApplicationButton">Använd en annan app</string>
<string name="intent_import_card_from_url_share_text">Jag vill dela ett kort med dig</string>
<string name="noGroups">Klicka på plus(+)-knappen för att lägga till kategorigrupper först.</string>
<string name="noGroups">Klicka på plus(+)-knappen för att lägga till kategorigrupper.</string>
<string name="groupsList">Grupper: <xliff:g>%s</xliff:g></string>
<string name="errorReadingImage">Kunde inte läsa bilden</string>
<string name="currency">Valuta</string>
<string name="failedGeneratingShareURL">Kunde inte skapa en delningsbar URL. Var snäll och rapportera detta.</string>
<string name="card_ids_copied">Kopierade kort ID:n</string>
<string name="card_ids_copied">Kopierade ID:n</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kort valt</item>
<item quantity="other"><xliff:g>%d</xliff:g> kort valda</item>
<item quantity="one"><xliff:g>%d</xliff:g> valt</item>
<item quantity="other"><xliff:g>%d</xliff:g> valda</item>
</plurals>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="importLoyaltyCardKeychainMessage">Välj den exporterade <i>LoyaltyCardKeychain.csv</i> från Loyalty Card Keychain som du vill importera.
@@ -40,7 +40,7 @@
<string name="moveDown">Flytta nedåt</string>
<string name="leaveWithoutSaveTitle">Avsluta</string>
<string name="leaveWithoutSaveConfirmation">Avsluta utan att spara\?</string>
<string name="addManually">Ange kort-ID manuellt</string>
<string name="addManually">Ange ID manuellt</string>
<string name="addFromImage">Välj bild från galleriet</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> poäng</string>
<string name="card">Kort</string>
@@ -62,21 +62,21 @@
<string name="passwordRequired">Var snäll och ange lösenordet</string>
<string name="no">Nej</string>
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionText">Du ändrade kortets ID. Vill du uppdatera så att streckkoden också använder samma värde\?</string>
<string name="updateBarcodeQuestionText">Du ändrade ID:t. Vill du uppdatera streckkoden så att den också använder samma värde\?</string>
<string name="updateBarcodeQuestionTitle">Uppdatera streckkodsvärde\?</string>
<string name="takePhoto">Ta ett foto</string>
<string name="removeImage">Ta bort bild</string>
<string name="setBackImage">Ange baksidesbild</string>
<string name="setFrontImage">Ange framsidesbild</string>
<string name="photos">Foton</string>
<string name="backImageDescription">Bild av kortets baksida</string>
<string name="frontImageDescription">Bild av kortets framsida</string>
<string name="backImageDescription">Baksidesbild</string>
<string name="frontImageDescription">Framsidesbild</string>
<string name="intent_import_card_from_url_share_multiple_text">Jag vill dela några kort med dig</string>
<string name="copy_to_clipboard_multiple_toast">Kort-ID:n kopierades till Urklipp</string>
<string name="copy_to_clipboard_multiple_toast">ID:n kopierades till Urklipp</string>
<string name="wrongValueForBarcodeType">Värdet är inte giltigt för den valda streckkodstypen</string>
<string name="unsupportedBarcodeType">Denna streckkodstyp kan ännu inte visas. Den kan komma att stödjas i en senare version av appen.</string>
<string name="setBarcodeId">Ange streckkodsvärde</string>
<string name="sameAsCardId">Samma som kort-ID</string>
<string name="sameAsCardId">Samma som ID:t</string>
<string name="turn_flashlight_on">Sätt på ficklampa</string>
<string name="turn_flashlight_off">Stäng av ficklampa</string>
<string name="settings_dark_theme">Mörkt</string>
@@ -84,8 +84,8 @@
<string name="settings_theme">Tema</string>
<string name="settings_category_title_ui">Användargränssnitt</string>
<string name="settings">Inställningar</string>
<string name="thumbnailDescription">Miniatyrbild av kort</string>
<string name="copy_to_clipboard_toast">Kort-ID kopierat till Urklipp</string>
<string name="thumbnailDescription">Miniatyrbild</string>
<string name="copy_to_clipboard_toast">ID:t kopierat till Urklipp</string>
<string name="selectBarcodeTitle">Välj streckkod</string>
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="about_title_fmt">Om <xliff:g id="app_name">%s</xliff:g></string>
@@ -99,14 +99,14 @@
<string name="importOptionFilesystemTitle">Importera från filsystem</string>
<string name="exporting">Exporterar…</string>
<string name="importing">Importerar…</string>
<string name="exportFailed">Kunde inte exportera kort</string>
<string name="importFailed">Kunde inte importera kort</string>
<string name="exportFailed">Kunde inte exportera kort: <xliff:g>%s</xliff:g></string>
<string name="importFailed">Kunde inte importera kort: <xliff:g>%s</xliff:g></string>
<string name="importSuccessfulTitle">Importen lyckades</string>
<string name="importFailedTitle">Importen misslyckades</string>
<string name="importExportHelp">Säkerhetskopiering av dina kort låter dig flytta dem till en annan enhet.</string>
<string name="importExportHelp">Säkerhetskopiering av din data möjliggör förflyttning av den till en annan enhet.</string>
<string name="importExport">Importera/Exportera</string>
<string name="noCardExistsError">Kunde inte hitta kort</string>
<string name="noCardIdError">Inget kort-ID har angivits</string>
<string name="noCardExistsError">Kunde inte hitta det kortet</string>
<string name="noCardIdError">Inget ID har angivits</string>
<string name="noStoreError">Inget namn har angivits</string>
<string name="noCardsMessage">Lägg till ett kort först</string>
<string name="cardShortcut">Kort-genväg</string>
@@ -134,19 +134,19 @@
<string name="unstar">Ta bort från favoriter</string>
<string name="star">Lägg till i favoriter</string>
<string name="noBarcode">Ingen streckkod</string>
<string name="barcodeNoBarcode">Detta kort har ingen streckkod</string>
<string name="barcodeNoBarcode">Det finns ingen streckkod</string>
<string name="barcodeType">Streckkodstyp</string>
<string name="cardId">Kort-ID</string>
<string name="storeName">Namn</string>
<string name="noMatchingGiftCards">Hittade ingenting. Försök justera din sökning.</string>
<string name="noGiftCards">Klicka på plus(+)-knappen för att lägga till ett kort, eller importera några från ⋮-menyn först.</string>
<string name="noMatchingGiftCards">Inget resultat. Försök justera din sökning.</string>
<string name="noGiftCards">Klicka på plus(+)-knappen för att lägga till ett kort, eller importera några från ⋮-menyn.</string>
<string name="action_add">Lägg till</string>
<string name="action_search">Sök</string>
<string name="exportOptionExplanation">Datan kommer att sparas till en plats som du väljer.</string>
<string name="exportName">Exportera</string>
<string name="exportFailedTitle">Exporten misslyckades</string>
<string name="exportSuccessfulTitle">Exporten lyckades</string>
<string name="scanCardBarcode">Skanna streckkod på kort</string>
<string name="scanCardBarcode">Skanna streckkod</string>
<string name="settings_system_theme">Systemtemat</string>
<string name="app_revision_fmt">Ändringsinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="privacy_policy_popup_text">Notis rörande integritetspolicy (krävs av vissa appbutiker):
@@ -169,13 +169,13 @@
<string name="importCatimaMessage">Välj den exporterade <i>catima.zip</i> från Catima som du vill importera.
\nSkapa den från Import/Export-menyn i en annan Catima-app genom att trycka på Exportera där först.</string>
<string name="expiryStateSentence">Giltigt till: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessful">Kortdata exporterad</string>
<string name="importSuccessful">Kortdata importerad</string>
<string name="exportSuccessful">Data exporterad</string>
<string name="importSuccessful">Data importerad</string>
<string name="failedParsingImportUriError">Kunde inte tolka import-URI:n</string>
<string name="note">Anteckning</string>
<string name="settings_system_locale">System</string>
<string name="settings_locale">Språk</string>
<string name="noExternalStoragePermissionError">Bevilja tillstånd för extern lagring för att först importera eller exportera kort</string>
<string name="noExternalStoragePermissionError">Bevilja tillstånd för extern lagring för att kunna importera eller exportera data</string>
<string name="app_contributors">Möjliggjordes av: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="settings_brown_theme">Brunt</string>
<string name="settings_grey_theme">Grått</string>
@@ -187,11 +187,11 @@
<string name="settings_pink_theme">Rosa</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_theme_color">Temafärg</string>
<string name="noGroupCards">Denna grupp innehåller inga kort</string>
<string name="noGroupCards">Denna grupp är tom</string>
<string name="toggleMoreInfo">Växla mellan att visa mer info</string>
<string name="barcodeImageDescriptionWithType">Bild av kortstreckkod av typen <xliff:g>%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Bild <xliff:g>%s</xliff:g> streckkod</string>
<string name="swipeToSwitchImages">Svep eller tryck länge för att växla bild</string>
<string name="reverse">Vänd ordning</string>
<string name="reverse">...i omvänd ordning</string>
<string name="sort_by">Sortera efter</string>
<string name="sort_by_balance">Saldo</string>
<string name="sort_by_expiry">Förfallodag</string>
@@ -219,5 +219,7 @@
<string name="action_hide_details">Dölj detaljer</string>
<string name="credits">Bidragsgivare</string>
<string name="source_repository">Källkodslager</string>
<string name="noGiftCardsGroup">Du har inga kundkort än. När du senare lägger till några kan du placera dem i den här gruppen.</string>
</resources>
<string name="noGiftCardsGroup">Skapa några kort och placera dem sedan i den här gruppen.</string>
<string name="translate_platform">på Weblate</string>
<string name="shortcutSelectCard">Välj ett kort</string>
</resources>

View File

@@ -21,21 +21,21 @@
<string name="passwordRequired">Lütfen parolayı girin</string>
<string name="no">Hayır</string>
<string name="yes">Evet</string>
<string name="updateBarcodeQuestionText">Kart numarasını değiştirdiniz. Aynı değeri kullanmak için barkodu da güncellemek ister misiniz\?</string>
<string name="updateBarcodeQuestionText">Numarayı değiştirdiniz. Aynı değeri kullanmak için barkodu da güncellemek ister misiniz\?</string>
<string name="updateBarcodeQuestionTitle">Barkod değeri güncellensin mi\?</string>
<string name="takePhoto">Fotoğraf çek</string>
<string name="backImageDescription">Kartın arka resmi</string>
<string name="frontImageDescription">Kartın ön resmi</string>
<string name="backImageDescription">Arka resmi</string>
<string name="frontImageDescription">Ön resmi</string>
<string name="removeImage">Resmi kaldır</string>
<string name="setBackImage">Arka resmi ayarla</string>
<string name="setFrontImage">Ön resmi ayarla</string>
<string name="photos">Fotoğraflar</string>
<string name="intent_import_card_from_url_share_multiple_text">Seninle birkaç kart paylaşmak istiyorum</string>
<string name="copy_to_clipboard_multiple_toast">Kart numaraları panoya kopyalandı</string>
<string name="copy_to_clipboard_multiple_toast">Numaralar panoya kopyalandı</string>
<string name="wrongValueForBarcodeType">Değer, seçilen barkod türü için geçerli değil</string>
<string name="unsupportedBarcodeType">Bu barkod türü henüz görüntülenemiyor. Uygulamanın sonraki bir sürümünde desteklenebilir.</string>
<string name="setBarcodeId">Barkod değerini ayarla</string>
<string name="sameAsCardId">Kart numarasıyla aynı</string>
<string name="sameAsCardId">Numarayla aynı</string>
<string name="barcodeId">Barkod değeri</string>
<string name="importVoucherVaultMessage">İçe aktarmak için Voucher Vault\'tan dışa aktardığınız <i>vouchervault.json</i> dosyasını seçin.
\nÖnce Voucher Vault\'ta \"Dışa aktar\" düğmesine basarak bir tane oluşturun.</string>
@@ -79,7 +79,7 @@
<string name="expiryStateSentence">Son kullanma tarihi: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Gruplar: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Galeriden resim seç</string>
<string name="addManually">Kart numarasını elle gir</string>
<string name="addManually">Numarayı elle gir</string>
<string name="leaveWithoutSaveConfirmation">Kaydetmeden çıkılsın mı\?</string>
<string name="leaveWithoutSaveTitle">Çıkış</string>
<string name="moveDown">Aşağı git</string>
@@ -91,12 +91,12 @@
<item quantity="one"><xliff:g>%d</xliff:g> kart</item>
<item quantity="other"><xliff:g>%d</xliff:g> kart</item>
</plurals>
<string name="noGroupCards">Bu grup hiç kart içermiyor</string>
<string name="noGroups">Önce kategorilere ayırmak üzere gruplar eklemek için + artı düğmesine tıklayın.</string>
<string name="noGroupCards">Bu grup boş</string>
<string name="noGroups">Kategorilere ayırmak üzere gruplar eklemek için + artı düğmesine tıklayın.</string>
<string name="groups">Gruplar</string>
<string name="enter_group_name">Grup adını girin</string>
<string name="exportSuccessful">Kart verileri dışa aktarıldı</string>
<string name="importSuccessful">Kart verileri içe aktarıldı</string>
<string name="exportSuccessful">Veriler dışa aktarıldı</string>
<string name="importSuccessful">Veriler içe aktarıldı</string>
<string name="intent_import_card_from_url_share_text">Seninle bir kart paylaşmak istiyorum</string>
<string name="settings_disable_lockscreen_while_viewing_card">Ekran kilidini engelle</string>
<string name="settings_keep_screen_on">Ekranıık tut</string>
@@ -110,9 +110,9 @@
<string name="settings_category_title_ui">Kullanıcı arayüzü</string>
<string name="settings">Ayarlar</string>
<string name="starImage">Sık kullanılan yıldız</string>
<string name="thumbnailDescription">Kart için küçük resim</string>
<string name="copy_to_clipboard_toast">Kart numarası panoya kopyalandı</string>
<string name="enterBarcodeInstructions">Kart numarasını girin ve aşağıdan barkod türünü veya “Bu kartın barkodu yok” seçeneğini seçin.</string>
<string name="thumbnailDescription">Küçük resim</string>
<string name="copy_to_clipboard_toast">Numara panoya kopyalandı</string>
<string name="enterBarcodeInstructions">Numarasını girin ve aşağıdan barkod türünü veya “Barkod yok” seçeneğini seçin.</string>
<string name="selectBarcodeTitle">Barkod Seç</string>
<string name="app_resources">Özgür üçüncü taraf kaynakları: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Özgür üçüncü taraf kütüphaneleri: <xliff:g id="app_libraries_list">%s</xliff:g></string>
@@ -131,29 +131,29 @@
<string name="importOptionFilesystemExplanation">Dosya sisteminden belirli bir dosya seçin.</string>
<string name="importOptionFilesystemTitle">Dosya sisteminden içe aktar</string>
<string name="exportOptionExplanation">Veriler seçtiğiniz bir konuma yazılacak.</string>
<string name="noExternalStoragePermissionError">Kartları içe veya dışa aktarmak için önce harici depolama izni verin</string>
<string name="noExternalStoragePermissionError">Verileri içeri veya dışarı aktarmak için harici depolama izni verin</string>
<string name="exporting">Dışa aktarılıyor…</string>
<string name="importing">İçe aktarılıyor…</string>
<string name="exportFailed">Kartlar dışa aktarılamadı</string>
<string name="exportFailed">Kartlar dışa aktarılamadı: <xliff:g>%s</xliff:g></string>
<string name="exportFailedTitle">Dışa aktarılamadı</string>
<string name="exportSuccessfulTitle">Dışa aktarıldı</string>
<string name="importFailed">Kartlar içe aktarılamadı</string>
<string name="importFailed">Kartlar içe aktarılamadı: <xliff:g>%s</xliff:g></string>
<string name="importFailedTitle">İçe aktarılamadı</string>
<string name="importSuccessfulTitle">İçe aktarıldı</string>
<string name="importExportHelp">Kartlarınızı yedeklemek, onları başka bir aygıta taşımanıza olanak tanır.</string>
<string name="importExportHelp">Verilerinizi yedeklemek, onları başka bir aygıta taşımanıza olanak tanır.</string>
<string name="exportName">Dışa aktar</string>
<string name="importExport">İçe/Dışa aktar</string>
<string name="failedParsingImportUriError">İçe aktarma URI\'si ayrıştırılamadı</string>
<string name="noCardExistsError">Kart bulunamadı</string>
<string name="noCardIdError">Kart numarası girilmedi</string>
<string name="noCardExistsError">Bu kart bulunamadı</string>
<string name="noCardIdError">Numara girilmedi</string>
<string name="noStoreError">Ad girilmedi</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> türündeki kart barkodunun görüntüsü</string>
<string name="card_ids_copied">Kart numara(lar)ı kopyalandı</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> barkod görüntüsü</string>
<string name="card_ids_copied">Numara(lar) kopyalandı</string>
<string name="copy_to_clipboard">Numarayı panoya kopyala</string>
<string name="cardId">Kart numarası</string>
<string name="noCardsMessage">Önce bir kart ekleyin</string>
<string name="cardShortcut">Kart Kısayolu</string>
<string name="scanCardBarcode">Kart Barkodunu Tara</string>
<string name="scanCardBarcode">Barkod Tara</string>
<string name="addCardTitle">Kart Ekle</string>
<string name="editCardTitle">Kartı Düzenle</string>
<string name="sendLabel">Gönder…</string>
@@ -179,20 +179,20 @@
<string name="unstar">Sık kullanılanlardan kaldır</string>
<string name="star">Sık kullanılanlara ekle</string>
<string name="noBarcode">Barkod yok</string>
<string name="barcodeNoBarcode">Bu kartın barkodu yok</string>
<string name="barcodeNoBarcode">Barkod yok</string>
<string name="barcodeType">Barkod türü</string>
<string name="note">Not</string>
<string name="storeName">Ad</string>
<string name="noMatchingGiftCards">Hiçbir şey bulunamadı. Aramanızı değiştirmeyi deneyin.</string>
<string name="noGiftCards">Bir kart eklemek için + artı düğmesine tıklayın veya önce ⋮ menüsünden birkaçını içe aktarın.</string>
<string name="noMatchingGiftCards">Sonuç yok. Aramanızı değiştirmeyi deneyin.</string>
<string name="noGiftCards">Bir kart eklemek için + artı düğmesine tıklayın veya ⋮ menüsünden birkaçını içe aktarın.</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kart seçildi</item>
<item quantity="other"><xliff:g>%d</xliff:g> kart seçildi</item>
<item quantity="one"><xliff:g>%d</xliff:g> seçildi</item>
<item quantity="other"><xliff:g>%d</xliff:g> seçildi</item>
</plurals>
<string name="action_add">Ekle</string>
<string name="action_search">Ara</string>
<string name="sort_by">Sıralama ölçütü</string>
<string name="reverse">Ters</string>
<string name="reverse">…ters sırada</string>
<string name="sort_by_balance">Bakiye</string>
<string name="sort_by_expiry">Son kullanma tarihi</string>
<string name="sort_by_most_recently_used">En Son Kullanılan</string>
@@ -210,7 +210,7 @@
<string name="version_history">Sürüm Geçmişi</string>
<string name="exportPassword">Dışa aktarmanızı korumak için bir parola belirleyin (isteğe bağlı)</string>
<string name="exportPasswordHint">Parola girin</string>
<string name="noGiftCardsGroup">Henüz sadakat kartınız yok. Birkaç tane ekledikten sonra, onları burada gruba atayabilirsiniz.</string>
<string name="noGiftCardsGroup">Birkaç kart oluşturun ve ardından onları burada gruba atayın.</string>
<string name="group_name_already_in_use">Grup adı zaten kullanılıyor</string>
<string name="editGroup">Grup Düzenleniyor: <xliff:g>%s</xliff:g></string>
<string name="group_edit">Grubu Düzenle</string>
@@ -220,4 +220,6 @@
<string name="setIcon">Simge ayarla</string>
<string name="action_show_details">Ayrıntıları göster</string>
<string name="action_hide_details">Ayrıntıları gizle</string>
</resources>
<string name="translate_platform">Weblate\'de</string>
<string name="shortcutSelectCard">Kart seç</string>
</resources>

View File

@@ -3,13 +3,13 @@
<string name="privacy_policy_popup_text">Політика конфіденційності (вимагається деякими магазинами):
\n
\nЖОДНОЇ ІНФОРМАЦІЇ НЕ ЗБИРАЄТЬСЯ, що може підтвердити будь-хто, адже наша програма це вільне програмне забезпечення.</string>
<string name="noGiftCards">Натисніть + щоб додати карту чи спочатку імпортуйте з ⋮ меню.</string>
<string name="noGiftCards">Натисніть + щоб додати карту чи імпортуйте з ⋮ меню.</string>
<string name="settings_display_barcode_max_brightness">Яскравіший штрих-код</string>
<string name="enterBarcodeInstructions">Введіть ID карти та оберіть тип штрих-коду чи \"Ця карта не має штрих-коду\".</string>
<string name="enterBarcodeInstructions">Введіть ID та оберіть тип штрих-коду чи \"Не має штрих-коду\".</string>
<string name="selectBarcodeTitle">Оберіть штрих-код</string>
<string name="scanCardBarcode">Відсканувати штрих-код карти</string>
<string name="scanCardBarcode">Відсканувати штрих-код</string>
<string name="noBarcode">Без штрих-коду</string>
<string name="barcodeNoBarcode">Ця карта не має штрих-коду</string>
<string name="barcodeNoBarcode">Штрих-код відсутній</string>
<string name="barcodeType">Тип штрих-коду</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> картка</item>
@@ -19,12 +19,12 @@
</plurals>
<string name="no">НІ</string>
<string name="yes">Так</string>
<string name="updateBarcodeQuestionText">Ви змінили ID картки. Чи ви бажаєте оновити штрих-код для використання цього ж значення\?</string>
<string name="updateBarcodeQuestionText">Ви змінили ID. Чи ви бажаєте оновити штрих-код для використання цього ж значення\?</string>
<string name="updateBarcodeQuestionTitle">Оновити значення штрих-коду\?</string>
<string name="wrongValueForBarcodeType">Значення не дійсне для обраного типу штрих-коду</string>
<string name="unsupportedBarcodeType">Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в подальших версіях програми.</string>
<string name="setBarcodeId">Встановіть значення штрих-коду</string>
<string name="sameAsCardId">Таке ж як ID картки</string>
<string name="sameAsCardId">Таке ж як ID</string>
<string name="barcodeId">Значення штрих-коду</string>
<string name="importVoucherVaultMessage">Оберіть Voucher Vault експорт-файл названий <i>vouchervault.json</i> для імпортування.
\nСтворіть його натиснувши \"Експорт\" у Voucher Vault.</string>
@@ -34,7 +34,7 @@
<string name="importCatimaMessage">Оберіть експорт-файл названий <i>catima.zip</i> для імпортування.
\nСтворіть його з меню імпорту/експорту у іншій Catima, натиснувши \"Експорт\".</string>
<string name="importLoyaltyCardKeychain">Імпорт з Loyalty Card Keychain</string>
<string name="importFidmeMessage">Оберіть FidMe експорт-файл названий <i>fidme-export-request-xxxxxx.zip</i> для імпортування і оберіть типи штрих-кодів вручну пізніше.
<string name="importFidmeMessage">Оберіть FidMe експорт-файл названий <i>fidme-export-request-xxxxxx.zip</i> для імпортування і оберіть типи штрих-кодів.
\nСтворіть його у вашому FidMe профілі обравши \"Захист даних -&gt; Витяг даних\".</string>
<string name="importFidme">Імпорт з FidMe</string>
<string name="importCatima">Імпорт з Catima</string>
@@ -62,7 +62,7 @@
<string name="expiryStateSentence">Термін дії закінчується: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Групи: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Оберіть зображення з галереї</string>
<string name="addManually">Ввести ID карти вручну</string>
<string name="addManually">Ввести ID вручну</string>
<string name="leaveWithoutSaveConfirmation">Вийти без збереження\?</string>
<string name="leaveWithoutSaveTitle">Вихід</string>
<string name="moveDown">Посунути донизу</string>
@@ -70,11 +70,11 @@
<string name="failedOpeningFileManager">Спочатку встановіть файловий менеджер.</string>
<string name="deleteConfirmationGroup">Видалити групу\?</string>
<string name="all">Усі</string>
<string name="noGroups">Спочатку натисніть + щоб додати групи для категоризації.</string>
<string name="noGroups">Натисніть + щоб додати групи для категоризації.</string>
<string name="groups">Групи</string>
<string name="enter_group_name">Введіть ім\'я групи</string>
<string name="exportSuccessful">Дані картки/карток експортовано</string>
<string name="importSuccessful">Дані картки/карток імпортовано</string>
<string name="exportSuccessful">Дані експортовано</string>
<string name="importSuccessful">Дані імпортовано</string>
<string name="intent_import_card_from_url_share_text">Я хочу поділитися з тобою картою</string>
<string name="settings_disable_lockscreen_while_viewing_card">Не блокувати екран</string>
<string name="settings_keep_screen_on">Не вимикати екран</string>
@@ -87,10 +87,10 @@
<string name="settings_category_title_ui">Інтерфейс користувача</string>
<string name="settings">Налаштування</string>
<string name="starImage">Улюблена зірка</string>
<string name="thumbnailDescription">Ескіз для карти</string>
<string name="thumbnailDescription">Ескіз</string>
<string name="intent_import_card_from_url_share_multiple_text">Я хочу поділитися деякими картами з тобою</string>
<string name="copy_to_clipboard_multiple_toast">ID карток скопійовано до буферу обміну</string>
<string name="copy_to_clipboard_toast">ID карти скопійовано до буферу обміну</string>
<string name="copy_to_clipboard_multiple_toast">ID скопійовано до буферу обміну</string>
<string name="copy_to_clipboard_toast">ID скопійовано до буферу обміну</string>
<string name="app_resources">Вільні ресурси третіх сторін: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Вільні бібліотеки третіх сторін: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_revision_fmt">Інформація про випуск: <xliff:g id="app_revision_url">%s</xliff:g></string>
@@ -108,23 +108,23 @@
<string name="importOptionFilesystemExplanation">Оберіть файл у провіднику.</string>
<string name="importOptionFilesystemTitle">Імпорт з файлу</string>
<string name="exportOptionExplanation">Дані буде записано до локації обраної вами.</string>
<string name="noExternalStoragePermissionError">Надайте дозвіл на доступ до пам\'яті пристрою для імпорту чи експорту карток</string>
<string name="noExternalStoragePermissionError">Надайте дозвіл на доступ до пам\'яті пристрою для імпорту/експорту даних</string>
<string name="exporting">Експортуємо…</string>
<string name="importing">Імпортуємо…</string>
<string name="exportFailed">Неможливо експортувати картки</string>
<string name="exportFailed">Неможливо експортувати картки: <xliff:g>%s</xliff:g></string>
<string name="exportFailedTitle">Помилка експорту</string>
<string name="exportSuccessfulTitle">Експортовано</string>
<string name="importFailed">Неможливо імпортувати картки</string>
<string name="importFailed">Неможливо імпортувати картки: <xliff:g>%s</xliff:g></string>
<string name="importFailedTitle">Помилка імпорту</string>
<string name="importSuccessfulTitle">Імпортовано</string>
<string name="importExportHelp">Створення резервної копії ваших карток дозволяє перемістити їх до іншого пристрою.</string>
<string name="importExportHelp">Резервна копія даних дозволяє перемістити їх до іншого пристрою.</string>
<string name="exportName">Експорт</string>
<string name="importExport">Імпорт/Експорт</string>
<string name="failedParsingImportUriError">Неможливо опрацювати імпорт-URI</string>
<string name="noCardExistsError">Карту не знайдено</string>
<string name="noCardIdError">ID карти не введено</string>
<string name="noCardIdError">ID не введено</string>
<string name="noStoreError">Ім\'я не введено</string>
<string name="card_ids_copied">ID карти скопійовано</string>
<string name="card_ids_copied">ID скопійовано</string>
<string name="noCardsMessage">Спочатку додайте карту</string>
<string name="cardShortcut">Швидкий виклик карти</string>
<string name="addCardTitle">Додати карту</string>
@@ -157,30 +157,30 @@
<string name="setBackImage">Встановити зображення тильної сторони</string>
<string name="setFrontImage">Встановити зображення лицьової сторони</string>
<string name="photos">Фото</string>
<string name="backImageDescription">Тильна сторона карти</string>
<string name="frontImageDescription">Лицьова сторона карти</string>
<string name="backImageDescription">Тильна сторона</string>
<string name="frontImageDescription">Лицьова сторона</string>
<string name="importStocardMessage">Виберіть експорт <i> ***-sync.zip </i> зі Stocard для імпорту.
\nОтримайте його, надіславши електронною поштою support@stocardapp.com з проханням експортувати ваші дані.</string>
\nОтримайте його, надіславши електронного листа support@stocardapp.com з проханням експортувати ваші дані.</string>
<string name="importStocard">Імпорт із Stocard</string>
<plurals name="selectedCardCount">
<item quantity="one">Обрано: <xliff:g>%d</xliff:g> карта</item>
<item quantity="few">Обрано: <xliff:g>%d</xliff:g> карти</item>
<item quantity="many">Обрано: <xliff:g>%d</xliff:g> карток</item>
<item quantity="other">Обрано: <xliff:g>%d</xliff:g> карток</item>
<item quantity="one">Обрано: <xliff:g>%d</xliff:g></item>
<item quantity="few">Обрано: <xliff:g>%d</xliff:g></item>
<item quantity="many">Обрано: <xliff:g>%d</xliff:g></item>
<item quantity="other">Обрано: <xliff:g>%d</xliff:g></item>
</plurals>
<string name="deleteTitle">Видалити картку</string>
<string name="deleteConfirmation">Бажаєте видалити карту\?</string>
<plurals name="deleteCardsTitle">
<item quantity="one">Видалити <xliff:g>%d</xliff:g> картку</item>
<item quantity="few">Видалити <xliff:g>%d</xliff:g> картки</item>
<item quantity="many">Видалити <xliff:g>%d</xliff:g> картки</item>
<item quantity="other">Видалити <xliff:g>%d</xliff:g> картки</item>
<item quantity="many">Видалити <xliff:g>%d</xliff:g> карток</item>
<item quantity="other">Видалити <xliff:g>%d</xliff:g> карток</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Видаліть цю <xliff:g>%d</xliff:g> карту назавжди\?</item>
<item quantity="few">Видаліть ці <xliff:g>%d</xliff:g> карти назавжди\?</item>
<item quantity="many">Видаліть ці <xliff:g>%d</xliff:g> карти назавжди\?</item>
<item quantity="other">Видаліть ці <xliff:g>%d</xliff:g> карти назавжди\?</item>
<item quantity="one">Видалити цю <xliff:g>%d</xliff:g> карту назавжди\?</item>
<item quantity="few">Видалити ці <xliff:g>%d</xliff:g> карти назавжди\?</item>
<item quantity="many">Видалити ці <xliff:g>%d</xliff:g> карт назавжди\?</item>
<item quantity="other">Видалити ці <xliff:g>%d</xliff:g> карт назавжди\?</item>
</plurals>
<string name="settings_blue_theme">Синій</string>
<string name="settings_violet_theme">Фіолетовий</string>
@@ -195,12 +195,12 @@
<string name="settings_green_theme">Зелений</string>
<string name="settings_sky_blue_theme">Небесно-синій</string>
<string name="app_contributors">Стало можливим завдяки: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="noGroupCards">Ця група не містить жодних карток</string>
<string name="noGroupCards">Пуста група</string>
<string name="toggleMoreInfo">Показувати додаткову інформацію</string>
<string name="barcodeImageDescriptionWithType">Зображення штрих-коду карти типу <xliff:g>%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Зображення штрих-коду <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Свайп чи довге натискання для зміни зображень</string>
<string name="sort_by">Сортувати за</string>
<string name="reverse">Зворотній порядок</string>
<string name="reverse">у зворотному порядку</string>
<string name="sort_by_balance">Баланс</string>
<string name="sort_by_expiry">Термін дії</string>
<string name="sort_by_most_recently_used">Часто використовувані</string>
@@ -223,9 +223,10 @@
<string name="editGroup">Редагування групи: <xliff:g>%s</xliff:g></string>
<string name="group_edit">Змінити групу</string>
<string name="group_name_already_in_use">Група з такою назвою вже існує</string>
<string name="noGiftCardsGroup">У вас ще немає жодної картки. Коли ви додасте кілька, то зможете призначити їх до групи.</string>
<string name="noGiftCardsGroup">Створите кілька карток, та призначте їх до групи тут.</string>
<string name="selectColor">Вибір кольору</string>
<string name="setIcon">Вибір іконки</string>
<string name="action_show_details">Показати деталі</string>
<string name="action_hide_details">Сховати деталі</string>
</resources>
<string name="translate_platform">на Weblate</string>
</resources>

View File

@@ -17,7 +17,7 @@
<string name="importOptionFilesystemButton">从文件系统</string>
<string name="unstar">从收藏中删除</string>
<string name="intent_import_card_from_url_share_multiple_text">我想和你分享一些卡片</string>
<string name="copy_to_clipboard_multiple_toast">已将卡号复制到剪贴板</string>
<string name="copy_to_clipboard_multiple_toast">卡号复制到剪贴板</string>
<string name="wrongValueForBarcodeType">该值对所选条形码类型无效</string>
<string name="unsupportedBarcodeType">此条形码类型尚无法显示。较新版本的应用程序可能提供支持。</string>
<string name="setBarcodeId">设置条形码值</string>
@@ -66,13 +66,13 @@
<string name="failedOpeningFileManager">请先安装文件管理器。</string>
<string name="deleteConfirmationGroup">删除群组?</string>
<string name="all">全部</string>
<string name="noGroups">\"+\" 按钮,先添加组进行分类。</string>
<string name="noGroups">“+ ” 按钮添加组进行分类。</string>
<string name="enter_group_name">输入组名</string>
<string name="groups"></string>
<string name="exportSuccessful">已导出卡片数据</string>
<string name="importSuccessful">已导入卡片数据</string>
<string name="exportSuccessful">已导出数据</string>
<string name="importSuccessful">已导入数据</string>
<string name="intent_import_card_from_url_share_text">我想和你分享一张卡</string>
<string name="settings_disable_lockscreen_while_viewing_card">禁用锁屏</string>
<string name="settings_disable_lockscreen_while_viewing_card">防止锁屏</string>
<string name="settings_keep_screen_on">保持屏幕常亮</string>
<string name="settings_lock_barcode_orientation">锁定条码方向</string>
<string name="settings_display_barcode_max_brightness">提高条码界面亮度</string>
@@ -82,9 +82,9 @@
<string name="settings_theme">主题</string>
<string name="settings_category_title_ui">用户界面</string>
<string name="settings">设置</string>
<string name="thumbnailDescription">卡片缩略图</string>
<string name="thumbnailDescription">缩略图</string>
<string name="copy_to_clipboard_toast">已复制卡号到剪贴板</string>
<string name="enterBarcodeInstructions">输入卡号,并从下面选择其条码类型,或选择\"此卡片没有条码\"。</string>
<string name="enterBarcodeInstructions">输入卡号,并从下面选择其条码类型,或选择\"条码\"。</string>
<string name="selectBarcodeTitle">选择条码</string>
<string name="app_resources">第三方自由资源:<xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_license">本软件为自由软件,使用 GPLv3+ 许可证</string>
@@ -99,25 +99,25 @@
<string name="noExternalStoragePermissionError">在导入导出前需要获得外部储存权限</string>
<string name="exporting">导出中…</string>
<string name="importing">导入中…</string>
<string name="exportFailed">无法导出卡片</string>
<string name="exportFailed">无法导出卡片: <xliff:g>%s</xliff:g></string>
<string name="exportFailedTitle">导出失败</string>
<string name="exportSuccessfulTitle">导出成功</string>
<string name="importFailed">无法导入卡片</string>
<string name="importFailed">无法导入卡片: <xliff:g>%s</xliff:g></string>
<string name="importFailedTitle">导入失败</string>
<string name="importSuccessfulTitle">导入成功</string>
<string name="importExportHelp">备份卡片后你可以让你将它们转移到其他设备。</string>
<string name="importExportHelp">备份数据允许你将其移动到另一个设备</string>
<string name="exportName">导出</string>
<string name="importExport">导入/导出</string>
<string name="failedParsingImportUriError">无法解析导入的URI</string>
<string name="noCardExistsError">无法到卡片</string>
<string name="noCardExistsError">找不到卡片</string>
<string name="noCardIdError">未输入卡号</string>
<string name="noStoreError">未输入卡片名称</string>
<string name="card_ids_copied">复制卡号</string>
<string name="card_ids_copied">复制卡号</string>
<string name="noCardsMessage">请先添加一张卡片</string>
<string name="cardShortcut">卡片快捷键</string>
<string name="editCardTitle">编辑卡片</string>
<string name="addCardTitle">添加卡片</string>
<string name="scanCardBarcode">扫描卡片条码</string>
<string name="scanCardBarcode">扫描条码</string>
<string name="sendLabel">发送…</string>
<string name="share">分享</string>
<string name="copy_to_clipboard">复制卡号到剪贴板</string>
@@ -131,13 +131,13 @@
<string name="cancel">取消</string>
<string name="star">添加到收藏</string>
<string name="noBarcode">无条形码</string>
<string name="barcodeNoBarcode">此卡无条形码</string>
<string name="barcodeNoBarcode">无条形码</string>
<string name="barcodeType">条形码类型</string>
<string name="cardId">卡号</string>
<string name="note">备注</string>
<string name="storeName">名称</string>
<string name="noMatchingGiftCards">没有找到任何东西。尝试改变你的搜索。</string>
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者从⋮菜单导入一些。</string>
<string name="noMatchingGiftCards">没有结果。尝试改变你的搜索。</string>
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者从⋮ 菜单导入一些。</string>
<string name="action_add">添加</string>
<string name="action_search">搜索</string>
<string name="deleteConfirmation">删除此卡?</string>
@@ -149,7 +149,7 @@
<item quantity="other">确定永久删除 <xliff:g>%d</xliff:g> 这些卡片?</item>
</plurals>
<plurals name="selectedCardCount">
<item quantity="other">已选择 <xliff:g>%d</xliff:g> 张卡</item>
<item quantity="other">选中了 <xliff:g>%d</xliff:g> 张卡</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="other">删除 <xliff:g>%d</xliff:g> 张卡片</item>
@@ -167,10 +167,10 @@
<string name="setBackImage">设置背面图像</string>
<string name="setFrontImage">设置正面图像</string>
<string name="photos">照片</string>
<string name="backImageDescription">卡片的背面图像</string>
<string name="frontImageDescription">卡片的正面图像</string>
<string name="backImageDescription">背面图像</string>
<string name="frontImageDescription">正面图像</string>
<string name="importStocard">从Stocard导入</string>
<string name="noGiftCardsGroup">你还没有会员卡。一旦添加了一些卡,你可以将它们分配这里的组。</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g>卡片条码图像</string>
<string name="noGiftCardsGroup">创建一些卡片,然后分配这里的组。</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g>型条码图像</string>
<string name="group_edit">编辑组</string>
</resources>

View File

@@ -56,7 +56,7 @@
<string name="expiryDate">逾期日期</string>
<string name="expiryStateSentence">逾期於:<xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">已逾期:<xliff:g>%s</xliff:g></string>
<string name="exportFailed">無法匯出卡片</string>
<string name="exportFailed">無法匯出卡片: <xliff:g>%s</xliff:g></string>
<string name="exportFailedTitle">匯出失敗</string>
<string name="exporting">匯出中…</string>
<string name="exportName">匯出</string>
@@ -73,7 +73,7 @@
<string name="help_translate_this_app">幫助翻譯本程式</string>
<string name="importExport">匯入/匯出</string>
<string name="importFailedTitle">匯入失敗</string>
<string name="importFailed">無法匯入卡片</string>
<string name="importFailed">無法匯入卡片: <xliff:g>%s</xliff:g></string>
<string name="importing">匯入中…</string>
<string name="importSuccessfulTitle">已匯入</string>
<string name="intent_import_card_from_url_share_multiple_text">我想要分享些卡片給你</string>

View File

@@ -47,6 +47,7 @@
<item>da</item>
<item>de</item>
<item>el-rGR</item>
<item>en</item>
<item>eo</item>
<item>es</item>
<item>es-rAR</item>

View File

@@ -3,17 +3,17 @@
<string name="action_search">Search</string>
<string name="action_add">Add</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> card selected</item>
<item quantity="other"><xliff:g>%d</xliff:g> cards selected</item>
<item quantity="one"><xliff:g>%d</xliff:g> selected</item>
<item quantity="other"><xliff:g>%d</xliff:g> selected</item>
</plurals>
<string name="noGiftCards">Click the + plus button to add a card, or import some from the ⋮ menu first.</string>
<string name="noGiftCardsGroup">You don\'t have any loyalty cards yet. Once you\'ve added some you can assign them to the group here.</string>
<string name="noMatchingGiftCards">Didn\'t find anything. Try changing your search.</string>
<string name="noGiftCards">Click the + plus button to add a card, or import some from the ⋮ menu.</string>
<string name="noGiftCardsGroup">Create some cards, and then assign them to the group here.</string>
<string name="noMatchingGiftCards">No results. Try changing your search.</string>
<string name="storeName">Name</string>
<string name="note">Note</string>
<string name="cardId">Card ID</string>
<string name="barcodeType">Barcode type</string>
<string name="barcodeNoBarcode">This card has no barcode</string>
<string name="barcodeNoBarcode">There is no barcode</string>
<string name="noBarcode">No barcode</string>
<string name="star">Add to favorites</string>
<string name="unstar">Remove from favorites</string>
@@ -46,27 +46,28 @@
<string name="sendLabel">Send…</string>
<string name="editCardTitle">Edit Card</string>
<string name="addCardTitle">Add Card</string>
<string name="scanCardBarcode">Scan Card Barcode</string>
<string name="scanCardBarcode">Scan Barcode</string>
<string name="cardShortcut">Card Shortcut</string>
<string name="noCardsMessage">Add a card first</string>
<string name="card_ids_copied">Copied Card ID(s)</string>
<string name="barcodeImageDescriptionWithType">Image of card barcode of type <xliff:g>%s</xliff:g></string>
<string name="card_ids_copied">Copied ID(s)</string>
<!-- %s is a type of barcode here -->
<string name="barcodeImageDescriptionWithType">Image <xliff:g>%s</xliff:g> barcode</string>
<string name="noStoreError">No name entered</string>
<string name="noCardIdError">No card ID entered</string>
<string name="noCardExistsError">Could not find card</string>
<string name="noCardIdError">No ID entered</string>
<string name="noCardExistsError">Could not find that card</string>
<string name="failedParsingImportUriError">Could not parse the import URI</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Backing up your cards allows you to move them to another device.</string>
<string name="importExportHelp">Backing up your data allows moving it to another device.</string>
<string name="importSuccessfulTitle">Imported</string>
<string name="importFailedTitle">Import failed</string>
<string name="importFailed">Could not import cards</string>
<string name="importFailed">Could not import cards: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessfulTitle">Exported</string>
<string name="exportFailedTitle">Export failed</string>
<string name="exportFailed">Could not export cards</string>
<string name="exportFailed">Could not export cards: <xliff:g>%s</xliff:g></string>
<string name="importing">Importing…</string>
<string name="exporting">Exporting…</string>
<string name="noExternalStoragePermissionError">Grant external storage permission to import or export cards first</string>
<string name="noExternalStoragePermissionError">Grant external storage permission to import or export data</string>
<string name="exportOptionExplanation">The data will be written to a location of your choice.</string>
<string name="importOptionFilesystemTitle">Import from filesystem</string>
<string name="importOptionFilesystemExplanation">Choose a specific file from the filesystem.</string>
@@ -84,9 +85,9 @@
<string name="app_libraries">Libre third-party libraries: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">Libre third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Select Barcode</string>
<string name="enterBarcodeInstructions">Enter the card ID, and either pick its barcode type below, or “This card has no barcode”.</string>
<string name="copy_to_clipboard_toast">Card ID copied to clipboard</string>
<string name="thumbnailDescription">Thumbnail for card</string>
<string name="enterBarcodeInstructions">Enter the ID, and either pick a barcode type below, or “There is no barcode”.</string>
<string name="copy_to_clipboard_toast">ID copied to clipboard</string>
<string name="thumbnailDescription">Thumbnail</string>
<string name="starImage">Favorite star</string>
<string name="settings">Settings</string>
<string name="settings_category_title_ui">User interface</string>
@@ -106,7 +107,7 @@
<string name="settings_key_lock_barcode_orientation" translatable="false">pref_lock_barcode_orientation</string>
<string name="settings_keep_screen_on">Keep screen on</string>
<string name="settings_key_keep_screen_on" translatable="false">pref_keep_screen_on</string>
<string name="settings_disable_lockscreen_while_viewing_card">Prevent lock screen</string>
<string name="settings_disable_lockscreen_while_viewing_card">Prevent screen lock</string>
<string name="settings_key_disable_lockscreen_while_viewing_card" translatable="false">pref_disable_lockscreen_while_viewing_card</string>
<string name="sharedpreference_active_tab" translatable="false">sharedpreference_active_tab</string>
<string name="sharedpreference_privacy_policy_shown" translatable="false">sharedpreference_privacy_policy_shown</string>
@@ -120,13 +121,13 @@
<string name="intent_import_card_from_url_path_prefix_thelastproject" translatable="false">/Catima/share</string>
<string name="intent_import_card_from_url_host_brarcher" translatable="false">brarcher.github.io</string>
<string name="intent_import_card_from_url_path_prefix_brarcher" translatable="false">/loyalty-card-locker/share</string>
<string name="importSuccessful">Card data imported</string>
<string name="exportSuccessful">Card data exported</string>
<string name="importSuccessful">Data imported</string>
<string name="exportSuccessful">Data exported</string>
<string name="enter_group_name">Enter group name</string>
<string name="groups">Groups</string>
<string name="group_edit">Edit Group</string>
<string name="noGroups">Click the + plus button to add groups for categorization first.</string>
<string name="noGroupCards">This group does not contain any cards</string>
<string name="noGroups">Click the + plus button to add groups for categorization.</string>
<string name="noGroupCards">This group is empty</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> card</item>
<item quantity="other"><xliff:g>%d</xliff:g> cards</item>
@@ -141,7 +142,7 @@
<string name="moveDown">Move downwards</string>
<string name="leaveWithoutSaveTitle">Exit</string>
<string name="leaveWithoutSaveConfirmation">Leave without saving?</string>
<string name="addManually">Manually enter card ID</string>
<string name="addManually">Manually enter ID</string>
<string name="addFromImage">Select image from gallery</string>
<string name="groupsList">Groups: <xliff:g>%s</xliff:g></string>
<string name="editGroup">Editing Group: <xliff:g>%s</xliff:g></string>
@@ -184,21 +185,21 @@
<string name="importVoucherVaultMessage">Select your <i>vouchervault.json</i> export from Voucher Vault to import.
\nCreate it by pressing Export in Voucher Vault first.</string>
<string name="barcodeId">Barcode value</string>
<string name="sameAsCardId">Same as card ID</string>
<string name="sameAsCardId">Same as ID</string>
<string name="setBarcodeId">Set barcode value</string>
<string name="unsupportedBarcodeType">This barcode type can\'t yet be displayed. It may be supported in a later version of the app.</string>
<string name="wrongValueForBarcodeType">The value is not valid for the selected barcode type</string>
<string name="copy_to_clipboard_multiple_toast">Card IDs copied to clipboard</string>
<string name="copy_to_clipboard_multiple_toast">IDs copied to clipboard</string>
<string name="intent_import_card_from_url_share_multiple_text">I want to share some cards with you</string>
<string name="frontImageDescription">Card\'s front image</string>
<string name="backImageDescription">Card\'s back image</string>
<string name="frontImageDescription">Front image</string>
<string name="backImageDescription">Back image</string>
<string name="photos">Photos</string>
<string name="setFrontImage">Set front image</string>
<string name="setBackImage">Set back image</string>
<string name="removeImage">Remove image</string>
<string name="takePhoto">Take a photo</string>
<string name="updateBarcodeQuestionTitle">Update barcode value?</string>
<string name="updateBarcodeQuestionText">You changed the card ID. Do you want to also update the barcode to use the same value?</string>
<string name="updateBarcodeQuestionText">You changed the ID. Do you want to also update the barcode to use the same value?</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="passwordRequired">Please enter the password</string>
@@ -240,7 +241,8 @@
<string name="sort_by_most_recently_used">Most Recently Used</string>
<string name="sort_by_expiry">Expiry</string>
<string name="sort_by_balance">Balance</string>
<string name="reverse">Reverse</string>
<!-- \"Reversed order\" is also OK. This is an option in the card sorting list -->
<string name="reverse">…in reversed order</string>
<string name="sort_by">Sort by</string>
<string name="version_history">Version History</string>
<string name="arrow" translatable="false"><![CDATA[>]]></string>
@@ -255,4 +257,9 @@
<string name="report_error">Report Error</string>
<string name="action_show_details">Show details</string>
<string name="action_hide_details">Hide details</string>
</resources>
<string name="unknown_failure">Unknown failure</string>
<string name="incorrect_password">Incorrect password</string>
<string name="importExportDescription">Notifications about importing or exporting card data</string>
<string name="translate_platform">on Weblate</string>
<string name="shortcutSelectCard">Select a card</string>
</resources>

View File

@@ -29,7 +29,7 @@ import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class DatabaseTest {
private DBHelper mDb;
private SQLiteDatabase mDatabase;
private Activity mActivity;
private static final Integer DEFAULT_HEADER_COLOR = Color.BLACK;
@@ -37,18 +37,18 @@ public class DatabaseTest {
@Before
public void setUp() {
mActivity = Robolectric.setupActivity(MainActivity.class);
mDb = TestHelpers.getEmptyDb(mActivity);
mDatabase = TestHelpers.getEmptyDb(mActivity).getWritableDatabase();
}
@Test
public void addRemoveOneGiftCard() {
assertEquals(0, mDb.getLoyaltyCardCount());
long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1);
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
assertNotNull(loyaltyCard);
assertEquals("store", loyaltyCard.store);
assertEquals("note", loyaltyCard.note);
@@ -61,24 +61,24 @@ public class DatabaseTest {
assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor);
assertEquals(0, loyaltyCard.starStatus);
result = mDb.deleteLoyaltyCard(mActivity, 1);
result = DBHelper.deleteLoyaltyCard(mDatabase, mActivity, 1);
assertTrue(result);
assertEquals(0, mDb.getLoyaltyCardCount());
assertNull(mDb.getLoyaltyCard(1));
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
assertNull(DBHelper.getLoyaltyCard(mDatabase, 1));
}
@Test
public void updateGiftCard() {
long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
result = mDb.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR);
result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR);
assertTrue(result);
assertEquals(1, mDb.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1);
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
assertNotNull(loyaltyCard);
assertEquals("store1", loyaltyCard.store);
assertEquals("note1", loyaltyCard.note);
@@ -94,16 +94,16 @@ public class DatabaseTest {
@Test
public void updateGiftCardOnlyStar() {
long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
result = mDb.updateLoyaltyCardStarStatus(1, 1);
result = DBHelper.updateLoyaltyCardStarStatus(mDatabase, 1, 1);
assertTrue(result);
assertEquals(1, mDb.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1);
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
assertNotNull(loyaltyCard);
assertEquals("store", loyaltyCard.store);
assertEquals("note", loyaltyCard.note);
@@ -119,22 +119,22 @@ public class DatabaseTest {
@Test
public void updateMissingGiftCard() {
assertEquals(0, mDb.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
boolean result = mDb.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1",
boolean result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1",
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR);
assertEquals(false, result);
assertEquals(0, mDb.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
}
@Test
public void emptyGiftCardValues() {
long id = mDb.insertLoyaltyCard("", "", null, new BigDecimal("0"), null, "", null, null, null, 0, null);
long id = DBHelper.insertLoyaltyCard(mDatabase, "", "", null, new BigDecimal("0"), null, "", null, null, null, 0, null);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1);
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
assertNotNull(loyaltyCard);
assertEquals("", loyaltyCard.store);
assertEquals("", loyaltyCard.note);
@@ -155,15 +155,15 @@ public class DatabaseTest {
// Add the gift cards in reverse order, to ensure
// that they are sorted
for (int index = CARDS_TO_ADD - 1; index >= 0; index--) {
long id = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
long id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null);
boolean result = (id != -1);
assertTrue(result);
}
assertEquals(CARDS_TO_ADD, mDb.getLoyaltyCardCount());
assertEquals(CARDS_TO_ADD, DBHelper.getLoyaltyCardCount(mDatabase));
Cursor cursor = mDb.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
assertNotNull(cursor);
assertEquals(CARDS_TO_ADD, cursor.getCount());
@@ -199,19 +199,19 @@ public class DatabaseTest {
// that they are sorted
for (int index = CARDS_TO_ADD - 1; index >= 0; index--) {
if (index == CARDS_TO_ADD - 1) {
id = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1, null);
} else {
id = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index,
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null);
}
boolean result = (id != -1);
assertTrue(result);
}
assertEquals(CARDS_TO_ADD, mDb.getLoyaltyCardCount());
assertEquals(CARDS_TO_ADD, DBHelper.getLoyaltyCardCount(mDatabase));
Cursor cursor = mDb.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
assertNotNull(cursor);
assertEquals(CARDS_TO_ADD, cursor.getCount());
@@ -280,130 +280,130 @@ public class DatabaseTest {
@Test
public void addRemoveOneGroup() {
assertEquals(0, mDb.getGroupCount());
long id = mDb.insertGroup("group one");
assertEquals(0, DBHelper.getGroupCount(mDatabase));
long id = DBHelper.insertGroup(mDatabase, "group one");
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getGroupCount());
assertEquals(1, DBHelper.getGroupCount(mDatabase));
Group group = mDb.getGroup("group one");
Group group = DBHelper.getGroup(mDatabase, "group one");
assertNotNull(group);
assertEquals("group one", group._id);
result = mDb.deleteGroup("group one");
result = DBHelper.deleteGroup(mDatabase, "group one");
assertTrue(result);
assertEquals(0, mDb.getGroupCount());
assertNull(mDb.getGroup("group one"));
assertEquals(0, DBHelper.getGroupCount(mDatabase));
assertNull(DBHelper.getGroup(mDatabase, "group one"));
}
@Test
public void updateGroup() {
// Create card
assertEquals(0, mDb.getLoyaltyCardCount());
long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
// Create group
long groupId = mDb.insertGroup("group one");
long groupId = DBHelper.insertGroup(mDatabase, "group one");
result = (groupId != -1);
assertTrue(result);
assertEquals(1, mDb.getGroupCount());
assertEquals(1, DBHelper.getGroupCount(mDatabase));
// Add card to group
Group group = mDb.getGroup("group one");
Group group = DBHelper.getGroup(mDatabase, "group one");
List<Group> groupList1 = new ArrayList<>();
groupList1.add(group);
mDb.setLoyaltyCardGroups(1, groupList1);
DBHelper.setLoyaltyCardGroups(mDatabase, 1, groupList1);
// Ensure the card has one group and the group has one card
List<Group> cardGroups = mDb.getLoyaltyCardGroups((int) id);
List<Group> cardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, (int) id);
assertEquals(1, cardGroups.size());
assertEquals("group one", cardGroups.get(0)._id);
assertEquals(1, mDb.getGroupCardCount("group one"));
assertEquals(1, DBHelper.getGroupCardCount(mDatabase, "group one"));
// Rename group
result = mDb.updateGroup("group one", "group one renamed");
result = DBHelper.updateGroup(mDatabase, "group one", "group one renamed");
assertTrue(result);
assertEquals(1, mDb.getGroupCount());
assertEquals(1, DBHelper.getGroupCount(mDatabase));
// Group one no longer exists
group = mDb.getGroup("group one");
group = DBHelper.getGroup(mDatabase,"group one");
assertNull(group);
// But group one renamed does
Group group2 = mDb.getGroup("group one renamed");
Group group2 = DBHelper.getGroup(mDatabase, "group one renamed");
assertNotNull(group2);
assertEquals("group one renamed", group2._id);
// And card is in "group one renamed"
// Ensure the card has one group and the group has one card
cardGroups = mDb.getLoyaltyCardGroups((int) id);
cardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, (int) id);
assertEquals(1, cardGroups.size());
assertEquals("group one renamed", cardGroups.get(0)._id);
assertEquals(1, mDb.getGroupCardCount("group one renamed"));
assertEquals(1, DBHelper.getGroupCardCount(mDatabase, "group one renamed"));
}
@Test
public void updateMissingGroup() {
assertEquals(0, mDb.getGroupCount());
assertEquals(0, DBHelper.getGroupCount(mDatabase));
boolean result = mDb.updateGroup("group one", "new name");
boolean result = DBHelper.updateGroup(mDatabase, "group one", "new name");
assertEquals(false, result);
assertEquals(0, mDb.getGroupCount());
assertEquals(0, DBHelper.getGroupCount(mDatabase));
}
@Test
public void emptyGroupValues() {
long id = mDb.insertGroup("");
long id = DBHelper.insertGroup(mDatabase, "");
boolean result = (id != -1);
assertFalse(result);
assertEquals(0, mDb.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
}
@Test
public void duplicateGroupName() {
assertEquals(0, mDb.getGroupCount());
long id = mDb.insertGroup("group one");
assertEquals(0, DBHelper.getGroupCount(mDatabase));
long id = DBHelper.insertGroup(mDatabase, "group one");
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getGroupCount());
assertEquals(1, DBHelper.getGroupCount(mDatabase));
Group group = mDb.getGroup("group one");
Group group = DBHelper.getGroup(mDatabase, "group one");
assertNotNull(group);
assertEquals("group one", group._id);
// Should fail on duplicate
long id2 = mDb.insertGroup("group one");
long id2 = DBHelper.insertGroup(mDatabase, "group one");
boolean result2 = (id2 != -1);
assertFalse(result2);
assertEquals(1, mDb.getGroupCount());
assertEquals(1, DBHelper.getGroupCount(mDatabase));
}
@Test
public void updateGroupDuplicate() {
long id = mDb.insertGroup("group one");
long id = DBHelper.insertGroup(mDatabase, "group one");
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getGroupCount());
assertEquals(1, DBHelper.getGroupCount(mDatabase));
long id2 = mDb.insertGroup("group two");
long id2 = DBHelper.insertGroup(mDatabase, "group two");
boolean result2 = (id2 != -1);
assertTrue(result2);
assertEquals(2, mDb.getGroupCount());
assertEquals(2, DBHelper.getGroupCount(mDatabase));
// Should fail when trying to rename group two to one
boolean result3 = mDb.updateGroup("group two", "group one");
boolean result3 = DBHelper.updateGroup(mDatabase, "group two", "group one");
assertFalse(result3);
assertEquals(2, mDb.getGroupCount());
assertEquals(2, DBHelper.getGroupCount(mDatabase));
// Rename failed so both should still be the same
Group group = mDb.getGroup("group one");
Group group = DBHelper.getGroup(mDatabase, "group one");
assertNotNull(group);
assertEquals("group one", group._id);
Group group2 = mDb.getGroup("group two");
Group group2 = DBHelper.getGroup(mDatabase, "group two");
assertNotNull(group2);
assertEquals("group two", group2._id);
}
@@ -411,52 +411,53 @@ public class DatabaseTest {
@Test
public void cardAddAndRemoveGroups() {
// Create card
assertEquals(0, mDb.getLoyaltyCardCount());
long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null);
boolean result = (id != -1);
assertTrue(result);
assertEquals(1, mDb.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
// Create two groups to only one card
assertEquals(0, mDb.getGroupCount());
long gid = mDb.insertGroup("one");
assertEquals(0, DBHelper.getGroupCount(mDatabase));
long gid = DBHelper.insertGroup(mDatabase, "one");
boolean gresult = (gid != -1);
assertTrue(gresult);
long gid2 = mDb.insertGroup("two");
long gid2 = DBHelper.insertGroup(mDatabase, "two");
boolean gresult2 = (gid2 != -1);
assertTrue(gresult2);
assertEquals(2, mDb.getGroupCount());
assertEquals(2, DBHelper.getGroupCount(mDatabase));
Group group1 = mDb.getGroup("one");
Group group1 = DBHelper.getGroup(mDatabase, "one");
// Card has no groups by default
List<Group> cardGroups = mDb.getLoyaltyCardGroups(1);
List<Group> cardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, 1);
assertEquals(0, cardGroups.size());
// Add one groups to card
List<Group> groupList1 = new ArrayList<>();
groupList1.add(group1);
mDb.setLoyaltyCardGroups(1, groupList1);
DBHelper.setLoyaltyCardGroups(mDatabase, 1, groupList1);
List<Group> cardGroups1 = mDb.getLoyaltyCardGroups(1);
List<Group> cardGroups1 = DBHelper.getLoyaltyCardGroups(mDatabase, 1);
assertEquals(1, cardGroups1.size());
assertEquals(cardGroups1.get(0)._id, group1._id);
assertEquals(1, mDb.getGroupCardCount("one"));
assertEquals(0, mDb.getGroupCardCount("two"));
assertEquals(1, DBHelper.getGroupCardCount(mDatabase, "one"));
assertEquals(0, DBHelper.getGroupCardCount(mDatabase, "two"));
// Remove groups
mDb.setLoyaltyCardGroups(1, new ArrayList<Group>());
List<Group> cardGroups2 = mDb.getLoyaltyCardGroups(1);
DBHelper.setLoyaltyCardGroups(mDatabase, 1, new ArrayList<Group>());
List<Group> cardGroups2 = DBHelper.getLoyaltyCardGroups(mDatabase, 1);
assertEquals(0, cardGroups2.size());
assertEquals(0, mDb.getGroupCardCount("one"));
assertEquals(0, mDb.getGroupCardCount("two"));
assertEquals(0, DBHelper.getGroupCardCount(mDatabase, "one"));
assertEquals(0, DBHelper.getGroupCardCount(mDatabase, "two"));
}
@Test
public void databaseUpgradeFromVersion1() {
SQLiteDatabase database = mDb.getWritableDatabase();
DBHelper dbHelper = TestHelpers.getEmptyDb(mActivity);
SQLiteDatabase database = dbHelper.getWritableDatabase();
// Setup the database as it appeared in revision 1
setupDatabaseVersion1(database);
@@ -466,10 +467,10 @@ public class DatabaseTest {
int newCardId2 = insertCardVersion1(database, "store", "cardId", "");
// Upgrade database
mDb.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION);
dbHelper.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION);
// Determine that the entries are queryable and the fields are correct
LoyaltyCard card = mDb.getLoyaltyCard(newCardId);
LoyaltyCard card = DBHelper.getLoyaltyCard(database, newCardId);
assertEquals("store", card.store);
assertEquals("", card.note);
assertEquals(null, card.expiry);
@@ -484,7 +485,7 @@ public class DatabaseTest {
assertEquals(100, card.zoomLevel);
// Determine that the entries are queryable and the fields are correct
LoyaltyCard card2 = mDb.getLoyaltyCard(newCardId2);
LoyaltyCard card2 = DBHelper.getLoyaltyCard(database, newCardId2);
assertEquals("store", card2.store);
assertEquals("", card2.note);
assertEquals(null, card2.expiry);
@@ -497,7 +498,5 @@ public class DatabaseTest {
assertEquals(0, card2.starStatus);
assertEquals(0, card2.lastUsed);
assertEquals(100, card2.zoomLevel);
database.close();
}
}

View File

@@ -2,6 +2,7 @@ package protect.card_locker;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
@@ -61,7 +62,7 @@ import static org.robolectric.Shadows.shadowOf;
@Config(sdk = 23)
public class ImportExportTest {
private Activity activity;
private DBHelper db;
private SQLiteDatabase mDatabase;
private long nowMs;
private long lastYearMs;
private final int MONTHS_PER_YEAR = 12;
@@ -74,7 +75,7 @@ public class ImportExportTest {
ShadowLog.stream = System.out;
activity = Robolectric.setupActivity(MainActivity.class);
db = TestHelpers.getEmptyDb(activity);
mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase();
nowMs = System.currentTimeMillis();
Calendar lastYear = Calendar.getInstance();
@@ -93,12 +94,12 @@ public class ImportExportTest {
for (int index = cardsToAdd; index > 0; index--) {
String storeName = String.format("store, \"%4d", index);
String note = String.format("note, \"%4d", index);
long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null);
long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null);
boolean result = (id != -1);
assertTrue(result);
}
assertEquals(cardsToAdd, db.getLoyaltyCardCount());
assertEquals(cardsToAdd, DBHelper.getLoyaltyCardCount(mDatabase));
}
private void addLoyaltyCardsFiveStarred() {
@@ -107,7 +108,7 @@ public class ImportExportTest {
for (int index = cardsToAdd; index > 4; index--) {
String storeName = String.format("store, \"%4d", index);
String note = String.format("note, \"%4d", index);
long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1, null);
long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1, null);
boolean result = (id != -1);
assertTrue(result);
}
@@ -115,20 +116,20 @@ public class ImportExportTest {
String storeName = String.format("store, \"%4d", index);
String note = String.format("note, \"%4d", index);
//if index is even
long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null);
long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null);
boolean result = (id != -1);
assertTrue(result);
}
assertEquals(cardsToAdd, db.getLoyaltyCardCount());
assertEquals(cardsToAdd, DBHelper.getLoyaltyCardCount(mDatabase));
}
@Test
public void addLoyaltyCardsWithExpiryNeverPastTodayFuture() {
long id = db.insertLoyaltyCard("No Expiry", "", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null);
long id = DBHelper.insertLoyaltyCard(mDatabase, "No Expiry", "", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null);
boolean result = (id != -1);
assertTrue(result);
LoyaltyCard card = db.getLoyaltyCard((int) id);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
assertEquals("No Expiry", card.store);
assertEquals("", card.note);
assertEquals(null, card.expiry);
@@ -140,11 +141,11 @@ public class ImportExportTest {
assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus);
id = db.insertLoyaltyCard("Past", "", new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null);
id = DBHelper.insertLoyaltyCard(mDatabase, "Past", "", new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null);
result = (id != -1);
assertTrue(result);
card = db.getLoyaltyCard((int) id);
card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
assertEquals("Past", card.store);
assertEquals("", card.note);
assertTrue(card.expiry.before(new Date()));
@@ -156,11 +157,11 @@ public class ImportExportTest {
assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus);
id = db.insertLoyaltyCard("Today", "", new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null);
id = DBHelper.insertLoyaltyCard(mDatabase, "Today", "", new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null);
result = (id != -1);
assertTrue(result);
card = db.getLoyaltyCard((int) id);
card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
assertEquals("Today", card.store);
assertEquals("", card.note);
assertTrue(card.expiry.before(new Date(new Date().getTime() + 86400)));
@@ -175,11 +176,11 @@ public class ImportExportTest {
// This will break after 19 January 2038
// If someone is still maintaining this code base by then: I love you
id = db.insertLoyaltyCard("Future", "", new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null);
id = DBHelper.insertLoyaltyCard(mDatabase, "Future", "", new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null);
result = (id != -1);
assertTrue(result);
card = db.getLoyaltyCard((int) id);
card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
assertEquals("Future", card.store);
assertEquals("", card.note);
assertTrue(card.expiry.after(new Date(new Date().getTime() + 86400)));
@@ -191,19 +192,19 @@ public class ImportExportTest {
assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus);
assertEquals(4, db.getLoyaltyCardCount());
assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase));
}
private void addGroups(int groupsToAdd) {
// Add in reverse order to test sorting
for (int index = groupsToAdd; index > 0; index--) {
String groupName = String.format("group, \"%4d", index);
long id = db.insertGroup(groupName);
long id = DBHelper.insertGroup(mDatabase, groupName);
boolean result = (id != -1);
assertTrue(result);
}
assertEquals(groupsToAdd, db.getGroupCount());
assertEquals(groupsToAdd, DBHelper.getGroupCount(mDatabase));
}
/**
@@ -212,7 +213,7 @@ public class ImportExportTest {
* where the smallest card's index is 1
*/
private void checkLoyaltyCards() {
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
int index = 1;
while (cursor.moveToNext()) {
@@ -243,7 +244,7 @@ public class ImportExportTest {
* with starred ones first
*/
private void checkLoyaltyCardsFiveStarred() {
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
int index = 5;
while (index < 10) {
@@ -297,8 +298,8 @@ public class ImportExportTest {
* where the smallest group's index is 1
*/
private void checkGroups() {
Cursor cursor = db.getGroupCursor();
int index = db.getGroupCount();
Cursor cursor = DBHelper.getGroupCursor(mDatabase);
int index = DBHelper.getGroupCount(mDatabase);
while (cursor.moveToNext()) {
Group group = Group.toGroup(cursor);
@@ -322,7 +323,7 @@ public class ImportExportTest {
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
outStream.close();
@@ -331,10 +332,10 @@ public class ImportExportTest {
ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray());
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null);
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(NUM_CARDS, db.getLoyaltyCardCount());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
checkLoyaltyCards();
@@ -352,7 +353,7 @@ public class ImportExportTest {
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, password);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, password);
assertEquals(ImportExportResult.Success, result);
outStream.close();
@@ -361,10 +362,10 @@ public class ImportExportTest {
ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray());
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, password);
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, password);
assertEquals(ImportExportResult.Success, result);
assertEquals(NUM_CARDS, db.getLoyaltyCardCount());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
checkLoyaltyCards();
@@ -384,7 +385,7 @@ public class ImportExportTest {
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
outStream.close();
@@ -393,10 +394,10 @@ public class ImportExportTest {
ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray());
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null);
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(NUM_CARDS, db.getLoyaltyCardCount());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
checkLoyaltyCardsFiveStarred();
@@ -425,37 +426,37 @@ public class ImportExportTest {
List<Group> emptyGroup = new ArrayList<>();
List<Group> groupsForOne = new ArrayList<>();
groupsForOne.add(db.getGroup("group, \" 1"));
groupsForOne.add(DBHelper.getGroup(mDatabase, "group, \" 1"));
List<Group> groupsForTwo = new ArrayList<>();
groupsForTwo.add(db.getGroup("group, \" 1"));
groupsForTwo.add(db.getGroup("group, \" 2"));
groupsForTwo.add(DBHelper.getGroup(mDatabase, "group, \" 1"));
groupsForTwo.add(DBHelper.getGroup(mDatabase, "group, \" 2"));
List<Group> groupsForThree = new ArrayList<>();
groupsForThree.add(db.getGroup("group, \" 1"));
groupsForThree.add(db.getGroup("group, \" 2"));
groupsForThree.add(db.getGroup("group, \" 3"));
groupsForThree.add(DBHelper.getGroup(mDatabase, "group, \" 1"));
groupsForThree.add(DBHelper.getGroup(mDatabase, "group, \" 2"));
groupsForThree.add(DBHelper.getGroup(mDatabase, "group, \" 3"));
List<Group> groupsForFour = new ArrayList<>();
groupsForFour.add(db.getGroup("group, \" 1"));
groupsForFour.add(db.getGroup("group, \" 2"));
groupsForFour.add(db.getGroup("group, \" 3"));
groupsForFour.add(DBHelper.getGroup(mDatabase, "group, \" 1"));
groupsForFour.add(DBHelper.getGroup(mDatabase, "group, \" 2"));
groupsForFour.add(DBHelper.getGroup(mDatabase, "group, \" 3"));
List<Group> groupsForFive = new ArrayList<>();
groupsForFive.add(db.getGroup("group, \" 1"));
groupsForFive.add(db.getGroup("group, \" 3"));
groupsForFive.add(DBHelper.getGroup(mDatabase,"group, \" 1"));
groupsForFive.add(DBHelper.getGroup(mDatabase, "group, \" 3"));
db.setLoyaltyCardGroups(1, groupsForOne);
db.setLoyaltyCardGroups(2, groupsForTwo);
db.setLoyaltyCardGroups(3, groupsForThree);
db.setLoyaltyCardGroups(4, groupsForFour);
db.setLoyaltyCardGroups(5, groupsForFive);
DBHelper.setLoyaltyCardGroups(mDatabase, 1, groupsForOne);
DBHelper.setLoyaltyCardGroups(mDatabase, 2, groupsForTwo);
DBHelper.setLoyaltyCardGroups(mDatabase, 3, groupsForThree);
DBHelper.setLoyaltyCardGroups(mDatabase, 4, groupsForFour);
DBHelper.setLoyaltyCardGroups(mDatabase, 5, groupsForFive);
ByteArrayOutputStream outData = new ByteArrayOutputStream();
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
outStream.close();
@@ -464,25 +465,25 @@ public class ImportExportTest {
ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray());
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null);
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(NUM_CARDS, db.getLoyaltyCardCount());
assertEquals(NUM_GROUPS, db.getGroupCount());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
assertEquals(NUM_GROUPS, DBHelper.getGroupCount(mDatabase));
checkLoyaltyCards();
checkGroups();
assertEquals(groupsToGroupNames(groupsForOne), groupsToGroupNames(db.getLoyaltyCardGroups(1)));
assertEquals(groupsToGroupNames(groupsForTwo), groupsToGroupNames(db.getLoyaltyCardGroups(2)));
assertEquals(groupsToGroupNames(groupsForThree), groupsToGroupNames(db.getLoyaltyCardGroups(3)));
assertEquals(groupsToGroupNames(groupsForFour), groupsToGroupNames(db.getLoyaltyCardGroups(4)));
assertEquals(groupsToGroupNames(groupsForFive), groupsToGroupNames(db.getLoyaltyCardGroups(5)));
assertEquals(emptyGroup, db.getLoyaltyCardGroups(6));
assertEquals(emptyGroup, db.getLoyaltyCardGroups(7));
assertEquals(emptyGroup, db.getLoyaltyCardGroups(8));
assertEquals(emptyGroup, db.getLoyaltyCardGroups(9));
assertEquals(emptyGroup, db.getLoyaltyCardGroups(10));
assertEquals(groupsToGroupNames(groupsForOne), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 1)));
assertEquals(groupsToGroupNames(groupsForTwo), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 2)));
assertEquals(groupsToGroupNames(groupsForThree), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 3)));
assertEquals(groupsToGroupNames(groupsForFour), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 4)));
assertEquals(groupsToGroupNames(groupsForFive), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 5)));
assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 6));
assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 7));
assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 8));
assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 9));
assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 10));
// Clear the database for the next format under test
TestHelpers.getEmptyDb(activity);
@@ -498,17 +499,17 @@ public class ImportExportTest {
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export into CSV data
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
outStream.close();
ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray());
// Import the CSV data on top of the existing database
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null);
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(NUM_CARDS, db.getLoyaltyCardCount());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
checkLoyaltyCards();
@@ -527,7 +528,7 @@ public class ImportExportTest {
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
TestHelpers.getEmptyDb(activity);
@@ -541,10 +542,10 @@ public class ImportExportTest {
ByteArrayInputStream inData = new ByteArrayInputStream((outData.toString() + corruptEntry).getBytes());
// Attempt to import the data
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, format, null);
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, format, null);
assertEquals(ImportExportResult.GenericFailure, result);
assertEquals(0, db.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
TestHelpers.getEmptyDb(activity);
}
@@ -608,7 +609,7 @@ public class ImportExportTest {
assertNotNull(listener.result);
assertEquals(ImportExportResult.Success, listener.result);
assertEquals(NUM_CARDS, db.getLoyaltyCardCount());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
checkLoyaltyCards();
@@ -631,11 +632,11 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("store", card.store);
assertEquals("note", card.note);
@@ -668,11 +669,11 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("store", card.store);
assertEquals("note", card.note);
@@ -705,9 +706,9 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.GenericFailure, result);
assertEquals(0, db.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
TestHelpers.getEmptyDb(activity);
}
@@ -729,11 +730,11 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("store", card.store);
assertEquals("note", card.note);
@@ -766,11 +767,11 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("store", card.store);
assertEquals("note", card.note);
@@ -803,11 +804,11 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("store", card.store);
assertEquals("note", card.note);
@@ -840,9 +841,9 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
csvText = "";
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
@@ -859,11 +860,11 @@ public class ImportExportTest {
inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("store", card.store);
assertEquals("note", card.note);
@@ -896,11 +897,11 @@ public class ImportExportTest {
HashMap<Integer, Bitmap> loyaltyCardIconImages = new HashMap<>();
// Create card 1
int loyaltyCardId = (int) db.insertLoyaltyCard("Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null);
loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId));
db.insertGroup("One");
List<Group> groups = Arrays.asList(db.getGroup("One"));
db.setLoyaltyCardGroups(loyaltyCardId, groups);
int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null);
loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId));
DBHelper.insertGroup(mDatabase, "One");
List<Group> groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One"));
DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, groups);
loyaltyCardGroups.put(loyaltyCardId, groups);
Utils.saveCardImage(activity.getApplicationContext(), launcherBitmap, loyaltyCardId, ImageLocationType.front);
Utils.saveCardImage(activity.getApplicationContext(), roundLauncherBitmap, loyaltyCardId, ImageLocationType.back);
@@ -910,26 +911,26 @@ public class ImportExportTest {
loyaltyCardIconImages.put(loyaltyCardId, launcherBitmap);
// Create card 2
loyaltyCardId = (int) db.insertLoyaltyCard("Card 2", "", null, new BigDecimal(0), null, "123456", null, null, 2, 1, null);
loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId));
loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", null, new BigDecimal(0), null, "123456", null, null, 2, 1, null);
loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId));
// Export everything
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MultiFormatExporter.exportData(activity.getApplicationContext(), db, outputStream, DataFormat.Catima, null);
MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outputStream, DataFormat.Catima, null);
// Wipe database
TestHelpers.getEmptyDb(activity);
// Import everything
MultiFormatImporter.importData(activity.getApplicationContext(), db, new ByteArrayInputStream(outputStream.toByteArray()), DataFormat.Catima, null);
MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, new ByteArrayInputStream(outputStream.toByteArray()), DataFormat.Catima, null);
// Ensure everything is there
assertEquals(loyaltyCardHashMap.size(), db.getLoyaltyCardCount());
assertEquals(loyaltyCardHashMap.size(), DBHelper.getLoyaltyCardCount(mDatabase));
for (Integer loyaltyCardID : loyaltyCardHashMap.keySet()) {
LoyaltyCard loyaltyCard = loyaltyCardHashMap.get(loyaltyCardID);
LoyaltyCard dbLoyaltyCard = db.getLoyaltyCard(loyaltyCardID);
LoyaltyCard dbLoyaltyCard = DBHelper.getLoyaltyCard(mDatabase, loyaltyCardID);
assertEquals(loyaltyCard.id, dbLoyaltyCard.id);
assertEquals(loyaltyCard.store, dbLoyaltyCard.store);
@@ -954,7 +955,8 @@ public class ImportExportTest {
)
),
groupsToGroupNames(
db.getLoyaltyCardGroups(
DBHelper.getLoyaltyCardGroups(
mDatabase,
loyaltyCardID
)
)
@@ -1017,29 +1019,29 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(7, db.getLoyaltyCardCount());
assertEquals(3, db.getGroupCount());
assertEquals(7, DBHelper.getLoyaltyCardCount(mDatabase));
assertEquals(3, DBHelper.getGroupCount(mDatabase));
// Check all groups
Group healthGroup = db.getGroup("Health");
Group healthGroup = DBHelper.getGroup(mDatabase, "Health");
assertNotNull(healthGroup);
assertEquals(1, db.getGroupCardCount("Health"));
assertEquals(Arrays.asList(4), db.getGroupCardIds("Health"));
assertEquals(1, DBHelper.getGroupCardCount(mDatabase, "Health"));
assertEquals(Arrays.asList(4), DBHelper.getGroupCardIds(mDatabase, "Health"));
Group foodGroup = db.getGroup("Food");
Group foodGroup = DBHelper.getGroup(mDatabase, "Food");
assertNotNull(foodGroup);
assertEquals(2, db.getGroupCardCount("Food"));
assertEquals(Arrays.asList(3, 5), db.getGroupCardIds("Food"));
assertEquals(2, DBHelper.getGroupCardCount(mDatabase, "Food"));
assertEquals(Arrays.asList(3, 5), DBHelper.getGroupCardIds(mDatabase, "Food"));
Group fashionGroup = db.getGroup("Fashion");
Group fashionGroup = DBHelper.getGroup(mDatabase, "Fashion");
assertNotNull(fashionGroup);
assertEquals(2, db.getGroupCardCount("Fashion"));
assertEquals(Arrays.asList(8, 6), db.getGroupCardIds("Fashion"));
assertEquals(2, DBHelper.getGroupCardCount(mDatabase, "Fashion"));
assertEquals(Arrays.asList(8, 6), DBHelper.getGroupCardIds(mDatabase, "Fashion"));
// Check all cards
LoyaltyCard card1 = db.getLoyaltyCard(1);
LoyaltyCard card1 = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("Card 1", card1.store);
assertEquals("Note 1", card1.note);
@@ -1055,7 +1057,7 @@ public class ImportExportTest {
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.back));
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.icon));
LoyaltyCard card8 = db.getLoyaltyCard(8);
LoyaltyCard card8 = DBHelper.getLoyaltyCard(mDatabase, 8);
assertEquals("Clothes Store", card8.store);
assertEquals("Note about store", card8.note);
@@ -1071,7 +1073,7 @@ public class ImportExportTest {
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.back));
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.icon));
LoyaltyCard card2 = db.getLoyaltyCard(2);
LoyaltyCard card2 = DBHelper.getLoyaltyCard(mDatabase, 2);
assertEquals("Department Store", card2.store);
assertEquals("", card2.note);
@@ -1087,7 +1089,7 @@ public class ImportExportTest {
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.back));
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.icon));
LoyaltyCard card3 = db.getLoyaltyCard(3);
LoyaltyCard card3 = DBHelper.getLoyaltyCard(mDatabase, 3);
assertEquals("Grocery Store", card3.store);
assertEquals("Multiline note about grocery store\n\nwith blank line", card3.note);
@@ -1103,7 +1105,7 @@ public class ImportExportTest {
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.back));
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.icon));
LoyaltyCard card4 = db.getLoyaltyCard(4);
LoyaltyCard card4 = DBHelper.getLoyaltyCard(mDatabase, 4);
assertEquals("Pharmacy", card4.store);
assertEquals("", card4.note);
@@ -1119,7 +1121,7 @@ public class ImportExportTest {
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.back));
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.icon));
LoyaltyCard card5 = db.getLoyaltyCard(5);
LoyaltyCard card5 = DBHelper.getLoyaltyCard(mDatabase, 5);
assertEquals("Restaurant", card5.store);
assertEquals("Note about restaurant here", card5.note);
@@ -1135,7 +1137,7 @@ public class ImportExportTest {
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.back));
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.icon));
LoyaltyCard card6 = db.getLoyaltyCard(6);
LoyaltyCard card6 = DBHelper.getLoyaltyCard(mDatabase, 6);
assertEquals("Shoe Store", card6.store);
assertEquals("", card6.note);
@@ -1159,11 +1161,11 @@ public class ImportExportTest {
InputStream inputStream = getClass().getResourceAsStream("fidme.zip");
// Import the Fidme data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Fidme, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Fidme, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(3, db.getLoyaltyCardCount());
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("Hema", card.store);
assertEquals("2021-03-24 18:35:08 UTC", card.note);
@@ -1175,7 +1177,7 @@ public class ImportExportTest {
assertEquals(null, card.barcodeType);
assertEquals(0, card.starStatus);
card = db.getLoyaltyCard(2);
card = DBHelper.getLoyaltyCard(mDatabase, 2);
assertEquals("test", card.store);
assertEquals("Test\n2021-03-24 18:34:19 UTC", card.note);
@@ -1187,7 +1189,7 @@ public class ImportExportTest {
assertEquals(null, card.barcodeType);
assertEquals(0, card.starStatus);
card = db.getLoyaltyCard(3);
card = DBHelper.getLoyaltyCard(mDatabase, 3);
assertEquals("Albert Heijn", card.store);
assertEquals("Bonus Kaart\n2021-03-24 16:47:47 UTC\nFirst Last", card.note);
@@ -1207,17 +1209,17 @@ public class ImportExportTest {
InputStream inputStream = getClass().getResourceAsStream("stocard.zip");
// Import the Stocard data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Stocard, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Stocard, null);
assertEquals(ImportExportResult.BadPassword, result);
assertEquals(0, db.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
inputStream = getClass().getResourceAsStream("stocard.zip");
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Stocard, "da811b40a4dac56f0cbb2d99b21bbb9a".toCharArray());
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Stocard, "da811b40a4dac56f0cbb2d99b21bbb9a".toCharArray());
assertEquals(ImportExportResult.Success, result);
assertEquals(3, db.getLoyaltyCardCount());
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("GAMMA", card.store);
assertEquals("", card.note);
@@ -1233,7 +1235,7 @@ public class ImportExportTest {
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.back));
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.icon));
card = db.getLoyaltyCard(2);
card = DBHelper.getLoyaltyCard(mDatabase, 2);
assertEquals("Air Miles", card.store);
assertEquals("szjsbs", card.note);
@@ -1249,7 +1251,7 @@ public class ImportExportTest {
assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.back)));
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.icon));
card = db.getLoyaltyCard(3);
card = DBHelper.getLoyaltyCard(mDatabase, 3);
// I don't think we can know this one, but falling back to an unique store name is at least something
assertEquals("63536738-d64b-48ae-aeb8-82761523fa67", card.store);
@@ -1299,11 +1301,11 @@ public class ImportExportTest {
ByteArrayInputStream inputStream = new ByteArrayInputStream(jsonText.getBytes(StandardCharsets.UTF_8));
// Import the Voucher Vault data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.VoucherVault, null);
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.VoucherVault, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(2, db.getLoyaltyCardCount());
assertEquals(2, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
assertEquals("Clothes Store", card.store);
assertEquals("", card.note);
@@ -1316,7 +1318,7 @@ public class ImportExportTest {
assertEquals(Color.GRAY, (long) card.headerColor);
assertEquals(0, card.starStatus);
card = db.getLoyaltyCard(2);
card = DBHelper.getLoyaltyCard(mDatabase, 2);
assertEquals("Department Store", card.store);
assertEquals("", card.note);

View File

@@ -1,6 +1,7 @@
package protect.card_locker;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.net.Uri;
@@ -27,13 +28,13 @@ import static org.junit.Assert.assertTrue;
@Config(sdk = 23)
public class ImportURITest {
private ImportURIHelper importURIHelper;
private DBHelper db;
private SQLiteDatabase mDatabase;
@Before
public void setUp() {
Activity activity = Robolectric.setupActivity(MainActivity.class);
importURIHelper = new ImportURIHelper(activity);
db = TestHelpers.getEmptyDb(activity);
mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase();
}
@Test
@@ -41,10 +42,10 @@ public class ImportURITest {
// Generate card
Date date = new Date();
db.insertLoyaltyCard("store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null);
DBHelper.insertLoyaltyCard(mDatabase, "store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null);
// Get card
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
// Card to URI
Uri cardUri = importURIHelper.toUri(card);
@@ -69,10 +70,10 @@ public class ImportURITest {
@Test
public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, UnsupportedEncodingException {
// Generate card
db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null);
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null);
// Get card
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
// Card to URI
Uri cardUri = importURIHelper.toUri(card);

View File

@@ -4,6 +4,7 @@ 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;
@@ -24,7 +25,11 @@ import java.text.DateFormat;
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;
@@ -35,7 +40,7 @@ import static org.junit.Assert.assertTrue;
@Config(sdk = 23)
public class LoyaltyCardCursorAdapterTest {
private Activity activity;
private DBHelper db;
private SQLiteDatabase mDatabase;
private SharedPreferences settings;
@Before
@@ -43,7 +48,7 @@ public class LoyaltyCardCursorAdapterTest {
ShadowLog.stream = System.out;
activity = Robolectric.setupActivity(MainActivity.class);
db = TestHelpers.getEmptyDb(activity);
mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase();
settings = PreferenceManager.getDefaultSharedPreferences(activity);
}
@@ -104,10 +109,10 @@ public class LoyaltyCardCursorAdapterTest {
@Test
public void TestCursorAdapterEmptyNote() {
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = db.getLoyaltyCard(1);
DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
View view = createView(cursor);
@@ -119,10 +124,10 @@ public class LoyaltyCardCursorAdapterTest {
@Test
public void TestCursorAdapterWithNote() {
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = db.getLoyaltyCard(1);
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
View view = createView(cursor);
@@ -134,14 +139,13 @@ public class LoyaltyCardCursorAdapterTest {
@Test
public void TestCursorAdapterFontSizes() {
final Context context = activity.getApplicationContext();
Date expiryDate = new Date();
String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate);
db.insertLoyaltyCard("store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = db.getLoyaltyCard(1);
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
setFontScale(50);
@@ -158,13 +162,13 @@ public class LoyaltyCardCursorAdapterTest {
@Test
public void TestCursorAdapterStarring() {
assertNotEquals(-1, db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null));
assertNotEquals(-1, db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null));
assertNotEquals(-1, db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null));
assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null));
assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null));
assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null));
assertEquals(3, db.getLoyaltyCardCount());
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
assertEquals(3, cursor.getCount());
cursor.moveToFirst();
@@ -178,7 +182,7 @@ public class LoyaltyCardCursorAdapterTest {
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor);
assertEquals("storeB", loyaltyCard.store);
View view = createView(cursor);
ImageView star = view.findViewById(R.id.star);
ConstraintLayout star = view.findViewById(R.id.star);
assertEquals(View.VISIBLE, star.getVisibility());
assertTrue(cursor.moveToNext());
@@ -200,10 +204,10 @@ public class LoyaltyCardCursorAdapterTest {
@Test
public void TestCursorAdapter0Points() {
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = db.getLoyaltyCard(1);
DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
View view = createView(cursor);
@@ -215,10 +219,10 @@ public class LoyaltyCardCursorAdapterTest {
@Test
public void TestCursorAdapter0EUR() {
db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = db.getLoyaltyCard(1);
DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
View view = createView(cursor);
@@ -230,10 +234,10 @@ public class LoyaltyCardCursorAdapterTest {
@Test
public void TestCursorAdapter100Points() {
db.insertLoyaltyCard("store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = db.getLoyaltyCard(1);
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
View view = createView(cursor);
@@ -245,10 +249,10 @@ public class LoyaltyCardCursorAdapterTest {
@Test
public void TestCursorAdapter10USD() {
db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = db.getLoyaltyCard(1);
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
View view = createView(cursor);

View File

@@ -9,6 +9,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
@@ -127,11 +128,11 @@ public class LoyaltyCardViewActivityTest {
final String barcodeId,
final String barcodeType,
boolean creatingNewCard) throws ParseException {
DBHelper db = new DBHelper(activity);
SQLiteDatabase database = new DBHelper(activity).getWritableDatabase();
if (creatingNewCard) {
assertEquals(0, db.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
} else {
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
}
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
@@ -156,9 +157,9 @@ public class LoyaltyCardViewActivityTest {
activity.findViewById(R.id.fabSave).performClick();
assertEquals(true, activity.isFinishing());
assertEquals(1, db.getLoyaltyCardCount());
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
LoyaltyCard card = db.getLoyaltyCard(1);
LoyaltyCard card = DBHelper.getLoyaltyCard(database, 1);
assertEquals(store, card.store);
assertEquals(note, card.note);
assertEquals(balance, card.balance);
@@ -193,7 +194,7 @@ public class LoyaltyCardViewActivityTest {
}
assertNotNull(card.headerColor);
db.close();
database.close();
}
/**
@@ -333,10 +334,10 @@ public class LoyaltyCardViewActivityTest {
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
if (!newCard) {
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
}
activityController.start();
@@ -430,24 +431,24 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
assertEquals(0, db.getLoyaltyCardCount());
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
activity.findViewById(R.id.fabSave).performClick();
assertEquals(0, db.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
storeField.setText("store");
activity.findViewById(R.id.fabSave).performClick();
assertEquals(0, db.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
noteField.setText("note");
activity.findViewById(R.id.fabSave).performClick();
assertEquals(0, db.getLoyaltyCardCount());
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
db.close();
database.close();
}
@Test
@@ -570,9 +571,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -580,7 +581,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
@@ -588,9 +589,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -598,7 +599,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", null, "0", context.getString(R.string.points), BARCODE_DATA, null, BARCODE_TYPE.toString(), null, null);
db.close();
database.close();
}
@Test
@@ -606,9 +607,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -622,7 +623,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
@@ -630,9 +631,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -660,7 +661,7 @@ public class LoyaltyCardViewActivityTest {
assertEquals(false, activity.hasChanged);
assertEquals(true, activity.isFinishing());
db.close();
database.close();
}
@Test
@@ -668,9 +669,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -692,7 +693,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
@@ -700,9 +701,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -716,7 +717,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
@@ -724,9 +725,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -763,7 +764,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "10.00", "", EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE.toString(), null, null);
db.close();
database.close();
}
});
balanceField.clearFocus();
@@ -774,9 +775,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -806,7 +807,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", "", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
@@ -814,9 +815,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -837,7 +838,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
@@ -845,9 +846,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -870,7 +871,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
@@ -878,9 +879,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -906,7 +907,7 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
@@ -914,9 +915,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -942,16 +943,16 @@ public class LoyaltyCardViewActivityTest {
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
db.close();
database.close();
}
@Test
public void checkMenu() throws IOException {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -969,7 +970,7 @@ public class LoyaltyCardViewActivityTest {
assertEquals("Share", menu.findItem(R.id.action_share).getTitle().toString());
assertEquals("Add to favorites", menu.findItem(R.id.action_star_unstar).getTitle().toString());
db.close();
database.close();
}
@Test
@@ -996,8 +997,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -1007,7 +1008,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(activity).clickMenuItem(android.R.id.home);
assertEquals(true, activity.isFinishing());
db.close();
database.close();
}
@Test
@@ -1015,8 +1016,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null);
activityController.start();
activityController.visible();
@@ -1026,7 +1027,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(activity).clickMenuItem(android.R.id.home);
assertEquals(true, activity.isFinishing());
db.close();
database.close();
}
@Test
@@ -1034,8 +1035,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null);
activityController.start();
activityController.visible();
@@ -1044,7 +1045,7 @@ public class LoyaltyCardViewActivityTest {
// Save and check the loyalty card
saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), BARCODE_TYPE.name(), false);
db.close();
database.close();
}
@Test
@@ -1052,8 +1053,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -1062,7 +1063,7 @@ public class LoyaltyCardViewActivityTest {
// Save and check the loyalty card
saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), activity.getApplicationContext().getString(R.string.noBarcode), false);
db.close();
database.close();
}
@Test
@@ -1070,9 +1071,9 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -1092,7 +1093,7 @@ public class LoyaltyCardViewActivityTest {
// Check if the special NO_BARCODE string doesn't get saved
saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.never), new BigDecimal("0"), context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), false);
db.close();
database.close();
}
@Test
@@ -1100,8 +1101,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
final int LARGE_FONT_SIZE = 40;
@@ -1126,7 +1127,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(activity).clickMenuItem(android.R.id.home);
assertEquals(true, activity.isFinishing());
db.close();
database.close();
}
@Test
@@ -1135,8 +1136,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
DBHelper db = new DBHelper(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
SQLiteDatabase database = new DBHelper(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity);
settings.edit()
@@ -1159,7 +1160,7 @@ public class LoyaltyCardViewActivityTest {
assertEquals(title, activity.getString(R.string.lockScreen));
}
db.close();
database.close();
}
}
@@ -1168,8 +1169,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
activityController.resume();
@@ -1194,7 +1195,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle();
assertEquals("Add to favorites", menu.findItem(R.id.action_star_unstar).getTitle().toString());
db.close();
database.close();
}
@Test
@@ -1202,8 +1203,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -1299,7 +1300,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle();
assertEquals(true, activity.isFinishing());
db.close();
database.close();
}
@Test
@@ -1307,8 +1308,8 @@ public class LoyaltyCardViewActivityTest {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null);
activityController.start();
activityController.visible();
@@ -1342,7 +1343,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle();
assertEquals(true, activity.isFinishing());
db.close();
database.close();
}
@Test

View File

@@ -3,6 +3,7 @@ package protect.card_locker;
import android.app.Activity;
import android.content.ComponentName;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
@@ -92,8 +93,8 @@ public class MainActivityTest {
assertEquals(0, list.getAdapter().getItemCount());
DBHelper db = TestHelpers.getEmptyDb(mainActivity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
assertEquals(View.VISIBLE, helpText.getVisibility());
assertEquals(View.GONE, noMatchingCardsText.getVisibility());
@@ -108,7 +109,7 @@ public class MainActivityTest {
assertEquals(1, list.getAdapter().getItemCount());
db.close();
database.close();
}
@Test
@@ -127,11 +128,11 @@ public class MainActivityTest {
assertEquals(0, list.getAdapter().getItemCount());
DBHelper db = TestHelpers.getEmptyDb(mainActivity);
db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
db.insertLoyaltyCard("storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null);
db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null);
DBHelper.insertLoyaltyCard(database, "storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null);
assertEquals(View.VISIBLE, helpText.getVisibility());
assertEquals(View.GONE, noMatchingCardsText.getVisibility());
@@ -156,7 +157,7 @@ public class MainActivityTest {
assertEquals("storeA", ((TextView) list.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.store)).getText());
assertEquals("storeB", ((TextView) list.findViewHolderForAdapterPosition(3).itemView.findViewById(R.id.store)).getText());
db.close();
database.close();
}
@Test
@@ -167,7 +168,7 @@ public class MainActivityTest {
activityController.start();
activityController.resume();
DBHelper db = TestHelpers.getEmptyDb(mainActivity);
SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase();
TabLayout groupTabs = mainActivity.findViewById(R.id.groups);
@@ -175,7 +176,7 @@ public class MainActivityTest {
assertEquals(0, groupTabs.getTabCount());
// Having at least one group should create two tabs: One all and one for each group
db.insertGroup("One");
DBHelper.insertGroup(database, "One");
activityController.pause();
activityController.resume();
assertEquals(2, groupTabs.getTabCount());
@@ -183,7 +184,7 @@ public class MainActivityTest {
assertEquals("One", groupTabs.getTabAt(1).getText().toString());
// Adding another group should have it added to the end
db.insertGroup("Alphabetical two");
DBHelper.insertGroup(database, "Alphabetical two");
activityController.pause();
activityController.resume();
assertEquals(3, groupTabs.getTabCount());
@@ -192,7 +193,7 @@ public class MainActivityTest {
assertEquals("Alphabetical two", groupTabs.getTabAt(2).getText().toString());
// Removing a group should also change the list
db.deleteGroup("Alphabetical two");
DBHelper.deleteGroup(database, "Alphabetical two");
activityController.pause();
activityController.resume();
assertEquals(2, groupTabs.getTabCount());
@@ -200,12 +201,12 @@ public class MainActivityTest {
assertEquals("One", groupTabs.getTabAt(1).getText().toString());
// Removing the last group should make the tabs disappear
db.deleteGroup("One");
DBHelper.deleteGroup(database, "One");
activityController.pause();
activityController.resume();
assertEquals(0, groupTabs.getTabCount());
db.close();
database.close();
}
@Test
@@ -221,14 +222,14 @@ public class MainActivityTest {
RecyclerView list = mainActivity.findViewById(R.id.list);
TabLayout groupTabs = mainActivity.findViewById(R.id.groups);
DBHelper db = TestHelpers.getEmptyDb(mainActivity);
db.insertLoyaltyCard("The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
db.insertLoyaltyCard("The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null);
db.insertGroup("Group one");
DBHelper.insertGroup(database, "Group one");
List<Group> groups = new ArrayList<>();
groups.add(db.getGroup("Group one"));
db.setLoyaltyCardGroups(1, groups);
groups.add(DBHelper.getGroup(database, "Group one"));
DBHelper.setLoyaltyCardGroups(database, 1, groups);
activityController.pause();
activityController.resume();
@@ -441,6 +442,6 @@ public class MainActivityTest {
assertEquals(2, list.getAdapter().getItemCount());
db.close();
database.close();
}
}

View File

@@ -9,9 +9,10 @@ import java.io.FileNotFoundException;
public class TestHelpers {
static public DBHelper getEmptyDb(Activity activity) {
DBHelper db = new DBHelper(activity);
SQLiteDatabase database = db.getWritableDatabase();
// Make sure no files remain
Cursor cursor = db.getLoyaltyCardCursor();
Cursor cursor = DBHelper.getLoyaltyCardCursor(database);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
int cardID = cursor.getColumnIndex(DBHelper.LoyaltyCardDbIds.ID);
@@ -27,11 +28,9 @@ public class TestHelpers {
}
// Make sure DB is empty
SQLiteDatabase database = db.getWritableDatabase();
database.execSQL("delete from " + DBHelper.LoyaltyCardDbIds.TABLE);
database.execSQL("delete from " + DBHelper.LoyaltyCardDbGroups.TABLE);
database.execSQL("delete from " + DBHelper.LoyaltyCardDbIdsGroups.TABLE);
database.close();
return db;
}

View File

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

View File

@@ -29,6 +29,7 @@ Supported barcodes:
- AZTEC
- CODABAR
- CODE_39
- CODE_93
- CODE_128
- DATA_MATRIX
- EAN_8

View File

@@ -1 +0,0 @@
Catima - Портфейлът за карти Libre

View File

@@ -3,13 +3,13 @@ Schluss mit der Suche nach Plastik-Belohnungskarten beim Bezahlen im Geschäft o
Du brauchst keine Geldbörse, oder mach sie federleicht für Wertsachen.
Mit diesem unverzichtbaren (EDC)Werkzeug kannst du nutzloses Plastik durch Bargeld ersetzen.
Mit diesem unverzichtbaren (EDC) Werkzeug kannst du nutzloses Plastik durch Bargeld ersetzen.
- Vermeide Spionage mit sehr wenigen Berechtigungen. Kein Internetzugang und keine Werbung.
- Füge Karten oder Codes mit Namen und anpassbaren Farben hinzu.
- Manuelle Code-Eingabe, wenn kein Barcode gespeichert ist oder nicht funktioniert.
- Importiere Karten und Codes aus Dateien, Catima, Loyalty Card Keychain, Voucher Vault und FidMe.
- Erstelle ein Backup aller Karten und übertrage diese auf ein neues Gerät, wenn du möchtest.
- Importiere Karten und Codes aus Dateien, Catima, Loyalty Card Keychain, Stocard, Voucher Vault und FidMe.
- Erstelle ein Backup aller Karten und übertrage diese auf ein neues Gerät.
- Teile Gutscheine, exklusive Angebote, Werbeaktionscodes oder Karten und Codes mit jeder Applikation.
- Dunkler Modus und Zugänglichkeitsoptionen für sehbehinderte Nutzer.
- Von der Freien-Software-Gemeinschaft für alle Menschen gemacht.
@@ -20,4 +20,3 @@ Mit diesem unverzichtbaren (EDC)Werkzeug kannst du nutzloses Plastik durch Barge
Vereinfache dein Leben und Einkäufe, und verliere nie wieder eine Papierrechung, eine Geschenkkarte für die Bezahlung im Geschäft oder ein Flugticket.
Habe deine Prämien und Boni immer bei der Hand, und spare unterwegs.

View File

@@ -1 +1 @@
Catima — Das Open Source Kartenetui
Catima — Das Kartenetui

View File

@@ -0,0 +1 @@
- Fix crash on sharing card

View File

@@ -0,0 +1 @@
- Add CODE 93 support

View File

@@ -0,0 +1,3 @@
- Modification du nom de fichier d'importation/exportation par défaut. (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84))
- Correction d'un titre sur la page d'importation/exportation. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87))
- Amélioration de la mise en page de la page d'affichage des cartes. Le texte devrait être plus facile à lire, et est sélectionnable avec un appui long. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91))

View File

@@ -0,0 +1 @@
- Ajoute la prise en charge de CODE 93

View File

@@ -20,4 +20,3 @@ Avec cet outil essentiel à emporter au quotidien, vous pouvez remplacer le plas
Simplifiez votre vie et vos achats, et ne perdez plus jamais un reçu papier, une carte cadeau de paiement en magasin ou un billet d'avion.
Emportez toutes vos récompenses et primes avec vous, et économisez au fur et à mesure.

View File

@@ -1 +1 @@
Catima Le porte-cartes Open Source
Catima Le porte-cartes

View File

@@ -0,0 +1,3 @@
- Cambiato il nome del file predefinito per l'importazione/esportazione. (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84))
- Corretta la stringa nella pagina dell'importazione/esportazione. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87))
- Migliorato il layout della pagina di visualizzazione della carta. Il testo è ora più facile da leggere ed è selezionabile tenendo premuto a lungo. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91))

View File

@@ -1,23 +1,22 @@
Basta con la ricerca di carte premio di plastica quando esci dal negozio.
<b>Scannerizza i codici a barre sul tuo dispositivo usando la sua fotocamera, dimentica le carte.</b>
<b>Scannerizza i codici a barre sul tuo dispositivo usando la tua fotocamera, dimentica le carte.</b>
Dimentica il tuo portafoglio, o tienilo ultraleggero per gli oggetti di valore.
Dimentica il tuo portafoglio o tienilo ultraleggero per gli oggetti di valore.
Con questo strumento essenziale per il trasporto quotidiano, puoi sostituire la plastica inutile con i contanti.
Con questo strumento essenziale per il trasporto quotidiano puoi sostituire la plastica inutile con i contanti.
- Evita di spiare con pochissimi permessi. Nessun accesso a Internet e nessuna pubblicità.
- Evita di essere spiati con pochissimi permessi. Nessun accesso a Internet e nessuna pubblicità.
- Aggiungi carte o codici con nomi e colori personalizzabili.
- Inserimento manuale del codice se non c'è un codice a barre da memorizzare o non può essere utilizzato.
- Inserisci manualmente il codice se non c'è un codice a barre da memorizzare o non può essere utilizzato.
- Importa carte e codici da file, Catima, Portachiavi delle carte fedeltà, Voucher Vault e FidMe.
- Fai un backup di tutte le tue carte e trasferiscile su un nuovo dispositivo se vuoi.
- Fai un backup di tutte le tue carte e trasferiscile su un nuovo dispositivo, se vuoi.
- Condividi coupon, offerte esclusive, codici promozionali o carte e codici utilizzando qualsiasi app.
- Tema scuro e opzioni di accessibilità per gli utenti con problemi di vista.
- Fatto per tutti dalla comunità del software libero.
- Traduzioni localizzate a mano per 20+ lingue.
- Gratis, supportato dai contributi della comunità.
- Usalo, studialo, cambialo e condividilo come vuoi; <i>con tutti</i>.
- Non solo un software libero. <i>Copylefted</i> software libero (GPLv3+) gestione schede.
Semplifica la tua vita e gli acquisti, e non perdere mai più una ricevuta cartacea, una carta regalo con pagamento in negozio o un biglietto aereo.
Porta con te tutti i tuoi premi e bonus, e risparmia mentre vai.
- Usala, studiala, cambiala e condividila come vuoi; <i>con tutti</i>.
- Non solo un software libero. <i>Copylefted</i> software libero (GPLv3+).
Semplifica la tua vita e gli acquisti e non perdere mai più una ricevuta cartacea, una carta regalo con pagamento in negozio o un biglietto aereo.
Porta con te tutti i tuoi premi e bonus e risparmia mentre vai.

View File

@@ -1 +1 @@
Catima — Il portafoglio di carte Open Source
Catima — Portafoglio di carte

View File

@@ -1 +1 @@
- Boşluklu aramaları iyileştir
- Boşluklu aramalar iyileştirildi

View File

@@ -1,5 +1,5 @@
- Gruplar arasında kaydırmanın boş bir grup üzerinde çalışmaması düzeltildi
- Parola korumalı dışa aktarmalara izin ver
- QR kodları için boşluk kullanımını iyileştir
- QR kodları için boşluk kullanımı iyileştirildi
- Kart başına en son kullanılan yakınlaştırma seviyesini kaydet
- Dokunduktan sonra sağa kaydırmada çökmeyi düzelt
- Dokunduktan sonra sağa kaydırmada çökme düzeltildi

View File

@@ -1,4 +1,4 @@
- Temayı elle değiştirirken kart görünümündeki noktaların yanlış renge sahip olmasını düzelt
- Döndürme/tema değişikliğinde kart görünümündeki çökmeyi düzelt
- Kart listesinin yanıp sönmesini düzelt
- Metnin yıldız simgesinin üzerine binmesini düzelt
- Temayı elle değiştirirken kart görünümündeki noktaların yanlış renge sahip olması düzeltildi
- Döndürme/tema değişikliğinde kart görünümündeki çökme düzeltildi
- Kart listesinin yanıp sönmesi düzeltildi
- Metnin yıldız simgesinin üzerine binmesi düzeltildi

View File

@@ -1,2 +1,2 @@
- Yeni ana ekran düzeni
- Tam ekrana girip çıkarken alt sayfa boyutlandırma sorunlarını düzelt
- Tam ekrana girip çıkarken alt sayfa boyutlandırma sorunları düzeltildi

View File

@@ -1,2 +1,2 @@
- Catima'yı Hızlı Erişim Aygıt Denetimlerine ekle (https://developer.android.com/guide/topics/ui/device-control)
- Grup yönetimi ekranında bazı grupların doğru görünmemesini düzelt
- Catima Hızlı Erişim Aygıt Denetimlerine eklendi (https://developer.android.com/guide/topics/ui/device-control)
- Grup yönetimi ekranında bazı grupların doğru görünmemesi düzeltildi

View File

@@ -1,3 +1,3 @@
- Ana ekran harf simgelerinin bulanıklığını düzelt
- Simgelerin seçtikten sonra bazen kaybolmasını düzelt
- Android 5'te bazen görünmez olan durum çubuğu simgelerini düzelt
- Ana ekran harf simgelerinin bulanıklığı düzeltildi
- Simgelerin seçtikten sonra bazen kaybolması düzeltildi
- Android 5'te bazen görünmez olan durum çubuğu simgeleri düzeltildi

View File

@@ -0,0 +1 @@
- Kart paylaşırken oluşan çökme düzeltildi

View File

@@ -0,0 +1 @@
- CODE 93 desteği eklendi