Compare commits

...

183 Commits

Author SHA1 Message Date
Sylvia van Os
4fe43bccff Catch new UncheckedIOException 2023-04-18 19:58:40 +02:00
dependabot[bot]
3732f8483b Bump org.apache.commons:commons-csv from 1.9.0 to 1.10.0
Bumps [org.apache.commons:commons-csv](https://github.com/apache/commons-csv) from 1.9.0 to 1.10.0.
- [Release notes](https://github.com/apache/commons-csv/releases)
- [Changelog](https://github.com/apache/commons-csv/blob/master/RELEASE-NOTES.txt)
- [Commits](https://github.com/apache/commons-csv/compare/rel/commons-csv-1.9.0...rel/commons-csv-1.10.0)

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-csv
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-18 16:58:12 +00:00
Sylvia van Os
2ff137ee04 Merge pull request #1278 from CatimaLoyalty/simplify_tests
Move all import unit test strings to their own files
2023-04-18 18:42:15 +02:00
Sylvia van Os
3b45802a7f Move all import unit test strings to their own files
They should've been files from the start, because you import files, not
text string.
2023-04-17 20:48:27 +02:00
Sylvia van Os
0de4847f6a Merge pull request #1276 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-04-16 22:02:19 +02:00
Projjal Moitra
47e2566043 Translated using Weblate (Bengali (India))
Currently translated at 78.4% (219 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2023-04-16 20:49:48 +02:00
Sylvia van Os
18c17796b9 Merge pull request #1275 from CatimaLoyalty/fix/unitTestsTarget
Ensure unit tests use targetSdk instead of API 23 (Android 6)
2023-04-16 16:11:34 +02:00
Sylvia van Os
4b2b999653 Ensure unit tests use targetSdk instead of API 23 (Android 6) 2023-04-16 15:20:30 +02:00
Sylvia van Os
3b51121c9e Merge pull request #1274 from CatimaLoyalty/create-pull-request/patch-1681625007
Update contributors
2023-04-16 09:45:59 +02:00
TheLastProject
2fc9581643 Update contributors 2023-04-16 06:03:27 +00:00
Sylvia van Os
68f3f37e23 Merge pull request #1272 from CatimaLoyalty/fix/ci
Fix CI build
2023-04-14 21:10:04 +02:00
Sylvia van Os
38658d0aa7 Fix CI build 2023-04-14 21:02:53 +02:00
Sylvia van Os
339750e97c Update AGP to 8.0.0 2023-04-14 20:56:29 +02:00
Sylvia van Os
510995a5c5 Release Catima 2.22.1 2023-04-14 18:38:48 +02:00
Sylvia van Os
a039d5de9e Merge pull request #1270 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-04-14 18:10:52 +02:00
Projjal Moitra
df11bd8f69 Translated using Weblate (Bengali (India))
Currently translated at 73.8% (206 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2023-04-14 17:48:15 +02:00
Sylvia van Os
17c80573bd Merge pull request #1269 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.10
Bump org.robolectric:robolectric from 4.9.2 to 4.10
2023-04-12 17:36:52 +02:00
dependabot[bot]
bc71c02e87 Bump org.robolectric:robolectric from 4.9.2 to 4.10
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.9.2 to 4.10.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.9.2...robolectric-4.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-12 02:59:34 +00:00
Sylvia van Os
d892fe40ba Merge pull request #1268 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-04-11 18:08:38 +02:00
SC
06839f6ddb Translated using Weblate (Portuguese)
Currently translated at 100.0% (117 of 117 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2023-04-11 16:54:22 +02:00
Projjal Moitra
ee57703ffc Translated using Weblate (Bengali (India))
Currently translated at 72.0% (201 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2023-04-11 16:54:22 +02:00
solokot
e780f5fb87 Translated using Weblate (Russian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2023-04-11 16:54:22 +02:00
Sylvia van Os
6b9a0a0696 Merge pull request #1266 from CatimaLoyalty/deps/update_spotbugs
Update spotbugs
2023-04-10 22:38:01 +02:00
Sylvia van Os
6653a940ed Make spotbugs happy 2023-04-10 21:36:35 +02:00
Sylvia van Os
47821752f0 Merge pull request #1267 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-04-10 13:19:47 +02:00
Sylvia van Os
bf05bd7e56 Fix lint 2023-04-10 13:12:10 +02:00
Projjal Moitra
2dd622b9c4 Translated using Weblate (Bengali (India))
Currently translated at 68.1% (190 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2023-04-10 09:53:13 +02:00
Sylvia van Os
643527a7fb Translated using Weblate (Bengali (India))
Currently translated at 68.1% (190 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2023-04-10 09:53:13 +02:00
Slávek Banko
0aae4c9c64 Translated using Weblate (Czech)
Currently translated at 100.0% (117 of 117 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2023-04-10 09:53:13 +02:00
solokot
14c5b756f7 Translated using Weblate (Russian)
Currently translated at 100.0% (117 of 117 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-04-10 09:53:13 +02:00
Sylvia van Os
ded3c63ec5 Translated using Weblate (Bengali)
Currently translated at 31.1% (87 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn/
2023-04-10 09:53:13 +02:00
يوسف لطفي
e3a22e425b Translated using Weblate (Arabic)
Currently translated at 98.5% (275 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2023-04-10 09:53:13 +02:00
Projjal Moitra
275d387f3c Translated using Weblate (Bengali (India))
Currently translated at 62.7% (175 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2023-04-10 09:53:13 +02:00
Mobashir Raihan
fbbad75c15 Translated using Weblate (Bengali)
Currently translated at 31.5% (88 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn/
2023-04-10 09:53:13 +02:00
Sylvia van Os
a55e9da067 Merge pull request #1265 from CatimaLoyalty/create-pull-request/patch-1681019014
Update contributors
2023-04-09 08:52:12 +02:00
TheLastProject
a5116395c8 Update contributors 2023-04-09 05:43:33 +00:00
dependabot[bot]
5cf41ed664 Bump com.github.spotbugs from 4.7.5 to 5.0.14
Bumps com.github.spotbugs from 4.7.5 to 5.0.14.

---
updated-dependencies:
- dependency-name: com.github.spotbugs
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-05 16:44:16 +00:00
Sylvia van Os
bbde3ec3b8 Merge pull request #1260 from CatimaLoyalty/create-pull-request/patch-1680713019
Update Fastlane changelogs
2023-04-05 18:43:53 +02:00
TheLastProject
db56d56e3b Update Fastlane changelogs 2023-04-05 16:43:39 +00:00
Sylvia van Os
f4c0628366 Merge pull request #1259 from CatimaLoyalty/library_updates
Update all libraries
2023-04-05 18:43:20 +02:00
Sylvia van Os
1e6641a884 Disable MissingQuantity due to Weblate bug
See https://github.com/WeblateOrg/weblate/issues/7520
2023-04-04 22:57:54 +02:00
Sylvia van Os
b9bd3f5967 Update all libraries 2023-04-04 22:22:51 +02:00
Sylvia van Os
28eaac0c67 Merge pull request #1257 from CatimaLoyalty/create-pull-request/patch-1680414497
Update contributors
2023-04-02 09:59:58 +02:00
TheLastProject
5690ca03e7 Update contributors 2023-04-02 05:48:17 +00:00
Sylvia van Os
71f7b21112 Merge pull request #1256 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-31 19:54:27 +02:00
Slávek Banko
f9ece83f2b Translated using Weblate (Czech)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2023-03-30 17:42:01 +02:00
Sylvia van Os
3bab0f43eb Merge pull request #1255 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-26 14:53:46 +02:00
SC
941fa929dd Translated using Weblate (Portuguese)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2023-03-26 14:42:11 +02:00
Szia Tomi
46846d2448 Translated using Weblate (Hungarian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2023-03-26 14:42:11 +02:00
Sylvia van Os
7b7c1b88b9 Merge pull request #1254 from CatimaLoyalty/create-pull-request/patch-1679813344
Update contributors
2023-03-26 12:33:46 +02:00
TheLastProject
0926bb71e1 Update contributors 2023-03-26 06:49:04 +00:00
Sylvia van Os
cfc4ce7c3c Merge pull request #1251 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-20 12:50:12 +01:00
109247019824
1f217dd846 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2023-03-20 01:05:23 +01:00
Michael Moroni
6c74b95e90 Translated using Weblate (Italian)
Currently translated at 62.0% (72 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2023-03-20 01:05:23 +01:00
Denis Shilin
9fca77d561 Translated using Weblate (Russian)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-03-20 01:05:23 +01:00
Altons
1f0873aab4 Translated using Weblate (French)
Currently translated at 98.2% (114 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2023-03-20 01:05:23 +01:00
Sylvia van Os
ca3a09740a Merge pull request #1250 from CatimaLoyalty/create-pull-request/patch-1679204700
Update contributors
2023-03-19 11:04:38 +01:00
TheLastProject
c104de839e Update contributors 2023-03-19 05:45:00 +00:00
Sylvia van Os
0f4380c1e2 Merge pull request #1249 from CatimaLoyalty/fix/stocard_export_name
Fix Stocard export filenames
2023-03-18 17:59:46 +01:00
Sylvia van Os
64e3b047d9 Fix Stocard export filenames
Stocard renamed their exports to no longer contain sync, only your user
id.
2023-03-18 17:48:53 +01:00
Sylvia van Os
729639e0e6 Release Catima 2.22.0 2023-03-18 17:01:58 +01:00
Sylvia van Os
3e79147673 Merge pull request #1247 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-18 15:39:46 +01:00
Tom Sawyer
59a656c422 Translated using Weblate (Swedish)
Currently translated at 2.5% (3 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2023-03-18 15:34:29 +01:00
Altons
bdf8994fed Translated using Weblate (French)
Currently translated at 97.4% (113 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2023-03-18 15:34:29 +01:00
Sylvia van Os
3aa595083b Show new Valid from feature in screenshots 2023-03-17 23:33:41 +01:00
Sylvia van Os
37f1183208 Merge pull request #1246 from CatimaLoyalty/create-pull-request/patch-1679091521
Update Fastlane changelogs
2023-03-17 23:19:21 +01:00
TheLastProject
839496aa04 Update Fastlane changelogs 2023-03-17 22:18:40 +00:00
Sylvia van Os
4a7a6b109c Merge pull request #1245 from CatimaLoyalty/fix/stocard_import
Fix Stocard import
2023-03-17 23:18:22 +01:00
Sylvia van Os
2b2d5ca7cf Fix Stocard import 2023-03-17 23:09:00 +01:00
Sylvia van Os
463af746fa Merge pull request #1244 from CatimaLoyalty/create-pull-request/patch-1678989883
Update Fastlane changelogs
2023-03-16 19:05:30 +01:00
TheLastProject
d75b79fce4 Update Fastlane changelogs 2023-03-16 18:04:43 +00:00
Sylvia van Os
2ec29da6b1 Merge pull request #1243 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-16 19:04:26 +01:00
ahmed-awad26
e80bebe887 Translated using Weblate (Arabic)
Currently translated at 98.2% (274 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2023-03-16 13:38:03 +01:00
Denis Shilin
1555b3b24b Translated using Weblate (Russian)
Currently translated at 94.8% (110 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-03-16 13:38:03 +01:00
Allan Nordhøy
12f42f86a5 Translated using Weblate (English)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/en/
2023-03-16 13:38:03 +01:00
Sylvia van Os
a74e17db10 Merge pull request #1241 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-13 21:39:53 +01:00
Denis Shilin
96335d3ee8 Translated using Weblate (Russian)
Currently translated at 93.9% (109 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-03-13 15:42:46 +01:00
Patrik
fb3d945f51 Translated using Weblate (Slovak)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2023-03-13 15:42:46 +01:00
Sylvia van Os
843ffbb87e Merge pull request #1240 from CatimaLoyalty/create-pull-request/patch-1678623157
Update Fastlane changelogs
2023-03-12 13:13:35 +01:00
TheLastProject
99e19321f0 Update Fastlane changelogs 2023-03-12 12:12:36 +00:00
Sylvia van Os
4e5a90eb93 Fix typo in old CHANGELOG 2023-03-12 13:12:21 +01:00
Sylvia van Os
9745ea671e Merge pull request #1238 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-12 13:10:38 +01:00
Denis Shilin
94a63d6e0c Translated using Weblate (Russian)
Currently translated at 81.0% (94 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-03-12 13:00:09 +01:00
Sylvia van Os
725ca3b9ca Merge pull request #1236 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-12 12:57:35 +01:00
Denis Shilin
46a2164143 Translated using Weblate (Russian)
Currently translated at 76.7% (89 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-03-12 12:40:30 +01:00
Sylvia van Os
5304be6f54 Translated using Weblate (English)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/en/
2023-03-12 12:40:30 +01:00
Sylvia van Os
8321e796f5 Merge pull request #1235 from CatimaLoyalty/create-pull-request/patch-1678600178
Update contributors
2023-03-12 12:37:46 +01:00
TheLastProject
c1f82e90be Update contributors 2023-03-12 05:49:38 +00:00
Sylvia van Os
758f265638 Merge pull request #1234 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-09 17:57:17 +01:00
Nosnahc
590020bb6f Translated using Weblate (French)
Currently translated at 98.2% (114 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2023-03-09 10:42:20 +01:00
Sylvia van Os
f18c2a2d0c Merge pull request #1231 from CatimaLoyalty/create-pull-request/patch-1677996975
Update contributors
2023-03-05 12:55:58 +01:00
TheLastProject
3a17ee83e0 Update contributors 2023-03-05 06:16:15 +00:00
Sylvia van Os
f36d4aebb6 Merge pull request #1230 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-04 14:23:47 +01:00
Tian Jiale
71cb1cace4 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2023-03-04 13:39:54 +01:00
lucafont2
1e4e035281 Translated using Weblate (Italian)
Currently translated at 62.0% (72 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2023-03-04 13:39:54 +01:00
Sylvia van Os
7da4eb6587 Merge pull request #1229 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-03 13:57:26 +01:00
Tian Jiale
d454864fa7 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.2% (274 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2023-03-03 13:36:36 +01:00
Sylvia van Os
f5e6d7be71 Merge pull request #1227 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-03-02 22:21:29 +01:00
Sylvia van Os
967a17242d Fix lint 2023-03-02 14:02:22 +01:00
Luna Jernberg
6c5dd7a713 Translated using Weblate (Swedish)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2023-03-02 09:37:09 +01:00
Alexander
139b144cb3 Translated using Weblate (Icelandic)
Currently translated at 42.2% (118 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/is/
2023-03-01 03:39:16 +01:00
Sylvia van Os
5deacf7ecc Merge pull request #1224 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-02-28 21:32:38 +01:00
Jesse Davids
6e49aea713 Translated using Weblate (Dutch)
Currently translated at 11.2% (13 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2023-02-26 06:40:23 +01:00
Jesse Davids
68257ce3ad Translated using Weblate (Dutch)
Currently translated at 6.0% (7 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2023-02-25 04:40:19 +01:00
Sirius Chan
149a1caeff Translated using Weblate (Chinese (Traditional))
Currently translated at 7.7% (9 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2023-02-25 04:40:19 +01:00
Sirius Chan
07e5788cb2 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2023-02-25 04:40:19 +01:00
Sylvia van Os
c072e2e70d Merge pull request #1225 from CatimaLoyalty/dependabot/gradle/net.lingala.zip4j-zip4j-2.11.5
Bump net.lingala.zip4j:zip4j from 2.11.4 to 2.11.5
2023-02-23 15:13:43 +01:00
dependabot[bot]
0701b9b3de Bump net.lingala.zip4j:zip4j from 2.11.4 to 2.11.5
Bumps [net.lingala.zip4j:zip4j](https://github.com/srikanth-lingala/zip4j) from 2.11.4 to 2.11.5.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.11.4...v2.11.5)

---
updated-dependencies:
- dependency-name: net.lingala.zip4j:zip4j
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-23 02:16:17 +00:00
Sylvia van Os
f84242d97c Merge pull request #1223 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-02-15 21:10:51 +01:00
IllusiveMan196
79f35ed715 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2023-02-15 20:40:26 +01:00
Sylvia van Os
eff4f3f8df Merge pull request #1221 from CatimaLoyalty/create-pull-request/patch-1676182226
Update contributors
2023-02-12 09:32:03 +01:00
TheLastProject
ee405f670d Update contributors 2023-02-12 06:10:25 +00:00
Sylvia van Os
7dcb9b336d Merge pull request #1219 from CatimaLoyalty/dependabot/gradle/net.lingala.zip4j-zip4j-2.11.4
Bump net.lingala.zip4j:zip4j from 2.11.3 to 2.11.4
2023-02-11 18:35:03 +01:00
Sylvia van Os
923e6dc062 Merge pull request #1220 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-02-11 18:13:10 +01:00
Allan Nordhøy
2ea04e8715 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2023-02-11 06:57:05 +01:00
SC
f264941ae4 Translated using Weblate (Portuguese)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2023-02-11 06:57:05 +01:00
SC
e6ef5c9bb2 Translated using Weblate (Portuguese)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2023-02-11 06:57:05 +01:00
HudobniVolk
024cc2d50e Translated using Weblate (Slovenian)
Currently translated at 27.5% (32 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-02-11 06:57:05 +01:00
Brage Nesteby Reitan
48b62f6aea Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2023-02-11 06:57:05 +01:00
dependabot[bot]
ff07fe71cc Bump net.lingala.zip4j:zip4j from 2.11.3 to 2.11.4
Bumps [net.lingala.zip4j:zip4j](https://github.com/srikanth-lingala/zip4j) from 2.11.3 to 2.11.4.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.11.3...v2.11.4)

---
updated-dependencies:
- dependency-name: net.lingala.zip4j:zip4j
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-10 02:58:35 +00:00
Sylvia van Os
402cf57c29 Add Catalan to supported languages 2023-02-09 23:27:56 +01:00
Sylvia van Os
e19ac0d0c2 Merge pull request #1218 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-02-09 20:16:40 +01:00
Francesc Bassas i Bullich
fc5d4a6435 Translated using Weblate (Catalan)
Currently translated at 18.9% (53 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2023-02-09 19:40:22 +01:00
gittyboy-cell
50754a3430 Translated using Weblate (Indonesian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2023-02-09 19:40:22 +01:00
HudobniVolk
0375f6dbe5 Translated using Weblate (Slovenian)
Currently translated at 26.7% (31 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-02-09 19:40:22 +01:00
HudobniVolk
deb808ffb6 Translated using Weblate (Slovenian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-02-09 19:40:22 +01:00
Sylvia van Os
166c1e7bc6 Merge pull request #1216 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-02-07 22:44:27 +01:00
Hamustra Scans
bfa19d0166 Translated using Weblate (Korean)
Currently translated at 37.9% (106 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2023-02-07 22:22:31 +01:00
sal0max
f92805ec64 Translated using Weblate (German)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2023-02-07 22:22:31 +01:00
sal0max
73e6e9f34a Translated using Weblate (German)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2023-02-07 22:22:31 +01:00
Francesc Bassas i Bullich
6a76681412 Added translation using Weblate (Catalan) 2023-02-07 22:22:31 +01:00
Sylvia van Os
f05a5dde1e Merge pull request #1213 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-02-06 19:41:51 +01:00
gnu-ewm
4a93ba3478 Translated using Weblate (Polish)
Currently translated at 39.6% (46 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2023-02-06 17:39:42 +01:00
Michael Moroni
af43138ae9 Translated using Weblate (Italian)
Currently translated at 58.6% (68 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2023-02-06 17:39:42 +01:00
Günter Neiß
dcd6e4b9a9 Translated using Weblate (German)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2023-02-06 17:39:42 +01:00
Dan
0ce2395605 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2023-02-06 17:39:42 +01:00
solokot
89dbc9e9aa Translated using Weblate (Russian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2023-02-06 17:39:42 +01:00
gnu-ewm
788a8f0efe Translated using Weblate (Polish)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2023-02-06 17:39:42 +01:00
J. Lavoie
d0c9ae2a4a Translated using Weblate (Italian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2023-02-06 17:39:42 +01:00
J. Lavoie
c000a8129c Translated using Weblate (French)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2023-02-06 17:39:42 +01:00
J. Lavoie
bfb4fdb61c Translated using Weblate (German)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2023-02-06 17:39:42 +01:00
Sylvia van Os
1929401d3e Merge pull request #1210 from CatimaLoyalty/create-pull-request/patch-1675576485
Update contributors
2023-02-05 12:06:41 +01:00
TheLastProject
eef13a1a91 Update contributors 2023-02-05 05:54:45 +00:00
Sylvia van Os
64f340d798 Merge pull request #1208 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-02-05 01:01:09 +01:00
Oğuz Ersen
f12422fc07 Translated using Weblate (Turkish)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2023-02-04 22:08:08 +01:00
109247019824
d78315ef12 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2023-02-04 22:08:08 +01:00
Jorma Karvonen
af8c3eeb54 Translated using Weblate (Finnish)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2023-02-04 22:08:08 +01:00
Slávek Banko
16e4205028 Translated using Weblate (Czech)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2023-02-04 22:08:08 +01:00
Heimen Stoffels
399aa767d2 Translated using Weblate (Dutch)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2023-02-04 22:08:08 +01:00
Allan Nordhøy
96c735cf80 Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.7% (270 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2023-02-04 22:08:07 +01:00
gallegonovato
50a8395ec6 Translated using Weblate (Spanish)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2023-02-04 22:08:07 +01:00
Slávek Banko
c720ca1085 Translated using Weblate (Czech)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2023-02-04 22:08:07 +01:00
Sylvia van Os
d82088f66a Merge pull request #1207 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-02-04 15:51:09 +01:00
Jiri Grönroos
1fce3e17f6 Translated using Weblate (Finnish)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2023-02-04 15:35:30 +01:00
Evgeniy Khramov
569db96f81 Translated using Weblate (Russian)
Currently translated at 35.6% (41 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-02-04 15:35:30 +01:00
Salem Malus
b7cb1dffc1 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2023-02-04 15:35:30 +01:00
Sylvia van Os
e17fc66d35 Update dependencies (#1205)
* Update appcompat to 1.6.0

* Update constraintlayout to 2.1.4

* Update exifinterface to 1.3.5

* Update test:core to 1.5.0
2023-02-03 22:56:23 +01:00
Sylvia van Os
8dac7ae9d1 Merge pull request #1203 from CatimaLoyalty/create-pull-request/patch-1675277210
Update Fastlane changelogs
2023-02-01 19:48:43 +01:00
TheLastProject
28a0417fa8 Update Fastlane changelogs 2023-02-01 18:46:49 +00:00
Sylvia van Os
58d4bd7f47 Update CHANGELOG 2023-02-01 19:46:31 +01:00
Sylvia van Os
1779aef162 Merge pull request #1083 from vanogrid/feature/validFromField
Add Valid From field
2023-02-01 19:29:38 +01:00
Sylvia van Os
557ec68428 Fix info button being hidden when only validFrom is set 2023-02-01 19:22:22 +01:00
Sylvia van Os
96a7c8ee36 String consistency improvement 2023-02-01 19:22:22 +01:00
Alexander Ivanov
3a9b92231e Set min/max date in the DatePickerDialog when 'valid from' or 'expiry' dates are set
Signed-off-by: Alexander Ivanov <vanogrid@gmail.com>
2023-02-01 19:22:22 +01:00
Alexander Ivanov
f1753ea943 Add Valid From field
Signed-off-by: Alexander Ivanov <vanogrid@gmail.com>
2023-02-01 19:22:20 +01:00
Sylvia van Os
36ab78ec6e Merge pull request #1202 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-30 17:55:11 +01:00
Cliff Heraldo
8a3a782558 Translated using Weblate (Indonesian)
Currently translated at 20.0% (23 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2023-01-30 16:41:04 +01:00
Cliff Heraldo
2c5606bf0a Translated using Weblate (Indonesian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2023-01-30 16:41:04 +01:00
gnu-ewm
5eb36aad5b Translated using Weblate (Polish)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2023-01-30 16:41:04 +01:00
Sylvia van Os
b028d32e2c Merge pull request #1200 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-29 13:30:29 +01:00
Sylvia van Os
dfefdda9f9 Translated using Weblate (Romanian)
Currently translated at 1.7% (2 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ro/
2023-01-29 13:09:25 +01:00
Sylvia van Os
bc1cc68f27 Update Fastlane 2023-01-29 13:05:11 +01:00
Sylvia van Os
386a5f75b0 Merge pull request #1198 from CatimaLoyalty/create-pull-request/patch-1674969594
Update contributors
2023-01-29 12:04:10 +01:00
Sylvia van Os
d30a9fd1e5 Merge pull request #1197 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-29 12:02:46 +01:00
TheLastProject
0c8e5576b8 Update contributors 2023-01-29 05:19:54 +00:00
Cliff Heraldo
93e40c08aa Translated using Weblate (Indonesian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2023-01-29 02:19:44 +01:00
HudobniVolk
24eb1e9627 Translated using Weblate (Slovenian)
Currently translated at 25.2% (29 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-29 00:54:59 +01:00
Dan
19e6b8bea9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2023-01-29 00:54:59 +01:00
HudobniVolk
87f844943e Translated using Weblate (Slovenian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-29 00:54:59 +01:00
J. Lavoie
718738ff78 Translated using Weblate (French)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2023-01-29 00:54:59 +01:00
J. Lavoie
d7bb019068 Translated using Weblate (German)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2023-01-29 00:54:59 +01:00
Sylvia van Os
f925404ab7 Revert "Fix filename"
This reverts commit 38495546e0.
2023-01-27 21:50:34 +01:00
Sylvia van Os
38495546e0 Fix filename 2023-01-27 19:19:26 +01:00
242 changed files with 8428 additions and 4378 deletions

View File

@@ -20,11 +20,11 @@ jobs:
- name: Fail on bad translations - name: Fail on bad translations
run: if grep -ri "&lt;xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi run: if grep -ri "&lt;xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
- uses: gradle/wrapper-validation-action@v1 - uses: gradle/wrapper-validation-action@v1
- name: set up JDK 11 - name: set up JDK 17
uses: actions/setup-java@v2 uses: actions/setup-java@v2
with: with:
distribution: 'adopt' distribution: 'temurin'
java-version: '11' java-version: '17'
- name: Build - name: Build
run: ./gradlew assembleRelease run: ./gradlew assembleRelease
- name: Check lint - name: Check lint

5
.gitignore vendored
View File

@@ -8,3 +8,8 @@ captures/
**/release **/release
**/debug **/debug
app/*.log app/*.log
# Bundle
/.bundle/
/vendor/bundle
/lib/bundler/man/

View File

@@ -1,5 +1,14 @@
# Changelog # Changelog
## v2.22.1 - 119
- Use Material You colours on more devices (Google library update)
## v2.22.0 - 118
- Support setting start of card validity
- Fix Stocard import (Stocard's export format changed)
## v2.21.2 - 117 ## v2.21.2 - 117
- Remove unnecessary permissions - Remove unnecessary permissions
@@ -609,7 +618,7 @@ Additional features/improvements:
## v0.7 - 7 (2016-07-14) ## v0.7 - 7 (2016-07-14)
- Long-click of a card brings up option to copy card ID to the clipboard. ([pull #49](https://github.com/brarcher/loyalty-card-locker/issues/49)) - Long-click of a card brings up option to copy card ID to the clipboard. ([pull #49](https://github.com/brarcher/loyalty-card-locker/issues/49))
- Back button on Input/Export view now works, moving user to main view - Back button on Import/Export view now works, moving user to main view
## v0.6 - 6 (2016-05-23) ## v0.6 - 6 (2016-05-23)

View File

@@ -1,27 +1,27 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
CFPropertyList (3.0.5) CFPropertyList (3.0.6)
rexml rexml
addressable (2.8.0) addressable (2.8.1)
public_suffix (>= 2.0.2, < 5.0) public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15) artifactory (3.0.15)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.2.0) aws-eventstream (1.2.0)
aws-partitions (1.597.0) aws-partitions (1.701.0)
aws-sdk-core (3.131.1) aws-sdk-core (3.170.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.57.0) aws-sdk-kms (1.62.0)
aws-sdk-core (~> 3, >= 3.127.0) aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.114.0) aws-sdk-s3 (1.119.0)
aws-sdk-core (~> 3, >= 3.127.0) aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4) aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.0) aws-sigv4 (1.5.2)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4) babosa (1.0.4)
claide (1.1.0) claide (1.1.0)
@@ -34,10 +34,10 @@ GEM
rake (>= 12.0.0, < 14.0.0) rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701) domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6) dotenv (2.8.1)
emoji_regex (3.2.3) emoji_regex (3.2.3)
excon (0.92.3) excon (0.98.0)
faraday (1.10.0) faraday (1.10.3)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1) faraday-excon (~> 1.1)
@@ -66,7 +66,7 @@ GEM
faraday_middleware (1.2.0) faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.2.6) fastimage (2.2.6)
fastlane (2.206.2) fastlane (2.211.0)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@@ -106,9 +106,9 @@ GEM
xcpretty (~> 0.3.0) xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3) xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.21.0) google-apis-androidpublisher_v3 (0.32.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.9.1, < 2.a)
google-apis-core (0.5.0) google-apis-core (0.10.0)
addressable (~> 2.5, >= 2.5.1) addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a) httpclient (>= 2.8.1, < 3.a)
@@ -117,27 +117,27 @@ GEM
retriable (>= 2.0, < 4.a) retriable (>= 2.0, < 4.a)
rexml rexml
webrick webrick
google-apis-iamcredentials_v1 (0.10.0) google-apis-iamcredentials_v1 (0.16.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.9.1, < 2.a)
google-apis-playcustomapp_v1 (0.7.0) google-apis-playcustomapp_v1 (0.12.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.9.1, < 2.a)
google-apis-storage_v1 (0.14.0) google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.9.0, < 2.a)
google-cloud-core (1.6.0) google-cloud-core (1.6.0)
google-cloud-env (~> 1.0) google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0) google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0) faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.2.0) google-cloud-errors (1.3.0)
google-cloud-storage (1.36.2) google-cloud-storage (1.44.0)
addressable (~> 2.8) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1) google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.1) google-apis-storage_v1 (~> 0.19.0)
google-cloud-core (~> 1.6) google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0) mini_mime (~> 1.0)
googleauth (1.1.3) googleauth (1.3.0)
faraday (>= 0.17.3, < 3.a) faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
memoist (~> 0.16) memoist (~> 0.16)
@@ -148,11 +148,11 @@ GEM
http-cookie (1.0.5) http-cookie (1.0.5)
domain_name (~> 0.5) domain_name (~> 0.5)
httpclient (2.8.3) httpclient (2.8.3)
jmespath (1.6.1) jmespath (1.6.2)
json (2.6.2) json (2.6.3)
jwt (2.4.1) jwt (2.6.0)
memoist (0.16.2) memoist (0.16.2)
mini_magick (4.11.0) mini_magick (4.12.0)
mini_mime (1.1.2) mini_mime (1.1.2)
multi_json (1.15.0) multi_json (1.15.0)
multipart-post (2.0.0) multipart-post (2.0.0)
@@ -161,7 +161,7 @@ GEM
optparse (0.1.1) optparse (0.1.1)
os (1.1.4) os (1.1.4)
plist (3.6.0) plist (3.6.0)
public_suffix (4.0.7) public_suffix (5.0.1)
rake (13.0.6) rake (13.0.6)
representable (3.2.0) representable (3.2.0)
declarative (< 0.1.0) declarative (< 0.1.0)
@@ -173,12 +173,12 @@ GEM
ruby2_keywords (0.0.5) ruby2_keywords (0.0.5)
rubyzip (2.3.2) rubyzip (2.3.2)
security (0.1.3) security (0.1.3)
signet (0.16.1) signet (0.17.0)
addressable (~> 2.8) addressable (~> 2.8)
faraday (>= 0.17.5, < 3.0) faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0) jwt (>= 1.5, < 3.0)
multi_json (~> 1.10) multi_json (~> 1.10)
simctl (1.6.8) simctl (1.6.10)
CFPropertyList CFPropertyList
naturally naturally
terminal-notifier (2.0.0) terminal-notifier (2.0.0)
@@ -194,9 +194,9 @@ GEM
unf_ext unf_ext
unf_ext (0.0.8.2) unf_ext (0.0.8.2)
unicode-display_width (1.8.0) unicode-display_width (1.8.0)
webrick (1.7.0) webrick (1.8.1)
word_wrap (1.0.0) word_wrap (1.0.0)
xcodeproj (1.21.0) xcodeproj (1.22.0)
CFPropertyList (>= 2.3.3, < 4.0) CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3) atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0) claide (>= 1.0.2, < 2.0)
@@ -215,4 +215,4 @@ DEPENDENCIES
fastlane fastlane
BUNDLED WITH BUNDLED WITH
2.1.4 2.3.26

View File

@@ -19,8 +19,8 @@ android {
applicationId "me.hackerchick.catima" applicationId "me.hackerchick.catima"
minSdk 21 minSdk 21
targetSdk 33 targetSdk 33
versionCode 117 versionCode 119
versionName "2.21.2" versionName "2.22.1"
vectorDrawables.useSupportLibrary true vectorDrawables.useSupportLibrary true
multiDexEnabled true multiDexEnabled true
@@ -58,9 +58,6 @@ android {
targetCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11
} }
lintOptions {
lintConfig file("lint.xml")
}
sourceSets { sourceSets {
test { test {
@@ -80,18 +77,22 @@ android {
includeAndroidResources true includeAndroidResources true
} }
} }
lint {
lintConfig file('lint.xml')
}
namespace 'protect.card_locker'
} }
dependencies { dependencies {
// AndroidX // AndroidX
implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.exifinterface:exifinterface:1.3.3' implementation 'androidx.exifinterface:exifinterface:1.3.6'
implementation 'androidx.palette:palette:1.0.0' implementation 'androidx.palette:palette:1.0.0'
implementation 'androidx.preference:preference:1.2.0' implementation 'androidx.preference:preference:1.2.0'
implementation 'com.google.android.material:material:1.6.1' implementation 'com.google.android.material:material:1.8.0'
implementation 'com.github.yalantis:ucrop:2.2.8' implementation 'com.github.yalantis:ucrop:2.2.8'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
// Splash Screen // Splash Screen
implementation 'androidx.core:core-splashscreen:1.0.0' implementation 'androidx.core:core-splashscreen:1.0.0'
@@ -99,18 +100,18 @@ dependencies {
// Third-party // Third-party
implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar' implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar'
implementation 'com.google.zxing:core:3.5.1' implementation 'com.google.zxing:core:3.5.1'
implementation 'org.apache.commons:commons-csv:1.9.0' implementation 'org.apache.commons:commons-csv:1.10.0'
implementation 'com.jaredrummler:colorpicker:1.1.0' implementation 'com.jaredrummler:colorpicker:1.1.0'
implementation 'com.github.invissvenska:NumberPickerPreference:1.0.4' implementation 'com.github.invissvenska:NumberPickerPreference:1.0.4'
implementation 'net.lingala.zip4j:zip4j:2.11.3' implementation 'net.lingala.zip4j:zip4j:2.11.5'
// SpotBugs // SpotBugs
implementation 'io.wcm.tooling.spotbugs:io.wcm.tooling.spotbugs.annotations:1.0.0' implementation 'io.wcm.tooling.spotbugs:io.wcm.tooling.spotbugs.annotations:1.0.0'
// Testing // Testing
testImplementation 'androidx.test:core:1.4.0' testImplementation 'androidx.test:core:1.5.0'
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
testImplementation 'org.robolectric:robolectric:4.9.2' testImplementation 'org.robolectric:robolectric:4.10'
} }
tasks.withType(SpotBugsTask) { tasks.withType(SpotBugsTask) {

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools">
package="protect.card_locker">
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" /> <uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />

View File

@@ -1,6 +1,5 @@
package protect.card_locker; package protect.card_locker;
import android.annotation.SuppressLint;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -69,10 +68,9 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
subscriber.onSubscribe(new NoOpSubscription()); subscriber.onSubscribe(new NoOpSubscription());
for (String controlId : controlIds) { for (String controlId : controlIds) {
Control control; Control control;
Integer cardId = this.controlIdToCardId(controlId);
try { LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId);
Integer cardId = this.controlIdToCardId(controlId); if (card != null) {
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId);
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class) Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("id", card.id); .putExtra("id", card.id);
@@ -85,7 +83,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
.setControlTemplate(new StatelessTemplate(controlId)) .setControlTemplate(new StatelessTemplate(controlId))
.setCustomIcon(Icon.createWithBitmap(getIcon(this, card))) .setCustomIcon(Icon.createWithBitmap(getIcon(this, card)))
.build(); .build();
} catch (NullPointerException ignored) { } else {
Intent mainScreenIntent = new Intent(this, MainActivity.class) Intent mainScreenIntent = new Intent(this, MainActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), -1, mainScreenIntent, PendingIntent.FLAG_IMMUTABLE); PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), -1, mainScreenIntent, PendingIntent.FLAG_IMMUTABLE);

View File

@@ -21,7 +21,7 @@ import java.util.List;
public class DBHelper extends SQLiteOpenHelper { public class DBHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "Catima.db"; public static final String DATABASE_NAME = "Catima.db";
public static final int ORIGINAL_DATABASE_VERSION = 1; public static final int ORIGINAL_DATABASE_VERSION = 1;
public static final int DATABASE_VERSION = 15; public static final int DATABASE_VERSION = 16;
public static class LoyaltyCardDbGroups { public static class LoyaltyCardDbGroups {
public static final String TABLE = "groups"; public static final String TABLE = "groups";
@@ -33,6 +33,7 @@ public class DBHelper extends SQLiteOpenHelper {
public static final String TABLE = "cards"; public static final String TABLE = "cards";
public static final String ID = "_id"; public static final String ID = "_id";
public static final String STORE = "store"; public static final String STORE = "store";
public static final String VALID_FROM = "validfrom";
public static final String EXPIRY = "expiry"; public static final String EXPIRY = "expiry";
public static final String BALANCE = "balance"; public static final String BALANCE = "balance";
public static final String BALANCE_TYPE = "balancetype"; public static final String BALANCE_TYPE = "balancetype";
@@ -95,6 +96,7 @@ public class DBHelper extends SQLiteOpenHelper {
LoyaltyCardDbIds.ID + " INTEGER primary key autoincrement," + LoyaltyCardDbIds.ID + " INTEGER primary key autoincrement," +
LoyaltyCardDbIds.STORE + " TEXT not null," + LoyaltyCardDbIds.STORE + " TEXT not null," +
LoyaltyCardDbIds.NOTE + " TEXT not null," + LoyaltyCardDbIds.NOTE + " TEXT not null," +
LoyaltyCardDbIds.VALID_FROM + " INTEGER," +
LoyaltyCardDbIds.EXPIRY + " INTEGER," + LoyaltyCardDbIds.EXPIRY + " INTEGER," +
LoyaltyCardDbIds.BALANCE + " TEXT not null DEFAULT '0'," + LoyaltyCardDbIds.BALANCE + " TEXT not null DEFAULT '0'," +
LoyaltyCardDbIds.BALANCE_TYPE + " TEXT," + LoyaltyCardDbIds.BALANCE_TYPE + " TEXT," +
@@ -314,6 +316,11 @@ public class DBHelper extends SQLiteOpenHelper {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.ARCHIVE_STATUS + " INTEGER DEFAULT '0' "); + " ADD COLUMN " + LoyaltyCardDbIds.ARCHIVE_STATUS + " INTEGER DEFAULT '0' ");
} }
if (oldVersion < 16 && newVersion >= 16) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.VALID_FROM + " INTEGER");
}
} }
private static ContentValues generateFTSContentValues(final int id, final String store, final String note) { private static ContentValues generateFTSContentValues(final int id, final String store, final String note) {
@@ -358,8 +365,8 @@ public class DBHelper extends SQLiteOpenHelper {
} }
public static long insertLoyaltyCard( public static long insertLoyaltyCard(
final SQLiteDatabase database, final String store, final String note, final Date expiry, final SQLiteDatabase database, final String store, final String note, final Date validFrom,
final BigDecimal balance, final Currency balanceType, final String cardId, final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType, final Integer headerColor, final String barcodeId, final CatimaBarcode barcodeType, final Integer headerColor,
final int starStatus, final Long lastUsed, final int archiveStatus) { final int starStatus, final Long lastUsed, final int archiveStatus) {
database.beginTransaction(); database.beginTransaction();
@@ -368,6 +375,7 @@ public class DBHelper extends SQLiteOpenHelper {
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STORE, store); contentValues.put(LoyaltyCardDbIds.STORE, store);
contentValues.put(LoyaltyCardDbIds.NOTE, note); contentValues.put(LoyaltyCardDbIds.NOTE, note);
contentValues.put(LoyaltyCardDbIds.VALID_FROM, validFrom != null ? validFrom.getTime() : null);
contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null); contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null);
contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString()); contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null); contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
@@ -391,9 +399,10 @@ public class DBHelper extends SQLiteOpenHelper {
public static long insertLoyaltyCard( public static long insertLoyaltyCard(
final SQLiteDatabase database, final int id, final String store, final String note, final SQLiteDatabase database, final int id, final String store, final String note,
final Date expiry, final BigDecimal balance, final Currency balanceType, final Date validFrom, final Date expiry, final BigDecimal balance,
final String cardId, final String barcodeId, final CatimaBarcode barcodeType, final Currency balanceType, final String cardId, final String barcodeId,
final Integer headerColor, final int starStatus, final Long lastUsed, final int archiveStatus) { final CatimaBarcode barcodeType, final Integer headerColor, final int starStatus,
final Long lastUsed, final int archiveStatus) {
database.beginTransaction(); database.beginTransaction();
// Card // Card
@@ -401,6 +410,7 @@ public class DBHelper extends SQLiteOpenHelper {
contentValues.put(LoyaltyCardDbIds.ID, id); contentValues.put(LoyaltyCardDbIds.ID, id);
contentValues.put(LoyaltyCardDbIds.STORE, store); contentValues.put(LoyaltyCardDbIds.STORE, store);
contentValues.put(LoyaltyCardDbIds.NOTE, note); contentValues.put(LoyaltyCardDbIds.NOTE, note);
contentValues.put(LoyaltyCardDbIds.VALID_FROM, validFrom != null ? validFrom.getTime() : null);
contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null); contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null);
contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString()); contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null); contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
@@ -424,15 +434,17 @@ public class DBHelper extends SQLiteOpenHelper {
public static boolean updateLoyaltyCard( public static boolean updateLoyaltyCard(
SQLiteDatabase database, final int id, final String store, final String note, SQLiteDatabase database, final int id, final String store, final String note,
final Date expiry, final BigDecimal balance, final Currency balanceType, final Date validFrom, final Date expiry, final BigDecimal balance,
final String cardId, final String barcodeId, final CatimaBarcode barcodeType, final Currency balanceType, final String cardId, final String barcodeId,
final Integer headerColor, final int starStatus, final Long lastUsed, final int archiveStatus) { final CatimaBarcode barcodeType, final Integer headerColor, final int starStatus,
final Long lastUsed, final int archiveStatus) {
database.beginTransaction(); database.beginTransaction();
// Card // Card
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STORE, store); contentValues.put(LoyaltyCardDbIds.STORE, store);
contentValues.put(LoyaltyCardDbIds.NOTE, note); contentValues.put(LoyaltyCardDbIds.NOTE, note);
contentValues.put(LoyaltyCardDbIds.VALID_FROM, validFrom != null ? validFrom.getTime() : null);
contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null); contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null);
contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString()); contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null); contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);

View File

@@ -18,6 +18,7 @@ import java.util.List;
public class ImportURIHelper { public class ImportURIHelper {
private static final String STORE = DBHelper.LoyaltyCardDbIds.STORE; private static final String STORE = DBHelper.LoyaltyCardDbIds.STORE;
private static final String NOTE = DBHelper.LoyaltyCardDbIds.NOTE; private static final String NOTE = DBHelper.LoyaltyCardDbIds.NOTE;
private static final String VALID_FROM = DBHelper.LoyaltyCardDbIds.VALID_FROM;
private static final String EXPIRY = DBHelper.LoyaltyCardDbIds.EXPIRY; private static final String EXPIRY = DBHelper.LoyaltyCardDbIds.EXPIRY;
private static final String BALANCE = DBHelper.LoyaltyCardDbIds.BALANCE; private static final String BALANCE = DBHelper.LoyaltyCardDbIds.BALANCE;
private static final String BALANCE_TYPE = DBHelper.LoyaltyCardDbIds.BALANCE_TYPE; private static final String BALANCE_TYPE = DBHelper.LoyaltyCardDbIds.BALANCE_TYPE;
@@ -62,6 +63,7 @@ public class ImportURIHelper {
try { try {
// These values are allowed to be null // These values are allowed to be null
CatimaBarcode barcodeType = null; CatimaBarcode barcodeType = null;
Date validFrom = null;
Date expiry = null; Date expiry = null;
BigDecimal balance = new BigDecimal("0"); BigDecimal balance = new BigDecimal("0");
Currency balanceType = null; Currency balanceType = null;
@@ -106,6 +108,10 @@ public class ImportURIHelper {
if (unparsedBalanceType != null && !unparsedBalanceType.equals("")) { if (unparsedBalanceType != null && !unparsedBalanceType.equals("")) {
balanceType = Currency.getInstance(unparsedBalanceType); balanceType = Currency.getInstance(unparsedBalanceType);
} }
String unparsedValidFrom = kv.get(VALID_FROM);
if (unparsedValidFrom != null && !unparsedValidFrom.equals("")) {
validFrom = new Date(Long.parseLong(unparsedValidFrom));
}
String unparsedExpiry = kv.get(EXPIRY); String unparsedExpiry = kv.get(EXPIRY);
if (unparsedExpiry != null && !unparsedExpiry.equals("")) { if (unparsedExpiry != null && !unparsedExpiry.equals("")) {
expiry = new Date(Long.parseLong(unparsedExpiry)); expiry = new Date(Long.parseLong(unparsedExpiry));
@@ -116,8 +122,8 @@ public class ImportURIHelper {
headerColor = Integer.parseInt(unparsedHeaderColor); headerColor = Integer.parseInt(unparsedHeaderColor);
} }
return new LoyaltyCard(-1, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100,0); return new LoyaltyCard(-1, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100, 0);
} catch (NullPointerException | NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) { } catch (NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) {
throw new InvalidObjectException("Not a valid import URI"); throw new InvalidObjectException("Not a valid import URI");
} }
} }
@@ -149,6 +155,9 @@ public class ImportURIHelper {
if (loyaltyCard.balanceType != null) { if (loyaltyCard.balanceType != null) {
fragment = appendFragment(fragment, BALANCE_TYPE, loyaltyCard.balanceType.getCurrencyCode()); fragment = appendFragment(fragment, BALANCE_TYPE, loyaltyCard.balanceType.getCurrencyCode());
} }
if (loyaltyCard.validFrom != null) {
fragment = appendFragment(fragment, VALID_FROM, String.valueOf(loyaltyCard.validFrom.getTime()));
}
if (loyaltyCard.expiry != null) { if (loyaltyCard.expiry != null) {
fragment = appendFragment(fragment, EXPIRY, String.valueOf(loyaltyCard.expiry.getTime())); fragment = appendFragment(fragment, EXPIRY, String.valueOf(loyaltyCard.expiry.getTime()));
} }

View File

@@ -14,6 +14,7 @@ public class LoyaltyCard implements Parcelable {
public final int id; public final int id;
public final String store; public final String store;
public final String note; public final String note;
public final Date validFrom;
public final Date expiry; public final Date expiry;
public final BigDecimal balance; public final BigDecimal balance;
public final Currency balanceType; public final Currency balanceType;
@@ -33,14 +34,16 @@ public class LoyaltyCard implements Parcelable {
public final long lastUsed; public final long lastUsed;
public int zoomLevel; public int zoomLevel;
public LoyaltyCard(final int id, final String store, final String note, final Date expiry, public LoyaltyCard(final int id, final String store, final String note, final Date validFrom,
final BigDecimal balance, final Currency balanceType, final String cardId, final Date expiry, final BigDecimal balance, final Currency balanceType,
@Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType, final String cardId, @Nullable final String barcodeId,
@Nullable final CatimaBarcode barcodeType,
@Nullable final Integer headerColor, final int starStatus, @Nullable final Integer headerColor, final int starStatus,
final long lastUsed, final int zoomLevel, final int archiveStatus) { final long lastUsed, final int zoomLevel, final int archiveStatus) {
this.id = id; this.id = id;
this.store = store; this.store = store;
this.note = note; this.note = note;
this.validFrom = validFrom;
this.expiry = expiry; this.expiry = expiry;
this.balance = balance; this.balance = balance;
this.balanceType = balanceType; this.balanceType = balanceType;
@@ -58,6 +61,8 @@ public class LoyaltyCard implements Parcelable {
id = in.readInt(); id = in.readInt();
store = in.readString(); store = in.readString();
note = in.readString(); note = in.readString();
long tmpValidFrom = in.readLong();
validFrom = tmpValidFrom != -1 ? new Date(tmpValidFrom) : null;
long tmpExpiry = in.readLong(); long tmpExpiry = in.readLong();
expiry = tmpExpiry != -1 ? new Date(tmpExpiry) : null; expiry = tmpExpiry != -1 ? new Date(tmpExpiry) : null;
balance = (BigDecimal) in.readValue(BigDecimal.class.getClassLoader()); balance = (BigDecimal) in.readValue(BigDecimal.class.getClassLoader());
@@ -79,6 +84,7 @@ public class LoyaltyCard implements Parcelable {
parcel.writeInt(id); parcel.writeInt(id);
parcel.writeString(store); parcel.writeString(store);
parcel.writeString(note); parcel.writeString(note);
parcel.writeLong(validFrom != null ? validFrom.getTime() : -1);
parcel.writeLong(expiry != null ? expiry.getTime() : -1); parcel.writeLong(expiry != null ? expiry.getTime() : -1);
parcel.writeValue(balance); parcel.writeValue(balance);
parcel.writeValue(balanceType); parcel.writeValue(balanceType);
@@ -96,6 +102,7 @@ public class LoyaltyCard implements Parcelable {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID)); int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
String store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)); String store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE));
String note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE)); String note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE));
long validFromLong = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.VALID_FROM));
long expiryLong = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY)); long expiryLong = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY));
BigDecimal balance = new BigDecimal(cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE))); BigDecimal balance = new BigDecimal(cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE)));
String cardId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID)); String cardId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID));
@@ -111,6 +118,7 @@ public class LoyaltyCard implements Parcelable {
CatimaBarcode barcodeType = null; CatimaBarcode barcodeType = null;
Currency balanceType = null; Currency balanceType = null;
Date validFrom = null;
Date expiry = null; Date expiry = null;
Integer headerColor = null; Integer headerColor = null;
@@ -122,6 +130,10 @@ public class LoyaltyCard implements Parcelable {
balanceType = Currency.getInstance(cursor.getString(balanceTypeColumn)); balanceType = Currency.getInstance(cursor.getString(balanceTypeColumn));
} }
if (validFromLong > 0) {
validFrom = new Date(validFromLong);
}
if (expiryLong > 0) { if (expiryLong > 0) {
expiry = new Date(expiryLong); expiry = new Date(expiryLong);
} }
@@ -130,7 +142,7 @@ public class LoyaltyCard implements Parcelable {
headerColor = cursor.getInt(headerColorColumn); headerColor = cursor.getInt(headerColorColumn);
} }
return new LoyaltyCard(id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred, lastUsed, zoomLevel,archived); return new LoyaltyCard(id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred, lastUsed, zoomLevel, archived);
} }
@Override @Override

View File

@@ -120,6 +120,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.setExtraField(inputHolder.mBalanceField, null, null); inputHolder.setExtraField(inputHolder.mBalanceField, null, null);
} }
if (mShowDetails && loyaltyCard.validFrom != null) {
inputHolder.setExtraField(inputHolder.mValidFromField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.validFrom), Utils.isNotYetValid(loyaltyCard.validFrom) ? Color.RED : null);
} else {
inputHolder.setExtraField(inputHolder.mValidFromField, null, null);
}
if (mShowDetails && loyaltyCard.expiry != null) { if (mShowDetails && loyaltyCard.expiry != null) {
inputHolder.setExtraField(inputHolder.mExpiryField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry), Utils.hasExpired(loyaltyCard.expiry) ? Color.RED : null); inputHolder.setExtraField(inputHolder.mExpiryField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry), Utils.hasExpired(loyaltyCard.expiry) ? Color.RED : null);
} else { } else {
@@ -135,7 +141,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.mCardIcon.setImageBitmap(Utils.generateIcon(mContext, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile()); inputHolder.mCardIcon.setImageBitmap(Utils.generateIcon(mContext, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile());
inputHolder.mCardIcon.setScaleType(ImageView.ScaleType.FIT_CENTER); inputHolder.mCardIcon.setScaleType(ImageView.ScaleType.FIT_CENTER);
} }
inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : R.attr.colorPrimary); inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : androidx.appcompat.R.attr.colorPrimary);
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition())); inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
@@ -235,7 +241,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder { public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mStoreField, mNoteField, mBalanceField, mExpiryField; public TextView mStoreField, mNoteField, mBalanceField, mValidFromField, mExpiryField;
public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground; public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground;
public MaterialCardView mRow, mIconLayout; public MaterialCardView mRow, mIconLayout;
public ConstraintLayout mStar, mArchived; public ConstraintLayout mStar, mArchived;
@@ -253,6 +259,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mStoreField = loyaltyCardLayoutBinding.store; mStoreField = loyaltyCardLayoutBinding.store;
mNoteField = loyaltyCardLayoutBinding.note; mNoteField = loyaltyCardLayoutBinding.note;
mBalanceField = loyaltyCardLayoutBinding.balance; mBalanceField = loyaltyCardLayoutBinding.balance;
mValidFromField = loyaltyCardLayoutBinding.validFrom;
mExpiryField = loyaltyCardLayoutBinding.expiry; mExpiryField = loyaltyCardLayoutBinding.expiry;
mIconLayout = loyaltyCardLayoutBinding.iconLayout; mIconLayout = loyaltyCardLayoutBinding.iconLayout;
mCardIcon = loyaltyCardLayoutBinding.thumbnail; mCardIcon = loyaltyCardLayoutBinding.thumbnail;
@@ -283,7 +290,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
field.setVisibility(View.VISIBLE); field.setVisibility(View.VISIBLE);
field.setText(text); field.setText(text);
field.setTextSize(size); field.setTextSize(size);
field.setTextColor(color != null ? color : MaterialColors.getColor(mContext, R.attr.colorSecondary, ContextCompat.getColor(mContext, mDarkModeEnabled ? R.color.md_theme_dark_secondary : R.color.md_theme_light_secondary))); field.setTextColor(color != null ? color : MaterialColors.getColor(mContext, com.google.android.material.R.attr.colorSecondary, ContextCompat.getColor(mContext, mDarkModeEnabled ? R.color.md_theme_dark_secondary : R.color.md_theme_light_secondary)));
int drawableSize = dpToPx((size * 24) / 14, mContext); int drawableSize = dpToPx((size * 24) / 14, mContext);
mDivider.setVisibility(View.VISIBLE); mDivider.setVisibility(View.VISIBLE);

View File

@@ -1,6 +1,5 @@
package protect.card_locker; package protect.card_locker;
import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.DatePickerDialog; import android.app.DatePickerDialog;
@@ -71,7 +70,8 @@ import java.util.concurrent.Callable;
import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts; import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar; import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.AppCompatTextView; import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
@@ -130,6 +130,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
EditText storeFieldEdit; EditText storeFieldEdit;
EditText noteFieldEdit; EditText noteFieldEdit;
ChipGroup groupsChips; ChipGroup groupsChips;
AutoCompleteTextView validFromField;
AutoCompleteTextView expiryField; AutoCompleteTextView expiryField;
EditText balanceField; EditText balanceField;
AutoCompleteTextView balanceCurrencyField; AutoCompleteTextView balanceCurrencyField;
@@ -208,6 +209,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
(int) (fieldName == LoyaltyCardField.id ? value : loyaltyCard.id), (int) (fieldName == LoyaltyCardField.id ? value : loyaltyCard.id),
(String) (fieldName == LoyaltyCardField.store ? value : loyaltyCard.store), (String) (fieldName == LoyaltyCardField.store ? value : loyaltyCard.store),
(String) (fieldName == LoyaltyCardField.note ? value : loyaltyCard.note), (String) (fieldName == LoyaltyCardField.note ? value : loyaltyCard.note),
(Date) (fieldName == LoyaltyCardField.validFrom ? value : loyaltyCard.validFrom),
(Date) (fieldName == LoyaltyCardField.expiry ? value : loyaltyCard.expiry), (Date) (fieldName == LoyaltyCardField.expiry ? value : loyaltyCard.expiry),
(BigDecimal) (fieldName == LoyaltyCardField.balance ? value : loyaltyCard.balance), (BigDecimal) (fieldName == LoyaltyCardField.balance ? value : loyaltyCard.balance),
(Currency) (fieldName == LoyaltyCardField.balanceType ? value : loyaltyCard.balanceType), (Currency) (fieldName == LoyaltyCardField.balanceType ? value : loyaltyCard.balanceType),
@@ -328,6 +330,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
storeFieldEdit = binding.storeNameEdit; storeFieldEdit = binding.storeNameEdit;
noteFieldEdit = binding.noteEdit; noteFieldEdit = binding.noteEdit;
groupsChips = binding.groupChips; groupsChips = binding.groupChips;
validFromField = binding.validFromField;
expiryField = binding.expiryField; expiryField = binding.expiryField;
balanceField = binding.balanceField; balanceField = binding.balanceField;
balanceCurrencyField = binding.balanceCurrencyField; balanceCurrencyField = binding.balanceCurrencyField;
@@ -367,38 +370,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
} }
}); });
expiryField.addTextChangedListener(new SimpleTextWatcher() { addDateFieldTextChangedListener(validFromField, R.string.anyDate, R.string.chooseValidFromDate, LoyaltyCardField.validFrom);
CharSequence lastValue;
@Override addDateFieldTextChangedListener(expiryField, R.string.never, R.string.chooseExpiryDate, LoyaltyCardField.expiry);
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
lastValue = s;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.toString().equals(getString(R.string.never))) {
expiryField.setTag(null);
} else if (s.toString().equals(getString(R.string.chooseExpiryDate))) {
if (!lastValue.toString().equals(getString(R.string.chooseExpiryDate))) {
expiryField.setText(lastValue);
}
DialogFragment datePickerFragment = new DatePickerFragment(LoyaltyCardEditActivity.this, expiryField);
datePickerFragment.show(getSupportFragmentManager(), "datePicker");
}
updateTempState(LoyaltyCardField.expiry, expiryField.getTag());
}
@Override
public void afterTextChanged(Editable s) {
ArrayList<String> expiryList = new ArrayList<>();
expiryList.add(0, getString(R.string.never));
expiryList.add(1, getString(R.string.chooseExpiryDate));
ArrayAdapter<String> expiryAdapter = new ArrayAdapter<>(LoyaltyCardEditActivity.this, android.R.layout.select_dialog_item, expiryList);
expiryField.setAdapter(expiryAdapter);
}
});
balanceField.setOnFocusChangeListener((v, hasFocus) -> { balanceField.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) { if (!hasFocus) {
@@ -696,16 +670,16 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
} }
mCropperOptions.setAspectRatioOptions(selectedByDefault, mCropperOptions.setAspectRatioOptions(selectedByDefault,
new AspectRatio(null, 1, 1), new AspectRatio(null, 1, 1),
new AspectRatio(getResources().getString(R.string.ucrop_label_original).toUpperCase(), sourceWidth, sourceHeight), new AspectRatio(getResources().getString(com.yalantis.ucrop.R.string.ucrop_label_original).toUpperCase(), sourceWidth, sourceHeight),
new AspectRatio(getResources().getString(R.string.card).toUpperCase(), 85.6f, 53.98f) new AspectRatio(getResources().getString(R.string.card).toUpperCase(), 85.6f, 53.98f)
); );
// Fix theming // Fix theming
int colorPrimary = MaterialColors.getColor(this, R.attr.colorPrimary, ContextCompat.getColor(this, R.color.md_theme_light_primary)); int colorPrimary = MaterialColors.getColor(this, androidx.appcompat.R.attr.colorPrimary, ContextCompat.getColor(this, R.color.md_theme_light_primary));
int colorOnPrimary = MaterialColors.getColor(this, R.attr.colorOnPrimary, ContextCompat.getColor(this, R.color.md_theme_light_onPrimary)); int colorOnPrimary = MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnPrimary, ContextCompat.getColor(this, R.color.md_theme_light_onPrimary));
int colorSurface = MaterialColors.getColor(this, R.attr.colorSurface, ContextCompat.getColor(this, R.color.md_theme_light_surface)); int colorSurface = MaterialColors.getColor(this, com.google.android.material.R.attr.colorSurface, ContextCompat.getColor(this, R.color.md_theme_light_surface));
int colorOnSurface = MaterialColors.getColor(this, R.attr.colorOnSurface, ContextCompat.getColor(this, R.color.md_theme_light_onSurface)); int colorOnSurface = MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnSurface, ContextCompat.getColor(this, R.color.md_theme_light_onSurface));
int colorBackground = MaterialColors.getColor(this, android.R.attr.colorBackground, ContextCompat.getColor(this, R.color.md_theme_light_onSurface)); int colorBackground = MaterialColors.getColor(this, android.R.attr.colorBackground, ContextCompat.getColor(this, R.color.md_theme_light_onSurface));
mCropperOptions.setToolbarColor(colorSurface); mCropperOptions.setToolbarColor(colorSurface);
mCropperOptions.setStatusBarColor(colorSurface); mCropperOptions.setStatusBarColor(colorSurface);
@@ -779,7 +753,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
} }
} else { } else {
// New card, use default values // New card, use default values
tempLoyaltyCard = new LoyaltyCard(-1, "", "", null, new BigDecimal("0"), null, "", null, null, null, 0, Utils.getUnixTime(), 100,0); tempLoyaltyCard = new LoyaltyCard(-1, "", "", null, null, new BigDecimal("0"), null, "", null, null, null, 0, Utils.getUnixTime(), 100,0);
} }
} }
@@ -822,7 +796,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
storeFieldEdit.setText(tempLoyaltyCard.store); storeFieldEdit.setText(tempLoyaltyCard.store);
noteFieldEdit.setText(tempLoyaltyCard.note); noteFieldEdit.setText(tempLoyaltyCard.note);
formatExpiryField(this, expiryField, tempLoyaltyCard.expiry); formatDateField(this, validFromField, tempLoyaltyCard.validFrom);
formatDateField(this, expiryField, tempLoyaltyCard.expiry);
formatBalanceCurrencyField(tempLoyaltyCard.balanceType); formatBalanceCurrencyField(tempLoyaltyCard.balanceType);
cardIdFieldView.setText(tempLoyaltyCard.cardId); cardIdFieldView.setText(tempLoyaltyCard.cardId);
barcodeIdField.setText(tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : getString(R.string.sameAsCardId)); barcodeIdField.setText(tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : getString(R.string.sameAsCardId));
@@ -936,7 +911,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
protected void setColorFromIcon() { protected void setColorFromIcon() {
Object icon = thumbnail.getTag(); Object icon = thumbnail.getTag();
if (icon != null && (icon instanceof Bitmap)) { if (icon != null && (icon instanceof Bitmap)) {
int headerColor = Utils.getHeaderColorFromImage((Bitmap) icon, tempLoyaltyCard.headerColor != null ? tempLoyaltyCard.headerColor : R.attr.colorPrimary); int headerColor = Utils.getHeaderColorFromImage((Bitmap) icon, tempLoyaltyCard.headerColor != null ? tempLoyaltyCard.headerColor : androidx.appcompat.R.attr.colorPrimary);
updateTempState(LoyaltyCardField.headerColor, headerColor); updateTempState(LoyaltyCardField.headerColor, headerColor);
@@ -957,13 +932,62 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
} }
} }
protected static void formatExpiryField(Context context, EditText expiryField, Date expiry) { protected void addDateFieldTextChangedListener(AutoCompleteTextView dateField, @StringRes int defaultOptionStringId, @StringRes int chooseDateOptionStringId, LoyaltyCardField loyaltyCardField) {
expiryField.setTag(expiry); dateField.addTextChangedListener(new SimpleTextWatcher() {
CharSequence lastValue;
if (expiry == null) { @Override
expiryField.setText(context.getString(R.string.never)); public void beforeTextChanged(CharSequence s, int start, int count, int after) {
lastValue = s;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.toString().equals(getString(defaultOptionStringId))) {
dateField.setTag(null);
} else if (s.toString().equals(getString(chooseDateOptionStringId))) {
if (!lastValue.toString().equals(getString(chooseDateOptionStringId))) {
dateField.setText(lastValue);
}
DialogFragment datePickerFragment = new DatePickerFragment(
LoyaltyCardEditActivity.this,
dateField,
// if the expiry date is being set, set date picker's minDate to the 'valid from' date
loyaltyCardField == LoyaltyCardField.expiry ? (Date) validFromField.getTag() : null,
// if the 'valid from' date is being set, set date picker's maxDate to the expiry date
loyaltyCardField == LoyaltyCardField.validFrom ? (Date) expiryField.getTag() : null);
datePickerFragment.show(getSupportFragmentManager(), "datePicker");
}
updateTempState(loyaltyCardField, dateField.getTag());
}
@Override
public void afterTextChanged(Editable s) {
ArrayList<String> dropdownOptions = new ArrayList<>();
dropdownOptions.add(0, getString(defaultOptionStringId));
dropdownOptions.add(1, getString(chooseDateOptionStringId));
ArrayAdapter<String> dropdownOptionsAdapter = new ArrayAdapter<>(LoyaltyCardEditActivity.this, android.R.layout.select_dialog_item, dropdownOptions);
dateField.setAdapter(dropdownOptionsAdapter);
}
});
}
protected static void formatDateField(Context context, EditText textField, Date date) {
textField.setTag(date);
if (date == null) {
String text;
if (textField.getId() == R.id.validFromField) {
text = context.getString(R.string.anyDate);
} else if (textField.getId() == R.id.expiryField) {
text = context.getString(R.string.never);
} else {
throw new IllegalArgumentException("Unknown textField Id " + textField.getId());
}
textField.setText(text);
} else { } else {
expiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(expiry)); textField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(date));
} }
} }
@@ -1282,11 +1306,17 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
implements DatePickerDialog.OnDateSetListener { implements DatePickerDialog.OnDateSetListener {
final Context context; final Context context;
final EditText expiryFieldEdit; final EditText textFieldEdit;
@Nullable
final Date minDate;
@Nullable
final Date maxDate;
DatePickerFragment(Context context, EditText expiryFieldEdit) { DatePickerFragment(Context context, EditText textFieldEdit, @Nullable Date minDate, @Nullable Date maxDate) {
this.context = context; this.context = context;
this.expiryFieldEdit = expiryFieldEdit; this.textFieldEdit = textFieldEdit;
this.minDate = minDate;
this.maxDate = maxDate;
} }
@NonNull @NonNull
@@ -1295,7 +1325,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
// Use the current date as the default date in the picker // Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance(); final Calendar c = Calendar.getInstance();
Date date = (Date) expiryFieldEdit.getTag(); Date date = (Date) textFieldEdit.getTag();
if (date != null) { if (date != null) {
c.setTime(date); c.setTime(date);
} }
@@ -1306,17 +1336,23 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
// Create a new instance of DatePickerDialog and return it // Create a new instance of DatePickerDialog and return it
DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), this, year, month, day); DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), this, year, month, day);
datePickerDialog.getDatePicker().setMinDate(getMinDateOfDatePicker()); datePickerDialog.getDatePicker().setMinDate(minDate != null ? minDate.getTime() : getDefaultMinDateOfDatePicker());
datePickerDialog.getDatePicker().setMaxDate(maxDate != null ? maxDate.getTime() : getDefaultMaxDateOfDatePicker());
return datePickerDialog; return datePickerDialog;
} }
private long getMinDateOfDatePicker() private long getDefaultMinDateOfDatePicker() {
{
Calendar minDateCalendar = Calendar.getInstance(); Calendar minDateCalendar = Calendar.getInstance();
minDateCalendar.set(1970, 0, 1); minDateCalendar.set(1970, 0, 1);
return minDateCalendar.getTimeInMillis(); return minDateCalendar.getTimeInMillis();
} }
private long getDefaultMaxDateOfDatePicker() {
Calendar maxDateCalendar = Calendar.getInstance();
maxDateCalendar.set(2100, 11, 31);
return maxDateCalendar.getTimeInMillis();
}
public void onDateSet(DatePicker view, int year, int month, int day) { public void onDateSet(DatePicker view, int year, int month, int day) {
Calendar c = new GregorianCalendar(); Calendar c = new GregorianCalendar();
c.set(Calendar.YEAR, year); c.set(Calendar.YEAR, year);
@@ -1331,7 +1367,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
Date date = new Date(unixTime); Date date = new Date(unixTime);
formatExpiryField(context, expiryFieldEdit, date); formatDateField(context, textFieldEdit, date);
} }
} }
@@ -1372,9 +1408,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
// This makes the DBHelper set it to the current date // This makes the DBHelper set it to the current date
// So that new and edited card are always on top when sorting by recently used // So that new and edited card are always on top when sorting by recently used
if (updateLoyaltyCard) { if (updateLoyaltyCard) {
DBHelper.updateLoyaltyCard(mDatabase, loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, tempLoyaltyCard.starStatus, null, tempLoyaltyCard.archiveStatus); DBHelper.updateLoyaltyCard(mDatabase, loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.validFrom, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, tempLoyaltyCard.starStatus, null, tempLoyaltyCard.archiveStatus);
} else { } else {
loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, null, 0); loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.validFrom, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, null, 0);
} }
try { try {

View File

@@ -4,6 +4,7 @@ public enum LoyaltyCardField {
id, id,
store, store,
note, note,
validFrom,
expiry, expiry,
balance, balance,
balanceType, balanceType,

View File

@@ -43,6 +43,7 @@ import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
@@ -73,7 +74,9 @@ import java.text.ParseException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Currency; import java.util.Currency;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.function.Predicate;
import protect.card_locker.async.TaskHandler; import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding; import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding;
@@ -525,19 +528,9 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
infoText.append(getString(R.string.balanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType))); infoText.append(getString(R.string.balanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
} }
if (loyaltyCard.expiry != null) { appendDateInfo(infoText, loyaltyCard.validFrom, (Utils::isNotYetValid), R.string.validFromSentence, R.string.validFromSentence);
String formattedExpiry = DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry);
padSpannableString(infoText); appendDateInfo(infoText, loyaltyCard.expiry, (Utils::hasExpired), R.string.expiryStateSentenceExpired, R.string.expiryStateSentence);
if (Utils.hasExpired(loyaltyCard.expiry)) {
int start = infoText.length();
infoText.append(getString(R.string.expiryStateSentenceExpired, formattedExpiry));
infoText.setSpan(new ForegroundColorSpan(Color.RED), start, infoText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
} else {
infoText.append(getString(R.string.expiryStateSentence, formattedExpiry));
}
}
infoTextview.setText(infoText); infoTextview.setText(infoText);
@@ -546,6 +539,21 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
infoDialog.create().show(); infoDialog.create().show();
} }
private void appendDateInfo(SpannableStringBuilder infoText, Date date, Predicate<Date> dateCheck, @StringRes int dateCheckTrueString, @StringRes int dateCheckFalseString) {
if (date != null) {
String formattedDate = DateFormat.getDateInstance(DateFormat.LONG).format(date);
padSpannableString(infoText);
if (dateCheck.test(date)) {
int start = infoText.length();
infoText.append(getString(dateCheckTrueString, formattedDate));
infoText.setSpan(new ForegroundColorSpan(Color.RED), start, infoText.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
} else {
infoText.append(getString(dateCheckFalseString, formattedDate));
}
}
}
private void showBalanceUpdateDialog() { private void showBalanceUpdateDialog() {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this); AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.updateBalanceTitle); builder.setTitle(R.string.updateBalanceTitle);
@@ -621,7 +629,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} }
private void setBottomAppBarButtonState() { private void setBottomAppBarButtonState() {
if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.expiry != null) { if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.validFrom != null || loyaltyCard.expiry != null) {
bottomAppBarInfoButton.setVisibility(View.VISIBLE); bottomAppBarInfoButton.setVisibility(View.VISIBLE);
} else { } else {
bottomAppBarInfoButton.setVisibility(View.GONE); bottomAppBarInfoButton.setVisibility(View.GONE);
@@ -1201,6 +1209,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
getWindow().setDecorFitsSystemWindows(true); getWindow().setDecorFitsSystemWindows(true);
if (getWindow().getInsetsController() != null) { if (getWindow().getInsetsController() != null) {
getWindow().getInsetsController().show(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); getWindow().getInsetsController().show(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars());
getWindow().getInsetsController().setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_DEFAULT);
} }
} else { } else {
unsetFullscreenModeSdkLessThan30(); unsetFullscreenModeSdkLessThan30();

View File

@@ -375,18 +375,28 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
// Start of active tab logic // Start of active tab logic
updateTabGroups(groupsTabLayout); updateTabGroups(groupsTabLayout);
// Restore settings from Shared Preference // Restore selected tab from Shared Preference
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences( SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab), getString(R.string.sharedpreference_active_tab),
Context.MODE_PRIVATE); Context.MODE_PRIVATE);
selectedTab = activeTabPref.getInt(getString(R.string.sharedpreference_active_tab), 0); selectedTab = activeTabPref.getInt(getString(R.string.sharedpreference_active_tab), 0);
// Restore sort preferences from Shared Preferences
// If one of the sorting prefererences has never been set or is set to an invalid value,
// stick to the defaults.
SharedPreferences sortPref = getApplicationContext().getSharedPreferences( SharedPreferences sortPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_sort), getString(R.string.sharedpreference_sort),
Context.MODE_PRIVATE); Context.MODE_PRIVATE);
try {
mOrder = DBHelper.LoyaltyCardOrder.valueOf(sortPref.getString(getString(R.string.sharedpreference_sort_order), null)); String orderString = sortPref.getString(getString(R.string.sharedpreference_sort_order), null);
mOrderDirection = DBHelper.LoyaltyCardOrderDirection.valueOf(sortPref.getString(getString(R.string.sharedpreference_sort_direction), null)); String orderDirectionString = sortPref.getString(getString(R.string.sharedpreference_sort_direction), null);
} catch (IllegalArgumentException | NullPointerException ignored) {
if (orderString != null && orderDirectionString != null) {
try {
mOrder = DBHelper.LoyaltyCardOrder.valueOf(orderString);
mOrderDirection = DBHelper.LoyaltyCardOrderDirection.valueOf(orderDirectionString);
} catch (IllegalArgumentException ignored) {
}
} }
mGroup = null; mGroup = null;
@@ -520,38 +530,41 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
// Check if an image was shared to us // Check if an image was shared to us
if (Intent.ACTION_SEND.equals(receivedAction)) { if (Intent.ACTION_SEND.equals(receivedAction)) {
if (receivedType.startsWith("image/")) { if (!receivedType.startsWith("image/")) {
BarcodeValues barcodeValues;
try {
Bitmap bitmap;
try {
Uri data = intent.getParcelableExtra(Intent.EXTRA_STREAM);
bitmap = Utils.retrieveImageFromUri(this, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
barcodeValues = Utils.getBarcodeFromBitmap(bitmap);
if (barcodeValues.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(this, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
finish();
return;
}
} catch (NullPointerException e) {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
processBarcodeValues(barcodeValues, null);
} else {
Log.e(TAG, "Wrong mime-type"); Log.e(TAG, "Wrong mime-type");
return;
} }
BarcodeValues barcodeValues;
Bitmap bitmap;
Uri data = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (data == null) {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
try {
bitmap = Utils.retrieveImageFromUri(this, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
barcodeValues = Utils.getBarcodeFromBitmap(bitmap);
if (barcodeValues.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(this, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
finish();
return;
}
processBarcodeValues(barcodeValues, null);
} }
} }

View File

@@ -21,7 +21,6 @@ import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts; import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@@ -194,27 +193,22 @@ public class ScanActivity extends CatimaAppCompatActivity {
private void handleActivityResult(int requestCode, int resultCode, Intent intent) { private void handleActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent); super.onActivityResult(requestCode, resultCode, intent);
BarcodeValues barcodeValues; BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
try { if (barcodeValues.isEmpty()) {
barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
} catch (NullPointerException e) {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return; return;
} }
if (!barcodeValues.isEmpty()) { Intent manualResult = new Intent();
Intent manualResult = new Intent(); Bundle manualResultBundle = new Bundle();
Bundle manualResultBundle = new Bundle(); manualResultBundle.putString(BarcodeSelectorActivity.BARCODE_CONTENTS, barcodeValues.content());
manualResultBundle.putString(BarcodeSelectorActivity.BARCODE_CONTENTS, barcodeValues.content()); manualResultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, barcodeValues.format());
manualResultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, barcodeValues.format()); if (addGroup != null) {
if (addGroup != null) { manualResultBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup);
manualResultBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup);
}
manualResult.putExtras(manualResultBundle);
ScanActivity.this.setResult(RESULT_OK, manualResult);
finish();
} }
manualResult.putExtras(manualResultBundle);
ScanActivity.this.setResult(RESULT_OK, manualResult);
finish();
} }
public void addManually(View view) { public void addManually(View view) {
@@ -251,7 +245,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedClickableArea.setOnClickListener(show ? v -> { customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedClickableArea.setOnClickListener(show ? v -> {
navigateToSystemPermissionSetting(); navigateToSystemPermissionSetting();
} : null); } : null);
customBarcodeScannerBinding.cardInputContainer.setBackgroundColor(show ? obtainThemeAttribute(R.attr.colorSurface) : Color.TRANSPARENT); customBarcodeScannerBinding.cardInputContainer.setBackgroundColor(show ? obtainThemeAttribute(com.google.android.material.R.attr.colorSurface) : Color.TRANSPARENT);
customBarcodeScannerBinding.cameraPermissionDeniedLayout.getRoot().setVisibility(show ? View.VISIBLE : View.GONE); customBarcodeScannerBinding.cameraPermissionDeniedLayout.getRoot().setVisibility(show ? View.VISIBLE : View.GONE);
} }

View File

@@ -53,8 +53,8 @@ public class UCropWrapper extends UCropActivity {
AppCompatImageView controlsBackgroundImage = (AppCompatImageView) check; AppCompatImageView controlsBackgroundImage = (AppCompatImageView) check;
// everything gathered and are as expected, now perform color patching // everything gathered and are as expected, now perform color patching
Utils.patchColors(this); Utils.patchColors(this);
int colorSurface = MaterialColors.getColor(this, R.attr.colorSurface, ContextCompat.getColor(this, R.color.md_theme_light_surface)); int colorSurface = MaterialColors.getColor(this, com.google.android.material.R.attr.colorSurface, ContextCompat.getColor(this, R.color.md_theme_light_surface));
int colorOnSurface = MaterialColors.getColor(this, R.attr.colorOnSurface, ContextCompat.getColor(this, R.color.md_theme_light_onSurface)); int colorOnSurface = MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnSurface, ContextCompat.getColor(this, R.color.md_theme_light_onSurface));
Drawable controlsBackgroundImageDrawable = controlsBackgroundImage.getBackground(); Drawable controlsBackgroundImageDrawable = controlsBackgroundImage.getBackground();
controlsBackgroundImageDrawable.mutate(); controlsBackgroundImageDrawable.mutate();

View File

@@ -45,7 +45,6 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.StringWriter;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.text.NumberFormat; import java.text.NumberFormat;
@@ -113,6 +112,17 @@ public class Utils {
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT; return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
} }
/**
* Returns the Barcode format and content based on the result of an activity.
* It shows toasts to notify the end-user as needed itself and will return an empty
* BarcodeValues object if the activity was cancelled or nothing could be found.
*
* @param requestCode
* @param resultCode
* @param intent
* @param context
* @return BarcodeValues
*/
static public BarcodeValues parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) { static public BarcodeValues parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) {
String contents; String contents;
String format; String format;
@@ -124,9 +134,15 @@ public class Utils {
if (requestCode == Utils.BARCODE_IMPORT_FROM_IMAGE_FILE) { if (requestCode == Utils.BARCODE_IMPORT_FROM_IMAGE_FILE) {
Log.i(TAG, "Received image file with possible barcode"); Log.i(TAG, "Received image file with possible barcode");
Uri data = intent.getData();
if (data == null) {
Log.e(TAG, "Intent did not contain any data");
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new BarcodeValues(null, null);
}
Bitmap bitmap; Bitmap bitmap;
try { try {
Uri data = intent.getData();
bitmap = retrieveImageFromUri(context, data); bitmap = retrieveImageFromUri(context, data);
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "Error getting data from image file"); Log.e(TAG, "Error getting data from image file");
@@ -214,7 +230,21 @@ public class Utils {
} }
} }
static public Boolean isNotYetValid(Date validFromDate) {
// The note in `hasExpired` does not apply here, since the bug was fixed before this feature was added.
return validFromDate.after(getStartOfToday().getTime());
}
static public Boolean hasExpired(Date expiryDate) { static public Boolean hasExpired(Date expiryDate) {
// Note: In #1083 it was discovered that `DatePickerFragment` may sometimes store the expiryDate
// at 12:00 PM instead of 12:00 AM in the DB. While this has been fixed and the 12-hour difference
// is not a problem for the way the comparison currently works, it's good to keep in mind such
// dates may exist in the DB in case the comparison changes in the future and the new one relies
// on both dates being set at 12:00 AM.
return expiryDate.before(getStartOfToday().getTime());
}
static private Calendar getStartOfToday() {
// today // today
Calendar date = new GregorianCalendar(); Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis // reset hour, minutes, seconds and millis
@@ -222,13 +252,7 @@ public class Utils {
date.set(Calendar.MINUTE, 0); date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0); date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0); date.set(Calendar.MILLISECOND, 0);
return date;
// Note: In #1083 it was discovered that `DatePickerFragment` may sometimes store the expiryDate
// at 12:00 PM instead of 12:00 AM in the DB. While this has been fixed and the 12-hour difference
// is not a problem for the way the comparison currently works, it's good to keep in mind such
// dates may exist in the DB in case the comparison changes in the future and the new one relies
// on both dates being set at 12:00 AM.
return expiryDate.before(date.getTime());
} }
static public String formatBalance(Context context, BigDecimal value, Currency currency) { static public String formatBalance(Context context, BigDecimal value, Currency currency) {
@@ -548,7 +572,7 @@ public class Utils {
return fallback; return fallback;
} }
return new Palette.Builder(image).generate().getDominantColor(R.attr.colorPrimary); return new Palette.Builder(image).generate().getDominantColor(androidx.appcompat.R.attr.colorPrimary);
} }
public static int getRandomHeaderColor(Context context) { public static int getRandomHeaderColor(Context context) {

View File

@@ -8,22 +8,14 @@ public class CSVHelpers {
/** /**
* Extract a string from the items array. The index into the array * Extract a string from the items array. The index into the array
* is determined by looking up the index in the fields map using the * is determined by looking up the index in the fields map using the
* "key" as the key. If no such key exists, defaultValue is returned * "key" as the key. If no such key exists, defaultValue is returned.
* if it is not null. Otherwise, a FormatException is thrown.
*/ */
static String extractString(String key, CSVRecord record, String defaultValue) static String extractString(String key, CSVRecord record, String defaultValue) {
throws FormatException {
String toReturn = defaultValue;
if (record.isMapped(key)) { if (record.isMapped(key)) {
toReturn = record.get(key); return record.get(key);
} else {
if (defaultValue == null) {
throw new FormatException("Field not used but expected: " + key);
}
} }
return toReturn; return defaultValue;
} }
/** /**
@@ -32,15 +24,15 @@ public class CSVHelpers {
* "key" as the key. If no such key exists, or the data is not a valid * "key" as the key. If no such key exists, or the data is not a valid
* int, a FormatException is thrown. * int, a FormatException is thrown.
*/ */
static Integer extractInt(String key, CSVRecord record, boolean nullIsOk) static Integer extractInt(String key, CSVRecord record)
throws FormatException { throws FormatException {
if (record.isMapped(key) == false) { if (!record.isMapped(key)) {
throw new FormatException("Field not used but expected: " + key); throw new FormatException("Field not used but expected: " + key);
} }
String value = record.get(key); String value = record.get(key);
if (value.isEmpty() && nullIsOk) { if (value.isEmpty()) {
return null; throw new FormatException("Field is empty: " + key);
} }
try { try {
@@ -56,15 +48,15 @@ public class CSVHelpers {
* "key" as the key. If no such key exists, or the data is not a valid * "key" as the key. If no such key exists, or the data is not a valid
* int, a FormatException is thrown. * int, a FormatException is thrown.
*/ */
static Long extractLong(String key, CSVRecord record, boolean nullIsOk) static Long extractLong(String key, CSVRecord record)
throws FormatException { throws FormatException {
if (record.isMapped(key) == false) { if (!record.isMapped(key)) {
throw new FormatException("Field not used but expected: " + key); throw new FormatException("Field not used but expected: " + key);
} }
String value = record.get(key); String value = record.get(key);
if (value.isEmpty() && nullIsOk) { if (value.isEmpty()) {
return null; throw new FormatException("Field is empty: " + key);
} }
try { try {

View File

@@ -127,6 +127,7 @@ public class CatimaExporter implements Exporter {
printer.printRecord(DBHelper.LoyaltyCardDbIds.ID, printer.printRecord(DBHelper.LoyaltyCardDbIds.ID,
DBHelper.LoyaltyCardDbIds.STORE, DBHelper.LoyaltyCardDbIds.STORE,
DBHelper.LoyaltyCardDbIds.NOTE, DBHelper.LoyaltyCardDbIds.NOTE,
DBHelper.LoyaltyCardDbIds.VALID_FROM,
DBHelper.LoyaltyCardDbIds.EXPIRY, DBHelper.LoyaltyCardDbIds.EXPIRY,
DBHelper.LoyaltyCardDbIds.BALANCE, DBHelper.LoyaltyCardDbIds.BALANCE,
DBHelper.LoyaltyCardDbIds.BALANCE_TYPE, DBHelper.LoyaltyCardDbIds.BALANCE_TYPE,
@@ -146,6 +147,7 @@ public class CatimaExporter implements Exporter {
printer.printRecord(card.id, printer.printRecord(card.id,
card.store, card.store,
card.note, card.note,
card.validFrom != null ? card.validFrom.getTime() : "",
card.expiry != null ? card.expiry.getTime() : "", card.expiry != null ? card.expiry.getTime() : "",
card.balance, card.balance,
card.balanceType, card.balanceType,

View File

@@ -17,6 +17,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.StringReader; import java.io.StringReader;
import java.io.UncheckedIOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
@@ -77,7 +78,7 @@ public class CatimaImporter implements Importer {
int version = parseVersion(bufferedReader); int version = parseVersion(bufferedReader);
switch (version) { switch (version) {
case 1: case 1:
parseV1(context, database, bufferedReader); parseV1(database, bufferedReader);
break; break;
case 2: case 2:
parseV2(context, database, bufferedReader); parseV2(context, database, bufferedReader);
@@ -87,12 +88,12 @@ public class CatimaImporter implements Importer {
} }
} }
public void parseV1(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException { public void parseV1(SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
final CSVParser parser = new CSVParser(input, CSVFormat.RFC4180.builder().setHeader().build()); final CSVParser parser = new CSVParser(input, CSVFormat.RFC4180.builder().setHeader().build());
try { try {
for (CSVRecord record : parser) { for (CSVRecord record : parser) {
importLoyaltyCard(context, database, record); importLoyaltyCard(database, record);
if (Thread.currentThread().isInterrupted()) { if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException(); throw new InterruptedException();
@@ -100,7 +101,7 @@ public class CatimaImporter implements Importer {
} }
parser.close(); parser.close();
} catch (IllegalArgumentException | IllegalStateException e) { } catch (UncheckedIOException e) {
throw new FormatException("Issue parsing CSV data", e); throw new FormatException("Issue parsing CSV data", e);
} }
} }
@@ -182,7 +183,7 @@ public class CatimaImporter implements Importer {
throw new InterruptedException(); throw new InterruptedException();
} }
} }
} catch (IllegalArgumentException | IllegalStateException e) { } catch (UncheckedIOException e) {
throw new FormatException("Issue parsing CSV data", e); throw new FormatException("Issue parsing CSV data", e);
} finally { } finally {
groupParser.close(); groupParser.close();
@@ -207,14 +208,14 @@ public class CatimaImporter implements Importer {
throw new InterruptedException(); throw new InterruptedException();
} }
} }
} catch (IllegalArgumentException | IllegalStateException e) { } catch (UncheckedIOException e) {
throw new FormatException("Issue parsing CSV data", e); throw new FormatException("Issue parsing CSV data", e);
} finally { } finally {
cardParser.close(); cardParser.close();
} }
for (CSVRecord record : records) { for (CSVRecord record : records) {
importLoyaltyCard(context, database, record); importLoyaltyCard(database, record);
} }
} }
@@ -232,7 +233,7 @@ public class CatimaImporter implements Importer {
throw new InterruptedException(); throw new InterruptedException();
} }
} }
} catch (IllegalArgumentException | IllegalStateException e) { } catch (UncheckedIOException e) {
throw new FormatException("Issue parsing CSV data", e); throw new FormatException("Issue parsing CSV data", e);
} finally { } finally {
cardGroupParser.close(); cardGroupParser.close();
@@ -276,9 +277,9 @@ public class CatimaImporter implements Importer {
* Import a single loyalty card into the database using the given * Import a single loyalty card into the database using the given
* session. * session.
*/ */
private void importLoyaltyCard(Context context, SQLiteDatabase database, CSVRecord record) private void importLoyaltyCard(SQLiteDatabase database, CSVRecord record)
throws IOException, FormatException { throws FormatException {
int id = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ID, record, false); int id = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ID, record);
String store = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.STORE, record, ""); String store = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.STORE, record, "");
if (store.isEmpty()) { if (store.isEmpty()) {
@@ -286,19 +287,38 @@ public class CatimaImporter implements Importer {
} }
String note = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.NOTE, record, ""); String note = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.NOTE, record, "");
Date expiry = null;
Date validFrom = null;
Long validFromLong;
try { try {
expiry = new Date(CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.EXPIRY, record, true)); validFromLong = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.VALID_FROM, record);
} catch (NullPointerException | FormatException e) { } catch (FormatException ignored) {
validFromLong = null;
}
if (validFromLong != null) {
validFrom = new Date(validFromLong);
} }
BigDecimal balance; Date expiry = null;
Long expiryLong;
try { try {
balance = new BigDecimal(CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BALANCE, record, null)); expiryLong = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.EXPIRY, record);
} catch (FormatException _e) { } catch (FormatException ignored) {
// These fields did not exist in versions 1.8.1 and before expiryLong = null;
// We catch this exception so we can still import old backups }
balance = new BigDecimal("0"); if (expiryLong != null) {
expiry = new Date(expiryLong);
}
// These fields did not exist in versions 1.8.1 and before
// We default to 0 so we can still import old backups
BigDecimal balance = new BigDecimal("0");
String balanceString = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BALANCE, record, null);
if (balanceString != null) {
try {
balance = new BigDecimal(CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BALANCE, record, null));
} catch (NumberFormatException ignored) {
}
} }
Currency balanceType = null; Currency balanceType = null;
@@ -324,14 +344,14 @@ public class CatimaImporter implements Importer {
} }
Integer headerColor = null; Integer headerColor = null;
try {
if (record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_COLOR)) { headerColor = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record);
headerColor = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record, true); } catch (FormatException ignored) {
} }
int starStatus = 0; int starStatus = 0;
try { try {
starStatus = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.STAR_STATUS, record, false); starStatus = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.STAR_STATUS, record);
} catch (FormatException _e) { } catch (FormatException _e) {
// This field did not exist in versions 0.28 and before // This field did not exist in versions 0.28 and before
// We catch this exception so we can still import old backups // We catch this exception so we can still import old backups
@@ -340,7 +360,7 @@ public class CatimaImporter implements Importer {
int archiveStatus = 0; int archiveStatus = 0;
try { try {
archiveStatus = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS, record, false); archiveStatus = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS, record);
} catch (FormatException _e) { } catch (FormatException _e) {
// This field did not exist in versions 2.16.3 and before // This field did not exist in versions 2.16.3 and before
// We catch this exception so we can still import old backups // We catch this exception so we can still import old backups
@@ -349,13 +369,13 @@ public class CatimaImporter implements Importer {
Long lastUsed = 0L; Long lastUsed = 0L;
try { try {
lastUsed = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.LAST_USED, record, false); lastUsed = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.LAST_USED, record);
} catch (FormatException _e) { } catch (FormatException _e) {
// This field did not exist in versions 2.5.0 and before // This field did not exist in versions 2.5.0 and before
// We catch this exception so we can still import old backups // We catch this exception so we can still import old backups
} }
DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, archiveStatus); DBHelper.insertLoyaltyCard(database, id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, archiveStatus);
} }
/** /**
@@ -365,6 +385,10 @@ public class CatimaImporter implements Importer {
private void importGroup(SQLiteDatabase database, CSVRecord record) throws FormatException { private void importGroup(SQLiteDatabase database, CSVRecord record) throws FormatException {
String id = CSVHelpers.extractString(DBHelper.LoyaltyCardDbGroups.ID, record, null); String id = CSVHelpers.extractString(DBHelper.LoyaltyCardDbGroups.ID, record, null);
if (id == null) {
throw new FormatException("Group has no ID: " + record);
}
DBHelper.insertGroup(database, id); DBHelper.insertGroup(database, id);
} }
@@ -373,11 +397,15 @@ public class CatimaImporter implements Importer {
* session. * session.
*/ */
private void importCardGroupMapping(SQLiteDatabase database, CSVRecord record) throws FormatException { private void importCardGroupMapping(SQLiteDatabase database, CSVRecord record) throws FormatException {
Integer cardId = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIdsGroups.cardID, record, false); int cardId = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIdsGroups.cardID, record);
String groupId = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIdsGroups.groupID, record, null); String groupId = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIdsGroups.groupID, record, null);
if (groupId == null) {
throw new FormatException("Group has no ID: " + record);
}
List<Group> cardGroups = DBHelper.getLoyaltyCardGroups(database, cardId); List<Group> cardGroups = DBHelper.getLoyaltyCardGroups(database, cardId);
cardGroups.add(DBHelper.getGroup(database, groupId)); cardGroups.add(DBHelper.getGroup(database, groupId));
DBHelper.setLoyaltyCardGroups(database, cardId, cardGroups); DBHelper.setLoyaltyCardGroups(database, cardId, cardGroups);
} }
} }

View File

@@ -128,6 +128,6 @@ public class FidmeImporter implements Importer {
// TODO: Front and back image // TODO: Front and back image
DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, starStatus, null,archiveStatus); DBHelper.insertLoyaltyCard(database, store, note, null, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, starStatus, null,archiveStatus);
} }
} }

View File

@@ -74,29 +74,31 @@ public class StocardImporter implements Importer {
String fileName = localFileHeader.getFileName(); String fileName = localFileHeader.getFileName();
String[] nameParts = fileName.split("/"); String[] nameParts = fileName.split("/");
if (nameParts.length < 2) {
continue;
}
if (providersFileName == null) { if (providersFileName == null) {
providersFileName = new String[]{ providersFileName = new String[]{
nameParts[0], "extracts",
"sync", nameParts[1],
"data",
"users", "users",
nameParts[0], nameParts[1],
"analytics-properties.json" "analytics-properties",
"content.json"
}; };
customProvidersBaseName = new String[]{ customProvidersBaseName = new String[]{
nameParts[0], "extracts",
"sync", nameParts[1],
"data",
"users", "users",
nameParts[0], nameParts[1],
"loyalty-card-custom-providers" "loyalty-card-custom-providers"
}; };
cardBaseName = new String[]{ cardBaseName = new String[]{
nameParts[0], "extracts",
"sync", nameParts[1],
"data",
"users", "users",
nameParts[0], nameParts[1],
"loyalty-cards" "loyalty-cards"
}; };
} }
@@ -106,18 +108,15 @@ public class StocardImporter implements Importer {
customProviderId = nameParts[customProvidersBaseName.length].split("\\.", 2)[0]; customProviderId = nameParts[customProvidersBaseName.length].split("\\.", 2)[0];
// Name file // Name file
if (nameParts.length == customProvidersBaseName.length + 1) { if (fileName.endsWith(customProviderId + "/content.json")) {
// Ignore the .txt file JSONObject jsonObject = ZipUtils.readJSON(zipInputStream);
if (fileName.endsWith(".json")) {
JSONObject jsonObject = ZipUtils.readJSON(zipInputStream);
providers = appendToHashMap( providers = appendToHashMap(
providers, providers,
customProviderId, customProviderId,
"name", "name",
jsonObject.getString("name") jsonObject.getString("name")
); );
}
} else if (fileName.endsWith("logo.png")) { } else if (fileName.endsWith("logo.png")) {
providers = appendToHashMap( providers = appendToHashMap(
providers, providers,
@@ -133,46 +132,43 @@ public class StocardImporter implements Importer {
cardName = nameParts[cardBaseName.length].split("\\.", 2)[0]; cardName = nameParts[cardBaseName.length].split("\\.", 2)[0];
// This is the card itself // This is the card itself
if (nameParts.length == cardBaseName.length + 1) { if (fileName.endsWith(cardName + "/content.json")) {
// Ignore the .txt file JSONObject jsonObject = ZipUtils.readJSON(zipInputStream);
if (fileName.endsWith(".json")) {
JSONObject jsonObject = ZipUtils.readJSON(zipInputStream);
loyaltyCardHashMap = appendToHashMap( loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap, loyaltyCardHashMap,
cardName, cardName,
"cardId", "cardId",
jsonObject.getString("input_id") jsonObject.getString("input_id")
); );
// Provider ID can be either custom or not, extract whatever version is relevant // Provider ID can be either custom or not, extract whatever version is relevant
String customProviderPrefix = "/users/" + nameParts[0] + "/loyalty-card-custom-providers/"; String customProviderPrefix = "/users/" + nameParts[1] + "/loyalty-card-custom-providers/";
String providerId = jsonObject String providerId = jsonObject
.getJSONObject("input_provider_reference") .getJSONObject("input_provider_reference")
.getString("identifier"); .getString("identifier");
if (providerId.startsWith(customProviderPrefix)) { if (providerId.startsWith(customProviderPrefix)) {
providerId = providerId.substring(customProviderPrefix.length()); providerId = providerId.substring(customProviderPrefix.length());
} else { } else {
providerId = providerId.substring("/loyalty-card-providers/".length()); providerId = providerId.substring("/loyalty-card-providers/".length());
}
loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap,
cardName,
"_providerId",
providerId
);
if (jsonObject.has("input_barcode_format")) {
loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap,
cardName,
"barcodeType",
jsonObject.getString("input_barcode_format")
);
}
} }
} else if (fileName.endsWith("notes/default.json")) {
loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap,
cardName,
"_providerId",
providerId
);
if (jsonObject.has("input_barcode_format")) {
loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap,
cardName,
"barcodeType",
jsonObject.getString("input_barcode_format")
);
}
} else if (fileName.endsWith("notes/default/content.json")) {
loyaltyCardHashMap = appendToHashMap( loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap, loyaltyCardHashMap,
cardName, cardName,
@@ -234,7 +230,7 @@ public class StocardImporter implements Importer {
headerColor = Utils.getHeaderColorFromImage(cardIcon, headerColor); headerColor = Utils.getHeaderColorFromImage(cardIcon, headerColor);
} }
long loyaltyCardInternalId = DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, 0, null,0); long loyaltyCardInternalId = DBHelper.insertLoyaltyCard(database, store, note, null, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, 0, null,0);
if (cardIcon != null) { if (cardIcon != null) {
Utils.saveCardImage(context, cardIcon, (int) loyaltyCardInternalId, ImageLocationType.icon); Utils.saveCardImage(context, cardIcon, (int) loyaltyCardInternalId, ImageLocationType.icon);

View File

@@ -126,7 +126,7 @@ public class VoucherVaultImporter implements Importer {
throw new FormatException("Unknown colour type found: " + colorFromJSON); throw new FormatException("Unknown colour type found: " + colorFromJSON);
} }
DBHelper.insertLoyaltyCard(database, store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime(),0); DBHelper.insertLoyaltyCard(database, store, "", null, expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime(),0);
} }
bufferedReader.close(); bufferedReader.close();

View File

@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z" />
<path
android:fillColor="@android:color/white"
android:pathData="M18,15.782V22l4.886,-3.109z" />
<path
android:fillColor="@android:color/white"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12C2,17.52 6.47,22 11.99,22C13.417,22 14.772,21.699 16,21.162L16,18.928C14.823,19.608 13.458,20 12,20C7.58,20 4,16.42 4,12C4,7.58 7.58,4 12,4C16.42,4 20,7.58 20,12C20,13.061 19.791,14.073 19.416,15L21.541,15C21.839,14.053 22,13.045 22,12C22,6.48 17.52,2 11.99,2zM11,7L11,13L16,16L16,15L16.951,15L17,14.92L12.5,12.25L12.5,7L11,7z" />
</vector>

View File

@@ -311,6 +311,32 @@
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </LinearLayout>
<!-- Valid from -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
<!-- Valid from -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/validFromView"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:hint="@string/validFromDate"
android:labelFor="@+id/validFromField">
<AutoCompleteTextView
android:id="@+id/validFromField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<!-- Expiration --> <!-- Expiration -->
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -176,12 +176,31 @@
android:drawablePadding="4dp" android:drawablePadding="4dp"
android:visibility="gone" android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/info_divider" app:layout_constraintTop_toBottomOf="@+id/info_divider"
app:layout_constraintBottom_toTopOf="@+id/expiry" app:layout_constraintBottom_toTopOf="@+id/validFrom"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible" tools:visibility="visible"
tools:text="525 points"/> tools:text="525 points"/>
<TextView
android:id="@+id/validFrom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
android:textAppearance="?attr/textAppearanceBody2"
android:textColor="?android:attr/textColorSecondary"
app:drawableLeftCompat="@drawable/ic_valid_from_24dp"
android:drawablePadding="4dp"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/balance"
app:layout_constraintBottom_toTopOf="@+id/expiry"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible"
tools:text="Today"/>
<TextView <TextView
android:id="@+id/expiry" android:id="@+id/expiry"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -194,7 +213,7 @@
app:drawableLeftCompat="@drawable/ic_baseline_access_time_24" app:drawableLeftCompat="@drawable/ic_baseline_access_time_24"
android:drawablePadding="4dp" android:drawablePadding="4dp"
android:visibility="gone" android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/balance" app:layout_constraintTop_toBottomOf="@+id/validFrom"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View File

@@ -11,41 +11,48 @@ IllusiveMan196
StoyanDimitrov StoyanDimitrov
Altonss Altonss
SlavekB SlavekB
Michael Moroni
Gediminas Murauskas Gediminas Murauskas
Petr Novák Petr Novák
Michael Moroni
Joel A Joel A
Taco Taco
laralem
pfaffenrodt pfaffenrodt
Nyatsuki Nyatsuki
laralem gallegonovato
HudobniVolk
Samantaz Fox Samantaz Fox
arno-github arno-github
Ankit Tiwari Ankit Tiwari
Sergio Paredes Sergio Paredes
Aayush Gupta Aayush Gupta
gallegonovato
huuhaa huuhaa
arshbeerSingh
Freddo espresso
Quentin PAGÈS Quentin PAGÈS
Alexander Ivanov
arshbeerSingh
Denis Shilin
Freddo espresso
Silvério Santos
Miha Frangež Miha Frangež
Arnis Jaundzeikars Arnis Jaundžeikars
Kefir2105
sr093906 sr093906
Giovanni Donisi
mdvhimself mdvhimself
Katarzyna Katarzyna
Maciej Błędkowski echo r"0xX4H" | rev
Magnitudee Magnitudee
Olivia (Zoe) Olivia (Zoe)
Projjal Moitra
betsythefc betsythefc
Silvério Santos
waffshappen waffshappen
Robin Robin
Eric Eric
Alexander Ivanov
ati3 ati3
Giovanni (Cliff Heraldo)
Evgeniy Khramov
Jane Kong Jane Kong
Jiri Grönroos
K. Herbert K. Herbert
Lisa A. Lisa A.
Mawuena M. KODZO A. Mawuena M. KODZO A.
@@ -54,6 +61,7 @@ Still Hsu
String E. Fighter String E. Fighter
Tapu Tapu
Yurical Yurical
Eryk Michalak
rr-vesp rr-vesp
alajemba-vik alajemba-vik
/usr/local/ΕΨΗΕΛΩΝ /usr/local/ΕΨΗΕΛΩΝ
@@ -67,23 +75,27 @@ BootVirtual
Clonewayx Clonewayx
D. Domig D. Domig
Diego Diego
Evgeniy Khramov
Fede Pujol Fede Pujol
francescbassas
Jean-Luc Tibaux Jean-Luc Tibaux
Jesse Davids
Lukas Grassauer Lukas Grassauer
bittin
Marnick L'Eau Marnick L'Eau
Michalis Michalis
Michał Michał
Mohamed A. Salah Mohamed A. Salah
Neko Nekowazarashi the7thNightmare
Rishi Agarwal Rishi Agarwal
Rosdyana Kusuma Rosdyana Kusuma
umoenks umoenks
Simon Rusinov Simon Rusinov
Siriusmart
Mritunjay Mritunjay
Tarik Dzambic Tarik Dzambic
Thomas Bertels Thomas Bertels
Thomas Cruveilher Thomas Cruveilher
Tian Jiale
Tong Liu Tong Liu
Wanath Wanath
Runner Runner
@@ -91,22 +103,26 @@ ce i moa
inesre inesre
lgasp lgasp
phlostically phlostically
sal0max
Ágata Leuck Ágata Leuck
BmBKun BmBKun
Aditya Das Aditya Das
Asier
Kevin Sicong Jiang Kevin Sicong Jiang
Tomer Ben-Rachel Tomer Ben-Rachel
Tom Sawyer
tfuxu tfuxu
Ahmed Saleh Ahmed Saleh
Airat Airat
Alexander
sNiXx sNiXx
Angela Enogieru Angela Enogieru
AnimeshChatterjee1 AnimeshChatterjee1
Ashish Yadav Ashish Yadav
Asier
Aya Elsaadany Aya Elsaadany
Biren Biren
Booc Sylvan Booc Sylvan
Brage Nesteby Reitan
CherryMonster222 CherryMonster222
Colgrave Colgrave
Csaba Csaba
@@ -117,29 +133,36 @@ Donno
Flav Flav
Franciszek Stefan Franciszek Stefan
Grzegorz Grzegorz
gneiss15
Hamustra Scans
HowITsDone HowITsDone
Izzy Izzy
Jacek Jacek
Jacopo Gennaro Esposito Jacopo Gennaro Esposito
Jasielprogramador
Jean Mareilles Jean Mareilles
Jean-Baptiste Jean-Baptiste
人工知能 Kung-chih
Karvjorm
krkk krkk
Laura Ferraz Laura Ferraz
Lucas da Costa Lucas da Costa
bittin
Manan Jhaveri Manan Jhaveri
Marco Marco
Mario M. Viscovich BRBsoup
Mattia Mattia
Md. Al-Amin Md. Al-Amin
Michael Gangolf Michael Gangolf
3DN1M 3DN1M
Mobashir Raihan
Moi Toi Moi Toi
DivideEtImpera DivideEtImpera
Nicolas Nicolas
Nosnahc
pa4k
pbeckmann pbeckmann
Peer Beckmann Peer Beckmann
Piotr Strebski
Piotr Zet Piotr Zet
Quang Nguyen Quang Nguyen
Ratnesh Ratnesh
@@ -148,32 +171,41 @@ Rohan Babbar
Ronak Upadhyay Ronak Upadhyay
Rose Liverman Rose Liverman
SKULD SKULD
Salem Malus
Samarth Asthan Samarth Asthan
Shailendra Maurya
Simone Dotto Simone Dotto
Subhashish Anand Subhashish Anand
TenTraicion SziaTomi
Mehedi Hasan
Titas Pažereckas Titas Pažereckas
Tom Sawyer atakujonc
Tony C Tony C
Tymofii Lytvynenko Tymofii Lytvynenko
Vancha March Vancha March
Yevgeny M Yevgeny M
Yusril A Yusril A
ahmed-awad26
Avik Kundu Avik Kundu
diksha-2911 diksha-2911
gbonaspetti gbonaspetti
gittyboy-cell
huang ivan huang ivan
lucafont2
mtrmirez mtrmirez
opsik opsik
polarhun polarhun
pooyanazari pooyanazari
psa-jforestier psa-jforestier
sergio sergio
080502
Marcus Marcus
techwebpd techwebpd
Truestorybaby Truestorybaby
tygyh tygyh
unstartdev unstartdev
wmilan 17
يوسف لطفي
luoyang3 luoyang3
JaeBeom An JaeBeom An
JungHee Lee JungHee Lee

View File

@@ -2,6 +2,18 @@
stocard_stores.csv was created by extracting /data/data/de.stocard/de.stocard.stocard/databases/stores on a rooted devices and running the following command over it: stocard_stores.csv was created by extracting /data/data/de.stocard/de.stocard.stocard/databases/stores on a rooted devices and running the following command over it:
sqlite3 -header -csv stores "select _id,name,barcodeFormat from stores" > stocard_stores.csv ```
sqlite3 -header -csv sync_db "select id,content from synced_resources where collection = '/loyalty-card-providers/'" > stocard_providers.csv
while IFS= read -r line; do
if [ "$line" = "id,content" ]; then
echo "_id,name,barcodeFormat" > stocard_stores.csv
else
id="$(echo "$line" | cut -d ',' -f1)"
name="$(echo "$line" | cut -d ',' -f2- | sed 's/""/"/g' | sed 's/^"//g' | sed 's/"$//g' | jq -r .name)"
barcodeFormat="$(echo "$line" | cut -d ',' -f2- | sed 's/""/"/g' | sed 's/^"//g' | sed 's/"$//g' | jq -r .default_barcode_format)"
echo "$id,\"$name\",$barcodeFormat" >> stocard_stores.csv
fi
done < stocard_providers.csv
```
Only used for data portability reasons (ensuring importing works). Do NOT copy this anywhere else or use it for any purpose other than ensuring we can import a GDPR-provided export. We want to make sure this stays under fair use. Only used for data portability reasons (ensuring importing works). Do NOT copy this anywhere else or use it for any purpose other than ensuring we can import a GDPR-provided export. We want to make sure this stays under fair use.

View File

File diff suppressed because it is too large Load Diff

View File

@@ -93,7 +93,7 @@
<string name="importFidme">الاستيراد من FidMe</string> <string name="importFidme">الاستيراد من FidMe</string>
<string name="importFidmeMessage">حدد ملفك <i>fidme-export-request-xxxxxx.zip</i> تصدير من FidMe للاستيراد ، ثم حدد أنواع الباركود يدويًا بعد ذلك. <string name="importFidmeMessage">حدد ملفك <i>fidme-export-request-xxxxxx.zip</i> تصدير من FidMe للاستيراد ، ثم حدد أنواع الباركود يدويًا بعد ذلك.
\nقم بإنشائه من ملف تعريف FidMe الخاص بك عن طريق اختيار حماية البيانات ثم الضغط على استخراج بياناتي أولاً.</string> \nقم بإنشائه من ملف تعريف FidMe الخاص بك عن طريق اختيار حماية البيانات ثم الضغط على استخراج بياناتي أولاً.</string>
<string name="importStocardMessage">حدد ملفك <i>***-sync.zip</i> تصدير من Stocard للاستيراد. <string name="importStocardMessage">حدد ملفك <i>***.zip</i> تصدير من Stocard للاستيراد.
\nاحصل عليه عن طريق إرسال بريد إلكتروني إلى support@stocardapp.com لطلب تصدير بياناتك.</string> \nاحصل عليه عن طريق إرسال بريد إلكتروني إلى support@stocardapp.com لطلب تصدير بياناتك.</string>
<string name="importVoucherVault">الاستيراد من Voucher Vault</string> <string name="importVoucherVault">الاستيراد من Voucher Vault</string>
<string name="importVoucherVaultMessage">حدد ملفك <i>vouchervault.json</i> تصدير من Voucher Vault للاستيراد. <string name="importVoucherVaultMessage">حدد ملفك <i>vouchervault.json</i> تصدير من Voucher Vault للاستيراد.
@@ -290,4 +290,6 @@
<string name="noCameraPermissionDirectToSystemSetting">لمسح الباركود، ستحتاج Catima إلى الوصول إلى الكاميرا. اضغط هنا لتغيير إعدادات الأذونات.</string> <string name="noCameraPermissionDirectToSystemSetting">لمسح الباركود، ستحتاج Catima إلى الوصول إلى الكاميرا. اضغط هنا لتغيير إعدادات الأذونات.</string>
<string name="updateBalance">تحديث الرصيد</string> <string name="updateBalance">تحديث الرصيد</string>
<string name="updateBalanceHint">أدخل المبلغ</string> <string name="updateBalanceHint">أدخل المبلغ</string>
<string name="storageReadPermissionRequired">الصلاحيه للوصل للتخزين مطلوبة لهذا الاجراء</string>
<string name="validFromDate">عربيه</string>
</resources> </resources>

View File

@@ -71,13 +71,13 @@
<string name="moveBarcodeToCenterOfScreen">Премества щрихкода в центъра на екрана</string> <string name="moveBarcodeToCenterOfScreen">Премества щрихкода в центъра на екрана</string>
<string name="moveBarcodeToTopOfScreen">Премества щрихкода най-горе на екрана</string> <string name="moveBarcodeToTopOfScreen">Премества щрихкода най-горе на екрана</string>
<string name="never">Не изтича</string> <string name="never">Не изтича</string>
<string name="chooseExpiryDate">Дата на изтичане</string> <string name="chooseExpiryDate">Определена дата</string>
<string name="expiryDate">Валидност</string> <string name="expiryDate">Валидна до</string>
<string name="editBarcode">Редактиране на щрихкод</string> <string name="editBarcode">Редактиране на щрихкод</string>
<string name="barcode">Щрихкод</string> <string name="barcode">Щрихкод</string>
<string name="card">Карта</string> <string name="card">Карта</string>
<string name="groupsList">Списъци: <xliff:g>%s</xliff:g></string> <string name="groupsList">Списъци: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Валидност: <xliff:g>%s</xliff:g></string> <string name="expiryStateSentence">Валидна до: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Изтекла: <xliff:g>%s</xliff:g></string> <string name="expiryStateSentenceExpired">Изтекла: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">Наличност: <xliff:g>%s</xliff:g></string> <string name="balanceSentence">Наличност: <xliff:g>%s</xliff:g></string>
<string name="noGroups">Докоснете бутона +, за да добавите списък.</string> <string name="noGroups">Докоснете бутона +, за да добавите списък.</string>
@@ -152,7 +152,7 @@
<string name="importVoucherVault">Внасяне от Voucher Vault</string> <string name="importVoucherVault">Внасяне от Voucher Vault</string>
<string name="importVoucherVaultMessage">Изберете файла <i>vouchervault.json</i>, предварително изнесен от Voucher Vault. <string name="importVoucherVaultMessage">Изберете файла <i>vouchervault.json</i>, предварително изнесен от Voucher Vault.
\nСъздайте такъв файл от меню „Export“ във Voucher Vault.</string> \nСъздайте такъв файл от меню „Export“ във Voucher Vault.</string>
<string name="importStocardMessage">Изберете файла <i>***-sync.zip</i>, предварително изнесен от Stocard. <string name="importStocardMessage">Изберете файла <i>***.zip</i>, предварително изнесен от Stocard.
\nПолучете го като изпратите писмо на support@stocardapp.com с искане за изнасяне вашите данни.</string> \nПолучете го като изпратите писмо на support@stocardapp.com с искане за изнасяне вашите данни.</string>
<string name="importLoyaltyCardKeychainMessage">Изберете файла <i>LoyaltyCardKeychain.csv</i>, предварително изнесен от Loyalty Card Keychain. <string name="importLoyaltyCardKeychainMessage">Изберете файла <i>LoyaltyCardKeychain.csv</i>, предварително изнесен от Loyalty Card Keychain.
\nСъздайте такъв файл от меню Внасяне/изнасяне от друго устройство с Loyalty Card Keychain като изберете Изнасяне.</string> \nСъздайте такъв файл от меню Внасяне/изнасяне от друго устройство с Loyalty Card Keychain като изберете Изнасяне.</string>
@@ -264,4 +264,8 @@
<string name="importCards">Внасяне на карти</string> <string name="importCards">Внасяне на карти</string>
<string name="storageReadPermissionRequired">За това действие е необходимо разрешение за четене на хранилището…</string> <string name="storageReadPermissionRequired">За това действие е необходимо разрешение за четене на хранилището…</string>
<string name="cameraPermissionRequired">За това действие е необходимо разрешение за достъп до камерата…</string> <string name="cameraPermissionRequired">За това действие е необходимо разрешение за достъп до камерата…</string>
<string name="validFromDate">Валидна от</string>
<string name="anyDate">Без значение от датата</string>
<string name="validFromSentence">Валидна от: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">Определена дата</string>
</resources> </resources>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="save">সংরক্ষণ</string> <string name="save">সংরক্ষণ</string>
<string name="cancel">বাতিল</string> <string name="cancel">বাতিল</string>
<string name="unstar">তারা মুক্ত</string> <string name="unstar">তারা মুক্ত</string>
@@ -8,18 +8,18 @@
<string name="barcodeType">বারকোড ধরন</string> <string name="barcodeType">বারকোড ধরন</string>
<string name="note">বিঃদ্রঃ</string> <string name="note">বিঃদ্রঃ</string>
<string name="storeName">দোকানের নাম</string> <string name="storeName">দোকানের নাম</string>
<string name="noMatchingGiftCards">কোন ম্যাচিং উপহার কার্ড নেই</string> <string name="noMatchingGiftCards">কোনো ফলাফল পাওয়া যায়নি। অনুসন্ধানের বাক্যটি বদলে দেখুন।</string>
<string name="noGiftCards">উপহার কার্ড নেই</string> <string name="noGiftCards">প্লাস বোতামটি টিপে একটি কার্ড যোগ করুন বা ⋮ মেনু থেকে কিছু নিয়ে আসুন।</string>
<string name="action_add">কর্ম যোগ</string> <string name="action_add">কর্ম যোগ</string>
<string name="all">সব</string> <string name="all">সব</string>
<string name="noGroupCards">গোষ্ঠী কার্ড নেই</string> <string name="noGroupCards">এই গ্রুপটি খালি</string>
<string name="noGroups">গোষ্ঠীগুলি নেই</string> <string name="noGroups">+ যোগ বোতামটি টিপে গ্রুপ যোগ করুন যাতে তাদের শ্রেণীকরণ করা যায়।</string>
<string name="groups">গোষ্ঠীগুলি</string> <string name="groups">গোষ্ঠীগুলি</string>
<string name="enter_group_name">গোষ্ঠী নাম লিখুন </string> <string name="enter_group_name">গোষ্ঠী নাম লিখুন </string>
<string name="exportSuccessful">রপ্তানি সফল</string> <string name="exportSuccessful">তথ্য রপ্তানি করা শেষ</string>
<string name="importSuccessful">আগম সফল</string> <string name="importSuccessful">তথ্য আনা শেষ</string>
<string name="intent_import_card_from_url_share_text">url শেয়ার টেক্সট থেকে ইন্টেন্ট ইম্পোর্ট কার্ড</string> <string name="intent_import_card_from_url_share_text">url শেয়ার টেক্সট থেকে ইন্টেন্ট ইম্পোর্ট কার্ড</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_keep_screen_on">সেটিংস পর্দা খোলা রাখুন</string>
<string name="settings_max_font_size_scale">সর্বোচ্চ হরফ আকার</string> <string name="settings_max_font_size_scale">সর্বোচ্চ হরফ আকার</string>
<string name="settings_light_theme">সাদাটে থিম</string> <string name="settings_light_theme">সাদাটে থিম</string>
@@ -32,11 +32,11 @@
<string name="importStocard">স্টো কার্ড আমদানি করুন</string> <string name="importStocard">স্টো কার্ড আমদানি করুন</string>
<string name="importVoucherVault">আমদানি ভাউচার ভল্ট</string> <string name="importVoucherVault">আমদানি ভাউচার ভল্ট</string>
<string name="barcodeId">বারকোড আইডি</string> <string name="barcodeId">বারকোড আইডি</string>
<string name="sameAsCardId">কার্ড আইডির মতো</string> <string name="sameAsCardId">আইডি আর এটা এক</string>
<string name="setBarcodeId">বারকোড আইডি সেট করুন</string> <string name="setBarcodeId">বারকোড আইডি সেট করুন</string>
<string name="unsupportedBarcodeType">অসমর্থিত বারকোড টাইপ</string> <string name="unsupportedBarcodeType">এই বারকোডের টাইপটি এখন দেখানো যাচ্ছে না। অ্যাপের পরের সংস্করণে হয়ত এটি সমর্থন করা যেতে পারে।</string>
<string name="wrongValueForBarcodeType">বারকোড টাইপের জন্য ভুল মান</string> <string name="wrongValueForBarcodeType">বারকোড টাইপের জন্য ভুল মান</string>
<string name="copy_to_clipboard_multiple_toast">ক্লিপবোর্ড একাধিক টোস্টে অনুলিপি করুন</string> <string name="copy_to_clipboard_multiple_toast">আইডিগুলি ক্লিপবোর্ডে কপি হল</string>
<string name="intent_import_card_from_url_share_multiple_text">url থেকে ইন্টেন্ট ইম্পোর্ট কার্ড একাধিক টেক্সট শেয়ার করে</string> <string name="intent_import_card_from_url_share_multiple_text">url থেকে ইন্টেন্ট ইম্পোর্ট কার্ড একাধিক টেক্সট শেয়ার করে</string>
<string name="frontImageDescription">সামনের চিত্র</string> <string name="frontImageDescription">সামনের চিত্র</string>
<string name="backImageDescription">পিছনের চিত্র</string> <string name="backImageDescription">পিছনের চিত্র</string>
@@ -45,12 +45,12 @@
<string name="setBackImage">পিছনের ছবি স্থাপন</string> <string name="setBackImage">পিছনের ছবি স্থাপন</string>
<string name="removeImage">ছবি অপসারণ</string> <string name="removeImage">ছবি অপসারণ</string>
<string name="takePhoto">ছবি নেত্তয়া</string> <string name="takePhoto">ছবি নেত্তয়া</string>
<string name="updateBarcodeQuestionTitle">হালনাগাদ বারকোড প্রশ্ন শিরোনাম</string> <string name="updateBarcodeQuestionTitle">বারকোডের মানটি আপডেট করবেন\?</string>
<string name="updateBarcodeQuestionText">হালনাগাদ বারকোড প্রশ্ন টেক্সট </string> <string name="updateBarcodeQuestionText">আপনি আইডিটি পাল্টেছেন, এটির কোনো বারকোড দিয়ে কি এখনের বারকোডটি আপডেট করে দেবেন\?</string>
<string name="yes">হাঁ</string> <string name="yes">হাঁ</string>
<string name="no">না</string> <string name="no">না</string>
<string name="passwordRequired">পাসওয়ার্ড প্রয়োজন</string> <string name="passwordRequired">পাসওয়ার্ড প্রয়োজন</string>
<string name="failedGeneratingShareURL">শেয়ার ইউআরএল তৈরি করতে ব্যর্থ হয়েছে</string> <string name="failedGeneratingShareURL">শেয়ার করার ইউআরএল তৈরি করা গেল না। অনুগ্রহ করে এটিকে রিপোর্ট করে দিন।</string>
<string name="turn_flashlight_on">টর্চলাইট চালু করুন</string> <string name="turn_flashlight_on">টর্চলাইট চালু করুন</string>
<string name="turn_flashlight_off">টর্চলাইট বন্ধ করুন</string> <string name="turn_flashlight_off">টর্চলাইট বন্ধ করুন</string>
<string name="settings_locale">লোকেল</string> <string name="settings_locale">লোকেল</string>
@@ -65,11 +65,11 @@
<string name="settings_green_theme">সবুজ থিম</string> <string name="settings_green_theme">সবুজ থিম</string>
<string name="settings_brown_theme">বাদামী থিম</string> <string name="settings_brown_theme">বাদামী থিম</string>
<string name="sort">সাজান</string> <string name="sort">সাজান</string>
<string name="swipeToSwitchImages">ছবি পরিবর্তন করতে সোয়াইপ করুন</string> <string name="swipeToSwitchImages">ছবি পাল্টানোর জন্য সোয়াইপ করুন, ছবিটি গ্যালারি অ্যাপে খোলার জন্য টিপে ধড়ে থাকুন</string>
<string name="sort_by_name">নামের দ্বারা সাজান</string> <string name="sort_by_name">নামের দ্বারা সাজান</string>
<string name="sort_by_most_recently_used">সর্বাধিক সম্প্রতি ব্যবহৃত দ্বারা সাজান</string> <string name="sort_by_most_recently_used">সর্বাধিক সম্প্রতি ব্যবহৃত দ্বারা সাজান</string>
<string name="sort_by_expiry">মেয়াদ শেষ করে সাজান</string> <string name="sort_by_expiry">মেয়াদ শেষ করে সাজান</string>
<string name="reverse">বিপরীত</string> <string name="reverse">...উল্টো ক্রমে</string>
<string name="sort_by">ক্রমানুসার</string> <string name="sort_by">ক্রমানুসার</string>
<string name="noCardExistsError">কার্ডটি পাওয়া যায়নি</string> <string name="noCardExistsError">কার্ডটি পাওয়া যায়নি</string>
<string name="noStoreError">স্টোরেজ ত্রুটি নেই</string> <string name="noStoreError">স্টোরেজ ত্রুটি নেই</string>
@@ -80,7 +80,7 @@
<string name="sendLabel">পাঠান…</string> <string name="sendLabel">পাঠান…</string>
<string name="share">ভাগ</string> <string name="share">ভাগ</string>
<string name="copy_to_clipboard">নকল করুন ক্লিপবোর্ড এ</string> <string name="copy_to_clipboard">নকল করুন ক্লিপবোর্ড এ</string>
<string name="deleteConfirmation">নিশ্চিতকরণ মুছে দিন</string> <string name="deleteConfirmation">এই কার্ডটি চিরকালের জন্য মুছে দেবো\?</string>
<string name="confirm">নিশ্চিত করুন</string> <string name="confirm">নিশ্চিত করুন</string>
<string name="delete">মুছে ফেলুন</string> <string name="delete">মুছে ফেলুন</string>
<string name="edit">সম্পাদনা</string> <string name="edit">সম্পাদনা</string>
@@ -92,13 +92,109 @@
<string name="deleteTitle">কার্ড ডিলিট করুন</string> <string name="deleteTitle">কার্ড ডিলিট করুন</string>
<string name="ok">ঠিক আছে</string> <string name="ok">ঠিক আছে</string>
<string name="about">সম্পর্কিত</string> <string name="about">সম্পর্কিত</string>
<string name="debug_version_fmt">সংস্করণ: <string name="debug_version_fmt">সংস্করণ: <xliff:g id="version">%s</xliff:g></string>
\n<xliff:g id="version">
\n%s</xliff:g></string>
<string name="importOptionApplicationButton">অন্য অ্যাপ ব্যাবহার করুন</string> <string name="importOptionApplicationButton">অন্য অ্যাপ ব্যাবহার করুন</string>
<string name="moveUp">উপরে উঠান</string> <string name="moveUp">উপরে উঠান</string>
<string name="moveDown">নিচে নামান</string> <string name="moveDown">নিচে নামান</string>
<string name="barcode">বারকোড</string> <string name="barcode">বারকোড</string>
<string name="expiryDate">মেয়াদোত্তীর্ণ তারিখ</string> <string name="expiryDate">মেয়াদোত্তীর্ণ তারিখ</string>
<string name="noBarcodeFound">কোনো বারকোড পাওয়া যায়নি</string> <string name="noBarcodeFound">কোনো বারকোড পাওয়া যায়নি</string>
<string name="cameraPermissionRequired">এই কাজটির জন্য ক্যামেরা ব্যবহার করার অনুমতি লাগবে…</string>
<string name="noCameraPermissionDirectToSystemSetting">বারকোড স্ক্যান করার জন্য, কাটিমাকে ফোনের ক্যামেরা ব্যবহার করার অনুমতি দিতে হবে। এইখানে টাচ করে আপনার অনুমতি সেটিংস পালটে নিন।</string>
<string name="importOptionApplicationExplanation">আপনার প্রিয় ফাইল ম্যানেজার বা আর যেকোনো অ্যাপ দিয়ে একটি ফাইল খুলুন।</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">মেধাস্বত্ব © ২০১৯-<xliff:g>%d</xliff:g> সিলভিয়া ভান অস</string>
<string name="app_license">কপিলেফ্ট করা মুক্ত সফটওয়্যার, জিপিএলের ৩য় এবং তার অধিক সংস্করণে লাইসেন্স করা</string>
<string name="enterBarcodeInstructions">আইডিটি লিখুন আর নয় নিচ থেকে একটি বারকোডের প্রকার বা \"কোনো বারকোড নেই\", নির্বাচন করুন।</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">এই <xliff:g>%d</xliff:g>টি কার্ড কি চিরকালের জন্য মুছে দেবো\?</item>
<item quantity="other">এই <xliff:g>%d</xliff:g>টি কার্ড কি চিরকালের জন্য মুছে দেবো\?</item>
</plurals>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> একটি নির্বাচিত</item>
<item quantity="other"><xliff:g>%d</xliff:g> টি নির্বাচিত</item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="one"><xliff:g>%d</xliff:g>টি কার্ড মুছে ফেলুন</item>
<item quantity="other"><xliff:g>%d</xliff:g>টি কার্ড মুছে ফেলুন</item>
</plurals>
<string name="cameraPermissionDeniedTitle">ফোনের ক্যামেরা ব্যবহার করা যাচ্ছে না</string>
<string name="importOptionFilesystemExplanation">ফোনের স্টোরেজ থেকে নির্দিষ্ট একটি ফাইল আনুন।</string>
<string name="app_libraries">মুক্ত লাইব্রেরি যেগুলি আমার নয়: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g>টির ব্যাপারে</string>
<string name="app_revision_fmt">সংশোধন তথ্য: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_resources">মুক্ত সম্পদ যেগুলি আমার নয়: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="thumbnailDescription">থাম্বনেইল</string>
<string name="settings_card_orientation">বারকোড অভিমুখ</string>
<string name="settings_follow_system_orientation">সিস্টেমের অনুসারে</string>
<string name="settings_portrait_orientation">প্রতিকৃতি</string>
<string name="barcodeImageDescriptionWithType">ছবি <xliff:g>%s</xliff:g> বারকোড</string>
<string name="exportName">রপ্তানি</string>
<string name="failedParsingImportUriError">আমদানির ইউআরআই বোঝা যাচ্ছে না</string>
<string name="importExport">আমদানি/রপ্তানি</string>
<string name="cardShortcut">কার্ড শর্টকাট</string>
<string name="exportFailed">বার করা যাচ্ছে না</string>
<string name="copy_to_clipboard_toast">আইডি ক্লিপবোর্ডে নকল করা হল</string>
<string name="noCardIdError">কোনো আইডি দওয়া হয়নি</string>
<string name="importExportHelp">নিজের তথ্য অন্য কোথাও সংরক্ষণ করে রাখলে পরে সেটা অন্য ফোনে আবার নিয়ে নাওয়া যাই।</string>
<string name="importFailed">আনা যাচ্ছে না</string>
<string name="noGiftCardsGroup">কিছু কার্ড বানান আর এই গ্রুপে স্থির করুন।</string>
<string name="scanCardBarcode">বারকোড স্ক্যান করুন</string>
<string name="importSuccessfulTitle">আনা শেষ</string>
<string name="importFailedTitle">আনা ব্যর্থ</string>
<string name="exportSuccessfulTitle">বার করা শেষ</string>
<string name="exportFailedTitle">বার করা ব্যর্থ</string>
<string name="importing">আনা হচ্ছে…</string>
<string name="exporting">বার করা হচ্ছে…</string>
<string name="storageReadPermissionRequired">এই কাজটির জন্য ফোনের স্টোরেজ দেখার অনুমতি লাগবে…</string>
<string name="exportOptionExplanation">তথ্যটি আপনার পছন্দের জায়গায় রাখা হবে।</string>
<string name="importOptionFilesystemTitle">ফোনের স্টোরেজ থেকে আনুন</string>
<string name="importOptionFilesystemButton">ফোনের স্টোরেজ থেকে</string>
<string name="importOptionApplicationTitle">অন্য অ্যাপ ব্যবহার করুন</string>
<string name="app_copyright_old">লয়ালটি কার্ড কিচ্যেনের উপর ভিত্তি করে
\nমেধাস্বত্ব © ২০১৬-২০২০ ব্রানডেন আর্চার</string>
<string name="selectBarcodeTitle">বারকোড নির্বাচন করুন</string>
<string name="settings">সেটিংস</string>
<string name="settings_dark_theme">অন্ধকার</string>
<string name="settings_landscape_orientation">অনুভূমিক</string>
<string name="settings_lock_on_opening_orientation">কার্ড খোলার সময় যে অভিমুখ থাকে সেটিতে লক করে দেবেন</string>
<string name="group_name_already_in_use">গ্রুপটির নাম আগে একবার ব্যবহার করে ফেলেছেন</string>
<string name="group_edit">গ্রুপ সম্পাদনা করুন</string>
<string name="group_updated">গ্রুপটি আপডেট করা হল</string>
<string name="group_name_is_empty">গ্রুপের একটি নাম থাকতে হবে</string>
<string name="deleteConfirmationGroup">গ্রুপটি মুছে দেবেন\?</string>
<string name="failedOpeningFileManager">প্রথমে একটি ফাইল ম্যানেজার ইনস্টল করুন।</string>
<string name="leaveWithoutSaveConfirmation">সংরক্ষণ না করেই চলে যাবেন\?</string>
<string name="addManually">নিজে হাতে আইডি লিখুন</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g>টি কার্ড</item>
<item quantity="other"><xliff:g>%d</xliff:g>টি কার্ড</item>
</plurals>
<string name="leaveWithoutSaveTitle">প্রস্থান</string>
<string name="settings_display_barcode_max_brightness">বারকোড উজ্জ্বল করুন</string>
<string name="editGroup">যেই গ্রুপ সম্পাদনা করা হচ্ছে: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">মেয়াদ শেষ হয়ে গিয়েছে: <xliff:g>%s</xliff:g></string>
<string name="editBarcode">বারকোড সম্পাদন করুন</string>
<string name="never">কখনই না</string>
<string name="addFromImage">গ্যালারি থেকে ছবি বাছুন</string>
<string name="groupsList">গ্রুপগুলি: <xliff:g>%s</xliff:g></string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> পয়েন্ট</item>
<item quantity="other"><xliff:g>%s</xliff:g> পয়েন্ট</item>
</plurals>
<string name="expiryStateSentence">মেয়াদ শেষ হবে: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">ব্যালেন্স: <xliff:g>%s</xliff:g></string>
<string name="chooseExpiryDate">মেয়াদ শেষ হওয়ার তারিখ মনোনীত করুন</string>
<string name="moveBarcodeToTopOfScreen">বারকোডটি স্ক্রিনের উপরে উঠিয়ে দিন</string>
<string name="moveBarcodeToCenterOfScreen">বারকোডটি স্ক্রিনের কেন্দ্রে সরিয়ে দিন</string>
<string name="errorReadingImage">ছবিটি স্ক্যান করা যাচ্ছে না</string>
<string name="privacy_policy_popup_text">ব্যক্তিগত তথ্যের গোপনীয়তা নীতি নোটিশ (কিছু অ্যাপ স্টোরের এটি লাগে):
\n
\nকোন তথ্য একেবারেই সংগ্রহ করা হয় না, যা যে কেউ নিশ্চিত করতে পারবেন কারন আমাদের অ্যাপ মুক্ত সফটওয়্যার।</string>
<string name="balance">ব্যালান্স</string>
<string name="points">পয়েন্ট</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> কোনো বৈধ ব্যালান্স মনে হচ্ছে না।</string>
<string name="chooseImportType">এখান থেকে তথ্য আমদানি করুন</string>
<string name="app_loyalty_card_keychain">আনুগত্য কার্ড কীচেন</string>
<string name="privacy_policy">ব্যক্তিগত তথ্যের গোপনীয়তা নীতি</string>
<string name="accept">গ্রহণ</string>
</resources> </resources>

View File

@@ -52,4 +52,5 @@
<item quantity="other"><xliff:g>%d</xliff:g> কার্ডগুলো মুছুন</item> <item quantity="other"><xliff:g>%d</xliff:g> কার্ডগুলো মুছুন</item>
</plurals> </plurals>
<string name="deleteTitle">কার্ড মুছুন</string> <string name="deleteTitle">কার্ড মুছুন</string>
</resources> <string name="noGiftCards">একটি কার্ড যোগ করতে + প্লাস বোতামে ক্লিক করুন বা ⋮ মেনু থেকে আমদানি করুন।</string>
</resources>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="groups">Grups</string>
<string name="action_add">Afegeix</string>
<string name="save">Desa</string>
<string name="edit">Edita</string>
<string name="delete">Elimina</string>
<string name="confirm">Confirma</string>
<string name="ok">D\'acord</string>
<string name="importExport">Importa/Exporta</string>
<string name="exportName">Exporta</string>
<string name="action_search">Cerca</string>
<string name="deleteTitle">Elimina la targeta</string>
<string name="welcome">Benvingut a Catima</string>
<string name="noGiftCards">Cliqueu el botó + més per afegir una targeta, o importeu-ne des del ⋮ menú.</string>
</resources>

View File

@@ -135,7 +135,7 @@
<string name="importVoucherVaultMessage">Vyberte k importu svůj <i>vouchervault.json</i> exportovaný z Voucher Vault. <string name="importVoucherVaultMessage">Vyberte k importu svůj <i>vouchervault.json</i> exportovaný z Voucher Vault.
\nVytvoříte jej tak, že nejprve stisknete tlačítko Exportovat v aplikaci Voucher Vault.</string> \nVytvoříte jej tak, že nejprve stisknete tlačítko Exportovat v aplikaci Voucher Vault.</string>
<string name="importVoucherVault">Import z Voucher Vault</string> <string name="importVoucherVault">Import z Voucher Vault</string>
<string name="importStocardMessage">Vyberte k importu svůj <i>***-sync.zip</i> exportovaný z aplikace Stocard. <string name="importStocardMessage">Vyberte k importu svůj <i>***.zip</i> exportovaný z aplikace Stocard.
\nZískejte ji zasláním e-mailu na adresu support@stocardapp.com s žádostí o export vašich dat.</string> \nZískejte ji zasláním e-mailu na adresu support@stocardapp.com s žádostí o export vašich dat.</string>
<string name="importStocard">Import ze Stocard</string> <string name="importStocard">Import ze Stocard</string>
<string name="importLoyaltyCardKeychainMessage">Vyberte k importu <i>LoyaltyCardKeychain.csv</i> exportovaný z Loyalty Card Keychain. <string name="importLoyaltyCardKeychainMessage">Vyberte k importu <i>LoyaltyCardKeychain.csv</i> exportovaný z Loyalty Card Keychain.
@@ -271,4 +271,8 @@
<string name="newBalanceSentence">Nový zůstatek: <xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">Nový zůstatek: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">Pro tuto akci je potřeba oprávnění ke čtení úložiště…</string> <string name="storageReadPermissionRequired">Pro tuto akci je potřeba oprávnění ke čtení úložiště…</string>
<string name="cameraPermissionRequired">Pro tuto akci je potřeba oprávnění k přístupu k fotoaparátu…</string> <string name="cameraPermissionRequired">Pro tuto akci je potřeba oprávnění k přístupu k fotoaparátu…</string>
<string name="validFromDate">Platnost od</string>
<string name="anyDate">Jakékoliv datum</string>
<string name="chooseValidFromDate">Vyberte datum počátku platnosti</string>
<string name="validFromSentence">Platnost od: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -52,7 +52,7 @@
<string name="thumbnailDescription">Vorschaubild</string> <string name="thumbnailDescription">Vorschaubild</string>
<string name="settings">Einstellungen</string> <string name="settings">Einstellungen</string>
<string name="settings_category_title_ui">Benutzeroberfläche</string> <string name="settings_category_title_ui">Benutzeroberfläche</string>
<string name="settings_display_barcode_max_brightness">Barcodeansicht aufhellen</string> <string name="settings_display_barcode_max_brightness">Displayhelligkeit in der Barcodeansicht erhöhen</string>
<string name="exportSuccessful">Daten exportiert</string> <string name="exportSuccessful">Daten exportiert</string>
<string name="importSuccessful">Daten importiert</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="intent_import_card_from_url_share_text">Ich würde gerne diese Karte mit dir teilen</string>
@@ -105,7 +105,7 @@
<string name="expiryStateSentenceExpired">Abgelaufen: <xliff:g>%s</xliff:g></string> <string name="expiryStateSentenceExpired">Abgelaufen: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Läuft ab: <xliff:g>%s</xliff:g></string> <string name="expiryStateSentence">Läuft ab: <xliff:g>%s</xliff:g></string>
<string name="settings_disable_lockscreen_while_viewing_card">Sperrbildschirm verhindern</string> <string name="settings_disable_lockscreen_while_viewing_card">Sperrbildschirm verhindern</string>
<string name="settings_keep_screen_on">Bildschirm aktiv halten</string> <string name="settings_keep_screen_on">Bildschirm aktiv lassen</string>
<string name="privacy_policy_popup_text">Hinweis zum Datenschutz (oft gefordert): <string name="privacy_policy_popup_text">Hinweis zum Datenschutz (oft gefordert):
\n \n
\nKEINE DATEN WERDEN GESAMMELT, was jeder bestätigen kann, da unsere Anwendung eine freie Software ist.</string> \nKEINE DATEN WERDEN GESAMMELT, was jeder bestätigen kann, da unsere Anwendung eine freie Software ist.</string>
@@ -150,7 +150,7 @@
<string name="frontImageDescription">Bild auf der Vorseite</string> <string name="frontImageDescription">Bild auf der Vorseite</string>
<string name="backImageDescription">Bild auf der Rückseite</string> <string name="backImageDescription">Bild auf der Rückseite</string>
<string name="passwordRequired">Bitte gib das Passwort ein</string> <string name="passwordRequired">Bitte gib das Passwort ein</string>
<string name="importStocardMessage">Wähle deinen <i>***-sync.zip</i>-Export aus Stocard zum Importieren aus. <string name="importStocardMessage">Wähle deinen <i>***.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> \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="importStocard">Von Stocard importieren</string>
<string name="turn_flashlight_off">Licht ausschalten</string> <string name="turn_flashlight_off">Licht ausschalten</string>
@@ -225,7 +225,7 @@
<item quantity="one"><xliff:g>%s</xliff:g> Punkt</item> <item quantity="one"><xliff:g>%s</xliff:g> Punkt</item>
<item quantity="other"><xliff:g>%s</xliff:g> Punkte</item> <item quantity="other"><xliff:g>%s</xliff:g> Punkte</item>
</plurals> </plurals>
<string name="settings_oled_dark">Rein schwarzer Hintergrund für dunkles Thema</string> <string name="settings_oled_dark">Komplett schwarzer Hintergrund im dunklen Design</string>
<string name="include_if_asking_support">Wenn Sie Unterstützung anfordern möchten, geben Sie bitte die folgenden Informationen an:</string> <string name="include_if_asking_support">Wenn Sie Unterstützung anfordern möchten, geben Sie bitte die folgenden Informationen an:</string>
<string name="settings_follow_system_orientation">System folgen</string> <string name="settings_follow_system_orientation">System folgen</string>
<string name="settings_landscape_orientation">Landschaft</string> <string name="settings_landscape_orientation">Landschaft</string>
@@ -262,4 +262,10 @@
<string name="currentBalanceSentence">Aktuelles Guthaben: <xliff:g>%s</xliff:g></string> <string name="currentBalanceSentence">Aktuelles Guthaben: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Neues Guthaben: <xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">Neues Guthaben: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Guthaben aktualisieren</string> <string name="updateBalance">Guthaben aktualisieren</string>
<string name="storageReadPermissionRequired">Berechtigung zum Lesen des Speichers für diese Aktion erforderlich </string>
<string name="cameraPermissionRequired">Für diese Aktion wird die Erlaubnis zum Zugriff auf die Kamera benötigt </string>
<string name="validFromDate">Gültig ab</string>
<string name="validFromSentence">Gültig ab: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">Gültig-ab-Datum wählen</string>
<string name="anyDate">Beliebiges Datum</string>
</resources> </resources>

View File

@@ -140,7 +140,7 @@
</plurals> </plurals>
<string name="importCatimaMessage">Επιλέξτε την <i>catima.zip</i> εξαγωγή από το Catima για εισαγωγή <string name="importCatimaMessage">Επιλέξτε την <i>catima.zip</i> εξαγωγή από το Catima για εισαγωγή
\nΔημιουργήστε το από το μενού Εισαγωγής/Εξαγωγής μιας άλλης εφαρμογής Catima κάνοντας εξαγωγή εκεί πρώτα.</string> \nΔημιουργήστε το από το μενού Εισαγωγής/Εξαγωγής μιας άλλης εφαρμογής Catima κάνοντας εξαγωγή εκεί πρώτα.</string>
<string name="importStocardMessage">Επιλέξτε την <i>***-sync.zip</i> εξαγωγή από το Stocard για εισαγωγή. <string name="importStocardMessage">Επιλέξτε την <i>***.zip</i> εξαγωγή από το Stocard για εισαγωγή.
\nΠάρτε το στέλνοντας email στο: support@stocardapp.com ζητώντας μια εξαγωγή αρχείων των δεδομένων σας.</string> \nΠάρτε το στέλνοντας email στο: support@stocardapp.com ζητώντας μια εξαγωγή αρχείων των δεδομένων σας.</string>
<string name="intent_import_card_from_url_share_multiple_text">Θέλω να μοιραστώ μερικές κάρτες μαζί σου</string> <string name="intent_import_card_from_url_share_multiple_text">Θέλω να μοιραστώ μερικές κάρτες μαζί σου</string>
<string name="editGroup">Επεξεργασία Ομάδας: <xliff:g>%s</xliff:g></string> <string name="editGroup">Επεξεργασία Ομάδας: <xliff:g>%s</xliff:g></string>

View File

@@ -108,7 +108,7 @@
\nCréalo primero desde tu perfil de FidMe eligiendo Protección de datos y pulsa Extraer mis datos.</string> \nCréalo primero desde tu perfil de FidMe eligiendo Protección de datos y pulsa Extraer mis datos.</string>
<string name="importLoyaltyCardKeychainMessage">Seleccione su <i>LoyaltyCardKeychain.csv</i> exportado desde Loyalty Card Keychain para importarlo. <string name="importLoyaltyCardKeychainMessage">Seleccione su <i>LoyaltyCardKeychain.csv</i> exportado desde Loyalty Card Keychain para importarlo.
\nCréalo primero desde el menú Importar/Exportar en Loyalty Card Keychain pulsando Exportar desde allí.</string> \nCréalo primero desde el menú Importar/Exportar en Loyalty Card Keychain pulsando Exportar desde allí.</string>
<string name="importStocardMessage">Seleccione su exportación <i>*-sync.zip</i> de Stocard para importarla. <string name="importStocardMessage">Seleccione su exportación <i>*.zip</i> de Stocard para importarla.
\nConsígalo enviando un correo electrónico a support@stocardapp.com solicitando una exportación de sus datos.</string> \nConsígalo enviando un correo electrónico a support@stocardapp.com solicitando una exportación de sus datos.</string>
<string name="importVoucherVaultMessage">Seleccione su <i>vouchervault.json</i> exportado desde Voucher Vault para importarlo. <string name="importVoucherVaultMessage">Seleccione su <i>vouchervault.json</i> exportado desde Voucher Vault para importarlo.
\nCréalo pulsando primero Exportar en Voucher Vault.</string> \nCréalo pulsando primero Exportar en Voucher Vault.</string>
@@ -271,4 +271,8 @@
<string name="importCards">Importar tarjetas</string> <string name="importCards">Importar tarjetas</string>
<string name="storageReadPermissionRequired">Se necesita permiso para leer el almacenamiento para esta acción…</string> <string name="storageReadPermissionRequired">Se necesita permiso para leer el almacenamiento para esta acción…</string>
<string name="cameraPermissionRequired">Se necesita permiso para acceder a la cámara para esta acción…</string> <string name="cameraPermissionRequired">Se necesita permiso para acceder a la cámara para esta acción…</string>
<string name="anyDate">Cualquier fecha</string>
<string name="validFromDate">Válido desde</string>
<string name="chooseValidFromDate">Elija una fecha válida desde</string>
<string name="validFromSentence">Válido desde: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -163,7 +163,7 @@
<item quantity="other"><xliff:g>%d</xliff:g> valittu</item> <item quantity="other"><xliff:g>%d</xliff:g> valittu</item>
</plurals> </plurals>
<string name="importStocard">Tuo Stocardista</string> <string name="importStocard">Tuo Stocardista</string>
<string name="importStocardMessage">Valitse tuotava <i>***-sync.zip</i>-vienti Stocardista. <string name="importStocardMessage">Valitse tuotava <i>***.zip</i>-vienti Stocardista.
\nHanki se lähettämällä sähköpostia osoitteeseen support@stocardapp.com ja pyytämällä tietojesi vientiä.</string> \nHanki se lähettämällä sähköpostia osoitteeseen support@stocardapp.com ja pyytämällä tietojesi vientiä.</string>
<string name="passwordRequired">Ole hyvä ja syötä salasana</string> <string name="passwordRequired">Ole hyvä ja syötä salasana</string>
<string name="failedGeneratingShareURL">Jaettavaa URL-osoitetta ei voitu luoda. Ilmoita tästä.</string> <string name="failedGeneratingShareURL">Jaettavaa URL-osoitetta ei voitu luoda. Ilmoita tästä.</string>
@@ -262,4 +262,10 @@
<string name="settings_lock_on_opening_orientation">Lukitse suunta, kun korttia avataan</string> <string name="settings_lock_on_opening_orientation">Lukitse suunta, kun korttia avataan</string>
<string name="noCameraPermissionDirectToSystemSetting">Viivakoodien lukeminen vaatii, että Catimalla on käyttöoikeus kameraan. Napauta tästä muuttaaksesi oikeuksia.</string> <string name="noCameraPermissionDirectToSystemSetting">Viivakoodien lukeminen vaatii, että Catimalla on käyttöoikeus kameraan. Napauta tästä muuttaaksesi oikeuksia.</string>
<string name="updateBalance">Päivitä saldo</string> <string name="updateBalance">Päivitä saldo</string>
<string name="cameraPermissionRequired">Tämä toiminto vaatii oikeuden käyttää kameraa…</string>
<string name="storageReadPermissionRequired">Tämä toiminto vaatii oikeuden lukea tallennustilaa…</string>
<string name="validFromDate">Kelvollinen alkaen</string>
<string name="anyDate">Mikä tahansa päivämäärä</string>
<string name="chooseValidFromDate">Valitse kelvollinen päivämäärä</string>
<string name="validFromSentence">Kelvollinen alkaen: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -150,7 +150,7 @@
<string name="backImageDescription">Image du verso</string> <string name="backImageDescription">Image du verso</string>
<string name="frontImageDescription">Image du recto</string> <string name="frontImageDescription">Image du recto</string>
<string name="passwordRequired">Veuillez entrer le mot de passe</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. <string name="importStocardMessage">Sélectionnez votre exportation <i>***.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> \nVous pouvez lobtenir en envoyant un courriel à support@stocardapp.com pour demander une exportation de vos données.</string>
<string name="importStocard">Importer depuis Stocard</string> <string name="importStocard">Importer depuis Stocard</string>
<string name="turn_flashlight_off">Éteindre la lampe de poche</string> <string name="turn_flashlight_off">Éteindre la lampe de poche</string>
@@ -269,4 +269,10 @@
<string name="updateBalanceTitle">Combien avez-vous dépensé \?</string> <string name="updateBalanceTitle">Combien avez-vous dépensé \?</string>
<string name="newBalanceSentence">Nouveau solde : <xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">Nouveau solde : <xliff:g>%s</xliff:g></string>
<string name="importCards">Importer des cartes</string> <string name="importCards">Importer des cartes</string>
<string name="storageReadPermissionRequired">L\'autorisation de lire le stockage est nécessaire pour cette action…</string>
<string name="cameraPermissionRequired">L\'autorisation d\'accéder à la caméra est nécessaire pour cette action…</string>
<string name="validFromDate">Valide à partir de</string>
<string name="validFromSentence">Valide à partir de : <xliff:g>%s</xliff:g></string>
<string name="anyDate">Nimporte quelle date</string>
<string name="chooseValidFromDate">Choisissez la date de début de validité</string>
</resources> </resources>

View File

@@ -22,7 +22,7 @@
<string name="save">Mentés</string> <string name="save">Mentés</string>
<string name="edit">Szerkesztés</string> <string name="edit">Szerkesztés</string>
<string name="delete">Törlés</string> <string name="delete">Törlés</string>
<string name="confirm">Alkalmaz</string> <string name="confirm">Jóváhagy</string>
<plurals name="deleteCardsTitle"> <plurals name="deleteCardsTitle">
<item quantity="one">Törölje az <xliff:g>%d</xliff:g> kártyát</item> <item quantity="one">Törölje az <xliff:g>%d</xliff:g> kártyát</item>
<item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item> <item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item>
@@ -55,7 +55,7 @@
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> vonalkód képe</string> <string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> vonalkód képe</string>
<string name="noCardIdError">Nincs azonosító megadva</string> <string name="noCardIdError">Nincs azonosító megadva</string>
<string name="noCardExistsError">Kártya nem található</string> <string name="noCardExistsError">Kártya nem található</string>
<string name="importStocardMessage">Válassza ki a <i>***-sync.zip</i> Stocard exportot. <string name="importStocardMessage">Válassza ki a <i>***.zip</i> Stocard exportot.
\nAdatinak exportját kérheti e-mailben a support@stocardapp.com címre írva.</string> \nAdatinak exportját kérheti e-mailben a support@stocardapp.com címre írva.</string>
<string name="importVoucherVault">Importálás Voucher Vault-ból</string> <string name="importVoucherVault">Importálás Voucher Vault-ból</string>
<string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a vonalkód típushoz</string> <string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a vonalkód típushoz</string>
@@ -262,4 +262,10 @@
</plurals> </plurals>
<string name="updateBalance">Egyenleg frissítése</string> <string name="updateBalance">Egyenleg frissítése</string>
<string name="noCameraPermissionDirectToSystemSetting">A vonalkódok beolvasásához a Catimának hozzá kell férnie a kamerához. Koppintson ide az engedélybeállítások módosításához.</string> <string name="noCameraPermissionDirectToSystemSetting">A vonalkódok beolvasásához a Catimának hozzá kell férnie a kamerához. Koppintson ide az engedélybeállítások módosításához.</string>
<string name="validFromDate">Érvényesség kezdete</string>
<string name="anyDate">Bármely dátum</string>
<string name="chooseValidFromDate">Válassza ki az érvényesség kezdeti dátumot</string>
<string name="validFromSentence">Érvényesség kezdete: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">A művelethez tároló olvasási engedély szükséges…</string>
<string name="cameraPermissionRequired">A kamerához való hozzáférés engedélye szükséges ehhez a művelethez…</string>
</resources> </resources>

View File

@@ -36,7 +36,7 @@
<string name="all">Semua</string> <string name="all">Semua</string>
<string name="leaveWithoutSaveTitle">Keluar</string> <string name="leaveWithoutSaveTitle">Keluar</string>
<string name="card">Kartu</string> <string name="card">Kartu</string>
<string name="barcode">Barcode</string> <string name="barcode">barcode</string>
<string name="chooseExpiryDate">Pilih masa berlaku</string> <string name="chooseExpiryDate">Pilih masa berlaku</string>
<string name="noBarcodeFound">Barcode tidak ditemukan</string> <string name="noBarcodeFound">Barcode tidak ditemukan</string>
<string name="errorReadingImage">Tidak dapat membaca gambar</string> <string name="errorReadingImage">Tidak dapat membaca gambar</string>
@@ -148,7 +148,7 @@
<string name="moveBarcodeToCenterOfScreen">Pusatkan barcode pada layar</string> <string name="moveBarcodeToCenterOfScreen">Pusatkan barcode pada layar</string>
<string name="points">Poin</string> <string name="points">Poin</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> sepertinya bukan saldo yang valid.</string> <string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> sepertinya bukan saldo yang valid.</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string> <string name="app_loyalty_card_keychain">Gantungan kunci kartu kesetiaan</string>
<string name="privacy_policy">Kebijakan Privasi</string> <string name="privacy_policy">Kebijakan Privasi</string>
<string name="privacy_policy_popup_text">Pemberitahuan kebijakan privasi (diperlukan oleh beberapa toko aplikasi): <string name="privacy_policy_popup_text">Pemberitahuan kebijakan privasi (diperlukan oleh beberapa toko aplikasi):
\n \n
@@ -161,7 +161,7 @@
<string name="importLoyaltyCardKeychainMessage">Pilih ekspor <i>LoyaltyCardKeychain.csv</i> Anda dari Loyalty Card Keychain untuk diimpor. <string name="importLoyaltyCardKeychainMessage">Pilih ekspor <i>LoyaltyCardKeychain.csv</i> Anda dari Loyalty Card Keychain untuk diimpor.
\nBuat dari menu Import/Export di Loyalty Card Keychain dengan menekan Export terlebih dahulu.</string> \nBuat dari menu Import/Export di Loyalty Card Keychain dengan menekan Export terlebih dahulu.</string>
<string name="importStocard">Impor dari Stocard</string> <string name="importStocard">Impor dari Stocard</string>
<string name="importStocardMessage">Pilih ekspor <i>***-sync.zip</i> Anda dari Stocard untuk diimpor. <string name="importStocardMessage">Pilih ekspor <i>***.zip</i> Anda dari Stocard untuk diimpor.
\nDapatkan dengan mengirim email ke support@stocardapp.com untuk meminta ekspor data Anda.</string> \nDapatkan dengan mengirim email ke support@stocardapp.com untuk meminta ekspor data Anda.</string>
<string name="importVoucherVault">Impor dari Voucher Vault</string> <string name="importVoucherVault">Impor dari Voucher Vault</string>
<string name="importVoucherVaultMessage">Pilih ekspor <i>vouchervault.json</i> Anda dari Vault Voucher untuk diimpor. <string name="importVoucherVaultMessage">Pilih ekspor <i>vouchervault.json</i> Anda dari Vault Voucher untuk diimpor.
@@ -256,4 +256,11 @@
<string name="currentBalanceSentence">Saldo saat ini: <xliff:g>%s</xliff:g></string> <string name="currentBalanceSentence">Saldo saat ini: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceTitle">Berapa banyak yang telah kamu habiskan \?</string> <string name="updateBalanceTitle">Berapa banyak yang telah kamu habiskan \?</string>
<string name="noCameraPermissionDirectToSystemSetting">Untuk memindai barcode, Catima membutuhkan akses ke kamera mu. Tap disini untuk mengganti pengaturan perizinan mu.</string> <string name="noCameraPermissionDirectToSystemSetting">Untuk memindai barcode, Catima membutuhkan akses ke kamera mu. Tap disini untuk mengganti pengaturan perizinan mu.</string>
<string name="cameraPermissionRequired">Berikan izin untuk mengakses kamera anda…</string>
<string name="storageReadPermissionRequired">Berikan izin untuk membaca penyimpanan anda…</string>
<string name="validFromDate">Valid dari</string>
<string name="validFromSentence">Valid dari:
\n<xliff:g>%s</xliff:g></string>
<string name="anyDate">Kapan pun</string>
<string name="chooseValidFromDate">Pilih valid dari tanggal</string>
</resources> </resources>

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Bæta</string> <string name="action_add">Bæta</string>
<string name="noBarcode">Nei strikamerkið</string> <string name="noBarcode">Nei strikamerkið</string>
<string name="action_search">Leita að</string> <string name="action_search">Leita að</string>
<string name="delete">Eyða</string> <string name="delete">Eyða</string>
<string name="noGiftCards">Smelltu á + plús takka til að bæta kort, eða að flytja inn sumir frá ⋮ matseðill fyrst.</string> <string name="noGiftCards">Smelltu á + plús takka til að bæta korti, eða að flytja inn frá ⋮ Valmynd.</string>
<string name="note">Athugið</string> <string name="note">Athugið</string>
<string name="barcodeType">Strikamerkið tegund</string> <string name="barcodeType">Strikamerkið tegund</string>
<string name="cancel">Hætta</string> <string name="cancel">Hætta</string>
<string name="noMatchingGiftCards">Vissi ekki að finna neitt. Reyna að breyta leita.</string> <string name="noMatchingGiftCards">Engar niðurstöður. Prófaðu að breyta leitarorði.</string>
<string name="storeName">Nafnið</string> <string name="storeName">Nafnið</string>
<string name="barcodeNoBarcode">Þetta kort hefur ekki strikamerkið</string> <string name="barcodeNoBarcode">Þetta kort hefur ekki strikamerkið</string>
<string name="star">Bæta við eftirlæti</string> <string name="star">Bæta við eftirlæti</string>
@@ -80,4 +80,17 @@
<string name="expiryDate">Fyrningu</string> <string name="expiryDate">Fyrningu</string>
<string name="moveDown">Fara neðar</string> <string name="moveDown">Fara neðar</string>
<string name="chooseExpiryDate">Velja rennur</string> <string name="chooseExpiryDate">Velja rennur</string>
</resources> <plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> valið</item>
<item quantity="other"><xliff:g>%d</xliff:g> valin</item>
</plurals>
<string name="noGiftCardsGroup">Búðu til nokkur kort og settu þau síðan í hópinn hér.</string>
<string name="settings_brown_theme">Brún</string>
<string name="settings_green_theme">Grænn</string>
<string name="settings_grey_theme">Grár</string>
<string name="sort">flokka</string>
<string name="sort_by">flokka Eftir</string>
<string name="nextCard">Næsta</string>
<string name="settings_blue_theme">Blár</string>
<string name="settings_sky_blue_theme">Himinblár</string>
</resources>

View File

@@ -150,7 +150,7 @@
<string name="backImageDescription">Immagine posteriore</string> <string name="backImageDescription">Immagine posteriore</string>
<string name="frontImageDescription">Immagine frontale</string> <string name="frontImageDescription">Immagine frontale</string>
<string name="passwordRequired">Si prega di inserire la password</string> <string name="passwordRequired">Si prega di inserire la password</string>
<string name="importStocardMessage">Seleziona il tuo file di esportazione <i>***-sync.zip</i> da Stocard per importarlo. <string name="importStocardMessage">Seleziona il tuo file di esportazione <i>***.zip</i> da Stocard per importarlo.
\nOttienilo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati.</string> \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="importStocard">Importa da Stocard</string>
<string name="turn_flashlight_off">Spegni la torcia</string> <string name="turn_flashlight_off">Spegni la torcia</string>
@@ -271,4 +271,8 @@
<string name="importCards">Importa carte</string> <string name="importCards">Importa carte</string>
<string name="storageReadPermissionRequired">Per questa azione è necessario il permesso per accedere alla memoria del dispositivo…</string> <string name="storageReadPermissionRequired">Per questa azione è necessario il permesso per accedere alla memoria del dispositivo…</string>
<string name="cameraPermissionRequired">Per questa azione è necessario il permesso ad accedere alla fotocamera…</string> <string name="cameraPermissionRequired">Per questa azione è necessario il permesso ad accedere alla fotocamera…</string>
<string name="validFromDate">Valido dal</string>
<string name="chooseValidFromDate">Scegli la data di validità</string>
<string name="validFromSentence">Valido da: <xliff:g>%s</xliff:g></string>
<string name="anyDate">Qualsiasi data</string>
</resources> </resources>

View File

@@ -151,7 +151,7 @@
<string name="photos">フォト</string> <string name="photos">フォト</string>
<string name="backImageDescription"></string> <string name="backImageDescription"></string>
<string name="frontImageDescription"></string> <string name="frontImageDescription"></string>
<string name="importStocardMessage">Stocardでエクスポートした<i>***-sync.zip</i>ファイルを選択してください。 <string name="importStocardMessage">Stocardでエクスポートした<i>***.zip</i>ファイルを選択してください。
\nファイルがない場合、e-mailing support@stocardapp.comにデータのエクスポートを要求してください。</string> \nファイルがない場合、e-mailing support@stocardapp.comにデータのエクスポートを要求してください。</string>
<string name="importStocard">Stocardからインポート</string> <string name="importStocard">Stocardからインポート</string>
<plurals name="selectedCardCount"> <plurals name="selectedCardCount">

View File

@@ -77,4 +77,6 @@
<plurals name="deleteCardsTitle"> <plurals name="deleteCardsTitle">
<item quantity="other">카드 <xliff:g>%d</xliff:g> 제거</item> <item quantity="other">카드 <xliff:g>%d</xliff:g> 제거</item>
</plurals> </plurals>
<string name="noGiftCardsGroup">카드를 몇 장 만든 다음 여기에서 그룹에 할당합니다.</string>
<string name="noCardsMessage">먼저 카드 추가</string>
</resources> </resources>

View File

@@ -47,7 +47,7 @@
<string name="importLoyaltyCardKeychainMessage">Pasirinkite savo <i> LoyaltyCardKeychain.csv</i> eksportą iš Loyalty Card Keychain, kurį norite importuoti. <string name="importLoyaltyCardKeychainMessage">Pasirinkite savo <i> LoyaltyCardKeychain.csv</i> eksportą iš Loyalty Card Keychain, kurį norite importuoti.
\nSukurkite jį iš Loyalty Card Keychain meniu Importavimas/Eksportavimas, pirmiausia paspausdami Eksportuoti.</string> \nSukurkite jį iš Loyalty Card Keychain meniu Importavimas/Eksportavimas, pirmiausia paspausdami Eksportuoti.</string>
<string name="importLoyaltyCardKeychain">Importuoti iš Loyalty Card Keychain</string> <string name="importLoyaltyCardKeychain">Importuoti iš Loyalty Card Keychain</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string> <string name="app_loyalty_card_keychain">Lojalumo kortelės</string>
<string name="parsingBalanceFailed">Panašu, kad <xliff:g> %s </xliff:g> reikšmė nėra tinkama.</string> <string name="parsingBalanceFailed">Panašu, kad <xliff:g> %s </xliff:g> reikšmė nėra tinkama.</string>
<string name="moveBarcodeToCenterOfScreen">Centruoti brūkšninį kodą ekrane</string> <string name="moveBarcodeToCenterOfScreen">Centruoti brūkšninį kodą ekrane</string>
<string name="moveBarcodeToTopOfScreen">Perkelti brūkšninį kodą į ekrano viršų</string> <string name="moveBarcodeToTopOfScreen">Perkelti brūkšninį kodą į ekrano viršų</string>
@@ -75,7 +75,7 @@
<string name="setBarcodeId">Nustatyti brūkšninio kodo reikšmę</string> <string name="setBarcodeId">Nustatyti brūkšninio kodo reikšmę</string>
<string name="sameAsCardId">Tokia pat kaip ID</string> <string name="sameAsCardId">Tokia pat kaip ID</string>
<string name="barcodeId">Brūkšninio kodo reikšmė</string> <string name="barcodeId">Brūkšninio kodo reikšmė</string>
<string name="importStocardMessage">Pasirinkite <i>***-sync.zip</i> eksportą iš Stocard, kad galėtumėte importuoti. <string name="importStocardMessage">Pasirinkite <i>***.zip</i> eksportą iš Stocard, kad galėtumėte importuoti.
\nGaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis.</string> \nGaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis.</string>
<string name="importStocard">Importuoti iš Stocard</string> <string name="importStocard">Importuoti iš Stocard</string>
<string name="importFidmeMessage">Pasirinkite <i>fidme-export-request-xxxxxx.zip</i> eksportą iš FidMe, kurį norite importuoti, ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu. <string name="importFidmeMessage">Pasirinkite <i>fidme-export-request-xxxxxx.zip</i> eksportą iš FidMe, kurį norite importuoti, ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu.
@@ -269,4 +269,6 @@
<item quantity="other"><xliff:g>%s</xliff:g> taškų</item> <item quantity="other"><xliff:g>%s</xliff:g> taškų</item>
</plurals> </plurals>
<string name="importCards">Importuoti korteles</string> <string name="importCards">Importuoti korteles</string>
<string name="storageReadPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie saugyklos…</string>
<string name="cameraPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie kameros…</string>
</resources> </resources>

View File

@@ -204,7 +204,7 @@
\nFailu var izveidot Jūsu FidMe profilā, ejot uz \"Data Protection\" un spiežot \"Extract my data\".</string> \nFailu var izveidot Jūsu FidMe profilā, ejot uz \"Data Protection\" un spiežot \"Extract my data\".</string>
<string name="importLoyaltyCardKeychain">Importēt no Loyalty Card Keychain</string> <string name="importLoyaltyCardKeychain">Importēt no Loyalty Card Keychain</string>
<string name="importStocard">Importēt no Stocard</string> <string name="importStocard">Importēt no Stocard</string>
<string name="importStocardMessage">Importam izvēlieties Jūsu <i>***-sync.zip</i> eksporta failu no Stocard. <string name="importStocardMessage">Importam izvēlieties Jūsu <i>***.zip</i> eksporta failu no Stocard.
\nFailu var iegūt sūtot e-pastu uz support@stocardapp.com ar pieprasījumu eksportēt Jūsu datus.</string> \nFailu var iegūt sūtot e-pastu uz support@stocardapp.com ar pieprasījumu eksportēt Jūsu datus.</string>
<string name="importVoucherVault">Importēt no Voucher Vault</string> <string name="importVoucherVault">Importēt no Voucher Vault</string>
<string name="importVoucherVaultMessage">Importam izvēlieties Jūsu <i>vouchervault.json</i> failu no Voucher Vault. <string name="importVoucherVaultMessage">Importam izvēlieties Jūsu <i>vouchervault.json</i> failu no Voucher Vault.

View File

@@ -146,7 +146,7 @@
<string name="photos">Bilder</string> <string name="photos">Bilder</string>
<string name="backImageDescription">Baksidebilde</string> <string name="backImageDescription">Baksidebilde</string>
<string name="frontImageDescription">Forsidebilde</string> <string name="frontImageDescription">Forsidebilde</string>
<string name="importStocardMessage">Velg din <i>***-sync.zip</i>-eksport fra Stocard å importere. <string name="importStocardMessage">Velg din <i>***.zip</i>-eksport fra Stocard å importere.
\nSkaff den ved å sende e-post til support@stocardapp.com der du etterspør eksport av dataen din.</string> \nSkaff den ved å sende e-post til support@stocardapp.com der du etterspør eksport av dataen din.</string>
<string name="passwordRequired">Skriv inn passordet</string> <string name="passwordRequired">Skriv inn passordet</string>
<string name="importStocard">Importer fra Stocard</string> <string name="importStocard">Importer fra Stocard</string>
@@ -253,7 +253,7 @@
<item quantity="other">Vis arkiv (<xliff:g>%1$d</xliff:g> kort)</item> <item quantity="other">Vis arkiv (<xliff:g>%1$d</xliff:g> kort)</item>
</plurals> </plurals>
<string name="failedToRetrieveImageFile">Kunne ikke hente bildefil</string> <string name="failedToRetrieveImageFile">Kunne ikke hente bildefil</string>
<string name="barcodeLongPressMessage">Kun bilder kan åpnes i galleriet</string> <string name="barcodeLongPressMessage">Kun bilder kan åpnes i galleriprogrammet</string>
<string name="cameraPermissionDeniedTitle">Fikk ikke tilgang til kameraet</string> <string name="cameraPermissionDeniedTitle">Fikk ikke tilgang til kameraet</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string> <string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string>
<string name="importCards">Importer kort</string> <string name="importCards">Importer kort</string>
@@ -262,4 +262,10 @@
<string name="updateBalanceHint">Skriv inn beløp</string> <string name="updateBalanceHint">Skriv inn beløp</string>
<string name="newBalanceSentence">Ny saldo: <xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">Ny saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Oppdater saldo</string> <string name="updateBalance">Oppdater saldo</string>
<string name="validFromDate">Gyldig fra</string>
<string name="anyDate">Når som helst</string>
<string name="chooseValidFromDate">Velg en gyldig dato</string>
<string name="storageReadPermissionRequired">Lagringslesetilgang kreves for denne handlingen …</string>
<string name="validFromSentence">Gyldig fra: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionRequired">Kameratilgang kreves for denne handlingen …</string>
</resources> </resources>

View File

@@ -149,7 +149,7 @@
<string name="backImageDescription">Achterzijde van kaart</string> <string name="backImageDescription">Achterzijde van kaart</string>
<string name="frontImageDescription">Voorzijde van kaart</string> <string name="frontImageDescription">Voorzijde van kaart</string>
<string name="passwordRequired">Voer het wachtwoord in</string> <string name="passwordRequired">Voer het wachtwoord in</string>
<string name="importStocardMessage">Kies het te importeren Stocard-exportbestand genaamd <i>***-sync.zip</i>. <string name="importStocardMessage">Kies het te importeren Stocard-exportbestand genaamd <i>***.zip</i>.
\nStuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand.</string> \nStuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand.</string>
<string name="importStocard">Importeren uit Stocard</string> <string name="importStocard">Importeren uit Stocard</string>
<string name="failedGeneratingShareURL">De te delen link kan niet worden gegenereerd. Meld deze fout.</string> <string name="failedGeneratingShareURL">De te delen link kan niet worden gegenereerd. Meld deze fout.</string>
@@ -264,4 +264,8 @@
<string name="importCards">Kaarten importeren</string> <string name="importCards">Kaarten importeren</string>
<string name="storageReadPermissionRequired">Toestemming om de opslag uit te lezen benodigd voor deze actie…</string> <string name="storageReadPermissionRequired">Toestemming om de opslag uit te lezen benodigd voor deze actie…</string>
<string name="cameraPermissionRequired">Toestemming om de camera te openen benodigd voor deze actie…</string> <string name="cameraPermissionRequired">Toestemming om de camera te openen benodigd voor deze actie…</string>
<string name="anyDate">Iedere datum</string>
<string name="validFromDate">Geldig vanaf</string>
<string name="validFromSentence">Geldig vanaf: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">Kies een geldige vanaf-datum</string>
</resources> </resources>

View File

@@ -115,7 +115,7 @@
<string name="importVoucherVaultMessage">Wybierz swój <i>vouchervault.json</i> z Voucher Vault, aby zaimportować. <string name="importVoucherVaultMessage">Wybierz swój <i>vouchervault.json</i> z Voucher Vault, aby zaimportować.
\nUtwórz go wpierw klikając Eksportuj w Voucher Vault.</string> \nUtwórz go wpierw klikając Eksportuj w Voucher Vault.</string>
<string name="importVoucherVault">Importuj z Voucher Vault</string> <string name="importVoucherVault">Importuj z Voucher Vault</string>
<string name="importStocardMessage">Wybierz swój <i>***-sync.zip</i> z Stocard, aby zaimportować. <string name="importStocardMessage">Wybierz swój <i>***.zip</i> z Stocard, aby zaimportować.
\nUzyskaj go, wysyłając email na adres support@stocardapp.com, z prośbą o eksport Twoich danych.</string> \nUzyskaj go, wysyłając email na adres support@stocardapp.com, z prośbą o eksport Twoich danych.</string>
<string name="importStocard">Importuj z Stocard</string> <string name="importStocard">Importuj z Stocard</string>
<string name="importLoyaltyCardKeychainMessage">Wybierz swój <i>LoyaltyCardKeychain.csv</i> z Loyalty Card Keychain, aby zaimportować. <string name="importLoyaltyCardKeychainMessage">Wybierz swój <i>LoyaltyCardKeychain.csv</i> z Loyalty Card Keychain, aby zaimportować.
@@ -132,7 +132,7 @@
\n \n
\nŻADNE DANE NIE SĄ ZBIERANE, co może potwierdzić każdy, gdyż nasza aplikacja jest wolnym oprogramowaniem.</string> \nŻADNE DANE NIE SĄ ZBIERANE, co może potwierdzić każdy, gdyż nasza aplikacja jest wolnym oprogramowaniem.</string>
<string name="privacy_policy">Polityka prywatności</string> <string name="privacy_policy">Polityka prywatności</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string> <string name="app_loyalty_card_keychain">Brelok dla twoich kart lojalnościowych</string>
<string name="chooseImportType">Importuj dane z</string> <string name="chooseImportType">Importuj dane z</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> nie wydaje się być prawidłową wartością.</string> <string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> nie wydaje się być prawidłową wartością.</string>
<string name="points">Punkty</string> <string name="points">Punkty</string>
@@ -276,4 +276,10 @@
<string name="cameraPermissionDeniedTitle">Odmówiono dostępu do kamery</string> <string name="cameraPermissionDeniedTitle">Odmówiono dostępu do kamery</string>
<string name="newBalanceSentence">Nowe saldo: <xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">Nowe saldo: <xliff:g>%s</xliff:g></string>
<string name="importCards">Importuj karty</string> <string name="importCards">Importuj karty</string>
<string name="storageReadPermissionRequired">Pozwolenie na odczytanie pamięci masowej potrzebne do wykonania tej czynności…</string>
<string name="cameraPermissionRequired">Zezwolenie na dostęp do kamery potrzebne do wykonania tej czynności…</string>
<string name="validFromDate">Obowiązuje od</string>
<string name="chooseValidFromDate">Wybierz datę rozpoczęcia ważności</string>
<string name="anyDate">Dowolna data</string>
<string name="validFromSentence">Ważny od: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -97,7 +97,7 @@
<string name="sameAsCardId">Igual ao identificador</string> <string name="sameAsCardId">Igual ao identificador</string>
<string name="importFidmeMessage">Selecione a exportação <i>fidme-export-request-xxxxxx.zip</i> do FidMe para importar e depois selecione os tipos de código de barras manualmente. <string name="importFidmeMessage">Selecione a exportação <i>fidme-export-request-xxxxxx.zip</i> do FidMe para importar e depois selecione os tipos de código de barras manualmente.
\nPrimeiro crie a exportação no seu perfil do FidMe escolhendo a opção \"Proteção de dados\" e em seguida pressionando \"Extrair os meus dados\".</string> \nPrimeiro crie a exportação no seu perfil do FidMe escolhendo a opção \"Proteção de dados\" e em seguida pressionando \"Extrair os meus dados\".</string>
<string name="importStocardMessage">Selecione a exportação <i>***-sync.zip</i> do Stocard para importar. <string name="importStocardMessage">Selecione a exportação <i>***.zip</i> do Stocard para importar.
\nObtenha-o através do e-mail support@stocardapp.com solicitando uma exportação dos seus dados.</string> \nObtenha-o através do e-mail support@stocardapp.com solicitando uma exportação dos seus dados.</string>
<string name="barcodeId">Valor do código de barras</string> <string name="barcodeId">Valor do código de barras</string>
<string name="wrongValueForBarcodeType">O valor não é válido para o tipo de código de barras selecionado</string> <string name="wrongValueForBarcodeType">O valor não é válido para o tipo de código de barras selecionado</string>
@@ -271,4 +271,8 @@
<string name="updateBalanceHint">Introduza o valor</string> <string name="updateBalanceHint">Introduza o valor</string>
<string name="storageReadPermissionRequired">É necessária a permissão para ler o armazenamento para esta ação…</string> <string name="storageReadPermissionRequired">É necessária a permissão para ler o armazenamento para esta ação…</string>
<string name="cameraPermissionRequired">É necessária a permissão para aceder à câmara para esta ação…</string> <string name="cameraPermissionRequired">É necessária a permissão para aceder à câmara para esta ação…</string>
<string name="validFromDate">Válido desde</string>
<string name="anyDate">Qualquer data</string>
<string name="chooseValidFromDate">Escolha uma data desde válida</string>
<string name="validFromSentence">Válido desde: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -94,9 +94,9 @@
<string name="moveBarcodeToTopOfScreen">Переместить штрих-код в верхнюю часть экрана</string> <string name="moveBarcodeToTopOfScreen">Переместить штрих-код в верхнюю часть экрана</string>
<string name="moveBarcodeToCenterOfScreen">Центрировать штрих-код на экране</string> <string name="moveBarcodeToCenterOfScreen">Центрировать штрих-код на экране</string>
<string name="currency">Валюта</string> <string name="currency">Валюта</string>
<string name="chooseExpiryDate">Указать срок действия</string> <string name="chooseExpiryDate">Выбор срока действия</string>
<string name="never">Никогда</string> <string name="never">Никогда</string>
<string name="expiryDate">Окончание срока действия</string> <string name="expiryDate">Срок действия</string>
<string name="editBarcode">Изменить штрих-код</string> <string name="editBarcode">Изменить штрих-код</string>
<string name="barcode">Штрих-код</string> <string name="barcode">Штрих-код</string>
<string name="card">Карта</string> <string name="card">Карта</string>
@@ -150,7 +150,7 @@
<string name="backImageDescription">Задняя сторона</string> <string name="backImageDescription">Задняя сторона</string>
<string name="frontImageDescription">Лицевая сторона</string> <string name="frontImageDescription">Лицевая сторона</string>
<string name="photos">Фото</string> <string name="photos">Фото</string>
<string name="importStocardMessage">Выберите для импортирования файл <i>***-sync.zip</i>. <string name="importStocardMessage">Выберите для импортирования файл <i>***.zip</i>.
\nЭтот файл можно получить по электронной почте от support@stocardapp.com, предварительно запросив экспорт ваших данных.</string> \nЭтот файл можно получить по электронной почте от support@stocardapp.com, предварительно запросив экспорт ваших данных.</string>
<string name="passwordRequired">Введите пароль</string> <string name="passwordRequired">Введите пароль</string>
<string name="importStocard">Импорт из Stocard</string> <string name="importStocard">Импорт из Stocard</string>
@@ -278,4 +278,8 @@
<string name="importCards">Импорт карт</string> <string name="importCards">Импорт карт</string>
<string name="storageReadPermissionRequired">Для этого действия необходимо разрешение на чтение хранилища…</string> <string name="storageReadPermissionRequired">Для этого действия необходимо разрешение на чтение хранилища…</string>
<string name="cameraPermissionRequired">Для этого действия необходимо разрешение на доступ к камере…</string> <string name="cameraPermissionRequired">Для этого действия необходимо разрешение на доступ к камере…</string>
<string name="validFromDate">Действует с</string>
<string name="anyDate">Любая дата</string>
<string name="chooseValidFromDate">Выбор даты действия</string>
<string name="validFromSentence">Действует с: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?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"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Pridať</string> <string name="action_add">Pridať</string>
<string name="noGiftCards">Zatiaľ nemáte žiadne vernostné karty. Kliknite na tlačidlo \"+\" (plus) vyššie a začnite.\n\nAplikácia Vernostné karty umožňuje nosiť svoje vernostné karty v telefóne, kde sú vždy na dosah.</string> <string name="noGiftCards">Ak chcete pridať kartu, kliknite na tlačidlo + plus alebo ju importujte z ⋮ ponuky.</string>
<string name="storeName">Názov</string> <string name="storeName">Názov</string>
<string name="note">Poznámka</string> <string name="note">Poznámka</string>
<string name="cardId">ID karty</string> <string name="cardId">ID karty</string>
@@ -15,37 +15,37 @@
<string name="sendLabel">Odoslať…</string> <string name="sendLabel">Odoslať…</string>
<string name="editCardTitle">Upraviť kartu</string> <string name="editCardTitle">Upraviť kartu</string>
<string name="addCardTitle">Pridať kartu</string> <string name="addCardTitle">Pridať kartu</string>
<string name="scanCardBarcode">Zosnímajte čiarový kód na karte</string> <string name="scanCardBarcode">Skenovať čiarový kód</string>
<string name="cardShortcut">Skratka</string> <string name="cardShortcut">Skratka</string>
<string name="noCardsMessage">Najprv pridajte kartu</string> <string name="noCardsMessage">Najprv pridajte kartu</string>
<string name="noStoreError">Nebol zadaný obchod</string> <string name="noStoreError">Nebol zadaný žiadny názov</string>
<string name="noCardIdError">Nebolo zadané ID</string> <string name="noCardIdError">Nebolo zadané ID</string>
<string name="noCardExistsError">Nepodarilo sa nájsť túto kartu</string> <string name="noCardExistsError">Nepodarilo sa nájsť túto kartu</string>
<string name="importExport">Import/Export</string> <string name="importExport">Import/Export</string>
<string name="exportName">Export</string> <string name="exportName">Export</string>
<string name="importExportHelp">Zálohovanie dát Vám umožní presunúť Vaše uložené karty na iné zariadenie.</string> <string name="importExportHelp">Zálohovanie vašich údajov umožňuje ich presun na iné zariadenie.</string>
<string name="importSuccessfulTitle">Importované</string> <string name="importSuccessfulTitle">Importované</string>
<string name="importFailedTitle">Import zlyhal</string> <string name="importFailedTitle">Import zlyhal</string>
<string name="importFailed">Zlyhal import</string> <string name="importFailed">Nemožno vykonať import</string>
<string name="exportSuccessfulTitle">Exportované</string> <string name="exportSuccessfulTitle">Exportované</string>
<string name="exportFailedTitle">Export zlyhal</string> <string name="exportFailedTitle">Export zlyhal</string>
<string name="exportFailed">Zlyhal export</string> <string name="exportFailed">Nemožno vykonať export</string>
<string name="importing">Importujem…</string> <string name="importing">Importujem…</string>
<string name="exporting">Exportujem…</string> <string name="exporting">Exportujem…</string>
<string name="importOptionFilesystemTitle">Import zo súborového systému</string> <string name="importOptionFilesystemTitle">Import zo súborového systému</string>
<string name="importOptionFilesystemExplanation">Vyberte súbor zo súborového systému.</string> <string name="importOptionFilesystemExplanation">Vyberte súbor zo súborového systému.</string>
<string name="importOptionFilesystemButton">Zo súborového systému</string> <string name="importOptionFilesystemButton">Zo súborového systému</string>
<string name="importOptionApplicationTitle">Použite externú aplikáciu</string> <string name="importOptionApplicationTitle">Použite inú aplikáciu</string>
<string name="importOptionApplicationExplanation">Na otvorenie súboru použite externú aplikáciu, ako Dropbox, Disk Google, alebo Vášho obľúbeného správcu súborov.</string> <string name="importOptionApplicationExplanation">Na otvorenie súboru použite ľubovoľnú aplikáciu alebo obľúbeného správcu súborov.</string>
<string name="importOptionApplicationButton">Použiť externú aplikáciu</string> <string name="importOptionApplicationButton">Použiť inú aplikáciu</string>
<string name="about">O aplikácii</string> <string name="about">O aplikácii</string>
<string name="app_license">Licencované GPLv3.</string> <string name="app_license">Copyleftovaný slobodný softvér s licenciou GPLv3+</string>
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string> <string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verzia: <xliff:g id="version">%s</xliff:g></string> <string name="debug_version_fmt">Verzia: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informácia pri revízii: <xliff:g id="app_revision_url">%s</xliff:g></string> <string name="app_revision_fmt">Informácia o revízii: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Vyberte čiarový kód</string> <string name="selectBarcodeTitle">Vyberte čiarový kód</string>
<string name="copy_to_clipboard_toast">ID karty skopírované do schránky</string> <string name="copy_to_clipboard_toast">ID skopírované do schránky</string>
<string name="thumbnailDescription">Náhľad karty</string> <string name="thumbnailDescription">Miniatúra</string>
<string name="settings">Nastavenia</string> <string name="settings">Nastavenia</string>
<string name="settings_category_title_ui">Používateľské prostredie</string> <string name="settings_category_title_ui">Používateľské prostredie</string>
<string name="settings_display_barcode_max_brightness">Zvýšiť jas pri zobrazení čiarového kódu </string> <string name="settings_display_barcode_max_brightness">Zvýšiť jas pri zobrazení čiarového kódu </string>
@@ -53,11 +53,11 @@
<string name="deleteConfirmation">Naozaj chcete túto kartu odstrániť?</string> <string name="deleteConfirmation">Naozaj chcete túto kartu odstrániť?</string>
<string name="star">Pridať k obľúbeným</string> <string name="star">Pridať k obľúbeným</string>
<string name="noBarcode">Žiadny čiarový kód</string> <string name="noBarcode">Žiadny čiarový kód</string>
<string name="barcodeNoBarcode">Táto karta nemá čiarový kód</string> <string name="barcodeNoBarcode">Čiarový kód nie je k dispozícii</string>
<string name="barcodeType">Typ čiarových kódov</string> <string name="barcodeType">Typ čiarových kódov</string>
<string name="noMatchingGiftCards">Nenašiel som nič. Skúste zmeniť vyhľadávanie.</string> <string name="noMatchingGiftCards">Žiadne výsledky. Skúste zmeniť vyhľadávanie.</string>
<string name="action_search">Vyhľadávanie</string> <string name="action_search">Vyhľadávanie</string>
<string name="chooseImportType">Importovať údaje z\?</string> <string name="chooseImportType">Importovať údaje z</string>
<string name="points">Body</string> <string name="points">Body</string>
<string name="currency">Mena</string> <string name="currency">Mena</string>
<string name="balance">Vyváženie</string> <string name="balance">Vyváženie</string>
@@ -68,7 +68,7 @@
<string name="chooseExpiryDate">Zvoľte dátum skončenia platnosti</string> <string name="chooseExpiryDate">Zvoľte dátum skončenia platnosti</string>
<string name="never">Nikdy</string> <string name="never">Nikdy</string>
<string name="addFromImage">Vyberte obrázok z galérie</string> <string name="addFromImage">Vyberte obrázok z galérie</string>
<string name="addManually">Ručné zadanie ID karty</string> <string name="addManually">Ručné zadanie ID</string>
<string name="leaveWithoutSaveConfirmation">Odísť bez uloženia\?</string> <string name="leaveWithoutSaveConfirmation">Odísť bez uloženia\?</string>
<string name="leaveWithoutSaveTitle">Výstup</string> <string name="leaveWithoutSaveTitle">Výstup</string>
<string name="moveDown">Pohyb smerom nadol</string> <string name="moveDown">Pohyb smerom nadol</string>
@@ -76,14 +76,14 @@
<string name="failedOpeningFileManager">Najprv nainštalujte správcu súborov.</string> <string name="failedOpeningFileManager">Najprv nainštalujte správcu súborov.</string>
<string name="deleteConfirmationGroup">Vymazať skupinu\?</string> <string name="deleteConfirmationGroup">Vymazať skupinu\?</string>
<string name="all">Všetky</string> <string name="all">Všetky</string>
<string name="noGroupCards">Táto skupina neobsahuje karty</string> <string name="noGroupCards">Táto skupina je prázdna</string>
<string name="noGroups">Ak chcete najprv prid skupiny na kategorizáciu, kliknite na tlačidlo + plus.</string> <string name="noGroups">Kliknutím na tlačidlo + plus pridáte skupiny na kategorizáciu.</string>
<string name="groups">Skupiny</string> <string name="groups">Skupiny</string>
<string name="enter_group_name">Zadajte názov skupiny</string> <string name="enter_group_name">Zadajte názov skupiny</string>
<string name="exportSuccessful">Export údajov z karty</string> <string name="exportSuccessful">Údaje exportované</string>
<string name="importSuccessful">Import údajov z karty</string> <string name="importSuccessful">Údaje importované</string>
<string name="intent_import_card_from_url_share_text">Chcem sa s vami podeliť o pohľadnicu</string> <string name="intent_import_card_from_url_share_text">Chcem sa s vami podeliť o pohľadnicu</string>
<string name="settings_disable_lockscreen_while_viewing_card">Zabráňte uzamknutiu obrazovky</string> <string name="settings_disable_lockscreen_while_viewing_card">Zabrániť uzamknutiu obrazovky</string>
<string name="settings_keep_screen_on">Nechajte obrazovku zapnutú</string> <string name="settings_keep_screen_on">Nechajte obrazovku zapnutú</string>
<string name="settings_max_font_size_scale">Maximálna veľkosť písma</string> <string name="settings_max_font_size_scale">Maximálna veľkosť písma</string>
<string name="card_ids_copied">Skopírované ID</string> <string name="card_ids_copied">Skopírované ID</string>
@@ -93,7 +93,7 @@
<string name="settings_system_theme">Systém</string> <string name="settings_system_theme">Systém</string>
<string name="settings_theme">Téma</string> <string name="settings_theme">Téma</string>
<string name="starImage">Obľúbená hviezda</string> <string name="starImage">Obľúbená hviezda</string>
<string name="enterBarcodeInstructions">Zadajte ID karty a vyberte typ čiarového kódu nižšie alebo \"Táto karta nemá čiarový kód\".</string> <string name="enterBarcodeInstructions">Zadajte ID a vyberte typ čiarového kódu nižšie alebo \"Nie je tu žiadny čiarový kód\".</string>
<string name="exportOptionExplanation">Údaje sa zapíšu na vami zvolené miesto.</string> <string name="exportOptionExplanation">Údaje sa zapíšu na vami zvolené miesto.</string>
<string name="failedParsingImportUriError">Nepodarilo sa analyzovať import URI</string> <string name="failedParsingImportUriError">Nepodarilo sa analyzovať import URI</string>
<string name="share">Zdieľať</string> <string name="share">Zdieľať</string>
@@ -204,5 +204,75 @@
<string name="passwordRequired">Zadajte prosím heslo</string> <string name="passwordRequired">Zadajte prosím heslo</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> sa nezdá byť platným zostatkom.</string> <string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> sa nezdá byť platným zostatkom.</string>
<string name="noGiftCardsGroup">Zatiaľ nemáte žiadne vernostné karty. Keď nejaké pridáte, môžete ich priradiť ku skupine tu.</string> <string name="noGiftCardsGroup">Zatiaľ nemáte žiadne vernostné karty. Keď nejaké pridáte, môžete ich priradiť ku skupine tu.</string>
<string name="noCameraPermissionDirectToSystemSetting"></string> <string name="noCameraPermissionDirectToSystemSetting">Na skenovanie čiarových kódov potrebuje Catima prístup k fotoaparátu. Ťuknite sem a zmeňte nastavenia oprávnení.</string>
<string name="importCards">Importovať karty</string>
<string name="settings_card_orientation">Orientácia čiarového kódu</string>
<string name="settings_lock_on_opening_orientation">Zamknúť na orientáciu použitú pri otváraní karty</string>
<string name="app_loyalty_card_keychain">Kľúčenka vernostných kariet</string>
<string name="settings_oled_dark">Čisto čierne pozadie pre tmavú tému</string>
<string name="failedToRetrieveImageFile">Nepodarilo sa získať súbor obrázku</string>
<string name="updateBalance">Aktualizovať zostatok</string>
<string name="and_data_usage">a využitie dát</string>
<string name="options">Možnosti</string>
<string name="starred">S hviezdičkou</string>
<string name="set_scale">Nastaviť mierku</string>
<string name="duplicateCard">Duplikovať</string>
<string name="archive">Archivovať</string>
<string name="unarchive">Vrátiť z archivu</string>
<string name="archived">Karta archivovaná</string>
<string name="unarchived">Karta vrátená z archívu</string>
<string name="previousCard">Predošlá</string>
<string name="nextCard">Nasledujúca</string>
<string name="updateBalanceTitle">Koľko ste minuli\?</string>
<string name="updateBalanceHint">Zadajte čiastku</string>
<string name="failedToOpenUrl">Najprv nainštalujte webový prehliadač</string>
<string name="welcome">Vitajte v Catima</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> bod</item>
<item quantity="few"><xliff:g>%s</xliff:g> body</item>
<item quantity="other"><xliff:g>%s</xliff:g> bodov</item>
</plurals>
<string name="validFromDate">Platnosť od</string>
<string name="anyDate">Akýkoľvek dátum</string>
<string name="chooseValidFromDate">Zvoliť dátum platné od</string>
<string name="validFromSentence">Platnosť od: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionRequired">Pre túto akciu je potrebné oprávnenie na prístup k fotoaparátu…</string>
<string name="privacy_policy_popup_text">Oznámenie o zásadách ochrany osobných údajov (vyžaduje sa v niektorých obchodoch s aplikáciami):
\n
\nNEZHROMAŽĎUJÚ SA VÔBEC ŽIADNE ÚDAJE, čo môže ktokoľvek potvrdiť, keďže naša aplikácia je slobodný softvér.</string>
<string name="importLoyaltyCardKeychainMessage">Vyberte svoj export <i>LoyaltyCardKeychain.csv</i> z Kľúčenky vernostných kariet, ktorý chcete importovať.
\nVytvorte ho z ponuky Import/Export v aplikácii Loyalty Card Keychain tak, že tam najprv stlačíte tlačidlo Exportovať.</string>
<string name="importVoucherVaultMessage">Vyberte svoj <i>vouchervault.json</i> export z Trezoru poukážok pre import.
\nNajprv ho vytvorte stlačením tlačidla Export v aplikácii Voucher Vault.</string>
<string name="shortcutSelectCard">Vybrať kartu</string>
<string name="include_if_asking_support">Ak chcete požiadať o podporu, uveďte nasledujúce informácie:</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> karta (<xliff:g id="archivedCount">%2$d</xliff:g> archivovaná)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> karty (<xliff:g id="archivedCount">%2$d</xliff:g> archivované)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kariet (<xliff:g id="archivedCount">%2$d</xliff:g> archivovaných)</item>
</plurals>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Zobraziť archív (<xliff:g>%1$d</xliff:g> karta)</item>
<item quantity="few">Zobraziť archív (<xliff:g>%1$d</xliff:g> karty)</item>
<item quantity="other">Zobraziť archív (<xliff:g>%1$d</xliff:g> kariet)</item>
</plurals>
<string name="swipeToSwitchImages">Potiahnutím prstom prepínate obrázky, podržaním otvoríte obrázok v aplikácii galéria</string>
<string name="barcodeLongPressMessage">V aplikácii galéria je možné otvoriť iba obrázky</string>
<string name="cameraPermissionDeniedTitle">Nepodarilo sa získať prístup k fotoaparátu</string>
<string name="storageReadPermissionRequired">Pre túto akciu je potrebné oprávnenie na čítanie úložiska…</string>
<string name="settings_follow_system_orientation">Podľa systému</string>
<string name="settings_portrait_orientation">Na výšku</string>
<string name="settings_landscape_orientation">Na šírku</string>
<string name="importFidmeMessage">Vyberte svoj <i>fidme-export-request-xxxxxx.zip</i> export zo služby FidMe pre import a potom vyberte typy čiarových kódov ručne.
\nVytvorte ho z profilu FidMe tak, že najprv vyberiete položku Ochrana údajov a potom stlačíte tlačidlo Extrahovať moje údaje.</string>
<string name="importStocardMessage">Vyberte svoj <i>***.zip</i> export zo Stocard pre import.
\nZískate ho zaslaním e-mailu na adresu support@stocardapp.com, v ktorom požiadate o export svojich údajov.</string>
<string name="currentBalanceSentence">Aktuálny zostatok: <xliff:g>%s</xliff:g></string>
<string name="copy_to_clipboard_multiple_toast">ID skopírované do schránky</string>
<string name="intent_import_card_from_url_share_multiple_text">Chcem sa s vami zdielať karty</string>
<string name="app_contributors">Podporili: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="archiveList">Archív</string>
<string name="noUnarchivedCardsMessage">Nie sú žiadne karty vrátené z archívu</string>
<string name="newBalanceSentence">Nový zostatok: <xliff:g>%s</xliff:g></string>
<string name="failedLaunchingPhotoPicker">Nepodarilo sa nájsť podporovanú aplikáciu galérie</string>
</resources> </resources>

View File

@@ -221,7 +221,7 @@
<string name="moveBarcodeToCenterOfScreen">Postavi črtno kodo na sredino zaslona</string> <string name="moveBarcodeToCenterOfScreen">Postavi črtno kodo na sredino zaslona</string>
<string name="importCatimaMessage">Izberi svoj obstoječ Catima <i>catima.zip</i> izvoz podatkov za uvoz v aplikacijo. <string name="importCatimaMessage">Izberi svoj obstoječ Catima <i>catima.zip</i> izvoz podatkov za uvoz v aplikacijo.
\nNajprej izvozi podatke v meniju \"Uvozi/Izvozi\" v drugi aplikaciji Catima s pritiskom na izbiro izvozi.</string> \nNajprej izvozi podatke v meniju \"Uvozi/Izvozi\" v drugi aplikaciji Catima s pritiskom na izbiro izvozi.</string>
<string name="importStocardMessage">Izberi svoj <i>***-sync.zip</i> Stocard izvoz podatkov za uvoz. <string name="importStocardMessage">Izberi svoj <i>***.zip</i> Stocard izvoz podatkov za uvoz.
\nIzvoz podatkov dobiš s pošiljanjem elektronske pošte na support@stocardapp.com, kjer povprašaš za izvoz svojih podatkov.</string> \nIzvoz podatkov dobiš s pošiljanjem elektronske pošte na support@stocardapp.com, kjer povprašaš za izvoz svojih podatkov.</string>
<string name="importVoucherVaultMessage">Izberi svoj <i>vouchervault.json</i> Voucher Vault izvoz podatkov za uvoz. <string name="importVoucherVaultMessage">Izberi svoj <i>vouchervault.json</i> Voucher Vault izvoz podatkov za uvoz.
\nIzvoz podatkov dobiš s pritiskom na gumb \"Export\" v Voucher Vault first.</string> \nIzvoz podatkov dobiš s pritiskom na gumb \"Export\" v Voucher Vault first.</string>
@@ -276,4 +276,10 @@
<item quantity="few">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item> <item quantity="few">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item>
<item quantity="other">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item> <item quantity="other">Poglej arhiv (<xliff:g>%1$d</xliff:g> kartic)</item>
</plurals> </plurals>
<string name="cameraPermissionRequired">Za to dejanje je potrebno dovoljenje za dostop do kamere…</string>
<string name="storageReadPermissionRequired">Za to dejanje je potrebno dovoljenje za branje iz pomnilnika…</string>
<string name="validFromSentence">Veljavno od: <xliff:g>%s</xliff:g></string>
<string name="validFromDate">Velja od</string>
<string name="anyDate">Katerikoli datum</string>
<string name="chooseValidFromDate">Izberite datum začetka veljavnosti</string>
</resources> </resources>

View File

@@ -24,7 +24,7 @@
\nSkapa den från Import/Export-menyn i Loyalty Card Keychain först genom att trycka på Exportera.</string> \nSkapa den från Import/Export-menyn i Loyalty Card Keychain först genom att trycka på Exportera.</string>
<string name="importVoucherVaultMessage">Välj den exporterade <i>vouchervault.json</i> från Voucher Vault som du vill importera. <string name="importVoucherVaultMessage">Välj den exporterade <i>vouchervault.json</i> från Voucher Vault som du vill importera.
\nSkapa den först genom att trycka på Exportera i Voucher Vault.</string> \nSkapa den först genom att trycka på Exportera i Voucher Vault.</string>
<string name="importStocardMessage">Välj den exporterade <i>***-sync.zip</i> från Stocard som du vill importera. <string name="importStocardMessage">Välj den exporterade <i>***.zip</i> från Stocard som du vill importera.
\nSkaffa den först genom att skicka e-post till support@stocardapp.com och be om att få dina data exporterade.</string> \nSkaffa den först genom att skicka e-post till support@stocardapp.com och be om att få dina data exporterade.</string>
<string name="enter_group_name">Ange gruppnamn</string> <string name="enter_group_name">Ange gruppnamn</string>
<string name="groups">Grupper</string> <string name="groups">Grupper</string>
@@ -137,7 +137,7 @@
<string name="cardId">Kort-ID</string> <string name="cardId">Kort-ID</string>
<string name="storeName">Namn</string> <string name="storeName">Namn</string>
<string name="noMatchingGiftCards">Inget resultat. Försök justera din sökning.</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="noGiftCards">Klicka på plus(+)-knappen för att lägga till ett kort, eller importera från ⋮-menyn.</string>
<string name="action_add">Lägg till</string> <string name="action_add">Lägg till</string>
<string name="action_search">Sök</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="exportOptionExplanation">Datan kommer att sparas till en plats som du väljer.</string>
@@ -184,7 +184,7 @@
<string name="settings_theme_color">Temafärg</string> <string name="settings_theme_color">Temafärg</string>
<string name="noGroupCards">Denna grupp är tom</string> <string name="noGroupCards">Denna grupp är tom</string>
<string name="barcodeImageDescriptionWithType">Bild <xliff:g>%s</xliff:g> streckkod</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="swipeToSwitchImages">Svep eller ändra bilder, håll för att öppna i bild i galleri app</string>
<string name="reverse">...i omvänd ordning</string> <string name="reverse">...i omvänd ordning</string>
<string name="sort_by">Sortera efter</string> <string name="sort_by">Sortera efter</string>
<string name="sort_by_balance">Saldo</string> <string name="sort_by_balance">Saldo</string>
@@ -252,4 +252,20 @@
<item quantity="other">Visa arkiv (<xliff:g>%1$d</xliff:g> cards)</item> <item quantity="other">Visa arkiv (<xliff:g>%1$d</xliff:g> cards)</item>
</plurals> </plurals>
<string name="welcome">Välkommen till Catima</string> <string name="welcome">Välkommen till Catima</string>
<string name="importCards">Importera kort</string>
<string name="cameraPermissionDeniedTitle">Kunde inte komma åt kamera</string>
<string name="noCameraPermissionDirectToSystemSetting">För att skanna streckkoder kommer Catima att behöva åtkomst till din kamera. Tryck här för att ändra dina tillståndsinställningar.</string>
<string name="anyDate">Valfritt datum</string>
<string name="chooseValidFromDate">Välj giltigt från datum</string>
<string name="validFromSentence">Giltigt från: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">Tillstånd att läsa lagring behövs för denna åtgärd…</string>
<string name="currentBalanceSentence">Nuvarande balans: <xliff:g>%s</xliff:g></string>
<string name="validFromDate">Giltig från</string>
<string name="cameraPermissionRequired">Tillstånd att komma åt kameran krävs för denna åtgärd…</string>
<string name="updateBalance">Uppdatera balans</string>
<string name="failedToRetrieveImageFile">Misslyckades att hämta bildfil</string>
<string name="barcodeLongPressMessage">Endast bilder kan öppnas i galleri app</string>
<string name="updateBalanceTitle">Hur mycket spenderade du\?</string>
<string name="updateBalanceHint">Ange summa</string>
<string name="newBalanceSentence">Ny balans: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -39,7 +39,7 @@
<string name="importVoucherVaultMessage">İçe aktarmak için Voucher Vault\'tan dışa aktardığınız <i>vouchervault.json</i> dosyasını seçin. <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> \nÖnce Voucher Vault\'ta \"Dışa aktar\" düğmesine basarak bir tane oluşturun.</string>
<string name="importVoucherVault">Voucher Vault\'tan içe aktar</string> <string name="importVoucherVault">Voucher Vault\'tan içe aktar</string>
<string name="importStocardMessage">İçe aktarmak için Stocard\'dan dışa aktardığınız <i>***-sync.zip</i> dosyasını seçin. <string name="importStocardMessage">İçe aktarmak için Stocard\'dan dışa aktardığınız <i>***.zip</i> dosyasını seçin.
\nsupport@stocardapp.com adresine e-posta göndererek verilerinizin dışa aktarılmasını isteyerek edinin.</string> \nsupport@stocardapp.com adresine e-posta göndererek verilerinizin dışa aktarılmasını isteyerek edinin.</string>
<string name="importStocard">Stocard\'dan içe aktar</string> <string name="importStocard">Stocard\'dan içe aktar</string>
<string name="importLoyaltyCardKeychainMessage">İçe aktarmak için Loyalty Card Keychain\'den dışa aktardığınız <i>LoyaltyCardKeychain.csv</i> dosyasını seçin. <string name="importLoyaltyCardKeychainMessage">İçe aktarmak için Loyalty Card Keychain\'den dışa aktardığınız <i>LoyaltyCardKeychain.csv</i> dosyasını seçin.
@@ -264,4 +264,8 @@
<string name="importCards">Kartları içe aktar</string> <string name="importCards">Kartları içe aktar</string>
<string name="storageReadPermissionRequired">Bu eylem için depolama alanını okuma izni gerekiyor…</string> <string name="storageReadPermissionRequired">Bu eylem için depolama alanını okuma izni gerekiyor…</string>
<string name="cameraPermissionRequired">Bu eylem için kameraya erişim izni gerekiyor…</string> <string name="cameraPermissionRequired">Bu eylem için kameraya erişim izni gerekiyor…</string>
<string name="chooseValidFromDate">Geçerlilik başlangıcı tarihini seç</string>
<string name="anyDate">Herhangi bir tarih</string>
<string name="validFromDate">Geçerlilik başlangıcı</string>
<string name="validFromSentence"><xliff:g>%s</xliff:g> tarihinden itibaren geçerlidir</string>
</resources> </resources>

View File

@@ -154,7 +154,7 @@
<string name="photos">Світлини</string> <string name="photos">Світлини</string>
<string name="backImageDescription">Тильна сторона</string> <string name="backImageDescription">Тильна сторона</string>
<string name="frontImageDescription">Лицьова сторона</string> <string name="frontImageDescription">Лицьова сторона</string>
<string name="importStocardMessage">Виберіть експорт <i> ***-sync.zip </i> зі Stocard для імпорту. <string name="importStocardMessage">Виберіть експорт <i> ***.zip </i> зі Stocard для імпорту.
\nОтримайте його, надіславши електронного листа support@stocardapp.com з проханням експортувати ваші дані.</string> \nОтримайте його, надіславши електронного листа support@stocardapp.com з проханням експортувати ваші дані.</string>
<string name="importStocard">Імпорт із Stocard</string> <string name="importStocard">Імпорт із Stocard</string>
<plurals name="selectedCardCount"> <plurals name="selectedCardCount">
@@ -278,4 +278,8 @@
<string name="updateBalance">Оновити баланс</string> <string name="updateBalance">Оновити баланс</string>
<string name="storageReadPermissionRequired">Дозвіл на читання сховища, необхідний для цієї дії…</string> <string name="storageReadPermissionRequired">Дозвіл на читання сховища, необхідний для цієї дії…</string>
<string name="cameraPermissionRequired">Дозвіл на доступ до камери, необхідний для цієї дії…</string> <string name="cameraPermissionRequired">Дозвіл на доступ до камери, необхідний для цієї дії…</string>
<string name="validFromDate">Дійсний від</string>
<string name="anyDate">Будь-яка дата</string>
<string name="chooseValidFromDate">Виберіть термін дії з дати</string>
<string name="validFromSentence">Дійсний від: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -140,7 +140,7 @@
<string name="deleteConfirmation">删除此卡?</string> <string name="deleteConfirmation">删除此卡?</string>
<string name="deleteTitle">移除卡片</string> <string name="deleteTitle">移除卡片</string>
<string name="starImage">最喜欢的星星</string> <string name="starImage">最喜欢的星星</string>
<string name="importStocardMessage">选择 Stocard 导出文件 <i>****-sync.zip</i>来导入。 <string name="importStocardMessage">选择 Stocard 导出文件 <i>****.zip</i>来导入。
\n发电子邮件给 support@stocardapp.com 请求获得数据导出文件。</string> \n发电子邮件给 support@stocardapp.com 请求获得数据导出文件。</string>
<plurals name="deleteCardsConfirmation"> <plurals name="deleteCardsConfirmation">
<item quantity="other">确定永久删除 <xliff:g>%d</xliff:g> 这些卡片?</item> <item quantity="other">确定永久删除 <xliff:g>%d</xliff:g> 这些卡片?</item>
@@ -255,4 +255,10 @@
<string name="failedToRetrieveImageFile">无法检索图像文件</string> <string name="failedToRetrieveImageFile">无法检索图像文件</string>
<string name="newBalanceSentence">新余额:<xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">新余额:<xliff:g>%s</xliff:g></string>
<string name="barcodeLongPressMessage">只能在图库应用程序中打开图像</string> <string name="barcodeLongPressMessage">只能在图库应用程序中打开图像</string>
<string name="storageReadPermissionRequired">此操作所需的读取存储空间的权限…</string>
<string name="validFromDate">有效期自</string>
<string name="anyDate">任何日期</string>
<string name="chooseValidFromDate">选择有效日期</string>
<string name="validFromSentence">有效期自: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionRequired">此操作所需的访问相机的权限…</string>
</resources> </resources>

View File

@@ -3,7 +3,7 @@
<string name="app_revision_url">https://github.com/CatimaLoyalty/Android/releases</string> <string name="app_revision_url">https://github.com/CatimaLoyalty/Android/releases</string>
<string name="action_search">搜尋</string> <string name="action_search">搜尋</string>
<string name="action_add">新增</string> <string name="action_add">新增</string>
<string name="noGiftCards">點選 + 按鈕以新增卡片,或從 ⋮ 選單中匯入卡片</string> <string name="noGiftCards">點選 + 按鈕以新增卡片,或從 ⋮ 選單中匯入。</string>
<string name="noMatchingGiftCards">找不到相關結果。試試其他關鍵字。</string> <string name="noMatchingGiftCards">找不到相關結果。試試其他關鍵字。</string>
<string name="storeName">名稱</string> <string name="storeName">名稱</string>
<string name="note">註記</string> <string name="note">註記</string>
@@ -172,7 +172,7 @@
<string name="importVoucherVaultMessage">選取您自 Voucher Vault 匯出的 <i>vouchervault.json</i> 檔案以進行匯入。 <string name="importVoucherVaultMessage">選取您自 Voucher Vault 匯出的 <i>vouchervault.json</i> 檔案以進行匯入。
\n請您先透過 Voucher Vault 進行匯出。</string> \n請您先透過 Voucher Vault 進行匯出。</string>
<string name="importStocard">自 Stocard 中匯入</string> <string name="importStocard">自 Stocard 中匯入</string>
<string name="importStocardMessage">&gt;選取您自 Stocard 匯出的 <i>***-sync.zip</i> 檔案以進行匯入。 <string name="importStocardMessage">&gt;選取您自 Stocard 匯出的 <i>***.zip</i> 檔案以進行匯入。
\n請您寫封 Email 至 support@stocardapp.com 索取您的資料。</string> \n請您寫封 Email 至 support@stocardapp.com 索取您的資料。</string>
<string name="importLoyaltyCardKeychain">自 Loyalty Card Keychain 中匯入</string> <string name="importLoyaltyCardKeychain">自 Loyalty Card Keychain 中匯入</string>
<string name="importLoyaltyCardKeychainMessage">選取您自 Loyalty Card Keychain <i>LoyaltyCardKeychain.csv</i> 檔案以進行匯入。 <string name="importLoyaltyCardKeychainMessage">選取您自 Loyalty Card Keychain <i>LoyaltyCardKeychain.csv</i> 檔案以進行匯入。
@@ -198,7 +198,7 @@
<string name="backImageDescription">背面圖片</string> <string name="backImageDescription">背面圖片</string>
<string name="updateBarcodeQuestionText">您已更新了 ID是否要更新條碼內容以匹配此 ID</string> <string name="updateBarcodeQuestionText">您已更新了 ID是否要更新條碼內容以匹配此 ID</string>
<string name="failedGeneratingShareURL">無法建立可分享的 URL請回報此錯誤。</string> <string name="failedGeneratingShareURL">無法建立可分享的 URL請回報此錯誤。</string>
<string name="swipeToSwitchImages">滑動或長按以切換圖片</string> <string name="swipeToSwitchImages">滑動切換圖片,長按檢視圖片</string>
<string name="starImage">收藏標示</string> <string name="starImage">收藏標示</string>
<string name="noGiftCardsGroup">建立一些卡片,然後將它們分配到這個群組中。</string> <string name="noGiftCardsGroup">建立一些卡片,然後將它們分配到這個群組中。</string>
<string name="showMoreInfo">顯示資訊</string> <string name="showMoreInfo">顯示資訊</string>
@@ -247,4 +247,18 @@
<item quantity="other">檢視封存 (<xliff:g>%1$d</xliff:g> 張卡片)</item> <item quantity="other">檢視封存 (<xliff:g>%1$d</xliff:g> 張卡片)</item>
</plurals> </plurals>
<string name="settings_lock_on_opening_orientation">開啟卡片時鎖定的方向</string> <string name="settings_lock_on_opening_orientation">開啟卡片時鎖定的方向</string>
<string name="importCards">導入卡片</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima 需要鏡頭使用權才能夠掃描條碼, 點擊這裏更變你的權限設定。</string>
<string name="validFromDate">生效</string>
<string name="anyDate">任何日期</string>
<string name="chooseValidFromDate">選擇生效日期</string>
<string name="validFromSentence">生效日期: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">這個行動需要閱讀儲存空間的權限…</string>
<string name="cameraPermissionRequired">這個行動需要使用鏡頭的權限…</string>
<string name="cameraPermissionDeniedTitle">不能使用鏡頭</string>
<string name="updateBalance">更新餘額</string>
<string name="updateBalanceTitle">你用了多少?</string>
<string name="updateBalanceHint">輸入金額</string>
<string name="currentBalanceSentence">餘額: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">新的餘額: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -65,6 +65,7 @@
<item>bn</item> <item>bn</item>
<item>bn-rIN</item> <item>bn-rIN</item>
<item>bs</item> <item>bs</item>
<item>ca</item>
<item>cs</item> <item>cs</item>
<item>cy</item> <item>cy</item>
<item>da</item> <item>da</item>

View File

@@ -194,7 +194,7 @@
<string name="importLoyaltyCardKeychainMessage">Select your <i>LoyaltyCardKeychain.csv</i> export from Loyalty Card Keychain to import. <string name="importLoyaltyCardKeychainMessage">Select your <i>LoyaltyCardKeychain.csv</i> export from Loyalty Card Keychain to import.
\nCreate it from the Import/Export menu in Loyalty Card Keychain by pressing Export there first.</string> \nCreate it from the Import/Export menu in Loyalty Card Keychain by pressing Export there first.</string>
<string name="importStocard">Import from Stocard</string> <string name="importStocard">Import from Stocard</string>
<string name="importStocardMessage">Select your <i>***-sync.zip</i> export from Stocard to import. <string name="importStocardMessage">Select your <i>***.zip</i> export from Stocard to import.
\nGet it by e-mailing support@stocardapp.com asking for an export of your data.</string> \nGet it by e-mailing support@stocardapp.com asking for an export of your data.</string>
<string name="importVoucherVault">Import from Voucher Vault</string> <string name="importVoucherVault">Import from Voucher Vault</string>
<string name="importVoucherVaultMessage">Select your <i>vouchervault.json</i> export from Voucher Vault to import. <string name="importVoucherVaultMessage">Select your <i>vouchervault.json</i> export from Voucher Vault to import.
@@ -309,4 +309,8 @@
<string name="updateBalanceHint">Enter amount</string> <string name="updateBalanceHint">Enter amount</string>
<string name="currentBalanceSentence">Current balance: <xliff:g>%s</xliff:g></string> <string name="currentBalanceSentence">Current balance: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">New balance: <xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">New balance: <xliff:g>%s</xliff:g></string>
</resources> <string name="validFromDate">Valid from</string>
<string name="anyDate">Any date</string>
<string name="chooseValidFromDate">Choose valid from date</string>
<string name="validFromSentence">Valid from: <xliff:g>%s</xliff:g></string>
</resources>

View File

@@ -11,7 +11,6 @@ import org.junit.runner.RunWith;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.android.controller.ActivityController; import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLooper; import org.robolectric.shadows.ShadowLooper;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
@@ -21,7 +20,6 @@ import static org.robolectric.Shadows.shadowOf;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class BarcodeSelectorActivityTest { public class BarcodeSelectorActivityTest {
@Test @Test
public void emptyStateTest() { public void emptyStateTest() {

View File

@@ -27,7 +27,6 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class DatabaseTest { public class DatabaseTest {
private SQLiteDatabase mDatabase; private SQLiteDatabase mDatabase;
private Activity mActivity; private Activity mActivity;
@@ -43,7 +42,7 @@ public class DatabaseTest {
@Test @Test
public void addRemoveOneGiftCard() { public void addRemoveOneGiftCard() {
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); 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,0); long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -52,6 +51,7 @@ public class DatabaseTest {
assertNotNull(loyaltyCard); assertNotNull(loyaltyCard);
assertEquals("store", loyaltyCard.store); assertEquals("store", loyaltyCard.store);
assertEquals("note", loyaltyCard.note); assertEquals("note", loyaltyCard.note);
assertEquals(null, loyaltyCard.validFrom);
assertEquals(null, loyaltyCard.expiry); assertEquals(null, loyaltyCard.expiry);
assertEquals(new BigDecimal("0"), loyaltyCard.balance); assertEquals(new BigDecimal("0"), loyaltyCard.balance);
assertEquals(null, loyaltyCard.balanceType); assertEquals(null, loyaltyCard.balanceType);
@@ -70,12 +70,12 @@ public class DatabaseTest {
@Test @Test
public void updateGiftCard() { public void updateGiftCard() {
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR, 0, null, 0); result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR, 0, null, 0);
assertTrue(result); assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -83,6 +83,7 @@ public class DatabaseTest {
assertNotNull(loyaltyCard); assertNotNull(loyaltyCard);
assertEquals("store1", loyaltyCard.store); assertEquals("store1", loyaltyCard.store);
assertEquals("note1", loyaltyCard.note); assertEquals("note1", loyaltyCard.note);
assertEquals(null, loyaltyCard.validFrom);
assertEquals(null, loyaltyCard.expiry); assertEquals(null, loyaltyCard.expiry);
assertEquals(new BigDecimal("10.00"), loyaltyCard.balance); assertEquals(new BigDecimal("10.00"), loyaltyCard.balance);
assertEquals(Currency.getInstance("EUR"), loyaltyCard.balanceType); assertEquals(Currency.getInstance("EUR"), loyaltyCard.balanceType);
@@ -96,7 +97,7 @@ public class DatabaseTest {
@Test @Test
public void updateGiftCardOnlyStar() { public void updateGiftCardOnlyStar() {
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -109,6 +110,7 @@ public class DatabaseTest {
assertNotNull(loyaltyCard); assertNotNull(loyaltyCard);
assertEquals("store", loyaltyCard.store); assertEquals("store", loyaltyCard.store);
assertEquals("note", loyaltyCard.note); assertEquals("note", loyaltyCard.note);
assertEquals(null, loyaltyCard.validFrom);
assertEquals(null, loyaltyCard.expiry); assertEquals(null, loyaltyCard.expiry);
assertEquals(new BigDecimal("0"), loyaltyCard.balance); assertEquals(new BigDecimal("0"), loyaltyCard.balance);
assertEquals(null, loyaltyCard.balanceType); assertEquals(null, loyaltyCard.balanceType);
@@ -124,7 +126,7 @@ public class DatabaseTest {
public void updateMissingGiftCard() { public void updateMissingGiftCard() {
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
boolean result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1", boolean result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, null, new BigDecimal("0"), null, "cardId1",
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null, 0); null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null, 0);
assertEquals(false, result); assertEquals(false, result);
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -132,7 +134,7 @@ public class DatabaseTest {
@Test @Test
public void emptyGiftCardValues() { public void emptyGiftCardValues() {
long id = DBHelper.insertLoyaltyCard(mDatabase, "", "", null, new BigDecimal("0"), null, "", null, null, null, 0, null,0); long id = DBHelper.insertLoyaltyCard(mDatabase, "", "", null, null, new BigDecimal("0"), null, "", null, null, null, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -141,6 +143,7 @@ public class DatabaseTest {
assertNotNull(loyaltyCard); assertNotNull(loyaltyCard);
assertEquals("", loyaltyCard.store); assertEquals("", loyaltyCard.store);
assertEquals("", loyaltyCard.note); assertEquals("", loyaltyCard.note);
assertEquals(null, loyaltyCard.validFrom);
assertEquals(null, loyaltyCard.expiry); assertEquals(null, loyaltyCard.expiry);
assertEquals(new BigDecimal("0"), loyaltyCard.balance); assertEquals(new BigDecimal("0"), loyaltyCard.balance);
assertEquals(null, loyaltyCard.balanceType); assertEquals(null, loyaltyCard.balanceType);
@@ -159,7 +162,7 @@ public class DatabaseTest {
// Add the gift cards in reverse order, to ensure // Add the gift cards in reverse order, to ensure
// that they are sorted // that they are sorted
for (int index = CARDS_TO_ADD - 1; index >= 0; index--) { for (int index = CARDS_TO_ADD - 1; index >= 0; index--) {
long id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, long id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, null, new BigDecimal("0"), null, "cardId" + index,
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null,0); null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
@@ -177,6 +180,7 @@ public class DatabaseTest {
for (int index = 0; index < CARDS_TO_ADD; index++) { for (int index = 0; index < CARDS_TO_ADD; index++) {
assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE))); assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)));
assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE))); assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE)));
assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.VALID_FROM)));
assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY))); assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY)));
assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE))); assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE)));
assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE)));
@@ -204,10 +208,10 @@ public class DatabaseTest {
// that they are sorted // that they are sorted
for (int index = CARDS_TO_ADD - 1; index >= 0; index--) { for (int index = CARDS_TO_ADD - 1; index >= 0; index--) {
if (index == CARDS_TO_ADD - 1) { if (index == CARDS_TO_ADD - 1) {
id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, null, new BigDecimal("0"), null, "cardId" + index,
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1, null,0); null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1, null,0);
} else { } else {
id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, null, new BigDecimal("0"), null, "cardId" + index,
null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null,0); null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null,0);
} }
boolean result = (id != -1); boolean result = (id != -1);
@@ -225,6 +229,7 @@ public class DatabaseTest {
int index = CARDS_TO_ADD - 1; int index = CARDS_TO_ADD - 1;
assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE))); assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)));
assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE))); assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE)));
assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.VALID_FROM)));
assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY))); assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY)));
assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE))); assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE)));
assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE)));
@@ -239,6 +244,7 @@ public class DatabaseTest {
for (index = 0; index < CARDS_TO_ADD - 1; index++) { for (index = 0; index < CARDS_TO_ADD - 1; index++) {
assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE))); assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)));
assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE))); assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE)));
assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.VALID_FROM)));
assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY)));
assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE))); assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE)));
assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE)));
@@ -305,7 +311,7 @@ public class DatabaseTest {
public void updateGroup() { public void updateGroup() {
// Create card // Create card
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); 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,0); long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -417,7 +423,7 @@ public class DatabaseTest {
public void cardAddAndRemoveGroups() { public void cardAddAndRemoveGroups() {
// Create card // Create card
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); 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,0); long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -478,6 +484,7 @@ public class DatabaseTest {
LoyaltyCard card = DBHelper.getLoyaltyCard(database, newCardId); LoyaltyCard card = DBHelper.getLoyaltyCard(database, newCardId);
assertEquals("store", card.store); assertEquals("store", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -493,6 +500,7 @@ public class DatabaseTest {
LoyaltyCard card2 = DBHelper.getLoyaltyCard(database, newCardId2); LoyaltyCard card2 = DBHelper.getLoyaltyCard(database, newCardId2);
assertEquals("store", card2.store); assertEquals("store", card2.store);
assertEquals("", card2.note); assertEquals("", card2.note);
assertEquals(null, card2.validFrom);
assertEquals(null, card2.expiry); assertEquals(null, card2.expiry);
assertEquals(new BigDecimal("0"), card2.balance); assertEquals(new BigDecimal("0"), card2.balance);
assertEquals(null, card2.balanceType); assertEquals(null, card2.balanceType);
@@ -507,7 +515,7 @@ public class DatabaseTest {
@Test @Test
public void updateGiftCardOnlyBalance() { public void updateGiftCardOnlyBalance() {
long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -520,6 +528,7 @@ public class DatabaseTest {
assertNotNull(loyaltyCard); assertNotNull(loyaltyCard);
assertEquals("store", loyaltyCard.store); assertEquals("store", loyaltyCard.store);
assertEquals("note", loyaltyCard.note); assertEquals("note", loyaltyCard.note);
assertEquals(null, loyaltyCard.validFrom);
assertEquals(null, loyaltyCard.expiry); assertEquals(null, loyaltyCard.expiry);
assertEquals(new BigDecimal(60), loyaltyCard.balance); assertEquals(new BigDecimal(60), loyaltyCard.balance);
assertEquals(null, loyaltyCard.balanceType); assertEquals(null, loyaltyCard.balanceType);

View File

@@ -13,13 +13,11 @@ import org.junit.runner.RunWith;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.robolectric.Shadows.shadowOf; import static org.robolectric.Shadows.shadowOf;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class ImportExportActivityTest { public class ImportExportActivityTest {
private void registerIntentHandler(String handler) { private void registerIntentHandler(String handler) {
// Add something that will 'handle' the given intent type // Add something that will 'handle' the given intent type

View File

@@ -6,20 +6,16 @@ import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Environment; import android.os.Environment;
import android.os.Looper; import android.os.Looper;
import android.util.DisplayMetrics;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import org.json.JSONException;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.LooperMode; import org.robolectric.annotation.LooperMode;
import org.robolectric.shadows.ShadowLog; import org.robolectric.shadows.ShadowLog;
import org.robolectric.shadows.ShadowLooper; import org.robolectric.shadows.ShadowLooper;
@@ -34,8 +30,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -44,7 +38,6 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import androidx.core.content.res.ResourcesCompat;
import protect.card_locker.async.TaskHandler; import protect.card_locker.async.TaskHandler;
import protect.card_locker.importexport.DataFormat; import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult; import protect.card_locker.importexport.ImportExportResult;
@@ -59,7 +52,6 @@ import static org.junit.Assert.assertTrue;
import static org.robolectric.Shadows.shadowOf; import static org.robolectric.Shadows.shadowOf;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class ImportExportTest { public class ImportExportTest {
private Activity activity; private Activity activity;
private SQLiteDatabase mDatabase; private SQLiteDatabase mDatabase;
@@ -86,7 +78,7 @@ public class ImportExportTest {
for (int index = cardsToAdd; index > 0; index--) { for (int index = cardsToAdd; index > 0; index--) {
String storeName = String.format("store, \"%4d", index); String storeName = String.format("store, \"%4d", index);
String note = String.format("note, \"%4d", index); String note = String.format("note, \"%4d", index);
long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null,0); long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
} }
@@ -100,7 +92,7 @@ public class ImportExportTest {
for (int index = cardsToAdd; index > 4; index--) { for (int index = cardsToAdd; index > 4; index--) {
String storeName = String.format("store, \"%4d", index); String storeName = String.format("store, \"%4d", index);
String note = String.format("note, \"%4d", index); String note = String.format("note, \"%4d", index);
long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1, null,0); long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
} }
@@ -108,7 +100,7 @@ public class ImportExportTest {
String storeName = String.format("store, \"%4d", index); String storeName = String.format("store, \"%4d", index);
String note = String.format("note, \"%4d", index); String note = String.format("note, \"%4d", index);
//if index is even //if index is even
long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null,0); long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
} }
@@ -117,13 +109,14 @@ public class ImportExportTest {
@Test @Test
public void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { public void addLoyaltyCardsWithExpiryNeverPastTodayFuture() {
long id = DBHelper.insertLoyaltyCard(mDatabase, "No Expiry", "", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0); long id = DBHelper.insertLoyaltyCard(mDatabase, "No Expiry", "", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0);
boolean result = (id != -1); boolean result = (id != -1);
assertTrue(result); assertTrue(result);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, (int) id); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
assertEquals("No Expiry", card.store); assertEquals("No Expiry", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -133,13 +126,14 @@ public class ImportExportTest {
assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus); assertEquals(0, card.starStatus);
id = DBHelper.insertLoyaltyCard(mDatabase, "Past", "", new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0); id = DBHelper.insertLoyaltyCard(mDatabase, "Past", "", null, new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0);
result = (id != -1); result = (id != -1);
assertTrue(result); assertTrue(result);
card = DBHelper.getLoyaltyCard(mDatabase, (int) id); card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
assertEquals("Past", card.store); assertEquals("Past", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertTrue(card.expiry.before(new Date())); assertTrue(card.expiry.before(new Date()));
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -149,13 +143,14 @@ public class ImportExportTest {
assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(Integer.valueOf(0), card.headerColor);
assertEquals(0, card.starStatus); assertEquals(0, card.starStatus);
id = DBHelper.insertLoyaltyCard(mDatabase, "Today", "", new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0); id = DBHelper.insertLoyaltyCard(mDatabase, "Today", "", null, new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0);
result = (id != -1); result = (id != -1);
assertTrue(result); assertTrue(result);
card = DBHelper.getLoyaltyCard(mDatabase, (int) id); card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
assertEquals("Today", card.store); assertEquals("Today", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertTrue(card.expiry.before(new Date(new Date().getTime() + 86400))); assertTrue(card.expiry.before(new Date(new Date().getTime() + 86400)));
assertTrue(card.expiry.after(new Date(new Date().getTime() - 86400))); assertTrue(card.expiry.after(new Date(new Date().getTime() - 86400)));
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
@@ -168,13 +163,14 @@ public class ImportExportTest {
// This will break after 19 January 2038 // This will break after 19 January 2038
// If someone is still maintaining this code base by then: I love you // If someone is still maintaining this code base by then: I love you
id = DBHelper.insertLoyaltyCard(mDatabase, "Future", "", new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0); id = DBHelper.insertLoyaltyCard(mDatabase, "Future", "", null, new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0);
result = (id != -1); result = (id != -1);
assertTrue(result); assertTrue(result);
card = DBHelper.getLoyaltyCard(mDatabase, (int) id); card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
assertEquals("Future", card.store); assertEquals("Future", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertTrue(card.expiry.after(new Date(new Date().getTime() + 86400))); assertTrue(card.expiry.after(new Date(new Date().getTime() + 86400)));
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -216,6 +212,7 @@ public class ImportExportTest {
assertEquals(expectedStore, card.store); assertEquals(expectedStore, card.store);
assertEquals(expectedNote, card.note); assertEquals(expectedNote, card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal(String.valueOf(index)), card.balance); assertEquals(new BigDecimal(String.valueOf(index)), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -248,6 +245,7 @@ public class ImportExportTest {
assertEquals(expectedStore, card.store); assertEquals(expectedStore, card.store);
assertEquals(expectedNote, card.note); assertEquals(expectedNote, card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal(String.valueOf(index)), card.balance); assertEquals(new BigDecimal(String.valueOf(index)), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -269,6 +267,7 @@ public class ImportExportTest {
assertEquals(expectedStore, card.store); assertEquals(expectedStore, card.store);
assertEquals(expectedNote, card.note); assertEquals(expectedNote, card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal(String.valueOf(index)), card.balance); assertEquals(new BigDecimal(String.valueOf(index)), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -510,7 +509,7 @@ public class ImportExportTest {
} }
@Test @Test
public void corruptedImportNothingSaved() throws IOException { public void corruptedImportNothingSaved() {
final int NUM_CARDS = 10; final int NUM_CARDS = 10;
for (DataFormat format : DataFormat.values()) { for (DataFormat format : DataFormat.values()) {
@@ -531,7 +530,7 @@ public class ImportExportTest {
// ^ after the quote there should only be a , \n or EOF // ^ after the quote there should only be a , \n or EOF
String corruptEntry = "ThisStringIsLikelyNotPartOfAnyFormat,\"\"a"; String corruptEntry = "ThisStringIsLikelyNotPartOfAnyFormat,\"\"a";
ByteArrayInputStream inData = new ByteArrayInputStream((outData.toString() + corruptEntry).getBytes()); ByteArrayInputStream inData = new ByteArrayInputStream((outData + corruptEntry).getBytes());
// Attempt to import the data // Attempt to import the data
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, format, null); result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, format, null);
@@ -610,18 +609,8 @@ public class ImportExportTest {
} }
@Test @Test
public void importWithoutColorsV1() throws IOException { public void importWithoutColorsV1() {
String csvText = ""; InputStream inputStream = getClass().getResourceAsStream("catima_v1_no_colors.csv");
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
DBHelper.LoyaltyCardDbIds.STORE + "," +
DBHelper.LoyaltyCardDbIds.NOTE + "," +
DBHelper.LoyaltyCardDbIds.CARD_ID + "," +
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," +
DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n";
csvText += "1,store,note,12345,AZTEC,0";
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
@@ -632,6 +621,7 @@ public class ImportExportTest {
assertEquals("store", card.store); assertEquals("store", card.store);
assertEquals("note", card.note); assertEquals("note", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -645,20 +635,8 @@ public class ImportExportTest {
} }
@Test @Test
public void importWithoutNullColorsV1() throws IOException { public void importWithoutNullColorsV1() {
String csvText = ""; InputStream inputStream = getClass().getResourceAsStream("catima_v1_empty_colors.csv");
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
DBHelper.LoyaltyCardDbIds.STORE + "," +
DBHelper.LoyaltyCardDbIds.NOTE + "," +
DBHelper.LoyaltyCardDbIds.CARD_ID + "," +
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," +
DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," +
DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," +
DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n";
csvText += "1,store,note,12345,AZTEC,,,0";
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
@@ -669,6 +647,7 @@ public class ImportExportTest {
assertEquals("store", card.store); assertEquals("store", card.store);
assertEquals("note", card.note); assertEquals("note", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -682,20 +661,8 @@ public class ImportExportTest {
} }
@Test @Test
public void importWithoutInvalidColorsV1() throws IOException { public void importWithoutInvalidColorsV1() {
String csvText = ""; InputStream inputStream = getClass().getResourceAsStream("catima_v1_invalid_colors.csv");
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
DBHelper.LoyaltyCardDbIds.STORE + "," +
DBHelper.LoyaltyCardDbIds.NOTE + "," +
DBHelper.LoyaltyCardDbIds.CARD_ID + "," +
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," +
DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," +
DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," +
DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n";
csvText += "1,store,note,12345,type,not a number,invalid,0";
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
@@ -706,20 +673,8 @@ public class ImportExportTest {
} }
@Test @Test
public void importWithNoBarcodeTypeV1() throws IOException { public void importWithNoBarcodeTypeV1() {
String csvText = ""; InputStream inputStream = getClass().getResourceAsStream("catima_v1_no_barcode_type.csv");
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
DBHelper.LoyaltyCardDbIds.STORE + "," +
DBHelper.LoyaltyCardDbIds.NOTE + "," +
DBHelper.LoyaltyCardDbIds.CARD_ID + "," +
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," +
DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," +
DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," +
DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n";
csvText += "1,store,note,12345,,1,1,0";
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
@@ -730,6 +685,7 @@ public class ImportExportTest {
assertEquals("store", card.store); assertEquals("store", card.store);
assertEquals("note", card.note); assertEquals("note", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -743,20 +699,8 @@ public class ImportExportTest {
} }
@Test @Test
public void importWithStarredFieldV1() throws IOException { public void importWithStarredFieldV1() {
String csvText = ""; InputStream inputStream = getClass().getResourceAsStream("catima_v1_starred_field.csv");
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
DBHelper.LoyaltyCardDbIds.STORE + "," +
DBHelper.LoyaltyCardDbIds.NOTE + "," +
DBHelper.LoyaltyCardDbIds.CARD_ID + "," +
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," +
DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," +
DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," +
DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n";
csvText += "1,store,note,12345,AZTEC,1,1,1";
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
@@ -767,6 +711,7 @@ public class ImportExportTest {
assertEquals("store", card.store); assertEquals("store", card.store);
assertEquals("note", card.note); assertEquals("note", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -780,20 +725,8 @@ public class ImportExportTest {
} }
@Test @Test
public void importWithNoStarredFieldV1() throws IOException { public void importWithNoStarredFieldV1() {
String csvText = ""; InputStream inputStream = getClass().getResourceAsStream("catima_v1_no_starred_field.csv");
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
DBHelper.LoyaltyCardDbIds.STORE + "," +
DBHelper.LoyaltyCardDbIds.NOTE + "," +
DBHelper.LoyaltyCardDbIds.CARD_ID + "," +
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," +
DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," +
DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," +
DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n";
csvText += "1,store,note,12345,AZTEC,1,1,";
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
@@ -804,6 +737,7 @@ public class ImportExportTest {
assertEquals("store", card.store); assertEquals("store", card.store);
assertEquals("note", card.note); assertEquals("note", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -817,39 +751,15 @@ public class ImportExportTest {
} }
@Test @Test
public void importWithInvalidStarFieldV1() throws IOException { public void importWithInvalidStarFieldV1() {
String csvText = ""; InputStream inputStream = getClass().getResourceAsStream("catima_v1_invalid_starred_field.csv");
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
DBHelper.LoyaltyCardDbIds.STORE + "," +
DBHelper.LoyaltyCardDbIds.NOTE + "," +
DBHelper.LoyaltyCardDbIds.CARD_ID + "," +
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," +
DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," +
DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," +
DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n";
csvText += "1,store,note,12345,AZTEC,1,1,2";
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
csvText = ""; inputStream = getClass().getResourceAsStream("catima_v1_invalid_starred_field_2.csv");
csvText += DBHelper.LoyaltyCardDbIds.ID + "," +
DBHelper.LoyaltyCardDbIds.STORE + "," +
DBHelper.LoyaltyCardDbIds.NOTE + "," +
DBHelper.LoyaltyCardDbIds.CARD_ID + "," +
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," +
DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," +
DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," +
DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n";
csvText += "1,store,note,12345,AZTEC,1,1,text";
inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
@@ -860,6 +770,7 @@ public class ImportExportTest {
assertEquals("store", card.store); assertEquals("store", card.store);
assertEquals("note", card.note); assertEquals("note", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -875,11 +786,8 @@ public class ImportExportTest {
@Test @Test
public void exportImportV2Zip() throws FileNotFoundException { public void exportImportV2Zip() throws FileNotFoundException {
// Prepare images // Prepare images
BitmapDrawable launcher = (BitmapDrawable) ResourcesCompat.getDrawableForDensity(activity.getResources(), R.mipmap.ic_launcher, DisplayMetrics.DENSITY_XXXHIGH, activity.getTheme()); Bitmap bitmap1 = new LetterBitmap(activity.getApplicationContext(), "1", "1", 12, 64, 64, Color.BLACK, Color.YELLOW).getLetterTile();
BitmapDrawable roundLauncher = (BitmapDrawable) ResourcesCompat.getDrawableForDensity(activity.getResources(), R.mipmap.ic_launcher_round, DisplayMetrics.DENSITY_XXXHIGH, activity.getTheme()); Bitmap bitmap2 = new LetterBitmap(activity.getApplicationContext(), "2", "2", 12, 64, 64, Color.GREEN, Color.WHITE).getLetterTile();
Bitmap launcherBitmap = launcher.getBitmap();
Bitmap roundLauncherBitmap = roundLauncher.getBitmap();
// Set up cards and groups // Set up cards and groups
HashMap<Integer, LoyaltyCard> loyaltyCardHashMap = new HashMap<>(); HashMap<Integer, LoyaltyCard> loyaltyCardHashMap = new HashMap<>();
@@ -889,21 +797,21 @@ public class ImportExportTest {
HashMap<Integer, Bitmap> loyaltyCardIconImages = new HashMap<>(); HashMap<Integer, Bitmap> loyaltyCardIconImages = new HashMap<>();
// Create card 1 // Create card 1
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,0); int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", new Date(1601510400), new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null,0);
loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId));
DBHelper.insertGroup(mDatabase, "One"); DBHelper.insertGroup(mDatabase, "One");
List<Group> groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One")); List<Group> groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One"));
DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, groups); DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, groups);
loyaltyCardGroups.put(loyaltyCardId, groups); loyaltyCardGroups.put(loyaltyCardId, groups);
Utils.saveCardImage(activity.getApplicationContext(), launcherBitmap, loyaltyCardId, ImageLocationType.front); Utils.saveCardImage(activity.getApplicationContext(), bitmap1, loyaltyCardId, ImageLocationType.front);
Utils.saveCardImage(activity.getApplicationContext(), roundLauncherBitmap, loyaltyCardId, ImageLocationType.back); Utils.saveCardImage(activity.getApplicationContext(), bitmap2, loyaltyCardId, ImageLocationType.back);
Utils.saveCardImage(activity.getApplicationContext(), launcherBitmap, loyaltyCardId, ImageLocationType.icon); Utils.saveCardImage(activity.getApplicationContext(), bitmap1, loyaltyCardId, ImageLocationType.icon);
loyaltyCardFrontImages.put(loyaltyCardId, launcherBitmap); loyaltyCardFrontImages.put(loyaltyCardId, bitmap1);
loyaltyCardBackImages.put(loyaltyCardId, roundLauncherBitmap); loyaltyCardBackImages.put(loyaltyCardId, bitmap2);
loyaltyCardIconImages.put(loyaltyCardId, launcherBitmap); loyaltyCardIconImages.put(loyaltyCardId, bitmap1);
// Create card 2 // Create card 2
loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", null, new BigDecimal(0), null, "123456", null, null, 2, 1, null,0); loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", null, null, new BigDecimal(0), null, "123456", null, null, 2, 1, null,0);
loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId));
// Export everything // Export everything
@@ -927,6 +835,7 @@ public class ImportExportTest {
assertEquals(loyaltyCard.id, dbLoyaltyCard.id); assertEquals(loyaltyCard.id, dbLoyaltyCard.id);
assertEquals(loyaltyCard.store, dbLoyaltyCard.store); assertEquals(loyaltyCard.store, dbLoyaltyCard.store);
assertEquals(loyaltyCard.note, dbLoyaltyCard.note); assertEquals(loyaltyCard.note, dbLoyaltyCard.note);
assertEquals(loyaltyCard.validFrom, dbLoyaltyCard.validFrom);
assertEquals(loyaltyCard.expiry, dbLoyaltyCard.expiry); assertEquals(loyaltyCard.expiry, dbLoyaltyCard.expiry);
assertEquals(loyaltyCard.balance, dbLoyaltyCard.balance); assertEquals(loyaltyCard.balance, dbLoyaltyCard.balance);
assertEquals(loyaltyCard.cardId, dbLoyaltyCard.cardId); assertEquals(loyaltyCard.cardId, dbLoyaltyCard.cardId);
@@ -983,32 +892,7 @@ public class ImportExportTest {
@Test @Test
public void importV2CSV() { public void importV2CSV() {
String csvText = "2\n" + InputStream inputStream = getClass().getResourceAsStream("catima_v2.csv");
"\n" +
"_id\n" +
"Health\n" +
"Food\n" +
"Fashion\n" +
"\n" +
"_id,store,note,expiry,balance,balancetype,cardid,barcodeid,headercolor,barcodetype,starstatus\n" +
"1,Card 1,Note 1,1618053234,100,USD,1234,5432,1,QR_CODE,0,\r\n" +
"8,Clothes Store,Note about store,,0,,a,,-5317,,0,\n" +
"2,Department Store,,1618041729,0,,A,,-9977996,,0,\n" +
"3,Grocery Store,\"Multiline note about grocery store\n" +
"\n" +
"with blank line\",,150,,dhd,,-9977996,,0,\n" +
"4,Pharmacy,,,0,,dhshsvshs,,-10902850,,1,\n" +
"5,Restaurant,Note about restaurant here,,0,,98765432,23456,-10902850,CODE_128,0,\n" +
"6,Shoe Store,,,12.50,EUR,a,-5317,,AZTEC,0,\n" +
"\n" +
"cardId,groupId\n" +
"8,Fashion\n" +
"3,Food\n" +
"4,Health\n" +
"5,Food\n" +
"6,Fashion\n";
ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8));
// Import the CSV data // Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
@@ -1037,6 +921,7 @@ public class ImportExportTest {
assertEquals("Card 1", card1.store); assertEquals("Card 1", card1.store);
assertEquals("Note 1", card1.note); assertEquals("Note 1", card1.note);
assertEquals(new Date(1601510400), card1.validFrom);
assertEquals(new Date(1618053234), card1.expiry); assertEquals(new Date(1618053234), card1.expiry);
assertEquals(new BigDecimal("100"), card1.balance); assertEquals(new BigDecimal("100"), card1.balance);
assertEquals(Currency.getInstance("USD"), card1.balanceType); assertEquals(Currency.getInstance("USD"), card1.balanceType);
@@ -1053,6 +938,7 @@ public class ImportExportTest {
assertEquals("Clothes Store", card8.store); assertEquals("Clothes Store", card8.store);
assertEquals("Note about store", card8.note); assertEquals("Note about store", card8.note);
assertEquals(null, card8.validFrom);
assertEquals(null, card8.expiry); assertEquals(null, card8.expiry);
assertEquals(new BigDecimal("0"), card8.balance); assertEquals(new BigDecimal("0"), card8.balance);
assertEquals(null, card8.balanceType); assertEquals(null, card8.balanceType);
@@ -1069,6 +955,7 @@ public class ImportExportTest {
assertEquals("Department Store", card2.store); assertEquals("Department Store", card2.store);
assertEquals("", card2.note); assertEquals("", card2.note);
assertEquals(null, card2.validFrom);
assertEquals(new Date(1618041729), card2.expiry); assertEquals(new Date(1618041729), card2.expiry);
assertEquals(new BigDecimal("0"), card2.balance); assertEquals(new BigDecimal("0"), card2.balance);
assertEquals(null, card2.balanceType); assertEquals(null, card2.balanceType);
@@ -1085,6 +972,7 @@ public class ImportExportTest {
assertEquals("Grocery Store", card3.store); assertEquals("Grocery Store", card3.store);
assertEquals("Multiline note about grocery store\n\nwith blank line", card3.note); assertEquals("Multiline note about grocery store\n\nwith blank line", card3.note);
assertEquals(null, card3.validFrom);
assertEquals(null, card3.expiry); assertEquals(null, card3.expiry);
assertEquals(new BigDecimal("150"), card3.balance); assertEquals(new BigDecimal("150"), card3.balance);
assertEquals(null, card3.balanceType); assertEquals(null, card3.balanceType);
@@ -1101,6 +989,7 @@ public class ImportExportTest {
assertEquals("Pharmacy", card4.store); assertEquals("Pharmacy", card4.store);
assertEquals("", card4.note); assertEquals("", card4.note);
assertEquals(null, card4.validFrom);
assertEquals(null, card4.expiry); assertEquals(null, card4.expiry);
assertEquals(new BigDecimal("0"), card4.balance); assertEquals(new BigDecimal("0"), card4.balance);
assertEquals(null, card4.balanceType); assertEquals(null, card4.balanceType);
@@ -1117,6 +1006,7 @@ public class ImportExportTest {
assertEquals("Restaurant", card5.store); assertEquals("Restaurant", card5.store);
assertEquals("Note about restaurant here", card5.note); assertEquals("Note about restaurant here", card5.note);
assertEquals(null, card5.validFrom);
assertEquals(null, card5.expiry); assertEquals(null, card5.expiry);
assertEquals(new BigDecimal("0"), card5.balance); assertEquals(new BigDecimal("0"), card5.balance);
assertEquals(null, card5.balanceType); assertEquals(null, card5.balanceType);
@@ -1133,6 +1023,7 @@ public class ImportExportTest {
assertEquals("Shoe Store", card6.store); assertEquals("Shoe Store", card6.store);
assertEquals("", card6.note); assertEquals("", card6.note);
assertEquals(null, card6.validFrom);
assertEquals(null, card6.expiry); assertEquals(null, card6.expiry);
assertEquals(new BigDecimal("12.50"), card6.balance); assertEquals(new BigDecimal("12.50"), card6.balance);
assertEquals(Currency.getInstance("EUR"), card6.balanceType); assertEquals(Currency.getInstance("EUR"), card6.balanceType);
@@ -1161,6 +1052,7 @@ public class ImportExportTest {
assertEquals("Hema", card.store); assertEquals("Hema", card.store);
assertEquals("2021-03-24 18:35:08 UTC", card.note); assertEquals("2021-03-24 18:35:08 UTC", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -1173,6 +1065,7 @@ public class ImportExportTest {
assertEquals("test", card.store); assertEquals("test", card.store);
assertEquals("Test\n2021-03-24 18:34:19 UTC", card.note); assertEquals("Test\n2021-03-24 18:34:19 UTC", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -1185,6 +1078,7 @@ public class ImportExportTest {
assertEquals("Albert Heijn", card.store); assertEquals("Albert Heijn", card.store);
assertEquals("Bonus Kaart\n2021-03-24 16:47:47 UTC\nFirst Last", card.note); assertEquals("Bonus Kaart\n2021-03-24 16:47:47 UTC\nFirst Last", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -1197,7 +1091,11 @@ public class ImportExportTest {
} }
@Test @Test
public void importStocard() throws IOException { public void importStocard() {
// FIXME: The provided stocard.zip is a very old export (8 July 2021) manually edited to
// look more like the Stocard files provided by users for #1242. It is not an up-to-date
// export and the test is possibly unreliable. This should be replaced by an up-to-date
// export.
InputStream inputStream = getClass().getResourceAsStream("stocard.zip"); InputStream inputStream = getClass().getResourceAsStream("stocard.zip");
// Import the Stocard data // Import the Stocard data
@@ -1215,6 +1113,7 @@ public class ImportExportTest {
assertEquals("GAMMA", card.store); assertEquals("GAMMA", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -1231,6 +1130,7 @@ public class ImportExportTest {
assertEquals("Air Miles", card.store); assertEquals("Air Miles", card.store);
assertEquals("szjsbs", card.note); assertEquals("szjsbs", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -1245,9 +1145,9 @@ public class ImportExportTest {
card = DBHelper.getLoyaltyCard(mDatabase, 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("", card.store);
assertEquals("63536738-d64b-48ae-aeb8-82761523fa67", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(null, card.balanceType); assertEquals(null, card.balanceType);
@@ -1264,33 +1164,8 @@ public class ImportExportTest {
} }
@Test @Test
public void importVoucherVault() throws IOException, FormatException, JSONException, ParseException { public void importVoucherVault() {
String jsonText = "[\n" + InputStream inputStream = getClass().getResourceAsStream("vouchervault.json");
" {\n" +
" \"uuid\": \"ae1ae525-3f27-481e-853a-8c30b7fa12d8\",\n" +
" \"description\": \"Clothes Store\",\n" +
" \"code\": \"123456\",\n" +
" \"codeType\": \"CODE128\",\n" +
" \"expires\": null,\n" +
" \"removeOnceExpired\": true,\n" +
" \"balance\": null,\n" +
" \"balanceMilliunits\": null,\n" +
" \"color\": \"GREY\"\n" +
" },\n" +
" {\n" +
" \"uuid\": \"29a5d3b3-eace-4311-a15c-4c7e6a010531\",\n" +
" \"description\": \"Department Store\",\n" +
" \"code\": \"26846363\",\n" +
" \"codeType\": \"CODE39\",\n" +
" \"expires\": \"2021-03-26T00:00:00.000\",\n" +
" \"removeOnceExpired\": true,\n" +
" \"balance\": null,\n" +
" \"balanceMilliunits\": 3500,\n" +
" \"color\": \"PURPLE\"\n" +
" }\n" +
"]";
ByteArrayInputStream inputStream = new ByteArrayInputStream(jsonText.getBytes(StandardCharsets.UTF_8));
// Import the Voucher Vault data // Import the Voucher Vault data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.VoucherVault, null); ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.VoucherVault, null);
@@ -1301,6 +1176,7 @@ public class ImportExportTest {
assertEquals("Clothes Store", card.store); assertEquals("Clothes Store", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
assertEquals(new BigDecimal("0"), card.balance); assertEquals(new BigDecimal("0"), card.balance);
assertEquals(Currency.getInstance("USD"), card.balanceType); assertEquals(Currency.getInstance("USD"), card.balanceType);
@@ -1314,6 +1190,7 @@ public class ImportExportTest {
assertEquals("Department Store", card.store); assertEquals("Department Store", card.store);
assertEquals("", card.note); assertEquals("", card.note);
assertEquals(null, card.validFrom);
assertEquals(new Date(1616716800000L), card.expiry); assertEquals(new Date(1616716800000L), card.expiry);
assertEquals(new BigDecimal("3.5"), card.balance); assertEquals(new BigDecimal("3.5"), card.balance);
assertEquals(Currency.getInstance("USD"), card.balanceType); assertEquals(Currency.getInstance("USD"), card.balanceType);

View File

@@ -12,7 +12,6 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.io.InvalidObjectException; import java.io.InvalidObjectException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
@@ -25,7 +24,6 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class ImportURITest { public class ImportURITest {
private ImportURIHelper importURIHelper; private ImportURIHelper importURIHelper;
private SQLiteDatabase mDatabase; private SQLiteDatabase mDatabase;
@@ -42,7 +40,7 @@ public class ImportURITest {
// Generate card // Generate card
Date date = new Date(); Date date = new Date();
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,0); DBHelper.insertLoyaltyCard(mDatabase, "store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null,0);
// Get card // Get card
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -56,6 +54,7 @@ public class ImportURITest {
// Compare everything // Compare everything
assertEquals(card.store, parsedCard.store); assertEquals(card.store, parsedCard.store);
assertEquals(card.note, parsedCard.note); assertEquals(card.note, parsedCard.note);
assertEquals(card.validFrom, parsedCard.validFrom);
assertEquals(card.expiry, parsedCard.expiry); assertEquals(card.expiry, parsedCard.expiry);
assertEquals(card.balance, parsedCard.balance); assertEquals(card.balance, parsedCard.balance);
assertEquals(card.balanceType, parsedCard.balanceType); assertEquals(card.balanceType, parsedCard.balanceType);
@@ -71,7 +70,7 @@ public class ImportURITest {
@Test @Test
public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, UnsupportedEncodingException { public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, UnsupportedEncodingException {
// Generate card // Generate card
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,0); DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null,0);
// Get card // Get card
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -85,6 +84,7 @@ public class ImportURITest {
// Compare everything // Compare everything
assertEquals(card.store, parsedCard.store); assertEquals(card.store, parsedCard.store);
assertEquals(card.note, parsedCard.note); assertEquals(card.note, parsedCard.note);
assertEquals(card.validFrom, parsedCard.validFrom);
assertEquals(card.expiry, parsedCard.expiry); assertEquals(card.expiry, parsedCard.expiry);
assertEquals(card.balance, parsedCard.balance); assertEquals(card.balance, parsedCard.balance);
assertEquals(card.balanceType, parsedCard.balanceType); assertEquals(card.balanceType, parsedCard.balanceType);
@@ -109,10 +109,11 @@ public class ImportURITest {
@Test @Test
public void failToParseBadData() { public void failToParseBadData() {
String[] urls = new String[3]; String[] urls = new String[4];
urls[0] = "https://brarcher.github.io/loyalty-card-locker/share?stare=store&note=note&cardid=12345&barcodetype=ITF&headercolor=-416706"; urls[0] = "https://brarcher.github.io/loyalty-card-locker/share?stare=store&note=note&cardid=12345&barcodetype=ITF&headercolor=-416706";
urls[1] = "https://thelastproject.github.io/Catima/share#stare%3Dstore%26note%3Dnote%26balance%3D0%26cardid%3D12345%26barcodetype%3DITF%26headercolor%3D-416706"; urls[1] = "https://thelastproject.github.io/Catima/share#stare%3Dstore%26note%3Dnote%26balance%3D0%26cardid%3D12345%26barcodetype%3DITF%26headercolor%3D-416706";
urls[2] = "https://catima.app/share#stare%3Dstore%26note%3Dnote%26balance%3D0%26cardid%3D12345%26barcodetype%3DITF%26headercolor%3D-416706"; urls[2] = "https://catima.app/share#stare%3Dstore%26note%3Dnote%26balance%3D0%26cardid%3D12345%26barcodetype%3DITF%26headercolor%3D-416706";
urls[3] = "https://catima.app/share#";
for (String url : urls) { for (String url : urls) {
try { try {
@@ -143,6 +144,7 @@ public class ImportURITest {
// Compare everything // Compare everything
assertEquals("store", parsedCard.store); assertEquals("store", parsedCard.store);
assertEquals("note", parsedCard.note); assertEquals("note", parsedCard.note);
assertEquals(null, parsedCard.validFrom);
assertEquals(null, parsedCard.expiry); assertEquals(null, parsedCard.expiry);
assertEquals(new BigDecimal("0"), parsedCard.balance); assertEquals(new BigDecimal("0"), parsedCard.balance);
assertEquals(null, parsedCard.balanceType); assertEquals(null, parsedCard.balanceType);

View File

@@ -15,7 +15,6 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLog; import org.robolectric.shadows.ShadowLog;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -32,7 +31,6 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class LoyaltyCardCursorAdapterTest { public class LoyaltyCardCursorAdapterTest {
private Activity activity; private Activity activity;
private SQLiteDatabase mDatabase; private SQLiteDatabase mDatabase;
@@ -62,9 +60,10 @@ public class LoyaltyCardCursorAdapterTest {
return viewHolder.itemView; return viewHolder.itemView;
} }
private void checkView(final View view, final String store, final String note, final String expiry, final String balance, boolean checkFontSizes) { private void checkView(final View view, final String store, final String note, final String validFrom, final String expiry, final String balance, boolean checkFontSizes) {
final TextView storeField = view.findViewById(R.id.store); final TextView storeField = view.findViewById(R.id.store);
final TextView noteField = view.findViewById(R.id.note); final TextView noteField = view.findViewById(R.id.note);
final TextView validFromField = view.findViewById(R.id.validFrom);
final TextView expiryField = view.findViewById(R.id.expiry); final TextView expiryField = view.findViewById(R.id.expiry);
final TextView balanceField = view.findViewById(R.id.balance); final TextView balanceField = view.findViewById(R.id.balance);
@@ -75,6 +74,7 @@ public class LoyaltyCardCursorAdapterTest {
assertEquals(mediumFontSize, (int) storeField.getTextSize()); assertEquals(mediumFontSize, (int) storeField.getTextSize());
assertEquals(smallFontSize, (int) noteField.getTextSize()); assertEquals(smallFontSize, (int) noteField.getTextSize());
assertEquals(smallFontSize, (int) validFromField.getTextSize());
assertEquals(smallFontSize, (int) expiryField.getTextSize()); assertEquals(smallFontSize, (int) expiryField.getTextSize());
} }
@@ -86,6 +86,13 @@ public class LoyaltyCardCursorAdapterTest {
assertEquals(View.GONE, noteField.getVisibility()); assertEquals(View.GONE, noteField.getVisibility());
} }
if (!validFrom.isEmpty()) {
assertEquals(View.VISIBLE, validFromField.getVisibility());
assertEquals(validFrom, validFromField.getText().toString());
} else {
assertEquals(View.GONE, validFromField.getVisibility());
}
if (!expiry.isEmpty()) { if (!expiry.isEmpty()) {
assertEquals(View.VISIBLE, expiryField.getVisibility()); assertEquals(View.VISIBLE, expiryField.getVisibility());
assertEquals(expiry, expiryField.getText().toString()); assertEquals(expiry, expiryField.getText().toString());
@@ -104,7 +111,7 @@ public class LoyaltyCardCursorAdapterTest {
@Test @Test
public void TestCursorAdapterEmptyNote() { public void TestCursorAdapterEmptyNote() {
DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
@@ -112,14 +119,14 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", false); checkView(view, card.store, card.note, "", "", "", false);
cursor.close(); cursor.close();
} }
@Test @Test
public void TestCursorAdapterWithNote() { public void TestCursorAdapterWithNote() {
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
@@ -127,17 +134,17 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", false); checkView(view, card.store, card.note, "", "", "", false);
cursor.close(); cursor.close();
} }
@Test @Test
public void TestCursorAdapterFontSizes() { public void TestCursorAdapterFontSizes() {
Date expiryDate = new Date(); Date date = new Date();
String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate); String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(date);
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(mDatabase, "store", "note", date, date, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
@@ -146,21 +153,21 @@ public class LoyaltyCardCursorAdapterTest {
setFontScale(50); setFontScale(50);
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, dateString, "", true); checkView(view, card.store, card.note, dateString, dateString, "", true);
setFontScale(200); setFontScale(200);
view = createView(cursor); view = createView(cursor);
checkView(view, card.store, card.note, dateString, "", true); checkView(view, card.store, card.note, dateString, dateString, "", true);
cursor.close(); cursor.close();
} }
@Test @Test
public void TestCursorAdapterStarring() { public void TestCursorAdapterStarring() {
assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,1)); assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeA", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,1));
assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,1)); assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeB", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,1));
assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0)); assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeC", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0));
assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0)); assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeD", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0));
assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -208,7 +215,7 @@ public class LoyaltyCardCursorAdapterTest {
@Test @Test
public void TestCursorAdapter0Points() { public void TestCursorAdapter0Points() {
DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
@@ -216,14 +223,14 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", false); checkView(view, card.store, card.note, "", "", "", false);
cursor.close(); cursor.close();
} }
@Test @Test
public void TestCursorAdapter0EUR() { public void TestCursorAdapter0EUR() {
DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
@@ -231,14 +238,14 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", false); checkView(view, card.store, card.note, "", "", "", false);
cursor.close(); cursor.close();
} }
@Test @Test
public void TestCursorAdapter100Points() { public void TestCursorAdapter100Points() {
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
@@ -246,14 +253,14 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "100 points", false); checkView(view, card.store, card.note, "", "", "100 points", false);
cursor.close(); cursor.close();
} }
@Test @Test
public void TestCursorAdapter10USD() { public void TestCursorAdapter10USD() {
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
@@ -261,7 +268,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "$10.00", false); checkView(view, card.store, card.note, "", "", "$10.00", false);
cursor.close(); cursor.close();
} }

View File

@@ -19,6 +19,8 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.View; import android.view.View;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageButton; import android.widget.ImageButton;
@@ -51,6 +53,8 @@ import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Currency; import java.util.Currency;
import java.util.Date; import java.util.Date;
@@ -60,6 +64,7 @@ import androidx.preference.PreferenceManager;
import static android.os.Looper.getMainLooper; import static android.os.Looper.getMainLooper;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
@@ -67,7 +72,6 @@ import static org.junit.Assert.assertTrue;
import static org.robolectric.Shadows.shadowOf; import static org.robolectric.Shadows.shadowOf;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class LoyaltyCardViewActivityTest { public class LoyaltyCardViewActivityTest {
private final String BARCODE_DATA = "428311627547"; private final String BARCODE_DATA = "428311627547";
private final CatimaBarcode BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A); private final CatimaBarcode BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A);
@@ -121,6 +125,7 @@ public class LoyaltyCardViewActivityTest {
*/ */
private void saveLoyaltyCardWithArguments(final Activity activity, private void saveLoyaltyCardWithArguments(final Activity activity,
final String store, final String note, final String store, final String note,
final String validFrom,
final String expiry, final String expiry,
final BigDecimal balance, final BigDecimal balance,
final String balanceType, final String balanceType,
@@ -137,6 +142,7 @@ public class LoyaltyCardViewActivityTest {
final EditText storeField = activity.findViewById(R.id.storeNameEdit); final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit); final EditText noteField = activity.findViewById(R.id.noteEdit);
final TextInputLayout validFromView = activity.findViewById(R.id.validFromView);
final TextInputLayout expiryView = activity.findViewById(R.id.expiryView); final TextInputLayout expiryView = activity.findViewById(R.id.expiryView);
final EditText balanceView = activity.findViewById(R.id.balanceField); final EditText balanceView = activity.findViewById(R.id.balanceField);
final EditText balanceCurrencyField = activity.findViewById(R.id.balanceCurrencyField); final EditText balanceCurrencyField = activity.findViewById(R.id.balanceCurrencyField);
@@ -146,6 +152,7 @@ public class LoyaltyCardViewActivityTest {
storeField.setText(store); storeField.setText(store);
noteField.setText(note); noteField.setText(note);
validFromView.setTag(validFrom);
expiryView.setTag(expiry); expiryView.setTag(expiry);
balanceView.setText(balance.toPlainString()); balanceView.setText(balance.toPlainString());
balanceCurrencyField.setText(balanceType); balanceCurrencyField.setText(balanceType);
@@ -164,6 +171,13 @@ public class LoyaltyCardViewActivityTest {
assertEquals(note, card.note); assertEquals(note, card.note);
assertEquals(balance, card.balance); assertEquals(balance, card.balance);
// The special "Any date" string shouldn't actually be written to the loyalty card
if (validFrom.equals(activity.getApplicationContext().getString(R.string.anyDate))) {
assertEquals(null, card.validFrom);
} else {
assertEquals(DateFormat.getDateInstance().parse(validFrom), card.validFrom);
}
// The special "Never" string shouldn't actually be written to the loyalty card // The special "Never" string shouldn't actually be written to the loyalty card
if (expiry.equals(activity.getApplicationContext().getString(R.string.never))) { if (expiry.equals(activity.getApplicationContext().getString(R.string.never))) {
assertEquals(null, card.expiry); assertEquals(null, card.expiry);
@@ -289,11 +303,11 @@ public class LoyaltyCardViewActivityTest {
} }
private void checkAllFields(final Activity activity, ViewMode mode, private void checkAllFields(final Activity activity, ViewMode mode,
final String store, final String note, final String expiryString, final String store, final String note, final String validFromString,
final String balanceString, final String balanceTypeString, final String expiryString, final String balanceString,
final String cardId, final String barcodeId, final String balanceTypeString, final String cardId,
final String barcodeType, final Bitmap frontImage, final String barcodeId, final String barcodeType,
final Bitmap backImage) { final Bitmap frontImage, final Bitmap backImage) {
if (mode == ViewMode.VIEW_CARD) { if (mode == ViewMode.VIEW_CARD) {
checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId, FieldTypeView.TextView); checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId, FieldTypeView.TextView);
} else { } else {
@@ -301,6 +315,7 @@ public class LoyaltyCardViewActivityTest {
checkFieldProperties(activity, R.id.storeNameEdit, editVisibility, store, FieldTypeView.TextView); checkFieldProperties(activity, R.id.storeNameEdit, editVisibility, store, FieldTypeView.TextView);
checkFieldProperties(activity, R.id.noteEdit, editVisibility, note, FieldTypeView.TextView); checkFieldProperties(activity, R.id.noteEdit, editVisibility, note, FieldTypeView.TextView);
checkFieldProperties(activity, R.id.validFromView, editVisibility, validFromString, FieldTypeView.TextInputLayout);
checkFieldProperties(activity, R.id.expiryView, editVisibility, expiryString, FieldTypeView.TextInputLayout); checkFieldProperties(activity, R.id.expiryView, editVisibility, expiryString, FieldTypeView.TextInputLayout);
checkFieldProperties(activity, R.id.balanceField, editVisibility, balanceString, FieldTypeView.TextView); checkFieldProperties(activity, R.id.balanceField, editVisibility, balanceString, FieldTypeView.TextView);
checkFieldProperties(activity, R.id.balanceCurrencyField, editVisibility, balanceTypeString, FieldTypeView.TextView); checkFieldProperties(activity, R.id.balanceCurrencyField, editVisibility, balanceTypeString, FieldTypeView.TextView);
@@ -328,7 +343,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Check default settings // Check default settings
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
} }
@Test @Test
@@ -355,7 +370,7 @@ public class LoyaltyCardViewActivityTest {
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
if (!newCard) { if (!newCard) {
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
} }
activityController.start(); activityController.start();
@@ -365,11 +380,12 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Check default settings // Check default settings
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.prettyName(), null, null);
// Change everything // Change everything
final EditText storeField = activity.findViewById(R.id.storeNameEdit); final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit); final EditText noteField = activity.findViewById(R.id.noteEdit);
final EditText validFromField = activity.findViewById(R.id.validFromField);
final EditText expiryField = activity.findViewById(R.id.expiryField); final EditText expiryField = activity.findViewById(R.id.expiryField);
final EditText balanceField = activity.findViewById(R.id.balanceField); final EditText balanceField = activity.findViewById(R.id.balanceField);
final EditText balanceTypeField = activity.findViewById(R.id.balanceCurrencyField); final EditText balanceTypeField = activity.findViewById(R.id.balanceCurrencyField);
@@ -380,13 +396,15 @@ public class LoyaltyCardViewActivityTest {
final ImageView backImageView = activity.findViewById(R.id.backImage); final ImageView backImageView = activity.findViewById(R.id.backImage);
Currency currency = Currency.getInstance("EUR"); Currency currency = Currency.getInstance("EUR");
Date validFromDate = Date.from(Instant.now().minus(20, ChronoUnit.DAYS));
Date expiryDate = new Date(); Date expiryDate = new Date();
Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle); Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle);
Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_done); Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_done);
storeField.setText("correct store"); storeField.setText("correct store");
noteField.setText("correct note"); noteField.setText("correct note");
LoyaltyCardEditActivity.formatExpiryField(context, expiryField, expiryDate); LoyaltyCardEditActivity.formatDateField(context, validFromField, validFromDate);
LoyaltyCardEditActivity.formatDateField(context, expiryField, expiryDate);
balanceField.setText("100"); balanceField.setText("100");
balanceTypeField.setText(currency.getSymbol()); balanceTypeField.setText(currency.getSymbol());
cardIdField.setText("12345678"); cardIdField.setText("12345678");
@@ -398,7 +416,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Check if changed // Check if changed
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap); checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap);
// Resume // Resume
activityController.pause(); activityController.pause();
@@ -407,7 +425,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Check if no changes lost // Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap); checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap);
// Rotate to landscape // Rotate to landscape
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
@@ -415,7 +433,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Check if no changes lost // Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap); checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap);
// Rotate to portrait // Rotate to portrait
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
@@ -423,7 +441,7 @@ public class LoyaltyCardViewActivityTest {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// Check if no changes lost // Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap); checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap);
} }
} }
@@ -437,7 +455,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
} }
@Test @Test
@@ -495,18 +513,18 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
// Complete barcode capture successfully // Complete barcode capture successfully
captureBarcodeWithResult(activity, true); captureBarcodeWithResult(activity, true);
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Save and check the loyalty card // Save and check the loyalty card
saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.never), new BigDecimal("0"), context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.name(), true); saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), new BigDecimal("0"), context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.name(), true);
} }
@Test @Test
@@ -519,7 +537,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
// Complete barcode capture in failure // Complete barcode capture in failure
captureBarcodeWithResult(activity, false); captureBarcodeWithResult(activity, false);
@@ -527,7 +545,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
} }
@Test @Test
@@ -540,13 +558,13 @@ public class LoyaltyCardViewActivityTest {
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get(); LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
// Complete barcode capture successfully // Complete barcode capture successfully
captureBarcodeWithResult(activity, true); captureBarcodeWithResult(activity, true);
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
// Cancel the loyalty card creation // Cancel the loyalty card creation
assertEquals(false, activity.isFinishing()); assertEquals(false, activity.isFinishing());
@@ -591,13 +609,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
database.close(); database.close();
} }
@@ -609,13 +627,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", null, "0", context.getString(R.string.points), BARCODE_DATA, null, BARCODE_TYPE.toString(), null, null); checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", null, null, "0", context.getString(R.string.points), BARCODE_DATA, null, BARCODE_TYPE.toString(), null, null);
database.close(); database.close();
} }
@@ -627,19 +645,19 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Complete barcode capture successfully // Complete barcode capture successfully
captureBarcodeWithResult(activity, true); captureBarcodeWithResult(activity, true);
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
database.close(); database.close();
} }
@@ -651,19 +669,19 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Complete barcode capture successfully // Complete barcode capture successfully
captureBarcodeWithResult(activity, true); captureBarcodeWithResult(activity, true);
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
// Cancel the loyalty card creation // Cancel the loyalty card creation
assertEquals(false, activity.isFinishing()); assertEquals(false, activity.isFinishing());
@@ -689,13 +707,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Set date to today // Set date to today
MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField); MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField);
@@ -709,7 +727,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), 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);
database.close(); database.close();
} }
@@ -721,19 +739,19 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Set date to never // Set date to never
MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField); MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField);
expiryField.setText(expiryField.getAdapter().getItem(0).toString(), false); expiryField.setText(expiryField.getAdapter().getItem(0).toString(), false);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), 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);
database.close(); database.close();
} }
@@ -745,13 +763,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Set balance to 10 points // Set balance to 10 points
EditText balanceField = activity.findViewById(R.id.balanceField); EditText balanceField = activity.findViewById(R.id.balanceField);
@@ -780,7 +798,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
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); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "10.00", "", EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE.toString(), null, null);
database.close(); database.close();
} }
@@ -795,13 +813,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "10.00", "$", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "10.00", "$", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
@@ -823,7 +841,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", "", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", "", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
database.close(); database.close();
} }
@@ -835,13 +853,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Change barcode ID // Change barcode ID
EditText barcodeField = activity.findViewById(R.id.barcodeIdField); EditText barcodeField = activity.findViewById(R.id.barcodeIdField);
@@ -854,7 +872,7 @@ public class LoyaltyCardViewActivityTest {
AlertDialog updateBarcodeIdDialog = (AlertDialog) (ShadowDialog.getLatestDialog()); AlertDialog updateBarcodeIdDialog = (AlertDialog) (ShadowDialog.getLatestDialog());
assertNull(updateBarcodeIdDialog); assertNull(updateBarcodeIdDialog);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
database.close(); database.close();
} }
@@ -866,13 +884,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
// Change card ID // Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView); EditText cardIdField = activity.findViewById(R.id.cardIdView);
@@ -887,7 +905,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
database.close(); database.close();
} }
@@ -899,13 +917,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
// Change card ID // Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView); EditText cardIdField = activity.findViewById(R.id.cardIdView);
@@ -923,7 +941,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null);
database.close(); database.close();
} }
@@ -935,13 +953,13 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
// Change card ID // Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView); EditText cardIdField = activity.findViewById(R.id.cardIdView);
@@ -959,7 +977,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.prettyName(), null, null);
database.close(); database.close();
} }
@@ -970,7 +988,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
@@ -1015,7 +1033,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
@@ -1034,7 +1052,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
@@ -1053,14 +1071,14 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
// Save and check the loyalty card // 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); saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.anyDate), 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);
database.close(); database.close();
} }
@@ -1071,14 +1089,14 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
// Save and check the loyalty card // 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); saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.anyDate), 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);
database.close(); database.close();
} }
@@ -1090,25 +1108,25 @@ public class LoyaltyCardViewActivityTest {
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
// First check if the card is as expected // First check if the card is as expected
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null);
// Complete empty barcode selection successfully // Complete empty barcode selection successfully
selectBarcodeWithResult(activity, BARCODE_DATA, "", true); selectBarcodeWithResult(activity, BARCODE_DATA, "", true);
activityController.resume(); activityController.resume();
// Check if the barcode type is NO_BARCODE as expected // Check if the barcode type is NO_BARCODE as expected
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
assertEquals(View.GONE, activity.findViewById(R.id.barcodeLayout).getVisibility()); assertEquals(View.GONE, activity.findViewById(R.id.barcodeLayout).getVisibility());
// Check if the special NO_BARCODE string doesn't get saved // 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); saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.anyDate), 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);
database.close(); database.close();
} }
@@ -1119,7 +1137,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
final int LARGE_FONT_SIZE = 40; final int LARGE_FONT_SIZE = 40;
@@ -1153,7 +1171,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
@@ -1187,13 +1205,13 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
activityController.resume(); activityController.resume();
assertEquals(false, activity.isFinishing()); assertFalse(activity.isFinishing());
View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout); View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout);
BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar); BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar);
@@ -1204,9 +1222,9 @@ public class LoyaltyCardViewActivityTest {
SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler); SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler);
// Android should not be in fullscreen mode // Android should not be in fullscreen mode
int uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility(); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
// Elements should be visible (except minimize button and scaler) // Elements should be visible (except minimize button and scaler)
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility()); assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
@@ -1222,9 +1240,9 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Android should be in fullscreen mode // Android should be in fullscreen mode
uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility(); assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
assertEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions); assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior());
// Elements should not be visible (except minimize button and scaler) // Elements should not be visible (except minimize button and scaler)
assertEquals(View.GONE, collapsingToolbarLayout.getVisibility()); assertEquals(View.GONE, collapsingToolbarLayout.getVisibility());
@@ -1238,9 +1256,11 @@ public class LoyaltyCardViewActivityTest {
// Clicking minimize button should deactivate fullscreen mode // Clicking minimize button should deactivate fullscreen mode
minimizeButton.performClick(); minimizeButton.performClick();
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility()); assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, maximizeButton.getVisibility()); assertEquals(View.VISIBLE, maximizeButton.getVisibility());
@@ -1252,9 +1272,11 @@ public class LoyaltyCardViewActivityTest {
// Another click back to fullscreen // Another click back to fullscreen
maximizeButton.performClick(); maximizeButton.performClick();
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();
assertEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions); assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
assertEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.GONE, collapsingToolbarLayout.getVisibility()); assertEquals(View.GONE, collapsingToolbarLayout.getVisibility());
assertEquals(View.GONE, bottomAppBar.getVisibility()); assertEquals(View.GONE, bottomAppBar.getVisibility());
assertEquals(View.GONE, maximizeButton.getVisibility()); assertEquals(View.GONE, maximizeButton.getVisibility());
@@ -1266,9 +1288,11 @@ public class LoyaltyCardViewActivityTest {
// In full screen mode, back button should disable fullscreen // In full screen mode, back button should disable fullscreen
activity.onBackPressed(); activity.onBackPressed();
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY, uiOptions); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility()); assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, maximizeButton.getVisibility()); assertEquals(View.VISIBLE, maximizeButton.getVisibility());
@@ -1280,7 +1304,7 @@ public class LoyaltyCardViewActivityTest {
// Pressing back when not in full screen should finish activity // Pressing back when not in full screen should finish activity
activity.onBackPressed(); activity.onBackPressed();
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
assertEquals(true, activity.isFinishing()); assertTrue(activity.isFinishing());
database.close(); database.close();
} }
@@ -1291,7 +1315,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null,0);
activityController.start(); activityController.start();
activityController.visible(); activityController.visible();
@@ -1331,7 +1355,7 @@ public class LoyaltyCardViewActivityTest {
public void importCard() { public void importCard() {
Date date = new Date(); Date date = new Date();
Uri importUri = Uri.parse("https://catima.app/share#store%3DExample%2BStore%26note%3D%26expiry%3D" + date.getTime() + "%26balance%3D10.00%26balancetype%3DUSD%26cardid%3D123456%26barcodetype%3DAZTEC%26headercolor%3D-416706"); Uri importUri = Uri.parse("https://catima.app/share#store%3DExample%2BStore%26note%3D%26validfrom%3D" + date.getTime() + "%26expiry%3D" + date.getTime() + "%26balance%3D10.00%26balancetype%3DUSD%26cardid%3D123456%26barcodetype%3DAZTEC%26headercolor%3D-416706");
Intent intent = new Intent(); Intent intent = new Intent();
intent.setData(importUri); intent.setData(importUri);
@@ -1347,7 +1371,7 @@ public class LoyaltyCardViewActivityTest {
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", DateFormat.getDateInstance(DateFormat.LONG).format(date), "10.00", "$", "123456", context.getString(R.string.sameAsCardId), "Aztec", null, null); checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", DateFormat.getDateInstance(DateFormat.LONG).format(date), DateFormat.getDateInstance(DateFormat.LONG).format(date), "10.00", "$", "123456", context.getString(R.string.sameAsCardId), "Aztec", null, null);
assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor()); assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor());
} }
@@ -1367,7 +1391,7 @@ public class LoyaltyCardViewActivityTest {
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), "Aztec", null, null); checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), "Aztec", null, null);
assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor()); assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor());
} }
} }

View File

@@ -33,7 +33,6 @@ import static org.junit.Assert.assertNotNull;
import static org.robolectric.Shadows.shadowOf; import static org.robolectric.Shadows.shadowOf;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(sdk = 23)
public class MainActivityTest { public class MainActivityTest {
private SharedPreferences prefs; private SharedPreferences prefs;
@@ -96,7 +95,7 @@ public class MainActivityTest {
assertEquals(0, list.getAdapter().getItemCount()); assertEquals(0, list.getAdapter().getItemCount());
SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
assertEquals(View.VISIBLE, helpSection.getVisibility()); assertEquals(View.VISIBLE, helpSection.getVisibility());
assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility());
@@ -131,10 +130,10 @@ public class MainActivityTest {
assertEquals(0, list.getAdapter().getItemCount()); assertEquals(0, list.getAdapter().getItemCount());
SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "storeB", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
DBHelper.insertLoyaltyCard(database, "storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "storeA", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
DBHelper.insertLoyaltyCard(database, "storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0); DBHelper.insertLoyaltyCard(database, "storeD", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0);
DBHelper.insertLoyaltyCard(database, "storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0); DBHelper.insertLoyaltyCard(database, "storeC", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0);
assertEquals(View.VISIBLE, helpSection.getVisibility()); assertEquals(View.VISIBLE, helpSection.getVisibility());
assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility());
@@ -225,8 +224,8 @@ public class MainActivityTest {
TabLayout groupTabs = mainActivity.findViewById(R.id.groups); TabLayout groupTabs = mainActivity.findViewById(R.id.groups);
SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); 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,0); DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
DBHelper.insertGroup(database, "Group one"); DBHelper.insertGroup(database, "Group one");
List<Group> groups = new ArrayList<>(); List<Group> groups = new ArrayList<>();

View File

@@ -0,0 +1,2 @@
_id,store,note,cardid,barcodetype,headercolor,headertextcolor,starstatus
1,store,note,12345,AZTEC,,,0
1 _id store note cardid barcodetype headercolor headertextcolor starstatus
2 1 store note 12345 AZTEC 0

View File

@@ -0,0 +1,2 @@
_id,store,note,cardid,barcodetype,headercolor,headertextcolor,starstatus
1,store,note,12345,type,not a number,invalid,0
1 _id store note cardid barcodetype headercolor headertextcolor starstatus
2 1 store note 12345 type not a number invalid 0

View File

@@ -0,0 +1,2 @@
_id,store,note,cardid,barcodetype,headercolor,headertextcolor,starstatus
1,store,note,12345,AZTEC,1,1,2
1 _id store note cardid barcodetype headercolor headertextcolor starstatus
2 1 store note 12345 AZTEC 1 1 2

View File

@@ -0,0 +1,2 @@
_id,store,note,cardid,barcodetype,headercolor,headertextcolor,starstatus
1,store,note,12345,AZTEC,1,1,text
1 _id store note cardid barcodetype headercolor headertextcolor starstatus
2 1 store note 12345 AZTEC 1 1 text

View File

@@ -0,0 +1,2 @@
_id,store,note,cardid,barcodetype,headercolor,headertextcolor,starstatus
1,store,note,12345,,1,1,0
1 _id store note cardid barcodetype headercolor headertextcolor starstatus
2 1 store note 12345 1 1 0

View File

@@ -0,0 +1,2 @@
_id,store,note,cardid,barcodetype,starstatus
1,store,note,12345,AZTEC,0
1 _id store note cardid barcodetype starstatus
2 1 store note 12345 AZTEC 0

View File

@@ -0,0 +1,2 @@
_id,store,note,cardid,barcodetype,headercolor,headertextcolor,starstatus
1,store,note,12345,AZTEC,1,1,
1 _id store note cardid barcodetype headercolor headertextcolor starstatus
2 1 store note 12345 AZTEC 1 1

View File

@@ -0,0 +1,2 @@
_id,store,note,cardid,barcodetype,headercolor,headertextcolor,starstatus
1,store,note,12345,AZTEC,1,1,1
1 _id store note cardid barcodetype headercolor headertextcolor starstatus
2 1 store note 12345 AZTEC 1 1 1

View File

@@ -0,0 +1,24 @@
2
_id
Health
Food
Fashion
_id,store,note,validfrom,expiry,balance,balancetype,cardid,barcodeid,headercolor,barcodetype,starstatus
1,Card 1,Note 1,1601510400,1618053234,100,USD,1234,5432,1,QR_CODE,0,
8,Clothes Store,Note about store,,,0,,a,,-5317,,0,
2,Department Store,,,1618041729,0,,A,,-9977996,,0,
3,Grocery Store,"Multiline note about grocery store
with blank line",,,150,,dhd,,-9977996,,0,
4,Pharmacy,,,,0,,dhshsvshs,,-10902850,,1,
5,Restaurant,Note about restaurant here,,,0,,98765432,23456,-10902850,CODE_128,0,
6,Shoe Store,,,,12.50,EUR,a,-5317,,AZTEC,0,
cardId,groupId
8,Fashion
3,Food
4,Health
5,Food
6,Fashion
1 2
2 _id
3 Health
4 Food
5 Fashion
6 _id store note validfrom expiry balance balancetype cardid barcodeid headercolor barcodetype starstatus
7 1 Card 1 Note 1 1601510400 1618053234 100 USD 1234 5432 1 QR_CODE 0
8 8 Clothes Store Note about store 0 a -5317 0
9 2 Department Store 1618041729 0 A -9977996 0
10 3 Grocery Store Multiline note about grocery store with blank line 150 dhd -9977996 0
11 4 Pharmacy 0 dhshsvshs -10902850 1
12 5 Restaurant Note about restaurant here 0 98765432 23456 -10902850 CODE_128 0
13 6 Shoe Store 12.50 EUR a -5317 AZTEC 0
14 cardId groupId
15 8 Fashion
16 3 Food
17 4 Health
18 5 Food
19 6 Fashion

View File

Binary file not shown.

View File

@@ -0,0 +1,24 @@
[
{
"uuid": "ae1ae525-3f27-481e-853a-8c30b7fa12d8",
"description": "Clothes Store",
"code": "123456",
"codeType": "CODE128",
"expires": null,
"removeOnceExpired": true,
"balance": null,
"balanceMilliunits": null,
"color": "GREY"
},
{
"uuid": "29a5d3b3-eace-4311-a15c-4c7e6a010531",
"description": "Department Store",
"code": "26846363",
"codeType": "CODE39",
"expires": "2021-03-26T00:00:00.000",
"removeOnceExpired": true,
"balance": null,
"balanceMilliunits": 3500,
"color": "PURPLE"
}
]

View File

@@ -1,8 +1,8 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins { plugins {
id 'com.android.application' version '7.0.4' apply false id 'com.android.application' version '8.0.0' apply false
id 'com.github.spotbugs' version "4.7.5" apply false id 'com.github.spotbugs' version "5.0.14" apply false
} }
allprojects { allprojects {

View File

@@ -11,13 +11,13 @@ if [ -z "${ANDROID_SDK_ROOT:-}" ]; then
fi fi
if [ -z "${JAVA_HOME:-}" ]; then if [ -z "${JAVA_HOME:-}" ]; then
echo "JAVA_HOME is not set, setting to Java 11 (like F-Droid)" echo "JAVA_HOME is not set, setting to Java 17"
if [ -f "/etc/debian_version" ]; then if [ -f "/etc/debian_version" ]; then
echo "Debian-based distro, Java 11 is /usr/lib/jvm/java-11-openjdk-amd64" echo "Debian-based distro, Java 17 is /usr/lib/jvm/java-17-openjdk-amd64"
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
else else
echo "Not Debian-based, assuming Fedora and setting Java 11 as /usr/lib/jvm/java-11-openjdk" echo "Not Debian-based, assuming Fedora and setting Java 17 as /usr/lib/jvm/java-17-openjdk"
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
fi fi
fi fi

View File

@@ -0,0 +1,2 @@
- Podpora nastavení začátku platnosti karty
- Oprava importu Stocard (změnil se formát exportu Stocard)

View File

@@ -0,0 +1 @@
- Použít barvy motivu Material You na více zařízeních (aktualizace knihovny Google)

View File

@@ -1,2 +1,2 @@
- Dlouhé kliknutí na kartu vyvolá možnost zkopírovat ID karty do schránky. (pull #49 (https://github.com/brarcher/loyalty-card-locker/issues/49)) - Dlouhé kliknutí na kartu vyvolá možnost zkopírovat ID karty do schránky. (pull #49 (https://github.com/brarcher/loyalty-card-locker/issues/49))
- Tlačítko Zpět v zobrazení Vstup/Export nyní funguje a přesune uživatele do hlavního zobrazení - Tlačítko Zpět v zobrazení Import/Export nyní funguje a přesune uživatele do hlavního zobrazení

View File

@@ -1 +1,4 @@
- Bild durch langes Drücken in der Galerie öffnen - Bild durch langes Drücken in der Galerie öffnen
- Materialstil in Dialogen angewendet
- Unterstützung für das Erstellen von Karten durch Verwendung eines Bildes hinzugefügt
- Spenden-Button zu Kartenbildschirm hinzugefügt

View File

@@ -0,0 +1,2 @@
- Bugfix: Spendendialog erlaubte kene Trennzeichen
- Unterstützt das Laden von Bildern aus dem Dateimanager

View File

@@ -0,0 +1,2 @@
- Ncht benötigte Berechtigungen entfernt
- Ziel Android 13

View File

@@ -0,0 +1 @@
- Unterstützung bei der Eingabe des Gültigkeitsbeginns der Karte

View File

@@ -11,4 +11,4 @@
- QR_CODE - QR_CODE
- UPC_A - UPC_A
- Die erzeugten Barcodes sind größer und lassen sich leichter mit einem Scangerät einlesen. - Die erzeugten Barcodes sind größer und lassen sich leichter mit einem Scangerät einlesen

View File

@@ -1,3 +1,3 @@
- Unschärfe der Buchstabensymbole auf dem Hauptbildschirm behoben - Unscharfe Buchstabensymbole auf dem Hauptbildschirm behoben
- Behebung des Problems, dass Icons manchmal nach der Auswahl verschwinden - Behebung des Problems, dass Icons manchmal nach der Auswahl verschwinden
- Behebung der Unsichtbarkeit von Statusleistensymbolen unter Android 5 - Behoben, dass Icons in der Statusleiste unter Android 5 nicht sichtbar waren

View File

@@ -1,4 +1,4 @@
- Mehrfaches Drücken der Speichern-Schaltfläche erzeugt nun mehrere Einträge - Behoben: Mehrfaches Drücken der Speichern-Schaltfläche erzeugt nun nicht mehr mehrere Einträge
- Verkleinerung des Kartenkopfes beim Ausblenden von Details, um noch mehr Karten unterzubringen - Verkleinerung des Karten-Headers bei ausgeblendeten Details, um noch mehr Karten unterzubringen
- Bearbeitungsbildschirm umstrukturiert - Bearbeitungsbildschirm umstrukturiert
- Kontrast der Sternsymbole in der Hauptansicht verbessert - Kontrast der Sternsymbole in der Hauptansicht verbessert

View File

@@ -1 +1 @@
- Behebung verschiedener TalkBack-bezogener Fehler - Behebung verschiedener Fehler im Zusammenhang mit TalkBack

View File

@@ -1 +1 @@
- Material You Neugestaltung - Neues Material You-Design

View File

@@ -1,22 +1,22 @@
Schluss mit der Suche nach Plastik-Belohnungskarten beim Bezahlen im Geschäft oder Webshop. Schluss mit der Suche nach Kundenkarten aus Plastik beim Bezahlen im Geschäft oder Webshop.
<b>Scanne EAN-Codes mit der Kamera deines Geräts, du brauchst keine Karten mehr.</b> <b>Speichere Barcodes mit der Kamera auf dein Gerät und vergesse deine Karten.</b>
Du brauchst keine Geldbörse, oder mach sie federleicht für Wertsachen. Lass deine Geldbörse daheim, oder schaffe wenigstens viel Platz für die wichtigen Wertsachen.
Mit diesem unverzichtbaren (EDC) Werkzeug kannst du nutzloses Plastik durch Bargeld ersetzen. Mit diesem unverzichtbaren Programm schaffst du Platz für Bargeld statt für nutzloses Plastik.
- Vermeide Spionage mit sehr wenigen Berechtigungen. Kein Internetzugang und keine Werbung. - Du wirst nicht ausspioniert, dank sehr weniger Berechtigungen. Kein Internetzugang und keine Werbung.
- Füge Karten oder Codes mit Namen und anpassbaren Farben hinzu. - Füge Karten oder Codes mit Namen und anpassbaren Farben hinzu.
- Manuelle Code-Eingabe, wenn kein Barcode gespeichert ist oder nicht funktioniert. - Manuelle Code-Eingabe, wenn kein Barcode vorhanden ist oder er nicht funktioniert.
- Importiere Karten und Codes aus Dateien, Catima, Loyalty Card Keychain, Stocard, Voucher Vault und FidMe. - Importiere Karten und Codes aus Dateien, von Catima, FidMe, Loyalty Card Keychain, Stocard oder Voucher Vault.
- Erstelle ein Backup aller Karten und übertrage diese auf ein neues Gerät. - Erstelle ein Backup aller deiner Karten und übertrage diese auf ein neues Gerät.
- Teile Gutscheine, exklusive Angebote, Werbeaktionscodes oder Karten und Codes mit jeder Applikation. - Teile Gutscheine, exklusive Angebote, Werbeaktionscodes oder Karten und sonstige Codes mit allen Apps.
- Dunkler Modus und Zugänglichkeitsoptionen für sehbehinderte Nutzer. - Dunkles Design und Barrierefreiheit für sehbehinderte Nutzer.
- Von der Freien-Software-Gemeinschaft für alle Menschen gemacht. - Von der Freien-Software-Gemeinschaft für alle Menschen gemacht.
- Lokalisierte, eigenhändige Übersetzungen für mehr als 20 Sprachen. - Lokalisierte, menschliche Übersetzungen für mehr als 20 Sprachen.
- Kostenlos, unterstützt durch Gemeinschaftsbeiträge. - Kostenlos, unterstützt durch Gemeinschaftsbeiträge.
- Verwende, studiere, ändere und teile es, wie du willst; <i>mit Allen</i>. - Verwende, prüfe, ändere und teile die App, wie du willst; <i>mit Allen</i>.
- Nicht nur freie und quelloffene Software. <i>Copylefted</i> freie Software (GPLv3+) Kartenverwaltung. - Nicht nur freie und quelloffene Software. Eine freie, <i>Copylefted</i> Software-Kartenverwaltung (GPLv3+).
Vereinfache dein Leben und Einkäufe, und verliere nie wieder eine Papierrechung, eine Geschenkkarte für die Bezahlung im Geschäft oder ein Flugticket. Vereinfache dein Leben und deine Einkäufe, und verliere nie wieder einen Beleg, eine Gutscheinkarte oder ein Flugticket.
Habe deine Prämien und Boni immer bei der Hand, und spare unterwegs. Habe deine Prämien und Boni immer bei dir, und spare unterwegs.

View File

@@ -1 +1 @@
Für Ihre EAN-Codes, Mitgliedschaften, Treueprogramme, Rabattmarkerl und Tickets. Für deine Barcodes, Mitgliedschaften, Treueprogramme, Gutscheine und Tickets.

View File

@@ -0,0 +1,2 @@
- Support setting start of card validity
- Fix Stocard import (Stocard's export format changed)

View File

@@ -0,0 +1 @@
- Use Material You colours on more devices (Google library update)

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