Compare commits

...

1890 Commits

Author SHA1 Message Date
Sylvia van Os
e921aab322 Release Catima 2.23.2 2023-05-30 12:59:21 +02:00
Sylvia van Os
1ea125d7f9 Merge pull request #1317 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-30 12:48:13 +02:00
Sylvia van Os
c828ec516c Merge pull request #1319 from CatimaLoyalty/create-pull-request/patch-1685442708
Update Fastlane changelogs
2023-05-30 12:32:31 +02:00
TheLastProject
5704ce1381 Update Fastlane changelogs 2023-05-30 10:31:47 +00:00
Sylvia van Os
ca33184e81 Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-05-30 12:31:31 +02:00
Sylvia van Os
82db76f3a9 Fix long barcode values causing barcode to scale down to nothing 2023-05-30 12:31:21 +02:00
Sylvia van Os
ab6955cf9b Fix set icon menu sometimes re-opening after returning from image cropper 2023-05-30 12:29:55 +02:00
Enol P
a1c81c3223 Translated using Weblate (Asturian)
Currently translated at 0.8% (1 of 120 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ast/
2023-05-30 12:06:46 +02:00
Enol P
43e7114f16 Translated using Weblate (Asturian)
Currently translated at 30.3% (85 of 280 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ast/
2023-05-30 12:06:46 +02:00
Slávek Banko
d1b84097f6 Translated using Weblate (Czech)
Currently translated at 100.0% (120 of 120 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2023-05-30 12:06:45 +02:00
solokot
2c9b3896c9 Translated using Weblate (Russian)
Currently translated at 100.0% (280 of 280 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2023-05-30 12:06:40 +02:00
Heimen Stoffels
3dbee69847 Translated using Weblate (Dutch)
Currently translated at 100.0% (280 of 280 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2023-05-30 12:06:39 +02:00
Slávek Banko
4f9414ab4f Translated using Weblate (Czech)
Currently translated at 100.0% (280 of 280 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2023-05-30 12:06:39 +02:00
Enol P
5a4043bf90 Added translation using Weblate (Asturian) 2023-05-30 02:00:59 +02:00
Balanda Nazarii
f742639925 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-05-30 00:10:19 +02:00
Eryk Michalak
e50cca781e 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-05-30 00:10:19 +02:00
Sylvia van Os
1abff7c900 Merge pull request #1316 from CatimaLoyalty/create-pull-request/patch-1685381842
Update Fastlane changelogs
2023-05-29 19:40:10 +02:00
TheLastProject
8f24fcee96 Update Fastlane changelogs 2023-05-29 17:37:22 +00:00
Sylvia van Os
f3e1bfc503 Improve button styling in Groups screen 2023-05-29 19:37:03 +02:00
Sylvia van Os
65e3b87df4 Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-05-29 18:20:08 +02:00
Sylvia van Os
2dbe9ebb8a Fix text and icon alignment on home screen 2023-05-29 18:06:49 +02:00
Sylvia van Os
ccfbe1f679 Merge pull request #1315 from CatimaLoyalty/create-pull-request/patch-1685369384
Update Fastlane changelogs
2023-05-29 16:27:57 +02:00
TheLastProject
3a4467db83 Update Fastlane changelogs 2023-05-29 14:09:44 +00:00
Sylvia van Os
419d28163e Long-press card icon in view activity to change it 2023-05-29 16:09:27 +02:00
Sylvia van Os
89483c4c4e Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-05-28 21:18:24 +02:00
Sylvia van Os
4e921eb5d7 Update fastlane 2023-05-28 21:18:16 +02:00
Sylvia van Os
0cf266c6f1 Merge pull request #1314 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-28 14:24:58 +02:00
Slávek Banko
20f9f971a1 Translated using Weblate (Czech)
Currently translated at 100.0% (119 of 119 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2023-05-28 12:49:56 +02:00
Heimen Stoffels
0150ca81cf 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-05-28 12:49:56 +02:00
Sylvia van Os
4fd6092f8d Merge pull request #1313 from CatimaLoyalty/create-pull-request/patch-1685258004
Update contributors
2023-05-28 10:33:47 +02:00
TheLastProject
a488003e4a Update contributors 2023-05-28 07:13:23 +00:00
Sylvia van Os
9e0e8bab75 Release Catima 2.23.1 2023-05-27 17:53:03 +02:00
Sylvia van Os
0eca05d656 Merge pull request #1310 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-27 12:45:32 +02:00
Sylvia van Os
1c5d102a59 Fix lint 2023-05-27 12:39:20 +02:00
Eudes-alencar
400d0f4e22 Translated using Weblate (Portuguese)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2023-05-27 12:31:19 +02:00
Clxff H3r4ld0
4c0593d333 Translated using Weblate (Indonesian)
Currently translated at 94.0% (111 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2023-05-27 12:31:19 +02:00
Eudes-alencar
87d82b1b6d Translated using Weblate (Portuguese)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2023-05-27 12:31:19 +02:00
WaldiS
8ea4a3309d Translated using Weblate (Polish)
Currently translated at 99.6% (287 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2023-05-27 12:31:19 +02:00
Sylvia van Os
18088b30bd Delete unused resources 2023-05-25 22:43:58 +02:00
Sylvia van Os
875309bc5e Merge pull request #1309 from CatimaLoyalty/create-pull-request/patch-1685044413
Update Fastlane changelogs
2023-05-25 22:04:46 +02:00
TheLastProject
95520a7051 Update Fastlane changelogs 2023-05-25 19:53:32 +00:00
Sylvia van Os
ab9391db38 Update libraries
It seems Material 1.9.0 slightly changes some paddings, so created new
screenshots
2023-05-25 21:52:38 +02:00
Sylvia van Os
e43e4b37ae Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-05-25 21:28:47 +02:00
Sylvia van Os
f2d856b661 Actually properly remove font scale setting 2023-05-25 21:20:32 +02:00
Sylvia van Os
8c6c5fb767 Merge pull request #1308 from obfusk/patch-1
fix typo in RELEASE_STEPS.md
2023-05-25 21:10:41 +02:00
FC Stegerman
bb4ec8f8be fix typo in RELEASE_STEPS.md 2023-05-25 18:55:53 +00:00
Sylvia van Os
e5fd277198 Release Catima 2.23.0 2023-05-25 19:01:37 +02:00
Sylvia van Os
93b089c646 Merge pull request #1306 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-25 18:12:36 +02:00
Clxff Heraldo
5e37a9b89f Translated using Weblate (Indonesian)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2023-05-25 18:05:27 +02:00
Slávek Banko
27cc7b9008 Translated using Weblate (Czech)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2023-05-25 18:05:27 +02:00
Slávek Banko
0749bbd432 Translated using Weblate (Czech)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2023-05-25 18:05:27 +02:00
Sylvia van Os
9b1e0537c9 Merge pull request #1305 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-24 18:00:00 +02:00
Balázs Meskó
3b2b45f08f Translated using Weblate (Hungarian)
Currently translated at 25.4% (30 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hu/
2023-05-24 13:50:37 +02:00
Milo Ivir
60a5e60ae0 Translated using Weblate (Croatian)
Currently translated at 2.5% (3 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hr/
2023-05-24 13:50:37 +02:00
Milo Ivir
77513d5528 Translated using Weblate (Croatian)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2023-05-24 13:50:37 +02:00
丛林意志
15fa483490 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2023-05-24 13:50:37 +02:00
SilverFS
40ba47d60c Translated using Weblate (Dutch)
Currently translated at 11.8% (14 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2023-05-24 13:50:37 +02:00
solokot
986327d141 Translated using Weblate (Russian)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-05-24 13:50:37 +02:00
Jean Mareilles
36f0dde3b2 Translated using Weblate (French)
Currently translated at 99.1% (117 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2023-05-24 13:50:37 +02:00
Giovanni Donisi
f0a695a616 Translated using Weblate (Italian)
Currently translated at 99.6% (287 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2023-05-24 13:50:37 +02:00
Jean Mareilles
810b0f3c14 Translated using Weblate (French)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2023-05-24 13:50:37 +02:00
Mateo Gomez
fcf08a8900 Translated using Weblate (Spanish)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2023-05-24 13:50:37 +02:00
Sylvia van Os
939bf6a788 Merge pull request #1304 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-22 20:15:09 +02:00
Minecraft boom
935f899d0f Translated using Weblate (Arabic)
Currently translated at 97.2% (280 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2023-05-22 06:54:30 +02:00
Balázs Meskó
6c8d79ef36 Translated using Weblate (Hungarian)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2023-05-22 06:54:30 +02:00
Oğuz Ersen
178707b482 Translated using Weblate (Turkish)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2023-05-22 06:54:30 +02:00
109247019824
0f2c9cb63d Translated using Weblate (Bulgarian)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2023-05-22 06:54:30 +02:00
丛林意志
0869a00f0c Translated using Weblate (Chinese (Simplified))
Currently translated at 99.1% (117 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2023-05-22 06:54:30 +02:00
丛林意志
b63b8c4ea7 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2023-05-22 06:54:30 +02:00
solokot
76d77a2af4 Translated using Weblate (Russian)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2023-05-22 06:54:30 +02:00
Heimen Stoffels
dade0b7a54 Translated using Weblate (Dutch)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2023-05-22 06:54:30 +02:00
Artūras Kalenda
68801d6958 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (288 of 288 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2023-05-22 06:54:30 +02:00
Sylvia van Os
5c3ec85043 Merge pull request #1303 from CatimaLoyalty/create-pull-request/patch-1684674032
Update Fastlane changelogs
2023-05-21 15:02:20 +02:00
TheLastProject
6332e396cb Update Fastlane changelogs 2023-05-21 13:00:31 +00:00
Sylvia van Os
7f022feb6a Fix crash when using "Take a photo" with disabled camera app 2023-05-21 15:00:11 +02:00
Sylvia van Os
1fa8487474 Bump AGP 2023-05-21 14:48:20 +02:00
Sylvia van Os
0e040a73eb Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-05-21 14:34:51 +02:00
Sylvia van Os
65acb885af Fix crash on disabled camera app 2023-05-21 14:34:39 +02:00
Sylvia van Os
ee28957cbd Merge pull request #1302 from CatimaLoyalty/create-pull-request/patch-1684649320
Update contributors
2023-05-21 09:23:27 +02:00
TheLastProject
0e9f4d9f2b Update contributors 2023-05-21 06:08:39 +00:00
Sylvia van Os
58974cf738 Merge pull request #1301 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-20 13:32:23 +02:00
Balázs Meskó
c56c931a70 Translated using Weblate (Hungarian)
Currently translated at 15.2% (18 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hu/
2023-05-20 11:53:50 +02:00
Quentin PAGÈS
c83e8b6682 Translated using Weblate (Occitan)
Currently translated at 34.8% (100 of 287 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/oc/
2023-05-20 11:53:50 +02:00
109247019824
449ab86b5a Translated using Weblate (Bulgarian)
Currently translated at 100.0% (287 of 287 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2023-05-20 11:53:50 +02:00
solokot
8f18bbe0ac Translated using Weblate (Russian)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2023-05-20 11:53:50 +02:00
Altons
992e61b88a Translated using Weblate (French)
Currently translated at 97.4% (115 of 118 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2023-05-20 11:53:50 +02:00
solokot
47b92fb38c Translated using Weblate (Russian)
Currently translated at 100.0% (287 of 287 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2023-05-20 11:53:50 +02:00
Heimen Stoffels
b9963bb967 Translated using Weblate (Dutch)
Currently translated at 100.0% (287 of 287 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2023-05-20 11:53:50 +02:00
Carlo Cuoghi
d642d57b85 Translated using Weblate (Italian)
Currently translated at 98.2% (282 of 287 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2023-05-20 11:53:50 +02:00
Sylvia van Os
9e0e8f6d7f Redo all screenshots with exact same Material colour 2023-05-18 22:54:38 +02:00
Sylvia van Os
e486755e6a Merge pull request #1273 from CatimaLoyalty/feature/donationLink
Add donation link on non-Google installs
2023-05-18 21:44:48 +02:00
Sylvia van Os
1bb803ef0a Add donation link on non-Google installs
Inspired by https://git.zx2c4.com/wireguard-android/commit/?id=dc1860c74dd67e18a66fe9e243eeffa689bef043
2023-05-18 19:33:06 +02:00
Sylvia van Os
f729f9758b Merge pull request #1299 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.10.3
Bump org.robolectric:robolectric from 4.10.2 to 4.10.3
2023-05-18 19:03:47 +02:00
Sylvia van Os
abe3bc7d87 Merge pull request #1300 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-18 19:03:27 +02:00
Balázs Meskó
454bb6a1aa Translated using Weblate (Hungarian)
Currently translated at 7.6% (9 of 117 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hu/
2023-05-18 18:52:16 +02:00
Balázs Meskó
2d4d4e2309 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-05-18 18:52:16 +02:00
IllusiveMan196
e7c4010e8d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (117 of 117 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2023-05-18 18:52:16 +02:00
dependabot[bot]
cc363e0c04 Bump org.robolectric:robolectric from 4.10.2 to 4.10.3
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.10.2 to 4.10.3.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.10.2...robolectric-4.10.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-18 02:58:51 +00:00
Sylvia van Os
deacc4a69b Merge pull request #1298 from CatimaLoyalty/create-pull-request/patch-1684361188
Update Fastlane changelogs
2023-05-18 00:26:17 +02:00
TheLastProject
ac6e6e0985 Update Fastlane changelogs 2023-05-17 22:06:27 +00:00
Sylvia van Os
fd37a2708f Update CHANGELOG 2023-05-18 00:06:13 +02:00
Sylvia van Os
85ea314dc9 Merge pull request #1294 from pokegh0st/fix/preferences
Update Settings screen to use Material You design
2023-05-18 00:05:22 +02:00
Sylvia van Os
7fd5fe6ee0 Merge pull request #1290 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.10.2
Bump org.robolectric:robolectric from 4.10.1 to 4.10.2
2023-05-17 21:17:10 +02:00
Sylvia van Os
2c35ad3044 Merge pull request #1297 from CatimaLoyalty/create-pull-request/patch-1684350973
Update Fastlane changelogs
2023-05-17 21:16:47 +02:00
TheLastProject
210e305bae Update Fastlane changelogs 2023-05-17 19:16:13 +00:00
Sylvia van Os
b48de921fc Redesign of home screen and view UI (#1296)
* Redesign of home screen and view UI

* Update screenshots and CHANGELOG

* Make spotbugs happy

* Fix double store name announcement
2023-05-17 21:15:56 +02:00
Sylvia van Os
ebc2bfcbbb Merge pull request #1295 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-16 20:01:45 +02:00
Subhradeep Bera
b1ec67928f Translated using Weblate (Bengali (India))
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2023-05-16 19:51:02 +02:00
pokegh0st
2beafe954b fix: Change dialog windows to Material 3 2023-05-16 18:52:07 +03:00
pokegh0st
25b6c4d8cc fix: Change switches to Material 3 2023-05-15 19:49:00 +03:00
Sylvia van Os
a3f1b9c0b9 Merge pull request #1293 from CatimaLoyalty/create-pull-request/patch-1684044523
Update contributors
2023-05-14 09:45:50 +02:00
TheLastProject
14d5545c88 Update contributors 2023-05-14 06:08:42 +00:00
Sylvia van Os
0977b9d20a Merge pull request #1292 from CatimaLoyalty/create-pull-request/patch-1683439738
Update contributors
2023-05-07 10:38:07 +02:00
Sylvia van Os
bad0990dfb Merge pull request #1291 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-05-07 10:37:50 +02:00
TheLastProject
98c34abd66 Update contributors 2023-05-07 06:08:58 +00:00
Clxff Heraldo
b4d1463453 Translated using Weblate (Indonesian)
Currently translated at 94.0% (110 of 117 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2023-05-07 06:54:09 +02:00
dependabot[bot]
659b86e31a Bump org.robolectric:robolectric from 4.10.1 to 4.10.2
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.10.1 to 4.10.2.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.10.1...robolectric-4.10.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-05 02:58:25 +00:00
Sylvia van Os
d63e269172 Merge pull request #1286 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.10.1
Bump org.robolectric:robolectric from 4.10 to 4.10.1
2023-05-03 18:17:01 +02:00
dependabot[bot]
77aa768c5c Bump org.robolectric:robolectric from 4.10 to 4.10.1
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.10 to 4.10.1.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.10...robolectric-4.10.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-03 02:58:28 +00:00
Sylvia van Os
8c74d4c2d0 Merge pull request #1283 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-04-30 13:44:34 +02:00
Sylvia van Os
a6280108ec Delete invalid translation 2023-04-30 13:37:44 +02:00
Sylvia van Os
829630219f Merge pull request #1284 from CatimaLoyalty/create-pull-request/patch-1682832840
Update contributors
2023-04-30 11:11:14 +02:00
TheLastProject
22a736d7fd Update contributors 2023-04-30 05:34:00 +00:00
Gael Caraballo
4418492e7c Translated using Weblate (Catalan)
Currently translated at 19.3% (54 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ca/
2023-04-30 06:52:58 +02:00
Cap Amr Karam
c21e12bbf0 Translated using Weblate (Arabic)
Currently translated at 100.0% (279 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2023-04-30 06:52:58 +02:00
liva
9af05be128 Translated using Weblate (Latvian)
Currently translated at 98.2% (274 of 279 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2023-04-30 06:52:58 +02:00
Sylvia van Os
e036443233 Merge pull request #1280 from CatimaLoyalty/create-pull-request/patch-1682233171
Update contributors
2023-04-23 11:01:43 +02:00
TheLastProject
7e605f284d Update contributors 2023-04-23 06:59:30 +00:00
Sylvia van Os
e712b8e18d Update fastlane 2023-04-19 17:44:53 +02: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
Sylvia van Os
36e7ea5b20 Release Catima 2.21.2 2023-01-27 18:36:24 +01:00
Sylvia van Os
85d53ae3c7 Merge pull request #1194 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-27 18:07:26 +01:00
Sylvia van Os
e9b6b5682e Translated using Weblate (Dutch)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2023-01-27 18:01:46 +01:00
SC
0abc583d10 Translated using Weblate (Portuguese)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2023-01-27 17:56:35 +01:00
SC
8c91d30b4c Translated using Weblate (Portuguese)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2023-01-27 17:56:31 +01:00
Oğuz Ersen
76e8715ab2 Translated using Weblate (Turkish)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2023-01-27 17:56:31 +01:00
Quentin PAGÈS
f5f2edca75 Translated using Weblate (Occitan)
Currently translated at 0.8% (1 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/oc/
2023-01-27 17:56:31 +01:00
109247019824
e648e22ecc Translated using Weblate (Bulgarian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2023-01-27 17:56:31 +01:00
HudobniVolk
02b020e9e5 Translated using Weblate (Slovenian)
Currently translated at 21.7% (25 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-27 17:56:31 +01:00
Slávek Banko
e7dc3cd511 Translated using Weblate (Czech)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2023-01-27 17:56:30 +01:00
Michael Moroni
eb3ac53e46 Translated using Weblate (Italian)
Currently translated at 56.5% (65 of 115 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2023-01-27 17:56:26 +01:00
Dan
dd683b4a8c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2023-01-27 17:56:24 +01:00
solokot
e90ba5d2db Translated using Weblate (Russian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2023-01-27 17:56:24 +01:00
Heimen Stoffels
07cff7eac4 Translated using Weblate (Dutch)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2023-01-27 17:56:24 +01:00
Michael Moroni
3eea18fc82 Translated using Weblate (Italian)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2023-01-27 17:56:23 +01:00
gallegonovato
5d3ceb6d49 Translated using Weblate (Spanish)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2023-01-27 17:56:23 +01:00
Slávek Banko
3dc7a25d88 Translated using Weblate (Czech)
Currently translated at 100.0% (275 of 275 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2023-01-27 17:56:23 +01:00
Sylvia van Os
95e02d1646 Merge pull request #1191 from CatimaLoyalty/dependabot/gradle/net.lingala.zip4j-zip4j-2.11.3
Bump zip4j from 2.11.2 to 2.11.3
2023-01-26 19:15:58 +01:00
Sylvia van Os
81ecf8ba92 Merge pull request #1193 from CatimaLoyalty/security/gradle_wrapper_verification
Add Gradle wrapper verification
2023-01-26 19:10:13 +01:00
Sylvia van Os
bf0e1a2e77 Add Gradle wrapper verification 2023-01-26 19:02:04 +01:00
Sylvia van Os
4d1c9244fd Merge pull request #1192 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-26 18:48:57 +01:00
HudobniVolk
1f1e523100 Translated using Weblate (Slovenian)
Currently translated at 20.1% (23 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-26 17:55:06 +01:00
HudobniVolk
cb32cf9e52 Translated using Weblate (Slovenian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-26 17:55:06 +01:00
dependabot[bot]
af812d8cda Bump zip4j from 2.11.2 to 2.11.3
Bumps [zip4j](https://github.com/srikanth-lingala/zip4j) from 2.11.2 to 2.11.3.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.11.2...v2.11.3)

---
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-01-26 02:03:45 +00:00
Sylvia van Os
c8a7addc52 Merge pull request #1190 from CatimaLoyalty/create-pull-request/patch-1674683901
Update Fastlane changelogs
2023-01-25 22:58:43 +01:00
TheLastProject
3e64d7c5ad Update Fastlane changelogs 2023-01-25 21:58:21 +00:00
Sylvia van Os
277462a939 Update CHANGELOG 2023-01-25 22:58:03 +01:00
Sylvia van Os
24623d5c58 Merge pull request #1189 from CatimaLoyalty/sdk/33
Update targetSdk to 33
2023-01-25 22:57:34 +01:00
Sylvia van Os
4b25b7ad39 Update targetSdk to 33 2023-01-25 19:59:08 +01:00
Sylvia van Os
4016d5499b Merge pull request #1188 from CatimaLoyalty/sdk/32
Update targetSdk to 32
2023-01-25 19:40:53 +01:00
Sylvia van Os
d8b96a8c5f Update targetSdk to 32 2023-01-25 19:36:09 +01:00
Sylvia van Os
614753303f Fix crash when permissionRequestResult gets cancelled 2023-01-25 18:30:47 +01:00
Sylvia van Os
50a344b97f Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-01-25 18:23:54 +01:00
Sylvia van Os
2cd6da6ffc Fix crash on invalid import URI 2023-01-25 18:13:58 +01:00
Sylvia van Os
c03fba133f Merge pull request #1187 from CatimaLoyalty/create-pull-request/patch-1674662809
Update Fastlane changelogs
2023-01-25 17:32:55 +01:00
TheLastProject
f3cba588f6 Update Fastlane changelogs 2023-01-25 16:06:48 +00:00
Sylvia van Os
ad364ad0ac Merge branch 'main' of github.com:TheLastProject/loyalty-card-locker 2023-01-25 17:06:19 +01:00
Sylvia van Os
f4cff85d93 Document permission change 2023-01-25 17:06:08 +01:00
Sylvia van Os
cbc86ff131 Merge pull request #1185 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-24 23:31:38 +01:00
Sylvia van Os
5f733474a9 Merge pull request #1186 from CatimaLoyalty/fix/permissionRefactor
Refactor permission code
2023-01-24 23:28:38 +01:00
Sylvia van Os
89a13cecf5 Create extra result function to work around onPermissionResult not existing on Android 5 2023-01-24 23:14:57 +01:00
Sylvia van Os
fd2400eaf5 Refactor permission code
- Remove write permission (was never needed)
- Only use read permission for Android 5 and 6
- Simplify logic by mocking a valid permission result if permission
  already granted
2023-01-24 20:44:17 +01:00
Sylvia van Os
9598f2f4ff Translated using Weblate (Slovenian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-24 07:53:22 +01:00
IllusiveMan196
acca53787c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (114 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2023-01-23 02:12:44 +01:00
HudobniVolk
060e360344 Translated using Weblate (Slovenian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-23 02:12:44 +01:00
Sylvia van Os
9ef014e05c Fix main rename breaking github scripts 2023-01-22 13:12:25 +01:00
Sylvia van Os
4cb27d3bd5 Merge pull request #1182 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-20 17:00:24 +01:00
stone wow
95e21cc112 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2023-01-20 16:09:32 +01:00
Sylvia van Os
d5f915a290 Merge pull request #1181 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-18 22:03:04 +01:00
HudobniVolk
42e89bb5cc Translated using Weblate (Slovenian)
Currently translated at 19.2% (22 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-18 21:51:11 +01:00
Sylvia van Os
048fb48300 Fix reproducible build script 2023-01-16 20:32:42 +01:00
Sylvia van Os
b1c82dbae0 Merge pull request #1159 from CatimaLoyalty/feature/rb
Add script to build reproducibly
2023-01-16 19:48:56 +01:00
Sylvia van Os
ea8c6f96f7 Merge pull request #1180 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-16 19:05:26 +01:00
HudobniVolk
201ec78694 Translated using Weblate (Slovenian)
Currently translated at 7.0% (8 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sl/
2023-01-16 18:53:07 +01:00
Dan
05a03455c1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2023-01-16 18:53:07 +01:00
HudobniVolk
63f4cbb8ca Translated using Weblate (Slovenian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sl/
2023-01-16 18:53:07 +01:00
Sylvia van Os
a444607476 Merge pull request #1178 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-14 23:58:58 +01:00
Giovanni Donisi
89102ad0bf Translated using Weblate (Italian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2023-01-14 23:12:40 +01:00
Sylvia van Os
d2623b8690 Merge pull request #1177 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-13 23:08:03 +01:00
Jiri Grönroos
80ddd48184 Translated using Weblate (Finnish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2023-01-13 18:50:22 +01:00
Sylvia van Os
410a619a70 Merge pull request #1175 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-08 12:04:45 +01:00
Jiri Grönroos
1771f42860 Translated using Weblate (Finnish)
Currently translated at 95.9% (263 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2023-01-08 11:51:01 +01:00
Sylvia van Os
1e7af7ab4e Merge pull request #1174 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2023-01-06 13:59:27 +01:00
Piotr Strebski
f4c5af04e3 Translated using Weblate (Polish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2023-01-06 13:51:24 +01:00
Sylvia van Os
5bcd2cdc32 Merge pull request #1171 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.9.2
Bump robolectric from 4.9.1 to 4.9.2
2022-12-28 06:48:50 +00:00
dependabot[bot]
c69a5ae4d2 Bump robolectric from 4.9.1 to 4.9.2
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.9.1 to 4.9.2.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.9.1...robolectric-4.9.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-28 02:04:26 +00:00
Sylvia van Os
6bd750a60b Add script to build reproducibly 2022-12-22 22:57:55 +01:00
Sylvia van Os
8d77cc3565 Merge pull request #1169 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.9.1
Bump robolectric from 4.9 to 4.9.1
2022-12-21 12:25:35 +00:00
Sylvia van Os
7a99e0056d Merge pull request #1170 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-20 22:14:48 +00:00
Shailendra Maurya
03e07bc48d Translated using Weblate (Hindi)
Currently translated at 61.6% (169 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-12-20 22:43:29 +01:00
dependabot[bot]
460d6c2b71 Bump robolectric from 4.9 to 4.9.1
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.9 to 4.9.1.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.9...robolectric-4.9.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-20 02:04:38 +00:00
Sylvia van Os
9f946094db Merge pull request #1168 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-18 21:06:09 +00:00
wmilan 17
4e92f82176 Translated using Weblate (Hungarian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2022-12-18 21:48:04 +01:00
Sylvia van Os
7b905ac120 Translated using Weblate (English)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-12-17 11:46:57 +01:00
Tomasz Cukier
55c5ec929c Translated using Weblate (English)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-12-17 11:46:57 +01:00
Sylvia van Os
5441231f03 Merge pull request #1165 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-14 22:55:09 +01:00
ssantos
1818d24bc0 Translated using Weblate (Portuguese)
Currently translated at 100.0% (114 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-12-14 22:50:15 +01:00
Sylvia van Os
ca88c070c3 Merge pull request #1163 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-13 23:19:14 +01:00
gallegonovato
1be387c4ec Translated using Weblate (Spanish)
Currently translated at 11.4% (13 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-12-13 20:50:09 +01:00
Sylvia van Os
fa3a956d69 Merge pull request #1162 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-12 17:07:13 +01:00
gallegonovato
8fd244e3a3 Translated using Weblate (Spanish)
Currently translated at 8.7% (10 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-12-12 15:51:47 +01:00
Sylvia van Os
a0e2fe11dd Merge pull request #1160 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-11 15:50:06 +01:00
gallegonovato
893f34e72a Translated using Weblate (Spanish)
Currently translated at 7.0% (8 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-12-11 14:49:57 +01:00
Sylvia van Os
cf13a9fc60 Merge pull request #1158 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-09 22:00:23 +01:00
IllusiveMan196
c6e6d96313 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (114 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-12-09 21:50:03 +01:00
Sylvia van Os
20ed9cac88 Update Google Play badge
See https://github.com/cvzi/play
2022-12-06 19:34:51 +01:00
Sylvia van Os
ae6bd937a9 Move to main 2022-12-06 19:33:04 +01:00
Sylvia van Os
e4b69e5cc5 Release Catima 2.21.1 2022-12-06 19:13:02 +01:00
Sylvia van Os
5b1062b8d1 Merge pull request #1155 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-06 18:41:27 +01:00
Slávek Banko
e06009852e Translated using Weblate (Czech)
Currently translated at 100.0% (114 of 114 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-12-06 18:35:01 +01:00
Sylvia van Os
50268f6bd1 Merge pull request #1154 from CatimaLoyalty/create-pull-request/patch-1670271647
Update Fastlane changelogs
2022-12-05 21:21:13 +01:00
TheLastProject
a85e28d46d Update Fastlane changelogs 2022-12-05 20:20:47 +00:00
Sylvia van Os
78b6be911f Merge pull request #1153 from CatimaLoyalty/fix/localeQuickSpend
Fix/locale quick spend
2022-12-05 21:20:32 +01:00
Sylvia van Os
bb80478650 Update CHANGELOG 2022-12-05 21:14:07 +01:00
Sylvia van Os
e0c06cc480 Fix locale separator in quick spend dialog 2022-12-05 21:14:00 +01:00
Sylvia van Os
b8a508649c Merge pull request #1151 from CatimaLoyalty/create-pull-request/patch-1670133932
Update contributors
2022-12-04 09:38:51 +01:00
TheLastProject
a8ce37d936 Update contributors 2022-12-04 06:05:31 +00:00
Sylvia van Os
43015abbad Merge pull request #1147 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-12-02 08:09:44 +01:00
Mario M. Viscovich
47c8dff52d Translated using Weblate (Croatian)
Currently translated at 38.3% (105 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2022-12-02 03:47:15 +01:00
Sylvia van Os
436cf7a068 Merge pull request #1146 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-29 20:53:31 +01:00
IllusiveMan196
31cc3cd5d0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-11-29 20:47:20 +01:00
gallegonovato
3c11c2ef1e Translated using Weblate (Spanish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-11-29 20:47:15 +01:00
Sylvia van Os
fac70f0210 Merge pull request #1145 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-28 07:41:24 +01:00
IllusiveMan196
6e99a29312 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-11-28 02:49:19 +01:00
IllusiveMan196
5b67ecf157 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-11-28 02:49:19 +01:00
Sylvia van Os
312470cf20 Merge pull request #1144 from CatimaLoyalty/create-pull-request/patch-1669529773
Update contributors
2022-11-27 09:34:00 +01:00
TheLastProject
4371f46ff8 Update contributors 2022-11-27 06:16:12 +00:00
Sylvia van Os
5468415b04 Merge pull request #1143 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-26 16:40:26 +01:00
CherryMonster222
6a68ad5d19 Translated using Weblate (Arabic)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2022-11-26 15:48:38 +01:00
IllusiveMan196
7576505044 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-11-26 15:48:38 +01:00
Sylvia van Os
b34a43902a Merge pull request #1141 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-24 18:34:31 +01:00
안재범
d3524a50a3 Translated using Weblate (Korean)
Currently translated at 38.6% (106 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2022-11-24 16:46:55 +01:00
Sylvia van Os
6508a6d5f7 Merge pull request #1116 from pfaffenrodt/feature/pick-image-file
Add support to pick image from content provider
2022-11-22 19:04:48 +01:00
Sylvia van Os
49a6cf8ae3 Merge pull request #1140 from CatimaLoyalty/create-pull-request/patch-1668925172
Update contributors
2022-11-20 10:21:12 +01:00
TheLastProject
b4238e0072 Update contributors 2022-11-20 06:19:31 +00:00
Sylvia van Os
374170bf05 Merge pull request #1139 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-19 23:17:41 +01:00
Jacek
ab11345c3d Translated using Weblate (Polish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-11-19 21:47:02 +01:00
Sylvia van Os
10498ce1a4 Prevent NullPointerException in onBackPressed
This crash seems to somehow only happen on Huawei and Xiaomi devices.
While fairly rare, it is the most common Catima crash currently logged
on Google Play Console (8 crashes over the last 28 days).

While I don't understand how this would happen, I think it should be
relatively safe to assume that if the searchview is null the user isn't
currently searching so running the normal back code should always be the
expected behaviour.
2022-11-16 21:42:52 +01:00
Sylvia van Os
28901487ff Merge pull request #1138 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-15 23:17:53 +01:00
Sylvia van Os
8414f51ee8 Translated using Weblate (Polish)
Currently translated at 39.8% (45 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-11-15 21:48:36 +01:00
Slávek Banko
94f8adb6d7 Translated using Weblate (Czech)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-11-15 21:48:35 +01:00
Sylvia van Os
844a921a1a Merge pull request #1134 from CatimaLoyalty/create-pull-request/patch-1668320636
Update contributors
2022-11-14 19:47:10 +01:00
Sylvia van Os
ae8be3eda8 Merge pull request #1135 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-14 06:27:25 +01:00
gallegonovato
c4c15dbef8 Translated using Weblate (Spanish)
Currently translated at 3.5% (4 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-11-13 23:48:54 +01:00
Evgeniy Khramov
ac72035500 Translated using Weblate (Russian)
Currently translated at 32.7% (37 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2022-11-13 23:48:54 +01:00
Freddo espresso
abff3bcd39 Translated using Weblate (Greek)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2022-11-13 23:48:54 +01:00
TheLastProject
05aea28602 Update contributors 2022-11-13 06:23:55 +00:00
Sylvia van Os
e4c4dbf5a0 Merge pull request #1133 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-11 23:02:41 +01:00
Sylvia van Os
bb2393b6c6 Translated using Weblate (Polish)
Currently translated at 99.2% (272 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-11-11 22:49:16 +01:00
Gediminas Murauskas
fb330d16b5 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-11-11 22:49:16 +01:00
Slávek Banko
c8f1b986ec Translated using Weblate (Czech)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-11-11 22:49:15 +01:00
Євгеній Нешта
49a2c93d28 Translated using Weblate (Ukrainian)
Currently translated at 99.1% (112 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-11-09 20:48:23 +01:00
Євгеній Нешта
0992ac4099 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-11-09 20:48:23 +01:00
truestorybaby
9ff29af616 Translated using Weblate (Polish)
Currently translated at 99.2% (272 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-11-09 20:48:23 +01:00
Sylvia van Os
fbc696047b Merge pull request #1124 from CatimaLoyalty/dependabot/gradle/com.google.zxing-core-3.5.1
Bump core from 3.5.0 to 3.5.1
2022-11-06 11:21:30 +01:00
Sylvia van Os
08a4d4b114 Release Catima 2.21.0 2022-11-06 11:16:07 +01:00
Sylvia van Os
329056301b Add Hindi to language picker 2022-11-06 10:53:39 +01:00
Sylvia van Os
fac8da69e7 Merge pull request #1127 from CatimaLoyalty/create-pull-request/patch-1667715884
Update contributors
2022-11-06 08:33:33 +01:00
TheLastProject
fad9eed43e Update contributors 2022-11-06 06:24:44 +00:00
Sylvia van Os
58a18bdd7b Merge pull request #1126 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-05 11:35:49 +01:00
Eric
90cb524560 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-11-05 11:05:28 +01:00
Sylvia van Os
ef4c57ce29 Merge pull request #1125 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-11-04 08:21:51 +01:00
Jean Mareilles
8872fad73e Translated using Weblate (French)
Currently translated at 99.1% (112 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-11-04 06:12:38 +01:00
dependabot[bot]
63c3330571 Bump core from 3.5.0 to 3.5.1
Bumps [core](https://github.com/zxing/zxing) from 3.5.0 to 3.5.1.
- [Release notes](https://github.com/zxing/zxing/releases)
- [Changelog](https://github.com/zxing/zxing/blob/master/CHANGES)
- [Commits](https://github.com/zxing/zxing/compare/zxing-3.5.0...zxing-3.5.1)

---
updated-dependencies:
- dependency-name: com.google.zxing:core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-03 02:03:03 +00:00
Sylvia van Os
37d1bb9477 Merge pull request #1118 from pfaffenrodt/feature/clean-about
Cleaning code in about page
2022-11-01 22:00:55 +01:00
Pfaffenrodt
8a67d1d02b Rename open to openBrowser 2022-11-01 10:52:11 +01:00
Pfaffenrodt
6f777068ab Remove map from id to link. make link handler more solid 2022-10-30 21:04:35 +01:00
Sylvia van Os
8607e1c23c Merge pull request #1120 from CatimaLoyalty/create-pull-request/patch-1667112218
Update contributors
2022-10-30 11:17:13 +01:00
Sylvia van Os
04a319066c Merge pull request #1119 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-30 11:02:06 +01:00
Sylvia van Os
39f89ca943 Also replace "smart quotes" in broken translation 2022-10-30 10:33:03 +01:00
Sylvia van Os
1092d7a9ba Fix broken translation 2022-10-30 10:29:30 +01:00
TheLastProject
b54052182d Update contributors 2022-10-30 06:43:37 +00:00
SC
b971c392cf Translated using Weblate (Portuguese)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-10-29 21:01:09 +02:00
SC
cec9306387 Translated using Weblate (Portuguese)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-10-29 21:01:09 +02:00
元气
f6a5cbbf80 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-29 21:01:09 +02:00
pfaffenrodt
4b55c414f3 Fix spacings in custom view of alert dialogs (#1117) 2022-10-29 15:12:45 +02:00
Pfaffenrodt
1aafcdc6ae Revert to reading file. Missing encoding 2022-10-29 14:44:02 +02:00
Pfaffenrodt
332e37b2eb Extract page title to about content 2022-10-29 14:19:36 +02:00
Pfaffenrodt
dff33d3bab Simplify reading contributors file 2022-10-29 14:19:36 +02:00
Pfaffenrodt
85ddc9689c Extract common html link of third party info 2022-10-29 14:19:36 +02:00
Pfaffenrodt
d91c207b60 Extract last about content 2022-10-29 14:19:36 +02:00
Pfaffenrodt
653606fae3 Extract show credits dialog. remove empty listener 2022-10-29 14:19:36 +02:00
Pfaffenrodt
f5a0c8f375 Extract about content 2022-10-29 14:19:36 +02:00
Pfaffenrodt
c71019951c Extract open link handler 2022-10-29 14:19:36 +02:00
Pfaffenrodt
ed7b79ce17 Refactor AboutActivity to avoid leaks that hold activity as reference 2022-10-29 14:19:36 +02:00
Pfaffenrodt
08cfb490d4 Remove redundant title
setTitle was called twice
2022-10-29 14:19:36 +02:00
Pfaffenrodt
7d284a85bc Extract about content from onCreate 2022-10-29 14:19:36 +02:00
Pfaffenrodt
77ef0a2833 Extract same logic to enable back button of toolbar
ManageGroupActivity setDisplayShowHomeEnabled was redundant
2022-10-29 14:19:34 +02:00
Pfaffenrodt
80130654ec Remove unused field properties 2022-10-29 14:18:50 +02:00
Pfaffenrodt
e97f7c8645 Add support to pick image from content provider 2022-10-28 23:46:40 +02:00
Sylvia van Os
e489ff6a22 Merge pull request #1115 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-28 17:31:58 +02:00
Jean-Luc Tibaux
de549d724c Translated using Weblate (German)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-10-28 09:05:42 +02:00
Sylvia van Os
5fb2dbd252 Merge pull request #1111 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-26 18:04:56 +02:00
Yusril A
20013cf7b7 Translated using Weblate (Indonesian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2022-10-26 08:04:56 +02:00
J. Lavoie
78c3146c78 Translated using Weblate (French)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-10-26 08:04:56 +02:00
J. Lavoie
ddd7bb9968 Translated using Weblate (German)
Currently translated at 98.9% (271 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-10-26 08:04:56 +02:00
Tong Liu
68935f1489 Closes #1092 - Fixed contents cut off on smaller screen issue. (#1095) 2022-10-25 19:38:02 +02:00
Sylvia van Os
d9a25e1eb9 Merge pull request #1108 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-24 20:54:17 +02:00
Oğuz Ersen
73a837bab5 Translated using Weblate (Turkish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-10-24 20:42:31 +02:00
109247019824
03be45f5a2 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-10-24 20:42:31 +02:00
Eric
692adafd8e Translated using Weblate (Chinese (Simplified))
Currently translated at 97.0% (266 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-24 20:42:31 +02:00
Slávek Banko
4ff9eb5219 Translated using Weblate (Czech)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-10-24 20:42:31 +02:00
solokot
286e9fa315 Translated using Weblate (Russian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-10-24 20:42:31 +02:00
Heimen Stoffels
e0b6773d2a Translated using Weblate (Dutch)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-10-24 20:42:31 +02:00
Allan Nordhøy
a7cb8a51a3 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.0% (266 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-10-24 20:42:31 +02:00
Gediminas Murauskas
56c7ffa4df Translated using Weblate (Lithuanian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-24 20:42:31 +02:00
Michael Moroni
1498f902c2 Translated using Weblate (Italian)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-10-24 20:42:31 +02:00
gallegonovato
eea0dd9081 Translated using Weblate (Spanish)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-10-24 20:42:31 +02:00
Slávek Banko
1a8c8c07aa Translated using Weblate (Czech)
Currently translated at 100.0% (274 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-10-24 20:42:31 +02:00
Allan Nordhøy
3901172757 Translated using Weblate (English)
Currently translated at 99.2% (272 of 274 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-10-24 20:42:31 +02:00
Sylvia van Os
3c9507cb7f Merge pull request #1107 from vanogrid/fix/expiryFieldTextRemainingRed
Fix Expiry field text remaining red after the card is no longer expired
2022-10-24 19:13:53 +02:00
Alexander Ivanov
bfc38807c8 Fix Expiry field text remaining red after the card is no longer expired
Signed-off-by: Alexander Ivanov <vanogrid@gmail.com>
2022-10-24 02:14:43 +03:00
Sylvia van Os
6dc3a28026 Merge pull request #1105 from CatimaLoyalty/create-pull-request/patch-1666508787
Update contributors
2022-10-23 11:58:29 +02:00
Sylvia van Os
eeb507f04e Merge pull request #1104 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-23 11:58:08 +02:00
Sylvia van Os
2746547194 Merge pull request #1103 from vanogrid/fix/storingDateAt12pm
Fix DatePickerDialog sometimes storing dates at 12 PM instead of 12 AM
2022-10-23 11:55:25 +02:00
TheLastProject
c9a8e81047 Update contributors 2022-10-23 07:06:27 +00:00
huang ivan
d87b8ddd4b Translated using Weblate (Chinese (Simplified))
Currently translated at 97.0% (265 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-23 06:00:18 +02:00
Alexander Ivanov
7dfa7071e3 Fix DatePickerDialog sometimes storing dates at 12:00 PM instead of 12:00 AM 2022-10-22 20:46:22 +03:00
Sylvia van Os
92f0091b1d Merge pull request #1086 from recursiveribbons/refactor-importer
Refactor Importer to not read entire file as String
2022-10-22 18:13:38 +02:00
Tomer Ben-Rachel
54d8f30bf1 Offer import when users click on supported import files (#1096) 2022-10-22 12:13:06 +02:00
bors[bot]
f7ef13d594 Merge #1101
1101: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Gediminas Murauskas <muziejusinfo@gmail.com>
Co-authored-by: Mindaugas <mindaugasjurgelenas1997@gmail.com>
Co-authored-by: Angela Enogieru <angys1may@gmail.com>
Co-authored-by: SKULD <ala20031028@163.com>
Co-authored-by: AnimeshChatterjee1 <animesh.chatterjee02@gmail.com>
Co-authored-by: Rishi Agarwal <rishiagarwal130903@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-10-21 18:02:41 +00:00
Rishi Agarwal
2a1157256b Translated using Weblate (Hindi)
Currently translated at 54.5% (149 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-21 19:57:29 +02:00
Sylvia van Os
213ef5060f Translated using Weblate (Slovak)
Currently translated at 74.7% (204 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2022-10-21 19:57:28 +02:00
Gediminas Murauskas
bc24e263b9 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-21 19:57:28 +02:00
Gediminas Murauskas
8da70c41b2 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-21 16:36:01 +02:00
Rishi Agarwal
4d81846fe0 Translated using Weblate (Hindi)
Currently translated at 44.3% (121 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-21 16:36:01 +02:00
AnimeshChatterjee1
2afdedd0b6 Translated using Weblate (Hindi)
Currently translated at 44.3% (121 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-21 16:36:01 +02:00
SKULD
8d944cbb24 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.0% (265 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-21 16:36:01 +02:00
Angela Enogieru
3ffec94b47 Translated using Weblate (Slovak)
Currently translated at 75.0% (205 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2022-10-21 16:36:01 +02:00
Mindaugas
9176dc98ee Translated using Weblate (Lithuanian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-21 16:36:01 +02:00
Gediminas Murauskas
9881854d13 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-21 16:36:01 +02:00
J. Lavoie
2e4d1fa448 Translated using Weblate (Italian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-10-21 16:36:01 +02:00
J. Lavoie
97ca1440b0 Translated using Weblate (French)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-10-21 16:36:01 +02:00
J. Lavoie
a4688c4450 Translated using Weblate (German)
Currently translated at 98.9% (270 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-10-21 16:36:01 +02:00
Sylvia van Os
a7ae2a333a Merge pull request #1100 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-20 19:03:44 +02:00
Laura Ferraz
823e99bd90 Translated using Weblate (Portuguese)
Currently translated at 97.8% (267 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-10-20 16:06:34 +02:00
Oğuz Ersen
e32fccc694 Translated using Weblate (Turkish)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-10-20 16:06:34 +02:00
109247019824
dd568ab51d Translated using Weblate (Bulgarian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-10-20 16:06:34 +02:00
Max
17f55e577b Translated using Weblate (Polish)
Currently translated at 39.8% (45 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-20 16:06:33 +02:00
solokot
3f77223e65 Translated using Weblate (Russian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-10-20 16:06:33 +02:00
Max
28aad933c5 Translated using Weblate (Polish)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-10-20 16:06:33 +02:00
Heimen Stoffels
52ca8396db Translated using Weblate (Dutch)
Currently translated at 99.6% (272 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-10-20 16:06:33 +02:00
Michael Moroni
bc941544ae Translated using Weblate (Italian)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-10-20 16:06:33 +02:00
gallegonovato
e3c3b176eb Translated using Weblate (Spanish)
Currently translated at 100.0% (273 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-10-20 16:06:33 +02:00
Max
3b0b92b954 Translated using Weblate (English)
Currently translated at 99.2% (271 of 273 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-10-20 16:06:33 +02:00
diksha-2911
bfcae03420 Translated using Weblate (Hindi)
Currently translated at 34.9% (93 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-20 16:06:33 +02:00
Md. Al-Amin
ad4db1ef37 Translated using Weblate (Bengali)
Currently translated at 33.4% (89 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn/
2022-10-20 16:06:33 +02:00
Ágata Leuck
fa1a7fd2f1 Translated using Weblate (Portuguese)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-10-20 16:06:33 +02:00
Gediminas Murauskas
7eac08d0a1 Translated using Weblate (Lithuanian)
Currently translated at 80.0% (213 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-10-20 16:06:33 +02:00
Ágata Leuck
dab984b0d4 Translated using Weblate (Portuguese)
Currently translated at 95.5% (108 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-10-20 16:06:33 +02:00
Arnis Jaundzeikars
66361dede2 Translated using Weblate (Latvian)
Currently translated at 1.7% (2 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2022-10-20 16:06:33 +02:00
Arnis Jaundzeikars
628c62fd4b Translated using Weblate (Latvian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2022-10-20 16:06:33 +02:00
Nicolas
84a7e95856 Translated using Weblate (French)
Currently translated at 99.1% (112 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-20 16:06:33 +02:00
Sylvia van Os
fc256d2c4a Merge pull request #1097 from pfaffenrodt/feature/security-maven-repos
Add limitation for jitpack maven repository
2022-10-19 18:34:57 +02:00
Pfaffenrodt
7f81ceeb7e Add limitation for jitpack maven repository 2022-10-18 21:11:50 +02:00
Tong Liu
3179644fbc Issue #1084 - adding text for permission denial. (#1085) 2022-10-16 19:58:29 +02:00
Sylvia van Os
274a58bcb0 Merge pull request #1093 from CatimaLoyalty/create-pull-request/patch-1665923209
Update Fastlane changelogs
2022-10-16 14:27:21 +02:00
TheLastProject
dc7f42b0b6 Update Fastlane changelogs 2022-10-16 12:26:48 +00:00
Sylvia van Os
f859627d7f Document quick spend feature 2022-10-16 14:26:34 +02:00
polarhun
ccf12bf028 #1044 - Automatic Balance Update (#1073) 2022-10-16 14:25:26 +02:00
Sylvia van Os
c34e2fdd70 Merge pull request #1091 from CatimaLoyalty/fix/crashCancelScanActivity
Fix crash on cancelling ScanActivity
2022-10-16 11:41:58 +02:00
Sylvia van Os
ea482c6fad Fix crash on cancelling ScanActivity
Introduced in https://github.com/CatimaLoyalty/Android/pull/1078
2022-10-16 11:07:40 +02:00
Sylvia van Os
54f223b5b0 Merge pull request #1090 from CatimaLoyalty/create-pull-request/patch-1665903989
Update contributors
2022-10-16 10:12:22 +02:00
TheLastProject
74e083bb62 Update contributors 2022-10-16 07:06:28 +00:00
Robin Syl
a9c36cd171 A more reliable and customizable method to parse version from an import file 2022-10-15 20:06:49 +02:00
Sylvia van Os
876b0beb2f Merge pull request #1088 from CatimaLoyalty/fix/cursorAdapterDRY
Reduce repeated code in LoyaltyCardCursorAdapter
2022-10-15 14:40:38 +02:00
Sylvia van Os
1f73beb895 Reduce repeated code in LoyaltyCardCursorAdapter
This also more explicitly sets the text colour to prevent RecyclerView
state bugs
2022-10-15 14:30:42 +02:00
Sylvia van Os
b13aaacdff Merge pull request #1087 from CatimaLoyalty/create-pull-request/patch-1665820428
Update Fastlane changelogs
2022-10-15 09:54:07 +02:00
TheLastProject
ba67c122fa Update Fastlane changelogs 2022-10-15 07:53:48 +00:00
Sylvia van Os
f16550aa9c Document new share intenet receiver in changelog 2022-10-15 09:53:28 +02:00
Robin Syl
ba57fbbf85 Close inputstream in importData 2022-10-14 21:36:02 +02:00
Simon Rusinov
ebedb43e72 issue-614 add receiver for share intent (#1078) 2022-10-14 21:33:59 +02:00
Robin Syl
c10f859919 Refactor Importer to not read entire file as String 2022-10-14 16:56:35 +02:00
Sylvia van Os
8e6e83dfc6 Merge pull request #1080 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-10 21:36:16 +02:00
Jen Kung-chih
326379d222 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.6% (265 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2022-10-10 20:07:48 +02:00
Sylvia van Os
105e85cc63 Translated using Weblate (Spanish)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-10 20:07:48 +02:00
Sylvia van Os
e21dbc85e8 Translated using Weblate (Romanian)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ro/
2022-10-10 20:07:47 +02:00
Simon Rusinov
78348a6f9c issue-1054 handle all deprecation warnings (#1072) 2022-10-10 18:28:35 +02:00
Sneakyturtle22
f98b98b4f3 Translated using Weblate (Hindi)
Currently translated at 27.4% (73 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2022-10-10 15:24:11 +02:00
Arnis Jaundzeikars
d362305a25 Translated using Weblate (Latvian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2022-10-10 15:24:11 +02:00
Sylvia van Os
623cfc671c Translated using Weblate (Indonesian)
Currently translated at 17.6% (20 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2022-10-10 15:24:11 +02:00
Magnitudee
456e2112b8 Translated using Weblate (Indonesian)
Currently translated at 98.8% (263 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2022-10-10 15:24:11 +02:00
gallegonovato
af2fbd1ce3 Translated using Weblate (Spanish)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-10 15:24:11 +02:00
Sylvia van Os
91211f07cb Translated using Weblate (Polish)
Currently translated at 36.2% (41 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-10 15:24:11 +02:00
BootVirtual
9c183e84dd Translated using Weblate (Romanian)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ro/
2022-10-10 15:24:11 +02:00
Thomas Cruveilher
5e3cebf4a1 Translated using Weblate (French)
Currently translated at 63.7% (72 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-10 15:24:11 +02:00
Piotr Zet
9437d23e6e Translated using Weblate (Polish)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-10-10 15:24:11 +02:00
Sneakyturtle22
925a66a12a Added translation using Weblate (Hindi) 2022-10-10 15:24:11 +02:00
gallegonovato
5db8af72a1 Translated using Weblate (Spanish)
Currently translated at 2.6% (3 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-10 15:24:11 +02:00
Mawuena M. KODZO A
2b605eb193 Translated using Weblate (French)
Currently translated at 44.2% (50 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-10 15:24:11 +02:00
BootVirtual
f16d10995c Translated using Weblate (Romanian)
Currently translated at 51.1% (136 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2022-10-10 15:24:11 +02:00
Sylvia van Os
3ef17404b7 Merge pull request #1077 from CatimaLoyalty/fix/groupNameValidation
Improve group name validation flow
2022-10-09 17:19:20 +02:00
Sylvia van Os
1316ac731c Improve group name validation flow 2022-10-09 16:45:54 +02:00
Sylvia van Os
6283a90217 Merge pull request #1075 from CatimaLoyalty/create-pull-request/patch-1665298778
Update contributors
2022-10-09 10:42:13 +02:00
TheLastProject
84e8857067 Update contributors 2022-10-09 06:59:37 +00:00
Sylvia van Os
05a53d7985 Add missing languages to language chooser 2022-10-07 19:41:35 +02:00
Sylvia van Os
94b13b7145 Merge pull request #1071 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-07 19:09:23 +02:00
Mohamed A. Salah
3e55a147c7 Translated using Weblate (Arabic)
Currently translated at 99.2% (264 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2022-10-07 17:20:03 +02:00
109247019824
f05ed2571f Translated using Weblate (Bulgarian)
Currently translated at 12.3% (14 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-10-07 17:20:03 +02:00
Sylvia van Os
c1a37eb2a4 Translated using Weblate (Spanish)
Currently translated at 1.7% (2 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-07 17:20:02 +02:00
Katarzyna
4d8d863780 Translated using Weblate (Polish)
Currently translated at 36.2% (41 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-07 17:20:02 +02:00
Slávek Banko
d56eec4ba9 Translated using Weblate (Czech)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-10-07 17:20:00 +02:00
Thomas Cruveilher
a05356d0e1 Translated using Weblate (French)
Currently translated at 43.3% (49 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-07 17:19:56 +02:00
TenTraicion
4eea6f7f53 Translated using Weblate (Bengali)
Currently translated at 25.5% (68 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn/
2022-10-06 22:43:18 +02:00
Tapu
24e19cc5f8 Translated using Weblate (Bengali)
Currently translated at 25.5% (68 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn/
2022-10-06 22:43:18 +02:00
gallegonovato
cd7631451b Translated using Weblate (Spanish)
Currently translated at 1.7% (2 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2022-10-06 22:43:18 +02:00
이정희
d140130b0d Translated using Weblate (Korean)
Currently translated at 39.8% (106 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2022-10-06 22:43:18 +02:00
BMN
f0453943da Translated using Weblate (German)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-10-06 22:43:18 +02:00
Mawuena M. KODZO A
42152ccbb5 Translated using Weblate (French)
Currently translated at 32.7% (37 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-06 22:43:18 +02:00
Mohamed A. Salah
27f8647243 Added translation using Weblate (Arabic (Najdi)) 2022-10-06 22:43:18 +02:00
Sylvia van Os
b7d520ded6 Merge pull request #1069 from CatimaLoyalty/create-pull-request/patch-1665000141
Update Fastlane changelogs
2022-10-05 22:03:15 +02:00
TheLastProject
04088ff366 Update Fastlane changelogs 2022-10-05 20:02:21 +00:00
Sylvia van Os
d4dcec1a9b Document switch to MaterialAlertDialog 2022-10-05 22:01:56 +02:00
Sylvia van Os
c8306616e3 Merge pull request #1067 from theimpulson/alertDialogImprovements
Alert dialog improvements
2022-10-05 22:01:13 +02:00
Sylvia van Os
b34bdebb5c Merge pull request #1068 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-05 10:42:25 +02:00
Lucas da Costa
9643cb9f94 Translated using Weblate (Portuguese)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-10-05 07:58:58 +02:00
Tapu
645b29226e Translated using Weblate (Bengali (India))
Currently translated at 48.8% (130 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bn_IN/
2022-10-05 07:58:58 +02:00
Tarik Dzambic
c56faba922 Translated using Weblate (Bosnian)
Currently translated at 17.6% (20 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bs/
2022-10-05 07:58:58 +02:00
Tarik Dzambic
55a19eacc9 Translated using Weblate (Bosnian)
Currently translated at 53.3% (142 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bs/
2022-10-05 07:58:58 +02:00
Katarzyna
464a2350ae Translated using Weblate (Polish)
Currently translated at 36.2% (41 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-05 07:58:58 +02:00
Lisa
c44f737c99 Translated using Weblate (Italian)
Currently translated at 57.5% (65 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-10-05 07:58:58 +02:00
Mawuena M. KODZO A
a8794ce60c Translated using Weblate (French)
Currently translated at 25.6% (29 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-10-05 07:58:58 +02:00
gallegonovato
11329ba786 Translated using Weblate (Spanish)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-10-05 07:58:58 +02:00
Tapu
e568bd1af9 Added translation using Weblate (Bengali) 2022-10-05 07:58:58 +02:00
Aayush Gupta
b3fbfdbf9d ManageGroupsActivity: Add spacing between EditText and AlertDialog bounds
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 11:04:40 +05:30
Aayush Gupta
aec4292203 Catima: Migrate to MaterialAlertDialogBuilder everywhere
This follows Material theme and looks much better compared to AlertDialog

Ref: https://developer.android.com/reference/com/google/android/material/dialog/MaterialAlertDialogBuilder

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 10:37:03 +05:30
Sylvia van Os
82733ca414 Merge pull request #1053 from theimpulson/gradle-improvements
Misc Gradle improvements
2022-10-04 21:03:31 +02:00
Aayush Gupta
887424af80 spotbugs: Exclude gradle generated view binding classes
Spot bugs complains about EI_EXPOSE_REP and BC_UNCONFIRMED_CAST bugs in these
classes but they are being generated by Gradle and are out of our control if
we want to use view binding to interact with the views.

Ref: https://developer.android.com/topic/libraries/view-binding

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
f63a25f582 gradle: Move lint params to specific config
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
635ec748b3 Catima: Migrate to view binding
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
fa510e3ffa gradle: Switch to new Int only SDK version properties
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
24a5efd5f8 gradle: Migrate to new plugins and dependency management system
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
Aayush Gupta
547dd55240 gradle: Drop buildToolsVersion
Not required as the latest one is always used

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
2022-10-05 00:20:31 +05:30
bors[bot]
774705d9ad Merge #1065
1065: Remove CodeQL r=TheLastProject a=TheLastProject

It's getting in the way of #1053 and in a year of usage has not once given any type of alert

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-10-04 18:40:08 +00:00
Sylvia van Os
3d756e271c Remove CodeQL
It's getting in the way of #1053 and in a year of usage has not once given any type of alert
2022-10-04 20:39:39 +02:00
Sylvia van Os
2da9a9c1a8 Merge pull request #1064 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-03 22:05:32 +02:00
Lisa
cd67d3c919 Translated using Weblate (Italian)
Currently translated at 18.5% (21 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-10-03 19:48:19 +02:00
Aya Elsaadany
c080fdb244 Translated using Weblate (Arabic)
Currently translated at 99.2% (264 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2022-10-03 19:48:19 +02:00
Arnis Jaundzeikars
9ee61812b8 Translated using Weblate (Latvian)
Currently translated at 94.7% (252 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2022-10-03 19:48:19 +02:00
Oğuz Ersen
bccf0a656b Translated using Weblate (Turkish)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-10-03 19:48:19 +02:00
109247019824
47ca66e9c7 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-10-03 19:48:19 +02:00
Eric
972315ad00 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.8% (263 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-10-03 19:48:19 +02:00
Katarzyna
0aa8b63c0c Translated using Weblate (Polish)
Currently translated at 15.9% (18 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-10-03 19:48:18 +02:00
Slávek Banko
e77cf403eb Translated using Weblate (Czech)
Currently translated at 100.0% (113 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-10-03 19:48:18 +02:00
Jacopo Gennaro Esposito
df89ab29eb Translated using Weblate (Italian)
Currently translated at 17.6% (20 of 113 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-10-03 19:48:18 +02:00
IllusiveMan196
6c6829bfd5 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-10-03 19:48:18 +02:00
solokot
fa531dce81 Translated using Weblate (Russian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-10-03 19:48:18 +02:00
Katarzyna
61bc7ad24a Translated using Weblate (Polish)
Currently translated at 99.6% (265 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-10-03 19:48:18 +02:00
Heimen Stoffels
ce0964e6a7 Translated using Weblate (Dutch)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-10-03 19:48:18 +02:00
Allan Nordhøy
4979ac9d34 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.7% (260 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-10-03 19:48:18 +02:00
Michael Moroni
912bcdf7f7 Translated using Weblate (Italian)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-10-03 19:48:18 +02:00
J. Lavoie
09174e646b Translated using Weblate (French)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-10-03 19:48:18 +02:00
J. Lavoie
0c729cb092 Translated using Weblate (German)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-10-03 19:48:18 +02:00
Slávek Banko
61faa4aa09 Translated using Weblate (Czech)
Currently translated at 100.0% (266 of 266 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-10-03 19:48:18 +02:00
Sylvia van Os
0e7a5428f6 Merge pull request #1062 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.9
Bump robolectric from 4.8.2 to 4.9
2022-10-03 18:18:38 +02:00
dependabot[bot]
8030eb52f3 Bump robolectric from 4.8.2 to 4.9
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.8.2 to 4.9.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.8.2...robolectric-4.9)

---
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>
2022-10-03 02:36:38 +00:00
Sylvia van Os
9fc315158f Name Weblate in CONTRIBUTING.md 2022-10-02 19:24:48 +02:00
Sylvia van Os
971f68b0a1 Merge pull request #1059 from CatimaLoyalty/create-pull-request/patch-1664690892
Update contributors
2022-10-02 10:10:22 +02:00
TheLastProject
adfc17d5c2 Update contributors 2022-10-02 06:08:12 +00:00
Sylvia van Os
5ee2852e4c Merge pull request #1058 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-10-02 00:48:46 +02:00
J. Lavoie
ea1d42fa35 Translated using Weblate (Finnish)
Currently translated at 98.1% (259 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2022-10-01 21:20:34 +02:00
Lisa
f8b90f2c07 Translated using Weblate (Italian)
Currently translated at 16.9% (19 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-10-01 21:20:34 +02:00
J. Lavoie
6dc9821891 Translated using Weblate (French)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-10-01 21:20:34 +02:00
J. Lavoie
93a2e9cdbf Translated using Weblate (Spanish)
Currently translated at 99.6% (263 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-10-01 21:20:34 +02:00
Sylvia van Os
6a9d54d6f0 Merge pull request #1055 from CatimaLoyalty/create-pull-request/patch-1664626344
Update Fastlane changelogs
2022-10-01 14:13:08 +02:00
TheLastProject
28f0b407b5 Update Fastlane changelogs 2022-10-01 12:12:24 +00:00
Sylvia van Os
89ed31ffe0 Update CHANGELOG 2022-10-01 14:12:08 +02:00
Manan Jhaveri
aa481ea094 View photos in gallery when Long Pressed (#1052)
* Open Native Image Viewer on long pressing a photo inside LoyaltyCardViewActivity

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.

Signed-off-by: Manan Jhaveri <incrediblemanan@gmail.com>
2022-10-01 14:11:15 +02:00
bors[bot]
523aaef650 Merge #1051
1051: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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

Co-authored-by: Tomer Ben Rachel <tomerpacific@gmail.com>
Co-authored-by: Evgeniy Khramov <thejenjagamertjg@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-10-01 09:50:55 +00:00
Sylvia van Os
a56c4d449d Remove broken translation 2022-10-01 11:50:22 +02:00
Evgeniy Khramov
1468130477 Translated using Weblate (Russian)
Currently translated at 28.5% (32 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2022-09-28 21:16:13 +02:00
Tomer Ben Rachel
0b5571a065 Translated using Weblate (Hebrew (Israel))
Currently translated at 35.2% (93 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2022-09-28 21:16:13 +02:00
Sylvia van Os
002c221390 Merge pull request #1050 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-26 21:25:16 +02:00
Oğuz Ersen
2272c88d04 Translated using Weblate (English)
Currently translated at 98.8% (261 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-09-26 20:28:50 +02:00
Wanath
6a58bd632f Translated using Weblate (Korean)
Currently translated at 35.9% (95 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2022-09-26 20:28:50 +02:00
Wanath
027a7f798d Translated using Weblate (English)
Currently translated at 98.8% (261 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-09-26 20:28:50 +02:00
Sylvia van Os
dd4ad6d860 Merge pull request #1048 from CatimaLoyalty/create-pull-request/patch-1664085704
Update contributors
2022-09-25 10:27:46 +02:00
TheLastProject
3342b8f83f Update contributors 2022-09-25 06:01:43 +00:00
Sylvia van Os
5951c74fc4 Merge pull request #1047 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-24 12:46:35 +02:00
Nate Higgers
2cae83c84f Translated using Weblate (Chinese (Traditional))
Currently translated at 93.1% (246 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2022-09-24 12:27:25 +02:00
Sylvia van Os
65ac1a2558 Release Catima 2.20.0 2022-09-21 18:54:19 +02:00
Sylvia van Os
6e064e1533 Merge pull request #1042 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-21 18:41:06 +02:00
Sylvia van Os
0d1c3051c8 Translated using Weblate (Ukrainian)
Currently translated at 97.3% (109 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-09-21 18:34:34 +02:00
Slávek Banko
f2885cd96e Translated using Weblate (Czech)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-09-21 18:28:57 +02:00
michael ramirez
98de0a7acb Translated using Weblate (Spanish)
Currently translated at 72.7% (192 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-09-21 18:28:54 +02:00
mondstern
6622d0f4db Translated using Weblate (Ukrainian)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-09-20 19:22:31 +02:00
mondstern
ccc269ab3e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-09-20 19:22:31 +02:00
mondstern
4008cc2349 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-09-20 19:22:31 +02:00
Sylvia van Os
02bb266762 Merge pull request #1039 from CatimaLoyalty/create-pull-request/patch-1663610798
Update Fastlane changelogs
2022-09-19 20:13:00 +02:00
TheLastProject
5e64400faf Update Fastlane changelogs 2022-09-19 18:06:37 +00:00
Sylvia van Os
da2a444ae8 Merge pull request #1036 from CatimaLoyalty/undoArchiveText
Move Archive back into overflow menu
2022-09-19 20:06:23 +02:00
Sylvia van Os
1a22c27326 Move Archive back into overflow menu
While I much prefer the design introduced in
https://github.com/CatimaLoyalty/Android/pull/1009, it sadly caused a
serious performance regression
(https://github.com/CatimaLoyalty/Android/issues/1026).

This commit restores the old behaviour so that a new release isn't
blocked while this is figured out.
2022-09-19 19:49:07 +02:00
Sylvia van Os
b5a7824179 Merge pull request #1035 from CatimaLoyalty/create-pull-request/patch-1663480209
Update contributors
2022-09-18 11:08:07 +02:00
TheLastProject
1f84aa9dc7 Update contributors 2022-09-18 05:50:08 +00:00
Sylvia van Os
942336e281 Merge pull request #1034 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-18 00:08:21 +02:00
Daniel Uhrinyi
27cda3a949 Translated using Weblate (Hungarian)
Currently translated at 98.8% (261 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2022-09-17 19:20:58 +02:00
Magnitudee
1d5d105f8a Translated using Weblate (Indonesian)
Currently translated at 18.7% (21 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2022-09-17 19:20:58 +02:00
Sylvia van Os
5c886d443f Merge pull request #1028 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-16 19:33:58 +02:00
Sylvia van Os
aa306ad11d Remove wrong newline 2022-09-16 18:33:06 +02:00
Magnitudee
d1cc0d9aac Translated using Weblate (Indonesian)
Currently translated at 3.5% (4 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2022-09-16 18:19:04 +02:00
Magnitudee
f8e08f76b8 Translated using Weblate (Indonesian)
Currently translated at 95.4% (252 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2022-09-16 18:19:04 +02:00
tygyh
27c18fa5ff Translated using Weblate (Swedish)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2022-09-16 18:19:04 +02:00
Sylvia van Os
0017e767c9 Cleanups 2022-09-15 21:18:40 +02:00
Ashish Yadav
4d742dc9e4 Update used libraries in AboutActivity 2022-09-15 21:08:14 +02:00
Sylvia van Os
96245543e0 Merge pull request #1021 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-13 19:27:08 +02:00
SC
59767a7c7f Translated using Weblate (Portuguese)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-09-13 19:18:51 +02:00
Titas Pažereckas
8766bcbc71 Translated using Weblate (Lithuanian)
Currently translated at 78.0% (206 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2022-09-13 19:18:51 +02:00
Sylvia van Os
47e87736ca Merge pull request #1020 from CatimaLoyalty/dependabot/gradle/net.lingala.zip4j-zip4j-2.11.2
Bump zip4j from 2.11.1 to 2.11.2
2022-09-13 08:18:27 +02:00
dependabot[bot]
f8af01de24 Bump zip4j from 2.11.1 to 2.11.2
Bumps [zip4j](https://github.com/srikanth-lingala/zip4j) from 2.11.1 to 2.11.2.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.11.1...v2.11.2)

---
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>
2022-09-13 02:37:32 +00:00
Sylvia van Os
4b5a1f8009 Merge pull request #1018 from CatimaLoyalty/create-pull-request/patch-1662872854
Update contributors
2022-09-11 10:00:01 +02:00
TheLastProject
e55773c8d3 Update contributors 2022-09-11 05:07:33 +00:00
Sylvia van Os
e83671eee0 Merge pull request #1017 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-09 20:56:10 +02:00
Colgrave
8b04e36a88 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.6% (263 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-09-09 20:15:49 +02:00
Fede Pujol
76cd06904c Translated using Weblate (Spanish (Argentina))
Currently translated at 1.7% (2 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es_AR/
2022-09-09 20:15:49 +02:00
Slávek Banko
cac7a60708 Translated using Weblate (Czech)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-09-09 20:15:49 +02:00
Michael Moroni
aef1078e74 Translated using Weblate (Italian)
Currently translated at 16.9% (19 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-09-09 20:15:46 +02:00
Sylvia van Os
20c891ee28 Merge pull request #1014 from CatimaLoyalty/fix/alwaysUpdateLastUsed
Always update last used when creating or editing a card
2022-09-08 19:29:27 +02:00
Sylvia van Os
5bfca6e428 Always update last used when creating or editing a card 2022-09-08 19:27:31 +02:00
Sylvia van Os
5971e48ab6 Merge pull request #1015 from CatimaLoyalty/revert-1010-theme
Revert "[UI] Fix colors on navigationBarColor"
2022-09-07 21:20:18 +02:00
Sylvia van Os
427b4d64ed Revert "[UI] Fix colors on navigationBarColor (#1010)"
This reverts commit d0e80f76d6.
2022-09-07 21:18:40 +02:00
Sylvia van Os
41995b5bdd Merge pull request #1013 from CatimaLoyalty/create-pull-request/patch-1662572014
Update Fastlane changelogs
2022-09-07 19:57:37 +02:00
TheLastProject
c74e372c76 Update Fastlane changelogs 2022-09-07 17:33:34 +00:00
Sylvia van Os
e0650bc6f9 Ignore cards without card ID in Fidme import 2022-09-07 19:33:07 +02:00
Sylvia van Os
0de6a91bab Merge pull request #1012 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-07 17:11:41 +02:00
Oğuz Ersen
54b854eb64 Translated using Weblate (Turkish)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-09-07 15:38:17 +02:00
109247019824
47dd3a35ce Translated using Weblate (Bulgarian)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-09-07 15:38:17 +02:00
Slávek Banko
d16f11d9b7 Translated using Weblate (Czech)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-09-07 15:38:17 +02:00
solokot
ce190ba3f0 Translated using Weblate (Russian)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-09-07 15:38:16 +02:00
Heimen Stoffels
070419c888 Translated using Weblate (Dutch)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-09-07 15:38:16 +02:00
Allan Nordhøy
5b6489af9f Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.4% (260 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-09-07 15:38:16 +02:00
Michael Moroni
84c2c59038 Translated using Weblate (Italian)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-09-07 15:38:16 +02:00
J. Lavoie
8b5efac70a Translated using Weblate (French)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-09-07 15:38:16 +02:00
J. Lavoie
f82860ddd9 Translated using Weblate (German)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-09-07 15:38:16 +02:00
Slávek Banko
d3af048fd5 Translated using Weblate (Czech)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-09-07 15:38:16 +02:00
J. Lavoie
2b3c908298 Translated using Weblate (Italian)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-09-07 15:38:16 +02:00
Michael Moroni
14f35edb0f Translated using Weblate (Italian)
Currently translated at 100.0% (264 of 264 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-09-07 15:38:16 +02:00
Jean-Baptiste
d0e80f76d6 [UI] Fix colors on navigationBarColor (#1010)
* [UI]Add colors for navigationBarColor

* Add color on Navigation Bar to more activities

* Fix navigation colour on non-view layouts

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-09-06 23:01:28 +02:00
Sylvia van Os
ee155c721c Merge pull request #1011 from CatimaLoyalty/create-pull-request/patch-1662400409
Update Fastlane changelogs
2022-09-05 21:41:42 +02:00
TheLastProject
8adc43c9a2 Update Fastlane changelogs 2022-09-05 17:53:28 +00:00
Sylvia van Os
02d59dc71d Merge pull request #1009 from CatimaLoyalty/feature/archiveTextLinkBelowCards
Put archive link below card list
2022-09-05 19:53:12 +02:00
Sylvia van Os
3edb0f6a5d Improve welcome screen 2022-09-04 22:29:59 +02:00
Sylvia van Os
acf9029394 Put archive link below card list 2022-09-04 22:09:18 +02:00
bors[bot]
10588769b3 Merge #1007
1007: Fix a crash when there's no web browser installed r=TheLastProject a=vanogrid

Fixes #984

I tested it by running emulators with different API versions and disabling the default web browser. Tested on Android 8.1, 12 and 13.

Signed-off-by: Alexander Ivanov <vanogrid@gmail.com>

Co-authored-by: Alexander Ivanov <vanogrid@gmail.com>
2022-09-04 13:25:51 +00:00
Alexander Ivanov
68a24fae2f Fix a crash when there's no web browser installed
Signed-off-by: Alexander Ivanov <vanogrid@gmail.com>
2022-09-04 15:33:43 +03:00
Sylvia van Os
625ea26b0a Merge pull request #1008 from CatimaLoyalty/create-pull-request/patch-1662271250
Update contributors
2022-09-04 10:08:42 +02:00
TheLastProject
dc2c73baa6 Update contributors 2022-09-04 06:00:50 +00:00
Sylvia van Os
b8db8bffd4 Merge pull request #1004 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-09-01 19:04:31 +02:00
Csaba
6a078e983b Translated using Weblate (Hungarian)
Currently translated at 93.4% (244 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2022-09-01 14:20:07 +02:00
Neko Nekowazarashi
bdfc74759f Translated using Weblate (Indonesian)
Currently translated at 2.6% (3 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/id/
2022-09-01 14:20:07 +02:00
Neko Nekowazarashi
b13e14c916 Translated using Weblate (Indonesian)
Currently translated at 79.6% (208 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2022-09-01 14:20:07 +02:00
Tom Sawyer
32adb85c5b Translated using Weblate (Swedish)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2022-09-01 14:20:07 +02:00
J. Lavoie
a51854e5de Translated using Weblate (Finnish)
Currently translated at 98.0% (256 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2022-09-01 14:20:07 +02:00
Fede Pujol
9ce72bbaaa Translated using Weblate (Spanish (Argentina))
Currently translated at 32.1% (84 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es_AR/
2022-09-01 14:20:07 +02:00
Jean-Luc Tibaux
544020febf Translated using Weblate (German)
Currently translated at 64.2% (72 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-09-01 14:20:07 +02:00
Sylvia van Os
9cfc45e495 Merge pull request #1000 from CatimaLoyalty/create-pull-request/patch-1661666017
Update contributors
2022-08-28 11:22:22 +02:00
TheLastProject
992ed32d7c Update contributors 2022-08-28 05:53:36 +00:00
Sylvia van Os
ac4f83b9e0 Merge pull request #999 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-08-27 08:53:31 +02:00
ce i moa
5810d199fc Translated using Weblate (Ukrainian)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-08-27 01:18:43 +02:00
Sylvia van Os
8528e5d8f2 Make spotBugs happy 2022-08-25 19:38:53 +02:00
Sylvia van Os
83d19c30c2 Throw more exceptions
We want to know when the code is wrong instead of silently failing
2022-08-25 19:28:09 +02:00
bors[bot]
646dab336d Merge #997
997: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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

Co-authored-by: Booc Sylvan <sylvanbooc@gmail.com>
Co-authored-by: ce i moa <serhiilinnyk96@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-08-24 20:49:25 +00:00
Sylvia van Os
d05e86cd41 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-08-24 22:45:34 +02:00
ce i moa
6d1c5b31f4 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-08-24 22:05:55 +02:00
Booc Sylvan
583cb49949 Added translation using Weblate (English (Middle)) 2022-08-24 22:05:55 +02:00
Sylvia van Os
7f5c7b4cd9 Merge pull request #996 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.8.2
Bump robolectric from 4.8.1 to 4.8.2
2022-08-23 06:29:27 +02:00
Sylvia van Os
17350639aa Merge pull request #995 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-08-23 06:28:39 +02:00
dependabot[bot]
edb961085a Bump robolectric from 4.8.1 to 4.8.2
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.8.1 to 4.8.2.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.8.1...robolectric-4.8.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-23 02:25:42 +00:00
Slávek Banko
96c5952869 Translated using Weblate (Czech)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-08-23 03:15:52 +02:00
Michael Moroni
2bac1700d1 Translated using Weblate (Italian)
Currently translated at 16.9% (19 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-08-23 03:15:52 +02:00
tfuxu
fe2695e6af Translated using Weblate (Polish)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-08-23 03:15:52 +02:00
Sylvia van Os
2120eb9574 Merge pull request #993 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-08-22 08:01:54 +02:00
Slávek Banko
03917a4067 Translated using Weblate (Czech)
Currently translated at 100.0% (112 of 112 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-08-22 01:19:30 +02:00
bors[bot]
bc09a23c84 Merge #992
992: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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

Co-authored-by: tfuxu <igormakarowicz@gmail.com>
Co-authored-by: Altons <marsupilami450@gmail.com>
2022-08-21 22:24:54 +00:00
Altons
0ed800634c Translated using Weblate (French)
Currently translated at 21.6% (24 of 111 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-08-22 00:21:45 +02:00
tfuxu
ff4ecfe780 Translated using Weblate (Polish)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-08-22 00:21:45 +02:00
Sylvia van Os
2691442809 Merge pull request #990 from CatimaLoyalty/create-pull-request/patch-1661059784
Update contributors
2022-08-21 11:37:19 +02:00
TheLastProject
18515e2660 Update contributors 2022-08-21 05:29:43 +00:00
Sylvia van Os
df5cbaf7ad Merge pull request #989 from CatimaLoyalty/create-pull-request/patch-1661004562
Update Fastlane changelogs
2022-08-20 16:11:32 +02:00
TheLastProject
3cacd03ccd Update Fastlane changelogs 2022-08-20 14:09:21 +00:00
Sylvia van Os
2ec04dfa9e Update CHANGELOG 2022-08-20 16:09:05 +02:00
Sylvia van Os
6943956c37 Merge pull request #988 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-08-20 16:06:20 +02:00
Sylvia van Os
26f0f7909e Merge pull request #987 from Donnnno/monochrome-icon
monochrome icon
2022-08-20 16:05:50 +02:00
gbonaspetti
2a1682133b Translated using Weblate (Portuguese)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-08-20 15:22:38 +02:00
Donnnno
02897f312e monochrome icon 2022-08-20 14:46:52 +02:00
Sylvia van Os
7d4d4cf5c0 Merge pull request #986 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-08-19 17:12:21 +02:00
IllusiveMan196
1fcf797bfe Translated using Weblate (Ukrainian)
Currently translated at 40.5% (45 of 111 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-08-19 04:20:01 +02:00
IllusiveMan196
b94d417157 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (261 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-08-19 04:20:01 +02:00
HowITsDone
330227d09b Translated using Weblate (Spanish)
Currently translated at 72.0% (188 of 261 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-08-19 04:20:01 +02:00
Sylvia van Os
67f1ffe617 Merge pull request #985 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-08-16 19:07:24 +02:00
Ahmed Saleh
220d7a5ea2 Translated using Weblate (Arabic)
Currently translated at 100.0% (261 of 261 strings)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


It also includes following components:

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



Current translation status:

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

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

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

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

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

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

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

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

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


It also includes following components:

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



Current translation status:

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

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

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

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

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


It also includes following components:

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



Current translation status:

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

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

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


It also includes following components:

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



Current translation status:

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

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

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

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


It also includes following components:

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



Current translation status:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


It also includes following components:

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



Current translation status:

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

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

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

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

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-29 02:23:13 +00:00
Sylvia van Os
1c2e810319 Release Catima 2.17.1 2022-06-28 19:49:44 +02:00
Alajemba
4f7f72f213 Fix for 'Crash on clicking "Add from image" button in scan activity #856' 2022-06-28 06:33:36 +00:00
Sylvia van Os
88d27c0385 Fix hardcoded text colour 2022-06-27 22:28:43 +02:00
Sylvia van Os
2f1f6ed452 Merge pull request #916 from CatimaLoyalty/create-pull-request/patch-1656220588
Update contributors
2022-06-26 10:24:16 +02:00
TheLastProject
1ac816000d Update contributors 2022-06-26 05:16:28 +00:00
Sylvia van Os
aa069e93b1 Metadata fixes 2022-06-24 22:47:44 +02:00
Sylvia van Os
2f0084a73b Release Catima 2.17.0 2022-06-24 21:25:56 +02:00
Sylvia van Os
68624f8911 Merge pull request #913 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-06-24 19:25:56 +02:00
SC
5d7c503465 Translated using Weblate (Portuguese)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-06-24 19:17:40 +02:00
Freddo espresso
9015b17de6 Translated using Weblate (Greek)
Currently translated at 0.9% (1 of 107 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/el/
2022-06-24 19:17:40 +02:00
Freddo espresso
a5f7265bd6 Translated using Weblate (Greek)
Currently translated at 29.9% (77 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2022-06-24 19:17:40 +02:00
Sylvia van Os
b03d579ee7 Merge pull request #911 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-06-24 17:18:31 +02:00
Sylvia van Os
f4511aa82e Merge pull request #912 from CatimaLoyalty/dependabot/gradle/net.lingala.zip4j-zip4j-2.11.1
Bump zip4j from 2.11.0 to 2.11.1
2022-06-24 17:18:20 +02:00
dependabot[bot]
69da7e1e2c Bump zip4j from 2.11.0 to 2.11.1
Bumps [zip4j](https://github.com/srikanth-lingala/zip4j) from 2.11.0 to 2.11.1.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.11.0...v2.11.1)

---
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>
2022-06-24 02:28:08 +00:00
Sylvia van Os
b3de8428f8 Cleanups 2022-06-23 18:51:22 +02:00
Astro Hops
7edf97774b Translated using Weblate (Polish)
Currently translated at 2.8% (3 of 107 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pl/
2022-06-23 13:17:59 +02:00
Astro Hops
fddad366d6 Translated using Weblate (Polish)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-06-23 13:17:59 +02:00
Sylvia van Os
fcb03791b1 Merge pull request #910 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-06-21 22:48:35 +02:00
Altons
e25b0ee251 Translated using Weblate (French)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-06-21 22:15:16 +02:00
Altons
c5b5b0e979 Translated using Weblate (German)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-06-21 22:15:16 +02:00
Sylvia van Os
347e975d9b Merge pull request #909 from CatimaLoyalty/dependabot/gradle/net.lingala.zip4j-zip4j-2.11.0
Bump zip4j from 2.10.0 to 2.11.0
2022-06-21 19:38:24 +02:00
dependabot[bot]
8890788c3d Bump zip4j from 2.10.0 to 2.11.0
Bumps [zip4j](https://github.com/srikanth-lingala/zip4j) from 2.10.0 to 2.11.0.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.10.0...v2.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-21 02:45:04 +00:00
Sylvia van Os
9f9da82e18 Merge pull request #908 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-06-20 21:27:14 +02:00
Oğuz Ersen
ab8490798b Translated using Weblate (Turkish)
Currently translated at 67.2% (72 of 107 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-06-20 21:20:05 +02:00
Oğuz Ersen
c4b9bf77d9 Translated using Weblate (Turkish)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-06-20 21:20:05 +02:00
109247019824
a1a653b939 Translated using Weblate (Bulgarian)
Currently translated at 6.5% (7 of 107 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-06-20 21:20:05 +02:00
109247019824
f9cf64a2ea Translated using Weblate (Bulgarian)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-06-20 21:20:05 +02:00
Slávek Banko
83e9a01b8d Translated using Weblate (Czech)
Currently translated at 100.0% (107 of 107 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-06-20 21:20:05 +02:00
solokot
1d776914ee Translated using Weblate (Russian)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-06-20 21:20:05 +02:00
Heimen Stoffels
bfc103dca9 Translated using Weblate (Dutch)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-06-20 21:20:05 +02:00
Allan Nordhøy
0281f15b36 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.4% (253 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-06-20 21:20:05 +02:00
J. Lavoie
e1929de4b3 Translated using Weblate (Italian)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-06-20 21:20:05 +02:00
J. Lavoie
81699dbed9 Translated using Weblate (French)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-06-20 21:20:05 +02:00
J. Lavoie
5c42342070 Translated using Weblate (German)
Currently translated at 99.6% (256 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-06-20 21:20:05 +02:00
Slávek Banko
f1c21fc7fe Translated using Weblate (Czech)
Currently translated at 100.0% (257 of 257 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-06-20 21:20:05 +02:00
Sylvia van Os
7c418dc416 Revert "Hardcode Google Play "Varies with device" value"
This reverts commit 677283c872.
2022-06-20 19:50:23 +02:00
Sylvia van Os
3610e9dfb2 Merge pull request #906 from CatimaLoyalty/create-pull-request/patch-1655616434
Update contributors
2022-06-19 10:51:33 +02:00
TheLastProject
c5793da52c Update contributors 2022-06-19 05:27:14 +00:00
Sylvia van Os
deef5ced0c Merge pull request #905 from CatimaLoyalty/create-pull-request/patch-1655590869
Update Fastlane changelogs
2022-06-19 00:21:41 +02:00
TheLastProject
7861f6cd8c Update Fastlane changelogs 2022-06-18 22:21:09 +00:00
Sylvia van Os
4ad73a754e Replace rotation lock icon with barcode orientation setting (#901) 2022-06-19 00:20:56 +02:00
Sylvia van Os
d3487cc535 Merge pull request #902 from CatimaLoyalty/feature/archive
Archive support
2022-06-18 14:13:16 +02:00
Sylvia van Os
677283c872 Hardcode Google Play "Varies with device" value
Fixes #903
2022-06-18 13:09:24 +02:00
Sylvia van Os
d39b732b77 Fix export and shortcut bugs 2022-06-17 19:53:51 +02:00
Sylvia van Os
5242290a8f Update CHANGELOG 2022-06-17 17:50:08 +02:00
Sylvia van Os
9d07c1a29c Cleanups 2022-06-16 23:53:46 +02:00
Jasielprogramador
548b1b1e8e Archive support 2022-06-16 22:59:11 +02:00
Sylvia van Os
8318d2e7c3 Merge pull request #897 from CatimaLoyalty/create-pull-request/patch-1655011240
Update contributors
2022-06-12 10:49:13 +02:00
TheLastProject
99e836a8f1 Update contributors 2022-06-12 05:20:39 +00:00
Sylvia van Os
3586d27249 Update Fastlane 2022-06-08 18:49:46 +02:00
Sylvia van Os
5904ba2af7 Merge pull request #895 from CatimaLoyalty/create-pull-request/patch-1654548179
Update Fastlane changelogs
2022-06-06 22:45:39 +02:00
TheLastProject
48b89af11a Update Fastlane changelogs 2022-06-06 20:42:59 +00:00
Sylvia van Os
0b0a5cc5fa Reword 2022-06-06 22:42:40 +02:00
Sylvia van Os
098f987d66 Update CHANGELOG 2022-06-06 22:40:01 +02:00
Sylvia van Os
0083150fa9 Merge pull request #893 from pooyanazari/MinOfExpireDate
Set min date for expire date #753
2022-06-06 22:39:07 +02:00
pooyanazari
1c4b4f1f25 Set min date for expire date 2022-06-06 21:58:29 +04:30
Sylvia van Os
b7f596568d Merge pull request #892 from CatimaLoyalty/dependabot/gradle/androidx.appcompat-appcompat-1.4.2
Bump appcompat from 1.4.1 to 1.4.2
2022-06-02 20:17:00 +02:00
dependabot[bot]
2df7b9e8c6 Bump appcompat from 1.4.1 to 1.4.2
Bumps appcompat from 1.4.1 to 1.4.2.

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-02 02:29:19 +00:00
Sylvia van Os
c37e5f4076 Merge pull request #890 from CatimaLoyalty/dependabot/gradle/com.google.android.material-material-1.6.1
Bump material from 1.6.0 to 1.6.1
2022-06-01 17:15:35 +02:00
dependabot[bot]
8840390b3a Bump material from 1.6.0 to 1.6.1
Bumps [material](https://github.com/material-components/material-components-android) from 1.6.0 to 1.6.1.
- [Release notes](https://github.com/material-components/material-components-android/releases)
- [Commits](https://github.com/material-components/material-components-android/compare/1.6.0...1.6.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-01 03:46:22 +00:00
Sylvia van Os
a8a8ac59b0 Merge pull request #889 from CatimaLoyalty/create-pull-request/patch-1653802088
Update contributors
2022-05-29 12:20:36 +02:00
TheLastProject
a2e37a82b7 Update contributors 2022-05-29 05:28:08 +00:00
Sylvia van Os
1b52cafea6 Merge pull request #886 from CatimaLoyalty/create-pull-request/patch-1653505625
Update Fastlane changelogs
2022-05-25 21:07:46 +02:00
TheLastProject
706bf36584 Update Fastlane changelogs 2022-05-25 19:07:05 +00:00
Sylvia van Os
05f3b77a73 Various minor fixes 2022-05-25 21:06:43 +02:00
Asier
00b0502a6a Add card duplication feature 2022-05-25 21:03:11 +02:00
Sylvia van Os
ed755c35b4 Merge pull request #883 from CatimaLoyalty/dependabot/gradle/androidx.core-core-splashscreen-1.0.0-rc01
Bump core-splashscreen from 1.0.0-beta02 to 1.0.0-rc01
2022-05-20 21:50:31 +02:00
dependabot[bot]
3101688abb Bump core-splashscreen from 1.0.0-beta02 to 1.0.0-rc01
Bumps core-splashscreen from 1.0.0-beta02 to 1.0.0-rc01.

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-19 02:24:30 +00:00
Sylvia van Os
98c9c9ce15 Merge pull request #882 from CatimaLoyalty/create-pull-request/patch-1652592163
Update contributors
2022-05-15 10:52:13 +02:00
TheLastProject
3040cbf7a7 Update contributors 2022-05-15 05:22:42 +00:00
Sylvia van Os
806b232d60 Merge pull request #878 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-05-11 19:24:36 +02:00
Moi Toi
982e012940 Translated using Weblate (French)
Currently translated at 21.6% (23 of 106 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-05-11 19:14:06 +02:00
Grzegorz
e2cff0f11e Translated using Weblate (Polish)
Currently translated at 99.1% (241 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-05-11 19:14:06 +02:00
Sylvia van Os
e678bae95c Merge pull request #875 from CatimaLoyalty/dependabot/gradle/com.google.android.material-material-1.6.0
Bump material from 1.5.0 to 1.6.0
2022-05-10 13:51:55 +02:00
Sylvia van Os
c3758f2a23 Merge pull request #874 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.8.1
Bump robolectric from 4.7.3 to 4.8.1
2022-05-10 13:38:29 +02:00
Sylvia van Os
4852e61c99 Merge pull request #876 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-05-05 19:53:25 +02:00
Slávek Banko
74d55c8b73 Translated using Weblate (Czech)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-05-05 15:09:58 +02:00
dependabot[bot]
89670b5176 Bump material from 1.5.0 to 1.6.0
Bumps [material](https://github.com/material-components/material-components-android) from 1.5.0 to 1.6.0.
- [Release notes](https://github.com/material-components/material-components-android/releases)
- [Commits](https://github.com/material-components/material-components-android/compare/1.5.0...1.6.0)

---
updated-dependencies:
- dependency-name: com.google.android.material:material
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-05 02:27:24 +00:00
dependabot[bot]
6840f39e35 Bump robolectric from 4.7.3 to 4.8.1
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.7.3 to 4.8.1.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.7.3...robolectric-4.8.1)

---
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>
2022-05-04 02:23:24 +00:00
bors[bot]
635fb0105b Merge #873
873: Bump core from 3.4.1 to 3.5.0 r=TheLastProject a=dependabot[bot]

Bumps [core](https://github.com/zxing/zxing) from 3.4.1 to 3.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/zxing/zxing/releases">core's releases</a>.</em></p>
<blockquote>
<h2>ZXing 3.5.0</h2>
<ul>
<li>Many edge-case fixes and improvements from <a href="https://bugs.chromium.org/p/oss-fuzz/issues/list">oss-fuzz</a></li>
<li>Various improvements and fixes to Aztec, PDF417, DataMatrix decoding</li>
<li>New 'minimal' encoding mode from <a href="https://github.com/AlexGeller1"><code>`@​AlexGeller1</code></a>` (<a href="https://github-redirect.dependabot.com/zxing/zxing/issues/1444">zxing/zxing#1444</a>)</li>
</ul>
<p>See <a href="https://github.com/zxing/zxing/milestone/13?closed=1">https://github.com/zxing/zxing/milestone/13?closed=1</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/zxing/zxing/blob/master/CHANGES">core's changelog</a>.</em></p>
<blockquote>
<p>0.1 (09 Nov 2007)</p>
<ul>
<li>Initial release</li>
</ul>
<p>0.1.1 (11 Nov 2007)</p>
<ul>
<li>Fixed bug decoding version 0 QR Codes</li>
<li>Now default zoom is 2.5x in Java ME client</li>
</ul>
<p>0.1.2 (28 Nov 2007)</p>
<ul>
<li>Issue 11 fixed: Build problems on Windows</li>
<li>Can now build &quot;ZXingReaderBasic&quot; which does not require JSR-234</li>
<li>Issue 14 fixed: release .zip builds into one directory</li>
</ul>
<p>0.1.3 (7 Dec 2007)</p>
<ul>
<li>Unit test for QR Code decoding</li>
<li>Added EAN-13 support</li>
<li>Now builds with class file format version 1.2 -- may solve some compatibility issues?</li>
<li>Fixed obfuscation step bug causing NoClassDefFoundError</li>
</ul>
<p>0.1.4 (13 Dec 2007)</p>
<ul>
<li>Added Blackberry client build script -- does not yet work</li>
<li>Big change to handling of content of barcodes:
<ul>
<li>com.google.zxing.client.result moved from core-ext to core</li>
<li>Rewritten for J2ME</li>
<li>core-ext removed</li>
<li>J2ME client now uses this code for better parsing/handling of results</li>
</ul>
</li>
</ul>
<p>0.2 (07 Jan 2008)</p>
<ul>
<li>Few small bug fixes in AlignmentPatternFinder, MultiFormatReader
(thank K. Kakima, Andreas)</li>
<li>LCDUIImageMonochromeBitmapSource now public</li>
<li>Notably improved decoding for Basic version -- Regular version still
your best bet if you can run it though</li>
</ul>
<p>0.2.1 (16 Jan 2008)</p>
<ul>
<li>Slight tweaks and enhancements to decode and runtime performance of UPCDecoder</li>
<li>Added black-box test suites against a known set of images
(Thanks to Enrique G. S. for additional images)</li>
</ul>
<p>0.2.2 (22 Jan 2008)</p>
<ul>
<li>Now includes junit locally to build tests</li>
<li>Fixed &quot;MIDlet&quot; name in MANIFEST.MF, which may solve some problems</li>
<li>Friendlier error message when barcode can't be found</li>
</ul>
<p>0.3 (04 Feb 2008)</p>
<ul>
<li>Major refactoring of 1D barcode decoding</li>
<li>Added support for UPC-E, EAN-8</li>
<li>Also added Code 39, Code 128 support -- may need refinement</li>
<li>Now any &quot;game&quot; key triggers photo capture</li>
<li>Workaround implemented for Nokias that use &quot;capture://image&quot; in MMAPI</li>
<li>UPC codes now trigger lookup to upcdatabase.com</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="eb76d0283c"><code>eb76d02</code></a> [maven-release-plugin] prepare release zxing-3.5.0</li>
<li><a href="89a56210cc"><code>89a5621</code></a> Update Android modules for 3.5.0</li>
<li><a href="939632072f"><code>9396320</code></a> Minor dep updates</li>
<li><a href="fbeeae49f5"><code>fbeeae4</code></a> Update README.md: Add SCodes Qt/Qml wrapper library link (<a href="https://github-redirect.dependabot.com/zxing/zxing/issues/1518">#1518</a>)</li>
<li><a href="4f9f466f7d"><code>4f9f466</code></a> Update AndroidManifest.xml: set exported flag (<a href="https://github-redirect.dependabot.com/zxing/zxing/issues/1516">#1516</a>)</li>
<li><a href="5f20b8d095"><code>5f20b8d</code></a> Replacing non ISO-8859-1 characters in PDF417 input with '?' (<a href="https://github-redirect.dependabot.com/zxing/zxing/issues/1514">#1514</a>)</li>
<li><a href="8265242784"><code>8265242</code></a> Share the ECI string builder of the data matrix decoder with the PDF417 decod...</li>
<li><a href="ce1a1a53cf"><code>ce1a1a5</code></a> Add multi-eci decoding for PDF417 (<a href="https://github-redirect.dependabot.com/zxing/zxing/issues/1507">#1507</a>)</li>
<li><a href="92854d4a55"><code>92854d4</code></a> Add support for multi-eci encoding for PDF417 (<a href="https://github-redirect.dependabot.com/zxing/zxing/issues/1506">#1506</a>)</li>
<li><a href="4bd257e8c5"><code>4bd257e</code></a> BitArray perf improvement, possibly addressing <a href="https://bugs.chromium.org/p/os">https://bugs.chromium.org/p/os</a>...</li>
<li>Additional commits viewable in <a href="https://github.com/zxing/zxing/compare/zxing-3.4.1...zxing-3.5.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.google.zxing:core&package-manager=gradle&previous-version=3.4.1&new-version=3.5.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-02 17:01:53 +00:00
dependabot[bot]
9ad50041b5 Bump core from 3.4.1 to 3.5.0
Bumps [core](https://github.com/zxing/zxing) from 3.4.1 to 3.5.0.
- [Release notes](https://github.com/zxing/zxing/releases)
- [Changelog](https://github.com/zxing/zxing/blob/master/CHANGES)
- [Commits](https://github.com/zxing/zxing/compare/zxing-3.4.1...zxing-3.5.0)

---
updated-dependencies:
- dependency-name: com.google.zxing:core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-02 02:24:32 +00:00
Sylvia van Os
0887a16555 Merge pull request #872 from CatimaLoyalty/create-pull-request/patch-1651383162
Update contributors
2022-05-01 11:23:07 +02:00
TheLastProject
ea690d19dc Update contributors 2022-05-01 05:32:42 +00:00
Sylvia van Os
40f7b6e417 Merge pull request #870 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-04-27 11:33:25 +02:00
IllusiveMan196
25b3e18618 Translated using Weblate (Ukrainian)
Currently translated at 33.0% (35 of 106 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-04-26 04:08:03 +02:00
IllusiveMan196
aa28a52855 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-04-26 04:08:03 +02:00
Sylvia van Os
fe87fe1981 Merge pull request #869 from CatimaLoyalty/create-pull-request/patch-1650777439
Update contributors
2022-04-24 09:16:25 +02:00
TheLastProject
6f66b95506 Update contributors 2022-04-24 05:17:19 +00:00
bors[bot]
a80ab32f07 Merge #868
868: Deps/net.lingala.zip4j zip4j 2.10.0 r=TheLastProject a=TheLastProject



Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-04-17 12:27:33 +00:00
Sylvia van Os
de6248a5d6 Fix wrong password detection 2022-04-17 14:25:26 +02:00
dependabot[bot]
cfbaeb1ffc Bump zip4j from 2.9.1 to 2.10.0
Bumps [zip4j](https://github.com/srikanth-lingala/zip4j) from 2.9.1 to 2.10.0.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.9.1...v2.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-17 12:13:30 +00:00
Sylvia van Os
749a4ddb29 Merge pull request #867 from CatimaLoyalty/create-pull-request/patch-1650172610
Update contributors
2022-04-17 10:52:53 +02:00
TheLastProject
4c070c3137 Update contributors 2022-04-17 05:16:50 +00:00
bors[bot]
5cb8cf3a14 Merge #866
866: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: 109247019824 <stoyan@gmx.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
2022-04-16 21:55:44 +00:00
Oğuz Ersen
a1410a588e Translated using Weblate (Turkish)
Currently translated at 60.3% (64 of 106 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-04-16 20:11:15 +02:00
109247019824
b2b40809ad Translated using Weblate (Bulgarian)
Currently translated at 5.6% (6 of 106 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-04-16 20:11:15 +02:00
Allan Nordhøy
c092a04e9c Translated using Weblate (Norwegian Bokmål)
Currently translated at 20.7% (22 of 106 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2022-04-16 20:11:15 +02:00
Allan Nordhøy
5bd3a309cc Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.7% (240 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-04-16 20:11:15 +02:00
Sylvia van Os
4bf6f6cd5f Release Catima 2.16.3 2022-04-15 18:51:42 +02:00
Sylvia van Os
1872bea0c3 Stocard: Ignore cards with missing card data
Stocard appears to keep images for deleted cards, which causes some
cards to have only images and no data, making them impossible to import.

This is most likely a bug on Stocard's side. As a workaround, we ignore
cards with no data file.
2022-04-14 22:25:46 +02:00
Sylvia van Os
665ef5f712 Merge pull request #864 from CatimaLoyalty/create-pull-request/patch-1649961053
Update Fastlane changelogs
2022-04-14 20:31:52 +02:00
TheLastProject
9fbcb23465 Update Fastlane changelogs 2022-04-14 18:30:52 +00:00
Sylvia van Os
25c35acd6d Import Stocard GS1_128 as CODE_128
GS1_128 seems to be an implementation of CODE_128. ZXING doesn't
explicitly support GS1_128, but CODE_128 should work probably.
2022-04-14 20:30:35 +02:00
Sylvia van Os
35747b7d9f Fix import getting stuck on unexpected exception 2022-04-14 20:20:36 +02:00
Sylvia van Os
eea5cdfdd0 Merge pull request #862 from CatimaLoyalty/create-pull-request/patch-1649567192
Update contributors
2022-04-10 11:16:32 +02:00
TheLastProject
e0c28830ab Update contributors 2022-04-10 05:06:31 +00:00
bors[bot]
e714d98ae6 Merge #860
860: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: 109247019824 <stoyan@gmx.com>
Co-authored-by: Quentin PAGÈS <quentinantonin@free.fr>
2022-04-08 20:03:02 +00:00
Sylvia van Os
bbfba92de0 Merge pull request #859 from CatimaLoyalty/create-pull-request/patch-1648963016
Update contributors
2022-04-08 22:02:32 +02:00
Quentin PAGÈS
efda8f9f10 Translated using Weblate (Occitan)
Currently translated at 39.5% (96 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/oc/
2022-04-04 09:10:40 +02:00
109247019824
041472b44b Translated using Weblate (Bulgarian)
Currently translated at 4.7% (5 of 105 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-04-04 09:10:40 +02:00
TheLastProject
92f79e9d3e Update contributors 2022-04-03 05:16:56 +00:00
Sylvia van Os
f932d8f6e4 Release Catima 2.16.2 2022-03-31 23:11:03 +02:00
bors[bot]
5e3399cd32 Merge #857
857: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: 109247019824 <stoyan@gmx.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
2022-03-31 20:57:20 +00:00
Oğuz Ersen
b736f31dc2 Translated using Weblate (Turkish)
Currently translated at 60.0% (63 of 105 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-03-31 22:56:04 +02:00
109247019824
ff285430c0 Translated using Weblate (Bulgarian)
Currently translated at 4.7% (5 of 105 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-03-31 22:56:04 +02:00
bors[bot]
504c1ac516 Merge #855
855: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Tony C <kodo60@gmail.com>
2022-03-31 16:12:14 +00:00
Tony C
c4746fe2b9 Translated using Weblate (French)
Currently translated at 19.2% (20 of 104 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-03-31 18:09:35 +02:00
Sylvia van Os
99383d4fc6 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-03-30 19:45:18 +02:00
Sylvia van Os
71cd16caac Fix broken colours in Fidme import 2022-03-30 19:45:10 +02:00
Sylvia van Os
6a04077cec Merge pull request #854 from CatimaLoyalty/create-pull-request/patch-1648585831
Update Fastlane changelogs
2022-03-29 22:31:42 +02:00
TheLastProject
5664ff5631 Update Fastlane changelogs 2022-03-29 20:30:30 +00:00
Sylvia van Os
48764e266e Update CHANGELOG 2022-03-29 22:29:55 +02:00
Sylvia van Os
435cfd2839 Merge pull request #853 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-03-29 22:20:08 +02:00
Sylvia van Os
34639f2a2e Don't render text sequences as single character 2022-03-29 22:19:12 +02:00
Joel A
ce9c3bffe6 Translated using Weblate (Swedish)
Currently translated at 1.9% (2 of 104 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2022-03-29 21:09:59 +02:00
Sylvia van Os
d0d15393f6 Merge pull request #850 from CatimaLoyalty/create-pull-request/patch-1648357620
Update contributors
2022-03-27 11:11:27 +02:00
TheLastProject
e9eaf51e40 Update contributors 2022-03-27 05:07:00 +00:00
bors[bot]
de8a843414 Merge #849
849: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Altons <marsupilami450@gmail.com>
2022-03-26 21:35:52 +00:00
Altons
0ad4c683b7 Translated using Weblate (German)
Currently translated at 6.7% (7 of 104 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-03-26 22:09:45 +01:00
Altons
fdbff0f942 Translated using Weblate (French)
Currently translated at 18.2% (19 of 104 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-03-26 22:09:45 +01:00
Sylvia van Os
a02d9fd995 Merge pull request #846 from CatimaLoyalty/dependabot/gradle/androidx.core-core-splashscreen-1.0.0-beta02
Bump core-splashscreen from 1.0.0-beta01 to 1.0.0-beta02
2022-03-25 21:51:52 +01:00
Sylvia van Os
d7f43f8a2b Release Catima 2.16.1 2022-03-25 20:51:01 +01:00
bors[bot]
3cbd69c6c7 Merge #847
847: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
2022-03-25 18:11:08 +00:00
Oğuz Ersen
1cff0e29e4 Translated using Weblate (Turkish)
Currently translated at 59.6% (62 of 104 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-03-25 15:09:48 +01:00
Sylvia van Os
e718ffb77d Translated using Weblate (Swedish)
Currently translated at 1.9% (2 of 104 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2022-03-25 15:09:45 +01:00
Sylvia van Os
c2d711650f Translated using Weblate (Slovak)
Currently translated at 1.9% (2 of 104 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2022-03-25 15:09:45 +01:00
Sylvia van Os
f205045916 Translated using Weblate (French)
Currently translated at 17.3% (18 of 104 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-03-25 15:09:45 +01:00
Sylvia van Os
6ed6e683b5 Translated using Weblate (Slovak)
Currently translated at 82.7% (201 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2022-03-25 15:09:44 +01:00
Sylvia van Os
1612bed309 Translated using Weblate (French)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-03-25 15:09:43 +01:00
Sylvia van Os
ac8a2c445c Translated using Weblate (Spanish)
Currently translated at 69.1% (168 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2022-03-25 15:09:43 +01:00
dependabot[bot]
f98203fc5d Bump core-splashscreen from 1.0.0-beta01 to 1.0.0-beta02
Bumps core-splashscreen from 1.0.0-beta01 to 1.0.0-beta02.

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 02:26:52 +00:00
Sylvia van Os
82298d0d50 Merge pull request #845 from CatimaLoyalty/create-pull-request/patch-1648059304
Update Fastlane changelogs
2022-03-23 19:16:13 +01:00
TheLastProject
916515f8b2 Update Fastlane changelogs 2022-03-23 18:15:04 +00:00
Sylvia van Os
b5e6d40857 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-03-23 19:14:19 +01:00
Sylvia van Os
efef397870 Fix gray block appearing on invalid value for barcode 2022-03-23 19:13:54 +01:00
Sylvia van Os
377438b6ae Merge pull request #844 from CatimaLoyalty/fix/843
Stocard import fixes
2022-03-23 17:58:39 +01:00
Sylvia van Os
27443db945 Import fix 2022-03-23 17:31:11 +01:00
Sylvia van Os
420886bc3f Make SpotBugs happy 2022-03-22 21:59:35 +01:00
Sylvia van Os
86a01d36db Fix background color generation 2022-03-22 21:46:37 +01:00
Sylvia van Os
329293fa7c Support custom providers in Stocard import 2022-03-22 21:26:36 +01:00
Sylvia van Os
26bbea7377 Fix Stocard import getting stuck 2022-03-22 20:25:39 +01:00
Sylvia van Os
50385c6e0e Merge pull request #842 from CatimaLoyalty/create-pull-request/patch-1647753417
Update contributors
2022-03-20 11:25:33 +01:00
TheLastProject
43c45c9c0c Update contributors 2022-03-20 05:16:57 +00:00
bors[bot]
17cdc58b19 Merge #841
841: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: huuhaa <huuhaa.tm+gitlab@gmail.com>
2022-03-14 16:25:13 +00:00
huuhaa
4960b77ca3 Translated using Weblate (Finnish)
Currently translated at 2.9% (3 of 103 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fi/
2022-03-14 14:56:44 +01:00
Sylvia van Os
a7c6ac695e Merge pull request #838 from CatimaLoyalty/create-pull-request/patch-1647148614
Update contributors
2022-03-13 11:05:48 +01:00
TheLastProject
63dfe27b25 Update contributors 2022-03-13 05:16:54 +00:00
bors[bot]
2ec44046a8 Merge #837
837: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: 109247019824 <stoyan@gmx.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
Co-authored-by: Jane Kong <myonjane@gmail.com>
Co-authored-by: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
2022-03-12 09:28:40 +00:00
Oğuz Ersen
0363bc67e4 Translated using Weblate (Turkish)
Currently translated at 59.2% (61 of 103 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-03-12 09:54:37 +01:00
Sylvia van Os
affa434679 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-03-12 09:54:35 +01:00
Michael Moroni
ded151830e Translated using Weblate (Italian)
Currently translated at 8.7% (9 of 103 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-03-12 09:54:35 +01:00
109247019824
e1b604c1d2 Translated using Weblate (Bulgarian)
Currently translated at 99.5% (242 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-03-11 07:55:45 +01:00
Jane Kong
45d9353b54 Translated using Weblate (Chinese (Simplified))
Currently translated at 96.7% (235 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-03-11 07:55:45 +01:00
Sylvia van Os
ceceda560a Translated using Weblate (Bulgarian)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-03-11 07:55:45 +01:00
109247019824
088c25dbad Translated using Weblate (Bulgarian)
Currently translated at 99.5% (242 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-03-11 07:55:45 +01:00
Sylvia van Os
54fc1e9106 Release Catima 2.16.0 2022-03-09 19:27:08 +01:00
Sylvia van Os
1ce4216584 Fix extreme padding on some barcode types 2022-03-09 19:07:19 +01:00
Sylvia van Os
78d0bc7bb7 Merge pull request #834 from CatimaLoyalty/create-pull-request/patch-1646770776
Update Fastlane changelogs
2022-03-08 21:20:24 +01:00
bors[bot]
fc4bb134a9 Update Fastlane changelogs 2022-03-08 20:19:35 +00:00
bors[bot]
cecfcd4714 Merge #833
833: Padding improvements r=TheLastProject a=TheLastProject

Fixes #823 

Sadly, it also caused a new regression, cutting off part of the card ID if you use AZTEC and a photo...

| Before | After |
| - | - |
| ![image](https://user-images.githubusercontent.com/1885159/157125003-e336fef8-4dbe-4f75-8d00-908bced3e533.png) | ![image](https://user-images.githubusercontent.com/1885159/157125032-41f3e8ac-9fca-4f21-9a0e-df955670814a.png) |

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-03-08 20:13:56 +00:00
Sylvia van Os
c3364d4592 Update CHANGELOG 2022-03-08 21:12:50 +01:00
Sylvia van Os
df29abbebd Fix weird UI glitch
No, I don't understand why this works. Black magic, I guess.
2022-03-08 21:10:28 +01:00
Sylvia van Os
d4f30f798b Update screenshots 2022-03-08 20:33:46 +01:00
Sylvia van Os
61578a6016 Consistency improvements 2022-03-08 19:56:42 +01:00
Sylvia van Os
13695b5c37 Padding improvements 2022-03-07 22:57:42 +01:00
Sylvia van Os
97d1dcc7eb Merge pull request #830 from CatimaLoyalty/create-pull-request/patch-1646543770
Update contributors
2022-03-06 10:41:00 +01:00
TheLastProject
5efea8c1e8 Update contributors 2022-03-06 05:16:09 +00:00
bors[bot]
c2607cc6a2 Merge #829
829: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Joel A <joeax910@student.liu.se>
2022-03-04 06:52:28 +00:00
Joel A
6c70e77a75 Translated using Weblate (Swedish)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2022-03-04 04:58:38 +01:00
bors[bot]
d67c896ffe Merge #828
828: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Giovanni Donisi <giovannidonisi0701@gmail.com>
2022-02-27 14:59:06 +00:00
Giovanni Donisi
c821040c25 Translated using Weblate (Italian)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-02-27 15:54:58 +01:00
Sylvia van Os
946a56e921 Merge pull request #827 from CatimaLoyalty/create-pull-request/patch-1645937169
Update contributors
2022-02-27 09:10:05 +01:00
TheLastProject
b1ea2c4687 Update contributors 2022-02-27 04:46:09 +00:00
bors[bot]
745dd109fb Merge #825
825: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: huuhaa <huuhaa.tm+gitlab@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-02-22 14:03:38 +00:00
Oğuz Ersen
9f047f3dbd Translated using Weblate (Turkish)
Currently translated at 59.2% (61 of 103 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-02-22 14:55:20 +01:00
huuhaa
68afe746eb Translated using Weblate (Finnish)
Currently translated at 2.9% (3 of 103 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fi/
2022-02-22 14:55:20 +01:00
huuhaa
ebd3b0f7f5 Translated using Weblate (Finnish)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2022-02-22 14:55:20 +01:00
IllusiveMan196
163de3653e Translated using Weblate (Ukrainian)
Currently translated at 25.2% (26 of 103 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-02-22 14:55:20 +01:00
IllusiveMan196
1507694bae Translated using Weblate (Ukrainian)
Currently translated at 100.0% (243 of 243 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-02-22 14:55:20 +01:00
Sylvia van Os
6d134009be Merge pull request #819 from Kethen/emoji_icon
emoji icons, color theme in short-cut selection menu
2022-02-20 18:11:31 +01:00
Sylvia van Os
c1d2a30931 Merge pull request #821 from Kethen/edit_view_card_icon_corner
proper clipping for card icon inside edit view
2022-02-20 18:05:57 +01:00
Sylvia van Os
e5cb6fa1a7 Merge pull request #822 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-02-20 17:13:42 +01:00
Joel A
2188280ada Translated using Weblate (Swedish)
Currently translated at 99.5% (240 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2022-02-20 16:58:40 +01:00
Katharine Chui
fdc8cb0adf proper clipping for card icon inside edit view 2022-02-20 20:33:25 +08:00
Sylvia van Os
b79286d1a6 Merge pull request #820 from CatimaLoyalty/create-pull-request/patch-1645334167
Update contributors
2022-02-20 12:49:42 +01:00
Katharine Chui
d9f0ea8346 emoji icons, color theme in short-cut selection menu 2022-02-20 19:16:43 +08:00
TheLastProject
a262120bc3 Update contributors 2022-02-20 05:16:06 +00:00
Sylvia van Os
446131a87d Merge pull request #817 from Kethen/card_view_color_fix
#803 cardView appbar icon fix
2022-02-19 17:02:57 +01:00
Sylvia van Os
3466ba6591 Merge pull request #818 from CatimaLoyalty/create-pull-request/patch-1645281896
Update Fastlane changelogs
2022-02-19 15:46:35 +01:00
TheLastProject
5b3c6559b4 Update Fastlane changelogs 2022-02-19 14:44:56 +00:00
Sylvia van Os
4680b53f86 Save card details expansion state 2022-02-19 15:44:35 +01:00
Katharine Chui
8423ea9b59 in cardView, hide iconImage manually instead of relying on appBarLayout height 2022-02-19 21:31:16 +08:00
Sylvia van Os
1d8b2d82ed Remove duplicate translation 2022-02-16 23:54:08 +01:00
Sylvia van Os
784bd299e8 Fastlane fixes 2022-02-16 23:41:43 +01:00
bors[bot]
c8df7a7a2e Merge #814
814: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: 109247019824 <stoyan@gmx.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: ssantos <ssantos@web.de>
2022-02-14 21:58:54 +00:00
ssantos
cec2058f49 Translated using Weblate (Portuguese)
Currently translated at 6.8% (7 of 102 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-02-14 22:56:59 +01:00
Oğuz Ersen
c910a96005 Translated using Weblate (Turkish)
Currently translated at 57.8% (59 of 102 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-02-14 22:56:59 +01:00
109247019824
f3c7a75963 Translated using Weblate (Bulgarian)
Currently translated at 3.9% (4 of 102 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/bg/
2022-02-14 22:56:59 +01:00
Sylvia van Os
04e0b9ba34 Merge pull request #813 from CatimaLoyalty/create-pull-request/patch-1644729316
Update contributors
2022-02-13 09:40:03 +01:00
TheLastProject
1b8e9e4d7c Update contributors 2022-02-13 05:15:15 +00:00
bors[bot]
7a556e320b Merge #812
812: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: 109247019824 <stoyan@gmx.com>
2022-02-11 20:10:27 +00:00
109247019824
db706a02d3 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-02-11 20:55:41 +01:00
Sylvia van Os
8e452ed6bd Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-02-11 20:04:50 +01:00
Sylvia van Os
a9e574a9b4 Release Catima 2.15.2 2022-02-11 20:04:38 +01:00
Sylvia van Os
f24d11403c Merge pull request #810 from CatimaLoyalty/create-pull-request/patch-1644601552
Update Fastlane changelogs
2022-02-11 19:46:45 +01:00
TheLastProject
e1c658ac2a Update Fastlane changelogs 2022-02-11 17:45:52 +00:00
Sylvia van Os
a5901700b4 Fix crash in edit activity on locale without region 2022-02-11 18:45:28 +01:00
Sylvia van Os
bf4cd7a961 Merge pull request #807 from CatimaLoyalty/create-pull-request/patch-1644529031
Update Fastlane changelogs
2022-02-10 22:37:35 +01:00
TheLastProject
79ca5196d0 Update Fastlane changelogs 2022-02-10 21:37:10 +00:00
Sylvia van Os
b24d641aa6 Fix manual language selection not applying anywhere 2022-02-10 22:36:51 +01:00
Sylvia van Os
84051555b6 Release Catima 2.15.1 2022-02-10 17:39:39 +01:00
Sylvia van Os
48ff57d0fc Merge pull request #802 from CatimaLoyalty/create-pull-request/patch-1644510077
Update Fastlane changelogs
2022-02-10 17:23:42 +01:00
TheLastProject
3a6828b34b Update Fastlane changelogs 2022-02-10 16:21:16 +00:00
Sylvia van Os
efd36d061f Update CHANGELOG 2022-02-10 17:20:52 +01:00
bors[bot]
a5ef8ae914 Merge #801
801: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2022-02-10 11:14:04 +00:00
Allan Nordhøy
37ce61646b Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.7% (238 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-02-10 12:13:15 +01:00
bors[bot]
5e59315017 Merge #799
799: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: SC <lalocas@protonmail.com>
Co-authored-by: Still Hsu <dev@stillu.cc>
2022-02-09 16:50:40 +00:00
Still Hsu
fbed1348aa Translated using Weblate (Chinese (Traditional))
Currently translated at 3.9% (4 of 101 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2022-02-09 15:57:11 +01:00
Still Hsu
438e9f09a3 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2022-02-09 15:57:11 +01:00
SC
aee9176518 Translated using Weblate (Portuguese)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-02-09 15:57:11 +01:00
Oğuz Ersen
70f7768cee Translated using Weblate (Turkish)
Currently translated at 58.4% (59 of 101 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-02-09 15:57:11 +01:00
solokot
bf7e35c361 Translated using Weblate (Russian)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-02-09 15:57:11 +01:00
Heimen Stoffels
71a6fb2f56 Translated using Weblate (Dutch)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-02-09 15:57:11 +01:00
Sylvia van Os
8d799fce26 Fix fastlane directory names 2022-02-08 22:02:38 +01:00
bors[bot]
ae6e98b876 Merge #798
798: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-02-07 16:38:06 +00:00
Oğuz Ersen
44d8597fa5 Translated using Weblate (Turkish)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-02-07 12:56:29 +01:00
Altons
de47b7b1d2 Translated using Weblate (French)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-02-07 12:56:29 +01:00
Altons
631d65708e Translated using Weblate (German)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-02-07 12:56:29 +01:00
Sylvia van Os
62ffcbc948 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-02-06 22:53:09 +01:00
Sylvia van Os
14ef3086a4 Make spotBugs happy 2022-02-06 22:52:55 +01:00
Sylvia van Os
011b0f7ecc Merge pull request #796 from CatimaLoyalty/create-pull-request/patch-1644183457
Update Fastlane changelogs
2022-02-06 22:37:56 +01:00
TheLastProject
89eaac12d5 Update Fastlane changelogs 2022-02-06 21:37:37 +00:00
Sylvia van Os
2fbe5a821c Fix main menu item hiding logic 2022-02-06 22:37:21 +01:00
Sylvia van Os
5516acecce Release Catima 2.15.0 2022-02-06 12:49:02 +01:00
bors[bot]
6163de3086 Merge #792
792: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: 109247019824 <stoyan@gmx.com>
2022-02-06 10:54:51 +00:00
Sylvia van Os
4658896304 Add spacing for FAB below groups 2022-02-06 11:53:08 +01:00
Sylvia van Os
e0d9e2b2dd Merge pull request #793 from CatimaLoyalty/create-pull-request/patch-1644124546
Update contributors
2022-02-06 11:50:13 +01:00
Sylvia van Os
7dd2291376 Merge pull request #786 from Kethen/colors
old color themes, ucrop color, edit button icon color by theme, ucrop toolbar font
2022-02-06 11:49:35 +01:00
TheLastProject
bc69b82029 Update contributors 2022-02-06 05:15:46 +00:00
109247019824
1502ac1923 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-02-05 23:57:50 +01:00
Katharine Chui
0552acae26 spotbug 2022-02-06 03:44:20 +08:00
Katharine Chui
18e30d2726 apply dynamic color instead of leaving it as catima theme for invalid theme key 2022-02-06 03:38:28 +08:00
Sylvia van Os
1646db24df Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-02-05 16:54:49 +01:00
Sylvia van Os
6a6a8fff2b Include basic error details on import failure 2022-02-05 16:54:40 +01:00
Sylvia van Os
a0f8f6e6b5 Update label name in needs info autoclose action 2022-02-05 13:48:05 +01:00
bors[bot]
3dda3aa1a5 Merge #790
790: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-02-04 18:37:42 +00:00
Sylvia van Os
ac6bffcc67 Fix Norwegian translation 2022-02-04 19:37:02 +01:00
Oğuz Ersen
93fac2e726 Translated using Weblate (Turkish)
Currently translated at 58.0% (58 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-02-04 17:56:31 +01:00
Oğuz Ersen
9b724ebcc7 Translated using Weblate (Turkish)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-02-04 17:56:31 +01:00
Michael Moroni
540ef6d345 Translated using Weblate (Italian)
Currently translated at 7.0% (7 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-02-04 17:56:31 +01:00
Altons
64fa790836 Translated using Weblate (German)
Currently translated at 6.0% (6 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-02-04 17:56:31 +01:00
Altons
2c18b0dd19 Translated using Weblate (French)
Currently translated at 16.0% (16 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-02-04 17:56:31 +01:00
solokot
f570f2746a Translated using Weblate (Russian)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-02-04 17:56:31 +01:00
Heimen Stoffels
4c9c717792 Translated using Weblate (Dutch)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-02-04 17:56:31 +01:00
Allan Nordhøy
db4408108a Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.3% (236 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-02-04 17:56:31 +01:00
Michael Moroni
f75df30493 Translated using Weblate (Italian)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-02-04 17:56:31 +01:00
Altons
0f914414af Translated using Weblate (French)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-02-04 17:56:31 +01:00
Altons
3468293f5f Translated using Weblate (German)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-02-04 17:56:31 +01:00
Katharine Chui
c9b8b2df9e requested changes
theme color preference is now before pure black background preference

new setting string arrays for when dynamic color is not available

general refactoring and formatting changes
2022-02-04 14:35:10 +08:00
Katharine Chui
3d138c9504 ucrop toolbar typeface 2022-02-03 20:40:52 +08:00
Katharine Chui
72b95988e5 hide catima theme when dynamic color is not available 2022-02-03 19:36:24 +08:00
Katharine Chui
188c147173 better themed color resolution for edit button on card view 2022-02-03 18:05:03 +08:00
Katharine Chui
6224a13d17 ucrop color 2022-02-03 17:53:32 +08:00
bors[bot]
f393b9b618 Merge #787
787: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
2022-02-03 07:08:34 +00:00
Joel A
6fa6cdfadf Translated using Weblate (Swedish)
Currently translated at 99.5% (237 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2022-02-03 00:51:59 +01:00
Altons
bc7f44f60a Translated using Weblate (German)
Currently translated at 7.0% (7 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-02-03 00:51:59 +01:00
Altons
5579784b0a Translated using Weblate (French)
Currently translated at 16.0% (16 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-02-03 00:51:59 +01:00
Sylvia van Os
a20f8b58f8 Fix more missing screenshots 2022-02-02 22:52:43 +01:00
Sylvia van Os
fc8d0ac1aa Fix screenshots 2022-02-02 22:17:00 +01:00
Katharine Chui
edf953cdad colors 2022-02-03 05:12:20 +08:00
Sylvia van Os
7290c4aa28 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-02-02 21:47:25 +01:00
Sylvia van Os
f28e614c7f Update screenshots 2022-02-02 21:47:16 +01:00
Sylvia van Os
616b23d3a8 Merge pull request #785 from CatimaLoyalty/create-pull-request/patch-1643833796
Update Fastlane changelogs
2022-02-02 21:31:05 +01:00
TheLastProject
5fda774626 Update Fastlane changelogs 2022-02-02 20:29:56 +00:00
Sylvia van Os
30941a9e16 Update CHANGELOG 2022-02-02 21:28:48 +01:00
Sylvia van Os
9289d3cf0b Merge pull request #783 from Kethen/color_fixes
various color fixes
2022-02-02 20:30:27 +01:00
Sylvia van Os
0ecc36a83c Merge pull request #784 from ratneshnavlakhe/add-padding-to-main-list
Add padding to the bottom of the main list.
2022-02-02 19:54:53 +01:00
Katharine Chui
d3b8569ef7 settings for pure black oled 2022-02-03 00:29:49 +08:00
Ratnesh Navlakhe
19722af65f Add padding to the bottom of the main list. 2022-02-01 23:37:43 +05:30
Katharine Chui
329be8abbb various color fixes
band-aid fixes for splash screen and material 3 dynamic color api

change editbutton icon's color in card view based on editbutton background color

make status bar transparent as per material 3, or tainted transparent for api level < 23 + light theme
2022-02-02 01:46:09 +08:00
bors[bot]
9aa6acccda Merge #780
780: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Petr Novák <nit.monkey@gmail.com>
2022-02-01 11:19:59 +00:00
Petr Novák
ba05c6872b Translated using Weblate (Czech)
Currently translated at 99.0% (99 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-02-01 09:53:24 +01:00
Petr Novák
ca1fc214ff Translated using Weblate (Czech)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-02-01 09:53:24 +01:00
Sylvia van Os
2ebb3e1837 Merge pull request #778 from Altonss/patch-1
Update to 2.2.8 version of ucrop!
2022-01-31 17:33:52 +01:00
Altonss
019c5e232d Update to 2.2.8 version of ucrop! 2022-01-31 11:24:32 +01:00
bors[bot]
dda527a72f Merge #775
775: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: mondstern <mondstern@snopyta.org>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2022-01-31 05:10:02 +00:00
Allan Nordhøy
df0bbe773f Translated using Weblate (Norwegian Bokmål)
Currently translated at 21.0% (21 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2022-01-31 04:55:15 +01:00
mondstern
a320e1c776 Translated using Weblate (German)
Currently translated at 6.0% (6 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-01-30 15:56:23 +01:00
Sylvia van Os
607669a74c Merge pull request #774 from CatimaLoyalty/create-pull-request/patch-1643519707
Update contributors
2022-01-30 09:48:50 +01:00
TheLastProject
f50dfeac9e Update contributors 2022-01-30 05:15:07 +00:00
bors[bot]
ef46f6a00b Merge #772
772: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-01-28 19:01:20 +00:00
Oğuz Ersen
eafedb52ad Translated using Weblate (Turkish)
Currently translated at 58.0% (58 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-01-28 19:55:48 +01:00
bors[bot]
423384fae6 Merge #770
770: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: solokot <solokot@gmail.com>
2022-01-27 17:55:15 +00:00
solokot
09e96eba53 Translated using Weblate (Russian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-01-27 18:53:35 +01:00
Sylvia van Os
4b0a4a7db9 Merge pull request #769 from CatimaLoyalty/dependabot/gradle/androidx.preference-preference-1.2.0
Bump preference from 1.1.1 to 1.2.0
2022-01-27 17:45:06 +01:00
dependabot[bot]
2371738a15 Bump preference from 1.1.1 to 1.2.0
Bumps preference from 1.1.1 to 1.2.0.

---
updated-dependencies:
- dependency-name: androidx.preference:preference
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-27 02:30:12 +00:00
Sylvia van Os
e22d11f8e9 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-26 22:58:25 +01:00
Sylvia van Os
917e60a7f5 Fix lint 2022-01-26 22:58:02 +01:00
Sylvia van Os
4d09f66ac6 Merge pull request #768 from CatimaLoyalty/create-pull-request/patch-1643233121
Update Fastlane changelogs
2022-01-26 22:42:53 +01:00
TheLastProject
622aa96464 Update Fastlane changelogs 2022-01-26 21:38:41 +00:00
Sylvia van Os
9887e19ec9 Fix cropper not using theme colour 2022-01-26 22:38:02 +01:00
bors[bot]
a308634868 Merge #766
766: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Quentin PAGÈS <quentinantonin@free.fr>
Co-authored-by: H Tamás <hovanszki@gmail.com>
2022-01-26 16:46:59 +00:00
H Tamás
44c3c8b32f Translated using Weblate (Hungarian)
Currently translated at 9.0% (9 of 99 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hu/
2022-01-26 14:56:20 +01:00
H Tamás
69835ff0c9 Translated using Weblate (Hungarian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2022-01-26 14:56:20 +01:00
Quentin PAGÈS
8270bc6c03 Translated using Weblate (Occitan)
Currently translated at 38.2% (91 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/oc/
2022-01-26 14:56:20 +01:00
Sylvia van Os
9e8ea3384e Add PayPal 2022-01-24 22:21:21 +01:00
Sylvia van Os
c8b258cd62 Merge pull request #760 from CatimaLoyalty/create-pull-request/patch-1642912504
Update contributors
2022-01-23 09:45:38 +01:00
TheLastProject
f23c73a67a Update contributors 2022-01-23 04:35:04 +00:00
bors[bot]
8ba3295ba1 Merge #759
759: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: H Tamás <hovanszki@gmail.com>
2022-01-22 17:57:33 +00:00
H Tamás
6e3d61304f Translated using Weblate (Hungarian)
Currently translated at 33.6% (80 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hu/
2022-01-22 18:54:21 +01:00
Oğuz Ersen
9b7b3c4b9f Translated using Weblate (Turkish)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-01-22 18:54:21 +01:00
bors[bot]
b993221af5 Merge #758
758: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: H Tamás <hovanszki@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Eric <alchemillatruth@purelymail.com>
Co-authored-by: 109247019824 <stoyan@gmx.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-01-21 22:03:16 +00:00
Oğuz Ersen
86c029fe92 Translated using Weblate (Turkish)
Currently translated at 99.5% (237 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-01-21 14:10:45 +01:00
109247019824
fbe857a5cf Translated using Weblate (Bulgarian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-01-21 14:10:45 +01:00
Eric
1717560c05 Translated using Weblate (Chinese (Simplified))
Currently translated at 79.4% (189 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2022-01-21 14:10:45 +01:00
solokot
02f85cd49a Translated using Weblate (Russian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-01-21 14:10:45 +01:00
Heimen Stoffels
69a6afe611 Translated using Weblate (Dutch)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-01-21 14:10:45 +01:00
Michael Moroni
94fa6d19c4 Translated using Weblate (Italian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-01-21 14:10:45 +01:00
J. Lavoie
211ee9ce69 Translated using Weblate (French)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-01-21 14:10:45 +01:00
J. Lavoie
e818be3d50 Translated using Weblate (German)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-01-21 14:10:45 +01:00
Sylvia van Os
6620369616 Translated using Weblate (English)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2022-01-21 14:10:45 +01:00
H Tamás
9d9ce1d11f Added translation using Weblate (Hungarian) 2022-01-21 14:10:45 +01:00
bors[bot]
76ba3c333e Merge #757
757: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Ati <ati@tutamail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-01-20 19:21:08 +00:00
Sylvia van Os
0429086c57 Fix build 2022-01-20 20:20:36 +01:00
Ati
4a4b534813 Translated using Weblate (Slovak)
Currently translated at 84.0% (200 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2022-01-20 19:54:13 +01:00
Allan Nordhøy
8cfae80ea8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.4% (232 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-01-20 19:54:13 +01:00
Ati
517a9cf37a Translated using Weblate (Czech)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-20 19:54:13 +01:00
Sylvia van Os
242f4b7ad9 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-18 23:14:25 +01:00
Sylvia van Os
ce1a210650 Correctly make balancePoints a plural string 2022-01-18 23:14:12 +01:00
bors[bot]
9d369a8e6f Merge #754
754: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Ati <ati@tutamail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Michael Moroni <michaelmoroni@disroot.org>
2022-01-18 21:56:59 +00:00
IllusiveMan196
240f73f743 Translated using Weblate (Ukrainian)
Currently translated at 24.2% (24 of 99 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2022-01-18 22:55:16 +01:00
Michael Moroni
3cf1579bb0 Translated using Weblate (Italian)
Currently translated at 5.0% (5 of 99 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-01-18 22:55:16 +01:00
Altons
171fb83249 Translated using Weblate (German)
Currently translated at 5.0% (5 of 99 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-01-18 22:55:16 +01:00
Altons
603b02911b Translated using Weblate (French)
Currently translated at 15.1% (15 of 99 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-01-18 22:55:16 +01:00
IllusiveMan196
ab5eb62bc1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-01-18 22:55:16 +01:00
Ati
40b2b5c96f Translated using Weblate (Slovak)
Currently translated at 48.7% (116 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2022-01-18 22:55:16 +01:00
Sylvia van Os
6efe0f6c54 Merge pull request #752 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2022-01-17 20:41:05 +01:00
mondstern
00a78c6030 Translated using Weblate (Portuguese)
Currently translated at 87.8% (209 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-01-16 14:55:06 +01:00
Oğuz Ersen
0db46614a8 Translated using Weblate (Turkish)
Currently translated at 55.5% (55 of 99 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-01-16 14:55:06 +01:00
Sylvia van Os
32d139f756 Merge pull request #750 from CatimaLoyalty/create-pull-request/patch-1642310230
Update contributors
2022-01-16 09:56:06 +01:00
TheLastProject
c2c8b780c8 Update contributors 2022-01-16 05:17:09 +00:00
Sylvia van Os
057a58a3d6 Add FUNDING.yml 2022-01-15 14:01:16 +01:00
Sylvia van Os
551fbed8ad Release Catima 2.14.1 2022-01-15 13:46:49 +01:00
Sylvia van Os
468c86b5ea Merge pull request #748 from CatimaLoyalty/create-pull-request/patch-1642250378
Update Fastlane changelogs
2022-01-15 13:40:17 +01:00
TheLastProject
50cb3146bf Update Fastlane changelogs 2022-01-15 12:39:37 +00:00
Sylvia van Os
0853bd88a4 Various theming fixes 2022-01-15 13:39:19 +01:00
Sylvia van Os
3bbe8e9524 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-15 12:12:04 +01:00
Sylvia van Os
ebc2e07fc4 Use new URLs 2022-01-15 12:11:57 +01:00
Sylvia van Os
ad368e68eb Merge pull request #747 from CatimaLoyalty/create-pull-request/patch-1642244294
Update Fastlane changelogs
2022-01-15 11:59:07 +01:00
TheLastProject
a1d4bb746f Update Fastlane changelogs 2022-01-15 10:58:14 +00:00
Sylvia van Os
44473ae921 Hide search, expand and sort icons until there is at least one card 2022-01-15 11:57:52 +01:00
Sylvia van Os
2c3d9f714c Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-14 23:07:21 +01:00
Sylvia van Os
13121e9869 Also colour scaler with card colour 2022-01-14 23:07:14 +01:00
Sylvia van Os
14116324fb Merge pull request #743 from CatimaLoyalty/create-pull-request/patch-1642196358
Update Fastlane changelogs
2022-01-14 22:40:14 +01:00
TheLastProject
d207197055 Update Fastlane changelogs 2022-01-14 21:39:18 +00:00
Sylvia van Os
a36775c6fd Release Catima 2.14.0 2022-01-14 22:38:52 +01:00
Sylvia van Os
cae95d2577 Update screenshots to Material You 2022-01-14 21:54:10 +01:00
bors[bot]
1c95a767c0 Merge #741
741: Material You redesign r=TheLastProject a=TheLastProject

I'm not super excited about the new dark theme's primary colour as generated by https://material-foundation.github.io/material-theme-builder/ for primary colour `#A83536` but alas...

![image](https://user-images.githubusercontent.com/1885159/149578453-72a6c345-e2ec-4271-9110-7ee39356b385.png)


Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-01-14 20:36:05 +00:00
Sylvia van Os
26fd3e3a58 Make spotBugs happy 2022-01-14 21:35:02 +01:00
Sylvia van Os
e79be213fc Fix lint 2022-01-14 21:26:29 +01:00
Sylvia van Os
2010b9a25c Card-related colours on view screen 2022-01-14 21:05:50 +01:00
Sylvia van Os
355c2f9ceb Material You redesign 2022-01-14 20:27:11 +01:00
Sylvia van Os
43daeec5c3 Merge pull request #738 from TheLastProject/dependabot/gradle/androidx.constraintlayout-constraintlayout-2.1.3
Bump constraintlayout from 2.1.2 to 2.1.3
2022-01-14 07:23:26 +01:00
dependabot[bot]
5ddf77dd63 Bump material from 1.4.0 to 1.5.0
Bumps [material](https://github.com/material-components/material-components-android) from 1.4.0 to 1.5.0.
- [Release notes](https://github.com/material-components/material-components-android/releases)
- [Commits](https://github.com/material-components/material-components-android/compare/1.4.0...1.5.0)

---
updated-dependencies:
- dependency-name: com.google.android.material:material
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-14 02:26:18 +00:00
dependabot[bot]
64fb91d644 Bump constraintlayout from 2.1.2 to 2.1.3
Bumps [constraintlayout](https://github.com/androidx/constraintlayout) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/androidx/constraintlayout/releases)
- [Commits](https://github.com/androidx/constraintlayout/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-14 02:26:13 +00:00
Sylvia van Os
4921d9f4b0 Merge pull request #736 from TheLastProject/dependabot/gradle/androidx.core-core-splashscreen-1.0.0-beta01
Bump core-splashscreen from 1.0.0-alpha02 to 1.0.0-beta01
2022-01-13 08:19:33 +01:00
Sylvia van Os
8f9dd584b1 Merge pull request #735 from TheLastProject/dependabot/gradle/androidx.appcompat-appcompat-1.4.1
Bump appcompat from 1.4.0 to 1.4.1
2022-01-13 08:17:16 +01:00
dependabot[bot]
04f2cffeb3 Bump core-splashscreen from 1.0.0-alpha02 to 1.0.0-beta01
Bumps core-splashscreen from 1.0.0-alpha02 to 1.0.0-beta01.

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-13 02:24:29 +00:00
dependabot[bot]
8ca899b7d1 Bump appcompat from 1.4.0 to 1.4.1
Bumps appcompat from 1.4.0 to 1.4.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-13 02:24:23 +00:00
bors[bot]
c0f3e814a0 Merge #734
734: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: DEL <mylnico@yahoo.fr>
Co-authored-by: 109247019824 <stoyan@gmx.com>
2022-01-12 07:03:19 +00:00
109247019824
1eb8d03b74 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-01-12 07:53:48 +01:00
DEL
ec0dc6bd4c Translated using Weblate (French)
Currently translated at 13.4% (13 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-01-12 07:53:48 +01:00
bors[bot]
cd7b3d5970 Merge #733
733: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: vesp <vesp@post.cz>
Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Petr Novák <nit.monkey@gmail.com>
2022-01-10 22:55:22 +00:00
Petr Novák
55843899da Translated using Weblate (Czech)
Currently translated at 98.9% (96 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2022-01-10 23:53:36 +01:00
Altons
d639013bea Translated using Weblate (German)
Currently translated at 4.1% (4 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-01-10 23:53:33 +01:00
Altons
45785b66e7 Translated using Weblate (French)
Currently translated at 9.2% (9 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-01-10 23:53:33 +01:00
Altons
6a20366cc9 Translated using Weblate (German)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-01-10 23:53:32 +01:00
vesp
4856e9e971 Translated using Weblate (Czech)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-10 23:53:32 +01:00
bors[bot]
4141856287 Merge #732
732: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Petr Novák <nit.monkey@gmail.com>
2022-01-09 22:24:51 +00:00
Petr Novák
12196fc9b1 Translated using Weblate (Czech)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-09 23:21:07 +01:00
Sylvia van Os
c73e7924ad Release Catima 2.13.1 2022-01-09 15:51:50 +01:00
Sylvia van Os
acf83087f4 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-09 15:00:26 +01:00
Sylvia van Os
8ef507c011 Fix breaking scrolling 2022-01-09 15:00:20 +01:00
bors[bot]
d36f82df05 Merge #728
728: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: vesp <vesp@post.cz>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: Maciej Błędkowski <mble@tuta.io>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-01-09 09:47:42 +00:00
Oğuz Ersen
5f50e86234 Translated using Weblate (Turkish)
Currently translated at 49.4% (48 of 97 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-01-09 10:45:38 +01:00
Oğuz Ersen
733c9885e8 Translated using Weblate (Turkish)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-01-09 10:45:38 +01:00
solokot
4b7acefece Translated using Weblate (Russian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-01-09 10:45:38 +01:00
Maciej Błędkowski
a6b950e2e1 Translated using Weblate (Polish)
Currently translated at 98.3% (234 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-01-09 10:45:37 +01:00
Heimen Stoffels
c21f8098ef Translated using Weblate (Dutch)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-01-09 10:45:37 +01:00
J. Lavoie
3ccce45f17 Translated using Weblate (Italian)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-01-09 10:45:37 +01:00
J. Lavoie
f096f63352 Translated using Weblate (French)
Currently translated at 100.0% (238 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-01-09 10:45:37 +01:00
J. Lavoie
babd6ff9bb Translated using Weblate (German)
Currently translated at 99.5% (237 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-01-09 10:45:37 +01:00
vesp
3c5dea6fbf Translated using Weblate (Czech)
Currently translated at 86.5% (206 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-09 10:45:37 +01:00
Sylvia van Os
3bf7d827a1 Merge pull request #727 from TheLastProject/create-pull-request/patch-1641705432
Update contributors
2022-01-09 10:45:34 +01:00
TheLastProject
eea03dd516 Update contributors 2022-01-09 05:17:12 +00:00
bors[bot]
92ceb7ee50 Merge #726
726: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2022-01-07 21:28:52 +00:00
Allan Nordhøy
aba5dbfb38 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.8% (233 of 238 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-01-07 22:26:43 +01:00
Sylvia van Os
1ba4839544 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-07 22:26:37 +01:00
Sylvia van Os
cca68cfcc5 Simplify 2022-01-07 22:26:29 +01:00
bors[bot]
d2043c331a Merge #725
725: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Maciej Błędkowski <mble@tuta.io>
2022-01-07 21:09:35 +00:00
Maciej Błędkowski
b57bc7d7b6 Translated using Weblate (Polish)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2022-01-07 22:08:54 +01:00
Sylvia van Os
23fb6d9c6a Merge pull request #724 from TheLastProject/create-pull-request/patch-1641589559
Update Fastlane changelogs
2022-01-07 22:08:50 +01:00
TheLastProject
2498ee0354 Update Fastlane changelogs 2022-01-07 21:05:59 +00:00
Sylvia van Os
eb38d0a8aa Accessibility fixes 2022-01-07 22:02:51 +01:00
bors[bot]
cb0deaae27 Merge #720
720: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
2022-01-06 17:00:49 +00:00
IllusiveMan196
8220c8b32e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2022-01-06 17:54:58 +01:00
solokot
8458a2e79a Translated using Weblate (Russian)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-01-06 17:54:57 +01:00
bors[bot]
d436a20b23 Merge #718
718: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Altons <marsupilami450@gmail.com>
2022-01-04 19:39:02 +00:00
Altons
c24f3b6ece Translated using Weblate (French)
Currently translated at 8.3% (8 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-01-04 19:55:38 +01:00
Altons
d5cb1a79d2 Translated using Weblate (French)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-01-04 19:55:38 +01:00
Altons
7040dbf997 Translated using Weblate (German)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-01-04 19:55:38 +01:00
Sylvia van Os
d1685f2557 More metadata fixes 2022-01-03 21:05:11 +01:00
Sylvia van Os
36237d9b3e Release Catima 2.13.0 2022-01-03 19:19:34 +01:00
bors[bot]
f968aba926 Merge #716
716: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-01-03 18:00:48 +00:00
Oğuz Ersen
2d7960ddc4 Translated using Weblate (Turkish)
Currently translated at 48.9% (47 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-01-03 18:59:01 +01:00
Oğuz Ersen
4cdd168b8c Translated using Weblate (Turkish)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-01-03 18:59:00 +01:00
solokot
9de54872f3 Translated using Weblate (Russian)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-01-03 18:58:59 +01:00
Heimen Stoffels
f8f0edd8d3 Translated using Weblate (Dutch)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-01-03 18:58:59 +01:00
Allan Nordhøy
3703f3d1ac Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.7% (232 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-01-03 18:58:59 +01:00
Michael Moroni
3bbd16e3a9 Translated using Weblate (Italian)
Currently translated at 100.0% (235 of 235 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-01-03 18:58:59 +01:00
Sylvia van Os
a2947d1f58 Metadata fixes 2022-01-03 18:30:06 +01:00
Sylvia van Os
4b94dd8b48 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-03 17:47:57 +01:00
Sylvia van Os
62376769cd Update screenshots 2022-01-03 17:47:48 +01:00
Sylvia van Os
e057a24526 Merge pull request #715 from TheLastProject/create-pull-request/patch-1641158322
Update Fastlane changelogs
2022-01-02 22:19:54 +01:00
TheLastProject
25cc1a1160 Update Fastlane changelogs 2022-01-02 21:18:42 +00:00
Sylvia van Os
d7ed4aeff8 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-02 22:18:22 +01:00
Sylvia van Os
58ebb7c7bf Improve star icon contrast in main view 2022-01-02 22:18:11 +01:00
bors[bot]
be2c586820 Merge #714
714: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: ssantos <ssantos@web.de>
2022-01-02 20:43:24 +00:00
ssantos
8a0b2d9460 Translated using Weblate (Portuguese)
Currently translated at 13.5% (13 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2022-01-02 21:42:33 +01:00
ssantos
4b1583ce4c Translated using Weblate (Portuguese (Portugal))
Currently translated at 87.6% (205 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2022-01-02 21:42:33 +01:00
ssantos
83c611f4ae Translated using Weblate (Portuguese)
Currently translated at 87.6% (205 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-01-02 21:42:33 +01:00
Oğuz Ersen
0a7082bed5 Translated using Weblate (Turkish)
Currently translated at 44.7% (43 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-01-02 21:42:33 +01:00
Allan Nordhøy
94c84c60f5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 20.8% (20 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2022-01-02 21:42:33 +01:00
Allan Nordhøy
4ce7f475f4 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.7% (231 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-01-02 21:42:33 +01:00
Michael Moroni
75057d3c41 Translated using Weblate (Italian)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-01-02 21:42:33 +01:00
Sylvia van Os
62fce7231d Merge pull request #713 from TheLastProject/create-pull-request/patch-1641156077
Update Fastlane changelogs
2022-01-02 21:42:30 +01:00
TheLastProject
d201d2e98f Update Fastlane changelogs 2022-01-02 20:41:17 +00:00
Sylvia van Os
36ff4ca9ae Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-01-02 21:40:57 +01:00
Sylvia van Os
a7a775bc01 Put all barcode related fields together in the edit screen 2022-01-02 21:40:44 +01:00
Sylvia van Os
d217ac8752 Merge pull request #709 from TheLastProject/create-pull-request/patch-1641100630
Update contributors
2022-01-02 09:07:47 +01:00
TheLastProject
d376569ba1 Update contributors 2022-01-02 05:17:10 +00:00
bors[bot]
1a09b1bd5e Merge #708
708: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2022-01-01 23:19:19 +00:00
TheLastProject
ec1f4f8fbd Update Fastlane changelogs 2022-01-01 23:14:01 +00:00
Sylvia van Os
3883617a34 Smaller header when details are hidden 2022-01-02 00:10:37 +01:00
bors[bot]
2e7c8f39a7 Merge #705
705: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: vesp <vesp@post.cz>
2022-01-01 18:00:31 +00:00
vesp
7fc2bdc46e Translated using Weblate (Czech)
Currently translated at 87.6% (205 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2022-01-01 18:54:31 +01:00
bors[bot]
c141a8986c Merge #703
703: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Maciej Błędkowski <mble@tuta.io>
2022-01-01 13:27:48 +00:00
Maciej Błędkowski
70ad884aa3 Translated using Weblate (Polish)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2021-12-31 13:50:31 +01:00
bors[bot]
2bd8aed853 Merge #702
702: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-28 16:14:08 +00:00
Oğuz Ersen
78f5908c33 Translated using Weblate (Turkish)
Currently translated at 33.3% (32 of 96 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-28 16:53:31 +01:00
Sylvia van Os
2f43febe95 Merge pull request #701 from TheLastProject/create-pull-request/patch-1640550052
Update Fastlane changelogs
2021-12-26 21:22:34 +01:00
TheLastProject
17d23de518 Update Fastlane changelogs 2021-12-26 20:20:52 +00:00
Sylvia van Os
af831cfdbd Fixed pressing the save button multiple times creating multiple entries
Fixes #691
2021-12-26 21:20:27 +01:00
bors[bot]
4476646317 Merge #700
700: Update contributors r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-12-26 07:44:16 +00:00
TheLastProject
958dc29689 Update contributors 2021-12-26 05:16:50 +00:00
Sylvia van Os
21216f3aa6 Release Catima 2.12.0 2021-12-23 17:41:06 +01:00
bors[bot]
808dd73221 Merge #697
697: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-23 16:03:57 +00:00
Oğuz Ersen
e3bd82f4a2 Translated using Weblate (Turkish)
Currently translated at 28.4% (27 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-23 16:53:14 +01:00
Sylvia van Os
2cbb105c21 Merge pull request #696 from TheLastProject/create-pull-request/patch-1640123935
Update Fastlane changelogs
2021-12-21 23:01:58 +01:00
TheLastProject
40c364a5e8 Update Fastlane changelogs 2021-12-21 21:58:54 +00:00
Sylvia van Os
8c484078b4 Mention various small fixes 2021-12-21 22:58:33 +01:00
bors[bot]
f93f3b912d Merge #695
695: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Yevgeny M <yevgenym.lg3@gmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-12-20 17:09:03 +00:00
Sylvia van Os
934ef22a8c Translated using Weblate (Hebrew (Israel))
Currently translated at 33.7% (79 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2021-12-20 12:51:14 +01:00
IllusiveMan196
732679f3f8 Translated using Weblate (Ukrainian)
Currently translated at 14.7% (14 of 95 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2021-12-19 08:33:17 +01:00
IllusiveMan196
2e7cbcbac9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (234 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-12-19 08:33:17 +01:00
Yevgeny M
eb5161a382 Translated using Weblate (Hebrew (Israel))
Currently translated at 34.1% (80 of 234 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/he_IL/
2021-12-19 08:33:16 +01:00
bors[bot]
b765d77145 Merge #693
693: Update contributors r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-12-19 07:28:43 +00:00
TheLastProject
ad344c7d12 Update contributors 2021-12-19 05:16:53 +00:00
Sylvia van Os
d84ce6ff82 Remove Google-declined title 2021-12-17 16:59:50 +01:00
Sylvia van Os
d4e388cf5d Fix some crashes after DB refactor 2021-12-16 22:49:22 +01:00
bors[bot]
34fcedfa28 Merge #688
688: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Nyatsuki <Odamaki@yandex.ru>
2021-12-16 16:23:48 +00:00
Nyatsuki
c75eed56f0 Translated using Weblate (Japanese)
Currently translated at 99.1% (232 of 234 strings)

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

Should fix #661 

Supersedes #678 

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

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

#671, #672 please review
added #607

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

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

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


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

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


It also includes following components:

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



Current translation status:

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


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

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

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

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

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

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

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

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

please review, for #635 and #619

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




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

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


It also includes following components:

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



Current translation status:

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


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

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

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

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

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

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

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


It also includes following components:

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



Current translation status:

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fixed issue #649.

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

Bumps gradle from 7.0.3 to 7.0.4.


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

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

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

---

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

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


</details>

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

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

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

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


It also includes following components:

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



Current translation status:

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


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

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

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

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


It also includes following components:

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



Current translation status:

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


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

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

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

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

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

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


It also includes following components:

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



Current translation status:

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


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

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

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

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

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

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

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

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

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

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

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2021-12-05 12:53:31 +01:00
Sylvia van Os
ae28e02cce Merge pull request #650 from TheLastProject/create-pull-request/patch-1638681427
Update contributors
2021-12-05 12:17:48 +01:00
TheLastProject
e5d8dc8d59 Update contributors 2021-12-05 05:17:07 +00:00
Sylvia van Os
b85de0e089 Merge pull request #647 from TheLastProject/create-pull-request/patch-1638623066
Update Fastlane changelogs
2021-12-04 14:04:59 +01:00
TheLastProject
4264155837 Update Fastlane changelogs 2021-12-04 13:04:25 +00:00
Sylvia van Os
d2a500824a Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-12-04 14:04:01 +01:00
Sylvia van Os
6a91d59050 Fix crash on sharing card + release 2.11.2 2021-12-04 14:03:52 +01:00
bors[bot]
451c49d05f Merge #643
643: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Nyatsuki <Odamaki@yandex.ru>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-12-02 11:24:18 +00:00
Oğuz Ersen
b4ec4b74ca Translated using Weblate (Turkish)
Currently translated at 26.8% (25 of 93 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-12-02 10:54:32 +01:00
Nyatsuki
6c254315af Translated using Weblate (Japanese)
Currently translated at 99.1% (230 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-12-02 10:54:31 +01:00
Allan Nordhøy
dfaf61722f Translated using Weblate (Norwegian Bokmål)
Currently translated at 20.4% (19 of 93 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2021-12-02 10:54:30 +01:00
bors[bot]
2dbebea884 Merge #642
642: Bump robolectric from 4.7.2 to 4.7.3 r=TheLastProject a=dependabot[bot]

Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.7.2 to 4.7.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/robolectric/robolectric/releases">robolectric's releases</a>.</em></p>
<blockquote>
<h2>Robolectric 4.7.3</h2>
<p>This is a minor release that fixes <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6883">#6883</a>, a NoClassDefError that can occur if the <code>compileSdk</code> &lt; 31. Thanks for <a href="https://github.com/ninniuz"><code>`@​ninniuz</code></a>` for reporting and <a href="https://github.com/utzcoz"><code>`@​utzcoz</code></a>` for the fix (<a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6884">#6884</a>).</p>
<p>It also fixes a minor case of test pollution, where a single Activity could leak across tests (see 5a1f02aaf37f425f8938ae41df5d7aa1b72bba9c for details).</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="3e1d0a34a1"><code>3e1d0a3</code></a> Bump version to 4.7.3.</li>
<li><a href="aab519415e"><code>aab5194</code></a> Use 'processResources' task instead of 'jar' task for nativeruntime</li>
<li><a href="66829f64e1"><code>66829f6</code></a> Clear InputMethodManager.sInstance for SDK &gt; P</li>
<li><a href="3e596affab"><code>3e596af</code></a> Only using AttributionSource for compile SDK 31 and above</li>
<li>See full diff in <a href="https://github.com/robolectric/robolectric/compare/robolectric-4.7.2...robolectric-4.7.3">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-02 07:09:06 +00:00
dependabot[bot]
d7da942481 Bump robolectric from 4.7.2 to 4.7.3
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.7.2 to 4.7.3.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.7.2...robolectric-4.7.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-02 02:22:33 +00:00
Sylvia van Os
6b4a01c954 Release Catima 2.11.1 2021-11-30 18:30:29 +01:00
Sylvia van Os
aee7728f56 Merge pull request #639 from TheLastProject/create-pull-request/patch-1638292575
Update Fastlane changelogs
2021-11-30 18:16:54 +01:00
TheLastProject
6fbbe38542 Update Fastlane changelogs 2021-11-30 17:16:15 +00:00
Sylvia van Os
651744b770 Update CHANGELOG 2021-11-30 18:15:51 +01:00
Sylvia van Os
a189ac22ce Prevent white on white status bar on Android 5 2021-11-29 21:29:44 +01:00
Sylvia van Os
f4d71e4525 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-11-29 20:23:24 +01:00
Sylvia van Os
45ec062499 Remove selection animator as it can break (fixes #630) 2021-11-29 20:23:17 +01:00
Sylvia van Os
82d8e84d78 Merge pull request #633 from TheLastProject/create-pull-request/patch-1638210607
Update Fastlane changelogs
2021-11-29 19:31:13 +01:00
TheLastProject
fa25bff46f Update Fastlane changelogs 2021-11-29 18:30:07 +00:00
Sylvia van Os
5648061a31 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-11-29 19:29:44 +01:00
Sylvia van Os
9cd2f66b40 Naively fix blurriness of letter icons 2021-11-29 19:29:36 +01:00
bors[bot]
90b7b43faf Merge #626
626: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: 109247019824 <stoyan@gmx.com>
2021-11-29 07:09:59 +00:00
109247019824
cfe5865d35 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-11-29 00:52:08 +01:00
Allan Nordhøy
243898c441 Translated using Weblate (Norwegian Bokmål)
Currently translated at 19.5% (18 of 92 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2021-11-29 00:52:08 +01:00
Sylvia van Os
0afc6f3976 Release Catima 2.11.0 2021-11-28 23:05:54 +01:00
Sylvia van Os
fa95ea6a62 Make spotBugs happy 2021-11-28 22:57:10 +01:00
Sylvia van Os
abb559afd6 Merge pull request #624 from TheLastProject/create-pull-request/patch-1638136040
Update Fastlane changelogs
2021-11-28 22:49:05 +01:00
TheLastProject
61e7d1b154 Update Fastlane changelogs 2021-11-28 21:47:20 +00:00
Sylvia van Os
da594a8287 Fix getItemId mistake (fixes #623) 2021-11-28 22:47:02 +01:00
Sylvia van Os
15f5c4a67b Make cropper respect custom theme choice 2021-11-28 14:54:49 +01:00
Sylvia van Os
19f7af1e42 Use cropper card ratio (default) for icon layout 2021-11-28 14:14:45 +01:00
bors[bot]
b5b994642a Merge #621
621: Update contributors r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-11-28 08:38:54 +00:00
TheLastProject
45da445866 Update contributors 2021-11-28 05:15:51 +00:00
bors[bot]
55b1ad1c55 Merge #613
613: Bump NumberPickerPreference from 1.0.3 to 1.0.4 r=TheLastProject a=dependabot[bot]

Bumps [NumberPickerPreference](https://github.com/invissvenska/NumberPickerPreference) from 1.0.3 to 1.0.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/invissvenska/NumberPickerPreference/releases">NumberPickerPreference's releases</a>.</em></p>
<blockquote>
<h2>Version 1.0.4</h2>
<h2>What's Changed</h2>
<ul>
<li>Migrate to latest Gradle version and Maven Publish plugin by <a href="https://github.com/invissvenska"><code>`@​invissvenska</code></a>` in <a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/pull/10">invissvenska/NumberPickerPreference#10</a></li>
<li>Feature/migrate to new gradle and maven plugin by <a href="https://github.com/invissvenska"><code>`@​invissvenska</code></a>` in <a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/pull/11">invissvenska/NumberPickerPreference#11</a></li>
<li>Develop by <a href="https://github.com/invissvenska"><code>`@​invissvenska</code></a>` in <a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/pull/12">invissvenska/NumberPickerPreference#12</a></li>
<li>Develop by <a href="https://github.com/invissvenska"><code>`@​invissvenska</code></a>` in <a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/pull/14">invissvenska/NumberPickerPreference#14</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/invissvenska/NumberPickerPreference/compare/1.0.3...1.0.4">https://github.com/invissvenska/NumberPickerPreference/compare/1.0.3...1.0.4</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="9ee00acc93"><code>9ee00ac</code></a> Develop (<a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/issues/14">#14</a>)</li>
<li><a href="1035c87ae1"><code>1035c87</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/issues/12">#12</a> from invissvenska/develop</li>
<li><a href="93a5d495df"><code>93a5d49</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/issues/11">#11</a> from invissvenska/feature/migrate_to_new_gradle_and_ma...</li>
<li><a href="300af7866a"><code>300af78</code></a> fix <a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/issues/9">#9</a></li>
<li><a href="391b8a8593"><code>391b8a8</code></a> increment version, removed commented code from gradle</li>
<li><a href="ef4a9b3a63"><code>ef4a9b3</code></a> set java version to 11 for jitpack by adding the jitpack yml</li>
<li><a href="c28b95e5c8"><code>c28b95e</code></a> set java version to 11</li>
<li><a href="2df1805d82"><code>2df1805</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/invissvenska/NumberPickerPreference/issues/10">#10</a> from invissvenska/feature/migrate_to_new_gradle_and_ma...</li>
<li><a href="71f4f5992e"><code>71f4f59</code></a> Migrate to latest Gradle version and Maven Publish plugin</li>
<li>See full diff in <a href="https://github.com/invissvenska/NumberPickerPreference/compare/1.0.3...1.0.4">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-26 23:09:26 +00:00
bors[bot]
fcd6f075f6 Merge #617
617: Translations update from Hosted Weblate r=TheLastProject a=weblate

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


It also includes following components:

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



Current translation status:

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


Co-authored-by: Joel A <joeax910@student.liu.se>
2021-11-26 22:15:35 +00:00
Joel A
3d2f119fdb Translated using Weblate (Swedish)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-11-26 22:53:13 +01:00
Sylvia van Os
05f4add5cd Merge pull request #616 from TheLastProject/create-pull-request/patch-1637958232
Update Fastlane changelogs
2021-11-26 21:24:28 +01:00
TheLastProject
eb71d5f717 Update Fastlane changelogs 2021-11-26 20:23:51 +00:00
Sylvia van Os
a64603d64e Fix Fastlane converter 2021-11-26 21:23:33 +01:00
Sylvia van Os
e686bb36ce Mention power screen controls support 2021-11-26 21:21:49 +01:00
bors[bot]
351a805046 Merge #505
505: Feature/power screen widgets r=TheLastProject a=TheLastProject

Continuation of #427

Fixes #146

Co-authored-by: /usr/local/ΕΨΗΕΛΩΝ <djechelon@zighinetto.org>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-11-26 20:12:33 +00:00
Sylvia van Os
466ac404bc Show "Not found" if card was removed 2021-11-26 20:25:41 +01:00
Sylvia van Os
b5c0be8ed5 Make lint happy 2021-11-25 19:34:11 +01:00
Sylvia van Os
f963b2fd4c Make spotBugs happy 2021-11-25 19:18:14 +01:00
dependabot[bot]
c26ae45cdc Bump NumberPickerPreference from 1.0.3 to 1.0.4
Bumps [NumberPickerPreference](https://github.com/invissvenska/NumberPickerPreference) from 1.0.3 to 1.0.4.
- [Release notes](https://github.com/invissvenska/NumberPickerPreference/releases)
- [Commits](https://github.com/invissvenska/NumberPickerPreference/compare/1.0.3...1.0.4)

---
updated-dependencies:
- dependency-name: com.github.invissvenska:NumberPickerPreference
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-25 02:15:52 +00:00
Sylvia van Os
addb0896c0 Surrender to Google (fixes #439)
I can't do it anymore. I am just sick of wasting so much time trying to
get Google to listen. I am sick of talking to a brick wall. I am sick of
the complete lack of competence in Google's entire review department. I
am so tired of having the goalpost moved in front of my eyes over and
over again. And above all, I am sick and tired of asking my translators,
who I appreciate so damn much, to keep wasting their time on Google's
whims.

So here you go, Google. You win. I give up. I will not use a word that
Google Translate translates to "free", because saying my app is "free of
charge" is not allowed. I will not tell your employees over and over
again how to use a dictionary. I will not try to make your staff
understand that "free" meaning both "free of charge" and "freedom" is a
very English concept and is not a thing in the majority of languages.

It is a shame you have cornered the market, because if I could, I would
have avoided your Play Store altogether. At least F-Droid still exists,
so my users are not completely screwed whenever you next decide to
punish me for something arbitrary and incorrect again.

Please, Google, let this be the end of this nonsense.
2021-11-24 17:05:52 +01:00
Sylvia van Os
c75bef4f01 Open on single click 2021-11-23 23:25:10 +01:00
Sylvia van Os
f633fb39aa Use card icon image if available 2021-11-23 23:24:36 +01:00
Sylvia van Os
49200fff48 Fix most spotBugs issues 2021-11-23 23:23:58 +01:00
Sylvia van Os
f4bd6a3f59 Merge remote-tracking branch 'origin' into feature/power_screen_widgets 2021-11-23 20:42:16 +01:00
Sylvia van Os
18021e7653 Remove unicode character from Norwegian title as per Google guidelines 2021-11-23 20:25:17 +01:00
bors[bot]
de364a4cc4 Merge #612
612: Replaced StartActivityForResult with ResultLaunchers r=TheLastProject a=Kethen

redoing #470

currently spotBug complains about an InputStream is not being closed properly, which it didn't catch before the refactoring

I'd suggest moving opening an inputStream inside the import thread

Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-11-23 18:17:36 +00:00
Katharine Chui
3ba42aad6d always use getContentResolver().open(Input/Output)Stream, opening streams diffrently from URIs seems to be redundent
https://developer.android.com/reference/android/content/ContentResolver#openInputStream(android.net.Uri)

spotBug is also happier with those streams not getting closed within the scope of that function, for some reason unknown
2021-11-23 18:42:21 +08:00
Katharine
63fad8bae1 ImportExportActivity ActivityResultLauncher, minor clean ups 2021-11-23 18:35:29 +08:00
Katharine
ad418bc9bd ScanActivity ActivityResultLauncher 2021-11-23 18:35:29 +08:00
Katharine
b0263d8eb5 MainActivity ActivityResultLauncher 2021-11-23 18:35:29 +08:00
Sylvia van Os
97d3969f93 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-11-22 19:11:39 +01:00
Sylvia van Os
1c85172206 Google can't decide 2021-11-22 19:11:24 +01:00
bors[bot]
711fa7ef81 Merge #611
611: Bump robolectric from 4.7.1 to 4.7.2 r=TheLastProject a=dependabot[bot]

Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.7.1 to 4.7.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/robolectric/robolectric/releases">robolectric's releases</a>.</em></p>
<blockquote>
<h2>Robolectric 4.7.2</h2>
<p>This is a minor release that fixes a memory leak of Theme objects in binary resources for Android S (<a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6872">#6872</a>). Thanks <a href="https://github.com/calvarez-ov"><code>`@​calvarez-ov</code></a>` for the report and helping debug.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="9ed0797525"><code>9ed0797</code></a> Bump version to 4.7.2.</li>
<li><a href="5a8c5def4f"><code>5a8c5de</code></a> Fix theme native object collection in Android S</li>
<li><a href="666a5213a7"><code>666a521</code></a> Migrate ShadowAccessibilityNodeInfo to reflector</li>
<li>See full diff in <a href="https://github.com/robolectric/robolectric/compare/robolectric-4.7.1...robolectric-4.7.2">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-22 17:48:11 +00:00
dependabot[bot]
2220a8e3c6 Bump robolectric from 4.7.1 to 4.7.2
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.7.1 to 4.7.2.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.7.1...robolectric-4.7.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-22 02:25:20 +00:00
bors[bot]
cd1bd31e23 Merge #610
610: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: SC <lalocas@protonmail.com>
2021-11-21 23:01:08 +00:00
SC
f812194b1a Translated using Weblate (Portuguese)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2021-11-21 23:53:04 +01:00
IllusiveMan196
79c26cfed7 Translated using Weblate (Ukrainian)
Currently translated at 15.3% (14 of 91 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2021-11-21 23:53:04 +01:00
Sylvia van Os
85ea10303a Merge pull request #609 from TheLastProject/create-pull-request/patch-1637471752
Update contributors
2021-11-21 07:05:15 +01:00
TheLastProject
4196ad8d61 Update contributors 2021-11-21 05:15:51 +00:00
bors[bot]
90be6a418b Merge #608
608: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
2021-11-20 21:59:18 +00:00
IllusiveMan196
2e2563cfc0 Translated using Weblate (Ukrainian)
Currently translated at 5.4% (5 of 91 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2021-11-20 22:53:02 +01:00
IllusiveMan196
983c207019 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-11-20 22:51:35 +01:00
Sylvia van Os
6a5983b7bf Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-11-20 14:37:23 +01:00
Sylvia van Os
b34e69d5d5 Delete Portuguese title because it has been disallowed by Google 2021-11-20 14:36:55 +01:00
bors[bot]
f1cd9ac935 Merge #606
606: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: g <muziejusinfo@gmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
2021-11-20 12:02:05 +00:00
solokot
5eb56c934b Translated using Weblate (Russian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-11-20 12:53:08 +01:00
Heimen Stoffels
f9b24d4b1b Translated using Weblate (Dutch)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-11-20 12:53:07 +01:00
Allan Nordhøy
537b2cba82 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.2% (228 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-11-20 12:53:07 +01:00
g
d788a274a8 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-11-20 12:53:07 +01:00
J. Lavoie
57c383c064 Translated using Weblate (Italian)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-11-20 12:53:07 +01:00
J. Lavoie
49a8828007 Translated using Weblate (French)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-11-20 12:53:06 +01:00
J. Lavoie
d56a31160a Translated using Weblate (German)
Currently translated at 100.0% (232 of 232 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-11-20 12:53:06 +01:00
Sylvia van Os
bb78f9c12a Fastlane cleanup 2021-11-20 00:32:15 +01:00
Sylvia van Os
00c005afce Tag CHANGELOG 2021-11-20 00:15:09 +01:00
Sylvia van Os
c008767bd6 Release Catima 2.10.0 2021-11-20 00:14:33 +01:00
Sylvia van Os
5e15555ad4 Fix deprecations 2021-11-19 15:07:04 +01:00
bors[bot]
916d12c504 Merge #604
604: Bump robolectric from 4.7 to 4.7.1 r=TheLastProject a=dependabot[bot]

Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.7 to 4.7.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/robolectric/robolectric/releases">robolectric's releases</a>.</em></p>
<blockquote>
<h2>Robolectric 4.7.1</h2>
<p>This is a minor release that fixes <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6858">#6858</a>. In that issue, certain Android classes could not be mocked by Mockito due to some changes to Robolectric instrumentation performed on interfaces.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="c1e4fed866"><code>c1e4fed</code></a> Bump version to 4.7.1.</li>
<li><a href="c9e861d3d7"><code>c9e861d</code></a> Bump to version 3 of preinstrumented jars</li>
<li><a href="434a5347f1"><code>434a534</code></a> Limit instrumentation on interfaces</li>
<li>See full diff in <a href="https://github.com/robolectric/robolectric/compare/robolectric-4.7...robolectric-4.7.1">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-19 07:49:40 +00:00
bors[bot]
854958e364 Merge #603
603: Bump zip4j from 2.9.0 to 2.9.1 r=TheLastProject a=dependabot[bot]

Bumps [zip4j](https://github.com/srikanth-lingala/zip4j) from 2.9.0 to 2.9.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/srikanth-lingala/zip4j/releases">zip4j's releases</a>.</em></p>
<blockquote>
<h2>v2.9.1</h2>
<p>Improvements:</p>
<ul>
<li><a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/341">#341</a> Add caching to Travis build process</li>
<li><a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/359">#359</a> Add PasswordCallback for encrypted Input Streams</li>
</ul>
<p>Bug fixes:</p>
<ul>
<li><a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/354">#354</a> Skip checking for directory when reading entries</li>
<li><a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/347">#347</a> Extract contents of sub-directory even when sub-directory entry does not exist</li>
<li><a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/348">#348</a> Fix bug in sub-folder extraction when folder name appears at the end of central directory</li>
<li><a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/363">#363</a> Avoid replacing Windows file name separator</li>
<li><a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/365">#365</a> Improve file header equals check to include offset of local file header</li>
<li><a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/380">#380</a> Use exception type WRONG_PASSWORD when password is null or empty for AES</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="860965237a"><code>8609652</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/365">#365</a> Improve file header equals check to include offset of local file header</li>
<li><a href="9eab02b675"><code>9eab02b</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/380">#380</a> Use exception type WRONG_PASSWORD when password is null or empty for AES</li>
<li><a href="4e5e2d45ff"><code>4e5e2d4</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/363">#363</a> Removed invalid test</li>
<li><a href="de9bb5f35d"><code>de9bb5f</code></a> Remove functional interface annotation</li>
<li><a href="ec78cea98c"><code>ec78cea</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/363">#363</a> Avoid replacing Windows file name separator</li>
<li><a href="2ec68db8b7"><code>2ec68db</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/359">#359</a> Add PasswordCallback for encrypted Input Streams</li>
<li><a href="7a139612ce"><code>7a13961</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/347">#347</a> Use exception type FILE_NOT_FOUND when entry does not exist in zip</li>
<li><a href="3224fb8ef5"><code>3224fb8</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/347">#347</a> Fix failing tests</li>
<li><a href="9ae5253f4b"><code>9ae5253</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/347">#347</a> Extract contents of sub-directory even when sub-directory entry does not...</li>
<li><a href="14aebe0d05"><code>14aebe0</code></a> <a href="https://github-redirect.dependabot.com/srikanth-lingala/zip4j/issues/348">#348</a> Fix bug in sub-folder extraction when folder name appears at the end of ...</li>
<li>Additional commits viewable in <a href="https://github.com/srikanth-lingala/zip4j/compare/v2.9.0...v2.9.1">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=net.lingala.zip4j:zip4j&package-manager=gradle&previous-version=2.9.0&new-version=2.9.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-19 07:45:09 +00:00
dependabot[bot]
d295dd40fd Bump robolectric from 4.7 to 4.7.1
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.7 to 4.7.1.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.7...robolectric-4.7.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-19 02:24:23 +00:00
dependabot[bot]
069a3c99ef Bump zip4j from 2.9.0 to 2.9.1
Bumps [zip4j](https://github.com/srikanth-lingala/zip4j) from 2.9.0 to 2.9.1.
- [Release notes](https://github.com/srikanth-lingala/zip4j/releases)
- [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.9.0...v2.9.1)

---
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>
2021-11-19 02:24:13 +00:00
bors[bot]
f1e7e5494d Merge #602
602: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-11-18 15:58:55 +00:00
Oğuz Ersen
189fe7d101 Translated using Weblate (Turkish)
Currently translated at 19.7% (18 of 91 strings)

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

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-11-18 16:53:13 +01:00
bors[bot]
b8c1eaf88e Merge #601
601: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: solokot <solokot@gmail.com>
2021-11-18 15:23:53 +00:00
solokot
e525a32511 Translated using Weblate (Russian)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-11-18 16:20:39 +01:00
Sylvia van Os
de9f108534 Merge branch 'master' of github.com:TheLastProject/Catima 2021-11-18 16:20:28 +01:00
Sylvia van Os
c5f0d03a1c Add button to toggle showing details on main screen 2021-11-18 16:20:00 +01:00
Sylvia van Os
e592452d02 Use card shape for icons by default 2021-11-18 15:41:48 +01:00
bors[bot]
d3d2b37001 Merge #599 #600
599: Bump appcompat from 1.3.1 to 1.4.0 r=TheLastProject a=dependabot[bot]

Bumps appcompat from 1.3.1 to 1.4.0.


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

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

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

---

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

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


</details>

600: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: solokot <solokot@gmail.com>
2021-11-18 11:13:17 +00:00
solokot
3dbe4f8327 Translated using Weblate (Russian)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-11-18 09:53:07 +01:00
dependabot[bot]
3d81c1be08 Bump appcompat from 1.3.1 to 1.4.0
Bumps appcompat from 1.3.1 to 1.4.0.

---
updated-dependencies:
- dependency-name: androidx.appcompat:appcompat
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-18 02:15:36 +00:00
bors[bot]
333874e5e1 Merge #598
598: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

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

Co-authored-by: bors[bot] <bors[bot]@users.noreply.github.com>
2021-11-17 19:46:55 +00:00
bors[bot]
69a53a8408 Update Fastlane changelogs 2021-11-17 19:45:07 +00:00
bors[bot]
8dc479793b Merge #597
597: New card layout r=TheLastProject a=TheLastProject

TODO:
- [x] Fix cards sizing up to stay equal size but failing to size back down on group switch

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-11-17 19:39:27 +00:00
Sylvia van Os
a2d48a236b Tweak margins 2021-11-17 20:35:47 +01:00
Sylvia van Os
67f390f594 Update screenshots 2021-11-17 20:12:18 +01:00
Sylvia van Os
1a5109e036 Fix card sizing 2021-11-17 19:56:27 +01:00
bors[bot]
ff42ead6b7 Merge #595
595: Cleanup barcode selector r=TheLastProject a=TheLastProject

Should make #592 easier to implement.

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-11-17 18:17:41 +00:00
Sylvia van Os
2f8d8e79c1 Make spotBugs happy 2021-11-17 19:13:28 +01:00
bors[bot]
efa6ac1f6c Merge #596
596: Bump constraintlayout from 2.1.1 to 2.1.2 r=TheLastProject a=dependabot[bot]

Bumps [constraintlayout](https://github.com/androidx/constraintlayout) from 2.1.1 to 2.1.2.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/androidx/constraintlayout/commits">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-17 17:50:21 +00:00
bors[bot]
4fc56068e1 Merge #593
593: prevent bottomSheet from growing a padding getting into/leaving fullscreen r=TheLastProject a=Kethen

From android 5 to 9, going into full screen then back adds a top padding onto the coordinator layout bottom sheet

This aims to prevent that by removing the bottom sheet before entering full screen, then adding it back after leaving full screen

Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-11-17 17:46:24 +00:00
Sylvia van Os
7a0253ddcd New card layout 2021-11-17 17:44:19 +01:00
dependabot[bot]
ac3647695b Bump constraintlayout from 2.1.1 to 2.1.2
Bumps [constraintlayout](https://github.com/androidx/constraintlayout) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/androidx/constraintlayout/releases)
- [Commits](https://github.com/androidx/constraintlayout/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-17 02:18:51 +00:00
Sylvia van Os
fc902db170 Cleanup barcode selector 2021-11-16 23:57:56 +01:00
bors[bot]
b7230ba2a7 Merge #594
594: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
Co-authored-by: SC <lalocas@protonmail.com>
2021-11-16 19:56:20 +00:00
SC
f5b71beb4b Translated using Weblate (Portuguese)
Currently translated at 17.7% (16 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2021-11-16 20:53:18 +01:00
Joel A
380a12e926 Translated using Weblate (Swedish)
Currently translated at 98.6% (227 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-11-16 20:53:17 +01:00
solokot
f92f84ee5c Translated using Weblate (Russian)
Currently translated at 3.3% (3 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2021-11-16 20:53:16 +01:00
Katharine Chui
e1eb049d05 prevent bottomSheet from growing a padding getting into/leaving fullscreen 2021-11-16 23:44:45 +08:00
bors[bot]
e03ca71728 Merge #591
591: Bump robolectric from 4.6.1 to 4.7 r=TheLastProject a=dependabot[bot]

Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.6.1 to 4.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/robolectric/robolectric/releases">robolectric's releases</a>.</em></p>
<blockquote>
<p>Robolectric 4.7 adds support for Android S (API level 31).</p>
<p>Another big feature is support for Apple Silicon (Mac M1). Robolectric 4.7 now contains its own native implementation of the android.database.sqlite package. For Mac M1 machines, this SQLite mode is the default. For other OS's and architecture, use <code>`@SQLiteMode(NATIVE)</code>` to enable it. This new mode is currently only available for Mac and Linux. Native SQLite should be <strong>significantly</strong> faster, around 50-90% faster for SQLite operations, than the <code>LEGACY</code> SQLite mode. There were also several other performance improvements made for SQLite operations -- <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6687">#6687</a>, <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6690">#6690</a>,  and <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6711">#6711</a> (thanks <a href="https://github.com/al-broco"><code>`@​al-broco</code></a>!).</p>`
<p>The support v4 shadows are also deprecated at this release, and they will be removed at Robolectric 4.8.</p>
<p>Robolectric 4.7 also supports JDK 17.</p>
<h2>What's Changed</h2>
<ul>
<li>Clear cookies after test finished for CookieManagerTest by <a href="https://github.com/utzcoz"><code>`@​utzcoz</code></a>` in <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6581">robolectric/robolectric#6581</a></li>
<li>Only using ApplicationExitInfo for compile sdk 30 and above by <a href="https://github.com/utzcoz"><code>`@​utzcoz</code></a>` in <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6590">robolectric/robolectric#6590</a></li>
<li>Rebase PR 4064 - Fix NPE during saving state of WebView by <a href="https://github.com/utzcoz"><code>`@​utzcoz</code></a>` in <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6597">robolectric/robolectric#6597</a></li>
<li>Converting the String version of directlyOn(...) to <a href="https://github.com/Direct"><code>`@​Direct</code></a>` with reflector(...). by <a href="https://github.com/hoisie"><code>`@​hoisie</code></a>` in <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6598">robolectric/robolectric#6598</a></li>
<li>Add ITelephonyRegistry to ShadowServiceManager <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6605">robolectric/robolectric#6605</a></li>
<li>Implement new #startActivity methods for ShadowCrossProfileApps. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6601">robolectric/robolectric#6601</a></li>
<li>Add ShadowMediaExtractor. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6592">robolectric/robolectric#6592</a></li>
<li>Converting onVsync calls from ReflectionHelpers to use <a href="https://github.com/Direct"><code>`@​Direct</code></a>` with reflector(...) instead. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6602">robolectric/robolectric#6602</a></li>
<li>Update ShadowDisplayEventReceiver to support S <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6609">robolectric/robolectric#6609</a></li>
<li>Converting the proxy version of directlyOn(...) to <a href="https://github.com/Direct"><code>`@​Direct</code></a>` with reflector(...). by <a href="https://github.com/hoisie"><code>`@​hoisie</code></a>` in <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6610">robolectric/robolectric#6610</a></li>
<li>Fix Robolectric camera shadows to work with newer SDK versions. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6611">robolectric/robolectric#6611</a></li>
<li>Converting recycleUnchecked calls to use <a href="https://github.com/Direct"><code>`@​Direct</code></a>` with reflector(...) in place of ReflectionHelpers. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6603">robolectric/robolectric#6603</a></li>
<li>Cleaning up unnecessary <a href="https://github.com/Direct"><code>`@​Direct</code></a>` annotations in DirectActivityReflector. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6616">robolectric/robolectric#6616</a></li>
<li>Fixing the incorrect method signature in AssetManagerReflector that breaks GitHub CI. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6612">robolectric/robolectric#6612</a></li>
<li>No longer automatically log everything in ShadowLog if stream is specified <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6617">robolectric/robolectric#6617</a></li>
<li>Support IntBuffer with copyPixelsFromBuffer <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6613">robolectric/robolectric#6613</a></li>
<li>Suppress missing /system/etc/fonts.xml log noise for SDK 27 <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6618">robolectric/robolectric#6618</a></li>
<li>Add perf stats for reflector class definition <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6624">robolectric/robolectric#6624</a></li>
<li>Use Object to replace GnssAntennaInfo.Listener at ShadowLocationManager by <a href="https://github.com/utzcoz"><code>`@​utzcoz</code></a>` in <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6623">robolectric/robolectric#6623</a></li>
<li>Trimming the localrepository string. by <a href="https://github.com/Squadella"><code>`@​Squadella</code></a>` in <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6653">robolectric/robolectric#6653</a></li>
<li>Merging the the separate Reflector interfaces for Message into one main interface. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6619">robolectric/robolectric#6619</a></li>
<li>Remove OldClassInstrumentor <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6621">robolectric/robolectric#6621</a></li>
<li>Remove unnecessary ShadowLegacyMessage.isInUse <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6626">robolectric/robolectric#6626</a></li>
<li>Converting directlyOn(...) to <a href="https://github.com/Direct"><code>`@​Direct</code></a>` with reflector(...) in ShadowWindow and ShadowPhoneWindow. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6625">robolectric/robolectric#6625</a></li>
<li>Intercept calls to methods in {<a href="https://github.com/link"><code>`@​link</code></a>` Socket} not present in the OpenJDK. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6622">robolectric/robolectric#6622</a></li>
<li>Use bulk operations in copyPixels{to,from}Buffer <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6628">robolectric/robolectric#6628</a></li>
<li>Improve reflector caching using a regular HashMap <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6629">robolectric/robolectric#6629</a></li>
<li>Add shadow method ShadowLauncherApps#getShortcutConfigActivityList.  <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6631">robolectric/robolectric#6631</a></li>
<li>Add OnPermissionChangedListener implementation to ShadowPackageManager. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6627">robolectric/robolectric#6627</a></li>
<li>Update minSdkVersion to 14 in some integration_test manifests <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6630">robolectric/robolectric#6630</a></li>
<li>Merge InvokeDynamicClassInstrumentor into ClassInstrumentor <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6632">robolectric/robolectric#6632</a></li>
<li>Add a shadow method for PackageManager#getText which gets a String associated with package name and resource id. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6634">robolectric/robolectric#6634</a></li>
<li>Pass through openInputStream calls for SCHEME_ANDROID_RESOURCE <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6636">robolectric/robolectric#6636</a></li>
<li>Names thread used by ShadowFileObserver to match behavior of FileObserver. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6640">robolectric/robolectric#6640</a></li>
<li>Migrate from <code>AnnotationValue#toString</code> to <code>auto-common</code>'s <code>AnnotationValues.toString</code>. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6638">robolectric/robolectric#6638</a></li>
<li>Fix fidelity issue with Cursor.getBlob on a String column <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6641">robolectric/robolectric#6641</a></li>
<li>Remove InvokeDynamic perf stats <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6644">robolectric/robolectric#6644</a></li>
<li>Fix SQLiteDatabaseTest foreign key test to match Android behavior <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6643">robolectric/robolectric#6643</a></li>
<li>Add cardId support for ShadowEuiccManager. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6642">robolectric/robolectric#6642</a></li>
<li>Add OnUidImportanceListener implementation to ShadowActivityManager and SCREEN_ON/SCREEN_OFF broadcasts to ShadowPowerManager. <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6639">robolectric/robolectric#6639</a></li>
<li>Instrument default interface methods <a href="https://github-redirect.dependabot.com/robolectric/robolectric/pull/6645">robolectric/robolectric#6645</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="dc7bcfd314"><code>dc7bcfd</code></a> Bump version to 4.7.</li>
<li><a href="b2706bf5c2"><code>b2706bf</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6827">#6827</a> from hoisie/artifact-build</li>
<li><a href="ba989616d5"><code>ba98961</code></a> Add a workflow to build the nativeruntime libraries</li>
<li><a href="a5db353b55"><code>a5db353</code></a> Move clang/clang++ specification to CMakeLists</li>
<li><a href="0388825391"><code>0388825</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6844">#6844</a> from utzcoz/bump-asm-to-9.2</li>
<li><a href="7d44fa13a2"><code>7d44fa1</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6845">#6845</a> from hoisie/disable-mac-universal-build</li>
<li><a href="fe3bb98658"><code>fe3bb98</code></a> Disable the universal library for Mac OS</li>
<li><a href="5b1bd881a4"><code>5b1bd88</code></a> Bump asm to 9.2 to support JDK 17 and 18</li>
<li><a href="6a3305348d"><code>6a33053</code></a> Bump AGP to 7.1.0-beta03</li>
<li><a href="4b2ecb9b59"><code>4b2ecb9</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/robolectric/robolectric/issues/6833">#6833</a> from hoisie/add-icu-submodule</li>
<li>Additional commits viewable in <a href="https://github.com/robolectric/robolectric/compare/robolectric-4.6.1...robolectric-4.7">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-15 07:17:16 +00:00
dependabot[bot]
9f3633b2ef Bump robolectric from 4.6.1 to 4.7
Bumps [robolectric](https://github.com/robolectric/robolectric) from 4.6.1 to 4.7.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.6.1...robolectric-4.7)

---
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>
2021-11-15 02:18:03 +00:00
Sylvia van Os
0b53bdf6eb Tag CHANGELOG release 2021-11-14 22:12:14 +01:00
Sylvia van Os
2536767437 Android Studio -> Reformat Code 2021-11-14 21:55:33 +01:00
Sylvia van Os
2bc7d13d50 Release Catima 2.9.0 2021-11-14 16:05:32 +01:00
bors[bot]
84fef5a615 Merge #585
585: using icon on card view headers r=TheLastProject a=Kethen

some previews
![image](https://user-images.githubusercontent.com/22017945/141508586-9cf1a1e7-6312-4bea-8362-16f0bbed2a27.png)
![image](https://user-images.githubusercontent.com/22017945/141508626-b97fd7bd-701b-4fe8-8883-23f71489c57a.png)
![image](https://user-images.githubusercontent.com/22017945/141508668-790d0038-d6ae-429b-9c9b-efdb341ad1e3.png)
![image](https://user-images.githubusercontent.com/22017945/141508688-10c1ee3f-c215-4955-b941-16d94ef87e60.png)
![image](https://user-images.githubusercontent.com/22017945/141508745-c344bd7d-b0db-4d53-b98d-495a3b43423f.png)
![image](https://user-images.githubusercontent.com/22017945/141508774-7bdb111f-e3c2-41d0-87b3-4f75b067840b.png)


Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-11-14 14:45:16 +00:00
Katharine Chui
0993f3180b show icon image under system topbar, fix bottom sheet UI after rotation 2021-11-14 22:10:16 +08:00
Katharine Chui
f143e01685 fixes bottom sheet height after rotating in fullscreen, removes extra top padding in fullscreen mode, 204(5)->8 2021-11-14 22:10:16 +08:00
Katharine
cb5a98edad using icon on card view headers 2021-11-14 22:10:16 +08:00
bors[bot]
74157b2fe5 Merge #589
589: Update contributors r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-11-14 08:48:52 +00:00
TheLastProject
5b7d5599f9 Update contributors 2021-11-14 05:15:51 +00:00
bors[bot]
cdfcfebd77 Merge #588
588: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-11-13 17:07:14 +00:00
Oğuz Ersen
301fd880f5 Translated using Weblate (Turkish)
Currently translated at 18.8% (17 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-11-13 17:53:54 +01:00
bors[bot]
4a4ef1b148 Merge #587
587: use daynight theme for toolbar r=TheLastProject a=Kethen

Before:
![image](https://user-images.githubusercontent.com/22017945/141610761-9cff9903-1074-4bd2-9a29-e9273bfee90c.png)

After:
![image](https://user-images.githubusercontent.com/22017945/141610679-ff5a1110-139a-487f-9954-565887c53f7a.png)
![image](https://user-images.githubusercontent.com/22017945/141610688-9b727e9c-dbab-49d9-aa32-ac231fea647c.png)


Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-11-13 12:58:06 +00:00
Katharine Chui
0bc7f4a164 use daynight theme for toolbar 2021-11-13 15:47:34 +08:00
bors[bot]
5e593d0ded Merge #584
584: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: SC <lalocas@protonmail.com>
2021-11-12 16:42:04 +00:00
SC
e958fff7b4 Translated using Weblate (Portuguese)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2021-11-12 15:52:15 +01:00
IllusiveMan196
d81b236aa6 Translated using Weblate (Ukrainian)
Currently translated at 4.4% (4 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2021-11-12 15:52:15 +01:00
bors[bot]
8be8737459 Merge #583
583: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: 109247019824 <stoyan@gmx.com>
2021-11-11 07:06:39 +00:00
109247019824
e80238bfcf Translated using Weblate (Bulgarian)
Currently translated at 99.5% (229 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-11-11 06:51:21 +01:00
bors[bot]
211032c152 Merge #582
582: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Weblate <noreply@weblate.org>
2021-11-10 19:30:44 +00:00
Weblate
0bf50fb491 Added translation using Weblate (Portuguese (Portugal)) 2021-11-10 20:29:33 +01:00
Sylvia van Os
6f22e2d185 Fastlane fixes 2021-11-10 20:29:18 +01:00
bors[bot]
31c341663f Merge #578
578: preserve shortcut icon shape by padding, getting round corners back on card lists r=TheLastProject a=Kethen

adding padding to icons referencing https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html
![image](https://user-images.githubusercontent.com/22017945/140962982-88becacc-677d-4593-8b7e-15fcc2f9df7e.png)
![image](https://user-images.githubusercontent.com/22017945/140889147-a40ea4ed-5fb1-47b8-9ec1-59bab7d6577f.png)



Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
2021-11-10 18:31:16 +00:00
Katharine
40a68a55e2 simplify adaptive bitmap creation with Canvas, trigger shortcut list refresh on card save 2021-11-10 14:06:08 +08:00
Katharine
1fd0acf6e4 padding images with darken header color, remove outline artifacts behind thumbnail on card lists 2021-11-10 14:06:08 +08:00
bors[bot]
127d288ace Merge #581
581: Translations update from Hosted Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Petr Novák <nit.monkey@gmail.com>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: g <muziejusinfo@gmail.com>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-11-09 21:56:30 +00:00
Oğuz Ersen
11587631a9 Translated using Weblate (Turkish)
Currently translated at 18.8% (17 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-11-09 22:53:04 +01:00
Oğuz Ersen
466b3d91d3 Translated using Weblate (Turkish)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-11-09 22:53:03 +01:00
Petr Novák
8f4f7524c4 Translated using Weblate (Czech)
Currently translated at 98.8% (89 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2021-11-09 22:53:03 +01:00
IllusiveMan196
f35aa2a064 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-11-09 22:53:00 +01:00
solokot
c20206fe28 Translated using Weblate (Russian)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-11-09 22:53:00 +01:00
Heimen Stoffels
45de3f6616 Translated using Weblate (Dutch)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-11-09 22:52:59 +01:00
g
6f42b30790 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-11-09 22:52:59 +01:00
J. Lavoie
35eab50775 Translated using Weblate (Italian)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-11-09 22:52:59 +01:00
J. Lavoie
19d302e0a4 Translated using Weblate (French)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-11-09 22:52:59 +01:00
J. Lavoie
a17ccfa41a Translated using Weblate (German)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-11-09 22:52:58 +01:00
Petr Novák
a22e05284c Translated using Weblate (Czech)
Currently translated at 100.0% (230 of 230 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2021-11-09 22:52:58 +01:00
bors[bot]
64491a1f7a Merge #576
576: Bump ucrop from 2.2.6 to 2.2.7 r=TheLastProject a=dependabot[bot]

Bumps [ucrop](https://github.com/Yalantis/uCrop) from 2.2.6 to 2.2.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/Yalantis/uCrop/releases">ucrop's releases</a>.</em></p>
<blockquote>
<h2>2.2.7</h2>
<p>Merged <a href="https://github-redirect.dependabot.com/Yalantis/uCrop/pull/732">PR 732</a>:
-- added support of &quot;content&quot; schema
-- added support for SAF requirements</p>
<p>Merged <a href="https://github-redirect.dependabot.com/Yalantis/uCrop/pull/758">PR 758</a>:
-- added ability to set OkHttpClient with custom settings
-- updated dependencies (exif interface, app compat, transition, okhttp3)</p>
<h2>2.2.6-native</h2>
<p>-- Fixed Bitmap too large exception</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="64c8f5b085"><code>64c8f5b</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/Yalantis/uCrop/issues/762">#762</a> from Yalantis/improve/update_sample_app</li>
<li><a href="70546c1016"><code>70546c1</code></a> Updated dependencies</li>
<li><a href="0ff3e6a8e8"><code>0ff3e6a</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/Yalantis/uCrop/issues/732">#732</a> from fabio-blanco/fix/non_native_android-10_saf-desti...</li>
<li><a href="cd17761b36"><code>cd17761</code></a> Merge branch 'master-non-native' into merge_non_native_android-10_saf-destina...</li>
<li><a href="586493a762"><code>586493a</code></a> Added an IllegalArgumentException in the copyFile method to inform that an un...</li>
<li><a href="32e0fcd887"><code>32e0fcd</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/Yalantis/uCrop/issues/758">#758</a> from Yalantis/fix/non_native_ssl_handshake_exception</li>
<li><a href="eb2d32fe96"><code>eb2d32f</code></a> Refactorings on BitmapCropTask for improving readability protections against ...</li>
<li><a href="fd651666f6"><code>fd65166</code></a> added UCropInitializer,</li>
<li><a href="22b24bafa3"><code>22b24ba</code></a> NullPointerException protection on weak reference of context get on crop method.</li>
<li><a href="fd919ea540"><code>fd919ea</code></a> added documentation for UCropHttpClientStore methods</li>
<li>Additional commits viewable in <a href="https://github.com/Yalantis/uCrop/compare/2.2.6...2.2.7">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-09 17:33:46 +00:00
bors[bot]
472d8ae18d Merge #577
577: offer 1:1 by default when cropping icon, set header color only for icon r=TheLastProject a=Kethen

header color is only change after an icon is set
cropper offers 1:1 by default instead when an icon is getting cropped

Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
2021-11-08 18:45:38 +00:00
Sylvia van Os
388db6feab Uppercase Card for consistency too 2021-11-08 19:42:51 +01:00
Katharine
5833d49fbf offer 1:1 by default when cropping icon, set header color only for icon 2021-11-08 19:10:41 +08:00
dependabot[bot]
ffb2fadcfc Bump ucrop from 2.2.6 to 2.2.7
Bumps [ucrop](https://github.com/Yalantis/uCrop) from 2.2.6 to 2.2.7.
- [Release notes](https://github.com/Yalantis/uCrop/releases)
- [Commits](https://github.com/Yalantis/uCrop/compare/2.2.6...2.2.7)

---
updated-dependencies:
- dependency-name: com.github.yalantis:ucrop
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-08 02:26:27 +00:00
Sylvia van Os
5f534b9646 Merge pull request #573 from TheLastProject/create-pull-request/patch-1636313316
Update Fastlane changelogs
2021-11-07 20:46:20 +01:00
bors[bot]
e011324b9f Merge #572
572: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Marnick L'Eau <leaumar@mailbox.org>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-11-07 19:29:09 +00:00
TheLastProject
21df76a2b6 Update Fastlane changelogs 2021-11-07 19:28:36 +00:00
Oğuz Ersen
1af9789cf6 Translated using Weblate (Turkish)
Currently translated at 18.8% (17 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-11-07 20:28:20 +01:00
Marnick L'Eau
b891e05fb9 Translated using Weblate (Dutch)
Currently translated at 10.0% (9 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2021-11-07 20:28:20 +01:00
Sylvia van Os
55e09b602f Update CHANGELOG 2021-11-07 20:28:09 +01:00
Sylvia van Os
af4075b9e2 Choose image as card icon (#333) 2021-11-07 20:27:28 +01:00
bors[bot]
da0a221c85 Merge #571
571: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: g <muziejusinfo@gmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: Marnick L'Eau <leaumar@mailbox.org>
Co-authored-by: Eric <spice2wolf@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: SC <lalocas@protonmail.com>
2021-11-07 16:57:03 +00:00
SC
191445b822 Translated using Weblate (Portuguese)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2021-11-07 17:51:18 +01:00
Oğuz Ersen
d890b062a9 Translated using Weblate (Turkish)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-11-07 17:51:18 +01:00
Eric
59173443e7 Translated using Weblate (Chinese (Simplified))
Currently translated at 82.8% (189 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2021-11-07 17:51:18 +01:00
Marnick L'Eau
5da76c9d9c Translated using Weblate (Dutch)
Currently translated at 5.5% (5 of 90 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2021-11-07 17:51:17 +01:00
IllusiveMan196
f048566929 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (227 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-11-07 17:51:17 +01:00
Heimen Stoffels
fe0f4314db Translated using Weblate (Dutch)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-11-07 17:51:16 +01:00
Allan Nordhøy
8d39bd671c Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.2% (224 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-11-07 17:51:16 +01:00
g
9ad33a047f Translated using Weblate (Lithuanian)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-11-07 17:51:16 +01:00
J. Lavoie
2a78335607 Translated using Weblate (Italian)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-11-07 17:51:16 +01:00
J. Lavoie
d99c72982d Translated using Weblate (French)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-11-07 17:51:15 +01:00
J. Lavoie
79ced018d5 Translated using Weblate (German)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-11-07 17:51:15 +01:00
Sylvia van Os
f80c79ffb1 Translated using Weblate (English)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/en/
2021-11-07 17:51:15 +01:00
Sylvia van Os
11970004f0 Android Studio reformat 2021-11-07 15:38:55 +01:00
bors[bot]
a348ad62a2 Merge #570
570: Update contributors r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-11-07 12:01:42 +00:00
TheLastProject
22d612427f Update contributors 2021-11-07 05:15:30 +00:00
Sylvia van Os
a907b28fe8 Merge pull request #569 from TheLastProject/create-pull-request/patch-1636205659
Update Fastlane changelogs
2021-11-06 14:34:58 +01:00
TheLastProject
663612dce9 Update Fastlane changelogs 2021-11-06 13:34:18 +00:00
Sylvia van Os
a55da89eb2 Update CHANGELOG 2021-11-06 14:33:59 +01:00
bors[bot]
63ceb2589f Merge #559
559: #372 image rotation and crop r=TheLastProject a=Kethen

`@waffshappen` suggested https://github.com/Yalantis/uCrop
targets #372



https://user-images.githubusercontent.com/22017945/139484703-e33a5da8-ccb5-4d6a-b70c-3325e34fcec9.mp4

 


Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
2021-11-06 13:25:39 +00:00
Katharine
dd981d72d7 do not attempt image load if removed, typo fixes, do not cast literals, offer full image on cropper start 2021-11-06 12:47:08 +08:00
Katharine
8940a8ea77 card edit activity: revised instance saving, revised temp image handling 2021-11-05 00:01:03 +08:00
Katharine
57cfac3172 save state for cropper 2021-11-04 10:48:47 +08:00
Katharine
f475844bd0 wrapping up test case debugging 2021-11-04 10:48:47 +08:00
Katharine
4536453fdf debugging test case breakage 2021-11-04 10:48:47 +08:00
Katharine
3ee533b815 migrate to registerForActivityResult callbacks 2021-11-04 10:48:47 +08:00
Katharine
a744c19cce handle null intent from ucrop for when user just exits without finish cropping 2021-11-04 10:48:46 +08:00
Katharine
9cc66c5d67 minor touch ups from android studio suggestions 2021-11-04 10:48:46 +08:00
Katharine
3e5b018b55 fxing spotbug raised issues 2021-11-04 10:48:46 +08:00
Katharine
f6fee780ee cropper poc 2021-11-04 10:48:32 +08:00
bors[bot]
6971f23d0a Merge #567
567: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-11-03 21:34:43 +00:00
Oğuz Ersen
6d33576936 Translated using Weblate (Turkish)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-11-03 22:33:22 +01:00
solokot
b6c9b9059e Translated using Weblate (Russian)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-11-03 22:33:21 +01:00
J. Lavoie
000bd7b734 Translated using Weblate (Italian)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-11-03 22:33:21 +01:00
J. Lavoie
3dde4de775 Translated using Weblate (French)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-11-03 22:33:21 +01:00
J. Lavoie
9b867370c2 Translated using Weblate (German)
Currently translated at 100.0% (228 of 228 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-11-03 22:33:20 +01:00
bors[bot]
c092a04390 Merge #566
566: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-11-03 20:40:54 +00:00
TheLastProject
50d80c1a9e Update Fastlane changelogs 2021-11-03 20:38:28 +00:00
Sylvia van Os
67e2147d33 Document awesome new group editing 2021-11-03 21:37:59 +01:00
bors[bot]
cfe2aaaad8 Merge #557
557: Group management POC for #129 r=TheLastProject a=Kethen

Proof of concept for #129, please review and comment on desired changes
A few new strings are added so translations will be needed

meanwhile I think all added group has to be trimmed to avoid having identical groups like in the example

https://user-images.githubusercontent.com/22017945/139289359-32f42b48-a40e-4039-8f0b-72bbe43cd0de.mp4



https://user-images.githubusercontent.com/22017945/139294845-28c88e03-871f-49d1-9b45-f0648f2f7b50.mp4






Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
Co-authored-by: Katharine Chui <kwchuiaa@connect.ust.hk>
2021-11-03 18:40:28 +00:00
Katharine
88a91de63b removed commented code, input check for group add, input check and minor revisions 2021-11-03 10:13:59 +08:00
Katharine
2cdeb1af9c use HashMap<> constructor to clone HashMap in LoyaltyCardCursorAdapter 2021-11-03 10:13:59 +08:00
Katharine
c815c3908f added a comment explaining why setText is used there 2021-11-03 10:13:59 +08:00
Katharine
9e831924c6 remove Parcel in Group, remove onResume/onPause in ManageGroupActivity and clean ups 2021-11-03 10:13:59 +08:00
Katharine
cfc901855b update help text in group edit activity 2021-11-03 10:13:59 +08:00
Katharine Chui
a00a69e0c0 UI changes, group cache, code cleanup
hash maps are cloned manually to make android studio and spotbug happy
2021-11-03 10:13:59 +08:00
Katharine
426acc701e remove setSort which will likely not be implemented in here 2021-11-03 10:13:59 +08:00
Katharine
d6eccd11a5 UI touch ups 2021-11-03 10:13:59 +08:00
Katharine
cb8275771f remove database shortcuts 2021-11-03 10:13:59 +08:00
Katharine
9252c01aa7 Group does not need to be a Parcelable anymore 2021-11-03 10:13:59 +08:00
Katharine
b4b544e342 remove modularity 2021-11-03 10:13:59 +08:00
Katharine
f667fcbebe requested manifest changes 2021-11-03 10:13:59 +08:00
Katharine
cc402c39be fixing errors reported by spotbugs 2021-11-03 10:13:59 +08:00
Katharine
d5d921a1c8 Group management POC 2021-11-03 10:13:59 +08:00
bors[bot]
d8794811a1 Merge #565
565: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2021-11-02 16:17:28 +00:00
Allan Nordhøy
e56795307e Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.5% (221 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-11-02 16:35:12 +01:00
bors[bot]
6ad99d47aa Merge #561
561: Update contributors r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-10-31 06:12:36 +00:00
TheLastProject
2998a4d553 Update contributors 2021-10-31 05:15:42 +00:00
bors[bot]
63db8fa0f3 Merge #560
560: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: SC <lalocas@protonmail.com>
2021-10-30 16:40:26 +00:00
SC
ee14d9e0c5 Translated using Weblate (Portuguese)
Currently translated at 16.8% (15 of 89 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2021-10-30 18:38:21 +02:00
SC
1455265045 Translated using Weblate (Portuguese)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2021-10-30 18:38:17 +02:00
bors[bot]
4f5cd87912 Merge #558
558: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Eric <spice2wolf@gmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
Co-authored-by: mondstern <mondstern@snopyta.org>
2021-10-28 21:11:28 +00:00
mondstern
d5516c59a6 Translated using Weblate (Welsh)
Currently translated at 16.2% (36 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cy/
2021-10-28 23:01:42 +02:00
mondstern
5654abe6e9 Translated using Weblate (Latvian)
Currently translated at 56.3% (125 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2021-10-28 23:01:42 +02:00
Joel A
b17a50f9c2 Translated using Weblate (Swedish)
Currently translated at 99.0% (220 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-10-28 23:01:42 +02:00
Eric
87c9bb590b Translated using Weblate (Chinese (Simplified))
Currently translated at 81.5% (181 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2021-10-28 23:01:42 +02:00
bors[bot]
dc9360eb8a Merge #556
556: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: 109247019824 <stoyan@gmx.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: mondstern <mondstern@snopyta.org>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-10-28 20:57:28 +00:00
Sylvia van Os
c8d2aa26f5 Add cy to selector 2021-10-28 22:56:59 +02:00
Sylvia van Os
a5074eb191 Fix invalid translation 2021-10-28 22:37:00 +02:00
mondstern
9df0a8ff57 Added translation using Weblate (Welsh) 2021-10-28 20:01:19 +02:00
mondstern
a79cf72ad7 Translated using Weblate (Latvian)
Currently translated at 21.1% (47 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2021-10-28 12:01:22 +02:00
mondstern
db0134a44c Translated using Weblate (Croatian)
Currently translated at 51.8% (115 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2021-10-28 12:01:21 +02:00
Reza Almanda
5f6424778a Translated using Weblate (Indonesian)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2021-10-28 12:01:21 +02:00
mondstern
950264105b Translated using Weblate (Portuguese)
Currently translated at 51.3% (114 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2021-10-28 12:01:20 +02:00
Oğuz Ersen
7b2d9eb47f Translated using Weblate (Turkish)
Currently translated at 17.9% (16 of 89 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-10-28 12:01:19 +02:00
109247019824
088ee66b5a Translated using Weblate (Bulgarian)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-10-28 12:01:18 +02:00
bors[bot]
2487edf4b2 Merge #554
554: Made name and ID inputs single-line r=TheLastProject a=franga2000

Since I already had the IDE open... (also still need that last Hacktoberfest PR 😅)

Fixes #553 

Co-authored-by: Miha Frangež <miha.frangez@gmail.com>
2021-10-27 21:39:37 +00:00
Miha Frangež
e16d2e22ac Made name and ID inputs single-line 2021-10-27 23:24:06 +02:00
bors[bot]
7b335c69ba Merge #552
552: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: mondstern <mondstern@snopyta.org>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-10-27 18:33:36 +00:00
Sylvia van Os
c1bd7043b1 Add Latvian to language selector 2021-10-27 20:32:58 +02:00
mondstern
71f3b5bc5f Added translation using Weblate (Latvian) 2021-10-27 20:26:24 +02:00
Sylvia van Os
e2f33bf4b4 Release Catima 2.8.1 2021-10-27 18:24:46 +02:00
bors[bot]
b1685ac90e Merge #549
549: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-10-27 15:40:23 +00:00
TheLastProject
394cc6b30f Update Fastlane changelogs 2021-10-27 15:38:49 +00:00
Sylvia van Os
75e320e108 Update CHANGELOG 2021-10-27 17:38:19 +02:00
bors[bot]
e8b38b3367 Merge #548
548: fix: Overlapping TextView and ImageView. r=TheLastProject a=KasinaDheeraj

fixes #542 

Co-authored-by: Dheeraj <dheerukd2002@gmail.com>
2021-10-27 15:30:33 +00:00
Dheeraj
ffb24c973a fix: Overlapping TextView and ImageView. 2021-10-27 19:21:09 +05:30
bors[bot]
d43693b1d8 Merge #547
547: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-10-27 11:13:39 +00:00
TheLastProject
b7f17181f9 Update Fastlane changelogs 2021-10-27 11:12:50 +00:00
Sylvia van Os
10dc84820c Update CHANGELOG.md 2021-10-27 13:12:30 +02:00
bors[bot]
5f0d92470e Merge #545
545: Update CHANGELOG r=TheLastProject a=TheLastProject

bors r+

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-10-27 11:04:35 +00:00
Sylvia van Os
6bb4376e4d Update CHANGELOG 2021-10-27 12:57:24 +02:00
bors[bot]
92da792378 Merge #539
539: fix for #533, fix for #510 + LoyaltyCardViewActivity crashing on returning from day/night theme change r=TheLastProject a=Kethen

please review, fixes #533, and avoids a crash from loading LoyaltyCardViewActivity, switch out to settings and switch day/night mode, switch back, which fixes #510 as well

Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
2021-10-27 10:55:51 +00:00
Katharine
81499cd362 onProgressChanged handles only user input now, always store user zoom level input 2021-10-27 18:49:09 +08:00
Katharine
fc91f1ae63 avoid system theme change activity crash 2021-10-27 18:24:23 +08:00
Katharine
cec7bc880e view dots that respects themening in app settings 2021-10-27 18:24:23 +08:00
Katharine
4027df2119 refactor centerGuideLine resizing logic -sylvia 2021-10-27 18:24:23 +08:00
bors[bot]
93132961d3 Merge #544
544: fixing #320 by not recreating main activity returning from another activity, requires testing r=TheLastProject a=Kethen

targetting #320

Co-authored-by: Katharine <kwchuiaa@connect.ust.hk>
2021-10-27 09:34:24 +00:00
Katharine
638528d4fc do not recreate main activity returning from another activity 2021-10-27 15:22:31 +08:00
bors[bot]
67ef623761 Merge #543
543: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: mondstern <mondstern@snopyta.org>
Co-authored-by: Rosdyana Kusuma <rosdyana.kusuma@gmail.com>
2021-10-27 06:58:40 +00:00
mondstern
cb3afe1878 Translated using Weblate (Croatian)
Currently translated at 27.4% (61 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hr/
2021-10-27 08:02:54 +02:00
mondstern
e3f4aec1c5 Translated using Weblate (Luxembourgish)
Currently translated at 51.8% (115 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lb/
2021-10-27 08:02:53 +02:00
Rosdyana Kusuma
d2f196da21 Translated using Weblate (Indonesian)
Currently translated at 98.6% (219 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2021-10-27 08:02:52 +02:00
mondstern
e491a960d7 Translated using Weblate (Icelandic)
Currently translated at 52.2% (116 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/is/
2021-10-27 08:02:52 +02:00
mondstern
f5c83793bf Translated using Weblate (Portuguese)
Currently translated at 33.3% (74 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2021-10-27 08:02:51 +02:00
Sylvia van Os
1624d56edb Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into feature/power_screen_widgets 2021-10-26 21:42:14 +02:00
bors[bot]
e334a5e454 Merge #538
538: Bump zxing-android-embedded from 4.2.0 to 4.3.0 r=TheLastProject a=dependabot[bot]

Bumps [zxing-android-embedded](https://github.com/journeyapps/zxing-android-embedded) from 4.2.0 to 4.3.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/journeyapps/zxing-android-embedded/releases">zxing-android-embedded's releases</a>.</em></p>
<blockquote>
<h2>v4.3.0</h2>
<ul>
<li>Minimum SDK version 19, but requires additional config (see readme) for &lt; 24 compatibility.</li>
<li>Add ScanOptions and ScanContract for use with <code>registerForActivityResult()</code>.</li>
<li>Deprecates IntentIntegrator. It is still available, but <code>registerForActivityResult()</code> is recommended instead.</li>
<li>Use minimal AndroidX libraries.</li>
<li>Use zxing:core 3.4.1 by default.</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/journeyapps/zxing-android-embedded/compare/v4.2.0...v4.3.0">https://github.com/journeyapps/zxing-android-embedded/compare/v4.2.0...v4.3.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/journeyapps/zxing-android-embedded/blob/master/CHANGES.md">zxing-android-embedded's changelog</a>.</em></p>
<blockquote>
<h3>4.3.0 (2021-10-25)</h3>
<ul>
<li>Minimum SDK version 19, but requires additional config (see readme) for &lt; 24 compatibility.</li>
<li>Add ScanOptions and ScanContract for use with <code>registerForActivityResult()</code>.</li>
<li>Deprecates IntentIntegrator.</li>
<li>Use minimal AndroidX libraries.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="24d02945fe"><code>24d0294</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/journeyapps/zxing-android-embedded/issues/665">#665</a> from journeyapps/fixes</li>
<li><a href="6ccf3a9d1a"><code>6ccf3a9</code></a> Fix lint report location.</li>
<li><a href="23f29e5a56"><code>23f29e5</code></a> Ignore lint error.</li>
<li><a href="1a8d949325"><code>1a8d949</code></a> Tweaks.</li>
<li><a href="f1554b7478"><code>f1554b7</code></a> Use GitHub Actions.</li>
<li><a href="cc12c103e0"><code>cc12c10</code></a> v4.3.0 and cleanup.</li>
<li><a href="a13ce2b161"><code>a13ce2b</code></a> Cleanup.</li>
<li><a href="0c97cf70cc"><code>0c97cf7</code></a> ScanOptions and ScanContract.</li>
<li><a href="9beeac7960"><code>9beeac7</code></a> minSdkVersion 19. Multidex and desugaring.</li>
<li><a href="cc34502f13"><code>cc34502</code></a> Smaller libs.</li>
<li>Additional commits viewable in <a href="https://github.com/journeyapps/zxing-android-embedded/compare/v4.2.0...v4.3.0">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-10-26 19:19:40 +00:00
bors[bot]
cbbd071f4f Merge #541
541: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: mondstern <mondstern@snopyta.org>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-10-26 18:39:49 +00:00
Sylvia van Os
524a6b1ffb Add hr to language selector 2021-10-26 20:38:38 +02:00
mondstern
7954adf7e3 Added translation using Weblate (Croatian) 2021-10-26 20:11:22 +02:00
Sylvia van Os
0b31a08b9f Really fix 2021-10-26 19:23:39 +02:00
Sylvia van Os
a0884aa81c Fix empty changelog check 2021-10-26 19:20:11 +02:00
Sylvia van Os
46f64d1a61 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-10-26 19:12:26 +02:00
Sylvia van Os
81cb6ad4fd Don't generate fastlane file if changelog entry is empty 2021-10-26 19:12:05 +02:00
dependabot[bot]
f2f330e3e4 Bump zxing-android-embedded from 4.2.0 to 4.3.0
Bumps [zxing-android-embedded](https://github.com/journeyapps/zxing-android-embedded) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/journeyapps/zxing-android-embedded/releases)
- [Changelog](https://github.com/journeyapps/zxing-android-embedded/blob/master/CHANGES.md)
- [Commits](https://github.com/journeyapps/zxing-android-embedded/compare/v4.2.0...v4.3.0)

---
updated-dependencies:
- dependency-name: com.journeyapps:zxing-android-embedded
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-26 02:16:29 +00:00
Sylvia van Os
5b14670785 Fix changelog 2021-10-26 00:06:52 +02:00
bors[bot]
c5f68aa50f Merge #535
535: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: mondstern <mondstern@snopyta.org>
2021-10-25 18:12:29 +00:00
mondstern
5203f89e9d Added translation using Weblate (Luxembourgish) 2021-10-25 20:09:59 +02:00
Sylvia van Os
8f11d73649 Merge pull request #534 from weblate/weblate-catima-catima
Translations update from Weblate
2021-10-25 20:00:17 +02:00
mondstern
3d376e2a90 Translated using Weblate (Icelandic)
Currently translated at 31.9% (71 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/is/
2021-10-25 19:53:19 +02:00
Sylvia van Os
0e814c3359 Merge pull request #531 from weblate/weblate-catima-catima
Translations update from Weblate
2021-10-25 17:56:26 +02:00
Oğuz Ersen
4755cc3f7f Translated using Weblate (Turkish)
Currently translated at 17.0% (15 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-10-25 17:55:10 +02:00
Sylvia van Os
7afbe41f95 Release Catima 2.8.0 2021-10-25 17:28:02 +02:00
Sylvia van Os
6d4cbee499 Merge pull request #529 from TheLastProject/create-pull-request/patch-1635175160
Update Fastlane changelogs
2021-10-25 17:20:22 +02:00
TheLastProject
f16a597b91 Update Fastlane changelogs 2021-10-25 15:19:19 +00:00
Sylvia van Os
3ba0649891 Add missing languages 2021-10-25 17:18:51 +02:00
Sylvia van Os
297ecc371e Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-10-25 17:14:57 +02:00
Sylvia van Os
79c8570507 Work around a race condition crash 2021-10-25 17:11:19 +02:00
Ronak Upadhyay
8f81d2d141 Fixes #516 Image scale according to text size (#517) 2021-10-24 22:26:41 +02:00
bors[bot]
325535af12 Merge #528
528: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Nyatsuki <Odamaki@yandex.ru>
2021-10-24 08:34:37 +00:00
Nyatsuki
f7af4169a3 Translated using Weblate (Japanese)
Currently translated at 98.6% (219 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-10-24 10:33:11 +02:00
bors[bot]
e5ec45f877 Merge #527
527: i18n: Add in-rID r=TheLastProject a=rosdyana

This PR adds localization strings for Bahasa Indonesia (in-rID) and adds the option to the locale menu.

Co-authored-by: Rosdyana Kusuma <rosdyana.kusuma@gmail.com>
2021-10-24 08:27:19 +00:00
bors[bot]
902a4e411b Merge #526
526: Update contributors r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-10-24 08:18:33 +00:00
Rosdyana Kusuma
03ec2b4492 Add localization for Bahasa Indonesia 2021-10-24 14:14:57 +08:00
TheLastProject
6a2f8a630a Update contributors 2021-10-24 05:15:59 +00:00
bors[bot]
78e998fad9 Merge #525
525: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: mondstern <mondstern@snopyta.org>
2021-10-23 22:06:40 +00:00
mondstern
e6ccef8ad0 Translated using Weblate (Icelandic)
Currently translated at 25.6% (57 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/is/
2021-10-24 00:04:22 +02:00
Oğuz Ersen
acbd614b50 Translated using Weblate (Turkish)
Currently translated at 17.0% (15 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-10-24 00:04:22 +02:00
bors[bot]
445e661fac Merge #523
523: i18n: Add zh-tw r=TheLastProject a=Still34

# Summary

This PR adds localization strings for Chinese (Taiwan) (`zh-TW`) and adds the option to the locale menu.

Co-authored-by: Still Hsu <dev@stillu.cc>
2021-10-23 21:59:30 +00:00
Still Hsu
d774231c05 Add zh-tw strings 2021-10-24 05:54:36 +08:00
bors[bot]
b5d2a5dbab Merge #522
522: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: mondstern <mondstern@snopyta.org>
2021-10-23 19:34:13 +00:00
mondstern
6ab61eb78a Added translation using Weblate (Icelandic) 2021-10-23 21:31:36 +02:00
bors[bot]
bbd8bb7d29 Merge #521
521: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-10-22 21:35:28 +00:00
TheLastProject
3e082b598f Update Fastlane changelogs 2021-10-22 21:34:15 +00:00
Sylvia van Os
70510ed9d1 Fix unit tests 2021-10-22 23:33:50 +02:00
Sylvia van Os
5da1c67dd6 Update CHANGELOG 2021-10-22 22:17:39 +02:00
Sylvia van Os
dfa237958e Fix several small sizing bugs 2021-10-22 22:17:13 +02:00
Ankit Tiwari
127d53e85a Save Size of code (#508) 2021-10-22 21:11:51 +02:00
bors[bot]
7cce782143 Merge #518
518: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: mondstern <mondstern@snopyta.org>
2021-10-21 20:51:42 +00:00
mondstern
662eb853d7 Translated using Weblate (Portuguese)
Currently translated at 23.8% (53 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2021-10-21 22:37:14 +02:00
mondstern
d8e58f8b38 Translated using Weblate (Esperanto)
Currently translated at 52.2% (116 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/eo/
2021-10-21 22:37:14 +02:00
mondstern
4748e24dda Translated using Weblate (Romanian)
Currently translated at 59.0% (131 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2021-10-21 22:37:13 +02:00
bors[bot]
5af024f482 Merge #515
515: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: mondstern <mondstern@snopyta.org>
2021-10-20 19:45:55 +00:00
mondstern
8adc013330 Added translation using Weblate (Portuguese) 2021-10-20 21:44:55 +02:00
bors[bot]
4edfe962ef Merge #514
514: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Petr Novák <nit.monkey@gmail.com>
Co-authored-by: IllusiveMan196 <hamsterrv@gmail.com>
Co-authored-by: mondstern <mondstern@snopyta.org>
2021-10-20 18:15:27 +00:00
mondstern
d80a71c852 Translated using Weblate (Danish)
Currently translated at 52.7% (117 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/da/
2021-10-20 20:07:38 +02:00
Petr Novák
299c9f2b4d Translated using Weblate (Czech)
Currently translated at 98.8% (87 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2021-10-20 20:07:37 +02:00
IllusiveMan196
03e3e45f07 Translated using Weblate (Ukrainian)
Currently translated at 3.4% (3 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2021-10-20 20:07:34 +02:00
IllusiveMan196
c35c316788 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-10-20 20:07:33 +02:00
Petr Novák
d68f0c60d4 Translated using Weblate (Czech)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2021-10-20 20:07:33 +02:00
waffshappen
5faa28a7e7 Replace AsyncTask with a Compatiblity Layer and further Compat Fixes (#511) 2021-10-20 19:47:06 +02:00
bors[bot]
2fffb89179 Merge #509
509: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Gediminas Murauskas <muziejusinfo@gmail.com>
Co-authored-by: 109247019824 <stoyan@gmx.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-10-19 16:02:41 +00:00
Oğuz Ersen
bd27ccd535 Translated using Weblate (Turkish)
Currently translated at 17.0% (15 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-10-19 15:39:49 +02:00
109247019824
3149234f5d Translated using Weblate (Bulgarian)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-10-19 15:39:48 +02:00
Gediminas Murauskas
dcf55c93a8 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-10-19 15:39:48 +02:00
bors[bot]
3f3394c1e9 Merge #507
507: feat/copyable-textview r=TheLastProject a=aditya3901

## Issue Fix
Fixes #389 
Made textviews copyable :)

Co-authored-by: aditya3901 <2020itb058.aditya@students.iiests.ac.in>
2021-10-18 16:06:10 +00:00
aditya3901
2b22dd4a1f feat/copyable-textview 2021-10-18 14:29:30 +05:30
Sylvia van Os
7f1b1484ac Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into feature/power_screen_widgets 2021-10-17 20:02:42 +02:00
bors[bot]
a70710ca6a Merge #504
504: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-10-17 17:09:24 +00:00
TheLastProject
cd3baf5bd9 Update Fastlane changelogs 2021-10-17 17:08:28 +00:00
Sylvia van Os
1138d6387e Update CHANGELOG 2021-10-17 19:08:08 +02:00
bors[bot]
b664fd391a Merge #503
503: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2021-10-17 15:51:25 +00:00
Oğuz Ersen
11cc65bae3 Translated using Weblate (Turkish)
Currently translated at 17.0% (15 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-10-17 17:41:02 +02:00
Oğuz Ersen
eaafa56503 Translated using Weblate (Turkish)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2021-10-17 17:41:02 +02:00
solokot
09c6d58639 Translated using Weblate (Russian)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-10-17 17:41:02 +02:00
Heimen Stoffels
1767a009a7 Translated using Weblate (Dutch)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-10-17 17:41:02 +02:00
Allan Nordhøy
a2e25512ec Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.5% (221 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2021-10-17 17:41:02 +02:00
J. Lavoie
824b931764 Translated using Weblate (Italian)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-10-17 17:41:02 +02:00
J. Lavoie
0cb75fd421 Translated using Weblate (French)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-10-17 17:41:02 +02:00
J. Lavoie
36f0d814f6 Translated using Weblate (German)
Currently translated at 100.0% (222 of 222 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-10-17 17:41:02 +02:00
bors[bot]
2aa0c46d30 Merge #502
502: Slovenian translations r=TheLastProject a=franga2000

Added some new strings and fixed a few obvious mistakes that I'm guessing came from machine translation

Co-authored-by: Miha Frangež <miha.frangez@gmail.com>
2021-10-17 15:35:00 +00:00
Miha Frangež
ff63dbfdaa Fixed bad machine translations 2021-10-17 17:16:44 +02:00
Miha Frangež
5cacdbd192 New Slovenian translations 2021-10-17 17:07:32 +02:00
Ankit Tiwari
c99bf206cc Dynamically size barcode based on their shape (square or rectangle) (#501) 2021-10-17 14:42:56 +02:00
bors[bot]
f546bb2681 Merge #500
500: Update contributors r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-10-17 08:56:26 +00:00
TheLastProject
bef750e047 Update contributors 2021-10-17 05:10:28 +00:00
bors[bot]
6998599377 Merge #499
499: Update Fastlane changelogs r=TheLastProject a=github-actions[bot]

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

Co-authored-by: TheLastProject <TheLastProject@users.noreply.github.com>
2021-10-16 15:23:34 +00:00
TheLastProject
11164f9a73 Update Fastlane changelogs 2021-10-16 15:21:38 +00:00
Sylvia van Os
b867795a08 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-10-16 17:21:18 +02:00
Sylvia van Os
9998205051 Update CHANGELOG 2021-10-16 17:21:05 +02:00
bors[bot]
7692f19ea6 Merge #494
494: Inter Related Code changes for exporting encrypted zip r=TheLastProject a=ankittiwari101

1. Created new method `multipleCardsExportImportPasswordProtected()` in ImportExportTest.java
2. Added 5th Parameter `char[] password` to exportData method of MultiFormater.java
3. From this new method passed password field to `importData` and `exportData` method calls.
4. In CatimaExporter.java added a password parameter to ZipOutputStream(output,password) if a non null char[] array of non zero length is received for password parameter and setEncryptFiles(true) using AES 256 Encryption(by default)"

Remaining - Dialogue Box for entering password.

Note - This is only a draft pull request, if everything here looks good, I'll work next on The Password Dialog which is the final piece in the puzzle.

Co-authored-by: Ankit Tiwari <ankitr.tiwari@gmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-10-16 15:13:11 +00:00
Sylvia van Os
d8361cc288 String improvements 2021-10-16 16:49:47 +02:00
bors[bot]
93d0724c60 Merge #498
498: Translations update from Weblate r=TheLastProject a=weblate

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



Current translation status:

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


Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-10-16 14:43:46 +00:00
Sylvia van Os
2c03f193f0 Translated using Weblate (Norwegian Bokmål)
Currently translated at 19.3% (17 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2021-10-16 16:40:17 +02:00
Ankit Tiwari
7028a1f4ca Changes to AlertDialog for entering password 2021-10-16 20:04:24 +05:30
Ankit Tiwari
32d62dd9ba Requested Modifications Made. 2021-10-16 01:34:44 +05:30
Ankit Tiwari
401fc98b4d Passing password to ZipInputStream constructor in importData method of CatimaImporter.java 2021-10-16 00:15:32 +05:30
Ankit Tiwari
993589427b Changed password parameter to a char[] instead of null in ImportExportTest.java line 613 2021-10-15 23:10:38 +05:30
Ankit Tiwari
2390568bdf Added Encrypted Backup feature.The Zip File is Password Protected, which is asked from the user at the time of export immediately on click of Export Button. 2021-10-15 22:51:52 +05:30
Allan Nordhøy
50ccf6da46 Translated using Weblate (Norwegian Bokmål)
Currently translated at 19.3% (17 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2021-10-15 15:45:28 +02:00
Ankit Tiwari
44066e6599 Extracted zip parameter logic into a new function and used it on imageZipParameters as well 2021-10-15 00:22:51 +05:30
Ankit Tiwari
fc9c616869 1.Created new method multipleCardsExportImportPasswordProtected() in ImportExportTest.java \n 2.Added 5th Paramete 2021-10-14 23:23:01 +05:30
bors[bot]
f09f35e44b Merge #493
493: Delete merged branch r=TheLastProject a=TheLastProject



Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-10-14 17:45:05 +00:00
Sylvia van Os
f81fb0c673 Delete merged branch 2021-10-14 19:44:36 +02:00
bors[bot]
b0b4e80da4 Merge #492
492: Setup bors r=TheLastProject a=TheLastProject



Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2021-10-14 17:37:40 +00:00
Sylvia van Os
923982e449 Don't override author info 2021-10-14 19:37:03 +02:00
Sylvia van Os
d05c97946d Setup bors 2021-10-14 19:07:24 +02:00
Sylvia van Os
504a1fd01b Prepare for Bors 2021-10-14 18:37:46 +02:00
Sylvia van Os
5efacec417 Merge pull request #491 from weblate/weblate-catima-catima
Translations update from Weblate
2021-10-13 20:03:00 +02:00
Oğuz Ersen
595d10fc44 Translated using Weblate (Turkish)
Currently translated at 17.0% (15 of 88 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-10-13 19:55:32 +02:00
Sylvia van Os
2128f0a601 Merge pull request #490 from TheLastProject/create-pull-request/patch-1634144237
Update Fastlane changelogs
2021-10-13 19:07:15 +02:00
TheLastProject
0b0a45da05 Update Fastlane changelogs 2021-10-13 16:57:17 +00:00
Sylvia van Os
94fb4b4411 Update CHANGELOG 2021-10-13 18:56:54 +02:00
Sylvia van Os
fc7932d3bf Merge pull request #489 from ankittiwari101/fix-sliding-bug
Fixed Sliding Bug in MainActivity.java
2021-10-13 18:54:59 +02:00
Ankit Tiwari
97a5311593 Fixed Bug where an Empty List (consisting of only a single textview) within the Tab would not swipe left or right 2021-10-13 16:55:05 +05:30
Sylvia van Os
c7db676b2b Add IzzyOnDroid badge 2021-10-12 17:31:51 +02:00
Sylvia van Os
f8c8b3b2e6 Merge pull request #487 from TheLastProject/dependabot/gradle/com.android.tools.build-gradle-7.0.3
Bump gradle from 7.0.2 to 7.0.3
2021-10-12 17:23:04 +02:00
dependabot[bot]
df4cb5b189 Bump gradle from 7.0.2 to 7.0.3
Bumps gradle from 7.0.2 to 7.0.3.

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-12 02:21:39 +00:00
Sylvia van Os
d2b2a53109 Merge pull request #485 from TacoTheDank/materialCardview
Use MaterialCardView
2021-10-11 21:27:30 +02:00
Sylvia van Os
5107f88998 Merge pull request #483 from TheLastProject/dependabot/gradle/gradle.plugin.com.github.spotbugs.snom-spotbugs-gradle-plugin-4.7.5
Bump spotbugs-gradle-plugin from 4.7.0 to 4.7.5
2021-10-11 21:25:48 +02:00
dependabot[bot]
78f2e1698f Bump spotbugs-gradle-plugin from 4.7.0 to 4.7.5
Bumps spotbugs-gradle-plugin from 4.7.0 to 4.7.5.

---
updated-dependencies:
- dependency-name: gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-11 19:20:03 +00:00
Sylvia van Os
6887cd098b Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-10-11 21:19:15 +02:00
Sylvia van Os
0881d745f5 Fix more spotbugs EI_EXPOSE_REP2 2021-10-11 21:18:22 +02:00
Sylvia van Os
94b3a07f90 Merge pull request #484 from weblate/weblate-catima-catima
Translations update from Weblate
2021-10-11 20:42:40 +02:00
Joel A
dc280b4023 Translated using Weblate (Swedish)
Currently translated at 2.2% (2 of 87 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sv/
2021-10-11 20:22:20 +02:00
Joel A
edce6d6cd3 Translated using Weblate (Swedish)
Currently translated at 99.0% (218 of 220 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2021-10-11 20:22:20 +02:00
solokot
23dc47a5b9 Translated using Weblate (Russian)
Currently translated at 100.0% (220 of 220 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-10-11 20:22:20 +02:00
Sylvia van Os
683b4f46d9 Fix spotbugs EI_EXPOSE_REP2 2021-10-11 20:22:06 +02:00
Sylvia van Os
ac021bce2a Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-10-11 19:58:26 +02:00
Sylvia van Os
b0c34cbca0 Fix spotbugs RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE 2021-10-11 19:58:09 +02:00
TacoTheDank
4a0c8270ef Replace CardView with MaterialCardView 2021-10-10 22:34:53 -04:00
TacoTheDank
793f1e2f87 Remove unneeded MultiDex 2021-10-10 22:34:40 -04:00
avikkundu
0101b6fa25 added translation in bengali (#480) 2021-10-10 17:04:49 +02:00
Sylvia van Os
47dff850fb Merge pull request #479 from weblate/weblate-catima-catima
Translations update from Weblate
2021-10-10 12:33:11 +02:00
Oğuz Ersen
fe7503c3ac Translated using Weblate (Turkish)
Currently translated at 16.0% (14 of 87 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2021-10-10 12:31:11 +02:00
Petr Novák
5df7d8a530 Translated using Weblate (Czech)
Currently translated at 98.8% (86 of 87 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2021-10-10 12:31:10 +02:00
Sylvia van Os
ee129a3373 Merge pull request #478 from TheLastProject/create-pull-request/patch-1633842920
Update contributors
2021-10-10 08:17:10 +02:00
TheLastProject
b979b1fc86 Update contributors 2021-10-10 05:15:20 +00:00
Sylvia van Os
361ebb8b80 Merge pull request #476 from TheLastProject/create-pull-request/patch-1633819619
Update Fastlane changelogs
2021-10-10 00:49:36 +02:00
TheLastProject
fd49466e0d Update Fastlane changelogs 2021-10-09 22:46:59 +00:00
Sylvia van Os
bf8f00f877 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-10-10 00:46:33 +02:00
Sylvia van Os
9f0b7604cb Fix botched migration and release 2.7.3 2021-10-10 00:46:20 +02:00
Sylvia van Os
6d151e7377 Merge pull request #474 from TheLastProject/create-pull-request/patch-1633816331
Update Fastlane changelogs
2021-10-10 00:02:54 +02:00
TheLastProject
6ecc94526e Update Fastlane changelogs 2021-10-09 21:52:10 +00:00
/usr/local/ΕΨΗΕΛΩΝ
ab1e6eed0c Cards on power screen 2021-10-06 15:07:06 +02:00
/usr/local/ΕΨΗΕΛΩΝ
ba5cf81bb4 Upgrade Java version to 11
Required to use java.util.concurrent.Flow
Could opt for Java 9, but 11 is LTS
2021-10-06 14:40:02 +02:00
1582 changed files with 25276 additions and 11199 deletions

View File

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

View File

@@ -2,7 +2,7 @@ name: 'Close issues and PRs needing info for too long'
on:
schedule:
- cron: '30 1 * * *'
permissions:
issues: write
pull-requests: write
@@ -17,7 +17,8 @@ jobs:
days-before-close: 90
close-issue-message: 'This issue is missing necessary information and cannot be worked on in its current state. It has therefore been closed to keep the issue tracker clean. If you have more information, feel free to reopen it.'
close-pr-message: 'This PR is missing necessary information and cannot be merged in its current state. It has therefore been closed to keep the issue tracker clean. If you have more information, feel free to reopen it.'
only-labels: 'needs info'
stale-issue-label: 'needs info'
stale-pr-label: 'needs info'
only-labels: 'state: needs info'
stale-issue-label: 'state: needs info'
stale-pr-label: 'state: needs info'
remove-stale-when-updated: false
enable-statistics: true

View File

@@ -1,8 +1,8 @@
name: Compress Images on Push to Master
name: Compress Images on Push to Main
on:
push:
branches:
- master
- main
paths:
- '**.jpg'
- '**.jpeg'

View File

@@ -1,7 +1,8 @@
name: Convert CHANGELOG to Fastlane
on:
push:
branches: [ master ]
branches:
- main
jobs:
convert_changelog_to_fastlane:

View File

@@ -1,71 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '33 1 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'java' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@@ -6,7 +6,7 @@ on:
jobs:
contributors_to_file:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master'
if: github.ref == 'refs/heads/main'
name: Write contributors to file
steps:
- name: Checkout repo

View File

@@ -0,0 +1,10 @@
name: "Validate Gradle Wrapper"
on: [push, pull_request]
jobs:
validation:
name: "Validation"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: gradle/wrapper-validation-action@v1

5
.gitignore vendored
View File

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

View File

@@ -24,5 +24,10 @@ with open('CHANGELOG.md') as changelog:
text.append(re.sub(r'\[(.*?)\]\((.*?)\)', r'\1 (\2)', line))
for version, description in changelogs.items():
description = "".join(description).strip()
if not description:
continue
with open(os.path.join("fastlane", "metadata", "android", "en-US", "changelogs", f"{version}.txt"), "w") as fastlane_file:
fastlane_file.write("".join(description).strip())
fastlane_file.write(description)

View File

@@ -1,5 +1,190 @@
# Changelog
## v2.23.2 - 122
- Long-press card icon in view activity to change it
- Improve button styling in Groups screen
- Fix long barcode values causing barcode to scale down to nothing
## v2.23.1 - 121
- Update used libraries
## v2.23.0 - 120
- Complete redesign of main and loyalty card view screens
- Material You design for the settings screen
- Fix crash when using "Take a photo" with disabled camera app
## 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
- Remove unnecessary permissions
- Target Android 13
## v2.21.1 - 116
- Fix quick spend dialog not allowing , separator
- Support loading image from file manager
## v2.21.0 - 115
- Open image in gallery on long-press
- Apply Material style to dialogs
- Support creating card by sharing an image to Catima
- Add quick spend button to card screen
## v2.20.0 - 114
- Add Monochrome icon for Android 13
- Improve first launch screen
- Fidme import fixes
## v2.19.0 - 113
- Add previous and next buttons to the loyalty card view
- Fix foreground colour on edit button
- Replace floppy disk save icon with checkmark
## v2.18.2 - 112
- Make the possibility to set a custom header more visible
## v2.18.1 - 111
- Arabic language support
- Display archived card count in group overview
- Fix balance parsing bugs (made cards not savable in Arabic and other language with non-Western numbers)
- Fix custom theme not applying to main screen correctly
- Improve display of selected cards
- Fix crash when leaving cardview in RTL layouts for cards with expiry or balance
- Fix back arrow in card view pointing the wrong way in RTL layouts
## v2.17.1 - 109
- Fix incorrect text colour on "No barcode" button
## v2.17.0 - 108
- Add card duplication feature
- Don't allow choosing expiry before 1970 (they never worked anyway)
- Add support for archiving cards
- Move delete from edit to view
- Remove rotation lock icon in favour of a new rotation lock setting
## v2.16.3 - 107 (2022-04-15)
- Stocard import fixes
## v2.16.2 - 106 (2022-03-31)
- Fix some character sequences being shown as a single character
## v2.16.1 - 105 (2022-03-25)
- Fix gray block appearing on invalid value for barcode
- Stocard import fixes
## v2.16.0 - 104 (2022-03-09)
- Save card detail expansion state
- Minor UI fixes
## v2.15.2 - 103 (2022-02-11)
- Fix manual language selection not applying everywhere
- Fix crash in edit view on regionless locale
## v2.15.1 - 102 (2022-02-10)
- Various minor fixes
- Fix crash when using Norwegian translation
## v2.15.0 - 101 (2022-02-06)
- Fix cropper not using theme colour
- Fix minor theming issues
- Add pure black dark theme for OLED screens
## v2.14.1 - 100 (2022-01-15)
- Hide search, expand and sort icons until there is at least 1 card
- Various theming fixes
## v2.14.0 - 99 (2022-01-14)
- Material You redesign
## v2.13.1 - 98 (2022-01-09)
- Fix various TalkBack-related bugs
## v2.13.0 - 97 (2022-01-03)
- Fixed pressing the save button multiple times creating multiple entries
- Lower card header size when hiding details to fit even more cards
- Restructure edit screen
- Improve star icon contrast in main view
## v2.12.0 - 96 (2021-12-23)
- Add CODE 93 support
- Various minor bugfixes and improvements
## v2.11.2 - 95 (2021-12-04)
- Fix crash on sharing card
## v2.11.1 - 94 (2021-11-30)
- Fix blurriness of main screen letter icons
- Fix icons sometimes disappearing after selection
- Fix status bar icons possibly being invisible on Android 5
## v2.11.0 - 93 (2021-11-28)
- Add Catima to [Quick Access Device Controls](https://developer.android.com/guide/topics/ui/device-control)
- Fix some groups not showing up correctly in group management screen
## v2.10.0 - 92 (2021-11-20)
- New main screen layout
- Fix bottomsheet sizing issues when switching in and out of fullscreen
## v2.9.0 - 91 (2021-11-14)
- Improved group management support
- Support cropping images
- Fix image data loss when saving after rotating in edit view
- Ability to set a custom image as card icon
## v2.8.1 - 90 (2021-10-27)
- Fix dots in card view having the wrong colour when changing theme manually
- Fix crash in card view on rotation/theme change
- Fix flashing of cards list
- Fix text overlaying star icon
## v2.8.0 - 89 (2021-10-25)
- Fix swiping between groups not working on an empty group
- Allow password-protecting exports
- Improve usage of space for QR codes
- Save the last used zoom level per card
- Fix a crash when swiping right after a tap
## v2.7.3 - 88 (2021-10-10)
- Fix incorrect migration making first card become invisible
## v2.7.2 - 87 (2021-10-09)
- Fix regression breaking import/export
@@ -449,7 +634,7 @@ Additional features/improvements:
## v0.7 - 7 (2016-07-14)
- Long-click of a card brings up option to copy card ID to the clipboard. ([pull #49](https://github.com/brarcher/loyalty-card-locker/issues/49))
- 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)

View File

@@ -8,7 +8,20 @@ to the rules described here, but by following the instructions below you
should have a much easier time getting your work merged with the upstream
project.
## Test Your Code
## Translation Changes
Translation changes are managed through [Weblate](https://hosted.weblate.org/projects/catima/).
Please do not supply translation updates directly through GitHub.
Weblate requires an account to translate changes, so please log in before
you start translating.
While using Weblate, please do not ignore any of its warnings. They exist
for good reason.
## Code Changes
### Test Your Code
There are four possible tests you can run to verify your code. The first
is unit tests, which check the basic functionality of the application, and
@@ -28,14 +41,14 @@ and SpotBugs, run using:
The final check is by testing the application on a live device and verifying
the basic functionality works as expected.
## Make Sure Your Code is Tested
### Make Sure Your Code is Tested
The Catima code uses a fair number of unit tests to verify that
the basic functionality is working. Submissions which add functionality
or significantly change the existing code should include additional tests
to verify the proper operation of the proposed changes.
## Explain Your Work
### Explain Your Work
At the top of every patch you should include a description of the problem you
are trying to solve, how you solved it, and why you chose the solution you
@@ -44,7 +57,7 @@ if you can describe/include a reproducer for the problem in the description as
well as instructions on how to test for the bug and verify that it has been
fixed.
## Sign Your Work
### Sign Your Work
The sign-off is a simple line at the end of the patch description, which
certifies that you wrote it or otherwise have the right to pass it on as an
@@ -82,10 +95,10 @@ your real name, saying:
Signed-off-by: Random J Developer <random@developer.example.org>
## Submit Patch(es) for Review
### Submit Patch(es) for Review
Finally, you will need to submit your patches so that they can be reviewed
and potentially merged into the main Catima repository. The preferred
way to do this is to submit a Pull Request to the Catima project.
Changes need to apply cleanly onto the master branch and pass all
Changes need to apply cleanly onto the main branch and pass all
unit tests and produce no errors during static analysis.

3
FUNDING.yml Normal file
View File

@@ -0,0 +1,3 @@
github: TheLastProject
custom:
- "https://paypal.me/sylviavanos"

View File

@@ -1,29 +1,30 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.3)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
CFPropertyList (3.0.6)
rexml
addressable (2.8.4)
public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.501.0)
aws-sdk-core (3.121.0)
aws-partitions (1.771.0)
aws-sdk-core (3.173.1)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.64.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
aws-sdk-kms (1.48.0)
aws-sdk-core (~> 3, >= 3.120.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.102.0)
aws-sdk-core (~> 3, >= 3.120.0)
aws-sdk-s3 (1.122.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.4.0)
aws-sigv4 (1.5.2)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.0.3)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
@@ -33,19 +34,20 @@ GEM
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6)
emoji_regex (3.2.2)
excon (0.85.0)
faraday (1.7.2)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.99.0)
faraday (1.10.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0.1)
faraday-httpclient (~> 1.0)
faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.1)
faraday-net_http_persistent (~> 1.0)
faraday-patron (~> 1.0)
faraday-rack (~> 1.0)
multipart-post (>= 1.2, < 3)
faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.7)
faraday (>= 0.8.0)
@@ -54,14 +56,17 @@ GEM
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.0.4)
multipart-post (~> 2)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday_middleware (1.1.0)
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.5)
fastlane (2.193.1)
fastimage (2.2.7)
fastlane (2.213.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -85,7 +90,7 @@ GEM
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (~> 2.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (~> 0.1.1)
plist (>= 3.1.0, < 4.0.0)
@@ -101,9 +106,9 @@ GEM
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.11.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-core (0.4.1)
google-apis-androidpublisher_v3 (0.42.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.0)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
@@ -112,53 +117,53 @@ GEM
retriable (>= 2.0, < 4.a)
rexml
webrick
google-apis-iamcredentials_v1 (0.7.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-playcustomapp_v1 (0.5.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-storage_v1 (0.6.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.9.0, < 2.a)
google-cloud-core (1.6.0)
google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0)
google-cloud-env (1.5.0)
faraday (>= 0.17.3, < 2.0)
google-cloud-errors (1.1.0)
google-cloud-storage (1.34.1)
addressable (~> 2.5)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.1)
google-cloud-storage (1.44.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.19.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (0.17.1)
faraday (>= 0.17.3, < 2.0)
googleauth (1.5.2)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (~> 0.15)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.4)
http-cookie (1.0.5)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.4.0)
json (2.5.1)
jwt (2.2.3)
jmespath (1.6.2)
json (2.6.3)
jwt (2.7.0)
memoist (0.16.2)
mini_magick (4.11.0)
mini_mime (1.1.1)
mini_magick (4.12.0)
mini_mime (1.1.2)
multi_json (1.15.0)
multipart-post (2.0.0)
multipart-post (2.3.0)
nanaimo (0.3.0)
naturally (2.2.1)
optparse (0.1.1)
os (1.1.1)
plist (3.6.0)
public_suffix (4.0.6)
os (1.1.4)
plist (3.7.0)
public_suffix (5.0.1)
rake (13.0.6)
representable (3.1.1)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
@@ -168,18 +173,18 @@ GEM
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
security (0.1.3)
signet (0.16.0)
signet (0.17.0)
addressable (~> 2.8)
faraday (>= 0.17.3, < 2.0)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.8)
simctl (1.6.10)
CFPropertyList
naturally
terminal-notifier (2.0.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
trailblazer-option (0.1.1)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.1)
tty-spinner (0.9.3)
@@ -187,11 +192,11 @@ GEM
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8)
unicode-display_width (1.7.0)
webrick (1.7.0)
unf_ext (0.0.8.2)
unicode-display_width (1.8.0)
webrick (1.8.1)
word_wrap (1.0.0)
xcodeproj (1.21.0)
xcodeproj (1.22.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
@@ -210,4 +215,4 @@ DEPENDENCIES
fastlane
BUNDLED WITH
2.1.4
2.3.26

View File

@@ -1,7 +1,9 @@
import com.github.spotbugs.snom.SpotBugsTask
apply plugin: 'com.android.application'
apply plugin: 'com.github.spotbugs'
plugins {
id 'com.android.application'
id 'com.github.spotbugs'
}
spotbugs {
ignoreFailures = false
@@ -11,15 +13,14 @@ spotbugs {
}
android {
compileSdkVersion 31
buildToolsVersion "31.0.0"
compileSdk 33
defaultConfig {
applicationId "me.hackerchick.catima"
minSdkVersion 21
targetSdkVersion 31
versionCode 87
versionName "2.7.2"
minSdk 21
targetSdk 33
versionCode 122
versionName "2.23.2"
vectorDrawables.useSupportLibrary true
multiDexEnabled true
@@ -37,6 +38,10 @@ android {
}
}
buildFeatures {
viewBinding true
}
bundle {
language {
enableSplit = false
@@ -49,14 +54,10 @@ android {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
lintOptions {
disable "GoogleAppIndexingWarning", "ButtonStyle", "AlwaysShowAction",
"MissingTranslation", "MissingPrefix"
}
sourceSets {
test {
@@ -76,37 +77,40 @@ android {
includeAndroidResources true
}
}
lint {
lintConfig file('lint.xml')
}
namespace 'protect.card_locker'
}
dependencies {
// AndroidX
implementation "androidx.multidex:multidex:2.0.1"
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'androidx.exifinterface:exifinterface:1.3.3'
implementation 'androidx.preference:preference:1.1.1'
implementation 'com.google.android.material:material:1.4.0'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.exifinterface:exifinterface:1.3.6'
implementation 'androidx.palette:palette:1.0.0'
implementation 'androidx.preference:preference:1.2.0'
implementation 'com.google.android.material:material:1.9.0'
implementation 'com.github.yalantis:ucrop:2.2.8'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
// Splash Screen
implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
implementation 'androidx.core:core-splashscreen:1.0.1'
// Third-party
implementation 'com.journeyapps:zxing-android-embedded:4.2.0@aar'
implementation 'com.google.zxing:core:3.4.1'
implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar'
implementation 'com.google.zxing:core:3.5.1'
implementation 'org.apache.commons:commons-csv:1.9.0'
implementation 'com.jaredrummler:colorpicker:1.1.0'
implementation 'com.github.invissvenska:NumberPickerPreference:1.0.3'
implementation 'net.lingala.zip4j:zip4j:2.9.0'
implementation 'net.lingala.zip4j:zip4j:2.11.5'
// SpotBugs
implementation 'io.wcm.tooling.spotbugs:io.wcm.tooling.spotbugs.annotations:1.0.0'
// Testing
testImplementation 'androidx.test:core:1.4.0'
testImplementation 'androidx.test:core:1.5.0'
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.robolectric:robolectric:4.6.1'
testImplementation 'org.robolectric:robolectric:4.10.3'
}
tasks.withType(SpotBugsTask) {

View File

@@ -6,5 +6,8 @@
<Match>
<Class name="~.*Manifest\$.*"/>
</Match>
<Match>
<Class name="~.*Binding" />
</Match>
</FindBugsFilter>

8
app/lint.xml Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="AlwaysShowAction" severity="ignore" />
<issue id="ButtonStyle" severity="ignore" />
<issue id="GoogleAppIndexingWarning" severity="ignore" />
<issue id="MissingTranslation" severity="ignore" />
<issue id="MissingPrefix" severity="ignore" />
</lint>

View File

@@ -1,14 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="protect.card_locker"
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">
<uses-permission
android:name="android.permission.CAMERA"/>
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="23" />
<uses-feature
android:name="android.hardware.camera"
@@ -17,8 +14,6 @@
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android"/>
<application
android:name=".LoyaltyCardLockerApplication"
android:allowBackup="true"
@@ -27,98 +22,153 @@
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name="protect.card_locker.MainActivity"
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.App.Starting"
android:exported="true">
android:theme="@style/Theme.App.Starting">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
<activity
android:name=".AboutActivity"
android:label="@string/about"
android:theme="@style/AppTheme.NoActionBar">
</activity>
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".ManageGroupsActivity"
android:label="@string/groups"
android:theme="@style/AppTheme.NoActionBar">
</activity>
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".ManageGroupActivity"
android:label="@string/group_edit"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".LoyaltyCardViewActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden"
android:exported="true"/>
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".LoyaltyCardEditActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden"
android:exported="true">
<intent-filter android:autoVerify="true" android:label="@string/app_name">
android:windowSoftInputMode="stateHidden">
<intent-filter
android:autoVerify="true"
android:label="@string/app_name">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Main card sharing URIs -->
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="@string/intent_import_card_from_url_host_catima_app"
<data
android:host="@string/intent_import_card_from_url_host_catima_app"
android:pathPrefix="@string/intent_import_card_from_url_path_prefix_catima_app" />
</intent-filter>
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Old card sharing URIs -->
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="@string/intent_import_card_from_url_host_thelastproject"
<data
android:host="@string/intent_import_card_from_url_host_thelastproject"
android:pathPrefix="@string/intent_import_card_from_url_path_prefix_thelastproject" />
<data android:host="@string/intent_import_card_from_url_host_brarcher"
<data
android:host="@string/intent_import_card_from_url_host_brarcher"
android:pathPrefix="@string/intent_import_card_from_url_path_prefix_brarcher" />
</intent-filter>
</activity>
<activity
android:name=".ScanActivity"
android:label="@string/scanCardBarcode"
android:theme="@style/AppTheme.NoActionBar"/>
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".BarcodeSelectorActivity"
android:label="@string/selectBarcodeTitle"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden"/>
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".preferences.SettingsActivity"
android:label="@string/settings"
android:theme="@style/AppTheme.NoActionBar"/>
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".ImportExportActivity"
android:label="@string/importExport"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".CardShortcutConfigure"
android:label="@string/cardShortcut"
android:theme="@style/AppTheme.NoActionBar"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT"/>
<category android:name="android.intent.category.DEFAULT"/>
android:exported="true"
android:theme="@style/AppTheme.NoActionBar">
<!-- ZIP Intent Filter -->
<intent-filter
android:label="@string/importCards">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/zip" />
<data android:scheme="content"/>
<data android:host="*"/>
</intent-filter>
<!-- JSON Intent Filter -->
<intent-filter
android:label="@string/importCards">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/json" />
<data android:scheme="content"/>
<data android:host="*"/>
</intent-filter>
<!-- CSV Intent Filter -->
<intent-filter
android:label="@string/importCards">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content"/>
<data android:host="*" />
<data android:mimeType="text/comma-separated-values" />
</intent-filter>
</activity>
<activity
android:name=".CardShortcutConfigure"
android:exported="true"
android:label="@string/cardShortcut"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".UCropWrapper"
android:theme="@style/AppTheme.NoActionBar" />
<provider
android:name="androidx.core.content.FileProvider"
android:grantUriPermissions="true"
android:authorities="${applicationId}"
android:exported="false"
android:authorities="${applicationId}">
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths"/>
android:resource="@xml/file_provider_paths" />
</provider>
<service android:name=".CardsOnPowerScreenService" android:label="@string/app_name"
android:permission="android.permission.BIND_CONTROLS" android:exported="true">
<intent-filter>
<action android:name="android.service.controls.ControlsProviderService" />
</intent-filter>
</service>
</application>
</manifest>
</manifest>

View File

@@ -1,146 +1,57 @@
package protect.card_locker;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.text.HtmlCompat;
public class AboutActivity extends CatimaAppCompatActivity implements View.OnClickListener
{
import protect.card_locker.databinding.AboutActivityBinding;
public class AboutActivity extends CatimaAppCompatActivity {
private static final String TAG = "Catima";
ConstraintLayout version_history, translate, license, repo, privacy, error, credits, rate;
private AboutActivityBinding binding;
private AboutContent content;
@Override
protected void onCreate(Bundle savedInstanceState)
{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.about);
setContentView(R.layout.about_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
binding = AboutActivityBinding.inflate(getLayoutInflater());
content = new AboutContent(this);
setTitle(content.getPageTitle());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
enableToolbarBackButton();
StringBuilder contributors = new StringBuilder().append("<br/>");
TextView copyright = binding.creditsSub;
copyright.setText(content.getCopyright());
TextView versionHistory = binding.versionHistorySub;
versionHistory.setText(content.getVersionHistory());
BufferedReader reader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.contributors), StandardCharsets.UTF_8));
binding.versionHistory.setTag("https://catima.app/changelog/");
binding.translate.setTag("https://hosted.weblate.org/engage/catima/");
binding.license.setTag("https://github.com/CatimaLoyalty/Android/blob/main/LICENSE");
binding.repo.setTag("https://github.com/CatimaLoyalty/Android/");
binding.privacy.setTag("https://catima.app/privacy-policy/");
binding.reportError.setTag("https://github.com/CatimaLoyalty/Android/issues");
binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima");
binding.donate.setTag("https://catima.app/contribute/#donating");
try {
while (true) {
String tmp = reader.readLine();
boolean installedFromGooglePlay = Utils.installedFromGooglePlay(this);
// Hide Google Play rate button if not on Google Play
binding.rate.setVisibility(installedFromGooglePlay ? View.VISIBLE : View.GONE);
// Hide donate button on Google Play (Google Play doesn't allow donation links)
binding.donate.setVisibility(installedFromGooglePlay ? View.GONE : View.VISIBLE);
if (tmp == null || tmp.isEmpty()) {
reader.close();
break;
}
contributors.append("<br/>");
contributors.append(tmp);
}
} catch (IOException ignored) {}
final List<ThirdPartyInfo> USED_LIBRARIES = new ArrayList<>();
USED_LIBRARIES.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Zip4j", "https://github.com/srikanth-lingala/zip4j", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("ZXing", "https://github.com/zxing/zxing", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded", "Apache 2.0"));
final List<ThirdPartyInfo> USED_ASSETS = new ArrayList<>();
USED_ASSETS.add(new ThirdPartyInfo("Android icons", "https://fonts.google.com/icons?selected=Material+Icons", "Apache 2.0"));
StringBuilder libs = new StringBuilder().append("<br/>");
for (ThirdPartyInfo entry : USED_LIBRARIES)
{
libs.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")");
}
StringBuilder resources = new StringBuilder().append("<br/>");
for (ThirdPartyInfo entry : USED_ASSETS)
{
resources.append("<br/><a href=\"").append(entry.url()).append("\">").append(entry.name()).append("</a> (").append(entry.license()).append(")");
}
String appName = getString(R.string.app_name);
int year = Calendar.getInstance().get(Calendar.YEAR);
String version = "?";
try
{
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
version = pi.versionName;
}
catch (PackageManager.NameNotFoundException e)
{
Log.w(TAG, "Package name not found", e);
}
TextView copyright = findViewById(R.id.credits_sub);
copyright.setText(String.format(getString(R.string.app_copyright_fmt), year));
TextView vHistory = findViewById(R.id.version_history_sub);
vHistory.setText(String.format(getString(R.string.debug_version_fmt), version));
setTitle(String.format(getString(R.string.about_title_fmt), appName));
version_history = findViewById(R.id.version_history);
translate = findViewById(R.id.translate);
license = findViewById(R.id.license);
repo = findViewById(R.id.repo);
privacy = findViewById(R.id.privacy);
error = findViewById(R.id.report_error);
credits = findViewById(R.id.credits);
rate = findViewById(R.id.rate);
version_history.setOnClickListener(this);
translate.setOnClickListener(this);
license.setOnClickListener(this);
repo.setOnClickListener(this);
privacy.setOnClickListener(this);
error.setOnClickListener(this);
rate.setOnClickListener(this);
StringBuilder contributorInfo = new StringBuilder();
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_contributors), contributors.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
contributorInfo.append("\n\n");
contributorInfo.append(getString(R.string.app_copyright_old));
contributorInfo.append("\n\n");
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_libraries), libs.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
contributorInfo.append("\n\n");
contributorInfo.append(HtmlCompat.fromHtml(String.format(getString(R.string.app_resources), resources.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
credits.setOnClickListener(view -> new AlertDialog.Builder(this)
.setTitle(R.string.credits)
.setMessage(contributorInfo.toString())
.setPositiveButton(R.string.ok, (dialogInterface, i) -> {})
.show());
bindClickListeners();
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
@@ -149,31 +60,50 @@ public class AboutActivity extends CatimaAppCompatActivity implements View.OnCli
}
@Override
public void onClick(View view) {
int id = view.getId();
String url;
if (id == R.id.version_history) {
url = "https://catima.app/changelog/";
} else if (id == R.id.translate) {
url = "https://hosted.weblate.org/engage/catima/";
} else if (id == R.id.license) {
url = "https://github.com/TheLastProject/Catima/blob/master/LICENSE";
} else if (id == R.id.repo) {
url = "https://github.com/TheLastProject/Catima/";
} else if (id == R.id.privacy) {
url = "https://catima.app/privacy-policy/";
} else if (id == R.id.report_error) {
url = "https://github.com/TheLastProject/Catima/issues";
} else if (id == R.id.rate) {
url = "https://play.google.com/store/apps/details?id=me.hackerchick.catima";
} else {
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
protected void onDestroy() {
super.onDestroy();
content.destroy();
clearClickListeners();
binding = null;
}
private void bindClickListeners() {
View.OnClickListener openExternalBrowser = view -> {
Object tag = view.getTag();
if (tag instanceof String && ((String) tag).startsWith("https://")) {
(new OpenWebLinkHandler()).openBrowser(this, (String) tag);
}
};
binding.versionHistory.setOnClickListener(openExternalBrowser);
binding.translate.setOnClickListener(openExternalBrowser);
binding.license.setOnClickListener(openExternalBrowser);
binding.repo.setOnClickListener(openExternalBrowser);
binding.privacy.setOnClickListener(openExternalBrowser);
binding.reportError.setOnClickListener(openExternalBrowser);
binding.rate.setOnClickListener(openExternalBrowser);
binding.donate.setOnClickListener(openExternalBrowser);
binding.credits.setOnClickListener(view -> showCredits());
}
private void clearClickListeners() {
binding.versionHistory.setOnClickListener(null);
binding.translate.setOnClickListener(null);
binding.license.setOnClickListener(null);
binding.repo.setOnClickListener(null);
binding.privacy.setOnClickListener(null);
binding.reportError.setOnClickListener(null);
binding.rate.setOnClickListener(null);
binding.donate.setOnClickListener(null);
binding.credits.setOnClickListener(null);
}
private void showCredits() {
new MaterialAlertDialogBuilder(this)
.setTitle(R.string.credits)
.setMessage(content.getContributorInfo())
.setPositiveButton(R.string.ok, null)
.show();
}
}

View File

@@ -0,0 +1,111 @@
package protect.card_locker;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;
import androidx.core.text.HtmlCompat;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class AboutContent {
public static final String TAG = "Catima";
public Context context;
public AboutContent(Context context) {
this.context = context;
}
public void destroy() {
this.context = null;
}
public String getPageTitle() {
return String.format(context.getString(R.string.about_title_fmt), context.getString(R.string.app_name));
}
public String getAppVersion() {
String version = "?";
try {
PackageInfo pi = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
version = pi.versionName;
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Package name not found", e);
}
return version;
}
public int getCurrentYear() {
return Calendar.getInstance().get(Calendar.YEAR);
}
public String getCopyright() {
return String.format(context.getString(R.string.app_copyright_fmt), getCurrentYear());
}
public String getContributors() {
String contributors;
try {
contributors = "<br/>" + Utils.readTextFile(context, R.raw.contributors);
} catch (IOException ignored) {
return "";
}
return contributors.replace("\n", "<br />");
}
public String getThirdPartyLibraries() {
final List<ThirdPartyInfo> usedLibraries = new ArrayList<>();
usedLibraries.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
usedLibraries.add(new ThirdPartyInfo("uCrop", "https://github.com/Yalantis/uCrop", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("Zip4j", "https://github.com/srikanth-lingala/zip4j", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("ZXing", "https://github.com/zxing/zxing", "Apache 2.0"));
usedLibraries.add(new ThirdPartyInfo("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded", "Apache 2.0"));
StringBuilder result = new StringBuilder("<br/>");
for (ThirdPartyInfo entry : usedLibraries) {
result.append("<br/>")
.append(entry.toHtml());
}
return result.toString();
}
public String getUsedThirdPartyAssets() {
final List<ThirdPartyInfo> usedAssets = new ArrayList<>();
usedAssets.add(new ThirdPartyInfo("Android icons", "https://fonts.google.com/icons?selected=Material+Icons", "Apache 2.0"));
StringBuilder result = new StringBuilder().append("<br/>");
for (ThirdPartyInfo entry : usedAssets) {
result.append("<br/>")
.append(entry.toHtml());
}
return result.toString();
}
public String getContributorInfo() {
StringBuilder contributorInfo = new StringBuilder();
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_contributors), getContributors()), HtmlCompat.FROM_HTML_MODE_COMPACT));
contributorInfo.append("\n\n");
contributorInfo.append(context.getString(R.string.app_copyright_old));
contributorInfo.append("\n\n");
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_libraries), getThirdPartyLibraries()), HtmlCompat.FROM_HTML_MODE_COMPACT));
contributorInfo.append("\n\n");
contributorInfo.append(HtmlCompat.fromHtml(String.format(context.getString(R.string.app_resources), getUsedThirdPartyAssets()), HtmlCompat.FROM_HTML_MODE_COMPACT));
return contributorInfo.toString();
}
public String getVersionHistory() {
return String.format(context.getString(R.string.debug_version_fmt), getAppVersion());
}
}

View File

@@ -0,0 +1,5 @@
package protect.card_locker;
public interface BarcodeImageWriterResultCallback {
void onBarcodeImageWriterResult(boolean success);
}

View File

@@ -4,30 +4,30 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.AsyncTask;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import java.lang.ref.WeakReference;
import protect.card_locker.async.CompatCallable;
/**
* This task will generate a barcode and load it into an ImageView.
* Only a weak reference of the ImageView is kept, so this class will not
* prevent the ImageView from being garbage collected.
*/
class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
{
public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
private static final String TAG = "Catima";
private static final int IS_VALID = 999;
private Context mContext;
private final Context mContext;
private boolean isSuccesful;
// When drawn in a smaller window 1D barcodes for some reason end up
@@ -42,12 +42,13 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
private final int imageHeight;
private final int imageWidth;
private final boolean showFallback;
private final Runnable callback;
private final BarcodeImageWriterResultCallback callback;
BarcodeImageWriterTask(Context context, ImageView imageView, String cardIdString,
CatimaBarcode barcodeFormat, TextView textView,
boolean showFallback, Runnable callback)
{
BarcodeImageWriterTask(
Context context, ImageView imageView, String cardIdString,
CatimaBarcode barcodeFormat, TextView textView,
boolean showFallback, BarcodeImageWriterResultCallback callback, boolean roundCornerPadding
) {
mContext = context;
isSuccesful = true;
@@ -60,28 +61,37 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
cardId = cardIdString;
format = barcodeFormat;
int padding = 0;
// Some barcodes already have internal whitespace and shouldn't get extra padding
// TODO: Get rid of this hack by somehow detecting this extra whitespace
if (roundCornerPadding && !barcodeFormat.hasInternalPadding()) {
padding = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, context.getResources().getDisplayMetrics()));
}
final int MAX_WIDTH = getMaxWidth(format);
if(imageView.getWidth() < MAX_WIDTH)
{
imageHeight = imageView.getHeight();
imageWidth = imageView.getWidth();
}
else
{
int tempImageHeight;
int tempImageWidth;
if (imageView.getWidth() < MAX_WIDTH) {
tempImageHeight = imageView.getHeight();
tempImageWidth = imageView.getWidth();
} else {
// Scale down the image to reduce the memory needed to produce it
imageWidth = MAX_WIDTH;
double ratio = (double)MAX_WIDTH / (double)imageView.getWidth();
imageHeight = (int)(imageView.getHeight() * ratio);
tempImageWidth = MAX_WIDTH;
double ratio = (double) MAX_WIDTH / (double) imageView.getWidth();
tempImageHeight = (int) (imageView.getHeight() * ratio);
}
// Ensure space for padding if wanted
imageWidth = tempImageWidth;
imageHeight = tempImageHeight - padding;
this.showFallback = showFallback;
}
private int getMaxWidth(CatimaBarcode format)
{
switch(format.format())
{
private int getMaxWidth(CatimaBarcode format) {
switch (format.format()) {
// 2D barcodes
case AZTEC:
case DATA_MATRIX:
@@ -108,10 +118,8 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
}
}
private String getFallbackString(CatimaBarcode format)
{
switch(format.format())
{
private String getFallbackString(CatimaBarcode format) {
switch (format.format()) {
// 2D barcodes
case AZTEC:
return "AZTEC";
@@ -127,6 +135,8 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
return "C0C";
case CODE_39:
return "CODE_39";
case CODE_93:
return "CODE_93";
case CODE_128:
return "CODE_128";
case EAN_8:
@@ -144,23 +154,17 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
}
}
private Bitmap generate()
{
if (cardId.isEmpty())
{
private Bitmap generate() {
if (cardId.isEmpty()) {
return null;
}
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix bitMatrix;
try
{
try
{
try {
try {
bitMatrix = writer.encode(cardId, format.format(), imageWidth, imageHeight, null);
}
catch(Exception e)
{
} catch (Exception e) {
// Cast a wider net here and catch any exception, as there are some
// cases where an encoder may fail if the data is invalid for the
// barcode type. If this happens, we want to fail gracefully.
@@ -175,11 +179,9 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
int[] pixels = new int[bitMatrixWidth * bitMatrixHeight];
for (int y = 0; y < bitMatrixHeight; y++)
{
for (int y = 0; y < bitMatrixHeight; y++) {
int offset = y * bitMatrixWidth;
for (int x = 0; x < bitMatrixWidth; x++)
{
for (int x = 0; x < bitMatrixWidth; x++) {
int color = bitMatrix.get(x, y) ? BLACK : WHITE;
pixels[offset + x] = color;
}
@@ -199,19 +201,14 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
int widthScale = imageWidth / bitMatrixHeight;
int scalingFactor = Math.min(heightScale, widthScale);
if(scalingFactor > 1)
{
if (scalingFactor > 1) {
bitmap = Bitmap.createScaledBitmap(bitmap, bitMatrixWidth * scalingFactor, bitMatrixHeight * scalingFactor, false);
}
return bitmap;
}
catch (WriterException e)
{
} catch (WriterException e) {
Log.e(TAG, "Failed to generate barcode of type " + format + ": " + cardId, e);
}
catch(OutOfMemoryError e)
{
} catch (OutOfMemoryError e) {
Log.w(TAG, "Insufficient memory to render barcode, "
+ imageWidth + "x" + imageHeight + ", " + format.name()
+ ", length=" + cardId.length(), e);
@@ -220,29 +217,36 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
return null;
}
public Bitmap doInBackground(Void... params)
{
Bitmap bitmap = generate();
public Bitmap doInBackground(Void... params) {
// Only do the hard tasks if we've not already been cancelled
if (!Thread.currentThread().isInterrupted()) {
Bitmap bitmap = generate();
if (bitmap == null) {
isSuccesful = false;
if (bitmap == null) {
isSuccesful = false;
if (showFallback) {
Log.i(TAG, "Barcode generation failed, generating fallback...");
cardId = getFallbackString(format);
bitmap = generate();
if (showFallback && !Thread.currentThread().isInterrupted()) {
Log.i(TAG, "Barcode generation failed, generating fallback...");
cardId = getFallbackString(format);
bitmap = generate();
return bitmap;
}
} else {
return bitmap;
}
}
return bitmap;
// We've been interrupted - create a empty fallback
Bitmap.Config config = Bitmap.Config.ARGB_8888;
return Bitmap.createBitmap(imageWidth, imageHeight, config);
}
protected void onPostExecute(Bitmap result)
{
public void onPostExecute(Object castResult) {
Bitmap result = (Bitmap) castResult;
Log.i(TAG, "Finished generating barcode image of type " + format + ": " + cardId);
ImageView imageView = imageViewReference.get();
if(imageView == null)
{
if (imageView == null) {
// The ImageView no longer exists, nothing to do
return;
}
@@ -255,8 +259,7 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
imageView.setContentDescription(mContext.getString(R.string.barcodeImageDescriptionWithType, formatPrettyName));
TextView textView = textViewReference.get();
if(result != null)
{
if (result != null) {
Log.i(TAG, "Displaying barcode");
imageView.setVisibility(View.VISIBLE);
@@ -270,9 +273,7 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
textView.setVisibility(View.VISIBLE);
textView.setText(formatPrettyName);
}
}
else
{
} else {
Log.i(TAG, "Barcode generation failed, removing image from display");
imageView.setVisibility(View.GONE);
if (textView != null) {
@@ -281,7 +282,22 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
}
if (callback != null) {
callback.run();
callback.onBarcodeImageWriterResult(isSuccesful);
}
}
@Override
public void onPreExecute() {
// No Action
}
/**
* Provided to comply with Callable while keeping the original Syntax of AsyncTask
*
* @return generated Bitmap
*/
@Override
public Bitmap call() {
return doInBackground();
}
}

View File

@@ -2,96 +2,83 @@ package protect.card_locker;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.util.Pair;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ListView;
import android.widget.Toast;
import com.google.zxing.BarcodeFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.ArrayList;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;
import protect.card_locker.databinding.BarcodeSelectorActivityBinding;
/**
* This activity is callable and will allow a user to enter
* barcode data and generate all barcodes possible for
* the data. The user may then select any barcode, where its
* data and type will be returned to the caller.
*/
public class BarcodeSelectorActivity extends CatimaAppCompatActivity
{
public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements BarcodeSelectorAdapter.BarcodeSelectorListener {
private BarcodeSelectorActivityBinding binding;
private static final String TAG = "Catima";
// Result this activity will return
public static final String BARCODE_CONTENTS = "contents";
public static final String BARCODE_FORMAT = "format";
private Map<String, Pair<Integer, Integer>> barcodeViewMap;
private LinkedList<AsyncTask> barcodeGeneratorTasks = new LinkedList<>();
private final Handler typingDelayHandler = new Handler(Looper.getMainLooper());
public static final Integer INPUT_DELAY = 250;
private BarcodeSelectorAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = BarcodeSelectorActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.selectBarcodeTitle);
setContentView(R.layout.barcode_selector_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
barcodeViewMap = new HashMap<>();
barcodeViewMap.put(BarcodeFormat.AZTEC.name(), new Pair<>(R.id.aztecBarcode, R.id.aztecBarcodeText));
barcodeViewMap.put(BarcodeFormat.CODE_39.name(), new Pair<>(R.id.code39Barcode, R.id.code39BarcodeText));
barcodeViewMap.put(BarcodeFormat.CODE_128.name(), new Pair<>(R.id.code128Barcode, R.id.code128BarcodeText));
barcodeViewMap.put(BarcodeFormat.CODABAR.name(), new Pair<>(R.id.codabarBarcode, R.id.codabarBarcodeText));
barcodeViewMap.put(BarcodeFormat.DATA_MATRIX.name(), new Pair<>(R.id.datamatrixBarcode, R.id.datamatrixBarcodeText));
barcodeViewMap.put(BarcodeFormat.EAN_8.name(), new Pair<>(R.id.ean8Barcode, R.id.ean8BarcodeText));
barcodeViewMap.put(BarcodeFormat.EAN_13.name(), new Pair<>(R.id.ean13Barcode, R.id.ean13BarcodeText));
barcodeViewMap.put(BarcodeFormat.ITF.name(), new Pair<>(R.id.itfBarcode, R.id.itfBarcodeText));
barcodeViewMap.put(BarcodeFormat.PDF_417.name(), new Pair<>(R.id.pdf417Barcode, R.id.pdf417BarcodeText));
barcodeViewMap.put(BarcodeFormat.QR_CODE.name(), new Pair<>(R.id.qrcodeBarcode, R.id.qrcodeBarcodeText));
barcodeViewMap.put(BarcodeFormat.UPC_A.name(), new Pair<>(R.id.upcaBarcode, R.id.upcaBarcodeText));
barcodeViewMap.put(BarcodeFormat.UPC_E.name(), new Pair<>(R.id.upceBarcode, R.id.upceBarcodeText));
EditText cardId = binding.cardId;
ListView mBarcodeList = binding.barcodes;
mAdapter = new BarcodeSelectorAdapter(this, new ArrayList<>(), this);
mBarcodeList.setAdapter(mAdapter);
EditText cardId = findViewById(R.id.cardId);
cardId.addTextChangedListener(new SimpleTextWatcher()
{
cardId.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
Log.d(TAG, "Entered text: " + s);
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Delay the input processing so we avoid overload
typingDelayHandler.removeCallbacksAndMessages(null);
generateBarcodes(s.toString());
typingDelayHandler.postDelayed(() -> {
Log.d(TAG, "Entered text: " + s);
View noBarcodeButtonView = findViewById(R.id.noBarcode);
setButtonListener(noBarcodeButtonView, s.toString());
noBarcodeButtonView.setEnabled(s.length() > 0);
runOnUiThread(() -> {
generateBarcodes(s.toString());
View noBarcodeButtonView = binding.noBarcode;
setButtonListener(noBarcodeButtonView, s.toString());
noBarcodeButtonView.setEnabled(s.length() > 0);
});
}, INPUT_DELAY);
}
});
final Bundle b = getIntent().getExtras();
final String initialCardId = b != null ? b.getString("initialCardId") : null;
if(initialCardId != null)
{
if (initialCardId != null) {
cardId.setText(initialCardId);
} else {
generateBarcodes("");
@@ -99,24 +86,16 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity
}
private void generateBarcodes(String value) {
// Stop any async tasks which may not have been started yet
for(AsyncTask task : barcodeGeneratorTasks)
{
task.cancel(false);
}
barcodeGeneratorTasks.clear();
// Update barcodes
for(Map.Entry<String, Pair<Integer, Integer>> entry : barcodeViewMap.entrySet())
{
ImageView image = findViewById(entry.getValue().first);
TextView text = findViewById(entry.getValue().second);
createBarcodeOption(image, entry.getKey(), value, text);
ArrayList<CatimaBarcodeWithValue> barcodes = new ArrayList<>();
for (BarcodeFormat barcodeFormat : CatimaBarcode.barcodeFormats) {
CatimaBarcode catimaBarcode = CatimaBarcode.fromBarcode(barcodeFormat);
barcodes.add(new CatimaBarcodeWithValue(catimaBarcode, value));
}
mAdapter.setBarcodes(barcodes);
}
private void setButtonListener(final View button, final String cardId)
{
private void setButtonListener(final View button, final String cardId) {
button.setOnClickListener(view -> {
Log.d(TAG, "Selected no barcode");
Intent result = new Intent();
@@ -127,60 +106,9 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity
});
}
private void createBarcodeOption(final ImageView image, final String formatType, final String cardId, final TextView text)
{
final CatimaBarcode format = CatimaBarcode.fromName(formatType);
image.setImageBitmap(null);
image.setOnClickListener(v -> {
Log.d(TAG, "Selected barcode type " + formatType);
if (!((boolean) image.getTag())) {
Toast.makeText(BarcodeSelectorActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
return;
}
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, formatType);
result.putExtra(BARCODE_CONTENTS, cardId);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
});
if(image.getHeight() == 0)
{
// The size of the ImageView is not yet available as it has not
// yet been drawn. Wait for it to be drawn so the size is available.
image.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
Log.d(TAG, "Global layout finished, type: + " + formatType + ", width: " + image.getWidth());
image.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask task = new BarcodeImageWriterTask(getApplicationContext(), image, cardId, format, text, true, null);
barcodeGeneratorTasks.add(task);
task.execute();
}
});
}
else
{
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask task = new BarcodeImageWriterTask(getApplicationContext(), image, cardId, format, text, true, null);
barcodeGeneratorTasks.add(task);
task.execute();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
if (item.getItemId() == android.R.id.home)
{
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
setResult(Activity.RESULT_CANCELED);
finish();
return true;
@@ -188,4 +116,26 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity
return super.onOptionsItemSelected(item);
}
@Override
public void onRowClicked(int inputPosition, View view) {
CatimaBarcodeWithValue barcodeWithValue = mAdapter.getItem(inputPosition);
CatimaBarcode catimaBarcode = barcodeWithValue.catimaBarcode();
if (!mAdapter.isValid(view)) {
Toast.makeText(this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
return;
}
String barcodeFormat = catimaBarcode.format().name();
String value = barcodeWithValue.value();
Log.d(TAG, "Selected barcode type " + barcodeFormat);
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, barcodeFormat);
result.putExtra(BARCODE_CONTENTS, value);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
}
}

View File

@@ -0,0 +1,105 @@
package protect.card_locker;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.BarcodeLayoutBinding;
public class BarcodeSelectorAdapter extends ArrayAdapter<CatimaBarcodeWithValue> {
private static final String TAG = "Catima";
private final TaskHandler mTasks = new TaskHandler();
private final BarcodeSelectorListener mListener;
private static class ViewHolder {
ImageView image;
TextView text;
}
public interface BarcodeSelectorListener {
void onRowClicked(int inputPosition, View view);
}
public BarcodeSelectorAdapter(Context context, ArrayList<CatimaBarcodeWithValue> barcodes, BarcodeSelectorListener barcodeSelectorListener) {
super(context, 0, barcodes);
mListener = barcodeSelectorListener;
}
public void setBarcodes(ArrayList<CatimaBarcodeWithValue> barcodes) {
clear();
addAll(barcodes);
notifyDataSetChanged();
mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CatimaBarcodeWithValue catimaBarcodeWithValue = getItem(position);
CatimaBarcode catimaBarcode = catimaBarcodeWithValue.catimaBarcode();
String value = catimaBarcodeWithValue.value();
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
BarcodeLayoutBinding barcodeLayoutBinding = BarcodeLayoutBinding.inflate(inflater, parent, false);
convertView = barcodeLayoutBinding.getRoot();
viewHolder.image = barcodeLayoutBinding.barcodeImage;
viewHolder.text = barcodeLayoutBinding.barcodeName;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
createBarcodeOption(viewHolder.image, catimaBarcode.format().name(), value, viewHolder.text);
View finalConvertView = convertView;
convertView.setOnClickListener(view -> mListener.onRowClicked(position, finalConvertView));
return convertView;
}
public boolean isValid(View view) {
ViewHolder viewHolder = (ViewHolder) view.getTag();
return viewHolder.image.getTag() != null && (boolean) viewHolder.image.getTag();
}
private void createBarcodeOption(final ImageView image, final String formatType, final String cardId, final TextView text) {
final CatimaBarcode format = CatimaBarcode.fromName(formatType);
image.setImageBitmap(null);
image.setClipToOutline(true);
if (image.getHeight() == 0) {
// The size of the ImageView is not yet available as it has not
// yet been drawn. Wait for it to be drawn so the size is available.
image.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Log.d(TAG, "Global layout finished, type: + " + formatType + ", width: " + image.getWidth());
image.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null, true);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
});
} else {
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null, true);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
}
}

View File

@@ -4,30 +4,30 @@ import android.database.Cursor;
import androidx.recyclerview.widget.RecyclerView;
public abstract class BaseCursorAdapter<V extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<V>
{
private Cursor mCursor;
public abstract class BaseCursorAdapter<V extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<V> {
public Cursor mCursor;
private boolean mDataValid;
private int mRowIDColumn;
public BaseCursorAdapter(Cursor inputCursor)
{
private String mRowIDColumnName;
public BaseCursorAdapter(Cursor inputCursor, String rowIDColumnName) {
setHasStableIds(true);
mRowIDColumnName = rowIDColumnName;
swapCursor(inputCursor);
}
public abstract void onBindViewHolder(V inputHolder, Cursor inputCursor);
@Override
public void onBindViewHolder(V inputHolder, int inputPosition)
{
if (!mDataValid)
{
public void onBindViewHolder(V inputHolder, int inputPosition) {
if (!mDataValid) {
throw new IllegalStateException("Cannot bind view holder when cursor is in invalid state.");
}
if (!mCursor.moveToPosition(inputPosition))
{
if (!mCursor.moveToPosition(inputPosition)) {
throw new IllegalStateException("Could not move cursor to position " + inputPosition + " when trying to bind view holder");
}
@@ -35,49 +35,38 @@ public abstract class BaseCursorAdapter<V extends RecyclerView.ViewHolder> exten
}
@Override
public int getItemCount()
{
if (mDataValid)
{
public int getItemCount() {
if (mDataValid) {
return mCursor.getCount();
}
else
{
} else {
return 0;
}
}
@Override
public long getItemId(int inputPosition)
{
if (!mDataValid)
{
public long getItemId(int inputPosition) {
if (!mDataValid) {
throw new IllegalStateException("Cannot lookup item id when cursor is in invalid state.");
}
if (!mCursor.moveToPosition(inputPosition))
{
if (!mCursor.moveToPosition(inputPosition)) {
throw new IllegalStateException("Could not move cursor to position " + inputPosition + " when trying to get an item id");
}
return mCursor.getLong(mRowIDColumn);
}
public void swapCursor(Cursor inputCursor)
{
if (inputCursor == mCursor)
{
public void swapCursor(Cursor inputCursor) {
if (inputCursor == mCursor) {
return;
}
if (inputCursor != null)
{
if (inputCursor != null) {
mCursor = inputCursor;
mRowIDColumn = mCursor.getColumnIndex(mRowIDColumnName);
mDataValid = true;
notifyDataSetChanged();
}
else
{
} else {
notifyItemRangeRemoved(0, getItemCount());
mCursor = null;
mRowIDColumn = -1;

View File

@@ -1,69 +1,71 @@
package protect.card_locker;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.SimpleToolbarListActivityBinding;
/**
* The configuration screen for creating a shortcut.
*/
public class CardShortcutConfigure extends AppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener
{
public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
private SimpleToolbarListActivityBinding binding;
static final String TAG = "Catima";
final DBHelper mDb = new DBHelper(this);
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
binding = SimpleToolbarListActivityBinding.inflate(getLayoutInflater());
mDatabase = new DBHelper(this).getReadableDatabase();
// Set the result to CANCELED. This will cause nothing to happen if the
// aback button is pressed.
setResult(RESULT_CANCELED);
setContentView(R.layout.main_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setVisibility(View.GONE);
// Hide new button because it won't work here anyway
FloatingActionButton newFab = findViewById(R.id.fabAdd);
newFab.setVisibility(View.GONE);
final DBHelper db = new DBHelper(this);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
toolbar.setTitle(R.string.shortcutSelectCard);
setSupportActionBar(toolbar);
// If there are no cards, bail
if (db.getLoyaltyCardCount() == 0) {
int cardCount = DBHelper.getLoyaltyCardCount(mDatabase);
if (cardCount == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show();
finish();
}
final RecyclerView cardList = findViewById(R.id.list);
// If all cards are archived, bail
if (DBHelper.getArchivedCardsCount(mDatabase) == cardCount) {
Toast.makeText(this, R.string.noUnarchivedCardsMessage, Toast.LENGTH_LONG).show();
finish();
}
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
cardList.setLayoutManager(mLayoutManager);
cardList.setItemAnimator(new DefaultItemAnimator());
final RecyclerView cardList = binding.list;
GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager();
if (layoutManager != null) {
layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns));
}
cardList.setVisibility(View.VISIBLE);
Cursor cardCursor = db.getLoyaltyCardCursor();
final LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(this, cardCursor, this);
cardList.setAdapter(adapter);
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived);
mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this);
cardList.setAdapter(mAdapter);
}
private void onClickAction(int position) {
Cursor selected = mDb.getLoyaltyCardCursor();
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived);
selected.moveToPosition(position);
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(selected);
@@ -76,6 +78,26 @@ public class CardShortcutConfigure extends AppCompatActivity implements LoyaltyC
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
getMenuInflater().inflate(R.menu.card_details_menu, inputMenu);
Utils.updateMenuCardDetailsButtonState(inputMenu.findItem(R.id.action_unfold), mAdapter.showingDetails());
return super.onCreateOptionsMenu(inputMenu);
}
@Override
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == R.id.action_unfold) {
mAdapter.showDetails(!mAdapter.showingDetails());
invalidateOptionsMenu();
return true;
}
return super.onOptionsItemSelected(inputItem);
}
@Override
public void onRowClicked(int inputPosition) {

View File

@@ -0,0 +1,165 @@
package protect.card_locker;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.service.controls.Control;
import android.service.controls.ControlsProviderService;
import android.service.controls.DeviceTypes;
import android.service.controls.actions.ControlAction;
import android.service.controls.templates.StatelessTemplate;
import android.util.Log;
import java.util.List;
import java.util.concurrent.Flow;
import java.util.function.Consumer;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
@RequiresApi(Build.VERSION_CODES.R)
public class CardsOnPowerScreenService extends ControlsProviderService {
public static final String PREFIX = "catima-";
static final String TAG = "Catima";
private SQLiteDatabase mDatabase;
@Override
public void onCreate() {
super.onCreate();
mDatabase = new DBHelper(this).getReadableDatabase();
}
@NonNull
@Override
public Flow.Publisher<Control> createPublisherForAllAvailable() {
Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived);
return subscriber -> {
while (loyaltyCardCursor.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(loyaltyCardCursor);
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("id", card.id);
PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), card.id, openIntent, PendingIntent.FLAG_IMMUTABLE);
subscriber.onNext(
new Control.StatelessBuilder(PREFIX + card.id, pendingIntent)
.setControlId(PREFIX + card.id)
.setTitle(card.store)
.setDeviceType(DeviceTypes.TYPE_GENERIC_OPEN_CLOSE)
.setSubtitle(card.note)
.setCustomIcon(Icon.createWithBitmap(getIcon(this, card)))
.build()
);
}
subscriber.onComplete();
};
}
@NonNull
@Override
public Flow.Publisher<Control> createPublisherFor(@NonNull List<String> controlIds) {
return subscriber -> {
subscriber.onSubscribe(new NoOpSubscription());
for (String controlId : controlIds) {
Control control;
Integer cardId = this.controlIdToCardId(controlId);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId);
if (card != null) {
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("id", card.id);
PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), card.id, openIntent, PendingIntent.FLAG_IMMUTABLE);
control = new Control.StatefulBuilder(controlId, pendingIntent)
.setTitle(card.store)
.setDeviceType(DeviceTypes.TYPE_GENERIC_OPEN_CLOSE)
.setSubtitle(card.note)
.setStatus(Control.STATUS_OK)
.setControlTemplate(new StatelessTemplate(controlId))
.setCustomIcon(Icon.createWithBitmap(getIcon(this, card)))
.build();
} else {
Intent mainScreenIntent = new Intent(this, MainActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), -1, mainScreenIntent, PendingIntent.FLAG_IMMUTABLE);
control = new Control.StatefulBuilder(controlId, pendingIntent)
.setStatus(Control.STATUS_NOT_FOUND)
.build();
}
Log.d(TAG, "Dispatching widget " + controlId);
subscriber.onNext(control);
}
subscriber.onComplete();
};
}
private Bitmap getIcon(Context context, LoyaltyCard loyaltyCard) {
Bitmap cardIcon = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon);
if (cardIcon != null) {
return cardIcon;
}
return Utils.generateIcon(this, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile();
}
private Integer controlIdToCardId(String controlId) {
if (controlId == null)
return null;
if (!controlId.startsWith(PREFIX)) {
Log.w(TAG, "Unsupported control ID format: " + controlId);
return null;
}
controlId = controlId.substring(PREFIX.length());
try {
return Integer.parseInt(controlId);
} catch (RuntimeException ex) {
Log.e(TAG, "Unsupported control ID format. Expected numeric after prefix, found: " + controlId);
return null;
}
}
@Override
public void performControlAction(@NonNull String controlId, @NonNull ControlAction action, @NonNull Consumer<Integer> consumer) {
consumer.accept(ControlAction.RESPONSE_OK);
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("id", controlIdToCardId(controlId));
startActivity(openIntent);
closePowerScreenOnAndroid11();
}
@SuppressWarnings({"MissingPermission", "deprecation"})
private void closePowerScreenOnAndroid11() {
// Android 12 will auto-close the power screen, but earlier versions won't
// Lint complains about this but on Android 11 the permission is not needed
// On Android 12, we don't need it, and Google will probably get angry if we ask for it
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}
}
/**
* A no-op subscription.
* <p>
* Flow.Subscriptions are made to last during time and receive periodic updates.
* Our app does not require sending periodic updates of loyalty cards, so we are just ignoring anything in the subscription
* Also, our db is quick enough to respond that the Publisher is immediately sending and completing data.
* This facility is overkill, but if we don't call onSubscribe the service won't work
*/
private static class NoOpSubscription implements Flow.Subscription {
@Override
public void request(long l) {
}
@Override
public void cancel() {
}
}
}

View File

@@ -1,20 +1,18 @@
package protect.card_locker;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.util.TypedValue;
import java.util.HashMap;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
import androidx.core.view.WindowInsetsControllerCompat;
public class CatimaAppCompatActivity extends AppCompatActivity {
SharedPreferences pref;
HashMap<String, Integer> supportedThemes;
@Override
protected void attachBaseContext(Context base) {
// Apply chosen language
@@ -22,32 +20,37 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
}
@Override
public Resources.Theme getTheme() {
if (supportedThemes == null) {
supportedThemes = new HashMap<>();
supportedThemes.put(getString(R.string.settings_key_blue_theme), R.style.AppTheme_blue);
supportedThemes.put(getString(R.string.settings_key_brown_theme), R.style.AppTheme_brown);
supportedThemes.put(getString(R.string.settings_key_green_theme), R.style.AppTheme_green);
supportedThemes.put(getString(R.string.settings_key_grey_theme), R.style.AppTheme_grey);
supportedThemes.put(getString(R.string.settings_key_magenta_theme), R.style.AppTheme_magenta);
supportedThemes.put(getString(R.string.settings_key_pink_theme), R.style.AppTheme_pink);
supportedThemes.put(getString(R.string.settings_key_sky_blue_theme), R.style.AppTheme_sky_blue);
supportedThemes.put(getString(R.string.settings_key_violet_theme), R.style.AppTheme_violet);
}
Resources.Theme theme = super.getTheme();
pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String themeName = pref.getString(getString(R.string.setting_key_theme_color), getString(R.string.settings_key_catima_theme));
theme.applyStyle(Utils.mapGetOrDefault(supportedThemes, themeName, R.style.AppTheme_NoActionBar), true);
return theme;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Utils.patchColors(this);
}
public int getThemeColor() {
TypedValue typedValue = new TypedValue();
Resources.Theme theme = getTheme();
theme.resolveAttribute(R.attr.colorPrimary, typedValue, true);
return typedValue.data;
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// material 3 designer does not consider status bar colors
// XXX changing this in onCreate causes issues with the splash screen activity, so doing this here
boolean darkMode = Utils.isDarkModeEnabled(this);
if (Build.VERSION.SDK_INT >= 23) {
View decorView = getWindow().getDecorView();
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
wic.setAppearanceLightStatusBars(!darkMode);
getWindow().setStatusBarColor(Color.TRANSPARENT);
} else {
// icons are always white back then
getWindow().setStatusBarColor(darkMode ? Color.TRANSPARENT : Color.argb(127, 0, 0, 0));
}
// XXX android 9 and below has a nasty rendering bug if the theme was patched earlier
Utils.postPatchColors(this);
}
protected void enableToolbarBackButton() {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
}
}

View File

@@ -8,33 +8,35 @@ import java.util.List;
public class CatimaBarcode {
public static final List<BarcodeFormat> barcodeFormats = Collections.unmodifiableList(Arrays.asList(
BarcodeFormat.AZTEC,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_128,
BarcodeFormat.CODABAR,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.EAN_8,
BarcodeFormat.EAN_13,
BarcodeFormat.ITF,
BarcodeFormat.PDF_417,
BarcodeFormat.QR_CODE,
BarcodeFormat.UPC_A,
BarcodeFormat.UPC_E
BarcodeFormat.AZTEC,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_93,
BarcodeFormat.CODE_128,
BarcodeFormat.CODABAR,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.EAN_8,
BarcodeFormat.EAN_13,
BarcodeFormat.ITF,
BarcodeFormat.PDF_417,
BarcodeFormat.QR_CODE,
BarcodeFormat.UPC_A,
BarcodeFormat.UPC_E
));
public static final List<String> barcodePrettyNames = Collections.unmodifiableList(Arrays.asList(
"Aztec",
"Code 39",
"Code 128",
"Codabar",
"Data Matrix",
"EAN 8",
"EAN 13",
"ITF",
"PDF 417",
"QR Code",
"UPC A",
"UPC E"
"Aztec",
"Code 39",
"Code 93",
"Code 128",
"Codabar",
"Data Matrix",
"EAN 8",
"EAN 13",
"ITF",
"PDF 417",
"QR Code",
"UPC A",
"UPC E"
));
private final BarcodeFormat mBarcodeFormat;
@@ -63,6 +65,18 @@ public class CatimaBarcode {
return barcodeFormats.contains(mBarcodeFormat);
}
public boolean isSquare() {
return mBarcodeFormat == BarcodeFormat.AZTEC
|| mBarcodeFormat == BarcodeFormat.DATA_MATRIX
|| mBarcodeFormat == BarcodeFormat.MAXICODE
|| mBarcodeFormat == BarcodeFormat.QR_CODE;
}
public boolean hasInternalPadding() {
return mBarcodeFormat == BarcodeFormat.PDF_417
|| mBarcodeFormat == BarcodeFormat.QR_CODE;
}
public BarcodeFormat format() {
return mBarcodeFormat;
}

View File

@@ -0,0 +1,19 @@
package protect.card_locker;
public class CatimaBarcodeWithValue {
private final CatimaBarcode mCatimaBarcode;
private final String mValue;
public CatimaBarcodeWithValue(CatimaBarcode catimaBarcode, String value) {
mCatimaBarcode = catimaBarcode;
mValue = value;
}
public CatimaBarcode catimaBarcode() {
return mCatimaBarcode;
}
public String value() {
return mValue;
}
}

View File

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

View File

@@ -8,6 +8,7 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.TextUtils;
import android.util.Log;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
@@ -17,24 +18,22 @@ import java.util.Currency;
import java.util.Date;
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 int ORIGINAL_DATABASE_VERSION = 1;
public static final int DATABASE_VERSION = 12;
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 ID = "_id";
public static final String ORDER = "orderId";
}
public static class LoyaltyCardDbIds
{
public static class LoyaltyCardDbIds {
public static final String TABLE = "cards";
public static final String ID = "_id";
public static final String STORE = "store";
public static final String VALID_FROM = "validfrom";
public static final String EXPIRY = "expiry";
public static final String BALANCE = "balance";
public static final String BALANCE_TYPE = "balancetype";
@@ -46,17 +45,17 @@ public class DBHelper extends SQLiteOpenHelper
public static final String BARCODE_TYPE = "barcodetype";
public static final String STAR_STATUS = "starstatus";
public static final String LAST_USED = "lastused";
public static final String ZOOM_LEVEL = "zoomlevel";
public static final String ARCHIVE_STATUS = "archive";
}
public static class LoyaltyCardDbIdsGroups
{
public static class LoyaltyCardDbIdsGroups {
public static final String TABLE = "cardsGroups";
public static final String cardID = "cardId";
public static final String groupID = "groupId";
}
public static class LoyaltyCardDbFTS
{
public static class LoyaltyCardDbFTS {
public static final String TABLE = "fts";
public static final String ID = "rowid"; // This should NEVER be changed
public static final String STORE = "store";
@@ -74,18 +73,18 @@ public class DBHelper extends SQLiteOpenHelper
Descending
}
private Context mContext;
public enum LoyaltyCardArchiveFilter {
All,
Archived,
Unarchived
}
public DBHelper(Context context)
{
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db)
{
public void onCreate(SQLiteDatabase db) {
// create table for card groups
db.execSQL("CREATE TABLE " + LoyaltyCardDbGroups.TABLE + "(" +
LoyaltyCardDbGroups.ID + " TEXT primary key not null," +
@@ -97,6 +96,7 @@ public class DBHelper extends SQLiteOpenHelper
LoyaltyCardDbIds.ID + " INTEGER primary key autoincrement," +
LoyaltyCardDbIds.STORE + " TEXT not null," +
LoyaltyCardDbIds.NOTE + " TEXT not null," +
LoyaltyCardDbIds.VALID_FROM + " INTEGER," +
LoyaltyCardDbIds.EXPIRY + " INTEGER," +
LoyaltyCardDbIds.BALANCE + " TEXT not null DEFAULT '0'," +
LoyaltyCardDbIds.BALANCE_TYPE + " TEXT," +
@@ -105,13 +105,15 @@ public class DBHelper extends SQLiteOpenHelper
LoyaltyCardDbIds.BARCODE_ID + " TEXT," +
LoyaltyCardDbIds.BARCODE_TYPE + " TEXT," +
LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0'," +
LoyaltyCardDbIds.LAST_USED + " INTEGER DEFAULT '0')");
LoyaltyCardDbIds.LAST_USED + " INTEGER DEFAULT '0', " +
LoyaltyCardDbIds.ZOOM_LEVEL + " INTEGER DEFAULT '100', " +
LoyaltyCardDbIds.ARCHIVE_STATUS + " INTEGER DEFAULT '0' )");
// create associative table for cards in groups
db.execSQL("CREATE TABLE " + LoyaltyCardDbIdsGroups.TABLE + "(" +
LoyaltyCardDbIdsGroups.cardID + " INTEGER," +
LoyaltyCardDbIdsGroups.groupID + " TEXT," +
"primary key (" + LoyaltyCardDbIdsGroups.cardID + "," + LoyaltyCardDbIdsGroups.groupID +"))");
"primary key (" + LoyaltyCardDbIdsGroups.cardID + "," + LoyaltyCardDbIdsGroups.groupID + "))");
// create FTS search table
db.execSQL("CREATE VIRTUAL TABLE " + LoyaltyCardDbFTS.TABLE + " USING fts4(" +
@@ -120,67 +122,57 @@ public class DBHelper extends SQLiteOpenHelper
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
if(oldVersion < 2 && newVersion >= 2)
{
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2 && newVersion >= 2) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.NOTE + " TEXT not null default ''");
}
if(oldVersion < 3 && newVersion >= 3)
{
if (oldVersion < 3 && newVersion >= 3) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.HEADER_COLOR + " INTEGER");
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.HEADER_TEXT_COLOR + " INTEGER");
}
if(oldVersion < 4 && newVersion >= 4)
{
if (oldVersion < 4 && newVersion >= 4) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0'");
}
if(oldVersion < 5 && newVersion >= 5)
{
if (oldVersion < 5 && newVersion >= 5) {
db.execSQL("CREATE TABLE " + LoyaltyCardDbGroups.TABLE + "(" +
LoyaltyCardDbGroups.ID + " TEXT primary key not null)");
db.execSQL("CREATE TABLE " + LoyaltyCardDbIdsGroups.TABLE + "(" +
LoyaltyCardDbIdsGroups.cardID + " INTEGER," +
LoyaltyCardDbIdsGroups.groupID + " TEXT," +
"primary key (" + LoyaltyCardDbIdsGroups.cardID + "," + LoyaltyCardDbIdsGroups.groupID +"))");
"primary key (" + LoyaltyCardDbIdsGroups.cardID + "," + LoyaltyCardDbIdsGroups.groupID + "))");
}
if(oldVersion < 6 && newVersion >= 6)
{
if (oldVersion < 6 && newVersion >= 6) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbGroups.TABLE
+ " ADD COLUMN " + LoyaltyCardDbGroups.ORDER + " INTEGER DEFAULT '0'");
}
if(oldVersion < 7 && newVersion >= 7)
{
if (oldVersion < 7 && newVersion >= 7) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.EXPIRY + " INTEGER");
}
if(oldVersion < 8 && newVersion >= 8)
{
if (oldVersion < 8 && newVersion >= 8) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.BALANCE + " TEXT not null DEFAULT '0'");
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.BALANCE_TYPE + " TEXT");
}
if(oldVersion < 9 && newVersion >= 9)
{
if (oldVersion < 9 && newVersion >= 9) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.BARCODE_ID + " TEXT");
}
if(oldVersion < 10 && newVersion >= 10)
{
if (oldVersion < 10 && newVersion >= 10) {
// SQLite doesn't support modify column
// So we need to create a temp column to make barcode type nullable
// Let's drop header text colour too while we're at it
@@ -273,14 +265,12 @@ public class DBHelper extends SQLiteOpenHelper
db.endTransaction();
}
if(oldVersion < 11 && newVersion >= 11)
{
if (oldVersion < 11 && newVersion >= 11) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.LAST_USED + " INTEGER DEFAULT '0'");
}
if(oldVersion < 12 && newVersion >= 12)
{
if (oldVersion < 12 && newVersion >= 12) {
db.execSQL("CREATE VIRTUAL TABLE " + LoyaltyCardDbFTS.TABLE + " USING fts4(" +
LoyaltyCardDbFTS.STORE + ", " + LoyaltyCardDbFTS.NOTE + ", " +
"tokenize=unicode61);");
@@ -290,13 +280,50 @@ public class DBHelper extends SQLiteOpenHelper
cursor.moveToFirst();
while (cursor.moveToNext()) {
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor);
insertFTS(db, loyaltyCard.id, loyaltyCard.store, loyaltyCard.note);
int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
String store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE));
String note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE));
insertFTS(db, id, store, note);
}
}
if (oldVersion < 13 && newVersion >= 13) {
db.execSQL("DELETE FROM " + LoyaltyCardDbFTS.TABLE + ";");
Cursor cursor = db.rawQuery("SELECT * FROM " + LoyaltyCardDbIds.TABLE + ";", null, null);
if (cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
String store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE));
String note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE));
insertFTS(db, id, store, note);
while (cursor.moveToNext()) {
id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE));
note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE));
insertFTS(db, id, store, note);
}
}
cursor.close();
}
if (oldVersion < 14 && newVersion >= 14) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.ZOOM_LEVEL + " INTEGER DEFAULT '100' ");
}
if (oldVersion < 15 && newVersion >= 15) {
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " 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 ContentValues generateFTSContentValues(final int id, final String store, final String note) {
private static ContentValues generateFTSContentValues(final int id, final String store, final String note) {
// FTS on Android is severely limited and can only search for word starting with a certain string
// So for each word, we grab every single substring
// This makes it possible to find Décathlon by searching both de and cat, for example
@@ -328,28 +355,27 @@ public class DBHelper extends SQLiteOpenHelper
return ftsContentValues;
}
private void insertFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
private static void insertFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
db.insert(LoyaltyCardDbFTS.TABLE, null, generateFTSContentValues(id, store, note));
}
private void updateFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
private static void updateFTS(final SQLiteDatabase db, final int id, final String store, final String note) {
db.update(LoyaltyCardDbFTS.TABLE, generateFTSContentValues(id, store, note),
whereAttrs(LoyaltyCardDbFTS.ID), withArgs(id));
}
public long insertLoyaltyCard(final String store, final String note, final Date expiry,
final BigDecimal balance, final Currency balanceType,
final String cardId, final String barcodeId,
final CatimaBarcode barcodeType, final Integer headerColor,
final int starStatus, final Long lastUsed)
{
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
public static long insertLoyaltyCard(
final SQLiteDatabase database, final String store, final String note, final Date validFrom,
final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType, final Integer headerColor,
final int starStatus, final Long lastUsed, final int archiveStatus) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STORE, store);
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.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
@@ -359,64 +385,32 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
long id = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
contentValues.put(LoyaltyCardDbIds.ARCHIVE_STATUS, archiveStatus);
long id = database.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, (int) id, store, note);
insertFTS(database, (int) id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return id;
}
public long insertLoyaltyCard(final SQLiteDatabase db, final String store,
final String note, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus,
final Long lastUsed)
{
db.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STORE, store);
contentValues.put(LoyaltyCardDbIds.NOTE, note);
contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null);
contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
long id = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, (int) id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
return id;
}
public long insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store,
final String note, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor, final int starStatus,
final Long lastUsed)
{
db.beginTransaction();
public static long insertLoyaltyCard(
final SQLiteDatabase database, final int id, final String store, final String note,
final Date validFrom, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId, final String barcodeId,
final CatimaBarcode barcodeType, final Integer headerColor, final int starStatus,
final Long lastUsed, final int archiveStatus) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.ID, id);
contentValues.put(LoyaltyCardDbIds.STORE, store);
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.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
@@ -426,30 +420,31 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
contentValues.put(LoyaltyCardDbIds.ARCHIVE_STATUS, archiveStatus);
database.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
// FTS
insertFTS(db, id, store, note);
insertFTS(database, id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return id;
}
public boolean updateLoyaltyCard(final int id, final String store, final String note,
final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId,
final String barcodeId, final CatimaBarcode barcodeType,
final Integer headerColor)
{
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
public static boolean updateLoyaltyCard(
SQLiteDatabase database, final int id, final String store, final String note,
final Date validFrom, final Date expiry, final BigDecimal balance,
final Currency balanceType, final String cardId, final String barcodeId,
final CatimaBarcode barcodeType, final Integer headerColor, final int starStatus,
final Long lastUsed, final int archiveStatus) {
database.beginTransaction();
// Card
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STORE, store);
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.BALANCE, balance.toString());
contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null);
@@ -457,48 +452,75 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime());
contentValues.put(LoyaltyCardDbIds.ARCHIVE_STATUS, archiveStatus);
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID), withArgs(id));
// FTS
updateFTS(db, id, store, note);
updateFTS(database, id, store, note);
db.setTransactionSuccessful();
db.endTransaction();
database.setTransactionSuccessful();
database.endTransaction();
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardStarStatus(final int id, final int starStatus)
{
SQLiteDatabase db = getWritableDatabase();
public static boolean updateLoyaltyCardArchiveStatus(SQLiteDatabase database, final int id, final int archiveStatus) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
contentValues.put(LoyaltyCardDbIds.ARCHIVE_STATUS, archiveStatus);
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardLastUsed(final int id) {
SQLiteDatabase db = getWritableDatabase();
public static boolean updateLoyaltyCardStarStatus(SQLiteDatabase database, final int id, final int starStatus) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public static boolean updateLoyaltyCardLastUsed(SQLiteDatabase database, final int id) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.LAST_USED, System.currentTimeMillis() / 1000);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public LoyaltyCard getLoyaltyCard(final int id)
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
public static boolean updateLoyaltyCardZoomLevel(SQLiteDatabase database, int loyaltyCardId, int zoomLevel) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.ZOOM_LEVEL, zoomLevel);
Log.d("updateLoyaltyCardZLevel", "Card Id = " + loyaltyCardId + " Zoom level= " + zoomLevel);
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(loyaltyCardId));
Log.d("updateLoyaltyCardZLevel", "Rows changed = " + rowsUpdated);
return (rowsUpdated == 1);
}
public static boolean updateLoyaltyCardBalance(SQLiteDatabase database, final int id, final BigDecimal newBalance) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.BALANCE, newBalance.toString());
int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
return (rowsUpdated == 1);
}
public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) {
Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
LoyaltyCard card = null;
if(data.getCount() == 1)
{
if (data.getCount() == 1) {
data.moveToFirst();
card = LoyaltyCard.toLoyaltyCard(data);
}
@@ -508,10 +530,8 @@ public class DBHelper extends SQLiteOpenHelper
return card;
}
public List<Group> getLoyaltyCardGroups(final int id)
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " +
public static List<Group> getLoyaltyCardGroups(SQLiteDatabase database, final int id) {
Cursor data = database.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " +
" LEFT JOIN " + LoyaltyCardDbIdsGroups.TABLE + " ig ON ig." + LoyaltyCardDbIdsGroups.groupID + " = g." + LoyaltyCardDbGroups.ID +
" where " + LoyaltyCardDbIdsGroups.cardID + "=?" +
" ORDER BY " + LoyaltyCardDbIdsGroups.groupID, withArgs(id));
@@ -534,12 +554,9 @@ public class DBHelper extends SQLiteOpenHelper
return groups;
}
public void setLoyaltyCardGroups(final int id, List<Group> groups)
{
SQLiteDatabase db = getWritableDatabase();
public static void setLoyaltyCardGroups(SQLiteDatabase database, final int id, List<Group> groups) {
// First delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
@@ -548,59 +565,67 @@ public class DBHelper extends SQLiteOpenHelper
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIdsGroups.cardID, id);
contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id);
db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
database.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
}
}
public void setLoyaltyCardGroups(final SQLiteDatabase db, final int id, List<Group> groups)
{
// First delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
// Then create entries for selected values
for (Group group : groups) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIdsGroups.cardID, id);
contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id);
db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
}
}
public boolean deleteLoyaltyCard(final int id)
{
SQLiteDatabase db = getWritableDatabase();
public static boolean deleteLoyaltyCard(SQLiteDatabase database, Context context, final int id) {
// Delete card
int rowsDeleted = db.delete(LoyaltyCardDbIds.TABLE,
int rowsDeleted = database.delete(LoyaltyCardDbIds.TABLE,
whereAttrs(LoyaltyCardDbIds.ID),
withArgs(id));
// And delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.cardID),
withArgs(id));
// Delete FTS table entries
db.delete(LoyaltyCardDbFTS.TABLE,
database.delete(LoyaltyCardDbFTS.TABLE,
whereAttrs(LoyaltyCardDbFTS.ID),
withArgs(id));
// Also wipe card images associated with this card
try {
Utils.saveCardImage(mContext, null, id, true);
Utils.saveCardImage(mContext, null, id, false);
} catch (FileNotFoundException e) {
e.printStackTrace();
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
try {
Utils.saveCardImage(context, null, id, imageLocationType);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return (rowsDeleted == 1);
}
public Cursor getLoyaltyCardCursor()
{
public static int getArchivedCardsCount(SQLiteDatabase database) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIds.TABLE,
whereAttrs(LoyaltyCardDbIds.ARCHIVE_STATUS), withArgs(1));
}
public static int getArchivedCardsCount(SQLiteDatabase database, final String groupName) {
Cursor data = database.rawQuery(
"select * from " + LoyaltyCardDbIds.TABLE + " c " +
" LEFT JOIN " + LoyaltyCardDbIdsGroups.TABLE + " cg " +
" ON c." + LoyaltyCardDbIds.ID + " = cg." + LoyaltyCardDbIdsGroups.cardID +
" where " + LoyaltyCardDbIds.ARCHIVE_STATUS + " = 1" +
" AND " + LoyaltyCardDbIdsGroups.groupID + "= ?",
withArgs(groupName)
);
int count = data.getCount();
data.close();
return count;
}
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database) {
// An empty string will match everything
return getLoyaltyCardCursor("");
return getLoyaltyCardCursor(database, LoyaltyCardArchiveFilter.All);
}
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, LoyaltyCardArchiveFilter archiveFilter) {
// An empty string will match everything
return getLoyaltyCardCursor(database, "", archiveFilter);
}
/**
@@ -609,9 +634,8 @@ public class DBHelper extends SQLiteOpenHelper
* @param filter
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(final String filter)
{
return getLoyaltyCardCursor(filter, null);
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, final String filter, LoyaltyCardArchiveFilter archiveFilter) {
return getLoyaltyCardCursor(database, filter, null, archiveFilter);
}
/**
@@ -621,9 +645,8 @@ public class DBHelper extends SQLiteOpenHelper
* @param group
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(final String filter, Group group)
{
return getLoyaltyCardCursor(filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending);
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, final String filter, Group group, LoyaltyCardArchiveFilter archiveFilter) {
return getLoyaltyCardCursor(database, filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending, archiveFilter);
}
/**
@@ -634,14 +657,12 @@ public class DBHelper extends SQLiteOpenHelper
* @param order
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction, LoyaltyCardArchiveFilter archiveFilter) {
StringBuilder groupFilter = new StringBuilder();
String limitString = "";
SQLiteDatabase db = getReadableDatabase();
if (group != null) {
List<Integer> allowedIds = getGroupCardIds(group._id);
List<Integer> allowedIds = getGroupCardIds(database, group._id);
// Empty group
if (!allowedIds.isEmpty()) {
@@ -659,18 +680,25 @@ public class DBHelper extends SQLiteOpenHelper
}
}
String archiveFilterString = "";
if (archiveFilter != LoyaltyCardArchiveFilter.All) {
archiveFilterString = " AND " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.ARCHIVE_STATUS + " = " + (archiveFilter.equals(LoyaltyCardArchiveFilter.Unarchived) ? 0 : 1);
}
String orderField = getFieldForOrder(order);
return db.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE +
return database.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE +
" JOIN " + LoyaltyCardDbFTS.TABLE +
" ON " + LoyaltyCardDbFTS.TABLE + "." + LoyaltyCardDbFTS.ID + " = " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.ID +
(filter.trim().isEmpty() ? " " : " AND " + LoyaltyCardDbFTS.TABLE + " MATCH ? ") +
groupFilter.toString() +
" ORDER BY " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.STAR_STATUS + " DESC, " +
archiveFilterString +
" ORDER BY " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.ARCHIVE_STATUS + " ASC, " +
LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.STAR_STATUS + " DESC, " +
" (CASE WHEN " + LoyaltyCardDbIds.TABLE + "." + orderField + " IS NULL THEN 1 ELSE 0 END), " +
LoyaltyCardDbIds.TABLE + "." + orderField + " COLLATE NOCASE " + getDbDirection(order, direction) + ", " +
LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC " +
limitString, filter.trim().isEmpty() ? null : new String[] { TextUtils.join("* ", filter.split(" ")) + '*' }, null);
limitString, filter.trim().isEmpty() ? null : new String[]{TextUtils.join("* ", filter.split(" ")) + '*'}, null);
}
/**
@@ -678,10 +706,8 @@ public class DBHelper extends SQLiteOpenHelper
*
* @return Integer
*/
public int getLoyaltyCardCount()
{
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIds.TABLE);
public static int getLoyaltyCardCount(SQLiteDatabase database) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIds.TABLE);
}
/**
@@ -689,42 +715,38 @@ public class DBHelper extends SQLiteOpenHelper
*
* @return Cursor
*/
public Cursor getGroupCursor()
{
SQLiteDatabase db = getReadableDatabase();
return db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
public static Cursor getGroupCursor(SQLiteDatabase database) {
return database.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
" ORDER BY " + LoyaltyCardDbGroups.ORDER + " ASC," + LoyaltyCardDbGroups.ID + " COLLATE NOCASE ASC", null, null);
}
public List<Group> getGroups() {
try(Cursor data = getGroupCursor()) {
List<Group> groups = new ArrayList<>();
public static List<Group> getGroups(SQLiteDatabase database) {
Cursor data = getGroupCursor(database);
if (!data.moveToFirst()) {
return groups;
}
groups.add(Group.toGroup(data));
while (data.moveToNext()) {
groups.add(Group.toGroup(data));
}
List<Group> groups = new ArrayList<>();
if (!data.moveToFirst()) {
data.close();
return groups;
}
groups.add(Group.toGroup(data));
while (data.moveToNext()) {
groups.add(Group.toGroup(data));
}
data.close();
return groups;
}
public void reorderGroups(final List<Group> groups)
{
public static void reorderGroups(SQLiteDatabase database, final List<Group> groups) {
Integer order = 0;
SQLiteDatabase db = getWritableDatabase();
for (Group group : groups)
{
for (Group group : groups) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ORDER, order);
db.update(LoyaltyCardDbGroups.TABLE, contentValues,
database.update(LoyaltyCardDbGroups.TABLE, contentValues,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(group._id));
@@ -732,15 +754,12 @@ public class DBHelper extends SQLiteOpenHelper
}
}
public Group getGroup(final String groupName)
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbGroups.TABLE, null,
public static Group getGroup(SQLiteDatabase database, final String groupName) {
Cursor data = database.query(LoyaltyCardDbGroups.TABLE, null,
whereAttrs(LoyaltyCardDbGroups.ID), withArgs(groupName), null, null, null);
Group group = null;
if(data.getCount() == 1)
{
if (data.getCount() == 1) {
data.moveToFirst();
group = Group.toGroup(data);
}
@@ -749,16 +768,12 @@ public class DBHelper extends SQLiteOpenHelper
return group;
}
public int getGroupCount()
{
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbGroups.TABLE);
public static int getGroupCount(SQLiteDatabase database) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbGroups.TABLE);
}
public List<Integer> getGroupCardIds(final String groupName)
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.query(LoyaltyCardDbIdsGroups.TABLE, withArgs(LoyaltyCardDbIdsGroups.cardID),
public static List<Integer> getGroupCardIds(SQLiteDatabase database, final String groupName) {
Cursor data = database.query(LoyaltyCardDbIdsGroups.TABLE, withArgs(LoyaltyCardDbIdsGroups.cardID),
whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName), null, null, null);
List<Integer> cardIds = new ArrayList<>();
@@ -777,104 +792,85 @@ public class DBHelper extends SQLiteOpenHelper
return cardIds;
}
public long insertGroup(final String name)
{
public static long insertGroup(SQLiteDatabase database, final String name) {
if (name.isEmpty()) return -1;
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, name);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
return db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount(database));
return database.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
}
public boolean insertGroup(final SQLiteDatabase db, final String name)
{
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, name);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
final long newId = db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
return newId != -1;
}
public boolean updateGroup(final String groupName, final String newName)
{
public static boolean updateGroup(SQLiteDatabase database, final String groupName, final String newName) {
if (newName.isEmpty()) return false;
boolean success = false;
SQLiteDatabase db = getWritableDatabase();
ContentValues groupContentValues = new ContentValues();
groupContentValues.put(LoyaltyCardDbGroups.ID, newName);
ContentValues lookupContentValues = new ContentValues();
lookupContentValues.put(LoyaltyCardDbIdsGroups.groupID, newName);
db.beginTransaction();
database.beginTransaction();
try {
// Update group name
int groupsChanged = db.update(LoyaltyCardDbGroups.TABLE, groupContentValues,
int groupsChanged = database.update(LoyaltyCardDbGroups.TABLE, groupContentValues,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(groupName));
// Also update lookup tables
db.update(LoyaltyCardDbIdsGroups.TABLE, lookupContentValues,
database.update(LoyaltyCardDbIdsGroups.TABLE, lookupContentValues,
whereAttrs(LoyaltyCardDbIdsGroups.groupID),
withArgs(groupName));
if (groupsChanged == 1) {
db.setTransactionSuccessful();
database.setTransactionSuccessful();
success = true;
}
} catch (SQLiteException e) {
} catch (SQLiteException ignored) {
} finally {
db.endTransaction();
database.endTransaction();
}
return success;
}
public boolean deleteGroup(final String groupName)
{
public static boolean deleteGroup(SQLiteDatabase database, final String groupName) {
boolean success = false;
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
database.beginTransaction();
try {
// Delete group
int groupsDeleted = db.delete(LoyaltyCardDbGroups.TABLE,
int groupsDeleted = database.delete(LoyaltyCardDbGroups.TABLE,
whereAttrs(LoyaltyCardDbGroups.ID),
withArgs(groupName));
// And delete lookup table entries associated with this group
db.delete(LoyaltyCardDbIdsGroups.TABLE,
database.delete(LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.groupID),
withArgs(groupName));
if (groupsDeleted == 1) {
db.setTransactionSuccessful();
database.setTransactionSuccessful();
success = true;
}
} finally {
db.endTransaction();
database.endTransaction();
}
// Reorder after delete to ensure no bad order IDs
reorderGroups(getGroups());
reorderGroups(database, getGroups(database));
return success;
}
public int getGroupCardCount(final String groupName)
{
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIdsGroups.TABLE,
public static int getGroupCardCount(SQLiteDatabase database, final String groupName) {
return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIdsGroups.TABLE,
whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName));
}
private String whereAttrs(String... attrs) {
static private String whereAttrs(String... attrs) {
if (attrs.length == 0) {
return null;
}
@@ -885,13 +881,13 @@ public class DBHelper extends SQLiteOpenHelper
return whereClause.toString();
}
private String[] withArgs(Object... object) {
static private String[] withArgs(Object... object) {
return Arrays.stream(object)
.map(String::valueOf)
.toArray(String[]::new);
}
private String getFieldForOrder(LoyaltyCardOrder order) {
private static String getFieldForOrder(LoyaltyCardOrder order) {
if (order == LoyaltyCardOrder.Alpha) {
return LoyaltyCardDbIds.STORE;
}
@@ -907,7 +903,7 @@ public class DBHelper extends SQLiteOpenHelper
throw new IllegalArgumentException("Unknown order " + order);
}
private String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
private static String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) {
if (order == LoyaltyCardOrder.LastUsed) {
// We want the default sorting to put the most recently used first
return direction == LoyaltyCardOrderDirection.Descending ? "ASC" : "DESC";

View File

@@ -5,15 +5,12 @@ package protect.card_locker;
* encountered with the format of data being
* imported or exported.
*/
public class FormatException extends Exception
{
public FormatException(String message)
{
public class FormatException extends Exception {
public FormatException(String message) {
super(message);
}
public FormatException(String message, Exception rootCause)
{
public FormatException(String message, Exception rootCause) {
super(message, rootCause);
}
}

View File

@@ -2,8 +2,9 @@ package protect.card_locker;
import android.database.Cursor;
public class Group
{
import androidx.annotation.Nullable;
public class Group {
public final String _id;
public final int order;
@@ -12,11 +13,28 @@ public class Group
this.order = order;
}
public static Group toGroup(Cursor cursor)
{
public static Group toGroup(Cursor cursor) {
String _id = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbGroups.ID));
int order = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbGroups.ORDER));
return new Group(_id, order);
}
@Override
public boolean equals(@Nullable Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof Group)) {
return false;
}
Group anotherGroup = (Group) obj;
return _id.equals(anotherGroup._id) && order == anotherGroup.order;
}
@Override
public int hashCode() {
String combined = _id + "_" + order;
return combined.hashCode();
}
}

View File

@@ -1,98 +1,100 @@
package protect.card_locker;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageButton;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.GroupLayoutBinding;
import protect.card_locker.preferences.Settings;
class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder>
{
Settings mSettings;
private Cursor mCursor;
private final Context mContext;
private final GroupCursorAdapter.GroupAdapterListener mListener;
DBHelper mDb;
public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder> {
public final Context mContext;
private final GroupAdapterListener mListener;
SQLiteDatabase mDatabase;
public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupCursorAdapter.GroupAdapterListener inputListener) {
super(inputCursor);
public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupAdapterListener inputListener) {
super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER);
setHasStableIds(true);
mSettings = new Settings(inputContext);
mContext = inputContext;
mListener = inputListener;
mDb = new DBHelper(inputContext);
mDatabase = new DBHelper(inputContext).getReadableDatabase();
swapCursor(mCursor);
}
@Override
public void swapCursor(Cursor inputCursor) {
super.swapCursor(inputCursor);
mCursor = inputCursor;
swapCursor(inputCursor);
}
@NonNull
@Override
public GroupCursorAdapter.GroupListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType)
{
View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.group_layout, inputParent, false);
return new GroupCursorAdapter.GroupListItemViewHolder(itemView);
public GroupCursorAdapter.GroupListItemViewHolder onCreateViewHolder(@NonNull ViewGroup inputParent, int inputViewType) {
return new GroupListItemViewHolder(
GroupLayoutBinding.inflate(
LayoutInflater.from(inputParent.getContext()),
inputParent,
false
)
);
}
public Cursor getCursor()
{
return mCursor;
}
public void onBindViewHolder(GroupCursorAdapter.GroupListItemViewHolder inputHolder, Cursor inputCursor) {
public void onBindViewHolder(GroupListItemViewHolder inputHolder, Cursor inputCursor) {
Group group = Group.toGroup(inputCursor);
inputHolder.mName.setText(group._id);
int groupCardCount = mDb.getGroupCardCount(group._id);
inputHolder.mCardCount.setText(mContext.getResources().getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount));
int groupCardCount = DBHelper.getGroupCardCount(mDatabase, group._id);
int archivedCardCount = DBHelper.getArchivedCardsCount(mDatabase, group._id);
inputHolder.mName.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
inputHolder.mCardCount.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
Resources resources = mContext.getResources();
String cardCountText;
if (archivedCardCount > 0) {
cardCountText = resources.getQuantityString(R.plurals.groupCardCountWithArchived, groupCardCount, groupCardCount, archivedCardCount);
} else {
cardCountText = resources.getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount);
}
inputHolder.mCardCount.setText(cardCountText);
applyClickEvents(inputHolder);
}
private void applyClickEvents(GroupListItemViewHolder inputHolder)
{
private void applyClickEvents(GroupListItemViewHolder inputHolder) {
inputHolder.mMoveDown.setOnClickListener(view -> mListener.onMoveDownButtonClicked(inputHolder.itemView));
inputHolder.mMoveUp.setOnClickListener(view -> mListener.onMoveUpButtonClicked(inputHolder.itemView));
inputHolder.mEdit.setOnClickListener(view -> mListener.onEditButtonClicked(inputHolder.itemView));
inputHolder.mDelete.setOnClickListener(view -> mListener.onDeleteButtonClicked(inputHolder.itemView));
}
public interface GroupAdapterListener
{
public interface GroupAdapterListener {
void onMoveDownButtonClicked(View view);
void onMoveUpButtonClicked(View view);
void onEditButtonClicked(View view);
void onDeleteButtonClicked(View view);
}
public class GroupListItemViewHolder extends RecyclerView.ViewHolder
{
public static class GroupListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mName, mCardCount;
public AppCompatImageButton mMoveUp, mMoveDown, mEdit, mDelete;
public Button mMoveUp, mMoveDown, mEdit, mDelete;
public GroupListItemViewHolder(View inputView) {
super(inputView);
mName = inputView.findViewById(R.id.name);
mCardCount = inputView.findViewById(R.id.cardCount);
mMoveUp = inputView.findViewById(R.id.moveUp);
mMoveDown = inputView.findViewById(R.id.moveDown);
mEdit = inputView.findViewById(R.id.edit);
mDelete = inputView.findViewById(R.id.delete);
public GroupListItemViewHolder(GroupLayoutBinding groupLayoutBinding) {
super(groupLayoutBinding.getRoot());
mName = groupLayoutBinding.name;
mCardCount = groupLayoutBinding.cardCount;
mMoveUp = groupLayoutBinding.moveUp;
mMoveDown = groupLayoutBinding.moveDown;
mEdit = groupLayoutBinding.edit;
mDelete = groupLayoutBinding.delete;
}
}
}

View File

@@ -0,0 +1,7 @@
package protect.card_locker;
public enum ImageLocationType {
front,
back,
icon
}

View File

@@ -6,75 +6,113 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.ImportExportActivityBinding;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
import protect.card_locker.importexport.ImportExportResultType;
public class ImportExportActivity extends CatimaAppCompatActivity
{
public class ImportExportActivity extends CatimaAppCompatActivity {
private ImportExportActivityBinding binding;
private static final String TAG = "Catima";
private static final int PERMISSIONS_EXTERNAL_STORAGE = 1;
private static final int CHOOSE_EXPORT_LOCATION = 2;
private static final int IMPORT = 3;
private ImportExportTask importExporter;
private String importAlertTitle;
private String importAlertMessage;
private DataFormat importDataFormat;
private String exportPassword;
private ActivityResultLauncher<Intent> fileCreateLauncher;
private ActivityResultLauncher<String> fileOpenLauncher;
private ActivityResultLauncher<Intent> filePickerLauncher;
final private TaskHandler mTasks = new TaskHandler();
@Override
protected void onCreate(Bundle savedInstanceState)
{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ImportExportActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.importExport);
setContentView(R.layout.import_export_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
enableToolbarBackButton();
Intent fileIntent = getIntent();
if (fileIntent != null && fileIntent.getType() != null) {
chooseImportType(false, fileIntent.getData());
}
// If the application does not have permissions to external
// storage, ask for it now
// would use ActivityResultContracts.CreateDocument() but mime type cannot be set
fileCreateLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent intent = result.getData();
if (intent == null) {
Log.e(TAG, "Activity returned NULL data");
return;
}
Uri uri = intent.getData();
if (uri == null) {
Log.e(TAG, "Activity returned NULL uri");
return;
}
try {
OutputStream writer = getContentResolver().openOutputStream(uri);
Log.e(TAG, "Starting file export with: " + result.toString());
startExport(writer, uri, exportPassword.toCharArray(), true);
} catch (IOException e) {
Log.e(TAG, "Failed to export file: " + result.toString(), e);
onExportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, result.toString()), uri);
}
if (ContextCompat.checkSelfPermission(ImportExportActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(ImportExportActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(ImportExportActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE},
PERMISSIONS_EXTERNAL_STORAGE);
}
});
fileOpenLauncher = registerForActivityResult(new ActivityResultContracts.GetContent(), result -> {
if (result == null) {
Log.e(TAG, "Activity returned NULL data");
return;
}
openFileForImport(result, null);
});
filePickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Intent intent = result.getData();
if (intent == null) {
Log.e(TAG, "Activity returned NULL data");
return;
}
Uri uri = intent.getData();
if (uri == null) {
Log.e(TAG, "Activity returned NULL uri");
return;
}
openFileForImport(intent.getData(), null);
});
// Check that there is a file manager available
final Intent intentCreateDocumentAction = new Intent(Intent.ACTION_CREATE_DOCUMENT);
@@ -82,46 +120,60 @@ public class ImportExportActivity extends CatimaAppCompatActivity
intentCreateDocumentAction.setType("application/zip");
intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "catima.zip");
Button exportButton = findViewById(R.id.exportButton);
exportButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
chooseFileWithIntent(intentCreateDocumentAction, CHOOSE_EXPORT_LOCATION);
}
Button exportButton = binding.exportButton;
exportButton.setOnClickListener(v -> {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ImportExportActivity.this);
builder.setTitle(R.string.exportPassword);
FrameLayout container = new FrameLayout(ImportExportActivity.this);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = 50;
params.rightMargin = 50;
final EditText input = new EditText(ImportExportActivity.this);
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
input.setLayoutParams(params);
input.setHint(R.string.exportPasswordHint);
container.addView(input);
builder.setView(container);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
exportPassword = input.getText().toString();
try {
fileCreateLauncher.launch(intentCreateDocumentAction);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedOpeningFileManager, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
});
builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel());
builder.show();
});
// Check that there is a file manager available
final Intent intentGetContentAction = new Intent(Intent.ACTION_GET_CONTENT);
intentGetContentAction.addCategory(Intent.CATEGORY_OPENABLE);
intentGetContentAction.setType("*/*");
Button importFilesystem = findViewById(R.id.importOptionFilesystemButton);
importFilesystem.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
chooseImportType(intentGetContentAction);
}
});
Button importFilesystem = binding.importOptionFilesystemButton;
importFilesystem.setOnClickListener(v -> chooseImportType(false, null));
// Check that there is an app that data can be imported from
final Intent intentPickAction = new Intent(Intent.ACTION_PICK);
Button importApplication = findViewById(R.id.importOptionApplicationButton);
importApplication.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
chooseImportType(intentPickAction);
}
});
Button importApplication = binding.importOptionApplicationButton;
importApplication.setOnClickListener(v -> chooseImportType(true, null));
}
private void chooseImportType(Intent baseIntent) {
private void openFileForImport(Uri uri, char[] password) {
try {
InputStream reader = getContentResolver().openInputStream(uri);
Log.e(TAG, "Starting file import with: " + uri.toString());
startImport(reader, uri, importDataFormat, password, true);
} catch (IOException e) {
Log.e(TAG, "Failed to import file: " + uri.toString(), e);
onImportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, e.toString()), uri, importDataFormat);
}
}
private void chooseImportType(boolean choosePicker,
@Nullable Uri fileData) {
List<CharSequence> betaImportOptions = new ArrayList<>();
betaImportOptions.add("Fidme");
betaImportOptions.add("Stocard");
@@ -135,7 +187,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity
importOptions.add(importOption);
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.chooseImportType)
.setItems(importOptions.toArray(new CharSequence[importOptions.size()]), (dialog, which) -> {
switch (which) {
@@ -173,28 +225,41 @@ public class ImportExportActivity extends CatimaAppCompatActivity
throw new IllegalArgumentException("Unknown DataFormat");
}
new AlertDialog.Builder(this)
if (fileData != null) {
openFileForImport(fileData, null);
return;
}
new MaterialAlertDialogBuilder(this)
.setTitle(importAlertTitle)
.setMessage(importAlertMessage)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
chooseFileWithIntent(baseIntent, IMPORT);
@Override
public void onClick(DialogInterface dialog, int which) {
try {
if (choosePicker) {
final Intent intentPickAction = new Intent(Intent.ACTION_PICK);
filePickerLauncher.launch(intentPickAction);
} else {
fileOpenLauncher.launch("*/*");
}
})
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedOpeningFileManager, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
})
.setNegativeButton(R.string.cancel, null)
.show();
});
builder.show();
}
private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password, final boolean closeWhenDone)
{
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener()
{
private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password, final boolean closeWhenDone) {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() {
@Override
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat)
{
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
onImportComplete(result, targetUri, dataFormat);
if (closeWhenDone) {
try {
@@ -208,13 +273,12 @@ public class ImportExportActivity extends CatimaAppCompatActivity
importExporter = new ImportExportTask(ImportExportActivity.this,
dataFormat, target, password, listener);
importExporter.execute();
mTasks.executeTask(TaskHandler.TYPE.IMPORT, importExporter);
}
private void startExport(final OutputStream target, final Uri targetUri, final boolean closeWhenDone)
{
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener()
{
private void startExport(final OutputStream target, final Uri targetUri, char[] password, final boolean closeWhenDone) {
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false);
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() {
@Override
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
onExportComplete(result, targetUri);
@@ -229,51 +293,22 @@ public class ImportExportActivity extends CatimaAppCompatActivity
};
importExporter = new ImportExportTask(ImportExportActivity.this,
DataFormat.Catima, target, listener);
importExporter.execute();
DataFormat.Catima, target, password, listener);
mTasks.executeTask(TaskHandler.TYPE.EXPORT, importExporter);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_EXTERNAL_STORAGE) {
// If request is cancelled, the result arrays are empty.
boolean success = grantResults.length > 0;
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
success = false;
}
}
if (!success) {
// External storage permission rejected, inform user that
// import/export is prevented
Toast.makeText(getApplicationContext(), R.string.noExternalStoragePermissionError,
Toast.LENGTH_LONG).show();
}
}
}
@Override
protected void onDestroy()
{
if(importExporter != null && importExporter.getStatus() != AsyncTask.Status.RUNNING)
{
importExporter.cancel(true);
}
protected void onDestroy() {
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false);
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == android.R.id.home)
{
if (id == android.R.id.home) {
finish();
return true;
}
@@ -282,7 +317,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity
}
private void retryWithPassword(DataFormat dataFormat, Uri uri) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.passwordRequired);
final EditText input = new EditText(this);
@@ -290,73 +325,58 @@ public class ImportExportActivity extends CatimaAppCompatActivity
builder.setView(input);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
activityResultParser(IMPORT, RESULT_OK, uri, input.getText().toString().toCharArray());
openFileForImport(uri, input.getText().toString().toCharArray());
});
builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel());
builder.show();
}
private String buildResultDialogMessage(ImportExportResult result, boolean isImport) {
int messageId;
if (result.resultType() == ImportExportResultType.Success) {
messageId = isImport ? R.string.importSuccessful : R.string.exportSuccessful;
} else {
messageId = isImport ? R.string.importFailed : R.string.exportFailed;
}
StringBuilder messageBuilder = new StringBuilder(getResources().getString(messageId));
if (result.developerDetails() != null) {
messageBuilder.append("\n\n");
messageBuilder.append(getResources().getString(R.string.include_if_asking_support));
messageBuilder.append("\n\n");
messageBuilder.append(result.developerDetails());
}
return messageBuilder.toString();
}
private void onImportComplete(ImportExportResult result, Uri path, DataFormat dataFormat) {
if (result == ImportExportResult.BadPassword) {
ImportExportResultType resultType = result.resultType();
if (resultType == ImportExportResultType.BadPassword) {
retryWithPassword(dataFormat, path);
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
int messageId;
if (result == ImportExportResult.Success)
{
builder.setTitle(R.string.importSuccessfulTitle);
messageId = R.string.importSuccessful;
}
else
{
builder.setTitle(R.string.importFailedTitle);
messageId = R.string.importFailed;
}
final String message = getResources().getString(messageId);
builder.setMessage(message);
builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.importSuccessfulTitle : R.string.importFailedTitle);
builder.setMessage(buildResultDialogMessage(result, true));
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
builder.create().show();
}
private void onExportComplete(ImportExportResult result, final Uri path)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
private void onExportComplete(ImportExportResult result, final Uri path) {
ImportExportResultType resultType = result.resultType();
int messageId;
if(result == ImportExportResult.Success)
{
builder.setTitle(R.string.exportSuccessfulTitle);
messageId = R.string.exportSuccessful;
}
else
{
builder.setTitle(R.string.exportFailedTitle);
messageId = R.string.exportFailed;
}
final String message = getResources().getString(messageId);
builder.setMessage(message);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.exportSuccessfulTitle : R.string.exportFailedTitle);
builder.setMessage(buildResultDialogMessage(result, false));
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
if(result == ImportExportResult.Success)
{
if (resultType == ImportExportResultType.Success) {
final CharSequence sendLabel = ImportExportActivity.this.getResources().getText(R.string.sendLabel);
builder.setPositiveButton(sendLabel, (dialog, which) -> {
@@ -376,92 +396,4 @@ public class ImportExportActivity extends CatimaAppCompatActivity
builder.create().show();
}
private void chooseFileWithIntent(Intent intent, int requestCode)
{
try
{
startActivityForResult(intent, requestCode);
}
catch (ActivityNotFoundException e)
{
Toast.makeText(getApplicationContext(), R.string.failedOpeningFileManager, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
private void activityResultParser(int requestCode, int resultCode, Uri uri, char[] password) {
if (resultCode != RESULT_OK)
{
Log.w(TAG, "Failed onActivityResult(), result=" + resultCode);
return;
}
if(uri == null)
{
Log.e(TAG, "Activity returned a NULL URI");
return;
}
try
{
if (requestCode == CHOOSE_EXPORT_LOCATION)
{
OutputStream writer;
if (uri.getScheme() != null)
{
writer = getContentResolver().openOutputStream(uri);
}
else
{
writer = new FileOutputStream(new File(uri.toString()));
}
Log.e(TAG, "Starting file export with: " + uri.toString());
startExport(writer, uri, true);
}
else
{
InputStream reader;
if(uri.getScheme() != null)
{
reader = getContentResolver().openInputStream(uri);
}
else
{
reader = new FileInputStream(new File(uri.toString()));
}
Log.e(TAG, "Starting file import with: " + uri.toString());
startImport(reader, uri, importDataFormat, password, true);
}
}
catch(IOException e)
{
Log.e(TAG, "Failed to import/export file: " + uri.toString(), e);
if (requestCode == CHOOSE_EXPORT_LOCATION)
{
onExportComplete(ImportExportResult.GenericFailure, uri);
}
else
{
onImportComplete(ImportExportResult.GenericFailure, uri, importDataFormat);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(data == null)
{
Log.e(TAG, "Activity returned NULL data");
return;
}
activityResultParser(requestCode, resultCode, data.getData(), null);
}
}

View File

@@ -4,7 +4,7 @@ import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.io.IOException;
@@ -13,13 +13,14 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import protect.card_locker.async.CompatCallable;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
import protect.card_locker.importexport.ImportExportResultType;
import protect.card_locker.importexport.MultiFormatExporter;
import protect.card_locker.importexport.MultiFormatImporter;
class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
{
public class ImportExportTask implements CompatCallable<ImportExportResult> {
private static final String TAG = "Catima";
private Activity activity;
@@ -35,14 +36,14 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
/**
* Constructor which will setup a task for exporting to the given file
*/
ImportExportTask(Activity activity, DataFormat format, OutputStream output,
TaskCompleteListener listener)
{
ImportExportTask(Activity activity, DataFormat format, OutputStream output, char[] password,
TaskCompleteListener listener) {
super();
this.activity = activity;
this.doImport = false;
this.format = format;
this.outputStream = output;
this.password = password;
this.listener = listener;
}
@@ -50,8 +51,7 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
* Constructor which will setup a task for importing from the given InputStream.
*/
ImportExportTask(Activity activity, DataFormat format, InputStream input, char[] password,
TaskCompleteListener listener)
{
TaskCompleteListener listener) {
super();
this.activity = activity;
this.doImport = true;
@@ -61,27 +61,23 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
this.listener = listener;
}
private ImportExportResult performImport(Context context, InputStream stream, DBHelper db, char[] password)
{
ImportExportResult importResult = MultiFormatImporter.importData(context, db, stream, format, password);
private ImportExportResult performImport(Context context, InputStream stream, SQLiteDatabase database, char[] password) {
ImportExportResult importResult = MultiFormatImporter.importData(context, database, stream, format, password);
Log.i(TAG, "Import result: " + importResult.name());
Log.i(TAG, "Import result: " + importResult);
return importResult;
}
private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db)
{
ImportExportResult result = ImportExportResult.GenericFailure;
private ImportExportResult performExport(Context context, OutputStream stream, SQLiteDatabase database, char[] password) {
ImportExportResult result;
try
{
try {
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
result = MultiFormatExporter.exportData(context, db, stream, format);
result = MultiFormatExporter.exportData(context, database, stream, format, password);
writer.close();
}
catch (IOException e)
{
} catch (IOException e) {
result = new ImportExportResult(ImportExportResultType.GenericFailure, e.toString());
Log.e(TAG, "Unable to export file", e);
}
@@ -90,55 +86,57 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
return result;
}
protected void onPreExecute()
{
public void onPreExecute() {
progress = new ProgressDialog(activity);
progress.setTitle(doImport ? R.string.importing : R.string.exporting);
progress.setOnDismissListener(new DialogInterface.OnDismissListener()
{
progress.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog)
{
ImportExportTask.this.cancel(true);
public void onDismiss(DialogInterface dialog) {
ImportExportTask.this.stop();
}
});
progress.show();
}
protected ImportExportResult doInBackground(Void... nothing)
{
final DBHelper db = new DBHelper(activity);
protected ImportExportResult doInBackground(Void... nothing) {
final SQLiteDatabase database = new DBHelper(activity).getWritableDatabase();
ImportExportResult result;
if(doImport)
{
result = performImport(activity.getApplicationContext(), inputStream, db, password);
}
else
{
result = performExport(activity.getApplicationContext(), outputStream, db);
if (doImport) {
result = performImport(activity.getApplicationContext(), inputStream, database, password);
} else {
result = performExport(activity.getApplicationContext(), outputStream, database, password);
}
database.close();
return result;
}
protected void onPostExecute(ImportExportResult result)
{
listener.onTaskComplete(result, format);
public void onPostExecute(Object castResult) {
listener.onTaskComplete((ImportExportResult) castResult, format);
progress.dismiss();
Log.i(TAG, (doImport ? "Import" : "Export") + " Complete");
}
protected void onCancelled()
{
protected void onCancelled() {
progress.dismiss();
Log.i(TAG, (doImport ? "Import" : "Export") + " Cancelled");
}
interface TaskCompleteListener
{
protected void stop() {
// Whelp
}
@Override
public ImportExportResult call() {
return doInBackground();
}
interface TaskCompleteListener {
void onTaskComplete(ImportExportResult result, DataFormat format);
}

View File

@@ -4,8 +4,6 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.google.zxing.BarcodeFormat;
import java.io.InvalidObjectException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
@@ -20,6 +18,7 @@ import java.util.List;
public class ImportURIHelper {
private static final String STORE = DBHelper.LoyaltyCardDbIds.STORE;
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 BALANCE = DBHelper.LoyaltyCardDbIds.BALANCE;
private static final String BALANCE_TYPE = DBHelper.LoyaltyCardDbIds.BALANCE_TYPE;
@@ -35,7 +34,7 @@ public class ImportURIHelper {
private final String shareMultipleText;
public ImportURIHelper(Context context) {
this.context = context;
this.context = context.getApplicationContext();
hosts[0] = context.getResources().getString(R.string.intent_import_card_from_url_host_catima_app);
paths[0] = context.getResources().getString(R.string.intent_import_card_from_url_path_prefix_catima_app);
hosts[1] = context.getResources().getString(R.string.intent_import_card_from_url_host_thelastproject);
@@ -57,13 +56,14 @@ public class ImportURIHelper {
}
public LoyaltyCard parse(Uri uri) throws InvalidObjectException {
if(!isImportUri(uri)) {
if (!isImportUri(uri)) {
throw new InvalidObjectException("Not an import URI");
}
try {
// These values are allowed to be null
CatimaBarcode barcodeType = null;
Date validFrom = null;
Date expiry = null;
BigDecimal balance = new BigDecimal("0");
Currency balanceType = null;
@@ -92,38 +92,38 @@ public class ImportURIHelper {
String note = kv.get(NOTE);
String cardId = kv.get(CARD_ID);
String barcodeId = kv.get(BARCODE_ID);
if (store == null || note == null || cardId == null) throw new InvalidObjectException("Not a valid import URI: " + uri.toString());
if (store == null || note == null || cardId == null)
throw new InvalidObjectException("Not a valid import URI: " + uri.toString());
String unparsedBarcodeType = kv.get(BARCODE_TYPE);
if(unparsedBarcodeType != null && !unparsedBarcodeType.equals(""))
{
if (unparsedBarcodeType != null && !unparsedBarcodeType.equals("")) {
barcodeType = CatimaBarcode.fromName(unparsedBarcodeType);
}
String unparsedBalance = kv.get(BALANCE);
if(unparsedBalance != null && !unparsedBalance.equals(""))
{
if (unparsedBalance != null && !unparsedBalance.equals("")) {
balance = new BigDecimal(unparsedBalance);
}
String unparsedBalanceType = kv.get(BALANCE_TYPE);
if (unparsedBalanceType != null && !unparsedBalanceType.equals(""))
{
if (unparsedBalanceType != null && !unparsedBalanceType.equals("")) {
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);
if(unparsedExpiry != null && !unparsedExpiry.equals(""))
{
if (unparsedExpiry != null && !unparsedExpiry.equals("")) {
expiry = new Date(Long.parseLong(unparsedExpiry));
}
String unparsedHeaderColor = kv.get(HEADER_COLOR);
if(unparsedHeaderColor != null)
{
if (unparsedHeaderColor != null) {
headerColor = Integer.parseInt(unparsedHeaderColor);
}
return new LoyaltyCard(-1, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime());
} catch (NullPointerException | NumberFormatException | UnsupportedEncodingException ex) {
return new LoyaltyCard(-1, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100, 0);
} catch (NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) {
throw new InvalidObjectException("Not a valid import URI");
}
}
@@ -155,18 +155,21 @@ public class ImportURIHelper {
if (loyaltyCard.balanceType != null) {
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) {
fragment = appendFragment(fragment, EXPIRY, String.valueOf(loyaltyCard.expiry.getTime()));
}
fragment = appendFragment(fragment, CARD_ID, loyaltyCard.cardId);
if(loyaltyCard.barcodeId != null) {
if (loyaltyCard.barcodeId != null) {
fragment = appendFragment(fragment, BARCODE_ID, loyaltyCard.barcodeId);
}
if(loyaltyCard.barcodeType != null) {
if (loyaltyCard.barcodeType != null) {
fragment = appendFragment(fragment, BARCODE_TYPE, loyaltyCard.barcodeType.name());
}
if(loyaltyCard.headerColor != null) {
if (loyaltyCard.headerColor != null) {
fragment = appendFragment(fragment, HEADER_COLOR, loyaltyCard.headerColor.toString());
}
// Star status will not be exported
@@ -203,6 +206,7 @@ public class ImportURIHelper {
sendIntent.setType("text/plain");
Intent shareIntent = Intent.createChooser(sendIntent, null);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(shareIntent);
}
}

View File

@@ -10,6 +10,9 @@ import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.util.Log;
import androidx.core.graphics.PaintCompat;
/**
* Original from https://github.com/andOTP/andOTP/blob/master/app/src/main/java/org/shadowice/flocke/andotp/Utilities/LetterBitmap.java
@@ -18,8 +21,7 @@ import android.text.TextPaint;
* alphabet or digit, if there is no letter or digit available, a default image
* is shown instead.
*/
class LetterBitmap
{
class LetterBitmap {
/**
* The number of available tile colors
@@ -37,59 +39,62 @@ class LetterBitmap
/**
* Constructor for <code>LetterTileProvider</code>
*
* @param context The {@link Context} to use
* @param displayName The name used to create the letter for the tile
* @param key The key used to generate the background color for the tile
* @param context The {@link Context} to use
* @param displayName The name used to create the letter for the tile
* @param key The key used to generate the background color for the tile
* @param tileLetterFontSize The font size used to display the letter
* @param width The desired width of the tile
* @param height The desired height of the tile
* @param backgroundColor (optional) color to use for background.
* @param textColor (optional) color to use for text.
* @param width The desired width of the tile
* @param height The desired height of the tile
* @param backgroundColor (optional) color to use for background.
* @param textColor (optional) color to use for text.
*/
public LetterBitmap(Context context, String displayName, String key, int tileLetterFontSize,
int width, int height, Integer backgroundColor, Integer textColor)
{
int width, int height, Integer backgroundColor, Integer textColor) {
TextPaint paint = new TextPaint();
paint.setTypeface(Typeface.create("sans-serif-light", Typeface.BOLD));
if(textColor != null)
{
if (textColor != null) {
paint.setColor(textColor);
}
else
{
} else {
paint.setColor(Color.WHITE);
}
paint.setTextAlign(Paint.Align.CENTER);
paint.setAntiAlias(true);
paint.setTextSize(tileLetterFontSize);
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
if(backgroundColor == null)
{
if (backgroundColor == null) {
mColor = getDefaultColor(context, key);
}
else
{
} else {
mColor = backgroundColor;
}
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
String firstChar = displayName.substring(0, 1);
String firstChar = displayName.substring(0, 1).toUpperCase();
int firstCharEnd = 2;
while (firstCharEnd <= displayName.length()) {
// Test for the longest render-able string
// But ignore containing only a-Z0-9 to not render things like ffi as a single character
String test = displayName.substring(0, firstCharEnd);
if (!isAlphabetical(test) && PaintCompat.hasGlyph(paint, test)) {
firstChar = test;
}
firstCharEnd++;
}
Log.d("LetterBitmap", "using sequence " + firstChar + " to render first char which has length " + firstChar.length());
final Canvas c = new Canvas();
c.setBitmap(mBitmap);
c.drawColor(mColor);
char [] firstCharArray = new char[1];
firstCharArray[0] = firstChar.toUpperCase().charAt(0);
paint.setTextSize(tileLetterFontSize);
// The bounds that enclose the letter
Rect bounds = new Rect();
paint.getTextBounds(firstChar, 0, firstChar.length(), bounds);
c.drawText(firstChar,
0, firstChar.length(),
width / 2.0f, (height - (bounds.bottom + bounds.top)) / 2.0f
, paint);
paint.getTextBounds(firstCharArray, 0, 1, bounds);
c.drawText(firstCharArray, 0, 1, width / 2.0f, height / 2.0f
+ (bounds.bottom - bounds.top) / 2.0f, paint);
}
/**
@@ -97,16 +102,14 @@ class LetterBitmap
* alphabet or digit, if there is no letter or digit available, a
* default image is shown instead
*/
public Bitmap getLetterTile()
{
public Bitmap getLetterTile() {
return mBitmap;
}
/**
* @return background color used for letter title.
*/
public int getBackgroundColor()
{
public int getBackgroundColor() {
return mColor;
}
@@ -115,20 +118,22 @@ class LetterBitmap
* @return A new or previously chosen color for <code>key</code> used as the
* tile background color
*/
private static int pickColor(String key, TypedArray colors)
{
private static int pickColor(String key, TypedArray colors) {
// String.hashCode() is not supposed to change across java versions, so
// this should guarantee the same key always maps to the same color
final int color = Math.abs(key.hashCode()) % NUM_OF_TILE_COLORS;
return colors.getColor(color, Color.BLACK);
}
private static boolean isAlphabetical(String string) {
return string.matches("[a-zA-Z0-9]*");
}
/**
* Determine the color which the letter tile will use if no default
* color is provided.
*/
public static int getDefaultColor(Context context, String key)
{
public static int getDefaultColor(Context context, String key) {
final Resources res = context.getResources();
TypedArray colors = res.obtainTypedArray(R.array.letter_tile_colors);

View File

@@ -14,6 +14,7 @@ public class LoyaltyCard implements Parcelable {
public final int id;
public final String store;
public final String note;
public final Date validFrom;
public final Date expiry;
public final BigDecimal balance;
public final Currency balanceType;
@@ -29,16 +30,20 @@ public class LoyaltyCard implements Parcelable {
public final Integer headerColor;
public final int starStatus;
public final int archiveStatus;
public final long lastUsed;
public int zoomLevel;
public LoyaltyCard(final int id, final String store, final String note, final Date expiry,
final BigDecimal balance, final Currency balanceType, final String cardId,
@Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType,
@Nullable final Integer headerColor, final int starStatus, final long lastUsed)
{
public LoyaltyCard(final int id, final String store, final String note, final Date validFrom,
final Date expiry, final BigDecimal balance, final Currency balanceType,
final String cardId, @Nullable final String barcodeId,
@Nullable final CatimaBarcode barcodeType,
@Nullable final Integer headerColor, final int starStatus,
final long lastUsed, final int zoomLevel, final int archiveStatus) {
this.id = id;
this.store = store;
this.note = note;
this.validFrom = validFrom;
this.expiry = expiry;
this.balance = balance;
this.balanceType = balanceType;
@@ -48,12 +53,16 @@ public class LoyaltyCard implements Parcelable {
this.headerColor = headerColor;
this.starStatus = starStatus;
this.lastUsed = lastUsed;
this.zoomLevel = zoomLevel;
this.archiveStatus = archiveStatus;
}
protected LoyaltyCard(Parcel in) {
id = in.readInt();
store = in.readString();
note = in.readString();
long tmpValidFrom = in.readLong();
validFrom = tmpValidFrom != -1 ? new Date(tmpValidFrom) : null;
long tmpExpiry = in.readLong();
expiry = tmpExpiry != -1 ? new Date(tmpExpiry) : null;
balance = (BigDecimal) in.readValue(BigDecimal.class.getClassLoader());
@@ -66,6 +75,8 @@ public class LoyaltyCard implements Parcelable {
headerColor = tmpHeaderColor != -1 ? tmpHeaderColor : null;
starStatus = in.readInt();
lastUsed = in.readLong();
zoomLevel = in.readInt();
archiveStatus = in.readInt();
}
@Override
@@ -73,6 +84,7 @@ public class LoyaltyCard implements Parcelable {
parcel.writeInt(id);
parcel.writeString(store);
parcel.writeString(note);
parcel.writeLong(validFrom != null ? validFrom.getTime() : -1);
parcel.writeLong(expiry != null ? expiry.getTime() : -1);
parcel.writeValue(balance);
parcel.writeValue(balanceType);
@@ -82,19 +94,23 @@ public class LoyaltyCard implements Parcelable {
parcel.writeInt(headerColor != null ? headerColor : -1);
parcel.writeInt(starStatus);
parcel.writeLong(lastUsed);
parcel.writeInt(zoomLevel);
parcel.writeInt(archiveStatus);
}
public static LoyaltyCard toLoyaltyCard(Cursor cursor)
{
public static LoyaltyCard toLoyaltyCard(Cursor cursor) {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
String store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE));
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));
BigDecimal balance = new BigDecimal(cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE)));
String cardId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID));
String barcodeId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ID));
int starred = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS));
long lastUsed = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.LAST_USED));
int zoomLevel = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ZOOM_LEVEL));
int archived = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS));
int barcodeTypeColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE);
int balanceTypeColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE);
@@ -102,30 +118,31 @@ public class LoyaltyCard implements Parcelable {
CatimaBarcode barcodeType = null;
Currency balanceType = null;
Date validFrom = null;
Date expiry = null;
Integer headerColor = null;
if (cursor.isNull(barcodeTypeColumn) == false)
{
if (cursor.isNull(barcodeTypeColumn) == false) {
barcodeType = CatimaBarcode.fromName(cursor.getString(barcodeTypeColumn));
}
if (cursor.isNull(balanceTypeColumn) == false)
{
if (cursor.isNull(balanceTypeColumn) == false) {
balanceType = Currency.getInstance(cursor.getString(balanceTypeColumn));
}
if(expiryLong > 0)
{
if (validFromLong > 0) {
validFrom = new Date(validFromLong);
}
if (expiryLong > 0) {
expiry = new Date(expiryLong);
}
if(cursor.isNull(headerColorColumn) == false)
{
if (cursor.isNull(headerColorColumn) == false) {
headerColor = cursor.getInt(headerColorColumn);
}
return new LoyaltyCard(id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred, lastUsed);
return new LoyaltyCard(id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred, lastUsed, zoomLevel, archived);
}
@Override

View File

@@ -1,37 +0,0 @@
package protect.card_locker;
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.content.Context;
import android.view.View;
public class LoyaltyCardAnimator {
private static AnimatorSet selectedViewIn, defaultViewOut, selectedViewOut, defaultViewIn;
public static void flipView(Context inputContext, final View inputSelectedView, final View inputDefaultView, boolean inputItemSelected) {
selectedViewIn = (AnimatorSet) AnimatorInflater.loadAnimator(inputContext, R.animator.flip_left_in);
defaultViewOut = (AnimatorSet) AnimatorInflater.loadAnimator(inputContext, R.animator.flip_right_out);
selectedViewOut = (AnimatorSet) AnimatorInflater.loadAnimator(inputContext, R.animator.flip_left_out);
defaultViewIn = (AnimatorSet) AnimatorInflater.loadAnimator(inputContext, R.animator.flip_right_in);
final AnimatorSet showFrontAnim = new AnimatorSet();
final AnimatorSet showBackAnim = new AnimatorSet();
selectedViewIn.setTarget(inputSelectedView);
defaultViewOut.setTarget(inputDefaultView);
showFrontAnim.playTogether(selectedViewIn, defaultViewOut);
selectedViewOut.setTarget(inputSelectedView);
defaultViewIn.setTarget(inputDefaultView);
showBackAnim.playTogether(defaultViewIn, selectedViewOut);
if (inputItemSelected) {
showFrontAnim.start();
} else {
showBackAnim.start();
}
}
}

View File

@@ -1,228 +1,204 @@
package protect.card_locker;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.util.SparseBooleanArray;
import android.util.TypedValue;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.color.MaterialColors;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import androidx.cardview.widget.CardView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.LoyaltyCardLayoutBinding;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder>
{
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder> {
private int mCurrentSelectedIndex = -1;
private Cursor mCursor;
Settings mSettings;
boolean mDarkModeEnabled;
private Context mContext;
private CardAdapterListener mListener;
private SparseBooleanArray mSelectedItems;
private SparseBooleanArray mAnimationItemsIndex;
public final Context mContext;
private final CardAdapterListener mListener;
protected SparseBooleanArray mSelectedItems;
protected SparseBooleanArray mAnimationItemsIndex;
private boolean mReverseAllAnimations = false;
private boolean mShowDetails;
public LoyaltyCardCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener)
{
super(inputCursor);
public LoyaltyCardCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener) {
super(inputCursor, DBHelper.LoyaltyCardDbIds.ID);
setHasStableIds(true);
mSettings = new Settings(inputContext);
mContext = inputContext;
mListener = inputListener;
mSelectedItems = new SparseBooleanArray();
mAnimationItemsIndex = new SparseBooleanArray();
mDarkModeEnabled = MainActivity.isDarkModeEnabled(inputContext);
mDarkModeEnabled = Utils.isDarkModeEnabled(inputContext);
swapCursor(mCursor);
refreshState();
swapCursor(inputCursor);
}
public void refreshState() {
// Retrieve user details preference
SharedPreferences cardDetailsPref = mContext.getSharedPreferences(
mContext.getString(R.string.sharedpreference_card_details),
Context.MODE_PRIVATE);
mShowDetails = cardDetailsPref.getBoolean(mContext.getString(R.string.sharedpreference_card_details_show), true);
}
public void showDetails(boolean show) {
mShowDetails = show;
notifyDataSetChanged();
// Store in Shared Preference to restore next adapter launch
SharedPreferences cardDetailsPref = mContext.getSharedPreferences(
mContext.getString(R.string.sharedpreference_card_details),
Context.MODE_PRIVATE);
SharedPreferences.Editor cardDetailsPrefEditor = cardDetailsPref.edit();
cardDetailsPrefEditor.putBoolean(mContext.getString(R.string.sharedpreference_card_details_show), show);
cardDetailsPrefEditor.apply();
}
public boolean showingDetails() {
return mShowDetails;
}
@NonNull
@Override
public void swapCursor(Cursor inputCursor) {
super.swapCursor(inputCursor);
mCursor = inputCursor;
public LoyaltyCardListItemViewHolder onCreateViewHolder(@NonNull ViewGroup inputParent, int inputViewType) {
LoyaltyCardLayoutBinding loyaltyCardLayoutBinding = LoyaltyCardLayoutBinding.inflate(
LayoutInflater.from(inputParent.getContext()),
inputParent,
false
);
return new LoyaltyCardListItemViewHolder(loyaltyCardLayoutBinding, mListener);
}
@Override
public LoyaltyCardListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType)
{
View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.loyalty_card_layout, inputParent, false);
return new LoyaltyCardListItemViewHolder(itemView);
}
public Cursor getCursor()
{
return mCursor;
public LoyaltyCard getCard(int position) {
mCursor.moveToPosition(position);
return LoyaltyCard.toLoyaltyCard(mCursor);
}
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
// Invisible until we want to show something more
inputHolder.mDivider.setVisibility(View.GONE);
if (mDarkModeEnabled) {
inputHolder.mStarIcon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
}
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor);
inputHolder.mStoreField.setText(loyaltyCard.store);
inputHolder.mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
if (!loyaltyCard.note.isEmpty()) {
inputHolder.mNoteField.setVisibility(View.VISIBLE);
inputHolder.mNoteField.setText(loyaltyCard.note);
inputHolder.mNoteField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
if (mShowDetails && !loyaltyCard.note.isEmpty()) {
inputHolder.setNoteField(loyaltyCard.note);
} else {
inputHolder.mNoteField.setVisibility(View.GONE);
inputHolder.setNoteField(null);
}
if (!loyaltyCard.balance.equals(new BigDecimal("0"))) {
inputHolder.mDivider.setVisibility(View.VISIBLE);
inputHolder.mBalanceField.setVisibility(View.VISIBLE);
if (mDarkModeEnabled) {
inputHolder.mBalanceField.getCompoundDrawables()[0].setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
}
inputHolder.mBalanceField.setText(Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType));
inputHolder.mBalanceField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
if (mShowDetails && !loyaltyCard.balance.equals(new BigDecimal("0"))) {
inputHolder.setExtraField(inputHolder.mBalanceField, Utils.formatBalance(mContext, loyaltyCard.balance, loyaltyCard.balanceType), null);
} else {
inputHolder.mBalanceField.setVisibility(View.GONE);
inputHolder.setExtraField(inputHolder.mBalanceField, null, null);
}
if (loyaltyCard.expiry != null) {
inputHolder.mDivider.setVisibility(View.VISIBLE);
inputHolder.mExpiryField.setVisibility(View.VISIBLE);
Drawable expiryIcon = inputHolder.mExpiryField.getCompoundDrawables()[0];
if (Utils.hasExpired(loyaltyCard.expiry)) {
expiryIcon.setColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP);
inputHolder.mExpiryField.setTextColor(Color.RED);
} else if (mDarkModeEnabled) {
expiryIcon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
}
inputHolder.mExpiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry));
inputHolder.mExpiryField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
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.mExpiryField.setVisibility(View.GONE);
inputHolder.setExtraField(inputHolder.mValidFromField, null, null);
}
inputHolder.mStarIcon.setVisibility(loyaltyCard.starStatus != 0 ? View.VISIBLE : View.GONE);
inputHolder.mCardIcon.setImageBitmap(Utils.generateIcon(mContext, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile());
if (mShowDetails && loyaltyCard.expiry != null) {
inputHolder.setExtraField(inputHolder.mExpiryField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry), Utils.hasExpired(loyaltyCard.expiry) ? Color.RED : null);
} else {
inputHolder.setExtraField(inputHolder.mExpiryField, null, null);
}
inputHolder.mCardIcon.setContentDescription(loyaltyCard.store);
Utils.setIconOrTextWithBackground(mContext, loyaltyCard, inputHolder.mCardIcon, inputHolder.mCardText);
inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : androidx.appcompat.R.attr.colorPrimary);
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
inputHolder.itemView.setActivated(mSelectedItems.get(inputCursor.getPosition(), false));
applyIconAnimation(inputHolder, inputCursor.getPosition());
applyClickEvents(inputHolder, inputCursor.getPosition());
// Force redraw to fix size not shrinking after data change
inputHolder.mRow.requestLayout();
}
private void applyClickEvents(LoyaltyCardListItemViewHolder inputHolder, final int inputPosition)
{
private void applyClickEvents(LoyaltyCardListItemViewHolder inputHolder, final int inputPosition) {
inputHolder.mRow.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition));
inputHolder.mInformationContainer.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition));
inputHolder.mRow.setOnLongClickListener(inputView -> {
mListener.onRowLongClicked(inputPosition);
inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
});
inputHolder.mInformationContainer.setOnLongClickListener(inputView -> {
mListener.onRowLongClicked(inputPosition);
inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
});
}
private void applyIconAnimation(LoyaltyCardListItemViewHolder inputHolder, int inputPosition)
{
if (mSelectedItems.get(inputPosition, false))
{
inputHolder.mThumbnailFrontContainer.setVisibility(View.GONE);
resetIconYAxis(inputHolder.mThumbnailBackContainer);
inputHolder.mThumbnailBackContainer.setVisibility(View.VISIBLE);
inputHolder.mThumbnailBackContainer.setAlpha(1);
if (mCurrentSelectedIndex == inputPosition)
{
LoyaltyCardAnimator.flipView(mContext, inputHolder.mThumbnailBackContainer, inputHolder.mThumbnailFrontContainer, true);
private boolean itemSelected(int inputPosition) {
return mSelectedItems.get(inputPosition, false);
}
private void applyIconAnimation(LoyaltyCardListItemViewHolder inputHolder, int inputPosition) {
if (itemSelected(inputPosition)) {
inputHolder.mTickIcon.setVisibility(View.VISIBLE);
if (mCurrentSelectedIndex == inputPosition) {
resetCurrentIndex();
}
}
else
{
inputHolder.mThumbnailBackContainer.setVisibility(View.GONE);
resetIconYAxis(inputHolder.mThumbnailFrontContainer);
inputHolder.mThumbnailFrontContainer.setVisibility(View.VISIBLE);
inputHolder.mThumbnailFrontContainer.setAlpha(1);
if ((mReverseAllAnimations && mAnimationItemsIndex.get(inputPosition, false)) || mCurrentSelectedIndex == inputPosition)
{
LoyaltyCardAnimator.flipView(mContext, inputHolder.mThumbnailBackContainer, inputHolder.mThumbnailFrontContainer, false);
} else {
inputHolder.mTickIcon.setVisibility(View.GONE);
if ((mReverseAllAnimations && mAnimationItemsIndex.get(inputPosition, false)) || mCurrentSelectedIndex == inputPosition) {
resetCurrentIndex();
}
}
}
private void resetIconYAxis(View inputView)
{
if (inputView.getRotationY() != 0)
{
inputView.setRotationY(0);
}
}
public void resetAnimationIndex()
{
mReverseAllAnimations = false;
mAnimationItemsIndex.clear();
}
public void toggleSelection(int inputPosition)
{
public void toggleSelection(int inputPosition) {
mCurrentSelectedIndex = inputPosition;
if (mSelectedItems.get(inputPosition, false))
{
if (mSelectedItems.get(inputPosition, false)) {
mSelectedItems.delete(inputPosition);
mAnimationItemsIndex.delete(inputPosition);
}
else
{
} else {
mSelectedItems.put(inputPosition, true);
mAnimationItemsIndex.put(inputPosition, true);
}
notifyDataSetChanged();
}
public void clearSelections()
{
public void clearSelections() {
mReverseAllAnimations = true;
mSelectedItems.clear();
notifyDataSetChanged();
}
public int getSelectedItemCount()
{
public int getSelectedItemCount() {
return mSelectedItems.size();
}
public ArrayList<LoyaltyCard> getSelectedItems()
{
public ArrayList<LoyaltyCard> getSelectedItems() {
ArrayList<LoyaltyCard> result = new ArrayList<>();
int i;
for(i = 0; i < mSelectedItems.size(); i++)
{
for (i = 0; i < mSelectedItems.size(); i++) {
mCursor.moveToPosition(mSelectedItems.keyAt(i));
result.add(LoyaltyCard.toLoyaltyCard(mCursor));
}
@@ -230,50 +206,142 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
return result;
}
private void resetCurrentIndex()
{
private void resetCurrentIndex() {
mCurrentSelectedIndex = -1;
}
public interface CardAdapterListener
{
public interface CardAdapterListener {
void onRowClicked(int inputPosition);
void onRowLongClicked(int inputPosition);
}
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener
{
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mStoreField, mNoteField, mBalanceField, mExpiryField;
public LinearLayout mInformationContainer;
public ImageView mCardIcon, mStarIcon;
public TextView mCardText, mNoteField, mBalanceField, mValidFromField, mExpiryField;
public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground;
public MaterialCardView mRow;
public ConstraintLayout mStar, mArchived;
public View mDivider;
public RelativeLayout mThumbnailFrontContainer, mThumbnailBackContainer;
public LoyaltyCardListItemViewHolder(View inputView)
{
super(inputView);
mRow = inputView.findViewById(R.id.row);
mDivider = inputView.findViewById(R.id.info_divider);
mThumbnailFrontContainer = inputView.findViewById(R.id.thumbnail_front);
mThumbnailBackContainer = inputView.findViewById(R.id.thumbnail_back);
mInformationContainer = inputView.findViewById(R.id.information_container);
mStoreField = inputView.findViewById(R.id.store);
mNoteField = inputView.findViewById(R.id.note);
mBalanceField = inputView.findViewById(R.id.balance);
mExpiryField = inputView.findViewById(R.id.expiry);
mCardIcon = inputView.findViewById(R.id.thumbnail);
mStarIcon = inputView.findViewById(R.id.star);
inputView.setOnLongClickListener(this);
private int mIconBackgroundColor;
protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) {
super(loyaltyCardLayoutBinding.getRoot());
View inputView = loyaltyCardLayoutBinding.getRoot();
mRow = loyaltyCardLayoutBinding.row;
mDivider = loyaltyCardLayoutBinding.infoDivider;
mNoteField = loyaltyCardLayoutBinding.note;
mBalanceField = loyaltyCardLayoutBinding.balance;
mValidFromField = loyaltyCardLayoutBinding.validFrom;
mExpiryField = loyaltyCardLayoutBinding.expiry;
mCardIcon = loyaltyCardLayoutBinding.thumbnail;
mCardText = loyaltyCardLayoutBinding.thumbnailText;
mStar = loyaltyCardLayoutBinding.star;
mStarBackground = loyaltyCardLayoutBinding.starBackground;
mStarBorder = loyaltyCardLayoutBinding.starBorder;
mArchived = loyaltyCardLayoutBinding.archivedIcon;
mArchivedBackground = loyaltyCardLayoutBinding.archiveBackground;
mTickIcon = loyaltyCardLayoutBinding.selectedThumbnail;
inputView.setOnLongClickListener(view -> {
inputListener.onRowClicked(getAdapterPosition());
inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
});
}
@Override
public boolean onLongClick(View inputView)
{
mListener.onRowLongClicked(getAdapterPosition());
inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
private void setExtraField(TextView field, String text, Integer color) {
// If text is null, hide the field
// If iconColor is null, use the default text and icon color based on theme
if (text == null) {
field.setVisibility(View.GONE);
field.requestLayout();
return;
}
field.setVisibility(View.VISIBLE);
field.setText(text);
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)));
mDivider.setVisibility(View.VISIBLE);
field.setVisibility(View.VISIBLE);
Drawable icon = field.getCompoundDrawables()[0];
if (icon != null) {
icon.mutate();
field.setCompoundDrawablesRelative(icon, null, null, null);
if (color != null) {
icon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_ATOP));
} else {
icon.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(mDarkModeEnabled ? Color.WHITE : Color.BLACK, BlendModeCompat.SRC_ATOP));
}
}
field.requestLayout();
}
public void setNoteField(String text) {
if (text == null) {
mNoteField.setVisibility(View.GONE);
} else {
mNoteField.setVisibility(View.VISIBLE);
mNoteField.setText(text);
}
mNoteField.requestLayout();
}
public void toggleCardStateIcon(boolean enableStar, boolean enableArchive, boolean colorByTheme) {
/* the below code does not work in android 5! hence the change of drawable instead
boolean needDarkForeground = Utils.needsDarkForeground(mIconBackgroundColor);
Drawable borderDrawable = mStarBorder.getDrawable().mutate();
Drawable backgroundDrawable = mStarBackground.getDrawable().mutate();
DrawableCompat.setTint(borderDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
DrawableCompat.setTint(backgroundDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
mStarBorder.setImageDrawable(borderDrawable);
mStarBackground.setImageDrawable(backgroundDrawable);
*/
boolean dark = Utils.needsDarkForeground(mIconBackgroundColor);
if (colorByTheme) {
dark = !mDarkModeEnabled;
}
if (dark) {
mStarBorder.setImageResource(R.drawable.ic_unstarred_white);
mStarBackground.setImageResource(R.drawable.ic_starred_black);
mArchivedBackground.setImageResource(R.drawable.ic_baseline_archive_24_black);
} else {
mStarBorder.setImageResource(R.drawable.ic_unstarred_black);
mStarBackground.setImageResource(R.drawable.ic_starred_white);
mArchivedBackground.setImageResource(R.drawable.ic_baseline_archive_24);
}
if (enableStar) {
mStar.setVisibility(View.VISIBLE);
} else{
mStar.setVisibility(View.GONE);
}
if (enableArchive) {
mArchived.setVisibility(View.VISIBLE);
} else{
mArchived.setVisibility(View.GONE);
}
mStarBorder.invalidate();
mStarBackground.invalidate();
mArchivedBackground.invalidate();
}
public void setIconBackgroundColor(int color) {
mIconBackgroundColor = color;
mCardIcon.setBackgroundColor(color);
}
}
}
public int dpToPx(int dp, Context mContext) {
Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics());
return px;
}
}

View File

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,7 @@ public enum LoyaltyCardField {
id,
store,
note,
validFrom,
expiry,
balance,
balanceType,
@@ -11,5 +12,6 @@ public enum LoyaltyCardField {
barcodeId,
barcodeType,
headerColor,
starStatus
starStatus,
archiveStatus
}

View File

@@ -1,14 +1,17 @@
package protect.card_locker;
import android.app.Application;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.multidex.MultiDexApplication;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardLockerApplication extends MultiDexApplication {
public class LoyaltyCardLockerApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Settings settings = new Settings(getApplicationContext());
Settings settings = new Settings(this);
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
}
}

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,240 @@
package protect.card_locker;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.databinding.ActivityManageGroupBinding;
public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener {
private ActivityManageGroupBinding binding;
private SQLiteDatabase mDatabase;
private ManageGroupCursorAdapter mAdapter;
private final String SAVE_INSTANCE_ADAPTER_STATE = "adapterState";
private final String SAVE_INSTANCE_CURRENT_GROUP_NAME = "currentGroupName";
protected Group mGroup = null;
private RecyclerView mCardList;
private TextView noGroupCardsText;
private EditText mGroupNameText;
private boolean mGroupNameNotInUse;
@Override
protected void onCreate(Bundle inputSavedInstanceState) {
super.onCreate(inputSavedInstanceState);
binding = ActivityManageGroupBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
mDatabase = new DBHelper(this).getWritableDatabase();
noGroupCardsText = binding.include.noGroupCardsText;
mCardList = binding.include.list;
FloatingActionButton saveButton = binding.fabSave;
mGroupNameText = binding.editTextGroupName;
mGroupNameText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
mGroupNameNotInUse = true;
mGroupNameText.setError(null);
String currentGroupName = mGroupNameText.getText().toString().trim();
if (currentGroupName.length() == 0) {
mGroupNameText.setError(getResources().getText(R.string.group_name_is_empty));
return;
}
if (!mGroup._id.equals(currentGroupName)) {
if (DBHelper.getGroup(mDatabase, currentGroupName) != null) {
mGroupNameNotInUse = false;
mGroupNameText.setError(getResources().getText(R.string.group_name_already_in_use));
} else {
mGroupNameNotInUse = true;
}
}
}
});
Intent intent = getIntent();
String groupId = intent.getStringExtra("group");
if (groupId == null) {
throw (new IllegalArgumentException("this activity expects a group loaded into it's intent"));
}
Log.d("groupId", "groupId: " + groupId);
mGroup = DBHelper.getGroup(mDatabase, groupId);
if (mGroup == null) {
throw (new IllegalArgumentException("cannot load group " + groupId + " from database"));
}
mGroupNameText.setText(mGroup._id);
setTitle(getString(R.string.editGroup, mGroup._id));
mAdapter = new ManageGroupCursorAdapter(this, null, this, mGroup);
mCardList.setAdapter(mAdapter);
registerForContextMenu(mCardList);
if (inputSavedInstanceState != null) {
mAdapter.importInGroupState(integerArrayToAdapterState(inputSavedInstanceState.getIntegerArrayList(SAVE_INSTANCE_ADAPTER_STATE)));
mGroupNameText.setText(inputSavedInstanceState.getString(SAVE_INSTANCE_CURRENT_GROUP_NAME));
}
enableToolbarBackButton();
saveButton.setOnClickListener(v -> {
String currentGroupName = mGroupNameText.getText().toString().trim();
if (!currentGroupName.equals(mGroup._id)) {
if (currentGroupName.length() == 0) {
Toast.makeText(getApplicationContext(), R.string.group_name_is_empty, Toast.LENGTH_SHORT).show();
return;
}
if (!mGroupNameNotInUse) {
Toast.makeText(getApplicationContext(), R.string.group_name_already_in_use, Toast.LENGTH_SHORT).show();
return;
}
}
mAdapter.commitToDatabase();
if (!currentGroupName.equals(mGroup._id)) {
DBHelper.updateGroup(mDatabase, mGroup._id, currentGroupName);
}
Toast.makeText(getApplicationContext(), R.string.group_updated, Toast.LENGTH_SHORT).show();
finish();
});
// this setText is here because content_main.xml is reused from main activity
noGroupCardsText.setText(getResources().getText(R.string.noGiftCardsGroup));
updateLoyaltyCardList();
}
private ArrayList<Integer> adapterStateToIntegerArray(HashMap<Integer, Boolean> adapterState) {
ArrayList<Integer> ret = new ArrayList<>(adapterState.size() * 2);
for (Map.Entry<Integer, Boolean> entry : adapterState.entrySet()) {
ret.add(entry.getKey());
ret.add(entry.getValue() ? 1 : 0);
}
return ret;
}
private HashMap<Integer, Boolean> integerArrayToAdapterState(ArrayList<Integer> in) {
HashMap<Integer, Boolean> ret = new HashMap<>();
if (in.size() % 2 != 0) {
throw (new RuntimeException("failed restoring adapterState from integer array list"));
}
for (int i = 0; i < in.size(); i += 2) {
ret.put(in.get(i), in.get(i + 1) == 1);
}
return ret;
}
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
getMenuInflater().inflate(R.menu.card_details_menu, inputMenu);
Utils.updateMenuCardDetailsButtonState(inputMenu.findItem(R.id.action_unfold), mAdapter.showingDetails());
return super.onCreateOptionsMenu(inputMenu);
}
@Override
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == R.id.action_unfold) {
mAdapter.showDetails(!mAdapter.showingDetails());
invalidateOptionsMenu();
return true;
}
return super.onOptionsItemSelected(inputItem);
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putIntegerArrayList(SAVE_INSTANCE_ADAPTER_STATE, adapterStateToIntegerArray(mAdapter.exportInGroupState()));
outState.putString(SAVE_INSTANCE_CURRENT_GROUP_NAME, mGroupNameText.getText().toString());
}
private void updateLoyaltyCardList() {
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase));
if (mAdapter.getItemCount() == 0) {
mCardList.setVisibility(View.GONE);
noGroupCardsText.setVisibility(View.VISIBLE);
} else {
mCardList.setVisibility(View.VISIBLE);
noGroupCardsText.setVisibility(View.GONE);
}
}
private void leaveWithoutSaving() {
if (hasChanged()) {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ManageGroupActivity.this);
builder.setTitle(R.string.leaveWithoutSaveTitle);
builder.setMessage(R.string.leaveWithoutSaveConfirmation);
builder.setPositiveButton(R.string.confirm, (dialog, which) -> finish());
builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
} else {
finish();
}
}
@Override
public void onBackPressed() {
leaveWithoutSaving();
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
private boolean hasChanged() {
return mAdapter.hasChanged() || !mGroup._id.equals(mGroupNameText.getText().toString().trim());
}
@Override
public void onRowLongClicked(int inputPosition) {
mAdapter.toggleSelection(inputPosition);
}
@Override
public void onRowClicked(int inputPosition) {
mAdapter.toggleSelection(inputPosition);
}
}

View File

@@ -0,0 +1,109 @@
package protect.card_locker;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
private HashMap<Integer, Integer> mIndexCardMap;
private HashMap<Integer, Boolean> mInGroupOverlay;
private HashMap<Integer, Boolean> mIsLoyaltyCardInGroupCache;
private HashMap<Integer, List<Group>> mGetGroupCache;
final private Group mGroup;
final private SQLiteDatabase mDatabase;
public ManageGroupCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener, Group group) {
super(inputContext, inputCursor, inputListener);
mGroup = new Group(group._id, group.order);
mInGroupOverlay = new HashMap<>();
mDatabase = new DBHelper(inputContext).getWritableDatabase();
}
@Override
public void swapCursor(Cursor inputCursor) {
super.swapCursor(inputCursor);
mIndexCardMap = new HashMap<>();
mIsLoyaltyCardInGroupCache = new HashMap<>();
mGetGroupCache = new HashMap<>();
}
@Override
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor);
Boolean overlayValue = mInGroupOverlay.get(loyaltyCard.id);
if ((overlayValue != null ? overlayValue : isLoyaltyCardInGroup(loyaltyCard.id))) {
mAnimationItemsIndex.put(inputCursor.getPosition(), true);
mSelectedItems.put(inputCursor.getPosition(), true);
}
mIndexCardMap.put(inputCursor.getPosition(), loyaltyCard.id);
super.onBindViewHolder(inputHolder, inputCursor);
}
private List<Group> getGroups(int cardId) {
List<Group> cache = mGetGroupCache.get(cardId);
if (cache != null) {
return cache;
}
List<Group> groups = DBHelper.getLoyaltyCardGroups(mDatabase, cardId);
mGetGroupCache.put(cardId, groups);
return groups;
}
private boolean isLoyaltyCardInGroup(int cardId) {
Boolean cache = mIsLoyaltyCardInGroupCache.get(cardId);
if (cache != null) {
return cache;
}
List<Group> groups = getGroups(cardId);
if (groups.contains(mGroup)) {
mIsLoyaltyCardInGroupCache.put(cardId, true);
return true;
}
mIsLoyaltyCardInGroupCache.put(cardId, false);
return false;
}
@Override
public void toggleSelection(int inputPosition) {
super.toggleSelection(inputPosition);
Integer cardId = mIndexCardMap.get(inputPosition);
if (cardId == null) {
throw (new RuntimeException("cardId should not be null here"));
}
Boolean overlayValue = mInGroupOverlay.get(cardId);
if (overlayValue == null) {
mInGroupOverlay.put(cardId, !isLoyaltyCardInGroup(cardId));
} else {
mInGroupOverlay.remove(cardId);
}
}
public boolean hasChanged() {
return mInGroupOverlay.size() > 0;
}
public void commitToDatabase() {
for (Map.Entry<Integer, Boolean> entry : mInGroupOverlay.entrySet()) {
int cardId = entry.getKey();
List<Group> groups = getGroups(cardId);
if (entry.getValue()) {
groups.add(mGroup);
} else {
groups.remove(mGroup);
}
DBHelper.setLoyaltyCardGroups(mDatabase, cardId, groups);
}
}
public void importInGroupState(HashMap<Integer, Boolean> cardIdInGroupMap) {
mInGroupOverlay = new HashMap<>(cardIdInGroupMap);
}
public HashMap<Integer, Boolean> exportInGroupState() {
return new HashMap<>(mInGroupOverlay);
}
}

View File

@@ -1,15 +1,21 @@
package protect.card_locker;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;
@@ -21,40 +27,40 @@ import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener
{
import protect.card_locker.databinding.ManageGroupsActivityBinding;
public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener {
private ManageGroupsActivityBinding binding;
private static final String TAG = "Catima";
private final DBHelper mDb = new DBHelper(this);
private SQLiteDatabase mDatabase;
private TextView mHelpText;
private RecyclerView mGroupList;
GroupCursorAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ManageGroupsActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.groups);
setContentView(R.layout.manage_groups_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
mDatabase = new DBHelper(this).getWritableDatabase();
}
@Override
protected void onResume() {
super.onResume();
FloatingActionButton addButton = findViewById(R.id.fabAdd);
FloatingActionButton addButton = binding.fabAdd;
addButton.setOnClickListener(v -> createGroup());
addButton.bringToFront();
mGroupList = findViewById(R.id.list);
mHelpText = findViewById(R.id.helpText);
mGroupList = binding.include.list;
mHelpText = binding.include.helpText;
// Init group list
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
@@ -72,11 +78,10 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
super.onBackPressed();
}
private void updateGroupList()
{
mAdapter.swapCursor(mDb.getGroupCursor());
private void updateGroupList() {
mAdapter.swapCursor(DBHelper.getGroupCursor(mDatabase));
if (mDb.getGroupCount() == 0) {
if (DBHelper.getGroupCount(mDatabase) == 0) {
mGroupList.setVisibility(View.GONE);
mHelpText.setVisibility(View.VISIBLE);
@@ -87,8 +92,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
mHelpText.setVisibility(View.GONE);
}
private void invalidateHomescreenActiveTab()
{
private void invalidateHomescreenActiveTab() {
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
Context.MODE_PRIVATE);
@@ -98,8 +102,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
@@ -109,15 +112,60 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
return super.onOptionsItemSelected(item);
}
private void setGroupNameError(EditText input) {
String string = sanitizeAddGroupNameField(input.getText());
if (string.length() == 0) {
input.setError(getString(R.string.group_name_is_empty));
return;
}
if (DBHelper.getGroup(mDatabase, string) != null) {
input.setError(getString(R.string.group_name_already_in_use));
return;
}
input.setError(null);
}
private String sanitizeAddGroupNameField(CharSequence s) {
return s.toString().trim();
}
private void createGroup() {
AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.AlertDialogTheme);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.enter_group_name);
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
input.addTextChangedListener(new SimpleTextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
setGroupNameError(input);
}
});
setGroupNameError(input);
// Add spacing to EditText
FrameLayout container = new FrameLayout(this);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
params.leftMargin = 50;
params.rightMargin = 50;
input.setLayoutParams(params);
container.addView(input);
builder.setView(container);
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
mDb.insertGroup(input.getText().toString());
CharSequence error = input.getError();
if (error != null) {
Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
return;
}
DBHelper.insertGroup(mDatabase, sanitizeAddGroupNameField(input.getText()));
updateGroupList();
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
@@ -133,10 +181,10 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
}
private void moveGroup(View view, boolean up) {
List<Group> groups = mDb.getGroups();
List<Group> groups = DBHelper.getGroups(mDatabase);
final String groupName = getGroupName(view);
int currentIndex = mDb.getGroup(groupName).order;
int currentIndex = DBHelper.getGroup(mDatabase, groupName).order;
int newIndex;
// Reinsert group in correct position
@@ -155,7 +203,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
groups.add(newIndex, group);
// Update database
mDb.reorderGroups(groups);
DBHelper.reorderGroups(mDatabase, groups);
// Update UI
updateGroupList();
@@ -176,37 +224,21 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
@Override
public void onEditButtonClicked(View view) {
final String groupName = getGroupName(view);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.enter_group_name);
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
input.setText(groupName);
builder.setView(input);
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
String newGroupName = input.getText().toString();
mDb.updateGroup(groupName, newGroupName);
updateGroupList();
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
AlertDialog dialog = builder.create();
dialog.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
input.requestFocus();
Intent intent = new Intent(this, ManageGroupActivity.class);
intent.putExtra("group", getGroupName(view));
startActivity(intent);
}
@Override
public void onDeleteButtonClicked(View view) {
final String groupName = getGroupName(view);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.deleteConfirmationGroup);
builder.setMessage(groupName);
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
mDb.deleteGroup(groupName);
DBHelper.deleteGroup(mDatabase, groupName);
updateGroupList();
// Delete may change ordering, so invalidate
invalidateHomescreenActiveTab();

View File

@@ -0,0 +1,29 @@
package protect.card_locker;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class OpenWebLinkHandler {
private static final String TAG = "Catima";
public void openBrowser(AppCompatActivity activity, String url) {
if (url == null) {
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
try {
activity.startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(activity, R.string.failedToOpenUrl, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
}

View File

@@ -0,0 +1,94 @@
package protect.card_locker;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class PermissionUtils {
/**
* Check if storage read permission is needed.
*
* This is only necessary on Android 6.0 (Marshmallow) and below. See
* https://github.com/CatimaLoyalty/Android/issues/979 for more info.
*
* @param activity
* @return
*/
private static boolean needsStorageReadPermission(Activity activity) {
// Testing showed this permission wasn't needed for anything Catima did past Marshmallow
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return false;
}
return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED;
}
/**
* Check if camera permission is needed.
*
* @param activity
* @return
*/
public static boolean needsCameraPermission(Activity activity) {
// Android only introduced the runtime permission system in Marshmallow (Android 6.0)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return false;
}
return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED;
}
/**
* Call onRequestPermissionsResult after storage read permission was granted.
* Mocks a successful grant if a grant is not necessary.
*
* @param activity
* @param requestCode
*/
public static void requestStorageReadPermission(CatimaAppCompatActivity activity, int requestCode) {
String[] permissions = new String[]{ android.Manifest.permission.READ_EXTERNAL_STORAGE };
int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
if (needsStorageReadPermission(activity)) {
ActivityCompat.requestPermissions(activity, permissions, requestCode);
} else {
// FIXME: This points to onMockedRequestPermissionResult instead of to
// onRequestPermissionResult because onRequestPermissionResult was only introduced in
// Android 6.0 (SDK 23) and we and to support Android 5.0 (SDK 21) too.
//
// When minSdk becomes 23, this should point to onRequestPermissionResult directly and
// the activity input variable should be changed from CatimaAppCompatActivity to
// Activity.
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
}
}
/**
* Call onRequestPermissionsResult after camera permission was granted.
* Mocks a successful grant if a grant is not necessary.
*
* @param activity
* @param requestCode
*/
public static void requestCameraPermission(CatimaAppCompatActivity activity, int requestCode) {
String[] permissions = new String[]{ Manifest.permission.CAMERA };
int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
if (needsCameraPermission(activity)) {
ActivityCompat.requestPermissions(activity, permissions, requestCode);
} else {
// FIXME: This points to onMockedRequestPermissionResult instead of to
// onRequestPermissionResult because onRequestPermissionResult was only introduced in
// Android 6.0 (SDK 23) and we and to support Android 5.0 (SDK 21) too.
//
// When minSdk becomes 23, this should point to onRequestPermissionResult directly and
// the activity input variable should be changed from CatimaAppCompatActivity to
// Activity.
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
}
}
}

View File

@@ -1,16 +1,30 @@
package protect.card_locker;
import android.Manifest;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import com.google.zxing.ResultPoint;
import com.google.zxing.client.android.Intents;
import com.journeyapps.barcodescanner.BarcodeCallback;
@@ -20,18 +34,26 @@ import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import java.util.List;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;
import protect.card_locker.databinding.CustomBarcodeScannerBinding;
import protect.card_locker.databinding.ScanActivityBinding;
/**
* Custom Scannner Activity extending from Activity to display a custom layout form scanner view.
*
* <p>
* Based on https://github.com/journeyapps/zxing-android-embedded/blob/0fdfbce9fb3285e985bad9971c5f7c0a7a334e7b/sample/src/main/java/example/zxing/CustomScannerActivity.java
* originally licensed under Apache 2.0
*/
public class ScanActivity extends CatimaAppCompatActivity {
private ScanActivityBinding binding;
private CustomBarcodeScannerBinding customBarcodeScannerBinding;
private static final String TAG = "Catima";
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
private static final int COMPAT_SCALE_FACTOR_DIP = 320;
private static final int PERMISSION_SCAN_ADD_FROM_IMAGE = 100;
private CaptureManager capture;
private DecoratedBarcodeView barcodeScannerView;
@@ -39,6 +61,10 @@ public class ScanActivity extends CatimaAppCompatActivity {
private String addGroup;
private boolean torch = false;
private ActivityResultLauncher<Intent> manualAddLauncher;
// can't use the pre-made contract because that launches the file manager for image type instead of gallery
private ActivityResultLauncher<Intent> photoPickerLauncher;
private void extractIntentFields(Intent intent) {
final Bundle b = intent.getExtras();
cardId = b != null ? b.getString(LoyaltyCardEditActivity.BUNDLE_CARDID) : null;
@@ -49,22 +75,22 @@ public class ScanActivity extends CatimaAppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ScanActivityBinding.inflate(getLayoutInflater());
customBarcodeScannerBinding = CustomBarcodeScannerBinding.bind(binding.zxingBarcodeScanner);
setTitle(R.string.scanCardBarcode);
setContentView(R.layout.scan_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
extractIntentFields(getIntent());
findViewById(R.id.add_from_image).setOnClickListener(this::addFromImage);
findViewById(R.id.add_manually).setOnClickListener(this::addManually);
manualAddLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.SELECT_BARCODE_REQUEST, result.getResultCode(), result.getData()));
photoPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_IMAGE_FILE, result.getResultCode(), result.getData()));
customBarcodeScannerBinding.addFromImage.setOnClickListener(this::addFromImage);
customBarcodeScannerBinding.addManually.setOnClickListener(this::addManually);
barcodeScannerView = findViewById(R.id.zxing_barcode_scanner);
barcodeScannerView = binding.zxingBarcodeScanner;
// Even though we do the actual decoding with the barcodeScannerView
// CaptureManager needs to be running to show the camera and scanning bar
@@ -101,6 +127,10 @@ public class ScanActivity extends CatimaAppCompatActivity {
protected void onResume() {
super.onResume();
capture.onResume();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
showCameraPermissionMissingText(false);
}
scaleScreen();
}
@Override
@@ -127,8 +157,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
public boolean onCreateOptionsMenu(Menu menu) {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
getMenuInflater().inflate(R.menu.scan_menu, menu);
}
@@ -139,10 +168,8 @@ public class ScanActivity extends CatimaAppCompatActivity {
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
if (item.getItemId() == android.R.id.home)
{
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
setResult(Activity.RESULT_CANCELED);
finish();
return true;
@@ -163,32 +190,25 @@ public class ScanActivity extends CatimaAppCompatActivity {
return super.onOptionsItemSelected(item);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{
private void handleActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
BarcodeValues barcodeValues;
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
try {
barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
} catch (NullPointerException e) {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
if (barcodeValues.isEmpty()) {
return;
}
if (!barcodeValues.isEmpty()) {
Intent manualResult = new Intent();
Bundle manualResultBundle = new Bundle();
manualResultBundle.putString(BarcodeSelectorActivity.BARCODE_CONTENTS, barcodeValues.content());
manualResultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, barcodeValues.format());
if (addGroup != null) {
manualResultBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup);
}
manualResult.putExtras(manualResultBundle);
ScanActivity.this.setResult(RESULT_OK, manualResult);
finish();
Intent manualResult = new Intent();
Bundle manualResultBundle = new Bundle();
manualResultBundle.putString(BarcodeSelectorActivity.BARCODE_CONTENTS, barcodeValues.content());
manualResultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, barcodeValues.format());
if (addGroup != null) {
manualResultBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup);
}
manualResult.putExtras(manualResultBundle);
ScanActivity.this.setResult(RESULT_OK, manualResult);
finish();
}
public void addManually(View view) {
@@ -198,12 +218,78 @@ public class ScanActivity extends CatimaAppCompatActivity {
b.putString("initialCardId", cardId);
i.putExtras(b);
}
startActivityForResult(i, Utils.SELECT_BARCODE_REQUEST);
manualAddLauncher.launch(i);
}
public void addFromImage(View view) {
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_IMAGE);
}
private void addFromImageAfterPermission() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, Utils.BARCODE_IMPORT_FROM_IMAGE_FILE);
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
try {
photoPickerLauncher.launch(chooserIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
private void showCameraPermissionMissingText(boolean show) {
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedClickableArea.setOnClickListener(show ? v -> {
navigateToSystemPermissionSetting();
} : null);
customBarcodeScannerBinding.cardInputContainer.setBackgroundColor(show ? obtainThemeAttribute(com.google.android.material.R.attr.colorSurface) : Color.TRANSPARENT);
customBarcodeScannerBinding.cameraPermissionDeniedLayout.getRoot().setVisibility(show ? View.VISIBLE : View.GONE);
}
private void scaleScreen() {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int screenHeight = displayMetrics.heightPixels;
float mediumSizePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,MEDIUM_SCALE_FACTOR_DIP,getResources().getDisplayMetrics());
boolean shouldScaleSmaller = screenHeight < mediumSizePx;
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedIcon.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedTitle.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
}
private int obtainThemeAttribute(int attribute) {
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(attribute, typedValue, true);
return typedValue.data;
}
private void navigateToSystemPermissionSetting() {
Intent permissionIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null));
permissionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(permissionIntent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
onMockedRequestPermissionsResult(requestCode, permissions, grantResults);
}
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (requestCode == CaptureManager.getCameraPermissionReqCode()) {
showCameraPermissionMissingText(!granted);
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
if (granted) {
addFromImageAfterPermission();
} else {
Toast.makeText(this, R.string.storageReadPermissionRequired, Toast.LENGTH_LONG).show();
}
}
}
}

View File

@@ -2,9 +2,14 @@ package protect.card_locker;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
@@ -12,10 +17,10 @@ import java.util.List;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.drawable.IconCompat;
class ShortcutHelper
{
class ShortcutHelper {
// Android documentation says that no more than 5 shortcuts
// are supported. However, that may be too many, as not all
// launcher will show all 5. Instead, the number is limited
@@ -23,6 +28,14 @@ class ShortcutHelper
// chance of being shown.
private static final int MAX_SHORTCUTS = 3;
// https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html
private static final int ADAPTIVE_BITMAP_SCALE = 1;
private static final int ADAPTIVE_BITMAP_SIZE = 108 * ADAPTIVE_BITMAP_SCALE;
private static final int ADAPTIVE_BITMAP_VISIBLE_SIZE = 72 * ADAPTIVE_BITMAP_SCALE;
private static final int ADAPTIVE_BITMAP_IMAGE_SIZE = ADAPTIVE_BITMAP_VISIBLE_SIZE + 5 * ADAPTIVE_BITMAP_SCALE;
private static final int PADDING_COLOR = Color.argb(255, 255, 255, 255);
private static final int PADDING_COLOR_OVERLAY = Color.argb(127, 0, 0, 0);
/**
* Add a card to the app shortcuts, and maintain a list of the most
* recently used cards. If there is already a shortcut for the card,
@@ -30,11 +43,10 @@ class ShortcutHelper
* card exceeds the max number of shortcuts, then the least recently
* used card shortcut is discarded.
*/
static void updateShortcuts(Context context, LoyaltyCard card)
{
static void updateShortcuts(Context context, LoyaltyCard card) {
LinkedList<ShortcutInfoCompat> list = new LinkedList<>(ShortcutManagerCompat.getDynamicShortcuts(context));
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase database = new DBHelper(context).getReadableDatabase();
String shortcutId = Integer.toString(card.id);
@@ -44,31 +56,25 @@ class ShortcutHelper
Integer foundIndex = null;
for(int index = 0; index < list.size(); index++)
{
if(list.get(index).getId().equals(shortcutId))
{
for (int index = 0; index < list.size(); index++) {
if (list.get(index).getId().equals(shortcutId)) {
// Found the item already
foundIndex = index;
break;
}
}
if(foundIndex != null)
{
if (foundIndex != null) {
// If the item is already found, then the list needs to be
// reordered, so that the selected item now has the lowest
// rank, thus letting it survive longer.
ShortcutInfoCompat found = list.remove(foundIndex.intValue());
list.addFirst(found);
}
else
{
} else {
// The item is new to the list. First, we need to trim the list
// until it is able to accept a new item, then the item is
// inserted.
while(list.size() >= MAX_SHORTCUTS)
{
while (list.size() >= MAX_SHORTCUTS) {
list.pollLast();
}
@@ -80,15 +86,14 @@ class ShortcutHelper
LinkedList<ShortcutInfoCompat> finalList = new LinkedList<>();
// The ranks are now updated; the order in the list is the rank.
for(int index = 0; index < list.size(); index++)
{
for (int index = 0; index < list.size(); index++) {
ShortcutInfoCompat prevShortcut = list.get(index);
LoyaltyCard loyaltyCard = dbHelper.getLoyaltyCard(Integer.parseInt(prevShortcut.getId()));
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(database, Integer.parseInt(prevShortcut.getId()));
ShortcutInfoCompat updatedShortcut = createShortcutBuilder(context, loyaltyCard)
.setRank(index)
.build();
.setRank(index)
.build();
finalList.addLast(updatedShortcut);
}
@@ -100,16 +105,13 @@ class ShortcutHelper
* Remove the given card id from the app shortcuts, if such a
* shortcut exists.
*/
static void removeShortcut(Context context, int cardId)
{
static void removeShortcut(Context context, int cardId) {
List<ShortcutInfoCompat> list = ShortcutManagerCompat.getDynamicShortcuts(context);
String shortcutId = Integer.toString(cardId);
for(int index = 0; index < list.size(); index++)
{
if(list.get(index).getId().equals(shortcutId))
{
for (int index = 0; index < list.size(); index++) {
if (list.get(index).getId().equals(shortcutId)) {
list.remove(index);
break;
}
@@ -118,6 +120,16 @@ class ShortcutHelper
ShortcutManagerCompat.setDynamicShortcuts(context, list);
}
static @NotNull
Bitmap createAdaptiveBitmap(@NotNull Bitmap in, int paddingColor) {
Bitmap ret = Bitmap.createBitmap(ADAPTIVE_BITMAP_SIZE, ADAPTIVE_BITMAP_SIZE, Bitmap.Config.ARGB_8888);
Canvas output = new Canvas(ret);
output.drawColor(ColorUtils.compositeColors(PADDING_COLOR_OVERLAY, paddingColor));
Bitmap resized = Utils.resizeBitmap(in, ADAPTIVE_BITMAP_IMAGE_SIZE);
output.drawBitmap(resized, (ADAPTIVE_BITMAP_SIZE - resized.getWidth()) / 2f, (ADAPTIVE_BITMAP_SIZE - resized.getHeight()) / 2f, null);
return ret;
}
static ShortcutInfoCompat.Builder createShortcutBuilder(Context context, LoyaltyCard loyaltyCard) {
Intent intent = new Intent(context, LoyaltyCardViewActivity.class);
intent.setAction(Intent.ACTION_MAIN);
@@ -129,7 +141,12 @@ class ShortcutHelper
bundle.putBoolean("view", true);
intent.putExtras(bundle);
Bitmap iconBitmap = Utils.generateIcon(context, loyaltyCard, true).getLetterTile();
Bitmap iconBitmap = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon);
if (iconBitmap == null) {
iconBitmap = Utils.generateIcon(context, loyaltyCard, true).getLetterTile();
} else {
iconBitmap = createAdaptiveBitmap(iconBitmap, loyaltyCard.headerColor == null ? PADDING_COLOR : loyaltyCard.headerColor);
}
IconCompat icon = IconCompat.createWithAdaptiveBitmap(iconBitmap);

View File

@@ -5,11 +5,14 @@ import android.text.TextWatcher;
public class SimpleTextWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) { }
public void afterTextChanged(Editable s) {
}
}

View File

@@ -22,4 +22,8 @@ public class ThirdPartyInfo {
public String license() {
return mLicense;
}
public String toHtml() {
return String.format("<a href=\"%s\">%s</a> (%s)", url(), name(), license());
}
}

View File

@@ -0,0 +1,82 @@
package protect.card_locker;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.textview.MaterialTextView;
import com.yalantis.ucrop.UCropActivity;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils;
import androidx.core.view.WindowInsetsControllerCompat;
public class UCropWrapper extends UCropActivity {
public static final String UCROP_TOOLBAR_TYPEFACE_STYLE = "ucop_toolbar_typeface_style";
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
boolean darkMode = Utils.isDarkModeEnabled(this);
// setup status bar to look like the rest of the app
if (Build.VERSION.SDK_INT >= 23) {
View decorView = getWindow().getDecorView();
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
wic.setAppearanceLightStatusBars(!darkMode);
} else {
// icons are always white back then
if (!darkMode) {
getWindow().setStatusBarColor(ColorUtils.compositeColors(Color.argb(127, 0, 0, 0), getWindow().getStatusBarColor()));
}
}
// find and check views that we wish to color modify
// for when we update ucrop or switch to another cropper
View check = findViewById(com.yalantis.ucrop.R.id.wrapper_controls);
if (check instanceof FrameLayout) {
FrameLayout controls = (FrameLayout) check;
check = findViewById(com.yalantis.ucrop.R.id.wrapper_states);
if (check instanceof LinearLayout) {
LinearLayout states = (LinearLayout) check;
for (int i = 0; i < controls.getChildCount(); i++) {
check = controls.getChildAt(i);
if (check instanceof AppCompatImageView) {
AppCompatImageView controlsBackgroundImage = (AppCompatImageView) check;
// everything gathered and are as expected, now perform color patching
Utils.patchColors(this);
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, com.google.android.material.R.attr.colorOnSurface, ContextCompat.getColor(this, R.color.md_theme_light_onSurface));
Drawable controlsBackgroundImageDrawable = controlsBackgroundImage.getBackground();
controlsBackgroundImageDrawable.mutate();
controlsBackgroundImageDrawable.setTint(darkMode ? colorOnSurface : colorSurface);
controlsBackgroundImage.setBackgroundDrawable(controlsBackgroundImageDrawable);
states.setBackgroundColor(darkMode ? colorSurface : colorOnSurface);
break;
}
}
}
}
// change toolbar font
check = findViewById(com.yalantis.ucrop.R.id.toolbar_title);
if (check instanceof MaterialTextView) {
MaterialTextView toolbarTextview = (MaterialTextView) check;
Intent intent = getIntent();
int style = intent.getIntExtra(UCROP_TOOLBAR_TYPEFACE_STYLE, -1);
if (style != -1) {
toolbarTextview.setTypeface(Typeface.defaultFromStyle(style));
}
}
}
}

View File

@@ -5,17 +5,32 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.ImageDecoder;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.LocaleList;
import android.provider.MediaStore;
import android.util.Log;
import android.util.TypedValue;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.RawRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.graphics.ColorUtils;
import androidx.exifinterface.media.ExifInterface;
import androidx.palette.graphics.Palette;
import com.google.android.material.color.DynamicColors;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
@@ -24,13 +39,19 @@ import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Currency;
import java.util.Date;
@@ -38,8 +59,6 @@ import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Map;
import androidx.core.graphics.ColorUtils;
import androidx.exifinterface.media.ExifInterface;
import protect.card_locker.preferences.Settings;
public class Utils {
@@ -52,12 +71,15 @@ public class Utils {
public static final int BARCODE_IMPORT_FROM_IMAGE_FILE = 4;
public static final int CARD_IMAGE_FROM_CAMERA_FRONT = 5;
public static final int CARD_IMAGE_FROM_CAMERA_BACK = 6;
public static final int CARD_IMAGE_FROM_FILE_FRONT = 7;
public static final int CARD_IMAGE_FROM_FILE_BACK = 8;
public static final int CARD_IMAGE_FROM_CAMERA_ICON = 7;
public static final int CARD_IMAGE_FROM_FILE_FRONT = 8;
public static final int CARD_IMAGE_FROM_FILE_BACK = 9;
public static final int CARD_IMAGE_FROM_FILE_ICON = 10;
static final double LUMINANCE_MIDPOINT = 0.5;
static final int BITMAP_SIZE_BIG = 512;
static final int BITMAP_SIZE_SMALL = 512;
static final int BITMAP_SIZE_BIG = 2048;
static public LetterBitmap generateIcon(Context context, LoyaltyCard loyaltyCard, boolean forShortcut) {
return generateIcon(context, loyaltyCard.store, loyaltyCard.headerColor, forShortcut);
@@ -79,7 +101,7 @@ public class Utils {
tileLetterFontSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterFontSize);
}
int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.cardThumbnailSize);
int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterImageSize);
if (backgroundColor == null) {
backgroundColor = LetterBitmap.getDefaultColor(context, store);
@@ -93,6 +115,17 @@ public class Utils {
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) {
String contents;
String format;
@@ -104,14 +137,16 @@ public class Utils {
if (requestCode == Utils.BARCODE_IMPORT_FROM_IMAGE_FILE) {
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;
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ImageDecoder.Source image_source = ImageDecoder.createSource(context.getContentResolver(), intent.getData());
bitmap = ImageDecoder.decodeBitmap(image_source, (decoder, info, source) -> decoder.setMutableRequired(true));
} else {
bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), intent.getData());
}
bitmap = retrieveImageFromUri(context, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
@@ -151,6 +186,20 @@ public class Utils {
throw new UnsupportedOperationException("Unknown request code for parseSetBarcodeActivityResult");
}
static public Bitmap retrieveImageFromUri(Context context, Uri data) throws IOException {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ImageDecoder.Source image_source = ImageDecoder.createSource(context.getContentResolver(), data);
return ImageDecoder.decodeBitmap(image_source, (decoder, info, source) -> decoder.setMutableRequired(true));
} else {
return getBitmapSdkLessThan29(data, context);
}
}
@SuppressWarnings("deprecation")
private static Bitmap getBitmapSdkLessThan29(Uri data, Context context) throws IOException {
return MediaStore.Images.Media.getBitmap(context.getContentResolver(), data);
}
static public BarcodeValues getBarcodeFromBitmap(Bitmap bitmap) {
// This function is vulnerable to OOM, so we try again with a smaller bitmap is we get OOM
for (int i = 0; i < 10; i++) {
@@ -184,7 +233,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) {
// 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
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
@@ -192,8 +255,7 @@ public class Utils {
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
return expiryDate.before(date.getTime());
return date;
}
static public String formatBalance(Context context, BigDecimal value, Currency currency) {
@@ -201,7 +263,7 @@ public class Utils {
if (currency == null) {
numberFormat.setMaximumFractionDigits(0);
return context.getString(R.string.balancePoints, numberFormat.format(value));
return context.getResources().getQuantityString(R.plurals.balancePoints, value.intValue(), numberFormat.format(value));
}
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
@@ -226,32 +288,19 @@ public class Utils {
return numberFormat.format(value);
}
static public Boolean currencyHasDecimals(Currency currency) {
static public BigDecimal parseBalance(String value, Currency currency) throws ParseException {
NumberFormat numberFormat = NumberFormat.getInstance();
if (currency == null) {
return false;
numberFormat.setMaximumFractionDigits(0);
} else {
numberFormat.setMinimumFractionDigits(currency.getDefaultFractionDigits());
numberFormat.setMaximumFractionDigits(currency.getDefaultFractionDigits());
}
return currency.getDefaultFractionDigits() != 0;
}
Log.d(TAG, numberFormat.parse(value).toString());
static public BigDecimal parseCurrency(String value, Boolean hasDecimals) throws NumberFormatException {
// If there are no decimals expected, remove all separators before parsing
if (!hasDecimals) {
value = value.replaceAll("[^0-9]", "");
return new BigDecimal(value);
}
// There are many ways users can write a currency, so we fix it up a bit
// 1. Replace all non-numbers with dots
value = value.replaceAll("[^0-9]", ".");
// 2. Remove all but the last dot
while (value.split("\\.").length > 2) {
value = value.replaceFirst("\\.", "");
}
// Parse as BigDecimal
return new BigDecimal(value);
return new BigDecimal(numberFormat.parse(value).toString());
}
static public byte[] bitmapToByteArray(Bitmap bitmap) {
@@ -264,13 +313,11 @@ public class Utils {
return bos.toByteArray();
}
static public Bitmap resizeBitmap(Bitmap bitmap) {
static public Bitmap resizeBitmap(Bitmap bitmap, double maxSize) {
if (bitmap == null) {
return null;
}
double maxSize = BITMAP_SIZE_BIG;
double width = bitmap.getWidth();
double height = bitmap.getHeight();
@@ -313,16 +360,20 @@ public class Utils {
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
static public String getCardImageFileName(int loyaltyCardId, boolean front) {
static public String getCardImageFileName(int loyaltyCardId, ImageLocationType type) {
StringBuilder cardImageFileNameBuilder = new StringBuilder();
cardImageFileNameBuilder.append("card_");
cardImageFileNameBuilder.append(loyaltyCardId);
cardImageFileNameBuilder.append("_");
if (front) {
if (type == ImageLocationType.front) {
cardImageFileNameBuilder.append("front");
} else {
} else if (type == ImageLocationType.back) {
cardImageFileNameBuilder.append("back");
} else if (type == ImageLocationType.icon) {
cardImageFileNameBuilder.append("icon");
} else {
throw new IllegalArgumentException("Unknown image type");
}
cardImageFileNameBuilder.append(".png");
@@ -340,8 +391,16 @@ public class Utils {
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
}
static public void saveCardImage(Context context, Bitmap bitmap, int loyaltyCardId, boolean front) throws FileNotFoundException {
saveCardImage(context, bitmap, getCardImageFileName(loyaltyCardId, front));
static public void saveCardImage(Context context, Bitmap bitmap, int loyaltyCardId, ImageLocationType type) throws FileNotFoundException {
saveCardImage(context, bitmap, getCardImageFileName(loyaltyCardId, type));
}
public static File retrieveCardImageAsFile(Context context, String fileName) {
return context.getFileStreamPath(fileName);
}
public static File retrieveCardImageAsFile(Context context, int loyaltyCardId, ImageLocationType type) {
return retrieveCardImageAsFile(context, getCardImageFileName(loyaltyCardId, type));
}
static public Bitmap retrieveCardImage(Context context, String fileName) {
@@ -355,11 +414,11 @@ public class Utils {
return BitmapFactory.decodeStream(in);
}
static public Bitmap retrieveCardImage(Context context, int loyaltyCardId, boolean front) {
return retrieveCardImage(context, getCardImageFileName(loyaltyCardId, front));
static public Bitmap retrieveCardImage(Context context, int loyaltyCardId, ImageLocationType type) {
return retrieveCardImage(context, getCardImageFileName(loyaltyCardId, type));
}
static public <T,U> U mapGetOrDefault(Map<T,U> map, T key, U defaultValue) {
static public <T, U> U mapGetOrDefault(Map<T, U> map, T key, U defaultValue) {
U value = map.get(key);
if (value == null) {
return defaultValue;
@@ -387,8 +446,7 @@ public class Utils {
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
configuration.locale = chosenLocale != null ? chosenLocale : Locale.getDefault();
res.updateConfiguration(configuration, res.getDisplayMetrics());
setLocalesSdkLessThan24(chosenLocale, configuration, res);
return context;
}
@@ -398,7 +456,185 @@ public class Utils {
return context.createConfigurationContext(configuration);
}
@SuppressWarnings("deprecation")
private static void setLocalesSdkLessThan24(Locale chosenLocale, Configuration configuration, Resources res) {
configuration.locale = chosenLocale != null ? chosenLocale : Locale.getDefault();
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
static public long getUnixTime() {
return System.currentTimeMillis() / 1000;
}
static public boolean isDarkModeEnabled(Context inputContext) {
int nightModeSetting = new Settings(inputContext).getTheme();
if (nightModeSetting == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) {
Configuration config = inputContext.getResources().getConfiguration();
int currentNightMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK;
return (currentNightMode == Configuration.UI_MODE_NIGHT_YES);
} else {
return nightModeSetting == AppCompatDelegate.MODE_NIGHT_YES;
}
}
public static File createTempFile(Context context, String name) {
return new File(context.getCacheDir() + "/" + name);
}
public static String saveTempImage(Context context, Bitmap in, String name, Bitmap.CompressFormat format) {
File image = createTempFile(context, name);
try (FileOutputStream out = new FileOutputStream(image)) {
in.compress(format, 100, out);
return image.getAbsolutePath();
} catch (IOException e) {
Log.d("store temp image", "failed writing temp file for temporary image, name: " + name);
return null;
}
}
public static Bitmap loadImage(String path) {
try {
return BitmapFactory.decodeStream(new FileInputStream(path));
} catch (IOException e) {
Log.d("load image", "failed loading image from " + path);
return null;
}
}
public static Bitmap loadTempImage(Context context, String name) {
return loadImage(context.getCacheDir() + "/" + name);
}
// https://stackoverflow.com/a/59324801/8378787
public static int getComplementaryColor(int color) {
int R = color & 255;
int G = (color >> 8) & 255;
int B = (color >> 16) & 255;
int A = (color >> 24) & 255;
R = 255 - R;
G = 255 - G;
B = 255 - B;
return R + (G << 8) + (B << 16) + (A << 24);
}
// replace colors in the current theme
public static void patchColors(AppCompatActivity activity) {
Settings settings = new Settings(activity);
String color = settings.getColor();
Resources.Theme theme = activity.getTheme();
Resources resources = activity.getResources();
if (color.equals(resources.getString(R.string.settings_key_pink_theme))) {
theme.applyStyle(R.style.pink, true);
} else if (color.equals(resources.getString(R.string.settings_key_magenta_theme))) {
theme.applyStyle(R.style.magenta, true);
} else if (color.equals(resources.getString(R.string.settings_key_violet_theme))) {
theme.applyStyle(R.style.violet, true);
} else if (color.equals(resources.getString(R.string.settings_key_blue_theme))) {
theme.applyStyle(R.style.blue, true);
} else if (color.equals(resources.getString(R.string.settings_key_sky_blue_theme))) {
theme.applyStyle(R.style.skyblue, true);
} else if (color.equals(resources.getString(R.string.settings_key_green_theme))) {
theme.applyStyle(R.style.green, true);
} else if (color.equals(resources.getString(R.string.settings_key_brown_theme))) {
theme.applyStyle(R.style.brown, true);
} else if (color.equals(resources.getString(R.string.settings_key_catima_theme))) {
// catima theme is AppTheme itself, no dynamic colors nor applyStyle
} else {
// final catch all in case of invalid theme value from older versions
// also handles R.string.settings_key_system_theme
DynamicColors.applyToActivityIfAvailable(activity);
}
if (isDarkModeEnabled(activity) && settings.getOledDark()) {
theme.applyStyle(R.style.DarkBackground, true);
}
}
// XXX android 9 and below has issues with patched theme where the background becomes a
// rendering mess
// use after views are inflated
public static void postPatchColors(AppCompatActivity activity) {
TypedValue typedValue = new TypedValue();
activity.getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
activity.findViewById(android.R.id.content).setBackgroundColor(typedValue.data);
}
public static void updateMenuCardDetailsButtonState(MenuItem item, boolean currentlyExpanded) {
if (currentlyExpanded) {
item.setIcon(R.drawable.ic_baseline_unfold_less_24);
item.setTitle(R.string.action_hide_details);
} else {
item.setIcon(R.drawable.ic_baseline_unfold_more_24);
item.setTitle(R.string.action_show_details);
}
}
public static int getHeaderColorFromImage(Bitmap image, int fallback) {
if (image == null) {
return fallback;
}
return new Palette.Builder(image).generate().getDominantColor(androidx.appcompat.R.attr.colorPrimary);
}
public static int getRandomHeaderColor(Context context) {
TypedArray colors = context.getResources().obtainTypedArray(R.array.letter_tile_colors);
final int color = (int) (Math.random() * colors.length());
return colors.getColor(color, Color.BLACK);
}
public static String readTextFile(Context context, @RawRes int resourceId) throws IOException {
InputStream input = context.getResources().openRawResource(resourceId);
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
StringBuilder result = new StringBuilder();
while (true) {
String nextLine = reader.readLine();
if (nextLine == null || nextLine.isEmpty()) {
reader.close();
break;
}
result.append("\n");
result.append(nextLine);
}
return result.toString();
}
public static void setIconOrTextWithBackground(Context context, LoyaltyCard loyaltyCard, ImageView backgroundOrIcon, TextView textWhenNoImage) {
Bitmap icon = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon);
if (icon != null) {
Log.d("onResume", "setting icon image");
textWhenNoImage.setVisibility(View.GONE);
backgroundOrIcon.setImageBitmap(icon);
backgroundOrIcon.setBackgroundColor(Color.TRANSPARENT);
} else {
textWhenNoImage.setVisibility(View.VISIBLE);
int headerColor = loyaltyCard.headerColor != null ? loyaltyCard.headerColor : LetterBitmap.getDefaultColor(context, loyaltyCard.store);
backgroundOrIcon.setImageBitmap(null);
backgroundOrIcon.setBackgroundColor(headerColor);
textWhenNoImage.setText(loyaltyCard.store);
textWhenNoImage.setTextColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
}
}
public static boolean installedFromGooglePlay(Context context) {
try {
String packageName = context.getPackageName();
String installer;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
installer = context.getPackageManager().getInstallSourceInfo(packageName).getInstallingPackageName();
} else {
installer = context.getPackageManager().getInstallerPackageName(packageName);
}
return installer.equals("com.android.vending");
} catch (Throwable ignored) {
return false;
}
}
}

View File

@@ -15,7 +15,15 @@ import java.io.Reader;
import java.nio.charset.StandardCharsets;
public class ZipUtils {
static public String read(ZipInputStream zipInputStream) throws IOException {
public static Bitmap readImage(ZipInputStream zipInputStream) {
return BitmapFactory.decodeStream(zipInputStream);
}
public static JSONObject readJSON(ZipInputStream zipInputStream) throws IOException, JSONException {
return new JSONObject(read(zipInputStream));
}
private static String read(ZipInputStream zipInputStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
Reader reader = new BufferedReader(new InputStreamReader(zipInputStream, StandardCharsets.UTF_8));
int c;
@@ -24,12 +32,4 @@ public class ZipUtils {
}
return stringBuilder.toString();
}
static public Bitmap readImage(ZipInputStream zipInputStream) {
return BitmapFactory.decodeStream(zipInputStream);
}
static public JSONObject readJSON(ZipInputStream zipInputStream) throws IOException, JSONException {
return new JSONObject(read(zipInputStream));
}
}

View File

@@ -0,0 +1,9 @@
package protect.card_locker.async;
import java.util.concurrent.Callable;
public interface CompatCallable<T> extends Callable<T> {
void onPostExecute(Object result);
void onPreExecute();
}

View File

@@ -0,0 +1,175 @@
package protect.card_locker.async;
import android.os.Handler;
import android.os.Looper;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* AsyncTask has been deprecated so this provides very rudimentary compatibility without
* needing to redo too many Parts.
* <p>
* However this is a much, much more cooperative Behaviour than before so
* the callers need to ensure we do NOT rely on forced cancellation and feed less into the
* ThreadPools so we don't OOM/Overload the Users device
* <p>
* This assumes single-threaded callers.
*/
public class TaskHandler {
public enum TYPE {
BARCODE,
IMPORT,
EXPORT
}
HashMap<TYPE, ThreadPoolExecutor> executors = generateExecutors();
final private HashMap<TYPE, LinkedList<Future<?>>> taskList = new HashMap<>();
private final Handler uiHandler = new Handler(Looper.getMainLooper());
private HashMap<TYPE, ThreadPoolExecutor> generateExecutors() {
HashMap<TYPE, ThreadPoolExecutor> initExecutors = new HashMap<>();
for (TYPE type : TYPE.values()) {
replaceExecutor(initExecutors, type, false, false);
}
return initExecutors;
}
/**
* Replaces (or initializes) an Executor with a clean (new) one
*
* @param executors Map Reference
* @param type Which Queue
* @param flushOld attempt shutdown
* @param waitOnOld wait for Termination
*/
private void replaceExecutor(HashMap<TYPE, ThreadPoolExecutor> executors, TYPE type, Boolean flushOld, Boolean waitOnOld) {
ThreadPoolExecutor oldExecutor = executors.get(type);
if (oldExecutor != null) {
if (flushOld) {
oldExecutor.shutdownNow();
}
if (waitOnOld) {
try {
//noinspection ResultOfMethodCallIgnored
oldExecutor.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
executors.put(type, (ThreadPoolExecutor) Executors.newCachedThreadPool());
}
/**
* Queue a Pseudo-AsyncTask for execution
*
* @param type Queue
* @param callable PseudoAsyncTask
*/
public void executeTask(TYPE type, CompatCallable<?> callable) {
Runnable runner = () -> {
try {
// Run on the UI Thread
uiHandler.post(callable::onPreExecute);
// Background
final Object result = callable.call();
// Post results on UI Thread so we can show them
uiHandler.post(() -> {
callable.onPostExecute(result);
});
} catch (Exception e) {
e.printStackTrace();
}
};
LinkedList<Future<?>> list = taskList.get(type);
if (list == null) {
list = new LinkedList<>();
}
ThreadPoolExecutor executor = executors.get(type);
if (executor != null) {
Future<?> task = executor.submit(runner);
// Test Queue Cancellation:
// task.cancel(true);
list.push(task);
taskList.put(type, list);
}
}
/**
* This will attempt to cancel a currently running list of Tasks
* Useful to ignore scheduled tasks - but not able to hard-stop tasks that are running
*
* @param type Which Queue to target
* @param forceCancel attempt to close the Queue and force-replace it after
* @param waitForFinish wait and return after the old executor finished. Times out after 5s
* @param waitForCurrentlyRunning wait before cancelling tasks. Useful for tests.
*/
public void flushTaskList(TYPE type, Boolean forceCancel, Boolean waitForFinish, Boolean waitForCurrentlyRunning) {
// Only used for Testing
if (waitForCurrentlyRunning) {
ThreadPoolExecutor oldExecutor = executors.get(type);
if (oldExecutor != null) {
try {
//noinspection ResultOfMethodCallIgnored
oldExecutor.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Attempt to cancel known Tasks and clean the List
LinkedList<Future<?>> tasks = taskList.get(type);
if (tasks != null) {
for (Future<?> task : tasks) {
if (!task.isDone() || !task.isCancelled()) {
// Interrupt any Task we can
task.cancel(true);
}
}
}
tasks = new LinkedList<>();
taskList.put(type, tasks);
if (forceCancel || waitForFinish) {
ThreadPoolExecutor oldExecutor = executors.get(type);
if (oldExecutor != null) {
if (forceCancel) {
if (waitForFinish) {
try {
//noinspection ResultOfMethodCallIgnored
oldExecutor.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
oldExecutor.shutdownNow();
replaceExecutor(executors, type, true, false);
} else {
try {
//noinspection ResultOfMethodCallIgnored
oldExecutor.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}

View File

@@ -8,27 +8,14 @@ public class CSVHelpers {
/**
* 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
* "key" as the key. If no such key exists, defaultValue is returned
* if it is not null. Otherwise, a FormatException is thrown.
* "key" as the key. If no such key exists, defaultValue is returned.
*/
static String extractString(String key, CSVRecord record, String defaultValue)
throws FormatException
{
String toReturn = defaultValue;
if(record.isMapped(key))
{
toReturn = record.get(key);
}
else
{
if(defaultValue == null)
{
throw new FormatException("Field not used but expected: " + key);
}
static String extractString(String key, CSVRecord record, String defaultValue) {
if (record.isMapped(key)) {
return record.get(key);
}
return toReturn;
return defaultValue;
}
/**
@@ -37,26 +24,20 @@ public class CSVHelpers {
* "key" as the key. If no such key exists, or the data is not a valid
* int, a FormatException is thrown.
*/
static Integer extractInt(String key, CSVRecord record, boolean nullIsOk)
throws FormatException
{
if(record.isMapped(key) == false)
{
static Integer extractInt(String key, CSVRecord record)
throws FormatException {
if (!record.isMapped(key)) {
throw new FormatException("Field not used but expected: " + key);
}
String value = record.get(key);
if(value.isEmpty() && nullIsOk)
{
return null;
if (value.isEmpty()) {
throw new FormatException("Field is empty: " + key);
}
try
{
try {
return Integer.parseInt(record.get(key));
}
catch(NumberFormatException e)
{
} catch (NumberFormatException e) {
throw new FormatException("Failed to parse field: " + key, e);
}
}
@@ -67,26 +48,20 @@ public class CSVHelpers {
* "key" as the key. If no such key exists, or the data is not a valid
* int, a FormatException is thrown.
*/
static Long extractLong(String key, CSVRecord record, boolean nullIsOk)
throws FormatException
{
if(record.isMapped(key) == false)
{
static Long extractLong(String key, CSVRecord record)
throws FormatException {
if (!record.isMapped(key)) {
throw new FormatException("Field not used but expected: " + key);
}
String value = record.get(key);
if(value.isEmpty() && nullIsOk)
{
return null;
if (value.isEmpty()) {
throw new FormatException("Field is empty: " + key);
}
try
{
try {
return Long.parseLong(record.get(key));
}
catch(NumberFormatException e)
{
} catch (NumberFormatException e) {
throw new FormatException("Failed to parse field: " + key, e);
}
}

View File

@@ -2,10 +2,12 @@ package protect.card_locker.importexport;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import net.lingala.zip4j.io.outputstream.ZipOutputStream;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import net.lingala.zip4j.util.InternalZipConstants;
import org.apache.commons.csv.CSVFormat;
@@ -21,6 +23,7 @@ import java.nio.charset.StandardCharsets;
import protect.card_locker.DBHelper;
import protect.card_locker.Group;
import protect.card_locker.ImageLocationType;
import protect.card_locker.LoyaltyCard;
import protect.card_locker.Utils;
@@ -28,25 +31,28 @@ import protect.card_locker.Utils;
* Class for exporting the database into CSV (Comma Separate Values)
* format.
*/
public class CatimaExporter implements Exporter
{
public void exportData(Context context, DBHelper db, OutputStream output) throws IOException, InterruptedException
{
public class CatimaExporter implements Exporter {
public void exportData(Context context, SQLiteDatabase database, OutputStream output, char[] password) throws IOException, InterruptedException {
// Necessary vars
int readLen;
byte[] readBuffer = new byte[InternalZipConstants.BUFF_SIZE];
// Create zip output stream
ZipOutputStream zipOutputStream = new ZipOutputStream(output);
ZipOutputStream zipOutputStream;
if (password != null && password.length > 0) {
zipOutputStream = new ZipOutputStream(output, password);
} else {
zipOutputStream = new ZipOutputStream(output);
}
// Generate CSV
ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream();
OutputStreamWriter catimaOutputStreamWriter = new OutputStreamWriter(catimaOutputStream, StandardCharsets.UTF_8);
writeCSV(db, catimaOutputStreamWriter);
writeCSV(database, catimaOutputStreamWriter);
// Add CSV to zip file
ZipParameters csvZipParameters = new ZipParameters();
csvZipParameters.setFileNameInZip("catima.csv");
ZipParameters csvZipParameters = createZipParameters("catima.csv", password);
zipOutputStream.putNextEntry(csvZipParameters);
InputStream csvInputStream = new ByteArrayInputStream(catimaOutputStream.toByteArray());
while ((readLen = csvInputStream.read(readBuffer)) != -1) {
@@ -55,24 +61,17 @@ public class CatimaExporter implements Exporter
zipOutputStream.closeEntry();
// Loop over all cards again
Cursor cardCursor = db.getLoyaltyCardCursor();
while(cardCursor.moveToNext())
{
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
while (cardCursor.moveToNext()) {
// For each card
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor);
// Prepare looping over both front and back image
boolean[] frontValues = new boolean[2];
frontValues[0] = true;
frontValues[1] = false;
// For each image
for (boolean front : frontValues) {
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
// If it exists, add to the .zip file
Bitmap image = Utils.retrieveCardImage(context, card.id, front);
Bitmap image = Utils.retrieveCardImage(context, card.id, imageLocationType);
if (image != null) {
ZipParameters imageZipParameters = new ZipParameters();
imageZipParameters.setFileNameInZip(Utils.getCardImageFileName(card.id, front));
ZipParameters imageZipParameters = createZipParameters(Utils.getCardImageFileName(card.id, imageLocationType), password);
zipOutputStream.putNextEntry(imageZipParameters);
InputStream imageInputStream = new ByteArrayInputStream(Utils.bitmapToByteArray(image));
while ((readLen = imageInputStream.read(readBuffer)) != -1) {
@@ -86,7 +85,17 @@ public class CatimaExporter implements Exporter
zipOutputStream.close();
}
private void writeCSV(DBHelper db, OutputStreamWriter output) throws IOException, InterruptedException {
private ZipParameters createZipParameters(String fileName, char[] password) {
ZipParameters zipParameters = new ZipParameters();
zipParameters.setFileNameInZip(fileName);
if (password != null && password.length > 0) {
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
}
return zipParameters;
}
private void writeCSV(SQLiteDatabase database, OutputStreamWriter output) throws IOException, InterruptedException {
CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180);
// Print the version
@@ -97,16 +106,14 @@ public class CatimaExporter implements Exporter
// Print the header for groups
printer.printRecord(DBHelper.LoyaltyCardDbGroups.ID);
Cursor groupCursor = db.getGroupCursor();
Cursor groupCursor = DBHelper.getGroupCursor(database);
while(groupCursor.moveToNext())
{
while (groupCursor.moveToNext()) {
Group group = Group.toGroup(groupCursor);
printer.printRecord(group._id);
if(Thread.currentThread().isInterrupted())
{
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
}
@@ -120,6 +127,7 @@ public class CatimaExporter implements Exporter
printer.printRecord(DBHelper.LoyaltyCardDbIds.ID,
DBHelper.LoyaltyCardDbIds.STORE,
DBHelper.LoyaltyCardDbIds.NOTE,
DBHelper.LoyaltyCardDbIds.VALID_FROM,
DBHelper.LoyaltyCardDbIds.EXPIRY,
DBHelper.LoyaltyCardDbIds.BALANCE,
DBHelper.LoyaltyCardDbIds.BALANCE_TYPE,
@@ -128,17 +136,18 @@ public class CatimaExporter implements Exporter
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE,
DBHelper.LoyaltyCardDbIds.HEADER_COLOR,
DBHelper.LoyaltyCardDbIds.STAR_STATUS,
DBHelper.LoyaltyCardDbIds.LAST_USED);
DBHelper.LoyaltyCardDbIds.LAST_USED,
DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS);
Cursor cardCursor = db.getLoyaltyCardCursor();
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
while(cardCursor.moveToNext())
{
while (cardCursor.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor);
printer.printRecord(card.id,
card.store,
card.note,
card.validFrom != null ? card.validFrom.getTime() : "",
card.expiry != null ? card.expiry.getTime() : "",
card.balance,
card.balanceType,
@@ -147,10 +156,10 @@ public class CatimaExporter implements Exporter
card.barcodeType != null ? card.barcodeType.name() : "",
card.headerColor,
card.starStatus,
card.lastUsed);
card.lastUsed,
card.archiveStatus);
if(Thread.currentThread().isInterrupted())
{
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
}
@@ -164,18 +173,16 @@ public class CatimaExporter implements Exporter
printer.printRecord(DBHelper.LoyaltyCardDbIdsGroups.cardID,
DBHelper.LoyaltyCardDbIdsGroups.groupID);
Cursor cardCursor2 = db.getLoyaltyCardCursor();
Cursor cardCursor2 = DBHelper.getLoyaltyCardCursor(database);
while(cardCursor2.moveToNext())
{
while (cardCursor2.moveToNext()) {
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor2);
for (Group group : db.getLoyaltyCardGroups(card.id)) {
for (Group group : DBHelper.getLoyaltyCardGroups(database, card.id)) {
printer.printRecord(card.id, group._id);
}
if(Thread.currentThread().isInterrupted())
{
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
}

View File

@@ -4,8 +4,6 @@ import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import com.google.zxing.BarcodeFormat;
import net.lingala.zip4j.io.inputstream.ZipInputStream;
import net.lingala.zip4j.model.LocalFileHeader;
@@ -15,7 +13,6 @@ import org.apache.commons.csv.CSVRecord;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -37,18 +34,17 @@ import protect.card_locker.ZipUtils;
/**
* Class for importing a database from CSV (Comma Separate Values)
* formatted data.
*
* <p>
* The database's loyalty cards are expected to appear in the CSV data.
* A header is expected for the each table showing the names of the columns.
*/
public class CatimaImporter implements Importer
{
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException {
public class CatimaImporter implements Importer {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, InterruptedException {
InputStream bufferedInputStream = new BufferedInputStream(input);
bufferedInputStream.mark(100);
// First, check if this is a zip file
ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream);
ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream, password);
boolean isZipFile = false;
@@ -58,7 +54,7 @@ public class CatimaImporter implements Importer
String fileName = Uri.parse(localFileHeader.getFileName()).getLastPathSegment();
if (fileName.equals("catima.csv")) {
importCSV(context, db, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8)));
importCSV(context, database, zipInputStream);
} else if (fileName.endsWith(".png")) {
Utils.saveCardImage(context, ZipUtils.readImage(zipInputStream), fileName);
} else {
@@ -69,79 +65,49 @@ public class CatimaImporter implements Importer
if (!isZipFile) {
// This is not a zip file, try importing as bare CSV
bufferedInputStream.reset();
importCSV(context, db, bufferedInputStream);
importCSV(context, database, bufferedInputStream);
}
input.close();
}
public void importCSV(Context context, DBHelper db, InputStream input) throws IOException, FormatException, InterruptedException {
public void importCSV(Context context, SQLiteDatabase database, InputStream input) throws IOException, FormatException, InterruptedException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
bufferedReader.mark(100);
Integer version = 1;
try {
version = Integer.parseInt(bufferedReader.readLine());
} catch (NumberFormatException _e) {
// Assume version 1
}
bufferedReader.reset();
int version = parseVersion(bufferedReader);
switch (version) {
case 1:
parseV1(context, db, bufferedReader);
parseV1(database, bufferedReader);
break;
case 2:
parseV2(context, db, bufferedReader);
parseV2(context, database, bufferedReader);
break;
default:
throw new FormatException(String.format("No code to parse version %s", version));
}
bufferedReader.close();
}
public void parseV1(Context context, DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException
{
final CSVParser parser = new CSVParser(input, CSVFormat.RFC4180.withHeader());
public void parseV1(SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
final CSVParser parser = new CSVParser(input, CSVFormat.RFC4180.builder().setHeader().build());
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
try {
for (CSVRecord record : parser) {
importLoyaltyCard(database, record);
try
{
for (CSVRecord record : parser)
{
importLoyaltyCard(context, database, db, record);
if(Thread.currentThread().isInterrupted())
{
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
}
parser.close();
database.setTransactionSuccessful();
}
catch(IllegalArgumentException|IllegalStateException e)
{
} catch (IllegalArgumentException | IllegalStateException e) {
throw new FormatException("Issue parsing CSV data", e);
}
finally
{
database.endTransaction();
database.close();
}
}
public void parseV2(Context context, DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException
{
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
Integer part = 0;
String stringPart = "";
public void parseV2(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException {
int part = 0;
StringBuilder stringPart = new StringBuilder();
try {
while (true) {
@@ -157,7 +123,7 @@ public class CatimaImporter implements Importer
break;
case 1:
try {
parseV2Groups(db, database, stringPart);
parseV2Groups(database, stringPart.toString());
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -165,7 +131,7 @@ public class CatimaImporter implements Importer
break;
case 2:
try {
parseV2Cards(context, db, database, stringPart);
parseV2Cards(context, database, stringPart.toString());
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -173,7 +139,7 @@ public class CatimaImporter implements Importer
break;
case 3:
try {
parseV2CardGroups(db, database, stringPart);
parseV2CardGroups(database, stringPart.toString());
sectionParsed = true;
} catch (FormatException e) {
// We may have a multiline field, try again
@@ -189,27 +155,22 @@ public class CatimaImporter implements Importer
if (sectionParsed) {
part += 1;
stringPart = "";
stringPart = new StringBuilder();
} else {
stringPart += tmp + "\n";
stringPart.append(tmp).append('\n');
}
} else {
stringPart += tmp + "\n";
stringPart.append(tmp).append('\n');
}
}
database.setTransactionSuccessful();
} catch (FormatException e) {
throw new FormatException("Issue parsing CSV data", e);
} finally {
database.endTransaction();
database.close();
}
}
public void parseV2Groups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException
{
public void parseV2Groups(SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse groups
final CSVParser groupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.withHeader());
final CSVParser groupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
List<CSVRecord> records = new ArrayList<>();
@@ -228,14 +189,13 @@ public class CatimaImporter implements Importer
}
for (CSVRecord record : records) {
importGroup(database, db, record);
importGroup(database, record);
}
}
public void parseV2Cards(Context context, DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException
{
public void parseV2Cards(Context context, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse cards
final CSVParser cardParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.withHeader());
final CSVParser cardParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
List<CSVRecord> records = new ArrayList<>();
@@ -254,14 +214,13 @@ public class CatimaImporter implements Importer
}
for (CSVRecord record : records) {
importLoyaltyCard(context, database, db, record);
importLoyaltyCard(database, record);
}
}
public void parseV2CardGroups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException
{
public void parseV2CardGroups(SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException {
// Parse card group mappings
final CSVParser cardGroupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.withHeader());
final CSVParser cardGroupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
List<CSVRecord> records = new ArrayList<>();
@@ -280,116 +239,172 @@ public class CatimaImporter implements Importer
}
for (CSVRecord record : records) {
importCardGroupMapping(database, db, record);
importCardGroupMapping(database, record);
}
}
/**
* Parse the version number of the import file
*
* @param reader the reader containing the import file
* @return the parsed version number, defaulting to 1 if none is found
* @throws IOException there was a problem reading the file
*/
private int parseVersion(BufferedReader reader) throws IOException {
reader.mark(10); // slightly over the search limit just to be sure
StringBuilder sb = new StringBuilder();
int searchLimit = 5; // gives you version numbers up to 99999
int codePoint;
// search until the next whitespace, indicating the end of the version
while (!Character.isWhitespace(codePoint = reader.read())) {
// we found something that isn't a digit, or we ran out of chars
if (!Character.isDigit(codePoint) || searchLimit <= 0) {
reader.reset();
return 1; // default value
}
sb.append((char) codePoint);
searchLimit--;
}
reader.reset();
if (sb.length() == 0) {
return 1;
}
return Integer.parseInt(sb.toString());
}
/**
* Import a single loyalty card into the database using the given
* session.
*/
private void importLoyaltyCard(Context context, SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException
{
int id = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ID, record, false);
private void importLoyaltyCard(SQLiteDatabase database, CSVRecord record)
throws FormatException {
int id = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ID, record);
String store = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.STORE, record, "");
if(store.isEmpty())
{
if (store.isEmpty()) {
throw new FormatException("No store listed, but is required");
}
String note = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.NOTE, record, "");
Date expiry = null;
try {
expiry = new Date(CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.EXPIRY, record, true));
} catch (NullPointerException | FormatException e) { }
BigDecimal balance;
Date validFrom = null;
Long validFromLong;
try {
balance = new BigDecimal(CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BALANCE, record, null));
} catch (FormatException _e ) {
// These fields did not exist in versions 1.8.1 and before
// We catch this exception so we can still import old backups
balance = new BigDecimal("0");
validFromLong = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.VALID_FROM, record);
} catch (FormatException ignored) {
validFromLong = null;
}
if (validFromLong != null) {
validFrom = new Date(validFromLong);
}
Date expiry = null;
Long expiryLong;
try {
expiryLong = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.EXPIRY, record);
} catch (FormatException ignored) {
expiryLong = null;
}
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;
String unparsedBalanceType = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE, record, "");
if(!unparsedBalanceType.isEmpty()) {
if (!unparsedBalanceType.isEmpty()) {
balanceType = Currency.getInstance(unparsedBalanceType);
}
String cardId = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.CARD_ID, record, "");
if(cardId.isEmpty())
{
if (cardId.isEmpty()) {
throw new FormatException("No card ID listed, but is required");
}
String barcodeId = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BARCODE_ID, record, "");
if(barcodeId.isEmpty())
{
if (barcodeId.isEmpty()) {
barcodeId = null;
}
CatimaBarcode barcodeType = null;
String unparsedBarcodeType = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, record, "");
if(!unparsedBarcodeType.isEmpty())
{
if (!unparsedBarcodeType.isEmpty()) {
barcodeType = CatimaBarcode.fromName(unparsedBarcodeType);
}
Integer headerColor = null;
if(record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_COLOR))
{
headerColor = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record, true);
try {
headerColor = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record);
} catch (FormatException ignored) {
}
int starStatus = 0;
try {
starStatus = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.STAR_STATUS, record, false);
starStatus = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.STAR_STATUS, record);
} catch (FormatException _e) {
// This field did not exist in versions 0.28 and before
// We catch this exception so we can still import old backups
}
if (starStatus != 1) starStatus = 0;
int archiveStatus = 0;
try {
archiveStatus = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS, record);
} catch (FormatException _e) {
// This field did not exist in versions 2.16.3 and before
// We catch this exception so we can still import old backups
}
if (archiveStatus != 1) archiveStatus = 0;
Long lastUsed = 0L;
try {
lastUsed = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.LAST_USED, record, false);
lastUsed = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.LAST_USED, record);
} catch (FormatException _e) {
// This field did not exist in versions 2.5.0 and before
// We catch this exception so we can still import old backups
}
helper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed);
DBHelper.insertLoyaltyCard(database, id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, archiveStatus);
}
/**
* Import a single group into the database using the given
* session.
*/
private void importGroup(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException
{
private void importGroup(SQLiteDatabase database, CSVRecord record) throws FormatException {
String id = CSVHelpers.extractString(DBHelper.LoyaltyCardDbGroups.ID, record, null);
helper.insertGroup(database, id);
if (id == null) {
throw new FormatException("Group has no ID: " + record);
}
DBHelper.insertGroup(database, id);
}
/**
* Import a single card to group mapping into the database using the given
* session.
*/
private void importCardGroupMapping(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException
{
Integer cardId = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIdsGroups.cardID, record, false);
private void importCardGroupMapping(SQLiteDatabase database, CSVRecord record) throws FormatException {
int cardId = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIdsGroups.cardID, record);
String groupId = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIdsGroups.groupID, record, null);
List<Group> cardGroups = helper.getLoyaltyCardGroups(cardId);
cardGroups.add(helper.getGroup(groupId));
helper.setLoyaltyCardGroups(database, cardId, cardGroups);
if (groupId == null) {
throw new FormatException("Group has no ID: " + record);
}
List<Group> cardGroups = DBHelper.getLoyaltyCardGroups(database, cardId);
cardGroups.add(DBHelper.getGroup(database, groupId));
DBHelper.setLoyaltyCardGroups(database, cardId, cardGroups);
}
}
}

View File

@@ -1,10 +1,8 @@
package protect.card_locker.importexport;
public enum DataFormat
{
public enum DataFormat {
Catima,
Fidme,
Stocard,
VoucherVault
;
VoucherVault;
}

View File

@@ -1,21 +1,20 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import java.io.IOException;
import java.io.OutputStream;
import protect.card_locker.DBHelper;
/**
* Interface for a class which can export the contents of the database
* in a given format.
*/
public interface Exporter
{
public interface Exporter {
/**
* Export the database to the output stream in a given format.
*
* @throws IOException
*/
void exportData(Context context, DBHelper db, OutputStream output) throws IOException, InterruptedException;
void exportData(Context context, SQLiteDatabase database, OutputStream output, char[] password) throws IOException, InterruptedException;
}

View File

@@ -3,8 +3,6 @@ package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.google.zxing.BarcodeFormat;
import net.lingala.zip4j.io.inputstream.ZipInputStream;
import net.lingala.zip4j.model.LocalFileHeader;
@@ -28,13 +26,12 @@ import protect.card_locker.Utils;
/**
* Class for importing a database from CSV (Comma Separate Values)
* formatted data.
*
* <p>
* The database's loyalty cards are expected to appear in the CSV data.
* A header is expected for the each table showing the names of the columns.
*/
public class FidmeImporter implements Importer
{
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
public class FidmeImporter implements Importer {
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
// We actually retrieve a .zip file
ZipInputStream zipInputStream = new ZipInputStream(input, password);
@@ -56,14 +53,11 @@ public class FidmeImporter implements Importer
throw new FormatException("Couldn't find loyalty_programs.csv in zip file or it is empty");
}
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
final CSVParser fidmeParser = new CSVParser(new StringReader(loyaltyCards.toString()), CSVFormat.RFC4180.withDelimiter(';').withHeader());
final CSVParser fidmeParser = new CSVParser(new StringReader(loyaltyCards.toString()), CSVFormat.RFC4180.builder().setDelimiter(';').setHeader().build());
try {
for (CSVRecord record : fidmeParser) {
importLoyaltyCard(database, db, record);
importLoyaltyCard(context, database, record);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
@@ -75,10 +69,6 @@ public class FidmeImporter implements Importer
fidmeParser.close();
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
zipInputStream.close();
}
@@ -86,9 +76,8 @@ public class FidmeImporter implements Importer
* Import a single loyalty card into the database using the given
* session.
*/
private void importLoyaltyCard(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException
{
private void importLoyaltyCard(Context context, SQLiteDatabase database, CSVRecord record)
throws FormatException {
// A loyalty card export from Fidme contains the following fields:
// Retailer (store name)
// Program (program name)
@@ -100,8 +89,7 @@ public class FidmeImporter implements Importer
// The store is called Retailer
String store = CSVHelpers.extractString("Retailer", record, "");
if (store.isEmpty())
{
if (store.isEmpty()) {
throw new FormatException("No store listed, but is required");
}
@@ -121,9 +109,11 @@ public class FidmeImporter implements Importer
// The ID is called reference
String cardId = CSVHelpers.extractString("Reference", record, "");
if(cardId.isEmpty())
{
throw new FormatException("No card ID listed, but is required");
if (cardId.isEmpty()) {
// Fidme deletes the card id if a card is expired
// Because Catima considers the card id a required field, we ignore these expired cards
// https://github.com/CatimaLoyalty/Android/issues/1005
return;
}
// Sadly, Fidme exports don't contain the card type
@@ -131,11 +121,13 @@ public class FidmeImporter implements Importer
// TODO: Hook this into our own loyalty card DB if we ever get one
CatimaBarcode barcodeType = null;
// No favourite data in the export either
// No favourite data or colour in the export either
int starStatus = 0;
int archiveStatus = 0;
int headerColor = Utils.getRandomHeaderColor(context);
// TODO: Front and back image
helper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus, null);
DBHelper.insertLoyaltyCard(database, store, note, null, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, starStatus, null,archiveStatus);
}
}

View File

@@ -1,9 +1,23 @@
package protect.card_locker.importexport;
public enum ImportExportResult
{
Success,
GenericFailure,
BadPassword
;
public class ImportExportResult {
private ImportExportResultType resultType;
private String developerDetails;
public ImportExportResult(ImportExportResultType resultType) {
this(resultType, null);
}
public ImportExportResult(ImportExportResultType resultType, String developerDetails) {
this.resultType = resultType;
this.developerDetails = developerDetails;
}
public ImportExportResultType resultType() {
return resultType;
}
public String developerDetails() {
return developerDetails;
}
}

View File

@@ -0,0 +1,7 @@
package protect.card_locker.importexport;
public enum ImportExportResultType {
Success,
GenericFailure,
BadPassword;
}

View File

@@ -1,6 +1,7 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import org.json.JSONException;
@@ -8,20 +9,19 @@ import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
/**
* Interface for a class which can import the contents of a stream
* into the database.
*/
public interface Importer
{
public interface Importer {
/**
* Import data from the input stream in a given format into
* the database.
*
* @throws IOException
* @throws FormatException
*/
void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException;
void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException;
}

View File

@@ -1,33 +1,28 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.io.IOException;
import java.io.OutputStream;
import protect.card_locker.DBHelper;
public class MultiFormatExporter
{
public class MultiFormatExporter {
private static final String TAG = "Catima";
/**
* Attempts to export data to the output stream in the
* given format, if possible.
*
* <p>
* The output stream is closed on success.
*
* @return ImportExportResult.Success if the database was successfully exported,
* another ImportExportResult otherwise. If not Success, partial data may have been
* written to the output stream, and it should be discarded.
*/
public static ImportExportResult exportData(Context context, DBHelper db, OutputStream output, DataFormat format)
{
public static ImportExportResult exportData(Context context, SQLiteDatabase database, OutputStream output, DataFormat format, char[] password) {
Exporter exporter = null;
switch(format)
{
switch (format) {
case Catima:
exporter = new CatimaExporter();
break;
@@ -36,28 +31,20 @@ public class MultiFormatExporter
break;
}
if(exporter != null)
{
try
{
exporter.exportData(context, db, output);
return ImportExportResult.Success;
}
catch(IOException e)
{
Log.e(TAG, "Failed to export data", e);
}
catch(InterruptedException e)
{
String error;
if (exporter != null) {
try {
exporter.exportData(context, database, output, password);
return new ImportExportResult(ImportExportResultType.Success);
} catch (Exception e) {
Log.e(TAG, "Failed to export data", e);
error = e.toString();
}
} else {
error = "Unsupported data format exported: " + format.name();
Log.e(TAG, error);
}
return ImportExportResult.GenericFailure;
}
else
{
Log.e(TAG, "Unsupported data format exported: " + format.name());
return ImportExportResult.GenericFailure;
}
return new ImportExportResult(ImportExportResultType.GenericFailure, error);
}
}

View File

@@ -1,27 +1,20 @@
package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import net.lingala.zip4j.exception.ZipException;
import org.json.JSONException;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
public class MultiFormatImporter
{
public class MultiFormatImporter {
private static final String TAG = "Catima";
/**
* Attempts to import data from the input stream of the
* given format into the database.
*
* <p>
* The input stream is not closed, and doing so is the
* responsibility of the caller.
*
@@ -29,12 +22,10 @@ public class MultiFormatImporter
* or another result otherwise. If no Success, no data was written to
* the database.
*/
public static ImportExportResult importData(Context context, DBHelper db, InputStream input, DataFormat format, char[] password)
{
public static ImportExportResult importData(Context context, SQLiteDatabase database, InputStream input, DataFormat format, char[] password) {
Importer importer = null;
switch(format)
{
switch (format) {
case Catima:
importer = new CatimaImporter();
break;
@@ -49,28 +40,31 @@ public class MultiFormatImporter
break;
}
if (importer != null)
{
try
{
importer.importData(context, db, input, password);
return ImportExportResult.Success;
}
catch(ZipException e)
{
return ImportExportResult.BadPassword;
}
catch(IOException | FormatException | InterruptedException | JSONException | ParseException | NullPointerException e)
{
String error = null;
if (importer != null) {
database.beginTransaction();
try {
importer.importData(context, database, input, password);
database.setTransactionSuccessful();
return new ImportExportResult(ImportExportResultType.Success);
} catch (ZipException e) {
if (e.getType().equals(ZipException.Type.WRONG_PASSWORD)) {
return new ImportExportResult(ImportExportResultType.BadPassword);
} else {
Log.e(TAG, "Failed to import data", e);
error = e.toString();
}
} catch (Exception e) {
Log.e(TAG, "Failed to import data", e);
error = e.toString();
} finally {
database.endTransaction();
}
}
else
{
Log.e(TAG, "Unsupported data format imported: " + format.name());
} else {
error = "Unsupported data format imported: " + format.name();
Log.e(TAG, error);
}
return ImportExportResult.GenericFailure;
return new ImportExportResult(ImportExportResultType.GenericFailure, error);
}
}

View File

@@ -3,6 +3,7 @@ package protect.card_locker.importexport;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.util.Log;
import com.google.zxing.BarcodeFormat;
@@ -26,6 +27,7 @@ import java.util.HashMap;
import protect.card_locker.CatimaBarcode;
import protect.card_locker.DBHelper;
import protect.card_locker.FormatException;
import protect.card_locker.ImageLocationType;
import protect.card_locker.R;
import protect.card_locker.Utils;
import protect.card_locker.ZipUtils;
@@ -33,23 +35,22 @@ import protect.card_locker.ZipUtils;
/**
* Class for importing a database from CSV (Comma Separate Values)
* formatted data.
*
* <p>
* The database's loyalty cards are expected to appear in the CSV data.
* A header is expected for the each table showing the names of the columns.
*/
public class StocardImporter implements Importer
{
public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
public class StocardImporter implements Importer {
private static final String TAG = "Catima";
public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException {
HashMap<String, HashMap<String, Object>> loyaltyCardHashMap = new HashMap<>();
HashMap<String, HashMap<String, String>> providers = new HashMap<>();
HashMap<String, HashMap<String, Object>> providers = new HashMap<>();
final CSVParser parser = new CSVParser(new InputStreamReader(context.getResources().openRawResource(R.raw.stocard_stores), StandardCharsets.UTF_8), CSVFormat.RFC4180.withHeader());
final CSVParser parser = new CSVParser(new InputStreamReader(context.getResources().openRawResource(R.raw.stocard_stores), StandardCharsets.UTF_8), CSVFormat.RFC4180.builder().setHeader().build());
try
{
for (CSVRecord record : parser)
{
HashMap<String, String> recordData = new HashMap<>();
try {
for (CSVRecord record : parser) {
HashMap<String, Object> recordData = new HashMap<>();
recordData.put("name", record.get("name"));
recordData.put("barcodeFormat", record.get("barcodeFormat"));
@@ -57,13 +58,15 @@ public class StocardImporter implements Importer
}
parser.close();
} catch(IllegalArgumentException|IllegalStateException e) {
} catch (IllegalArgumentException | IllegalStateException e) {
throw new FormatException("Issue parsing CSV data", e);
}
ZipInputStream zipInputStream = new ZipInputStream(input, password);
String[] providersFileName = null;
String[] customProvidersBaseName = null;
String customProviderId = "";
String[] cardBaseName = null;
String cardName = "";
LocalFileHeader localFileHeader;
@@ -71,77 +74,117 @@ public class StocardImporter implements Importer
String fileName = localFileHeader.getFileName();
String[] nameParts = fileName.split("/");
if (nameParts.length < 2) {
continue;
}
if (providersFileName == null) {
providersFileName = new String[] {
nameParts[0],
"sync",
"data",
providersFileName = new String[]{
"extracts",
nameParts[1],
"users",
nameParts[0],
"analytics-properties.json"
nameParts[1],
"analytics-properties",
"content.json"
};
cardBaseName = new String[] {
nameParts[0],
"sync",
"data",
customProvidersBaseName = new String[]{
"extracts",
nameParts[1],
"users",
nameParts[0],
nameParts[1],
"loyalty-card-custom-providers"
};
cardBaseName = new String[]{
"extracts",
nameParts[1],
"users",
nameParts[1],
"loyalty-cards"
};
}
if (startsWith(nameParts, customProvidersBaseName, 1)) {
// Extract providerId
customProviderId = nameParts[customProvidersBaseName.length].split("\\.", 2)[0];
// Name file
if (fileName.endsWith(customProviderId + "/content.json")) {
JSONObject jsonObject = ZipUtils.readJSON(zipInputStream);
providers = appendToHashMap(
providers,
customProviderId,
"name",
jsonObject.getString("name")
);
} else if (fileName.endsWith("logo.png")) {
providers = appendToHashMap(
providers,
customProviderId,
"logo",
ZipUtils.readImage(zipInputStream)
);
}
}
if (startsWith(nameParts, cardBaseName, 1)) {
// Extract cardName
cardName = nameParts[cardBaseName.length].split("\\.", 2)[0];
// This is the card itself
if (nameParts.length == cardBaseName.length + 1) {
// Ignore the .txt file
if (fileName.endsWith(".json")) {
JSONObject jsonObject = ZipUtils.readJSON(zipInputStream);
if (fileName.endsWith(cardName + "/content.json")) {
JSONObject jsonObject = ZipUtils.readJSON(zipInputStream);
loyaltyCardHashMap = appendToLoyaltyCardHashMap(
loyaltyCardHashMap,
cardName,
"cardId",
jsonObject.getString("input_id")
);
loyaltyCardHashMap = appendToLoyaltyCardHashMap(
loyaltyCardHashMap,
cardName,
"_providerId",
jsonObject
.getJSONObject("input_provider_reference")
.getString("identifier")
.substring("/loyalty-card-providers/".length())
);
loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap,
cardName,
"cardId",
jsonObject.getString("input_id")
);
if (jsonObject.has("input_barcode_format")) {
loyaltyCardHashMap = appendToLoyaltyCardHashMap(
loyaltyCardHashMap,
cardName,
"barcodeType",
jsonObject.getString("input_barcode_format")
);
}
// Provider ID can be either custom or not, extract whatever version is relevant
String customProviderPrefix = "/users/" + nameParts[1] + "/loyalty-card-custom-providers/";
String providerId = jsonObject
.getJSONObject("input_provider_reference")
.getString("identifier");
if (providerId.startsWith(customProviderPrefix)) {
providerId = providerId.substring(customProviderPrefix.length());
} else {
providerId = providerId.substring("/loyalty-card-providers/".length());
}
} else if (fileName.endsWith("notes/default.json")) {
loyaltyCardHashMap = appendToLoyaltyCardHashMap(
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,
cardName,
"note",
ZipUtils.readJSON(zipInputStream)
.getString("content")
.getString("content")
);
} else if (fileName.endsWith("/images/front.png")) {
loyaltyCardHashMap = appendToLoyaltyCardHashMap(
loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap,
cardName,
"frontImage",
ZipUtils.readImage(zipInputStream)
);
} else if (fileName.endsWith("/images/back.png")) {
loyaltyCardHashMap = appendToLoyaltyCardHashMap(
loyaltyCardHashMap = appendToHashMap(
loyaltyCardHashMap,
cardName,
"backImage",
@@ -155,40 +198,52 @@ public class StocardImporter implements Importer
throw new FormatException("Couldn't find any loyalty cards in this Stocard export.");
}
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
for (HashMap<String, Object> loyaltyCardData : loyaltyCardHashMap.values()) {
String providerId = (String) loyaltyCardData.get("_providerId");
HashMap<String, String> providerData = providers.get(providerId);
String store = providerData != null ? providerData.get("name") : providerId;
if (providerId == null) {
Log.d(TAG, "Missing providerId for card " + loyaltyCardData + ", ignoring...");
continue;
}
HashMap<String, Object> providerData = providers.get(providerId);
String store = providerData != null ? providerData.get("name").toString() : providerId;
String note = (String) Utils.mapGetOrDefault(loyaltyCardData, "note", "");
String cardId = (String) loyaltyCardData.get("cardId");
String barcodeTypeString = (String) Utils.mapGetOrDefault(loyaltyCardData, "barcodeType", providerData != null ? providerData.get("barcodeFormat") : null);
CatimaBarcode barcodeType = null;
if (barcodeTypeString != null) {
if (barcodeTypeString != null && !barcodeTypeString.isEmpty()) {
if (barcodeTypeString.equals("RSS_DATABAR_EXPANDED")) {
barcodeType = CatimaBarcode.fromBarcode(BarcodeFormat.RSS_EXPANDED);
} else if (barcodeTypeString.equals("GS1_128")) {
barcodeType = CatimaBarcode.fromBarcode(BarcodeFormat.CODE_128);
} else {
barcodeType = CatimaBarcode.fromName(barcodeTypeString);
}
}
long loyaltyCardInternalId = db.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0, null);
int headerColor = Utils.getRandomHeaderColor(context);
Bitmap cardIcon = null;
if (providerData != null && providerData.containsKey("logo")) {
cardIcon = (Bitmap) providerData.get("logo");
headerColor = Utils.getHeaderColorFromImage(cardIcon, headerColor);
}
long loyaltyCardInternalId = DBHelper.insertLoyaltyCard(database, store, note, null, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, 0, null,0);
if (cardIcon != null) {
Utils.saveCardImage(context, cardIcon, (int) loyaltyCardInternalId, ImageLocationType.icon);
}
if (loyaltyCardData.containsKey("frontImage")) {
Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("frontImage"), (int) loyaltyCardInternalId, true);
Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("frontImage"), (int) loyaltyCardInternalId, ImageLocationType.front);
}
if (loyaltyCardData.containsKey("backImage")) {
Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("backImage"), (int) loyaltyCardInternalId, false);
Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("backImage"), (int) loyaltyCardInternalId, ImageLocationType.back);
}
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
zipInputStream.close();
}
@@ -206,7 +261,7 @@ public class StocardImporter implements Importer
return true;
}
private HashMap<String, HashMap<String, Object>> appendToLoyaltyCardHashMap(HashMap<String, HashMap<String, Object>> loyaltyCardHashMap, String cardID, String key, Object value) {
private HashMap<String, HashMap<String, Object>> appendToHashMap(HashMap<String, HashMap<String, Object>> loyaltyCardHashMap, String cardID, String key, Object value) {
HashMap<String, Object> loyaltyCardData = loyaltyCardHashMap.get(cardID);
if (loyaltyCardData == null) {
loyaltyCardData = new HashMap<>();

View File

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

View File

@@ -12,44 +12,36 @@ import androidx.preference.PreferenceManager;
import protect.card_locker.R;
import protect.card_locker.Utils;
public class Settings
{
private Context context;
private SharedPreferences settings;
public class Settings {
private final Context mContext;
private SharedPreferences mSettings;
public Settings(Context context)
{
this.context = context;
this.settings = PreferenceManager.getDefaultSharedPreferences(context);
public Settings(Context context) {
mContext = context.getApplicationContext();
mSettings = PreferenceManager.getDefaultSharedPreferences(context);
}
private String getResString(@StringRes int resId)
{
return context.getString(resId);
private String getResString(@StringRes int resId) {
return mContext.getString(resId);
}
private int getResInt(@IntegerRes int resId)
{
return context.getResources().getInteger(resId);
private int getResInt(@IntegerRes int resId) {
return mContext.getResources().getInteger(resId);
}
private String getString(@StringRes int keyId, String defaultValue)
{
return settings.getString(getResString(keyId), defaultValue);
private String getString(@StringRes int keyId, String defaultValue) {
return mSettings.getString(getResString(keyId), defaultValue);
}
private int getInt(@StringRes int keyId, @IntegerRes int defaultId)
{
return settings.getInt(getResString(keyId), getResInt(defaultId));
private int getInt(@StringRes int keyId, @IntegerRes int defaultId) {
return mSettings.getInt(getResString(keyId), getResInt(defaultId));
}
private boolean getBoolean(@StringRes int keyId, boolean defaultValue)
{
return settings.getBoolean(getResString(keyId), defaultValue);
private boolean getBoolean(@StringRes int keyId, boolean defaultValue) {
return mSettings.getBoolean(getResString(keyId), defaultValue);
}
public Locale getLocale()
{
public Locale getLocale() {
String value = getString(R.string.settings_key_locale, "");
if (value.length() == 0) {
@@ -59,69 +51,39 @@ public class Settings
return Utils.stringToLocale(value);
}
public int getTheme()
{
public int getTheme() {
String value = getString(R.string.settings_key_theme, getResString(R.string.settings_key_system_theme));
if(value.equals(getResString(R.string.settings_key_light_theme)))
{
if (value.equals(getResString(R.string.settings_key_light_theme))) {
return AppCompatDelegate.MODE_NIGHT_NO;
}
else if(value.equals(getResString(R.string.settings_key_dark_theme)))
{
} else if (value.equals(getResString(R.string.settings_key_dark_theme))) {
return AppCompatDelegate.MODE_NIGHT_YES;
}
return AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
}
public double getFontSizeScale()
{
return getInt(R.string.settings_key_max_font_size_scale, R.integer.settings_max_font_size_scale_pct) / 100.0;
}
public int getSmallFont()
{
return 14;
}
public int getMediumFont()
{
return 28;
}
public int getLargeFont()
{
return 40;
}
public int getFontSizeMin(int fontSize)
{
return (int) (Math.round(fontSize / 2.0) - 1);
}
public int getFontSizeMax(int fontSize)
{
return (int) Math.round(fontSize * getFontSizeScale());
}
public boolean useMaxBrightnessDisplayingBarcode()
{
public boolean useMaxBrightnessDisplayingBarcode() {
return getBoolean(R.string.settings_key_display_barcode_max_brightness, true);
}
public boolean getLockBarcodeScreenOrientation()
{
return getBoolean(R.string.settings_key_lock_barcode_orientation, false);
public String getCardViewOrientation() {
return getString(R.string.settings_key_card_orientation, getResString(R.string.settings_key_follow_system_orientation));
}
public boolean getKeepScreenOn()
{
public boolean getKeepScreenOn() {
return getBoolean(R.string.settings_key_keep_screen_on, true);
}
public boolean getDisableLockscreenWhileViewingCard()
{
public boolean getDisableLockscreenWhileViewingCard() {
return getBoolean(R.string.settings_key_disable_lockscreen_while_viewing_card, true);
}
public boolean getOledDark() {
return getBoolean(R.string.settings_key_oled_dark, false);
}
public String getColor() {
return getString(R.string.setting_key_theme_color, mContext.getResources().getString(R.string.settings_key_system_theme));
}
}

View File

@@ -1,74 +1,97 @@
package protect.card_locker.preferences;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import com.google.android.material.color.DynamicColors;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import androidx.appcompat.app.ActionBar;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import nl.invissvenska.numberpickerpreference.NumberDialogPreference;
import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment;
import protect.card_locker.CatimaAppCompatActivity;
import protect.card_locker.MainActivity;
import protect.card_locker.R;
import protect.card_locker.Utils;
import protect.card_locker.databinding.SettingsActivityBinding;
public class SettingsActivity extends CatimaAppCompatActivity {
private SettingsActivityBinding binding;
private final static String RELOAD_MAIN_STATE = "mReloadMain";
private SettingsFragment fragment;
public class SettingsActivity extends CatimaAppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = SettingsActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.settings);
setContentView(R.layout.settings_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
enableToolbarBackButton();
// Display the fragment as the main content.
SettingsFragment fragment = new SettingsFragment();
fragment.setParentReference(this);
fragment = new SettingsFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.settings_container, fragment)
.commit();
// restore reload main state
if (savedInstanceState != null) {
fragment.mReloadMain = savedInstanceState.getBoolean(RELOAD_MAIN_STATE);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(RELOAD_MAIN_STATE, fragment.mReloadMain);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == android.R.id.home)
{
finish();
if (id == android.R.id.home) {
finishSettingsActivity();
return true;
}
return super.onOptionsItemSelected(item);
}
public static class SettingsFragment extends PreferenceFragmentCompat
{
private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment";
private SettingsActivity parent;
@Override
public void onBackPressed() {
finishSettingsActivity();
}
public void setParentReference(SettingsActivity settingsActivity) {
parent = settingsActivity;
private void finishSettingsActivity() {
if (fragment.mReloadMain) {
Intent intent = new Intent();
intent.putExtra(MainActivity.RESTART_ACTIVITY_INTENT, true);
setResult(Activity.RESULT_OK, intent);
} else {
setResult(Activity.RESULT_OK);
}
finish();
}
public static class SettingsFragment extends PreferenceFragmentCompat {
private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment";
public boolean mReloadMain;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -102,49 +125,39 @@ public class SettingsActivity extends CatimaAppCompatActivity
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
return true;
});
Preference colorPreference = findPreference(getResources().getString(R.string.setting_key_theme_color));
localePreference.setOnPreferenceChangeListener((preference, newValue) -> {
refreshActivity(true);
return true;
});
Preference oledDarkPreference = findPreference(getResources().getString(R.string.settings_key_oled_dark));
assert oledDarkPreference != null;
oledDarkPreference.setOnPreferenceChangeListener((preference, newValue) -> {
refreshActivity(true);
return true;
});
ListPreference colorPreference = findPreference(getResources().getString(R.string.setting_key_theme_color));
assert colorPreference != null;
colorPreference.setOnPreferenceChangeListener((preference, o) -> {
FragmentActivity activity = getActivity();
if (activity != null) {
ActivityCompat.recreate(activity);
}
return true;
});
localePreference.setOnPreferenceChangeListener((preference, newValue) -> {
// Refresh the activity
parent.finish();
startActivity(parent.getIntent());
refreshActivity(true);
return true;
});
if (!DynamicColors.isDynamicColorAvailable()) {
colorPreference.setEntryValues(R.array.color_values_no_dynamic);
colorPreference.setEntries(R.array.color_value_strings_no_dynamic);
}
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof NumberDialogPreference) {
NumberDialogPreference dialogPreference = (NumberDialogPreference) preference;
DialogFragment dialogFragment = NumberPickerPreferenceDialogFragment
.newInstance(
dialogPreference.getKey(),
dialogPreference.getMinValue(),
dialogPreference.getMaxValue(),
dialogPreference.getStepValue(),
dialogPreference.getUnitText()
);
dialogFragment.setTargetFragment(this, 0);
dialogFragment.show(getParentFragmentManager(), DIALOG_FRAGMENT_TAG);
} else {
super.onDisplayPreferenceDialog(preference);
private void refreshActivity(boolean reloadMain) {
mReloadMain = reloadMain || mReloadMain;
Activity activity = getActivity();
if (activity != null) {
activity.recreate();
}
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="0"
android:propertyName="alpha"
android:valueFrom="1.0"
android:valueTo="0.0" />
<objectAnimator
android:duration="@integer/full_rotation_duration"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:propertyName="rotationY"
android:valueFrom="-180"
android:valueTo="0" />
<objectAnimator
android:duration="1"
android:propertyName="alpha"
android:startOffset="@integer/half_rotation_duration"
android:valueFrom="0.0"
android:valueTo="1.0" />
</set>

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="@integer/full_rotation_duration"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:propertyName="rotationY"
android:valueFrom="0"
android:valueTo="180" />
<objectAnimator
android:duration="1"
android:propertyName="alpha"
android:startOffset="@integer/half_rotation_duration"
android:valueFrom="1.0"
android:valueTo="0.0" />
</set>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="0"
android:propertyName="alpha"
android:valueFrom="1.0"
android:valueTo="0.0" />
<objectAnimator
android:duration="@integer/full_rotation_duration"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:propertyName="rotationY"
android:valueFrom="180"
android:valueTo="0" />
<objectAnimator
android:duration="1"
android:propertyName="alpha"
android:startOffset="@integer/half_rotation_duration"
android:valueFrom="0.0"
android:valueTo="1.0" />
</set>

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="@integer/full_rotation_duration"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:propertyName="rotationY"
android:valueFrom="0"
android:valueTo="-180" />
<objectAnimator
android:duration="1"
android:propertyName="alpha"
android:startOffset="@integer/half_rotation_duration"
android:valueFrom="1.0"
android:valueTo="0.0" />
</set>

View File

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

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#BD0000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M10.94,8.12L7.48,4.66L9,3h6l1.83,2H20c1.1,0 2,0.9 2,2v12c0,0.05 -0.01,0.1 -0.02,0.16l-5.1,-5.1C16.96,13.71 17,13.36 17,13c0,-2.76 -2.24,-5 -5,-5C11.64,8 11.29,8.04 10.94,8.12zM20.49,23.31L18.17,21H4c-1.1,0 -2,-0.9 -2,-2V7c0,-0.59 0.27,-1.12 0.68,-1.49l-2,-2L2.1,2.1l19.8,19.8L20.49,23.31zM14.49,17.32l-1.5,-1.5C12.67,15.92 12.35,16 12,16c-1.66,0 -3,-1.34 -3,-3c0,-0.35 0.08,-0.67 0.19,-0.98l-1.5,-1.5C7.25,11.24 7,12.09 7,13c0,2.76 2.24,5 5,5C12.91,18 13.76,17.75 14.49,17.32z"/>
</vector>

View File

@@ -0,0 +1,24 @@
<layer-list xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="?attr/colorSurface" />
<corners
android:bottomLeftRadius="28dp"
android:bottomRightRadius="28dp"
android:topLeftRadius="28dp"
android:topRightRadius="28dp" />
</shape>
</item>
<item>
<shape>
<solid android:color="@color/m3_popupmenu_overlay_color"
tools:ignore="PrivateResource" />
<corners
android:bottomLeftRadius="28dp"
android:bottomRightRadius="28dp"
android:topLeftRadius="28dp"
android:topRightRadius="28dp" />
</shape>
</item>
</layer-list>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@android:color/white">
<path
android:fillColor="@android:color/white"
android:pathData="M20.54,5.23l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6c-0.47,0 -0.88,0.21 -1.16,0.55L3.46,5.23C3.17,5.57 3,6.02 3,6.5V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5c0,-0.48 -0.17,-0.93 -0.46,-1.27zM12,17.5L6.5,12H10v-2h4v2h3.5L12,17.5zM5.12,5l0.81,-1h12l0.94,1H5.12z"/>
</vector>

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@android:color/black">
<path
android:fillColor="@android:color/black"
android:pathData="M20.54,5.23l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6c-0.47,0 -0.88,0.21 -1.16,0.55L3.46,5.23C3.17,5.57 3,6.02 3,6.5V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5c0,-0.48 -0.17,-0.93 -0.46,-1.27zM12,17.5L6.5,12H10v-2h4v2h3.5L12,17.5zM5.12,5l0.81,-1h12l0.94,1H5.12z"/>
</vector>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7,10l5,5 5,-5z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7,14l5,-5 5,5z"/>

View File

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

View File

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

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z"/>
</vector>

View File

@@ -1,5 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
<path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>

View File

@@ -1,5 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#FFFFFF" android:viewportHeight="24"
android:tint="?attr/colorControlNormal" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7.41,18.59L8.83,20 12,16.83 15.17,20l1.41,-1.41L12,14l-4.59,4.59zM16.59,5.41L15.17,4 12,7.17 8.83,4 7.41,5.41 12,10l4.59,-4.59z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,5.83L15.17,9l1.41,-1.41L12,3 7.41,7.59 8.83,9 12,5.83zM12,18.17L8.83,15l-1.41,1.41L12,21l4.59,-4.59L15.17,15 12,18.17z"/>
</vector>

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