Compare commits

...

83 Commits

Author SHA1 Message Date
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
314 changed files with 1996 additions and 1171 deletions

View File

@@ -1,5 +1,11 @@
# Changelog # Changelog
## 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 ## v2.22.1 - 119
- Use Material You colours on more devices (Google library update) - Use Material You colours on more devices (Google library update)

View File

@@ -3,21 +3,21 @@ GEM
specs: specs:
CFPropertyList (3.0.6) CFPropertyList (3.0.6)
rexml rexml
addressable (2.8.1) addressable (2.8.4)
public_suffix (>= 2.0.2, < 6.0) public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15) artifactory (3.0.15)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.2.0) aws-eventstream (1.2.0)
aws-partitions (1.701.0) aws-partitions (1.749.0)
aws-sdk-core (3.170.0) aws-sdk-core (3.171.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5) aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.62.0) aws-sdk-kms (1.63.0)
aws-sdk-core (~> 3, >= 3.165.0) aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.119.0) aws-sdk-s3 (1.120.1)
aws-sdk-core (~> 3, >= 3.165.0) aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4) aws-sigv4 (~> 1.4)
@@ -36,7 +36,7 @@ GEM
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
dotenv (2.8.1) dotenv (2.8.1)
emoji_regex (3.2.3) emoji_regex (3.2.3)
excon (0.98.0) excon (0.99.0)
faraday (1.10.3) faraday (1.10.3)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
@@ -66,7 +66,7 @@ GEM
faraday_middleware (1.2.0) faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.2.6) fastimage (2.2.6)
fastlane (2.211.0) fastlane (2.212.2)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@@ -106,9 +106,9 @@ GEM
xcpretty (~> 0.3.0) xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3) xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.32.0) google-apis-androidpublisher_v3 (0.39.0)
google-apis-core (>= 0.9.1, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.10.0) google-apis-core (0.11.0)
addressable (~> 2.5, >= 2.5.1) addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a) httpclient (>= 2.8.1, < 3.a)
@@ -117,10 +117,10 @@ GEM
retriable (>= 2.0, < 4.a) retriable (>= 2.0, < 4.a)
rexml rexml
webrick webrick
google-apis-iamcredentials_v1 (0.16.0) google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.9.1, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.12.0) google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.9.1, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.19.0) google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.9.0, < 2.a) google-apis-core (>= 0.9.0, < 2.a)
google-cloud-core (1.6.0) google-cloud-core (1.6.0)
@@ -128,7 +128,7 @@ GEM
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0) google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0) faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.0) google-cloud-errors (1.3.1)
google-cloud-storage (1.44.0) google-cloud-storage (1.44.0)
addressable (~> 2.8) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
@@ -137,7 +137,7 @@ GEM
google-cloud-core (~> 1.6) google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0) mini_mime (~> 1.0)
googleauth (1.3.0) googleauth (1.5.2)
faraday (>= 0.17.3, < 3.a) faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
memoist (~> 0.16) memoist (~> 0.16)
@@ -150,7 +150,7 @@ GEM
httpclient (2.8.3) httpclient (2.8.3)
jmespath (1.6.2) jmespath (1.6.2)
json (2.6.3) json (2.6.3)
jwt (2.6.0) jwt (2.7.0)
memoist (0.16.2) memoist (0.16.2)
mini_magick (4.12.0) mini_magick (4.12.0)
mini_mime (1.1.2) mini_mime (1.1.2)
@@ -160,7 +160,7 @@ GEM
naturally (2.2.1) naturally (2.2.1)
optparse (0.1.1) optparse (0.1.1)
os (1.1.4) os (1.1.4)
plist (3.6.0) plist (3.7.0)
public_suffix (5.0.1) public_suffix (5.0.1)
rake (13.0.6) rake (13.0.6)
representable (3.2.0) representable (3.2.0)

View File

@@ -19,8 +19,8 @@ android {
applicationId "me.hackerchick.catima" applicationId "me.hackerchick.catima"
minSdk 21 minSdk 21
targetSdk 33 targetSdk 33
versionCode 119 versionCode 120
versionName "2.22.1" versionName "2.23.0"
vectorDrawables.useSupportLibrary true vectorDrawables.useSupportLibrary true
multiDexEnabled true multiDexEnabled true
@@ -111,7 +111,7 @@ dependencies {
// Testing // Testing
testImplementation 'androidx.test:core:1.5.0' testImplementation 'androidx.test:core:1.5.0'
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
testImplementation 'org.robolectric:robolectric:4.10' testImplementation 'org.robolectric:robolectric:4.10.3'
} }
tasks.withType(SpotBugsTask) { tasks.withType(SpotBugsTask) {

View File

@@ -39,6 +39,13 @@ public class AboutActivity extends CatimaAppCompatActivity {
binding.privacy.setTag("https://catima.app/privacy-policy/"); binding.privacy.setTag("https://catima.app/privacy-policy/");
binding.reportError.setTag("https://github.com/CatimaLoyalty/Android/issues"); binding.reportError.setTag("https://github.com/CatimaLoyalty/Android/issues");
binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima"); binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima");
binding.donate.setTag("https://catima.app/contribute/#donating");
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);
bindClickListeners(); bindClickListeners();
} }
@@ -74,6 +81,7 @@ public class AboutActivity extends CatimaAppCompatActivity {
binding.privacy.setOnClickListener(openExternalBrowser); binding.privacy.setOnClickListener(openExternalBrowser);
binding.reportError.setOnClickListener(openExternalBrowser); binding.reportError.setOnClickListener(openExternalBrowser);
binding.rate.setOnClickListener(openExternalBrowser); binding.rate.setOnClickListener(openExternalBrowser);
binding.donate.setOnClickListener(openExternalBrowser);
binding.credits.setOnClickListener(view -> showCredits()); binding.credits.setOnClickListener(view -> showCredits());
} }
@@ -86,6 +94,8 @@ public class AboutActivity extends CatimaAppCompatActivity {
binding.privacy.setOnClickListener(null); binding.privacy.setOnClickListener(null);
binding.reportError.setOnClickListener(null); binding.reportError.setOnClickListener(null);
binding.rate.setOnClickListener(null); binding.rate.setOnClickListener(null);
binding.donate.setOnClickListener(null);
binding.credits.setOnClickListener(null); binding.credits.setOnClickListener(null);
} }

View File

@@ -0,0 +1,5 @@
package protect.card_locker;
public interface BarcodeImageWriterResultCallback {
void onBarcodeImageWriterResult(boolean success);
}

View File

@@ -42,12 +42,12 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
private final int imageHeight; private final int imageHeight;
private final int imageWidth; private final int imageWidth;
private final boolean showFallback; private final boolean showFallback;
private final Runnable callback; private final BarcodeImageWriterResultCallback callback;
BarcodeImageWriterTask( BarcodeImageWriterTask(
Context context, ImageView imageView, String cardIdString, Context context, ImageView imageView, String cardIdString,
CatimaBarcode barcodeFormat, TextView textView, CatimaBarcode barcodeFormat, TextView textView,
boolean showFallback, Runnable callback, boolean roundCornerPadding boolean showFallback, BarcodeImageWriterResultCallback callback, boolean roundCornerPadding
) { ) {
mContext = context; mContext = context;
@@ -282,7 +282,7 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
} }
if (callback != null) { if (callback != null) {
callback.run(); callback.onBarcodeImageWriterResult(isSuccesful);
} }
} }

View File

@@ -17,7 +17,6 @@ import protect.card_locker.databinding.GroupLayoutBinding;
import protect.card_locker.preferences.Settings; import protect.card_locker.preferences.Settings;
public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder> { public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder> {
Settings mSettings;
public final Context mContext; public final Context mContext;
private final GroupAdapterListener mListener; private final GroupAdapterListener mListener;
SQLiteDatabase mDatabase; SQLiteDatabase mDatabase;
@@ -25,7 +24,6 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupAdapterListener inputListener) { public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupAdapterListener inputListener) {
super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER); super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER);
setHasStableIds(true); setHasStableIds(true);
mSettings = new Settings(inputContext);
mContext = inputContext; mContext = inputContext;
mListener = inputListener; mListener = inputListener;
mDatabase = new DBHelper(inputContext).getReadableDatabase(); mDatabase = new DBHelper(inputContext).getReadableDatabase();
@@ -63,8 +61,6 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
} }
inputHolder.mCardCount.setText(cardCountText); inputHolder.mCardCount.setText(cardCountText);
inputHolder.mName.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
inputHolder.mCardCount.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
applyClickEvents(inputHolder); applyClickEvents(inputHolder);
} }

View File

@@ -35,7 +35,6 @@ 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 int mCurrentSelectedIndex = -1;
Settings mSettings;
boolean mDarkModeEnabled; boolean mDarkModeEnabled;
public final Context mContext; public final Context mContext;
private final CardAdapterListener mListener; private final CardAdapterListener mListener;
@@ -47,7 +46,6 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public LoyaltyCardCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener) { public LoyaltyCardCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener) {
super(inputCursor, DBHelper.LoyaltyCardDbIds.ID); super(inputCursor, DBHelper.LoyaltyCardDbIds.ID);
setHasStableIds(true); setHasStableIds(true);
mSettings = new Settings(inputContext);
mContext = inputContext; mContext = inputContext;
mListener = inputListener; mListener = inputListener;
mSelectedItems = new SparseBooleanArray(); mSelectedItems = new SparseBooleanArray();
@@ -107,7 +105,6 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor); LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor);
inputHolder.setStoreField(loyaltyCard.store);
if (mShowDetails && !loyaltyCard.note.isEmpty()) { if (mShowDetails && !loyaltyCard.note.isEmpty()) {
inputHolder.setNoteField(loyaltyCard.note); inputHolder.setNoteField(loyaltyCard.note);
} else { } else {
@@ -132,15 +129,8 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.setExtraField(inputHolder.mExpiryField, null, null); inputHolder.setExtraField(inputHolder.mExpiryField, null, null);
} }
setHeaderHeight(inputHolder, mShowDetails); inputHolder.mCardIcon.setContentDescription(loyaltyCard.store);
Bitmap cardIcon = Utils.retrieveCardImage(mContext, loyaltyCard.id, ImageLocationType.icon); Utils.setIconOrTextWithBackground(mContext, loyaltyCard, inputHolder.mCardIcon, inputHolder.mCardText);
if (cardIcon != null) {
inputHolder.mCardIcon.setImageBitmap(cardIcon);
inputHolder.mCardIcon.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
inputHolder.mCardIcon.setImageBitmap(Utils.generateIcon(mContext, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile());
inputHolder.mCardIcon.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : androidx.appcompat.R.attr.colorPrimary); inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : androidx.appcompat.R.attr.colorPrimary);
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition())); inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
@@ -153,19 +143,6 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.mRow.requestLayout(); inputHolder.mRow.requestLayout();
} }
private void setHeaderHeight(LoyaltyCardListItemViewHolder inputHolder, boolean expanded) {
int iconHeight;
if (expanded) {
iconHeight = ViewGroup.LayoutParams.MATCH_PARENT;
} else {
iconHeight = (int) mContext.getResources().getDimension(R.dimen.cardThumbnailSize);
}
inputHolder.mIconLayout.getLayoutParams().height = expanded ? 0 : iconHeight;
inputHolder.mCardIcon.getLayoutParams().height = iconHeight;
inputHolder.mTickIcon.getLayoutParams().height = iconHeight;
}
private void applyClickEvents(LoyaltyCardListItemViewHolder inputHolder, final int inputPosition) { private void applyClickEvents(LoyaltyCardListItemViewHolder inputHolder, final int inputPosition) {
inputHolder.mRow.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition)); inputHolder.mRow.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition));
@@ -241,28 +218,25 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder { public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mStoreField, mNoteField, mBalanceField, mValidFromField, mExpiryField; public TextView mCardText, mNoteField, mBalanceField, mValidFromField, mExpiryField;
public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground; public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground;
public MaterialCardView mRow, mIconLayout; public MaterialCardView mRow;
public ConstraintLayout mStar, mArchived; public ConstraintLayout mStar, mArchived;
public View mDivider; public View mDivider;
private int mIconBackgroundColor; private int mIconBackgroundColor;
protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) { protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) {
super(loyaltyCardLayoutBinding.getRoot()); super(loyaltyCardLayoutBinding.getRoot());
View inputView = loyaltyCardLayoutBinding.getRoot(); View inputView = loyaltyCardLayoutBinding.getRoot();
mRow = loyaltyCardLayoutBinding.row; mRow = loyaltyCardLayoutBinding.row;
mDivider = loyaltyCardLayoutBinding.infoDivider; mDivider = loyaltyCardLayoutBinding.infoDivider;
mStoreField = loyaltyCardLayoutBinding.store;
mNoteField = loyaltyCardLayoutBinding.note; mNoteField = loyaltyCardLayoutBinding.note;
mBalanceField = loyaltyCardLayoutBinding.balance; mBalanceField = loyaltyCardLayoutBinding.balance;
mValidFromField = loyaltyCardLayoutBinding.validFrom; mValidFromField = loyaltyCardLayoutBinding.validFrom;
mExpiryField = loyaltyCardLayoutBinding.expiry; mExpiryField = loyaltyCardLayoutBinding.expiry;
mIconLayout = loyaltyCardLayoutBinding.iconLayout;
mCardIcon = loyaltyCardLayoutBinding.thumbnail; mCardIcon = loyaltyCardLayoutBinding.thumbnail;
mCardText = loyaltyCardLayoutBinding.thumbnailText;
mStar = loyaltyCardLayoutBinding.star; mStar = loyaltyCardLayoutBinding.star;
mStarBackground = loyaltyCardLayoutBinding.starBackground; mStarBackground = loyaltyCardLayoutBinding.starBackground;
mStarBorder = loyaltyCardLayoutBinding.starBorder; mStarBorder = loyaltyCardLayoutBinding.starBorder;
@@ -285,20 +259,15 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
return; return;
} }
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
field.setVisibility(View.VISIBLE); field.setVisibility(View.VISIBLE);
field.setText(text); field.setText(text);
field.setTextSize(size);
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))); field.setTextColor(color != null ? color : MaterialColors.getColor(mContext, com.google.android.material.R.attr.colorSecondary, ContextCompat.getColor(mContext, mDarkModeEnabled ? R.color.md_theme_dark_secondary : R.color.md_theme_light_secondary)));
int drawableSize = dpToPx((size * 24) / 14, mContext);
mDivider.setVisibility(View.VISIBLE); mDivider.setVisibility(View.VISIBLE);
field.setVisibility(View.VISIBLE); field.setVisibility(View.VISIBLE);
Drawable icon = field.getCompoundDrawables()[0]; Drawable icon = field.getCompoundDrawables()[0];
if (icon != null) { if (icon != null) {
icon.mutate(); icon.mutate();
icon.setBounds(0, 0, drawableSize, drawableSize);
field.setCompoundDrawablesRelative(icon, null, null, null); field.setCompoundDrawablesRelative(icon, null, null, null);
if (color != null) { if (color != null) {
@@ -311,19 +280,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
field.requestLayout(); field.requestLayout();
} }
public void setStoreField(String text) {
mStoreField.setText(text);
mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
mStoreField.requestLayout();
}
public void setNoteField(String text) { public void setNoteField(String text) {
if (text == null) { if (text == null) {
mNoteField.setVisibility(View.GONE); mNoteField.setVisibility(View.GONE);
} else { } else {
mNoteField.setVisibility(View.VISIBLE); mNoteField.setVisibility(View.VISIBLE);
mNoteField.setText(text); mNoteField.setText(text);
mNoteField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
} }
mNoteField.requestLayout(); mNoteField.requestLayout();
} }

View File

@@ -83,7 +83,7 @@ import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.LayoutChipChoiceBinding; import protect.card_locker.databinding.LayoutChipChoiceBinding;
import protect.card_locker.databinding.LoyaltyCardEditActivityBinding; import protect.card_locker.databinding.LoyaltyCardEditActivityBinding;
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements BarcodeImageWriterResultCallback {
private LoyaltyCardEditActivityBinding binding; private LoyaltyCardEditActivityBinding binding;
private static final String TAG = "Catima"; private static final String TAG = "Catima";
@@ -169,8 +169,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
AlertDialog confirmExitDialog = null; AlertDialog confirmExitDialog = null;
boolean validBalance = true; boolean validBalance = true;
Runnable barcodeImageGenerationFinishedCallback;
HashMap<String, Currency> currencies = new HashMap<>(); HashMap<String, Currency> currencies = new HashMap<>();
LoyaltyCard tempLoyaltyCard; LoyaltyCard tempLoyaltyCard;
@@ -348,13 +346,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
enterButton = binding.enterButton; enterButton = binding.enterButton;
barcodeImageGenerationFinishedCallback = () -> {
if (!(boolean) barcodeImage.getTag()) {
barcodeImageLayout.setVisibility(View.GONE);
Toast.makeText(LoyaltyCardEditActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
}
};
storeFieldEdit.addTextChangedListener(new SimpleTextWatcher() { storeFieldEdit.addTextChangedListener(new SimpleTextWatcher() {
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
@@ -1129,7 +1120,12 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
Uri photoURI = FileProvider.getUriForFile(LoyaltyCardEditActivity.this, BuildConfig.APPLICATION_ID, Utils.createTempFile(this, TEMP_CAMERA_IMAGE_NAME)); Uri photoURI = FileProvider.getUriForFile(LoyaltyCardEditActivity.this, BuildConfig.APPLICATION_ID, Utils.createTempFile(this, TEMP_CAMERA_IMAGE_NAME));
mRequestedImage = type; mRequestedImage = type;
mPhotoTakerLauncher.launch(photoURI); try {
mPhotoTakerLauncher.launch(photoURI);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.cameraPermissionDeniedTitle, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
} }
private void selectImageFromGallery(int type) { private void selectImageFromGallery(int type) {
@@ -1150,6 +1146,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
} }
} }
@Override
public void onBarcodeImageWriterResult(boolean success) {
if (!success) {
barcodeImageLayout.setVisibility(View.GONE);
Toast.makeText(LoyaltyCardEditActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
}
}
class EditCardIdAndBarcode implements View.OnClickListener { class EditCardIdAndBarcode implements View.OnClickListener {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@@ -1547,13 +1551,13 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this); barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known"); Log.d(TAG, "ImageView size now known");
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, barcodeImageGenerationFinishedCallback, true); BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, LoyaltyCardEditActivity.this, true);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
} }
}); });
} else { } else {
Log.d(TAG, "ImageView size known known, creating barcode"); Log.d(TAG, "ImageView size known known, creating barcode");
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, barcodeImageGenerationFinishedCallback, true); BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, this, true);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
} }
} }

View File

@@ -9,8 +9,6 @@ import android.content.res.Configuration;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.Rect;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@@ -23,13 +21,10 @@ import android.text.style.ForegroundColorSpan;
import android.text.util.Linkify; import android.text.util.Linkify;
import android.util.Log; import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.view.Window; import android.view.Window;
import android.view.WindowInsets; import android.view.WindowInsets;
@@ -47,23 +42,17 @@ import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Guideline;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.FileProvider; import androidx.core.content.FileProvider;
import androidx.core.graphics.BlendModeColorFilterCompat; import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat; import androidx.core.graphics.BlendModeCompat;
import androidx.core.graphics.ColorUtils; import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.view.WindowInsetsControllerCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import androidx.core.widget.TextViewCompat; import androidx.core.widget.TextViewCompat;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.bottomappbar.BottomAppBar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputEditText;
import java.io.File; import java.io.File;
@@ -82,31 +71,10 @@ import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding; import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding;
import protect.card_locker.preferences.Settings; import protect.card_locker.preferences.Settings;
public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements GestureDetector.OnGestureListener { public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements BarcodeImageWriterResultCallback {
private LoyaltyCardViewLayoutBinding binding; private LoyaltyCardViewLayoutBinding binding;
private static final String TAG = "Catima"; private static final String TAG = "Catima";
private GestureDetector mGestureDetector;
CoordinatorLayout coordinatorLayout;
ConstraintLayout mainLayout;
TextView cardIdFieldView;
BottomAppBar bottomAppBar;
ImageButton bottomAppBarInfoButton;
ImageButton bottomAppBarPreviousButton;
ImageButton bottomAppBarNextButton;
ImageButton bottomAppBarUpdateBalanceButton;
AppCompatTextView storeName;
ImageButton maximizeButton;
ImageView mainImage;
LinearLayout dotIndicator;
ImageButton minimizeButton;
View collapsingToolbarLayout;
AppBarLayout appBarLayout;
ImageView iconImage;
Toolbar portraitToolbar;
Toolbar landscapeToolbar;
int loyaltyCardId; int loyaltyCardId;
ArrayList<Integer> cardList; ArrayList<Integer> cardList;
@@ -121,56 +89,36 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
String barcodeIdString; String barcodeIdString;
CatimaBarcode format; CatimaBarcode format;
FloatingActionButton editButton;
Guideline centerGuideline;
SeekBar barcodeScaler;
Bitmap frontImageBitmap; Bitmap frontImageBitmap;
Bitmap backImageBitmap; Bitmap backImageBitmap;
boolean starred;
boolean backgroundNeedsDarkIcons; boolean backgroundNeedsDarkIcons;
boolean isFullscreen = false; boolean isFullscreen = false;
ImageView barcodeRenderTarget;
int mainImageIndex = 0; int mainImageIndex = 0;
List<ImageType> imageTypes; List<ImageType> imageTypes;
private ImageView[] dots;
boolean isBarcodeSupported = true; boolean isBarcodeSupported = true;
static final String STATE_IMAGEINDEX = "imageIndex"; static final String STATE_IMAGEINDEX = "imageIndex";
static final String STATE_FULLSCREEN = "isFullscreen"; static final String STATE_FULLSCREEN = "isFullscreen";
private final int HEADER_FILTER_ALPHA = 127;
final private TaskHandler mTasks = new TaskHandler(); final private TaskHandler mTasks = new TaskHandler();
Runnable barcodeImageGenerationFinishedCallback; Runnable barcodeImageGenerationFinishedCallback;
@Override public void onMainImageTap() {
public boolean onDown(MotionEvent e) { // If we're in fullscreen, leave fullscreen
return true; if (isFullscreen) {
} setFullscreen(false);
return;
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (imageTypes.size() > 1) {
Toast.makeText(this, getString(R.string.swipeToSwitchImages), Toast.LENGTH_SHORT).show();
} }
return false; // If the barcode is shown, switch to fullscreen layout
} if (imageTypes.get(mainImageIndex) == ImageType.BARCODE) {
setFullscreen(true);
return;
}
@Override // If this is an image, open it in the gallery.
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
openCurrentMainImageInGallery(); openCurrentMainImageInGallery();
} }
@@ -212,46 +160,17 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} }
@Override @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { public void onBarcodeImageWriterResult(boolean success) {
Log.d(TAG, "On fling"); if (!success) {
imageTypes.remove(ImageType.BARCODE);
if (Math.abs(velocityY) > (0.75 * Math.abs(velocityX))) { setStateBasedOnImageTypes();
// Vertical swipe
// Swipe up
if (velocityY < -150) {
if (!isFullscreen) {
setFullscreen(true);
}
return false;
}
// Swipe down // Call correct drawMainImage
if (velocityY > 150) { setFullscreen(isFullscreen);
if (isFullscreen) {
setFullscreen(false);
}
return false;
}
} else if (Math.abs(velocityX) > (0.75 * Math.abs(velocityY))) {
// Horizontal swipe
// Swipe right
if (velocityX < -150) {
setMainImage(true, false);
return false;
}
// Swipe left Toast.makeText(LoyaltyCardViewActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
if (velocityX > 150) {
setMainImage(false, false);
return false;
}
} }
if (imageTypes.size() > 1) {
Toast.makeText(this, getString(R.string.swipeToSwitchImages), Toast.LENGTH_SHORT).show();
}
return true;
} }
enum ImageType { enum ImageType {
@@ -268,40 +187,13 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
Log.d(TAG, "View activity: id=" + loyaltyCardId); Log.d(TAG, "View activity: id=" + loyaltyCardId);
} }
private Drawable getDotIcon(boolean active, boolean darkMode) { private void setScalerGuideline(int zoomLevel) {
Drawable unwrappedIcon = AppCompatResources.getDrawable(this, active ? R.drawable.active_dot : R.drawable.inactive_dot);
assert unwrappedIcon != null;
Drawable wrappedIcon = DrawableCompat.wrap(unwrappedIcon);
if (darkMode) {
DrawableCompat.setTint(wrappedIcon, Color.WHITE);
} else {
DrawableCompat.setTint(wrappedIcon, Color.BLACK);
}
return wrappedIcon;
}
private Drawable getIcon(int icon, boolean dark) {
Drawable unwrappedIcon = AppCompatResources.getDrawable(this, icon);
assert unwrappedIcon != null;
Drawable wrappedIcon = DrawableCompat.wrap(unwrappedIcon);
wrappedIcon.mutate();
if (dark) {
DrawableCompat.setTint(wrappedIcon, Color.BLACK);
} else {
DrawableCompat.setTintList(wrappedIcon, null);
}
return wrappedIcon;
}
private void setCenterGuideline(int zoomLevel) {
float scale = zoomLevel / 100f; float scale = zoomLevel / 100f;
if (format != null && format.isSquare()) { if (format != null && format.isSquare()) {
centerGuideline.setGuidelinePercent(0.75f * scale); binding.scalerGuideline.setGuidelinePercent(0.75f * scale);
} else { } else {
centerGuideline.setGuidelinePercent(0.5f * scale); binding.scalerGuideline.setGuidelinePercent(0.5f * scale);
} }
} }
@@ -329,6 +221,9 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
binding = LoyaltyCardViewLayoutBinding.inflate(getLayoutInflater()); binding = LoyaltyCardViewLayoutBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
settings = new Settings(this); settings = new Settings(this);
@@ -355,43 +250,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
database = new DBHelper(this).getWritableDatabase(); database = new DBHelper(this).getWritableDatabase();
importURIHelper = new ImportURIHelper(this); importURIHelper = new ImportURIHelper(this);
coordinatorLayout = binding.coordinatorLayout; binding.barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
mainLayout = binding.mainLayout;
cardIdFieldView = binding.cardIdView;
storeName = binding.storeName;
maximizeButton = binding.maximizeButton;
mainImage = binding.mainImage;
mainImage.setClipToOutline(true);
dotIndicator = binding.dotIndicator;
minimizeButton = binding.minimizeButton;
collapsingToolbarLayout = binding.collapsingToolbarLayout;
appBarLayout = binding.appBarLayout;
bottomAppBar = binding.bottomAppBar;
iconImage = binding.iconImage;
portraitToolbar = binding.toolbar;
landscapeToolbar = binding.toolbarLandscape;
bottomAppBarInfoButton = binding.buttonShowInfo;
bottomAppBarPreviousButton = binding.buttonPrevious;
bottomAppBarNextButton = binding.buttonNext;
bottomAppBarUpdateBalanceButton = binding.buttonUpdateBalance;
barcodeImageGenerationFinishedCallback = () -> {
if (!(boolean) mainImage.getTag()) {
mainImage.setVisibility(View.GONE);
imageTypes.remove(ImageType.BARCODE);
// Redraw UI
setDotIndicator(Utils.isDarkModeEnabled(LoyaltyCardViewActivity.this));
setFullscreen(isFullscreen);
Toast.makeText(LoyaltyCardViewActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
}
};
centerGuideline = binding.centerGuideline;
barcodeScaler = binding.barcodeScaler;
barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (!fromUser) { if (!fromUser) {
@@ -399,14 +258,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return; return;
} }
Log.d(TAG, "Progress is " + progress); Log.d(TAG, "Progress is " + progress);
Log.d(TAG, "Max is " + barcodeScaler.getMax()); Log.d(TAG, "Max is " + binding.barcodeScaler.getMax());
float scale = (float) progress / (float) barcodeScaler.getMax(); float scale = (float) progress / (float) binding.barcodeScaler.getMax();
Log.d(TAG, "Scaling to " + scale); Log.d(TAG, "Scaling to " + scale);
loyaltyCard.zoomLevel = progress; loyaltyCard.zoomLevel = progress;
DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel); DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel);
setCenterGuideline(loyaltyCard.zoomLevel); setScalerGuideline(loyaltyCard.zoomLevel);
drawMainImage(mainImageIndex, true, isFullscreen); drawMainImage(mainImageIndex, true, isFullscreen);
} }
@@ -424,12 +283,9 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
rotationEnabled = true; rotationEnabled = true;
// Allow making barcode fullscreen on tap binding.fullscreenButtonMinimize.setOnClickListener(v -> setFullscreen(false));
maximizeButton.setOnClickListener(v -> setFullscreen(true));
minimizeButton.setOnClickListener(v -> setFullscreen(false));
editButton = binding.fabEdit; binding.fabEdit.setOnClickListener(v -> {
editButton.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt("id", loyaltyCardId); bundle.putInt("id", loyaltyCardId);
@@ -438,35 +294,21 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
startActivity(intent); startActivity(intent);
finish(); finish();
}); });
editButton.bringToFront(); binding.fabEdit.bringToFront();
appBarLayout.setOutlineProvider(new ViewOutlineProvider() { binding.bottomAppBarInfoButton.setOnClickListener(view -> showInfoDialog());
@Override binding.bottomAppBarPreviousButton.setOnClickListener(view -> prevNextCard(false));
public void getOutline(View view, Outline outline) { binding.bottomAppBarNextButton.setOnClickListener(view -> prevNextCard(true));
ViewOutlineProvider.BACKGROUND.getOutline(view, outline); binding.bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog());
outline.setAlpha(0f);
} binding.mainImage.setOnClickListener(view -> onMainImageTap());
// This long-press was originally only intended for when Talkback was used but sadly limiting
// this doesn't seem to work well
binding.mainImage.setOnLongClickListener(view -> {
setMainImage(true, true);
return true;
}); });
binding.fullscreenImage.setOnClickListener(view -> onMainImageTap());
bottomAppBarInfoButton.setOnClickListener(view -> showInfoDialog());
bottomAppBarPreviousButton.setOnClickListener(view -> prevNextCard(false));
bottomAppBarNextButton.setOnClickListener(view -> prevNextCard(true));
bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog());
mGestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
mainImage.setOnTouchListener(gestureTouchListener);
appBarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
iconImage.setLayoutParams(new CoordinatorLayout.LayoutParams(
CoordinatorLayout.LayoutParams.MATCH_PARENT, appBarLayout.getHeight())
);
iconImage.setClipBounds(new Rect(left, top, right, bottom));
}
});
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
} }
private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) { private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) {
@@ -493,7 +335,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
dialogContentPadding, dialogContentPadding,
dialogTitlePadding dialogTitlePadding
); );
infoTitleView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
infoTitleView.setText(loyaltyCard.store); infoTitleView.setText(loyaltyCard.store);
infoDialog.setCustomTitle(infoTitleView); infoDialog.setCustomTitle(infoTitleView);
infoDialog.setTitle(loyaltyCard.store); infoDialog.setTitle(loyaltyCard.store);
@@ -630,20 +471,20 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void setBottomAppBarButtonState() { private void setBottomAppBarButtonState() {
if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.validFrom != null || loyaltyCard.expiry != null) { if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.validFrom != null || loyaltyCard.expiry != null) {
bottomAppBarInfoButton.setVisibility(View.VISIBLE); binding.bottomAppBarInfoButton.setVisibility(View.VISIBLE);
} else { } else {
bottomAppBarInfoButton.setVisibility(View.GONE); binding.bottomAppBarInfoButton.setVisibility(View.GONE);
} }
if (cardList == null || cardList.size() == 1) { if (cardList == null || cardList.size() == 1) {
bottomAppBarPreviousButton.setVisibility(View.GONE); binding.bottomAppBarPreviousButton.setVisibility(View.GONE);
bottomAppBarNextButton.setVisibility(View.GONE); binding.bottomAppBarNextButton.setVisibility(View.GONE);
} else { } else {
bottomAppBarPreviousButton.setVisibility(View.VISIBLE); binding.bottomAppBarPreviousButton.setVisibility(View.VISIBLE);
bottomAppBarNextButton.setVisibility(View.VISIBLE); binding.bottomAppBarNextButton.setVisibility(View.VISIBLE);
} }
bottomAppBarUpdateBalanceButton.setVisibility(hasBalance(loyaltyCard) ? View.VISIBLE : View.GONE); binding.bottomAppBarUpdateBalanceButton.setVisibility(hasBalance(loyaltyCard) ? View.VISIBLE : View.GONE);
} }
private void prevNextCard(boolean next) { private void prevNextCard(boolean next) {
@@ -738,6 +579,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return; return;
} }
setTitle(loyaltyCard.store);
loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId); loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId);
setupOrientation(); setupOrientation();
@@ -746,19 +589,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
cardIdString = loyaltyCard.cardId; cardIdString = loyaltyCard.cardId;
barcodeIdString = loyaltyCard.barcodeId; barcodeIdString = loyaltyCard.barcodeId;
cardIdFieldView.setText(loyaltyCard.cardId); binding.cardIdView.setText(loyaltyCard.cardId);
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(cardIdFieldView,
settings.getFontSizeMin(settings.getLargeFont()), settings.getFontSizeMax(settings.getLargeFont()),
1, TypedValue.COMPLEX_UNIT_SP);
storeName.setText(loyaltyCard.store);
storeName.setTextSize(settings.getFontSizeMax(settings.getLargeFont()));
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
storeName,
settings.getFontSizeMin(settings.getLargeFont()),
settings.getFontSizeMax(settings.getLargeFont()),
1,
TypedValue.COMPLEX_UNIT_DIP);
int backgroundHeaderColor; int backgroundHeaderColor;
if (loyaltyCard.headerColor != null) { if (loyaltyCard.headerColor != null) {
@@ -767,72 +598,29 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
backgroundHeaderColor = LetterBitmap.getDefaultColor(this, loyaltyCard.store); backgroundHeaderColor = LetterBitmap.getDefaultColor(this, loyaltyCard.store);
} }
int textColor;
if (Utils.needsDarkForeground(backgroundHeaderColor)) {
textColor = Color.BLACK;
} else {
textColor = Color.WHITE;
}
storeName.setTextColor(textColor);
landscapeToolbar.setTitleTextColor(textColor);
// Also apply colours to UI elements // Also apply colours to UI elements
int darkenedColor = ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.1f); int darkenedColor = ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.1f);
barcodeScaler.setProgressTintList(ColorStateList.valueOf(darkenedColor)); binding.barcodeScaler.setProgressTintList(ColorStateList.valueOf(darkenedColor));
barcodeScaler.setThumbTintList(ColorStateList.valueOf(darkenedColor)); binding.barcodeScaler.setThumbTintList(ColorStateList.valueOf(darkenedColor));
maximizeButton.setBackgroundColor(darkenedColor); binding.bottomAppBar.setBackgroundColor(darkenedColor);
minimizeButton.setBackgroundColor(darkenedColor);
bottomAppBar.setBackgroundColor(darkenedColor);
maximizeButton.setColorFilter(textColor);
minimizeButton.setColorFilter(textColor);
int complementaryColor = Utils.getComplementaryColor(darkenedColor); int complementaryColor = Utils.getComplementaryColor(darkenedColor);
editButton.setBackgroundTintList(ColorStateList.valueOf(complementaryColor)); binding.fabEdit.setBackgroundTintList(ColorStateList.valueOf(complementaryColor));
Drawable editButtonIcon = editButton.getDrawable(); Drawable editButtonIcon = binding.fabEdit.getDrawable();
editButtonIcon.mutate(); editButtonIcon.mutate();
editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE); editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
editButton.setImageDrawable(editButtonIcon); binding.fabEdit.setImageDrawable(editButtonIcon);
Bitmap icon = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon); Utils.setIconOrTextWithBackground(this, loyaltyCard, binding.iconImage, binding.iconText);
if (icon != null) {
int backgroundAlphaColor = Utils.needsDarkForeground(backgroundHeaderColor) ? Color.WHITE : Color.BLACK;
Log.d("onResume", "setting icon image");
iconImage.setImageBitmap(icon);
int backgroundWithAlpha = Color.argb(HEADER_FILTER_ALPHA, Color.red(backgroundAlphaColor), Color.green(backgroundAlphaColor), Color.blue(backgroundAlphaColor));
// for images that has alpha
appBarLayout.setBackgroundColor(backgroundWithAlpha);
} else {
Bitmap plain = Bitmap.createBitmap(new int[]{backgroundHeaderColor}, 1, 1, Bitmap.Config.ARGB_8888);
iconImage.setImageBitmap(plain);
appBarLayout.setBackgroundColor(Color.TRANSPARENT);
}
// If the background is very bright, we should use dark icons // If the background is very bright, we should use dark icons
backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor); backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeAsUpIndicator(getIcon(R.drawable.home_arrow_back_white, backgroundNeedsDarkIcons));
}
fixImageButtonColor(bottomAppBarInfoButton); fixBottomAppBarImageButtonColor(binding.bottomAppBarInfoButton);
fixImageButtonColor(bottomAppBarPreviousButton); fixBottomAppBarImageButtonColor(binding.bottomAppBarPreviousButton);
fixImageButtonColor(bottomAppBarNextButton); fixBottomAppBarImageButtonColor(binding.bottomAppBarNextButton);
fixImageButtonColor(bottomAppBarUpdateBalanceButton); fixBottomAppBarImageButtonColor(binding.bottomAppBarUpdateBalanceButton);
setBottomAppBarButtonState(); setBottomAppBarButtonState();
// Make notification area light if dark icons are needed
if (Build.VERSION.SDK_INT >= 23) {
View decorView = getWindow().getDecorView();
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
wic.setAppearanceLightStatusBars(backgroundNeedsDarkIcons);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
// Darken statusbar if icons won't be visible otherwise
window.setStatusBarColor(backgroundNeedsDarkIcons ? ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.15f) : Color.TRANSPARENT);
}
// Set shadow colour of store text so even same color on same color would be readable
storeName.setShadowLayer(1, 1, 1, backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE);
if (format != null && !format.isSupported()) { if (format != null && !format.isSupported()) {
isBarcodeSupported = false; isBarcodeSupported = false;
@@ -857,11 +645,29 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
imageTypes.add(ImageType.IMAGE_BACK); imageTypes.add(ImageType.IMAGE_BACK);
} }
setDotIndicator(Utils.isDarkModeEnabled(this)); setStateBasedOnImageTypes();
setFullscreen(isFullscreen); setFullscreen(isFullscreen);
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id); DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
invalidateOptionsMenu();
}
private void setStateBasedOnImageTypes() {
// Decrease the card holder size to only fit the value if there is no barcode
// This looks much cleaner
ViewGroup.LayoutParams cardHolderLayoutParams = binding.cardHolder.getLayoutParams();
if (imageTypes.isEmpty()) {
cardHolderLayoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
} else {
cardHolderLayoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
}
binding.cardHolder.setLayoutParams(cardHolderLayoutParams);
// Ensure buttons and accessibility are correct
setMainImagePreviousNextButtons();
setMainImageAccessibility();
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@@ -870,7 +676,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
} }
private void fixImageButtonColor(ImageButton imageButton) { private void fixBottomAppBarImageButtonColor(ImageButton imageButton) {
imageButton.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE, BlendModeCompat.SRC_ATOP)); imageButton.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE, BlendModeCompat.SRC_ATOP));
} }
@@ -887,18 +693,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.card_view_menu, menu); getMenuInflater().inflate(R.menu.card_view_menu, menu);
starred = loyaltyCard.starStatus != 0;
if (loyaltyCard.archiveStatus != 0) {
menu.findItem(R.id.action_unarchive).setVisible(true);
menu.findItem(R.id.action_archive).setVisible(false);
} else {
menu.findItem(R.id.action_unarchive).setVisible(false);
menu.findItem(R.id.action_archive).setVisible(true);
}
menu.findItem(R.id.action_overflow).setIcon(getIcon(R.drawable.ic_overflow_menu, backgroundNeedsDarkIcons));
menu.findItem(R.id.action_share).setIcon(getIcon(R.drawable.ic_share_white, backgroundNeedsDarkIcons));
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@@ -907,13 +701,27 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
@Override @Override
public boolean onPrepareOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu); super.onPrepareOptionsMenu(menu);
if (starred) {
menu.findItem(R.id.action_star_unstar).setIcon(getIcon(R.drawable.ic_starred_white, backgroundNeedsDarkIcons)); if (loyaltyCard != null) {
menu.findItem(R.id.action_star_unstar).setTitle(R.string.unstar); // Update star status
} else { if (loyaltyCard.starStatus == 1) {
menu.findItem(R.id.action_star_unstar).setIcon(getIcon(R.drawable.ic_unstarred_white, backgroundNeedsDarkIcons)); menu.findItem(R.id.action_star_unstar).setIcon(R.drawable.ic_starred);
menu.findItem(R.id.action_star_unstar).setTitle(R.string.star); menu.findItem(R.id.action_star_unstar).setTitle(R.string.unstar);
} else {
menu.findItem(R.id.action_star_unstar).setIcon(R.drawable.ic_unstarred);
menu.findItem(R.id.action_star_unstar).setTitle(R.string.star);
}
// Update archive/unarchive button
if (loyaltyCard.archiveStatus != 0) {
menu.findItem(R.id.action_unarchive).setVisible(true);
menu.findItem(R.id.action_archive).setVisible(false);
} else {
menu.findItem(R.id.action_unarchive).setVisible(false);
menu.findItem(R.id.action_archive).setVisible(true);
}
} }
return true; return true;
} }
@@ -942,11 +750,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return true; return true;
} else if (id == R.id.action_star_unstar) { } else if (id == R.id.action_star_unstar) {
starred = !starred; DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, loyaltyCard.starStatus == 0 ? 1 : 0);
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0);
// Re-init loyaltyCard with new data from DB // Re-init loyaltyCard with new data from DB
onResume(); onResume();
invalidateOptionsMenu();
return true; return true;
} else if (id == R.id.action_archive) { } else if (id == R.id.action_archive) {
@@ -955,6 +763,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// Re-init loyaltyCard with new data from DB // Re-init loyaltyCard with new data from DB
onResume(); onResume();
invalidateOptionsMenu();
return true; return true;
} else if (id == R.id.action_unarchive) { } else if (id == R.id.action_unarchive) {
@@ -963,6 +772,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// Re-init loyaltyCard with new data from DB // Re-init loyaltyCard with new data from DB
onResume(); onResume();
invalidateOptionsMenu();
return true; return true;
} else if (id == R.id.action_delete) { } else if (id == R.id.action_delete) {
@@ -993,23 +803,10 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
int orientation = getResources().getConfiguration().orientation; int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) { if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.d(TAG, "Detected landscape mode"); Log.d(TAG, "Detected landscape mode");
setTitle(loyaltyCard.store); binding.iconContainer.setVisibility(View.GONE);
collapsingToolbarLayout.setVisibility(View.GONE);
portraitToolbar.setVisibility(View.GONE);
landscapeToolbar.setVisibility(View.VISIBLE);
setSupportActionBar(landscapeToolbar);
} else { } else {
Log.d(TAG, "Detected portrait mode"); Log.d(TAG, "Detected portrait mode");
binding.iconContainer.setVisibility(View.VISIBLE);
setTitle("");
collapsingToolbarLayout.setVisibility(View.VISIBLE);
portraitToolbar.setVisibility(View.VISIBLE);
landscapeToolbar.setVisibility(View.GONE);
setSupportActionBar(portraitToolbar);
} }
enableToolbarBackButton(); enableToolbarBackButton();
@@ -1017,15 +814,16 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void drawBarcode(boolean addPadding) { private void drawBarcode(boolean addPadding) {
mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false); mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false);
if (format != null) { if (format != null) {
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask( BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(
getApplicationContext(), getApplicationContext(),
mainImage, barcodeRenderTarget,
barcodeIdString != null ? barcodeIdString : cardIdString, barcodeIdString != null ? barcodeIdString : cardIdString,
format, format,
null, null,
false, false,
barcodeImageGenerationFinishedCallback, this,
addPadding); addPadding);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
} }
@@ -1033,11 +831,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void redrawBarcodeAfterResize(boolean addPadding) { private void redrawBarcodeAfterResize(boolean addPadding) {
if (format != null) { if (format != null) {
mainImage.getViewTreeObserver().addOnGlobalLayoutListener( barcodeRenderTarget.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() { new ViewTreeObserver.OnGlobalLayoutListener() {
@Override @Override
public void onGlobalLayout() { public void onGlobalLayout() {
mainImage.getViewTreeObserver().removeOnGlobalLayoutListener(this); barcodeRenderTarget.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known"); Log.d(TAG, "ImageView size now known");
drawBarcode(addPadding); drawBarcode(addPadding);
@@ -1048,25 +846,18 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void drawMainImage(int index, boolean waitForResize, boolean isFullscreen) { private void drawMainImage(int index, boolean waitForResize, boolean isFullscreen) {
if (imageTypes.isEmpty()) { if (imageTypes.isEmpty()) {
mainImage.setVisibility(View.GONE); barcodeRenderTarget.setVisibility(View.GONE);
return; return;
} }
if (dots != null) {
boolean darkMode = Utils.isDarkModeEnabled(getApplicationContext());
for (int i = 0; i < dots.length; i++) {
dots[i].setImageDrawable(getDotIcon(i == index, darkMode));
}
}
ImageType wantedImageType = imageTypes.get(index); ImageType wantedImageType = imageTypes.get(index);
if (wantedImageType == ImageType.BARCODE) { if (wantedImageType == ImageType.BARCODE) {
// Use border in non-fullscreen mode // Use border in non-fullscreen mode
if (!isFullscreen) { if (!isFullscreen) {
mainImage.setBackground(AppCompatResources.getDrawable(this, R.drawable.round_outline)); barcodeRenderTarget.setBackground(AppCompatResources.getDrawable(this, R.drawable.round_outline));
} else { } else {
mainImage.setBackgroundColor(Color.WHITE); barcodeRenderTarget.setBackgroundColor(Color.WHITE);
} }
if (waitForResize) { if (waitForResize) {
@@ -1075,27 +866,27 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
drawBarcode(!isFullscreen); drawBarcode(!isFullscreen);
} }
mainImage.setContentDescription(getString(R.string.barcodeImageDescriptionWithType, format.prettyName())); barcodeRenderTarget.setContentDescription(getString(R.string.barcodeImageDescriptionWithType, format.prettyName()));
} else if (wantedImageType == ImageType.IMAGE_FRONT) { } else if (wantedImageType == ImageType.IMAGE_FRONT) {
mainImage.setImageBitmap(frontImageBitmap); barcodeRenderTarget.setImageBitmap(frontImageBitmap);
mainImage.setBackgroundColor(Color.TRANSPARENT); barcodeRenderTarget.setBackgroundColor(Color.TRANSPARENT);
mainImage.setContentDescription(getString(R.string.frontImageDescription)); barcodeRenderTarget.setContentDescription(getString(R.string.frontImageDescription));
} else if (wantedImageType == ImageType.IMAGE_BACK) { } else if (wantedImageType == ImageType.IMAGE_BACK) {
mainImage.setImageBitmap(backImageBitmap); barcodeRenderTarget.setImageBitmap(backImageBitmap);
mainImage.setBackgroundColor(Color.TRANSPARENT); barcodeRenderTarget.setBackgroundColor(Color.TRANSPARENT);
mainImage.setContentDescription(getString(R.string.backImageDescription)); barcodeRenderTarget.setContentDescription(getString(R.string.backImageDescription));
} else { } else {
throw new IllegalArgumentException("Unknown image type: " + wantedImageType); throw new IllegalArgumentException("Unknown image type: " + wantedImageType);
} }
mainImage.setVisibility(View.VISIBLE); barcodeRenderTarget.setVisibility(View.VISIBLE);
} }
private void setMainImage(boolean next, boolean overflow) { private void setMainImage(boolean next, boolean overflow) {
int newIndex = mainImageIndex + (next ? 1 : -1); int newIndex = mainImageIndex + (next ? 1 : -1);
if (newIndex >= imageTypes.size() && overflow) { if (newIndex >= imageTypes.size() && overflow) {
newIndex = 0; newIndex = 0;
} }
if (newIndex == -1 || newIndex >= imageTypes.size()) { if (newIndex == -1 || newIndex >= imageTypes.size()) {
@@ -1105,24 +896,85 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
mainImageIndex = newIndex; mainImageIndex = newIndex;
drawMainImage(newIndex, false, isFullscreen); drawMainImage(newIndex, false, isFullscreen);
setMainImagePreviousNextButtons();
setMainImageAccessibility();
} }
private void setDotIndicator(boolean darkMode) { private void setMainImageAccessibility() {
dotIndicator.removeAllViews(); // Single-click actions
if (imageTypes.size() >= 2) { if (mainImageIndex == 0) {
dots = new ImageView[imageTypes.size()]; ViewCompat.replaceAccessibilityAction(
binding.mainImage,
for (int i = 0; i < imageTypes.size(); i++) { AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
dots[i] = new ImageView(this); getString(R.string.moveBarcodeToTopOfScreen),
dots[i].setImageDrawable(getDotIcon(false, darkMode)); null
);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); } else {
params.setMargins(8, 0, 8, 0); int accessibilityClickAction;
if (mainImageIndex == 1) {
dotIndicator.addView(dots[i], params); accessibilityClickAction = R.string.openFrontImageInGalleryApp;
} else if (mainImageIndex == 2) {
accessibilityClickAction = R.string.openBackImageInGalleryApp;
} else {
throw new IndexOutOfBoundsException("setMainImageAccessibility was out of range (action_click)");
} }
dotIndicator.setVisibility(View.VISIBLE); ViewCompat.replaceAccessibilityAction(
binding.mainImage,
AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
getString(accessibilityClickAction),
null
);
}
// Long-press actions
int accessibilityLongPressAction;
if (mainImageIndex == 0) {
accessibilityLongPressAction = R.string.switchToFrontImage;
} else if (mainImageIndex == 1) {
accessibilityLongPressAction = R.string.switchToBackImage;
} else if (mainImageIndex == 2) {
accessibilityLongPressAction = R.string.switchToBarcode;
} else {
throw new IndexOutOfBoundsException("setMainImageAccessibility was out of range (action_long_click)");
}
ViewCompat.replaceAccessibilityAction(
binding.mainImage,
AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_LONG_CLICK,
getString(accessibilityLongPressAction),
null
);
}
private void setMainImagePreviousNextButtons() {
if (imageTypes.size() < 2) {
binding.mainLeftButton.setVisibility(View.INVISIBLE);
binding.mainRightButton.setVisibility(View.INVISIBLE);
binding.mainLeftButton.setOnClickListener(null);
binding.mainRightButton.setOnClickListener(null);
return;
}
// Enable left button if we can go further left
if (mainImageIndex > 0) {
binding.mainLeftButton.setVisibility(View.VISIBLE);
binding.mainLeftButton.setOnClickListener(view -> setMainImage(false, false));
} else {
binding.mainLeftButton.setVisibility(View.INVISIBLE);
binding.mainLeftButton.setOnClickListener(null);
}
// Enable right button if we can go further right
if (mainImageIndex < (imageTypes.size() - 1)) {
binding.mainRightButton.setVisibility(View.VISIBLE);
binding.mainRightButton.setOnClickListener(view -> setMainImage(true, false));
} else {
binding.mainRightButton.setVisibility(View.INVISIBLE);
binding.mainRightButton.setOnClickListener(null);
} }
} }
@@ -1133,37 +985,31 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
* by machines which offer no space to insert the complete device. * by machines which offer no space to insert the complete device.
*/ */
private void setFullscreen(boolean enabled) { private void setFullscreen(boolean enabled) {
isFullscreen = enabled;
ActionBar actionBar = getSupportActionBar(); ActionBar actionBar = getSupportActionBar();
isFullscreen = enabled;
if (enabled && !imageTypes.isEmpty()) { if (enabled && !imageTypes.isEmpty()) {
Log.d(TAG, "Move into fullscreen"); Log.d(TAG, "Move into fullscreen");
barcodeRenderTarget = binding.fullscreenImage;
// Show only fullscreen view
binding.container.setVisibility(View.GONE);
binding.fullscreenLayout.setVisibility(View.VISIBLE);
drawMainImage(mainImageIndex, true, isFullscreen); drawMainImage(mainImageIndex, true, isFullscreen);
barcodeScaler.setProgress(loyaltyCard.zoomLevel); binding.barcodeScaler.setProgress(loyaltyCard.zoomLevel);
setCenterGuideline(loyaltyCard.zoomLevel); setScalerGuideline(loyaltyCard.zoomLevel);
// Hide maximize and show minimize button and scaler
maximizeButton.setVisibility(View.GONE);
minimizeButton.setVisibility(View.VISIBLE);
barcodeScaler.setVisibility(View.VISIBLE);
// Hide actionbar // Hide actionbar
if (actionBar != null) { if (actionBar != null) {
actionBar.hide(); actionBar.hide();
} }
// Hide toolbars
appBarLayout.setVisibility(View.INVISIBLE);
iconImage.setVisibility(View.INVISIBLE);
collapsingToolbarLayout.setVisibility(View.GONE);
landscapeToolbar.setVisibility(View.GONE);
// Hide other UI elements // Hide other UI elements
cardIdFieldView.setVisibility(View.GONE); binding.bottomAppBar.setVisibility(View.GONE);
bottomAppBar.setVisibility(View.GONE); binding.fabEdit.setVisibility(View.GONE);
editButton.setVisibility(View.GONE);
// Set Android to fullscreen mode // Set Android to fullscreen mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -1178,31 +1024,22 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} else { } else {
Log.d(TAG, "Move out of fullscreen"); Log.d(TAG, "Move out of fullscreen");
// Reset center guideline barcodeRenderTarget = binding.mainImage;
setCenterGuideline(100);
// Show only regular view
binding.container.setVisibility(View.VISIBLE);
binding.fullscreenLayout.setVisibility(View.GONE);
drawMainImage(mainImageIndex, true, isFullscreen); drawMainImage(mainImageIndex, true, isFullscreen);
// Show maximize and hide minimize button and scaler
maximizeButton.setVisibility(imageTypes.isEmpty() ? View.GONE : View.VISIBLE);
minimizeButton.setVisibility(View.GONE);
barcodeScaler.setVisibility(View.GONE);
// Show actionbar // Show actionbar
if (actionBar != null) { if (actionBar != null) {
actionBar.show(); actionBar.show();
} }
// Show appropriate toolbar
appBarLayout.setVisibility(View.VISIBLE);
setupOrientation();
iconImage.setVisibility(View.VISIBLE);
// Show other UI elements // Show other UI elements
cardIdFieldView.setVisibility(View.VISIBLE); binding.bottomAppBar.setVisibility(View.VISIBLE);
editButton.setVisibility(View.VISIBLE); binding.fabEdit.setVisibility(View.VISIBLE);
bottomAppBar.setVisibility(View.VISIBLE);
// Unset fullscreen mode // Unset fullscreen mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -1216,7 +1053,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} }
} }
Log.d("setFullScreen", "Is full screen enabled? " + enabled + " Zoom Level = " + barcodeScaler.getProgress()); Log.d("setFullScreen", "Is full screen enabled? " + enabled + " Zoom Level = " + binding.barcodeScaler.getProgress());
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")

View File

@@ -50,7 +50,7 @@ import protect.card_locker.databinding.MainActivityBinding;
import protect.card_locker.databinding.SortingOptionBinding; import protect.card_locker.databinding.SortingOptionBinding;
import protect.card_locker.preferences.SettingsActivity; import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener { public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
private MainActivityBinding binding; private MainActivityBinding binding;
private ArchiveActivityBinding archiveActivityBinding; private ArchiveActivityBinding archiveActivityBinding;
private ContentMainBinding contentMainBinding; private ContentMainBinding contentMainBinding;
@@ -63,7 +63,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
private LoyaltyCardCursorAdapter mAdapter; private LoyaltyCardCursorAdapter mAdapter;
private ActionMode mCurrentActionMode; private ActionMode mCurrentActionMode;
private SearchView mSearchView; private SearchView mSearchView;
private GestureDetector mGestureDetector;
private int mLoyaltyCardCount = 0; private int mLoyaltyCardCount = 0;
protected String mFilter = ""; protected String mFilter = "";
protected Object mGroup = null; protected Object mGroup = null;
@@ -282,19 +281,11 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
} }
}); });
mGestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
mHelpSection = contentMainBinding.helpSection; mHelpSection = contentMainBinding.helpSection;
mNoMatchingCardsText = contentMainBinding.noMatchingCardsText; mNoMatchingCardsText = contentMainBinding.noMatchingCardsText;
mNoGroupCardsText = contentMainBinding.noGroupCardsText; mNoGroupCardsText = contentMainBinding.noGroupCardsText;
mCardList = contentMainBinding.list; mCardList = contentMainBinding.list;
mNoMatchingCardsText.setOnTouchListener(gestureTouchListener);
mCardList.setOnTouchListener(gestureTouchListener);
mNoGroupCardsText.setOnTouchListener(gestureTouchListener);
mAdapter = new LoyaltyCardCursorAdapter(this, null, this); mAdapter = new LoyaltyCardCursorAdapter(this, null, this);
mCardList.setAdapter(mAdapter); mCardList.setAdapter(mAdapter);
registerForContextMenu(mCardList); registerForContextMenu(mCardList);
@@ -768,83 +759,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
updateLoyaltyCardList(false); updateLoyaltyCardList(false);
} }
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d(TAG, "On fling");
// Don't swipe if we have too much vertical movement
if (Math.abs(velocityY) > (0.75 * Math.abs(velocityX))) {
return false;
}
if (groupsTabLayout.getTabCount() < 2) {
return false;
}
Integer currentTab = groupsTabLayout.getSelectedTabPosition();
Log.d("onFling", "Current Tab " + currentTab);
// Swipe right
if (velocityX < -150) {
Log.d("onFling", "Right Swipe detected " + velocityX);
Integer nextTab = currentTab + 1;
if (nextTab == groupsTabLayout.getTabCount()) {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(0));
} else {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(nextTab));
}
return true;
}
// Swipe left
if (velocityX > 150) {
Log.d("onFling", "Left Swipe detected " + velocityX);
Integer nextTab = currentTab - 1;
if (nextTab < 0) {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(groupsTabLayout.getTabCount() - 1));
} else {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(nextTab));
}
return true;
}
return false;
}
@Override @Override
public void onRowLongClicked(int inputPosition) { public void onRowLongClicked(int inputPosition) {
enableActionMode(inputPosition); enableActionMode(inputPosition);

View File

@@ -18,6 +18,9 @@ import android.provider.MediaStore;
import android.util.Log; import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.RawRes; import androidx.annotation.RawRes;
@@ -599,4 +602,39 @@ public class Utils {
return result.toString(); 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

@@ -63,30 +63,6 @@ public class Settings {
return AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM; 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); return getBoolean(R.string.settings_key_display_barcode_max_brightness, true);
} }

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,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:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> 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"/> <path android:fillColor="@android:color/white" android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/>

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:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> 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"/> <path android:fillColor="@android:color/white" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>

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

@@ -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,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/>
</vector>

View File

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

View File

@@ -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="8dip" android:width="8dip"/>
<solid android:color="@android:color/white"/>
</shape>

View File

@@ -271,6 +271,36 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/donate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:id="@+id/donate_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/donate"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/rate" android:id="@+id/rate"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -9,8 +9,7 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:layout_marginBottom="4dp">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/icon_layout" android:id="@+id/icon_layout"
@@ -19,12 +18,11 @@
android:outlineProvider="none" android:outlineProvider="none"
app:cardCornerRadius="8dp" app:cardCornerRadius="8dp"
app:strokeWidth="0dp" app:strokeWidth="0dp"
app:layout_constraintBottom_toTopOf="@+id/store" app:layout_constraintBottom_toTopOf="@+id/note"
app:layout_constraintDimensionRatio="85.6f:53.98f" app:layout_constraintDimensionRatio="85.6f:53.98f"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<ImageView <ImageView
android:importantForAccessibility="no"
android:id="@+id/thumbnail" android:id="@+id/thumbnail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@@ -36,6 +34,20 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/thumbnail_text"
android:importantForAccessibility="no"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textStyle="bold"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="12sp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeStepGranularity="2sp"
android:gravity="center"
android:maxLines="1"
android:layout_margin="20dp" />
<ImageView <ImageView
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:id="@+id/selected_thumbnail" android:id="@+id/selected_thumbnail"
@@ -117,20 +129,6 @@
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
<TextView
android:id="@+id/store"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
android:textAppearance="?attr/textAppearanceHeadline1"
app:layout_constraintTop_toBottomOf="@+id/icon_layout"
app:layout_constraintBottom_toTopOf="@+id/note"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="Example store"/>
<TextView <TextView
android:id="@+id/note" android:id="@+id/note"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -142,7 +140,7 @@
android:textColor="?android:attr/textColorSecondary" android:textColor="?android:attr/textColorSecondary"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" tools:visibility="visible"
app:layout_constraintTop_toBottomOf="@+id/store" app:layout_constraintTop_toBottomOf="@+id/icon_layout"
app:layout_constraintBottom_toTopOf="@+id/info_divider" app:layout_constraintBottom_toTopOf="@+id/info_divider"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View File

@@ -6,215 +6,196 @@
android:id="@+id/coordinator_layout" android:id="@+id/coordinator_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:fitsSystemWindows="true"> android:fitsSystemWindows="false">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout" android:layout_width="match_parent"
android:layout_width="fill_parent" android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:clipChildren="false"
android:clipToPadding="false"
android:fitsSystemWindows="true"
android:weightSum="1.0">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar_landscape" android:id="@+id/toolbar"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="?actionBarSize" android:layout_height="?attr/actionBarSize"
android:background="@android:color/transparent" style="?attr/toolbarStyle" />
android:fitsSystemWindows="false" </com.google.android.material.appbar.AppBarLayout>
android:paddingTop="0dp"
android:visibility="gone"
app:contentInsetStart="72.0dip"
app:layout_collapseMode="pin" />
<com.google.android.material.appbar.CollapsingToolbarLayout <LinearLayout
android:id="@+id/collapsingToolbarLayout" android:id="@+id/container"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:layout_marginBottom="100dp"
android:orientation="vertical"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp">
<LinearLayout
android:id="@+id/icon_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clipChildren="false" android:layout_marginBottom="20dp">
android:clipToPadding="false"
android:minHeight="56.0dip"
app:contentScrim="?colorPrimary"
app:expandedTitleGravity="top"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp">
<androidx.appcompat.widget.AppCompatTextView <Space
android:id="@+id/storeName" android:layout_width="50dp"
android:layout_height="0dp"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<com.google.android.material.card.MaterialCardView
android:id="@+id/icon_holder"
android:layout_width="match_parent"
android:layout_height="0dp"
app:cardCornerRadius="8dp"
android:layout_margin="10dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="85.6f:53.98f">
<ImageView
android:id="@+id/icon_image"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/icon_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textStyle="bold"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="12sp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeStepGranularity="2sp"
android:gravity="center"
android:maxLines="1"
android:layout_margin="20dp" />
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<Space
android:layout_width="50dp"
android:layout_height="0dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp">
<!-- We don't use these buttons for Talkback -->
<ImageButton
android:importantForAccessibility="no"
android:id="@+id/main_left_button"
android:layout_width="50dp"
android:layout_height="match_parent"
app:srcCompat="@drawable/ic_baseline_chevron_left_24"
android:background="@android:color/transparent"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/card_holder"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardCornerRadius="8dp"
android:layout_margin="10dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="4dp"
android:orientation="vertical">
<ImageView
android:id="@+id/main_image"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<TextView
android:id="@+id/card_id_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/text_size_large"
android:gravity="center"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- We don't use these buttons for Talkback -->
<ImageButton
android:importantForAccessibility="no"
android:id="@+id/main_right_button"
android:layout_width="50dp"
android:layout_height="match_parent"
app:srcCompat="@drawable/ic_baseline_chevron_right_24"
android:background="@android:color/transparent"/>
</LinearLayout>
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/fullscreen_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:importantForAccessibility="no"
android:id="@+id/fullscreen_image"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/scaler_guideline"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/scaler_guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/fullscreen_button_minimize"
android:layout_marginBottom="50dp"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip">
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/height"/>
<SeekBar
android:id="@+id/barcode_scaler"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="?actionBarSize" android:contentDescription="@string/setBarcodeHeight"
android:layout_marginBottom="?actionBarSize" android:max="100" />
android:ellipsize="end" </LinearLayout>
android:maxLines="1"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="40sp"
app:layout_collapseMode="parallax" />
<androidx.appcompat.widget.Toolbar <ImageButton
android:id="@id/toolbar" android:id="@+id/fullscreen_button_minimize"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="?actionBarSize" android:layout_height="wrap_content"
android:background="@android:color/transparent" android:src="@drawable/ic_baseline_expand_more_24"
app:contentInsetStart="72.0dip" android:tooltipText="@string/moveDown"
app:layout_collapseMode="pin" /> app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="50dp"
</com.google.android.material.appbar.CollapsingToolbarLayout> android:background="@android:color/transparent"/>
</com.google.android.material.appbar.AppBarLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:id="@+id/icon_image"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_alignParentTop="true"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
app:srcCompat="@drawable/ic_launcher_foreground"
tools:ignore="ContentDescription" />
<FrameLayout
android:clipChildren="false"
android:clipToPadding="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/mainLayout"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/centerGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/scalerGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.75"/>
<ImageButton
android:id="@+id/maximizeButton"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:background="?attr/colorPrimary"
android:contentDescription="@string/moveBarcodeToTopOfScreen"
android:padding="0dp"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24"
app:tint="?attr/colorOnPrimary"
tools:visibility="visible" />
<ImageView
android:id="@+id/mainImage"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
app:layout_constraintBottom_toTopOf="@+id/centerGuideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/maximizeButton"/>
<ImageButton
android:id="@+id/minimizeButton"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:background="?attr/colorPrimary"
android:contentDescription="@string/moveBarcodeToCenterOfScreen"
android:padding="0dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mainImage"
app:srcCompat="@drawable/ic_baseline_arrow_drop_down_24"
app:tint="?attr/colorOnPrimary"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/dotIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/minimizeButton"
tools:visibility="visible" />
<SeekBar
android:id="@+id/barcodeScaler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/inputPadding"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
android:contentDescription="@string/set_scale"
android:max="100"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/scalerGuideline" />
<TextView
android:id="@+id/cardIdView"
android:enabled="true"
android:textIsSelectable="true"
android:focusable="true"
android:longClickable="true"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="10.0dip"
android:layout_marginRight="10.0dip"
android:paddingBottom="80dp"
app:layout_constraintTop_toBottomOf="@+id/dotIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textAlignment="center"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="@dimen/singleCardCardIdTextSizeMin"
app:autoSizeMaxTextSize="@dimen/singleCardCardIdTextSizeMax"
android:ellipsize="end"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/drop_shadow_actionbar"
android:layout_width="fill_parent"
android:layout_height="5.0dip"
android:layout_gravity="top"/>
</FrameLayout>
<com.google.android.material.bottomappbar.BottomAppBar <com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottom_app_bar" android:id="@+id/bottom_app_bar"
@@ -230,7 +211,7 @@
app:fabAlignmentMode="center"> app:fabAlignmentMode="center">
<ImageButton <ImageButton
android:id="@+id/button_previous" android:id="@+id/bottom_app_bar_previous_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="left" android:layout_gravity="left"
@@ -242,7 +223,7 @@
android:visibility="gone" /> android:visibility="gone" />
<ImageButton <ImageButton
android:id="@+id/button_show_info" android:id="@+id/bottom_app_bar_info_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
@@ -254,7 +235,7 @@
android:visibility="gone" /> android:visibility="gone" />
<ImageButton <ImageButton
android:id="@+id/button_next" android:id="@+id/bottom_app_bar_next_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="right" android:layout_gravity="right"
@@ -266,7 +247,7 @@
android:visibility="gone" /> android:visibility="gone" />
<ImageButton <ImageButton
android:id="@+id/button_update_balance" android:id="@+id/bottom_app_bar_update_balance_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="end" android:layout_gravity="end"

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.materialswitch.MaterialSwitch xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/switchWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:focusable="false" />

View File

@@ -4,13 +4,13 @@
<item <item
android:id="@+id/action_share" android:id="@+id/action_share"
android:icon="@drawable/ic_share_white" android:icon="@drawable/ic_share"
android:title="@string/share" android:title="@string/share"
app:showAsAction="always"/> app:showAsAction="always"/>
<item <item
android:id="@+id/action_star_unstar" android:id="@+id/action_star_unstar"
android:icon="@drawable/ic_unstarred_white" android:icon="@drawable/ic_unstarred"
android:title="@string/star" android:title="@string/star"
app:showAsAction="always" /> app:showAsAction="always" />

View File

@@ -32,6 +32,7 @@ Alexander Ivanov
arshbeerSingh arshbeerSingh
Denis Shilin Denis Shilin
Freddo espresso Freddo espresso
Projjal Moitra
Silvério Santos Silvério Santos
Miha Frangež Miha Frangež
Arnis Jaundžeikars Arnis Jaundžeikars
@@ -43,13 +44,13 @@ Katarzyna
echo r"0xX4H" | rev echo r"0xX4H" | rev
Magnitudee Magnitudee
Olivia (Zoe) Olivia (Zoe)
Projjal Moitra
betsythefc betsythefc
waffshappen waffshappen
(Cliff Heraldo)
Robin Robin
Eric Eric
ati3 ati3
(Cliff Heraldo) Balázs Meskó
Evgeniy Khramov Evgeniy Khramov
Jane Kong Jane Kong
Jiri Grönroos Jiri Grönroos
@@ -80,7 +81,7 @@ francescbassas
Jean-Luc Tibaux Jean-Luc Tibaux
Jesse Davids Jesse Davids
Lukas Grassauer Lukas Grassauer
bittin Luna Jernberg
Marnick L'Eau Marnick L'Eau
Michalis Michalis
Michał Michał
@@ -103,10 +104,12 @@ ce i moa
inesre inesre
lgasp lgasp
phlostically phlostically
pokeghost
sal0max sal0max
Ágata Leuck Ágata Leuck
BmBKun BmBKun
Aditya Das Aditya Das
asier123123131
Kevin Sicong Jiang Kevin Sicong Jiang
Tomer Ben-Rachel Tomer Ben-Rachel
Tom Sawyer Tom Sawyer
@@ -118,13 +121,13 @@ sNiXx
Angela Enogieru Angela Enogieru
AnimeshChatterjee1 AnimeshChatterjee1
Ashish Yadav Ashish Yadav
Asier
Aya Elsaadany Aya Elsaadany
Biren Biren
Booc Sylvan Booc Sylvan
Brage Nesteby Reitan Brage Nesteby Reitan
Cap Amr Karam
Carlo Maria Cuoghi Barbagli
CherryMonster222 CherryMonster222
Colgrave
Csaba Csaba
Mylou53 Mylou53
danieluhrinyi danieluhrinyi
@@ -132,6 +135,7 @@ Kasina Dheeraj
Donno Donno
Flav Flav
Franciszek Stefan Franciszek Stefan
Gael Caraballo
Grzegorz Grzegorz
gneiss15 gneiss15
Hamustra Scans Hamustra Scans
@@ -139,7 +143,6 @@ HowITsDone
Izzy Izzy
Jacek Jacek
Jacopo Gennaro Esposito Jacopo Gennaro Esposito
Jasielprogramador
Jean Mareilles Jean Mareilles
Jean-Baptiste Jean-Baptiste
Kung-chih Kung-chih
@@ -176,6 +179,7 @@ Samarth Asthan
Shailendra Maurya Shailendra Maurya
Simone Dotto Simone Dotto
Subhashish Anand Subhashish Anand
Subhradeep Bera
SziaTomi SziaTomi
Mehedi Hasan Mehedi Hasan
Titas Pažereckas Titas Pažereckas
@@ -191,6 +195,7 @@ diksha-2911
gbonaspetti gbonaspetti
gittyboy-cell gittyboy-cell
huang ivan huang ivan
liva
lucafont2 lucafont2
mtrmirez mtrmirez
opsik opsik

View File

@@ -292,4 +292,9 @@
<string name="updateBalanceHint">أدخل المبلغ</string> <string name="updateBalanceHint">أدخل المبلغ</string>
<string name="storageReadPermissionRequired">الصلاحيه للوصل للتخزين مطلوبة لهذا الاجراء</string> <string name="storageReadPermissionRequired">الصلاحيه للوصل للتخزين مطلوبة لهذا الاجراء</string>
<string name="validFromDate">عربيه</string> <string name="validFromDate">عربيه</string>
<string name="cameraPermissionRequired">إذن للوصول إلى الكاميرا اللازمة لهذا الإجراء…</string>
<string name="anyDate">أي تاريخ</string>
<string name="chooseValidFromDate">اختر صالح من التاريخ</string>
<string name="validFromSentence">صالح من:<xliff:g>%s</xliff:g></string>
<string name="height">الطول:</string>
</resources> </resources>

View File

@@ -268,4 +268,13 @@
<string name="anyDate">Без значение от датата</string> <string name="anyDate">Без значение от датата</string>
<string name="validFromSentence">Валидна от: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Валидна от: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">Определена дата</string> <string name="chooseValidFromDate">Определена дата</string>
<string name="height">Височина:</string>
<string name="switchToFrontImage">Показване на предната страна</string>
<string name="switchToBackImage">Показване на задната страна</string>
<string name="switchToBarcode">Показване на щрихкода</string>
<string name="openImageInGallery">Отваряне на изображението в приложението галерия</string>
<string name="openFrontImageInGalleryApp">Отваряне на изображението на предната страна в приложението галерия</string>
<string name="openBackImageInGalleryApp">Отваряне на изображението на задната страна в приложението галерия</string>
<string name="setBarcodeHeight">Задаване на височина на щрихкода</string>
<string name="donate">Даряване</string>
</resources> </resources>

View File

@@ -197,4 +197,75 @@
<string name="app_loyalty_card_keychain">আনুগত্য কার্ড কীচেন</string> <string name="app_loyalty_card_keychain">আনুগত্য কার্ড কীচেন</string>
<string name="privacy_policy">ব্যক্তিগত তথ্যের গোপনীয়তা নীতি</string> <string name="privacy_policy">ব্যক্তিগত তথ্যের গোপনীয়তা নীতি</string>
<string name="accept">গ্রহণ</string> <string name="accept">গ্রহণ</string>
<string name="failedToRetrieveImageFile">ছবি ফাইল পুনরুদ্ধার করতে ব্যর্থ হয়েছে</string>
<string name="on_github">GitHub -এ</string>
<string name="importLoyaltyCardKeychainMessage">আমদানি করতে লয়্যালটি কার্ড কীচেন থেকে আপনার <i>LoyaltyCardKeychain.csv</i> এক্সপোর্ট নির্বাচন করুন।
\nলয়্যালটি কার্ড কীচেনের আমদানি/রপ্তানি মেনু থেকে প্রথমে সেখানে রপ্তানি টিপে এটি তৈরি করুন।</string>
<string name="selectColor">রঙ নির্বাচন করুন</string>
<string name="unarchived">কার্ড সংরক্ষণাগারমুক্ত করা হয়েছে</string>
<string name="archiveList">সংরক্ষণাগার</string>
<string name="report_error">ভুল প্রতিবেদন</string>
<string name="failedLaunchingPhotoPicker">একটি সমর্থিত গ্যালারি অ্যাপ খুঁজে পাওয়া যায়নি</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> archived)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> cards (<xliff:g id="archivedCount">%2$d</xliff:g> archived)</item>
</plurals>
<string name="nextCard">পরবর্তী</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">সংরক্ষণাগার দেখুন (<xliff:g>%1$d</xliff:g> কার্ড)</item>
<item quantity="other">সংরক্ষণাগার দেখুন (<xliff:g>%1$d</xliff:g> কার্ডগুলি)</item>
</plurals>
<string name="failedToOpenUrl">প্রথমে একটি ওয়েব ব্রাউজার ইন্সটল করুন</string>
<string name="newBalanceSentence">নতুন ব্যালেন্স: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">তারিখ থেকে বৈধ নির্বাচন করুন</string>
<string name="validFromSentence">এর থেকে বৈধ: <xliff:g>%s</xliff:g></string>
<string name="version_history">সংস্করণ ইতিহাস</string>
<string name="credits">ক্রেডিট</string>
<string name="help_translate_this_app">এই অ্যাপটি অনুবাদ করতে সাহায্য করুন</string>
<string name="showMoreInfo">তথ্য দেখান</string>
<string name="app_contributors">এর দ্বারা সম্ভব হয়েছে: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="hideMoreInfo">তথ্য লুকান</string>
<string name="importCards">কার্ড আমদানি করুন</string>
<string name="sort_by_balance">ব্যালান্স</string>
<string name="importFidmeMessage">FidMe থেকে আমদানি করতে আপনার <i>fidme-export-request-xxxxxx.zip</i> রপ্তানি নির্বাচন করুন এবং পরে বারকোডের ধরন ম্যানুয়ালি নির্বাচন করুন।
\nআপনার FidMe প্রোফাইল থেকে ডেটা সুরক্ষা নির্বাচন করে এবং তারপর প্রথমে আমার ডেটা বের করুন টিপে এটি তৈরি করুন।</string>
<string name="importCatimaMessage">ক্যাটিমা থেকে আমদানি করতে আপনার <i>catima.zip</i> রপ্তানি নির্বাচন করুন।
\nঅন্য Catima অ্যাপের আমদানি/রপ্তানি মেনু থেকে প্রথমে সেখানে রপ্তানি টিপে এটি তৈরি করুন।</string>
<string name="importStocardMessage">আমদানি করতে Stocard থেকে আপনার <i>***.zip</i> এক্সপোর্ট নির্বাচন করুন।
\nআপনার ডেটা রপ্তানির জন্য জিজ্ঞাসা করে support@stocardapp.com ই-মেইল করে এটি পান।</string>
<string name="importVoucherVaultMessage">আমদানি করতে ভাউচার ভল্ট থেকে আপনার <i>vouchervault.json</i> এক্সপোর্ট নির্বাচন করুন।
\nপ্রথমে ভাউচার ভল্টে এক্সপোর্ট টিপে এটি তৈরি করুন।</string>
<string name="settings_oled_dark">অন্ধকার থিমের জন্য খাঁটি কালো পটভূমি</string>
<string name="setIcon">আইকন সেট করুন</string>
<string name="settings_grey_theme">ধূসর</string>
<string name="updateBalance">ব্যালেন্স আপডেট করুন</string>
<string name="barcodeLongPressMessage">গ্যালারি অ্যাপে শুধুমাত্র ছবি খোলা যাবে</string>
<string name="translate_platform">Weblate-এ</string>
<string name="on_google_play">Google Play-তে</string>
<string name="action_show_details">বিস্তারিত দেখাও</string>
<string name="action_hide_details">আড়াল বিস্তারিত</string>
<string name="shortcutSelectCard">একটি কার্ড নির্বাচন করুন</string>
<string name="options">অপশন</string>
<string name="starred">তারকাচিহ্নিত</string>
<string name="set_scale">স্কেল সেট করুন</string>
<string name="duplicateCard">নকল</string>
<string name="include_if_asking_support">আপনি যদি সমর্থনের জন্য অনুরোধ করতে চান তবে নিম্নলিখিত তথ্যগুলি অন্তর্ভুক্ত করুন:</string>
<string name="importFidme">FidMe থেকে আমদানি করুন</string>
<string name="validFromDate">বৈধ হবে</string>
<string name="anyDate">যেকোনো তারিখ</string>
<string name="previousCard">আগে</string>
<string name="exportPassword">আপনার রপ্তানি রক্ষা করার জন্য একটি পাসওয়ার্ড সেট করুন (ঐচ্ছিক)</string>
<string name="exportPasswordHint">পাসওয়ার্ড লিখুন</string>
<string name="license">লাইসেন্স</string>
<string name="source_repository">Source Repository</string>
<string name="and_data_usage">এবং ডেটা ব্যবহার</string>
<string name="rate_this_app">এই অ্যাপ্লিকেশন রেট করুন</string>
<string name="archive">সংরক্ষণ করুন</string>
<string name="unarchive">সংরক্ষণাগারমুক্ত করুন</string>
<string name="archived">কার্ড সংরক্ষণাগারভুক্ত</string>
<string name="noUnarchivedCardsMessage">আর্কাইভ করা কোনো কার্ড নেই</string>
<string name="welcome">Catima-তে স্বাগতম</string>
<string name="updateBalanceTitle">আপনি কত খরচ করেছেন\?</string>
<string name="updateBalanceHint">পরিমান লিখুন</string>
<string name="currentBalanceSentence">বর্তমান ব্যালেন্স: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -13,4 +13,5 @@
<string name="deleteTitle">Elimina la targeta</string> <string name="deleteTitle">Elimina la targeta</string>
<string name="welcome">Benvingut a Catima</string> <string name="welcome">Benvingut a Catima</string>
<string name="noGiftCards">Cliqueu el botó + més per afegir una targeta, o importeu-ne des del ⋮ menú.</string> <string name="noGiftCards">Cliqueu el botó + més per afegir una targeta, o importeu-ne des del ⋮ menú.</string>
<string name="photos">Fotos</string>
</resources> </resources>

View File

@@ -275,4 +275,13 @@
<string name="anyDate">Jakékoliv datum</string> <string name="anyDate">Jakékoliv datum</string>
<string name="chooseValidFromDate">Vyberte datum počátku platnosti</string> <string name="chooseValidFromDate">Vyberte datum počátku platnosti</string>
<string name="validFromSentence">Platnost od: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Platnost od: <xliff:g>%s</xliff:g></string>
<string name="height">Výška:</string>
<string name="switchToFrontImage">Přepnout na přední obrázek</string>
<string name="switchToBackImage">Přepnout na zadní obrázek</string>
<string name="switchToBarcode">Přepnout na čárový kód</string>
<string name="openFrontImageInGalleryApp">Otevřít přední obrázek v galerii</string>
<string name="openImageInGallery">Otevřít obrázek v galerii</string>
<string name="openBackImageInGalleryApp">Otevřít zadní obrázek v galerii</string>
<string name="setBarcodeHeight">Nastavit výšku čárového kódu</string>
<string name="donate">Přispět</string>
</resources> </resources>

View File

@@ -275,4 +275,13 @@
<string name="validFromDate">Válido desde</string> <string name="validFromDate">Válido desde</string>
<string name="chooseValidFromDate">Elija una fecha válida desde</string> <string name="chooseValidFromDate">Elija una fecha válida desde</string>
<string name="validFromSentence">Válido desde: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Válido desde: <xliff:g>%s</xliff:g></string>
<string name="height">Altura:</string>
<string name="switchToFrontImage">Cambiar a imagen frontal</string>
<string name="openFrontImageInGalleryApp">Abrir imagen frontal en la aplicación de la galería</string>
<string name="openBackImageInGalleryApp">Abrir imagen trasera en la aplicación de la galería</string>
<string name="setBarcodeHeight">Ajustar la altura del código de barras</string>
<string name="donate">Donar</string>
<string name="switchToBarcode">Cambiar a código de barras</string>
<string name="openImageInGallery">Abrir imagen en la aplicación de la galería</string>
<string name="switchToBackImage">Cambiar a imagen trasera</string>
</resources> </resources>

View File

@@ -275,4 +275,13 @@
<string name="validFromSentence">Valide à partir de : <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Valide à partir de : <xliff:g>%s</xliff:g></string>
<string name="anyDate">Nimporte quelle date</string> <string name="anyDate">Nimporte quelle date</string>
<string name="chooseValidFromDate">Choisissez la date de début de validité</string> <string name="chooseValidFromDate">Choisissez la date de début de validité</string>
<string name="height">Hauteur :</string>
<string name="switchToFrontImage">Passer à l\'image avant</string>
<string name="switchToBackImage">Passer à l\'image arrière</string>
<string name="switchToBarcode">Passer au code barre</string>
<string name="openImageInGallery">Ouvrir l\'image dans l\'application galerie</string>
<string name="openFrontImageInGalleryApp">Ouvrir l\'image avant dans l\'application galerie</string>
<string name="openBackImageInGalleryApp">Ouvrir l\'image arrière dans l\'application galerie</string>
<string name="setBarcodeHeight">Définir la hauteur du code-barres</string>
<string name="donate">Faire un don</string>
</resources> </resources>

View File

@@ -1,83 +1,287 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="unstar">Ukloni iz favorita</string> <string name="unstar">Ukloni iz favorita</string>
<string name="action_search">Pretraživanje</string> <string name="action_search">Pretraži</string>
<string name="save">Spremi</string> <string name="save">Spremi</string>
<string name="edit">Uredi</string> <string name="edit">Uredi</string>
<string name="delete">Ukloni</string> <string name="delete">Ukloni</string>
<string name="confirm">Potvrdi</string> <string name="confirm">Potvrdi</string>
<string name="deleteTitle">Ukloni kartu</string> <string name="deleteTitle">Izbriši karticu</string>
<string name="deleteConfirmation">Izbrisati ovu karticu zauvijek\?</string> <string name="deleteConfirmation">Izbrisati ovu karticu zauvijek\?</string>
<string name="copy_to_clipboard">Kopiraj ID u međuspremnik</string> <string name="copy_to_clipboard">Kopiraj ID u međuspremnik</string>
<string name="share">Podijeli</string> <string name="share">Dijeli</string>
<string name="sendLabel">Pošalji…</string> <string name="sendLabel">Pošalji </string>
<string name="editCardTitle">Uredi karticu</string> <string name="editCardTitle">Uredi karticu</string>
<string name="addCardTitle">Dodaj Kartu</string> <string name="addCardTitle">Dodaj karticu</string>
<string name="scanCardBarcode">Skeniranje crtičnog koda kartice</string> <string name="scanCardBarcode">Snimi crtični kod kartice</string>
<string name="cardShortcut">Oznaka karte</string> <string name="cardShortcut">Prečac kartice</string>
<string name="noCardsMessage">Najprije dodajte karticu</string> <string name="noCardsMessage">Najprije dodaj karticu</string>
<string name="card_ids_copied">Kopirani ID kartice</string> <string name="card_ids_copied">ID oznake su kopirane</string>
<string name="noBarcode">Nema crtičnog koda</string> <string name="noBarcode">Nema crtičnog koda</string>
<string name="star">Dodaj u favorite</string> <string name="star">Dodaj u favorite</string>
<string name="action_add">Dodaj</string> <string name="action_add">Dodaj</string>
<string name="storeName">Ime</string> <string name="storeName">Ime</string>
<string name="note">Napomena</string> <string name="note">Napomena</string>
<string name="noMatchingGiftCards">Nema rezultata. Pokušajte promijeniti pretraživanje.</string> <string name="noMatchingGiftCards">Nema rezultata. Pokušaj promijeniti pretragu.</string>
<string name="cardId">ID kartice</string> <string name="cardId">ID kartice</string>
<string name="barcodeType">Vrsta crtičnog koda</string> <string name="barcodeType">Vrsta crtičnog koda</string>
<string name="barcodeNoBarcode">Na ovoj kartici nema crtičnog koda</string> <string name="barcodeNoBarcode">Ne postoji crtični kod</string>
<string name="cancel">Poništi</string> <string name="cancel">Odustani</string>
<string name="noGiftCards">Pritisnite gumb + plus da biste dodali karticu ili ga najprije uvezite iz izbornika ⋮.</string> <string name="noGiftCards">Pritisni gumb + plus za dodavanje kartice ili uvezi putem izbornika ⋮.</string>
<string name="noStoreError">Ime nije uneseno</string> <string name="noStoreError">Ime nije zadano</string>
<string name="noCardExistsError">Nije moguće pronaći karticu</string> <string name="noCardExistsError">Nije bilo moguće pronaći tu karticu</string>
<string name="failedParsingImportUriError">Nije moguće analizirati uvoz URI</string> <string name="failedParsingImportUriError">Nije bilo moguće obraditi URI uvoza</string>
<string name="importExport">Uvoz / Izvoz</string> <string name="importExport">Uvoz/Izvoz</string>
<string name="exportName">Izvoz</string> <string name="exportName">Izvoz</string>
<string name="importExportHelp">Sigurnosno kopiranje kartica omogućuje vam da ih premjestite na drugi uređaj.</string> <string name="importExportHelp">Spremanje sigurnosnih kopija tvojih podataka omogućuje premještanje podataka na jedan drugi uređaj.</string>
<string name="importSuccessfulTitle">Uvezeno</string> <string name="importSuccessfulTitle">Uvezeno</string>
<string name="importFailedTitle">Nije moguće uvesti</string> <string name="importFailedTitle">Neuspio uvoz</string>
<string name="importFailed">Nije moguće uvesti karte</string> <string name="importFailed">Nije bilo moguće izvršiti uvoz</string>
<string name="exportSuccessfulTitle">Izvezeno</string> <string name="exportSuccessfulTitle">Izvezeno</string>
<string name="about">Oh</string> <string name="about">Informacije</string>
<string name="importOptionApplicationButton">Koristite drugu aplikaciju</string> <string name="importOptionApplicationButton">Koristi jednu drugu aplikaciju</string>
<string name="barcode">Barkod</string> <string name="barcode">Crtični kod</string>
<string name="exportOptionExplanation">Podaci će biti zabilježeni na odabranom mjestu.</string> <string name="exportOptionExplanation">Podaci će se zapisati u željeno mjesto.</string>
<string name="exportFailedTitle">Izvoz nije uspio</string> <string name="exportFailedTitle">Neuspio izvoz</string>
<string name="exporting">Opskrba</string> <string name="exporting">Izvoz </string>
<string name="importOptionFilesystemExplanation">Odaberite određenu datoteku iz datotečnog sustava.</string> <string name="importOptionFilesystemExplanation">Odaberi određenu datoteku iz datotečnog sustava.</string>
<string name="importOptionApplicationTitle">Koristite drugu aplikaciju</string> <string name="importOptionApplicationTitle">Koristi jednu drugu aplikaciju</string>
<string name="settings">Postavke</string> <string name="settings">Postavke</string>
<string name="settings_dark_theme">Tamno</string> <string name="settings_dark_theme">Tamna</string>
<string name="exportFailed">Nije moguće izvesti karte</string> <string name="exportFailed">Nije bilo moguće izvršiti izvoz</string>
<string name="importing">Uvoz…</string> <string name="importing">Uvoz </string>
<string name="importOptionFilesystemTitle">Uvoz iz datotečnog sustava</string> <string name="importOptionFilesystemTitle">Uvoz iz datotečnog sustava</string>
<string name="importOptionFilesystemButton">Iz datotečnog sustava</string> <string name="importOptionFilesystemButton">Iz datotečnog sustava</string>
<string name="importOptionApplicationExplanation">Koristite bilo koju aplikaciju ili omiljeni upravitelj datoteka za otvaranje datoteke.</string> <string name="importOptionApplicationExplanation">Za otvaranje datoteke koristi bilo koju aplikaciju ili tvoj omiljeni upravlj datoteka.</string>
<string name="settings_theme">Tema</string> <string name="settings_theme">Tema</string>
<string name="settings_system_theme">Sustav</string> <string name="settings_system_theme">Sustav</string>
<string name="settings_light_theme">Svjetlo</string> <string name="settings_light_theme">Svijetla</string>
<string name="settings_max_font_size_scale">Maksimalna veličina fonta</string> <string name="settings_max_font_size_scale">Maksimalna veličina fonta</string>
<string name="settings_display_barcode_max_brightness">Osvijetlite izgled crtičnog koda</string> <string name="settings_display_barcode_max_brightness">Osvijetli prikaz crtičnog koda</string>
<string name="moveDown">Pomicanje prema dolje</string> <string name="moveDown">Pomakni prema dolje</string>
<string name="addManually">Ručno unesite ID kartice</string> <string name="addManually">Ručno upiši ID</string>
<string name="thumbnailDescription">Sličica za karticu</string> <string name="thumbnailDescription">Sličica</string>
<string name="starImage">Omiljena zvijezda</string> <string name="starImage">Omiljena zvijezda</string>
<string name="settings_category_title_ui">Korisničko sučelje</string> <string name="settings_category_title_ui">Korisničko sučelje</string>
<string name="exportSuccessful">Izvezeni podaci o karti</string> <string name="exportSuccessful">Podaci su izvezeni</string>
<string name="settings_keep_screen_on">Držite zaslon uključen</string> <string name="settings_keep_screen_on">Ostavi ekran uključen</string>
<string name="settings_disable_lockscreen_while_viewing_card">Spriječiti zaključavanje zaslona</string> <string name="settings_disable_lockscreen_while_viewing_card">Spriječi zaključavanje ekrana</string>
<string name="intent_import_card_from_url_share_text">Želim podijeliti razglednicu s vama</string> <string name="intent_import_card_from_url_share_text">Želim dijeliti karticu s tobom</string>
<string name="importSuccessful">Uvezeni podaci o karti</string> <string name="importSuccessful">Podaci su uvezeni</string>
<string name="enter_group_name">Unesite naziv grupe</string> <string name="enter_group_name">Upiši ime grupe</string>
<string name="groups">Grupe</string> <string name="groups">Grupe</string>
<string name="noGroups">Pritisnite gumb + plus da biste najprije dodali grupe za klasifikaciju.</string> <string name="noGroups">Pritisni gumb + plus za dodavanje grupe za kategoriziranje.</string>
<string name="noGroupCards">Ova grupa ne sadrži nikakve kartice</string> <string name="noGroupCards">Ova je grupa prazna</string>
<string name="addFromImage">Odaberite sliku iz galerije</string> <string name="addFromImage">Odaberi sliku iz galerije</string>
<string name="deleteConfirmationGroup">Izbriši grupu\?</string> <string name="deleteConfirmationGroup">Izbrisati grupu\?</string>
<string name="failedOpeningFileManager">Najprije instalirajte upravitelj datoteka.</string> <string name="failedOpeningFileManager">Najprije instaliraj upravlj datoteka.</string>
<string name="moveUp">Pomicanje gore</string> <string name="moveUp">Pomakni prema gore</string>
<string name="leaveWithoutSaveTitle">Izlaz</string> <string name="leaveWithoutSaveTitle">Zatvori aplikaciju</string>
<string name="card">Karta</string> <string name="card">Kartica</string>
<string name="leaveWithoutSaveConfirmation">Otići bez očuvanja\?</string> <string name="leaveWithoutSaveConfirmation">Zatvoriti aplikaciju bez spremanja\?</string>
<string name="noGiftCardsGroup">Izradite neke kartice, a zatim ih dodijelite grupi ovdje.</string> <string name="noGiftCardsGroup">Stvori neke kartice, a zatim ih ovdje dodijeli grupi.</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kartica</item>
<item quantity="few"><xliff:g>%d</xliff:g> kartice</item>
<item quantity="other"><xliff:g>%d</xliff:g> kartica</item>
</plurals>
<string name="importStocardMessage">Odaberi tvoju iz Stocard izvezenu <i>***.zip</i> datoteku koju želiš uvesti.
\nPošalji e-mail na support@stocardapp.com s molbom za izvoz tvojih podataka.</string>
<string name="translate_platform">na platformi Weblate</string>
<string name="editGroup">Uređivanje grupe: <xliff:g>%s</xliff:g></string>
<string name="editBarcode">Uredi crtični kod</string>
<string name="expiryDate">Datum isteka</string>
<string name="never">Nikada</string>
<string name="accept">Prihvati</string>
<string name="importCatima">Uvezi iz Catima</string>
<string name="importFidme">Uvezi iz FidMe</string>
<string name="importStocard">Uvezi iz Stocard</string>
<string name="importLoyaltyCardKeychainMessage">Odaberi tvoju iz LoyaltyCardKeychain izvezenu <i>LoyaltyCardKeychain.csv</i> datoteku koju želiš uvesti.
\nStvori je putem izbornika „Uvoz/Izvoz” u aplikaciji LoyaltyCardKeychain i tamo najprije pritisni „Izvoz”.</string>
<string name="updateBarcodeQuestionText">Promijenio/la si ID. Želiš li također aktualizirati crtični kod da koristi istu vrijednost\?</string>
<string name="action_hide_details">Sakrij detalje</string>
<string name="importCards">Uvezi kartice</string>
<string name="selectColor">Odaberi boju</string>
<string name="setIcon">Postavi ikonu</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_green_theme">Zelena</string>
<string name="settings_grey_theme">Siva</string>
<string name="sort_by_expiry">Istek</string>
<string name="barcodeImageDescriptionWithType">Slika vrste crtičnog koda <xliff:g>%s</xliff:g></string>
<string name="noCardIdError">ID nije zadan</string>
<string name="importLoyaltyCardKeychain">Uvezi iz Loyalty Card Keychain</string>
<string name="frontImageDescription">Prednja slika</string>
<string name="exportPasswordHint">Upiši lozinku</string>
<string name="turn_flashlight_on">Uključi svjetiljku</string>
<string name="failedGeneratingShareURL">Nije bilo moguće generirati URL za dijeljenje. Prijavi ovaj problem.</string>
<string name="turn_flashlight_off">Isključi svjetiljku</string>
<string name="settings_locale">Jezik</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_violet_theme">Ljubičasta</string>
<string name="settings_sky_blue_theme">Nebesko plava</string>
<string name="sort">Razvrstaj</string>
<string name="hideMoreInfo">Sakrij informacije</string>
<string name="updateBalance">Aktualiziraj saldo</string>
<string name="swipeToSwitchImages">Klizni prstom za mijenjanje slika, pritisni dugo za otvaranje slike u aplikaciji galerije</string>
<string name="sort_by_balance">Saldo</string>
<string name="sort_by">Redoslijed</string>
<string name="version_history">Kronologija verzija</string>
<string name="credits">Zasluge</string>
<string name="and_data_usage">i korištenje podataka</string>
<string name="rate_this_app">Ocijeni ovu aplikaciju</string>
<string name="report_error">Prijavi greške</string>
<string name="include_if_asking_support">Ako želiš zatražiti podršku, uključi sljedeće informacije:</string>
<string name="options">Opcije</string>
<string name="starred">Označeno</string>
<string name="set_scale">Postavi veličinu</string>
<string name="duplicateCard">Dupliciraj</string>
<string name="archive">Arhiviraj</string>
<string name="archived">Kartica je arhivirana</string>
<string name="unarchived">Kartica je dearhivirana</string>
<string name="failedLaunchingPhotoPicker">Nije bilo moguće pronaći aplikaciju za galeriju</string>
<string name="archiveList">Arhiva</string>
<string name="cameraPermissionDeniedTitle">Nije bilo moguće pristupiti kameri</string>
<string name="noCameraPermissionDirectToSystemSetting">Za snimanje crtičnih kodova Catima treba pristup tvojoj kameri. Dodirni ovdje za mijenjanje postavki dozvola.</string>
<string name="app_libraries">Libre biblioteke trećih strana: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Biranje crtičnog koda</string>
<string name="copy_to_clipboard_toast">ID je kopiran u međuspremnik</string>
<string name="enterBarcodeInstructions">Upiši ID i dolje odaberi vrstu crtičnog koda ili „Ne postoji crtični kod”.</string>
<string name="settings_portrait_orientation">Okomito</string>
<string name="settings_lock_on_opening_orientation">Zaključaj na položaj koji se koristi prilikom otvaranja kartice</string>
<string name="group_edit">Uredi grupu</string>
<string name="group_name_already_in_use">Ime grupe se već koristi</string>
<string name="noBarcodeFound">Nijedan crtični kod nije pronađen</string>
<string name="balance">Saldo</string>
<string name="chooseImportType">Uvezi podatke iz</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="parsingBalanceFailed">Čini se da <xliff:g>%s</xliff:g> nije ispravni saldo.</string>
<string name="privacy_policy_popup_text">Obavijest o politici privatnosti (obavezna za neke trgovine aplikacija):
\n
\nPODACI SE UOPĆE NE PRIKUPLJAJU, što svatko može potvrditi budući da je naša aplikacija libre softver.</string>
<string name="importCatimaMessage">Odaberi tvoju iz Catima izvezenu <i>catima.zip</i> datoteku koju želiš uvesti.
\nStvori je putem izbornika „Uvoz/Izvoz” jedne druge Catima aplikacije i tamo najprije pritisni „Izvoz”.</string>
<string name="height">Visina:</string>
<string name="switchToFrontImage">Prebaci na prednju sliku</string>
<string name="switchToBackImage">Prebaci na stražnju sliku</string>
<string name="switchToBarcode">Prebaci na crtični kod</string>
<string name="openImageInGallery">Otvori sliku u aplikaciji galerije</string>
<string name="openFrontImageInGalleryApp">Otvori prednju sliku u aplikaciji galerije</string>
<string name="openBackImageInGalleryApp">Otvori stražnju sliku u aplikaciji galerije</string>
<string name="setBarcodeHeight">Postavi visinu crtičnog koda</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> odabrana</item>
<item quantity="few"><xliff:g>%d</xliff:g> odabrane</item>
<item quantity="other"><xliff:g>%d</xliff:g> odabrano</item>
</plurals>
<string name="validFromDate">Vrijedi od</string>
<string name="chooseValidFromDate">Odaberi datum od kada kartica vrijedi</string>
<string name="anyDate">Bilo koji datum</string>
<string name="validFromSentence">Vrijedi od: <xliff:g>%s</xliff:g></string>
<string name="photos">Slike</string>
<string name="ok">U redu</string>
<string name="app_copyright_old">Zasnovano na Loyalty Card Keychain
\nautorsko pravo © 2016. 2020. Branden Archer</string>
<string name="settings_system_locale">Sustav</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> bod</item>
<item quantity="few"><xliff:g>%s</xliff:g> boda</item>
<item quantity="other"><xliff:g>%s</xliff:g> bodova</item>
</plurals>
<string name="donate">Doniraj</string>
<string name="storageReadPermissionRequired">Za ovu radnju je potrebna dozvola za čitanje spremljenih podataka …</string>
<string name="cameraPermissionRequired">Za ovu radnju je potrebna dozvola za pristup kameri …</string>
<string name="app_license">Copylefted libre softver, GPLv3+ licenca</string>
<string name="settings_card_orientation">Položaj crtičnog koda</string>
<string name="settings_follow_system_orientation">Slijedi sustav</string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="importFidmeMessage">Odaberi tvoju iz FidMe izvezenu <i>idme-export-request-xxxxxx.zip</i> datoteku koju želiš uvesti i ručno odaberi vste crtičnog koda nakon toga.
\nStvori je putem tvog FidMe profila i tamo najprije odaberi „Zaštita podataka” a zatim pritisni „Dekomprimiraj moje podatke”.</string>
<string name="importVoucherVaultMessage">Odaberi tvoju iz Voucher Vault izvezenu <i>vouchervault.json</i> datoteku koju želiš uvesti.
\nStvori je u aplikaciji Voucher Vault i tamo najprije pritisni „Izvoz”.</string>
<string name="settings_pink_theme">Ružičasta</string>
<string name="settings_blue_theme">Plava</string>
<string name="failedToRetrieveImageFile">Neuspjelo dohvaćanje slikovne datoteke</string>
<string name="license">Licenca</string>
<string name="barcodeLongPressMessage">U aplikaciji galerije se mogu otvoriiti samo slike</string>
<string name="source_repository">Izvorni repozitorij</string>
<string name="on_github">na GitHubu</string>
<string name="on_google_play">na stranici Google Play</string>
<string name="unarchive">Dearhiviraj</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirana)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> kartice (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirane)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirano)</item>
</plurals>
<string name="help_translate_this_app">Pomogni prevoditi ovu aplikaciju</string>
<string name="welcome">Pozdrav u Catima</string>
<string name="currentBalanceSentence">Aktualni saldo: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Novi saldo: <xliff:g>%s</xliff:g></string>
<plurals name="deleteCardsTitle">
<item quantity="one">Izbriši <xliff:g>%d</xliff:g> karticu</item>
<item quantity="few">Izbriši <xliff:g>%d</xliff:g> kartice</item>
<item quantity="other">Izbriši <xliff:g>%d</xliff:g> kartica</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Izbrisati ovu <xliff:g>%d</xliff:g> karticu zauvijek\?</item>
<item quantity="few">Izbrisati ove <xliff:g>%d</xliff:g> kartice zauvijek\?</item>
<item quantity="other">Izbrisati ovih <xliff:g>%d</xliff:g> kartica zauvijek\?</item>
</plurals>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019. <xliff:g>%d.</xliff:g> Sylvia van Os</string>
<string name="debug_version_fmt">Verzija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informacije revizije: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_resources">Libre resursi trećih strana: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="settings_landscape_orientation">Vodoravno</string>
<string name="group_name_is_empty">Ime grupe ne smije biti prazno</string>
<string name="group_updated">Grupa je aktualizirana</string>
<string name="all">Sve</string>
<string name="groupsList">Grupe: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Isteče: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Isteklo: <xliff:g>%s</xliff:g></string>
<string name="chooseExpiryDate">Odaberi datum isteka</string>
<string name="moveBarcodeToTopOfScreen">Premjesti crtični kod na vrh ekrana</string>
<string name="moveBarcodeToCenterOfScreen">Centriraj crtični kod na ekranu</string>
<string name="errorReadingImage">Nije bilo moguće učitati sliku</string>
<string name="currency">Valuta</string>
<string name="points">Bodovi</string>
<string name="privacy_policy">Politika privatnosti</string>
<string name="importVoucherVault">Uvezi iz Voucher Vault</string>
<string name="barcodeId">Vrijednost crtičnog koda</string>
<string name="sameAsCardId">Ista kao ID</string>
<string name="setBarcodeId">Postavi vrijednost crtičnog koda</string>
<string name="unsupportedBarcodeType">Ova se vrsta crtičnog koda još ne može prikazati. Možda će se podržati u novijoj verziji aplikacije.</string>
<string name="wrongValueForBarcodeType">Vrijednost nije valjana za odabranu vrstu crtičnog koda</string>
<string name="copy_to_clipboard_multiple_toast">ID oznke su kopirane u međuspremnik</string>
<string name="intent_import_card_from_url_share_multiple_text">Želim dijeliti neke kartice s tobom</string>
<string name="backImageDescription">Stražnja slika</string>
<string name="setFrontImage">Postavi prednju sliku</string>
<string name="setBackImage">Postavi stražnju sliku</string>
<string name="removeImage">Ukloni sliku</string>
<string name="takePhoto">Uslikaj fotografiju</string>
<string name="updateBarcodeQuestionTitle">Aktualizirati vrijednost crtičnog koda\?</string>
<string name="yes">Da</string>
<string name="no">Ne</string>
<string name="passwordRequired">Upiši lozinku</string>
<string name="exportPassword">Postavi lozinku za zaštitu tvog izvoza (opcionalno)</string>
<string name="settings_oled_dark">Potpuno crna pozadina za tamnu temu</string>
<string name="settings_theme_color">Boja teme</string>
<string name="settings_brown_theme">Smeđa</string>
<string name="app_contributors">Omogućuje: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="showMoreInfo">Prikaži informacije</string>
<string name="sort_by_name">Ime</string>
<string name="sort_by_most_recently_used">Nedavno korišteno</string>
<string name="reverse">… u obrnutom redoslijedu</string>
<string name="action_show_details">Prikaži detalje</string>
<string name="shortcutSelectCard">Odaberi karticu</string>
<string name="noUnarchivedCardsMessage">Ne postoje nearhivirane kartice</string>
<string name="previousCard">Prethodna</string>
<string name="nextCard">Sljedeća</string>
<string name="updateBalanceTitle">Koliko si potrošio/la\?</string>
<string name="updateBalanceHint">Upiši iznos</string>
<string name="about_title_fmt">Informaije o <xliff:g id="app_name">%s</xliff:g></string>
<string name="failedToOpenUrl">Najprije instaliraj web preglednik</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Pogledaj arhivu (<xliff:g>%1$d</xliff:g> kartica)</item>
<item quantity="few">Pogledaj arhivu (<xliff:g>%1$d</xliff:g> kartice)</item>
<item quantity="other">Pogledaj arhivu (<xliff:g>%1$d</xliff:g> kartica)</item>
</plurals>
</resources> </resources>

View File

@@ -4,96 +4,96 @@
<string name="action_add">Hozzáadás</string> <string name="action_add">Hozzáadás</string>
<string name="action_search">Keresés</string> <string name="action_search">Keresés</string>
<plurals name="selectedCardCount"> <plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kiválasztott</item> <item quantity="one"><xliff:g>%d</xliff:g> kiválasztva</item>
<item quantity="other"><xliff:g>%d</xliff:g> kiválasztottak</item> <item quantity="other"><xliff:g>%d</xliff:g> kiválasztva</item>
</plurals> </plurals>
<string name="noCardsMessage">Először adjon hozzá egy kártyát</string> <string name="noCardsMessage">Először adjon hozzá egy kártyát</string>
<string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string> <string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string>
<string name="noMatchingGiftCards">Nincs eredmény. Próbálja módosítani a keresést.</string> <string name="noMatchingGiftCards">Nincs találaat. Próbálja módosítani a keresést.</string>
<string name="storeName">Név</string> <string name="storeName">Név</string>
<string name="note">Feljegyzés</string> <string name="note">Feljegyzés</string>
<string name="cardId">Kártya azonosító</string> <string name="cardId">Kártyaazonosító</string>
<string name="barcodeType">Vonalkód típus</string> <string name="barcodeType">Vonalkód típusa</string>
<string name="barcodeNoBarcode">Nincs vonalkód</string> <string name="barcodeNoBarcode">Nincs vonalkód</string>
<string name="noBarcode">Nincs vonalkód</string> <string name="noBarcode">Nincs vonalkód</string>
<string name="star">Kedvencekhez adás</string> <string name="star">Hozzáadás a kedvencekhez</string>
<string name="unstar">Kivétel a kedvencek közül</string> <string name="unstar">Eltávolítás a kedvencekl</string>
<string name="cancel">Mégse</string> <string name="cancel">Mégse</string>
<string name="save">Mentés</string> <string name="save">Mentés</string>
<string name="edit">Szerkesztés</string> <string name="edit">Szerkesztés</string>
<string name="delete">Törlés</string> <string name="delete">Törlés</string>
<string name="confirm">Jóváhagy</string> <string name="confirm">Jóváhagyás</string>
<plurals name="deleteCardsTitle"> <plurals name="deleteCardsTitle">
<item quantity="one">Törölje az <xliff:g>%d</xliff:g> kártyát</item> <item quantity="one"><xliff:g>%d</xliff:g> kártya törlése</item>
<item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item> <item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item>
</plurals> </plurals>
<string name="deleteConfirmation">Véglegesen törli a kártyát\?</string> <string name="deleteConfirmation">Véglegesen törli a kártyát\?</string>
<string name="ok">Rendben</string> <string name="ok">Rendben</string>
<string name="copy_to_clipboard">Azonosító másolása a vágólapra</string> <string name="copy_to_clipboard">Azonosító vágólapra másolása</string>
<string name="share">Megosztás</string> <string name="share">Megosztás</string>
<string name="sendLabel">Küldés…</string> <string name="sendLabel">Küldés…</string>
<string name="editCardTitle">Kártya szerkesztése</string> <string name="editCardTitle">Kártya szerkesztése</string>
<string name="addCardTitle">Kártya hozzáadása</string> <string name="addCardTitle">Kártya hozzáadása</string>
<string name="scanCardBarcode">Vonalkód szkennelése</string> <string name="scanCardBarcode">Vonalkód leolvasása</string>
<string name="cardShortcut">Kártya parancsikon</string> <string name="cardShortcut">Kártya parancsikon</string>
<string name="noStoreError">Nincs név megadva</string> <string name="noStoreError">Nincs név megadva</string>
<string name="failedParsingImportUriError">Nem elemezhető az importált URI</string> <string name="failedParsingImportUriError">Az importálási URI nem értelmezhető</string>
<string name="importExport">Import/Export</string> <string name="importExport">Importálás/exportálás</string>
<string name="exportName">Export</string> <string name="exportName">Exportálás</string>
<string name="importExportHelp">Az adataid mentése lehetővé teszi, hogy egy másik eszközre feltöltsd.</string> <string name="importExportHelp">Az adatok mentése lehetővé teszi, hogy egy másik eszközre helyezze át.</string>
<string name="importSuccessfulTitle">Importálva</string> <string name="importSuccessfulTitle">Importálva</string>
<string name="importFailedTitle">Importálás meghiúsult</string> <string name="importFailedTitle">Az importálás sikertelen</string>
<string name="importFailed">Importálás nem hajtható végre</string> <string name="importFailed">Nem sikerült az importálás végrehajtása</string>
<string name="exportSuccessfulTitle">Exportálva</string> <string name="exportSuccessfulTitle">Exportálva</string>
<string name="exportFailedTitle">Exportálás meghiúsult</string> <string name="exportFailedTitle">Az exportálás sikertelen</string>
<plurals name="deleteCardsConfirmation"> <plurals name="deleteCardsConfirmation">
<item quantity="one">Véglegesen törli a <xliff:g>%d</xliff:g> kártyát\?</item> <item quantity="one">Véglegesen töröl <xliff:g>%d</xliff:g> kártyát\?</item>
<item quantity="other">Véglegesen törli a <xliff:g>%d</xliff:g> kártyákat\?</item> <item quantity="other">Véglegesen töröl <xliff:g>%d</xliff:g> kártyát\?</item>
</plurals> </plurals>
<string name="deleteTitle">Kártya törlése</string> <string name="deleteTitle">Kártya törlése</string>
<string name="card_ids_copied">Azonosító(k) másolása</string> <string name="card_ids_copied">Azonosító(k) másolva</string>
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> vonalkód képe</string> <string name="barcodeImageDescriptionWithType">A(z) <xliff:g>%s</xliff:g> vonalkód képe</string>
<string name="noCardIdError">Nincs azonosító megadva</string> <string name="noCardIdError">Nincs azonosító megadva</string>
<string name="noCardExistsError">Kártya nem található</string> <string name="noCardExistsError">A kártya nem található</string>
<string name="importStocardMessage">Válassza ki a <i>***.zip</i> Stocard exportot. <string name="importStocardMessage">Válassza ki az importálandó <i>***.zip</i> Stocard export fájlt.
\nAdatinak exportját kérheti e-mailben a support@stocardapp.com címre írva.</string> \nAz adatainak exportálását a support@stocardapp.com címre írt levélben kérheti.</string>
<string name="importVoucherVault">Importálás Voucher Vault-ból</string> <string name="importVoucherVault">Importálás a Voucher Vaultból</string>
<string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a vonalkód típushoz</string> <string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a kiválasztott vonalkódtípushoz</string>
<string name="settings_green_theme">Zöld</string> <string name="settings_green_theme">Zöld</string>
<string name="setBackImage">Hátlapi kép beállítása</string> <string name="setBackImage">Hátlapi kép beállítása</string>
<string name="no">Nem</string> <string name="no">Nem</string>
<string name="passwordRequired">Kérem írja be a kódot</string> <string name="passwordRequired">Adja meg a jelszót</string>
<string name="settings_catima_theme">Catima</string> <string name="settings_catima_theme">Catima</string>
<string name="exportPasswordHint">Kód beírása</string> <string name="exportPasswordHint">Kód beírása</string>
<string name="failedGeneratingShareURL">Nem lehetett megosztható címet generálni. Kérem jelentse ezt.</string> <string name="failedGeneratingShareURL">Nem lehetett megosztható webcímet előállítani. Kérjük, ezt jelentse.</string>
<string name="settings_theme_color">Téma színe</string> <string name="settings_theme_color">Téma színe</string>
<string name="settings_grey_theme">Szürke</string> <string name="settings_grey_theme">Szürke</string>
<string name="sort">Rendez</string> <string name="sort">Rendezés</string>
<string name="on_google_play">Google Play-en</string> <string name="on_google_play">a Google Playen</string>
<string name="action_show_details">Részletek mutatása</string> <string name="action_show_details">Részletek megjelenítése</string>
<string name="action_hide_details">Részletek elrejtése</string> <string name="action_hide_details">Részletek elrejtése</string>
<string name="and_data_usage">és adat használat</string> <string name="and_data_usage">és adathasználat</string>
<string name="translate_platform">Weblate-en</string> <string name="translate_platform">a Weblate-en</string>
<string name="sort_by_name">Név</string> <string name="sort_by_name">Név</string>
<string name="sort_by_most_recently_used">Legutóbb használt</string> <string name="sort_by_most_recently_used">Legutóbb használt</string>
<string name="sort_by_expiry">Lejárat</string> <string name="sort_by_expiry">Lejárat</string>
<string name="rate_this_app">Értékelje az appot</string> <string name="rate_this_app">Értékelje az alkalmazást</string>
<string name="exportFailed">Exportálás sikertelen</string> <string name="exportFailed">Nem sikerült az exportálás végrehajtása</string>
<string name="importing">Importálás…</string> <string name="importing">Importálás…</string>
<string name="exporting">Exportálás…</string> <string name="exporting">Exportálás…</string>
<string name="exportOptionExplanation">Az adatokat a kiválasztott helyre fogjuk menteni.</string> <string name="exportOptionExplanation">Az adatok a kiválasztott helyre lesznek mentve.</string>
<string name="importOptionFilesystemTitle">Importálás fájlrendszerből</string> <string name="importOptionFilesystemTitle">Importálás fájlrendszerből</string>
<string name="importOptionFilesystemButton">A fájlrendszerből</string> <string name="importOptionFilesystemButton">A fájlrendszerből</string>
<string name="importOptionApplicationTitle">Másik app használata</string> <string name="importOptionApplicationTitle">Másik alkalmazás használata</string>
<string name="importOptionApplicationExplanation">Használjon egy tetszőleges appot, vagy kedvenc fájl menedzserét a fájl megnyitásához.</string> <string name="importOptionApplicationExplanation">A fájl megnyitásához használjon egy tetszőleges alkalmazást, vagy a kedvenc fájlkezelőjét.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Szerzői Jog © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string> <string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="app_license">Copyleft-elt gáttalan szoftver, GPLv3+ licenszelve</string> <string name="app_license">Copyleft licencű szabad szoftver, GPLv3+ alatt közzétéve</string>
<string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g> névjegye</string> <string name="about_title_fmt">A <xliff:g id="app_name">%s</xliff:g> névjegye</string>
<string name="debug_version_fmt">Verzió: <xliff:g id="version">%s</xliff:g></string> <string name="debug_version_fmt">Verzió: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revíziós információ: <xliff:g id="app_revision_url">%s</xliff:g></string> <string name="app_revision_fmt">Revíziós információ: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_resources">Gáttalan külsős források: <xliff:g id="app_resources_list">%s</xliff:g></string> <string name="app_resources">Szabad külső erőforrások: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Vonalkód kiválasztása</string> <string name="selectBarcodeTitle">Vonalkód kiválasztása</string>
<string name="enterBarcodeInstructions">Írja be az azonosítót, majd válasszon egy vonalkódot, vagy a \"Nincs vonalkód\" opciót.</string> <string name="enterBarcodeInstructions">Írja be az azonosítót, majd válasszon egy vonalkódot, vagy a Nincs vonalkód” lehetőséget.</string>
<string name="copy_to_clipboard_toast">Azonosító vágólapra másolva</string> <string name="copy_to_clipboard_toast">Azonosító vágólapra másolva</string>
<string name="starImage">Kedvencek csillag</string> <string name="starImage">Kedvencek csillag</string>
<string name="settings">Beállítások</string> <string name="settings">Beállítások</string>
@@ -101,26 +101,26 @@
<string name="settings_theme">Téma</string> <string name="settings_theme">Téma</string>
<string name="settings_system_theme">Rendszer</string> <string name="settings_system_theme">Rendszer</string>
<string name="settings_light_theme">Világos</string> <string name="settings_light_theme">Világos</string>
<string name="settings_max_font_size_scale">Max. betű méret</string> <string name="settings_max_font_size_scale">Legnagyobb betűméret</string>
<string name="settings_display_barcode_max_brightness">Fényes vonalkód nézet</string> <string name="settings_display_barcode_max_brightness">Vonalkód nézet világosítása</string>
<string name="settings_keep_screen_on">Képernyő bekapcsolva marad</string> <string name="settings_keep_screen_on">A képernyő bekapcsolva tartása</string>
<string name="settings_disable_lockscreen_while_viewing_card">Képernyő zárólás megakadályozása</string> <string name="settings_disable_lockscreen_while_viewing_card">Képernyőzárólás megakadályozása</string>
<string name="intent_import_card_from_url_share_text">Meg akarok veled osztani egy kártyát</string> <string name="intent_import_card_from_url_share_text">Meg akarok veled osztani egy kártyát</string>
<string name="importSuccessful">Adat importálva</string> <string name="importSuccessful">Adatok importálva</string>
<string name="exportSuccessful">Adat exportálva</string> <string name="exportSuccessful">Adatok exportálva</string>
<string name="enter_group_name">Adja meg a csoport nevét</string> <string name="enter_group_name">Adja meg a csoport nevét</string>
<string name="groups">Csoportok</string> <string name="groups">Csoportok</string>
<string name="group_edit">Csoport szerkesztése</string> <string name="group_edit">Csoport szerkesztése</string>
<string name="group_name_is_empty">Csoport név nem lehet üres</string> <string name="group_name_is_empty">A csoportnév nem lehet üres</string>
<string name="failedOpeningFileManager">Telepítsen egy fájl menedzsert.</string> <string name="failedOpeningFileManager">Előbb telepítsen egy fájlkezelőt.</string>
<string name="moveUp">Felfelé mozgatás</string> <string name="moveUp">Mozgatás felfelé</string>
<string name="moveDown">Lefelé mozgatás</string> <string name="moveDown">Mozgatás lefelé</string>
<string name="leaveWithoutSaveTitle">Kilépés</string> <string name="leaveWithoutSaveTitle">Kilépés</string>
<string name="leaveWithoutSaveConfirmation">Kilépés mentés nélkül\?</string> <string name="leaveWithoutSaveConfirmation">Kilépés mentés nélkül\?</string>
<string name="addManually">Azonosító manuális beírása</string> <string name="addManually">Azonosító kézi beírása</string>
<string name="addFromImage">Kép kiválasztása a galériából</string> <string name="addFromImage">Kép kiválasztása a galériából</string>
<string name="editGroup">Csoportok szerkesztése: <xliff:g>%s</xliff:g></string> <string name="editGroup">Csoportok szerkesztése: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Érvényes: <xliff:g>%s</xliff:g></string> <string name="expiryStateSentence">Lejárat: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">Egyenleg: <xliff:g>%s</xliff:g></string> <string name="balanceSentence">Egyenleg: <xliff:g>%s</xliff:g></string>
<string name="card">Kártya</string> <string name="card">Kártya</string>
<string name="barcode">Vonalkód</string> <string name="barcode">Vonalkód</string>
@@ -133,25 +133,25 @@
<string name="noBarcodeFound">Nem található vonalkód</string> <string name="noBarcodeFound">Nem található vonalkód</string>
<string name="errorReadingImage">Nem lehet olvasni a képet</string> <string name="errorReadingImage">Nem lehet olvasni a képet</string>
<string name="balance">Egyenleg</string> <string name="balance">Egyenleg</string>
<string name="currency">Valuta</string> <string name="currency">Pénznem</string>
<string name="points">Pontok</string> <string name="points">Pontok</string>
<string name="parsingBalanceFailed">A <xliff:g>%s</xliff:g> nem tűnik valós egyenlegnek.</string> <string name="parsingBalanceFailed">A(z) <xliff:g>%s</xliff:g> nem tűnik valós egyenlegnek.</string>
<string name="app_loyalty_card_keychain">Hűségkártya kulcstartó</string> <string name="app_loyalty_card_keychain">Hűségkártya-kulcstartó</string>
<string name="privacy_policy">Adatvédelmi Szabályzat</string> <string name="privacy_policy">Adatvédelmi irányelvek</string>
<string name="accept">Elfogad</string> <string name="accept">Elfogadás</string>
<string name="importCatima">Importálás Catimából</string> <string name="importCatima">Importálás a Catimából</string>
<string name="importFidme">Importálás FidMe-ből</string> <string name="importFidme">Importálás a FidMeből</string>
<string name="importLoyaltyCardKeychain">Importálás a Loyalty Card Keychain-ből</string> <string name="importLoyaltyCardKeychain">Importálás a Loyalty Card Keychainből</string>
<string name="importLoyaltyCardKeychainMessage">Válassza ki a Loyalty Card Keychain-ból importálni kívánt <i>LoyaltyCardKeychain.csv</i> export fájlt. <string name="importLoyaltyCardKeychainMessage">Válassza ki a Loyalty Card Keychainl importálandó <i>LoyaltyCardKeychain.csv</i> export fájlt.
\nLétrehozhatja az Import/Export menüből ha a Loyalty Card Keychain-ben rányom az Exportra.</string> \nEzt hozza létre a Loyalty Card Keychainben az Importálás/exportálás menüben, az Exportálás megnyomásával.</string>
<string name="importStocard">Importálás Stocard-ból</string> <string name="importStocard">Importálás a Stocardból</string>
<string name="importVoucherVaultMessage">Válassza ki a <i>vouchervault.json</i> Voucher Vault exportt. <string name="importVoucherVaultMessage">Válassza ki az importálandó <i>vouchervault.json</i> Voucher Vault export fájlt.
\nLétrehozhatja az Export-ra nyomva a Voucher Vault-ban.</string> \nEzt hozza létre a Voucher Vaultban az Exportálás megnyomásával.</string>
<string name="barcodeId">Vonalkód érték</string> <string name="barcodeId">Vonalkód értéke</string>
<string name="sameAsCardId">Ugyanaz, mint az azonosító</string> <string name="sameAsCardId">Ugyanaz, mint az azonosító</string>
<string name="setBarcodeId">Vonalkód érték beállítása</string> <string name="setBarcodeId">Vonalkód értékének beállítása</string>
<string name="unsupportedBarcodeType">Ez a vonalkód típus még nem megjeleníthető. Feltehetően támogatva lesz egy későbbi verzióban.</string> <string name="unsupportedBarcodeType">Ez a vonalkódtípus még nem jeleníthető meg. Lehet, hogy támogatott lesz az alkalmazás egy későbbi verzióban.</string>
<string name="copy_to_clipboard_multiple_toast">Azonosítók a vágólapra másolva</string> <string name="copy_to_clipboard_multiple_toast">Az azonosítók a vágólapra másolva</string>
<string name="intent_import_card_from_url_share_multiple_text">Meg akarok veled osztani pár kártyát</string> <string name="intent_import_card_from_url_share_multiple_text">Meg akarok veled osztani pár kártyát</string>
<string name="frontImageDescription">Előlapi kép</string> <string name="frontImageDescription">Előlapi kép</string>
<string name="backImageDescription">Hátlapi kép</string> <string name="backImageDescription">Hátlapi kép</string>
@@ -159,10 +159,10 @@
<string name="setFrontImage">Előlapi kép beállítása</string> <string name="setFrontImage">Előlapi kép beállítása</string>
<string name="removeImage">Kép eltávolítása</string> <string name="removeImage">Kép eltávolítása</string>
<string name="takePhoto">Fénykép készítése</string> <string name="takePhoto">Fénykép készítése</string>
<string name="updateBarcodeQuestionTitle">Vonalkód érték frissítése\?</string> <string name="updateBarcodeQuestionTitle">Vonalkódérték frissítése\?</string>
<string name="updateBarcodeQuestionText">Megváltoztatta az azonosító. Meg akarja ennek megfelelően változtatni a vonalkód értéket is\?</string> <string name="updateBarcodeQuestionText">Megváltoztatta az azonosítót. Ennek megfelelően megváltoztatja a vonalkód értéket is\?</string>
<string name="yes">Igen</string> <string name="yes">Igen</string>
<string name="exportPassword">Írjon be egy jelszót az export védelme érdekében (opcionális)</string> <string name="exportPassword">Állítson be egy jelszót az export védelme érdekében (nem kötelező)</string>
<string name="turn_flashlight_on">Zseblámpa bekapcsolása</string> <string name="turn_flashlight_on">Zseblámpa bekapcsolása</string>
<string name="turn_flashlight_off">Zseblámpa kikapcsolása</string> <string name="turn_flashlight_off">Zseblámpa kikapcsolása</string>
<string name="settings_locale">Nyelv</string> <string name="settings_locale">Nyelv</string>
@@ -170,102 +170,111 @@
<string name="selectColor">Szín kiválasztása</string> <string name="selectColor">Szín kiválasztása</string>
<string name="setIcon">Ikon beállítása</string> <string name="setIcon">Ikon beállítása</string>
<string name="settings_pink_theme">Rózsaszín</string> <string name="settings_pink_theme">Rózsaszín</string>
<string name="settings_magenta_theme">Magenta</string> <string name="settings_magenta_theme">Bíbor</string>
<string name="settings_violet_theme">Ibolyaszínű</string> <string name="settings_violet_theme">Ibolya</string>
<string name="settings_blue_theme">Kék</string> <string name="settings_blue_theme">Kék</string>
<string name="settings_sky_blue_theme">Égszínkék</string> <string name="settings_sky_blue_theme">Égszínkék</string>
<string name="settings_brown_theme">Barna</string> <string name="settings_brown_theme">Barna</string>
<string name="app_contributors">Lehetővé tette: <xliff:g id="app_contributors">%s</xliff:g></string> <string name="app_contributors">Lehetővé tették: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="showMoreInfo">Infó mutatása</string> <string name="showMoreInfo">Információk megjelenítése</string>
<string name="hideMoreInfo">Infó elrejtése</string> <string name="hideMoreInfo">Információk elrejtése</string>
<string name="swipeToSwitchImages">Csúsztassa ujját a képek váltásához, tartsa lenyomva a kép megnyitásához a Galéria alkalmazásban</string> <string name="swipeToSwitchImages">Legyintsen a képek váltásához, tartsa lenyomva a kép megnyitásához a galéria alkalmazásban</string>
<string name="sort_by_balance">Egyenleg</string> <string name="sort_by_balance">Egyenleg</string>
<string name="reverse">...fordított sorrendben</string> <string name="reverse">fordított sorrendben</string>
<string name="sort_by">Rendezés mint</string> <string name="sort_by">Rendezés:</string>
<string name="version_history">Verzió történet</string> <string name="version_history">Verziótörténet</string>
<string name="credits">Köszönet</string> <string name="credits">Köszönet</string>
<string name="help_translate_this_app">Segítsen lefordítani az appot</string> <string name="help_translate_this_app">Segítsen lefordítani az alkalmazást</string>
<string name="license">Licensz</string> <string name="license">Licenc</string>
<string name="source_repository">Forrás repó</string> <string name="source_repository">Forráskódtároló</string>
<string name="on_github">GitBub-on</string> <string name="on_github">a GitHubon</string>
<string name="report_error">Hiba Jelentése</string> <string name="report_error">Hiba jelentése</string>
<string name="shortcutSelectCard">Válasszon egy kártyát</string> <string name="shortcutSelectCard">Válasszon egy kártyát</string>
<string name="options">Beállítások</string> <string name="options">Beállítások</string>
<string name="starred">Csillagozva</string> <string name="starred">Csillagozva</string>
<string name="set_scale">Méret választása</string> <string name="set_scale">Méret beállítása</string>
<plurals name="groupCardCount"> <plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kártya</item> <item quantity="one"><xliff:g>%d</xliff:g> kártya</item>
<item quantity="other"><xliff:g>%d</xliff:g> kártyák</item> <item quantity="other"><xliff:g>%d</xliff:g> kártya</item>
</plurals> </plurals>
<plurals name="balancePoints"> <plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> pont</item> <item quantity="one"><xliff:g>%s</xliff:g> pont</item>
<item quantity="other"><xliff:g>%s</xliff:g> pontok</item> <item quantity="other"><xliff:g>%s</xliff:g> pontok</item>
</plurals> </plurals>
<string name="chooseImportType">Adat importálása innen</string> <string name="chooseImportType">Adatok importálása innen</string>
<string name="thumbnailDescription">Előkép</string> <string name="thumbnailDescription">Előkép</string>
<string name="importOptionFilesystemExplanation">Válassza ki a kívánt fájlt a fájlrendszerből.</string> <string name="importOptionFilesystemExplanation">Válassza ki a kívánt fájlt a fájlrendszerből.</string>
<string name="importOptionApplicationButton">Másik app használata</string> <string name="importOptionApplicationButton">Másik alkalmazás használata</string>
<string name="about">Névjegy</string> <string name="about">Névjegy</string>
<string name="app_copyright_old">Készült a Loyalty Card Keychain alapján <string name="app_copyright_old">Készült a Loyalty Card Keychain alapján
\nszerzői jog © 20162020 Branden Archer</string> \nCopyright © 20162020 Branden Archer</string>
<string name="app_libraries">Gáttalan külsős mappák: <xliff:g id="app_libraries_list">%s</xliff:g></string> <string name="app_libraries">Szabad külső programkönyvtárak: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="settings_dark_theme">Sötét</string> <string name="settings_dark_theme">Sötét</string>
<string name="deleteConfirmationGroup">Csoport törlése\?</string> <string name="deleteConfirmationGroup">Csoport törlése\?</string>
<string name="noGroups">Nyomja meg a + gombot a csoportok kategorizálásához.</string> <string name="noGroups">Nyomja meg a + gombot a csoportok kategorizálásához.</string>
<string name="group_name_already_in_use">Csoport név már létezik</string> <string name="group_name_already_in_use">A csoportnév már létezik</string>
<string name="all">Mind</string> <string name="all">Összes</string>
<string name="noGroupCards">Ez a csoport üres</string> <string name="noGroupCards">Ez a csoport üres</string>
<string name="group_updated">Csoport frissítve</string> <string name="group_updated">Csoport frissítve</string>
<string name="expiryStateSentenceExpired">Lejárt: <xliff:g>%s</xliff:g></string> <string name="expiryStateSentenceExpired">Lejárt: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Csoportok: <xliff:g>%s</xliff:g></string> <string name="groupsList">Csoportok: <xliff:g>%s</xliff:g></string>
<string name="importCatimaMessage">Válassza ki a <i>catima.zip</i>-jét az importáláshoz. <string name="importCatimaMessage">Válassza ki az exportált <i>catima.zip</i> fájlt az importáláshoz.
\nLétrehozhatja az Import/Export menüből az Exportálást megnyomva egy másik Catima appban.</string> \nLétrehozhatja az Importálás/exportálás menüből az Exportálást megnyomva egy másik Catima alkalmazásban.</string>
<string name="privacy_policy_popup_text">Adatvédelmi szabály értesítő (némely app bolt kéri): <string name="privacy_policy_popup_text">Adatvédelmi irányelvek nyilatkozata (némely alkalmazásbolt kéri):
\n \n
\nSEMMILYEN ADATGYŰJTÉS NINCS, amit bárki ellenőrizhet, lévén hogy az app gáttalan szoftver.</string> \nSEMMILYEN ADAT NEM KERÜL GYŰJTÉSRE, amit bárki ellenőrizhet, hiszen az alkalmazás szabad szoftver.</string>
<string name="importFidmeMessage">Válassza ki a <i>fidme-export-request-xxxxxx.zip</i> nevű FidMe exportot, majd importálja be és válassza a manuális vonalkód opciót utána. <string name="importFidmeMessage">Válassza ki a FidMeből exportált <i>fidme-export-request-xxxxxx.zip</i> fájl majd importálja be, és utána válassza a kézi vonalkódbeírást.
\nEzt a FidMe-ben megtalálja a profiljában az Adat Védelem résznél ha rányom az Adataim Kivonata linkre.</string> \nEzt hozza létre a FidMe-profiljában az Adatvédelem rész választásával, majd a Saját adatok kinyerése megnyomásával.</string>
<string name="settings_card_orientation">Vonalkód tájolás</string> <string name="settings_card_orientation">Vonalkód tájolása</string>
<plurals name="groupCardCountWithArchived"> <plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item> <item quantity="one"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kártyák (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item> <item quantity="other"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
</plurals> </plurals>
<string name="noUnarchivedCardsMessage">Nincs archiválatlan kártya</string> <string name="noUnarchivedCardsMessage">Nincs archiválatlan kártya</string>
<string name="failedToOpenUrl">Először telepíts egy webböngészőt</string> <string name="failedToOpenUrl">Először telepítsen egy webböngészőt</string>
<string name="failedLaunchingPhotoPicker">Nem található támogatott képnézegető app</string> <string name="failedLaunchingPhotoPicker">Nem található támogatott galéria alkalmazás</string>
<string name="previousCard">Előző</string> <string name="previousCard">Előző</string>
<string name="nextCard">Következő</string> <string name="nextCard">Következő</string>
<string name="settings_portrait_orientation">Álló</string> <string name="settings_portrait_orientation">Álló</string>
<string name="settings_follow_system_orientation">Rendszer követése</string> <string name="settings_follow_system_orientation">Rendszer követése</string>
<string name="settings_lock_on_opening_orientation">A használt tájolás zárolása kártya használatakor</string> <string name="settings_lock_on_opening_orientation">A használt tájolás zárolása a kártya megnyitásakor</string>
<string name="settings_landscape_orientation">Fekvő</string> <string name="settings_landscape_orientation">Fekvő</string>
<string name="settings_oled_dark">Tiszta fekete háttér sötét témánál</string> <string name="settings_oled_dark">Teljesen fekete háttér a sötét témánál</string>
<string name="include_if_asking_support">Ha támogatást szeretnél igénybe venni, oszd meg az alábbi információkat:</string> <string name="include_if_asking_support">Ha támogatás akar kérni, ossza meg az alábbi információkat:</string>
<string name="archive">Archivál</string> <string name="archive">Archiválás</string>
<string name="unarchive">Archiválás megszüntetése</string> <string name="unarchive">Archiválás megszüntetése</string>
<string name="archived">Kártya archiválása</string> <string name="archived">Kártya archiválva</string>
<string name="archiveList">Archivál</string> <string name="archiveList">Archívum</string>
<string name="duplicateCard">Másolat</string> <string name="duplicateCard">Klónozás</string>
<string name="currentBalanceSentence">Jelenlegi egyenleg: <xliff:g>%s</xliff:g></string> <string name="currentBalanceSentence">Jelenlegi egyenleg: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Adja meg az összeget</string> <string name="updateBalanceHint">Adja meg az összeget</string>
<string name="importCards">Kártyák importálása</string> <string name="importCards">Kártyák importálása</string>
<string name="updateBalanceTitle">Mennyit költöttél\?</string> <string name="updateBalanceTitle">Mennyit költött\?</string>
<string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string> <string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string>
<string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string> <string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string>
<string name="barcodeLongPressMessage">Csak képek nyithatók meg a galéria alkalmazásban</string> <string name="barcodeLongPressMessage">Csak képek nyithatók meg a galéria alkalmazásban</string>
<string name="unarchived">Archiválatlan kártya</string> <string name="unarchived">Kártya archiválása megszüntetve</string>
<string name="welcome">Üdvözöljük Catimában</string> <string name="welcome">Üdvözöljük a Catimában</string>
<plurals name="viewArchivedCardsWithCount"> <plurals name="viewArchivedCardsWithCount">
<item quantity="one">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártya)</item> <item quantity="one">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártya)</item>
<item quantity="other">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártyák)</item> <item quantity="other">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártya)</item>
</plurals> </plurals>
<string name="updateBalance">Egyenleg frissítése</string> <string name="updateBalance">Egyenleg frissítése</string>
<string name="noCameraPermissionDirectToSystemSetting">A vonalkódok beolvasásához a Catimának hozzá kell férnie a kamerához. Koppintson ide az engedélybeállítások módosításához.</string> <string name="noCameraPermissionDirectToSystemSetting">A vonalkódok leolvasásához a Catimának hozzá kell férnie a kamerához. Koppintson ide az engedélybeállítások módosításához.</string>
<string name="validFromDate">Érvényesség kezdete</string> <string name="validFromDate">Érvényesség kezdete</string>
<string name="anyDate">Bármely dátum</string> <string name="anyDate">Bármely dátum</string>
<string name="chooseValidFromDate">Válassza ki az érvényesség kezdeti dátumot</string> <string name="chooseValidFromDate">Válassza ki az érvényesség kezdetét</string>
<string name="validFromSentence">Érvényesség kezdete: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Érvényesség kezdete: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">A művelethez tároló olvasási engedély szükséges…</string> <string name="storageReadPermissionRequired">A művelethez tárolóolvasási engedély szükséges…</string>
<string name="cameraPermissionRequired">A kamerához való hozzáférés engedélye szükséges ehhez a művelethez</string> <string name="cameraPermissionRequired">A művelethez a kamera-hozzáférési engedély szükséges…</string>
<string name="height">Magasság:</string>
<string name="switchToFrontImage">Elölnézeti képre váltás</string>
<string name="switchToBackImage">Hátulnézeti képre váltás</string>
<string name="switchToBarcode">Vonalkódra váltás</string>
<string name="donate">Adományozás</string>
<string name="openImageInGallery">Kép megnyitása a galéria alkalmazásban</string>
<string name="openBackImageInGalleryApp">Hátulnézeti kép megnyitása a galéria alkalmazásban</string>
<string name="openFrontImageInGalleryApp">Elölnézeti kép megnyitása a galéria alkalmazásban</string>
<string name="setBarcodeHeight">Vonalkód magasságának megadása</string>
</resources> </resources>

View File

@@ -263,4 +263,13 @@
\n<xliff:g>%s</xliff:g></string> \n<xliff:g>%s</xliff:g></string>
<string name="anyDate">Kapan pun</string> <string name="anyDate">Kapan pun</string>
<string name="chooseValidFromDate">Pilih valid dari tanggal</string> <string name="chooseValidFromDate">Pilih valid dari tanggal</string>
<string name="height">Tinggi:</string>
<string name="switchToFrontImage">Ubah ke depan gambar</string>
<string name="switchToBackImage">Ubah ke belakang gambar</string>
<string name="switchToBarcode">Ubah ke kode batang</string>
<string name="openImageInGallery">Buka gambar dari galeri app</string>
<string name="openFrontImageInGalleryApp">Buka gambar didepan di galeri app</string>
<string name="openBackImageInGalleryApp">Buka gambar dibelakang di galeri app</string>
<string name="setBarcodeHeight">Atur tinggi kode batang</string>
<string name="donate">Donasi</string>
</resources> </resources>

View File

@@ -275,4 +275,13 @@
<string name="chooseValidFromDate">Scegli la data di validità</string> <string name="chooseValidFromDate">Scegli la data di validità</string>
<string name="validFromSentence">Valido da: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Valido da: <xliff:g>%s</xliff:g></string>
<string name="anyDate">Qualsiasi data</string> <string name="anyDate">Qualsiasi data</string>
<string name="height">Altezza:</string>
<string name="switchToFrontImage">Passa all\'immagine frontale</string>
<string name="switchToBackImage">Passa all\'immagine dietro</string>
<string name="switchToBarcode">Passa al codice a barre</string>
<string name="openFrontImageInGalleryApp">Apri l\'immagine frontale nell\'app Galleria</string>
<string name="donate">Dona</string>
<string name="openImageInGallery">Apri l\'immagine nell\'app Galleria</string>
<string name="openBackImageInGalleryApp">Apri l\'immagine posteriore nell\'app Galleria</string>
<string name="setBarcodeHeight">Imposta l\'altezza del codice a barre</string>
</resources> </resources>

View File

@@ -271,4 +271,17 @@
<string name="importCards">Importuoti korteles</string> <string name="importCards">Importuoti korteles</string>
<string name="storageReadPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie saugyklos…</string> <string name="storageReadPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie saugyklos…</string>
<string name="cameraPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie kameros…</string> <string name="cameraPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie kameros…</string>
<string name="openBackImageInGalleryApp">Atidarykite galinį vaizdą galerijos programėlėje</string>
<string name="setBarcodeHeight">Nustatyti brūkšninio kodo aukštį</string>
<string name="validFromDate">Galioja nuo</string>
<string name="anyDate">Bet kuri data</string>
<string name="chooseValidFromDate">Pasirinkite datą, galiojančią nuo</string>
<string name="validFromSentence">Galioja nuo: <xliff:g>%s</xliff:g></string>
<string name="switchToBackImage">Perjungti į galinį vaizdą</string>
<string name="switchToBarcode">Perjungti į brūkšninį kodą</string>
<string name="openImageInGallery">Atidarykite paveikslėlį galerijos programėlėje</string>
<string name="height">Aukštis:</string>
<string name="switchToFrontImage">Perjungti į priekinį vaizdą</string>
<string name="openFrontImageInGalleryApp">Atidarykite priekinį vaizdą galerijos programėlėje</string>
<string name="donate">Aukoti</string>
</resources> </resources>

View File

@@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">Meklēt</string> <string name="action_search">Meklēt</string>
<string name="action_add">Pievienot</string> <string name="action_add">Pievienot</string>
<string name="noGiftCards">Noklikšķiniet uz pogas + plus, lai pievienotu karti, vai vispirms importējiet dažus no ⋮ izvēlnes.</string> <string name="noGiftCards">Noklikšķiniet uz pogas + plus, lai pievienotu karti, vai vispirms importējiet no ⋮ izvēlnes.</string>
<string name="noMatchingGiftCards">Nav rezultātu. Mēģiniet mainīt meklējamo tekstu.</string> <string name="noMatchingGiftCards">Nav rezultātu. Mēģiniet mainīt meklējamo tekstu.</string>
<string name="storeName">Nosaukums</string> <string name="storeName">Nosaukums</string>
<string name="note">Piezīme</string> <string name="note">Piezīme</string>
@@ -256,4 +256,14 @@
</plurals> </plurals>
<string name="failedToOpenUrl">Vispirms nepieciešams uzstādīt interneta pārlūku</string> <string name="failedToOpenUrl">Vispirms nepieciešams uzstādīt interneta pārlūku</string>
<string name="welcome">Laipni lūgti Catima</string> <string name="welcome">Laipni lūgti Catima</string>
</resources> <string name="cameraPermissionRequired">Ir nepieciešama pieeja kamerai lai veiktu šo darbību</string>
<string name="noCameraPermissionDirectToSystemSetting">Lai skanētu svītrkods, Catima ir nepieciešama pieeja jūsu kamerai. Nospied šeit lai nomainītu atļaujas iestatījumus.</string>
<string name="cameraPermissionDeniedTitle">Nevar pievienieties kamerai</string>
<string name="updateBalance">Atjaunināta bilance</string>
<string name="updateBalanceTitle">Cik daudz Tu iztērēji\?</string>
<string name="updateBalanceHint">Ievadi summu</string>
<string name="currentBalanceSentence">Šābrīža bilance: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Jauna bilance: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">Atļauja lasīt noliktavu ir nepieciešama šai darbībai…</string>
<string name="importCards">Importēt kartes</string>
</resources>

View File

@@ -27,10 +27,18 @@
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item> <item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item> <item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
<item name="colorPrimaryInverse">@color/md_theme_dark_primaryInverse</item> <item name="colorPrimaryInverse">@color/md_theme_dark_primaryInverse</item>
<item name="materialAlertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="alertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="windowActionModeOverlay">true</item> <item name="windowActionModeOverlay">true</item>
</style> </style>
<style name="ThemeOverlay.App.MaterialAlertDialog.Monet" parent="ThemeOverlay.Material3.MaterialAlertDialog">
<item name="alertDialogStyle">@style/MaterialAlertDialog.Material3</item>
<item name="dialogCornerRadius">28dp</item>
<item name="android:background">@drawable/dialog_bg_monet</item>
</style>
<!-- note that this is not used directly, these are used to patch the active theme runtime with <!-- note that this is not used directly, these are used to patch the active theme runtime with
theme.applyStyle theme.applyStyle
--> -->

View File

@@ -268,4 +268,13 @@
<string name="validFromDate">Geldig vanaf</string> <string name="validFromDate">Geldig vanaf</string>
<string name="validFromSentence">Geldig vanaf: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Geldig vanaf: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">Kies een geldige vanaf-datum</string> <string name="chooseValidFromDate">Kies een geldige vanaf-datum</string>
<string name="setBarcodeHeight">Barcodehoogte instellen</string>
<string name="height">Hoogte:</string>
<string name="switchToFrontImage">Voorzijde tonen</string>
<string name="switchToBackImage">Achterzijde tonen</string>
<string name="switchToBarcode">Barcode tonen</string>
<string name="openImageInGallery">Afbeelding openen in galerij-app</string>
<string name="openFrontImageInGalleryApp">Voorzijde openen in galerij-app</string>
<string name="openBackImageInGalleryApp">Achterzijde openen in galerij-app</string>
<string name="donate">Doneren</string>
</resources> </resources>

View File

@@ -51,7 +51,7 @@
<string name="settings">Paramètres</string> <string name="settings">Paramètres</string>
<string name="settings_category_title_ui">Interfàcia utilizaire</string> <string name="settings_category_title_ui">Interfàcia utilizaire</string>
<string name="settings_theme">Tèma</string> <string name="settings_theme">Tèma</string>
<string name="noGiftCards">Clicatz lo boton + per apondre una carta o utilizatz lo menú ⋮ per nimportar una.</string> <string name="noGiftCards">Clicatz lo boton + per apondre una carta o nimportar una menú ⋮</string>
<string name="noMatchingGiftCards">Cap de resultat. Ensajatz de modificar vòstra recèrca.</string> <string name="noMatchingGiftCards">Cap de resultat. Ensajatz de modificar vòstra recèrca.</string>
<string name="settings_light_theme">Clar</string> <string name="settings_light_theme">Clar</string>
<string name="settings_dark_theme">Escur</string> <string name="settings_dark_theme">Escur</string>
@@ -66,4 +66,5 @@
<string name="settings_max_font_size_scale">Talha max. de la poliça</string> <string name="settings_max_font_size_scale">Talha max. de la poliça</string>
<string name="settings_theme_color">Color del tèma</string> <string name="settings_theme_color">Color del tèma</string>
<string name="settings_locale">Lenga</string> <string name="settings_locale">Lenga</string>
<string name="noGiftCardsGroup">Creatz de cartas puèi ligatz-las al grop aicí.</string>
</resources> </resources>

View File

@@ -282,4 +282,13 @@
<string name="anyDate">Любая дата</string> <string name="anyDate">Любая дата</string>
<string name="chooseValidFromDate">Выбор даты действия</string> <string name="chooseValidFromDate">Выбор даты действия</string>
<string name="validFromSentence">Действует с: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Действует с: <xliff:g>%s</xliff:g></string>
<string name="setBarcodeHeight">Указать высоту штрих-кода</string>
<string name="height">Высота:</string>
<string name="switchToBarcode">Переключить на штрих-код</string>
<string name="switchToFrontImage">Переключить на лицевую сторону</string>
<string name="switchToBackImage">Переключить на заднюю сторону</string>
<string name="openImageInGallery">Открыть изображение в приложении галереи</string>
<string name="openFrontImageInGalleryApp">Открыть лицевое изображение в приложении галереи</string>
<string name="openBackImageInGalleryApp">Открыть заднее изображение в приложении галереи</string>
<string name="donate">Пожертвовать</string>
</resources> </resources>

View File

@@ -268,4 +268,13 @@
<string name="anyDate">Herhangi bir tarih</string> <string name="anyDate">Herhangi bir tarih</string>
<string name="validFromDate">Geçerlilik başlangıcı</string> <string name="validFromDate">Geçerlilik başlangıcı</string>
<string name="validFromSentence"><xliff:g>%s</xliff:g> tarihinden itibaren geçerlidir</string> <string name="validFromSentence"><xliff:g>%s</xliff:g> tarihinden itibaren geçerlidir</string>
<string name="height">Yükseklik:</string>
<string name="switchToBackImage">Arka resme geç</string>
<string name="switchToBarcode">Barkoda geç</string>
<string name="openImageInGallery">Resmi galeri uygulamasında aç</string>
<string name="donate">Bağış yap</string>
<string name="switchToFrontImage">Ön resme geç</string>
<string name="setBarcodeHeight">Barkod yüksekliğini ayarla</string>
<string name="openFrontImageInGalleryApp">Ön resmi galeri uygulamasında aç</string>
<string name="openBackImageInGalleryApp">Arka resmi galeri uygulamasında aç</string>
</resources> </resources>

View File

@@ -261,4 +261,13 @@
<string name="chooseValidFromDate">选择有效日期</string> <string name="chooseValidFromDate">选择有效日期</string>
<string name="validFromSentence">有效期自: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">有效期自: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionRequired">此操作所需的访问相机的权限…</string> <string name="cameraPermissionRequired">此操作所需的访问相机的权限…</string>
<string name="height">高度:</string>
<string name="switchToFrontImage">选择正面图像</string>
<string name="switchToBackImage">选择背面图像</string>
<string name="switchToBarcode">选择条形码</string>
<string name="openImageInGallery">使用图库软件打开图像</string>
<string name="openFrontImageInGalleryApp">使用图库软件打开正面图像</string>
<string name="openBackImageInGalleryApp">使用图库软件打开背面图像</string>
<string name="setBarcodeHeight">设置条形码高度</string>
<string name="donate">捐赠</string>
</resources> </resources>

View File

@@ -313,4 +313,13 @@
<string name="anyDate">Any date</string> <string name="anyDate">Any date</string>
<string name="chooseValidFromDate">Choose valid from date</string> <string name="chooseValidFromDate">Choose valid from date</string>
<string name="validFromSentence">Valid from: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Valid from: <xliff:g>%s</xliff:g></string>
<string name="height">Height:</string>
<string name="switchToFrontImage">Switch to front image</string>
<string name="switchToBackImage">Switch to back image</string>
<string name="switchToBarcode">Switch to barcode</string>
<string name="openImageInGallery">Open image in gallery app</string>
<string name="openFrontImageInGalleryApp">Open front image in gallery app</string>
<string name="openBackImageInGalleryApp">Open back image in gallery app</string>
<string name="setBarcodeHeight">Set barcode height</string>
<string name="donate">Donate</string>
</resources> </resources>

View File

@@ -27,8 +27,17 @@
<item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface</item> <item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface</item> <item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface</item>
<item name="colorPrimaryInverse">@color/md_theme_light_primaryInverse</item> <item name="colorPrimaryInverse">@color/md_theme_light_primaryInverse</item>
<item name="materialAlertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="alertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="windowActionModeOverlay">true</item> <item name="windowActionModeOverlay">true</item>
</style>
<style name="ThemeOverlay.App.MaterialAlertDialog.Monet" parent="ThemeOverlay.Material3.MaterialAlertDialog">
<item name="alertDialogStyle">@style/MaterialAlertDialog.Material3</item>
<item name="dialogCornerRadius">28dp</item>
<item name="android:background">@drawable/dialog_bg_monet</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="AppTheme"> <style name="AppTheme.NoActionBar" parent="AppTheme">

View File

@@ -25,6 +25,7 @@
app:singleLineTitle="false" /> app:singleLineTitle="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="false" android:defaultValue="false"
android:key="@string/settings_key_oled_dark" android:key="@string/settings_key_oled_dark"
android:title="@string/settings_oled_dark" android:title="@string/settings_oled_dark"
@@ -52,6 +53,7 @@
app:singleLineTitle="false" /> app:singleLineTitle="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_key_display_barcode_max_brightness" android:key="@string/settings_key_display_barcode_max_brightness"
android:title="@string/settings_display_barcode_max_brightness" android:title="@string/settings_display_barcode_max_brightness"
@@ -68,6 +70,7 @@
app:singleLineTitle="false" /> app:singleLineTitle="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_key_keep_screen_on" android:key="@string/settings_key_keep_screen_on"
android:title="@string/settings_keep_screen_on" android:title="@string/settings_keep_screen_on"
@@ -75,11 +78,14 @@
app:singleLineTitle="false" /> app:singleLineTitle="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_key_disable_lockscreen_while_viewing_card" android:key="@string/settings_key_disable_lockscreen_while_viewing_card"
android:title="@string/settings_disable_lockscreen_while_viewing_card" android:title="@string/settings_disable_lockscreen_while_viewing_card"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:singleLineTitle="false" /> app:singleLineTitle="false" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -60,25 +60,13 @@ public class LoyaltyCardCursorAdapterTest {
return viewHolder.itemView; return viewHolder.itemView;
} }
private void checkView(final View view, final String store, final String note, final String validFrom, final String expiry, final String balance, boolean checkFontSizes) { private void checkView(final View view, final String store, final String note, final String validFrom, final String expiry, final String balance) {
final TextView storeField = view.findViewById(R.id.store); final TextView storeField = view.findViewById(R.id.thumbnail_text);
final TextView noteField = view.findViewById(R.id.note); final TextView noteField = view.findViewById(R.id.note);
final TextView validFromField = view.findViewById(R.id.validFrom); final TextView validFromField = view.findViewById(R.id.validFrom);
final TextView expiryField = view.findViewById(R.id.expiry); final TextView expiryField = view.findViewById(R.id.expiry);
final TextView balanceField = view.findViewById(R.id.balance); final TextView balanceField = view.findViewById(R.id.balance);
if (checkFontSizes) {
Settings preferences = new Settings(activity.getApplicationContext());
int mediumFontSize = preferences.getFontSizeMax(preferences.getMediumFont());
int smallFontSize = preferences.getFontSizeMax(preferences.getSmallFont());
assertEquals(mediumFontSize, (int) storeField.getTextSize());
assertEquals(smallFontSize, (int) noteField.getTextSize());
assertEquals(smallFontSize, (int) validFromField.getTextSize());
assertEquals(smallFontSize, (int) expiryField.getTextSize());
}
assertEquals(store, storeField.getText().toString());
if (!note.isEmpty()) { if (!note.isEmpty()) {
assertEquals(View.VISIBLE, noteField.getVisibility()); assertEquals(View.VISIBLE, noteField.getVisibility());
assertEquals(note, noteField.getText().toString()); assertEquals(note, noteField.getText().toString());
@@ -119,7 +107,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", "", false); checkView(view, card.store, card.note, "", "", "");
cursor.close(); cursor.close();
} }
@@ -134,30 +122,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", "", false); checkView(view, card.store, card.note, "", "", "");
cursor.close();
}
@Test
public void TestCursorAdapterFontSizes() {
Date date = new Date();
String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(date);
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", date, date, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
setFontScale(50);
View view = createView(cursor);
checkView(view, card.store, card.note, dateString, dateString, "", true);
setFontScale(200);
view = createView(cursor);
checkView(view, card.store, card.note, dateString, dateString, "", true);
cursor.close(); cursor.close();
} }
@@ -223,7 +188,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", "", false); checkView(view, card.store, card.note, "", "", "");
cursor.close(); cursor.close();
} }
@@ -238,7 +203,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", "", false); checkView(view, card.store, card.note, "", "", "");
cursor.close(); cursor.close();
} }
@@ -253,7 +218,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", "100 points", false); checkView(view, card.store, card.note, "", "", "100 points");
cursor.close(); cursor.close();
} }
@@ -268,7 +233,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", "$10.00", false); checkView(view, card.store, card.note, "", "", "$10.00");
cursor.close(); cursor.close();
} }

View File

@@ -59,6 +59,7 @@ import java.util.Currency;
import java.util.Date; import java.util.Date;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.widget.TextViewCompat; import androidx.core.widget.TextViewCompat;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
@@ -309,7 +310,7 @@ public class LoyaltyCardViewActivityTest {
final String barcodeId, final String barcodeType, final String barcodeId, final String barcodeType,
final Bitmap frontImage, final Bitmap backImage) { final Bitmap frontImage, final Bitmap backImage) {
if (mode == ViewMode.VIEW_CARD) { if (mode == ViewMode.VIEW_CARD) {
checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId, FieldTypeView.TextView); checkFieldProperties(activity, R.id.card_id_view, View.VISIBLE, cardId, FieldTypeView.TextView);
} else { } else {
int editVisibility = View.VISIBLE; int editVisibility = View.VISIBLE;
@@ -621,7 +622,7 @@ public class LoyaltyCardViewActivityTest {
} }
@Test @Test
public void startWithLoyaltyCardViewModeCheckDisplay() throws IOException { public void startWithLoyaltyCardViewModeCheckDisplay() {
ActivityController activityController = createActivityWithLoyaltyCard(false); ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
@@ -1131,40 +1132,6 @@ public class LoyaltyCardViewActivityTest {
database.close(); database.close();
} }
@Test
public void startCheckFontSizes() {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
final int LARGE_FONT_SIZE = 40;
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity);
settings.edit()
.putInt(activity.getResources().getString(R.string.settings_key_max_font_size_scale), 100)
.apply();
activityController.start();
activityController.visible();
activityController.resume();
assertEquals(false, activity.isFinishing());
TextView storeName = activity.findViewById(R.id.storeName);
TextView cardIdFieldView = activity.findViewById(R.id.cardIdView);
TextViewCompat.getAutoSizeMaxTextSize(storeName);
TextViewCompat.getAutoSizeMaxTextSize(storeName);
assertEquals(LARGE_FONT_SIZE, TextViewCompat.getAutoSizeMaxTextSize(cardIdFieldView));
shadowOf(activity).clickMenuItem(android.R.id.home);
assertEquals(true, activity.isFinishing());
database.close();
}
@Test @Test
public void checkPushStarIcon() { public void checkPushStarIcon() {
ActivityController activityController = createActivityWithLoyaltyCard(false); ActivityController activityController = createActivityWithLoyaltyCard(false);
@@ -1213,13 +1180,12 @@ public class LoyaltyCardViewActivityTest {
assertFalse(activity.isFinishing()); assertFalse(activity.isFinishing());
View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout);
BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar); BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar);
ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton); ImageView mainImage = activity.findViewById(R.id.main_image);
ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton); LinearLayout container = activity.findViewById(R.id.container);
LinearLayout dotIndicator = activity.findViewById(R.id.dotIndicator); ConstraintLayout fullScreenLayout = activity.findViewById(R.id.fullscreen_layout);
ImageButton minimizeButton = activity.findViewById(R.id.fullscreen_button_minimize);
FloatingActionButton editButton = activity.findViewById(R.id.fabEdit); FloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler);
// Android should not be in fullscreen mode // Android should not be in fullscreen mode
assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars())); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
@@ -1227,16 +1193,13 @@ public class LoyaltyCardViewActivityTest {
assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
// Elements should be visible (except minimize button and scaler) // Elements should be visible (except minimize button and scaler)
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, maximizeButton.getVisibility()); assertEquals(View.VISIBLE, container.getVisibility());
assertEquals(View.GONE, minimizeButton.getVisibility()); assertEquals(View.GONE, fullScreenLayout.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Click maximize button to activate fullscreen // Click maximize button to activate fullscreen
maximizeButton.performClick(); mainImage.performClick();
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Android should be in fullscreen mode // Android should be in fullscreen mode
@@ -1245,13 +1208,10 @@ public class LoyaltyCardViewActivityTest {
assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior());
// Elements should not be visible (except minimize button and scaler) // Elements should not be visible (except minimize button and scaler)
assertEquals(View.GONE, collapsingToolbarLayout.getVisibility());
assertEquals(View.GONE, bottomAppBar.getVisibility()); assertEquals(View.GONE, bottomAppBar.getVisibility());
assertEquals(View.GONE, maximizeButton.getVisibility()); assertEquals(View.GONE, container.getVisibility());
assertEquals(View.VISIBLE, minimizeButton.getVisibility()); assertEquals(View.VISIBLE, fullScreenLayout.getVisibility());
assertEquals(View.GONE, editButton.getVisibility()); assertEquals(View.GONE, editButton.getVisibility());
assertEquals(View.VISIBLE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Clicking minimize button should deactivate fullscreen mode // Clicking minimize button should deactivate fullscreen mode
minimizeButton.performClick(); minimizeButton.performClick();
@@ -1261,29 +1221,23 @@ public class LoyaltyCardViewActivityTest {
assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars())); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, maximizeButton.getVisibility()); assertEquals(View.VISIBLE, container.getVisibility());
assertEquals(View.GONE, minimizeButton.getVisibility()); assertEquals(View.GONE, fullScreenLayout.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Another click back to fullscreen // Another click back to fullscreen
maximizeButton.performClick(); mainImage.performClick();
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars())); assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars())); assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.GONE, collapsingToolbarLayout.getVisibility());
assertEquals(View.GONE, bottomAppBar.getVisibility()); assertEquals(View.GONE, bottomAppBar.getVisibility());
assertEquals(View.GONE, maximizeButton.getVisibility()); assertEquals(View.GONE, container.getVisibility());
assertEquals(View.VISIBLE, minimizeButton.getVisibility()); assertEquals(View.VISIBLE, fullScreenLayout.getVisibility());
assertEquals(View.GONE, editButton.getVisibility()); assertEquals(View.GONE, editButton.getVisibility());
assertEquals(View.VISIBLE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// In full screen mode, back button should disable fullscreen // In full screen mode, back button should disable fullscreen
activity.onBackPressed(); activity.onBackPressed();
@@ -1293,13 +1247,10 @@ public class LoyaltyCardViewActivityTest {
assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars())); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, maximizeButton.getVisibility()); assertEquals(View.VISIBLE, container.getVisibility());
assertEquals(View.GONE, minimizeButton.getVisibility()); assertEquals(View.GONE, fullScreenLayout.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Pressing back when not in full screen should finish activity // Pressing back when not in full screen should finish activity
activity.onBackPressed(); activity.onBackPressed();
@@ -1323,12 +1274,10 @@ public class LoyaltyCardViewActivityTest {
assertEquals(false, activity.isFinishing()); assertEquals(false, activity.isFinishing());
View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout);
BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar); BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar);
ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton); ImageView mainImage = activity.findViewById(R.id.main_image);
ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton); ConstraintLayout fullScreenLayout = activity.findViewById(R.id.fullscreen_layout);
FloatingActionButton editButton = activity.findViewById(R.id.fabEdit); FloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler);
// Android should not be in fullscreen mode // Android should not be in fullscreen mode
int uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility(); int uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();
@@ -1336,12 +1285,10 @@ public class LoyaltyCardViewActivityTest {
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions);
// Elements should be visible (except minimize/maximize buttons and barcode and scaler) // Elements should be visible (except minimize/maximize buttons and barcode and scaler)
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.GONE, maximizeButton.getVisibility()); assertEquals(View.GONE, mainImage.getVisibility());
assertEquals(View.GONE, minimizeButton.getVisibility()); assertEquals(View.GONE, fullScreenLayout.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
// Pressing back when not in full screen should finish activity // Pressing back when not in full screen should finish activity
activity.onBackPressed(); activity.onBackPressed();

View File

@@ -153,10 +153,10 @@ public class MainActivityTest {
list.measure(0, 0); list.measure(0, 0);
list.layout(0, 0, 100, 1000); list.layout(0, 0, 100, 1000);
assertEquals("storeC", ((TextView) list.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.store)).getText()); assertEquals("storeC", ((TextView) list.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.thumbnail_text)).getText());
assertEquals("storeD", ((TextView) list.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.store)).getText()); assertEquals("storeD", ((TextView) list.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.thumbnail_text)).getText());
assertEquals("storeA", ((TextView) list.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.store)).getText()); assertEquals("storeA", ((TextView) list.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.thumbnail_text)).getText());
assertEquals("storeB", ((TextView) list.findViewHolderForAdapterPosition(3).itemView.findViewById(R.id.store)).getText()); assertEquals("storeB", ((TextView) list.findViewHolderForAdapterPosition(3).itemView.findViewById(R.id.thumbnail_text)).getText());
database.close(); database.close();
} }

View File

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

11
docs/RELEASE_STEPS.md Normal file
View File

@@ -0,0 +1,11 @@
**This documentation is for maintainers. If you're an user, please ignore it.**
# When releasing, do the following:
1. Press "Commit" and "Push" on Weblate to ensure all translations are up to date
2. Merge Weblate pull request
3. Update `CHANGELOG.md` with the new version name
4. Update `app/build.gradle` with the new `versionCode` and `versionName`
5. Build a new .apk: `KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh`
6. Upload the APK to Google Play Open Testing
7. Push the version update: `git add CHANGELOG.md app/build.gradle && git commit -m "Release Catima <VERSION>" && git push`
8. Create a new release on GitHub and attach the `app-release.apk` and `SHA256SUMS` files

View File

@@ -0,0 +1,3 @@
- Kompletní přepracování hlavní obrazovky a obrazovek věrnostních karet
- Motiv Material You pro obrazovku Nastavení
- Oprava havárie při použití „Pořídit fotografii“ při zakázaném fotoaparátu

View File

@@ -0,0 +1,3 @@
- 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

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -0,0 +1 @@
- Utiliser les couleurs de Material You sur un plus grand nombre d'appareils (mise à jour de la bibliothèque de Google)

View File

@@ -0,0 +1,3 @@
- Refonte complète des écrans de visualisation de la carte principale et de la carte de fidélité
- Design Material You pour l'écran des paramètres
- Correction du crash lors de l'utilisation de "Prendre une photo" avec l'application de caméra désactivée

View File

@@ -1,2 +1,2 @@
- Un clic long sur une carte affiche l'option de copier l'ID de la carte dans le presse-papiers. (pull #49 (https://github.com/brarcher/loyalty-card-locker/issues/49)) - Un clic long sur une carte affiche l'option de copier l'ID de la carte dans le presse-papiers. (pull #49 (https://github.com/brarcher/loyalty-card-locker/issues/49))
- Le bouton Retour de la vue Entrée/Exportation fonctionne désormais, déplaçant alors l'utilisateur vers la vue principale - Le bouton Retour de la vue Import/Export fonctionne désormais, déplaçant alors l'utilisateur vers la vue principale

View File

@@ -0,0 +1,22 @@
Prestani tražiti plastične kartice tijekom plaćanju u trgovini ili webshopu.
<b>Snimi crtični kod na svoj uređaj pomoću kamere, zaboravi kartice.</b>
Zaboravi novčanik ili ga koristi samo za dragocjenosti.
S ovim osnovnim alatom za svakodnevne potrebe (EDC) možeš zamijeniti beskorisnu plastiku s gotovinom.
- Izbjegni špijuniranja s vrlo malim brojem dozvola. Bez pristupa internetu i bez oglasa.
- Dodaj kartice ili kodove s imenima i prilagodljivim bojama.
- Ručni unos koda ako ne postoji crtični kod za spremanje ili ako se ne može koristiti.
- Uvoz kartica i kodova iz datoteka, Catima, FidMe, Loyalty Card Keychain, Stocard i Vaucher Vault.
- Spremi sigurnosnu kopiju svih tvojih kartica i prenesi ih na novi uređaj ako želiš.
- Dijeli kupone, ekskluzivne ponude, promotivne kodove ili kartice i kodove pomoću bilo koje aplikacije.
- Tamna tema i opcije pristupačnosti za slabovidne korisnike.
- Stvoreno za svakoga od zajednice libre softvera.
- Prevedeno na više od 20 jezika.
- Besplatna aplikacija, podržana doprinosima zajednice.
- Koristi, proučavaj, mijenjaj i dijeli kako želiš; <i>sa svima</i>.
- Ne samo slobodan softver/softver otvorenog koda. <i>Copylefted</i> libre softver (GPLv3+) za upravljanje karticama.
Olakšaj si život i kupovinu te više nikada nemoj izgubiti papirnati račun, darovnu karticu za plaćanje u trgovini ili avionsku kartu.
Ponesi sve svoje nagrade i bonuse sa sobom i uštedi.

View File

@@ -0,0 +1 @@
Za tvoje crtične kodove, članstva, kartice vjernosti, kupone i ulaznice.

View File

@@ -0,0 +1 @@
Catima Kartice vjernosti

View File

@@ -1,3 +1,3 @@
- Az alapértelmezett import/export fájlnév megváltoztatása (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84)) - Az alapértelmezett importálási/exportálási fájlnév megváltoztatása (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84))
- Megfelelő sor az import/export oldalon. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87)) - Megfelelő szöveg az importálás/exportálás oldalon. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87))
- Javítsa fel a kártya elrendezés nézetet. A szöveg könnyebben olvasható, és kiválasztható egy hosszú lenyomással. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91)) - A kártyás elrendezést használó nézet továbbfejlesztése. A szöveg könnyebben olvasható, és hosszú lenyomással kiválasztható. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91))

View File

@@ -1,2 +1,2 @@
- Keresés elrejtése, az ikonok kihúzása és rendezése amíg nincs legalább egy kártya - A keresés, a kibontás és a rendezés ikonjainak elrejtése, amíg nincs legalább egy kártya
- Többféle téma fixálás - Különböző témajavítások

View File

@@ -0,0 +1,3 @@
- Javítás, hogy a vágó a téma színeit használja
- Apró témázási problémák javítása
- Teljesen fekete sötét téma az OLED képernyők számára

View File

@@ -0,0 +1,2 @@
- Különböző apró javítása
- A norvég fordítás használata esetén történő összeomlás javítása

View File

@@ -0,0 +1,2 @@
- Javítás, hogy a kézileg kiválasztott nyelv mindenhol alkalmazva legyen
- A régiót nem tartalmazó területi beállítása esetén a szerkesztő nézetben történő összeomlás javítása

View File

@@ -0,0 +1,2 @@
- Kártya részleteinek kibontási állapotának mentése
- Apró felületi javítások

View File

@@ -0,0 +1,2 @@
- Az érvénytelen vonalkódok esetén megjelenő szürke blokkok megjelenésének javítása
- Stocard importálási javítások

View File

@@ -0,0 +1 @@
- Javítás, hogy egyes karaktersorozatok ne egy karakterként jelenjenek meg

View File

@@ -0,0 +1 @@
- Stocard importálási javítások

View File

@@ -0,0 +1,5 @@
- Kártyaklónozási funkció hozzáadása
- Az 1970 előtti lejárat kiválasztásának letiltása (egyébként sem működött)
- Kártyák archiválásának támogatása
- Törlés áthelyezése a szerkesztéstől a megtekintéshez
- Forgatási zárolási ikon eltávolítása, felváltja az új forgatási zárolási beállítás

View File

@@ -0,0 +1 @@
- A helytelen szövegszín javítása a „Nincs vonalkód” gombon

View File

@@ -1,5 +1,5 @@
- Rubrikák kitöltése a szerkesztésnél. (pull #94) - A meglévő azonosító kitöltése a kártya szerkesztésnél. (pull #94)
- Generált vonalkód hosszának korlátozása a memória hibák elkerülésére. (pull #103) - Az előállított vonalkód hosszának korlátozása a memóriahibák elkerülése érdekében. (pull #103)
- Ha egy kártya már létezik akkor a "Kártyába lépés" helyett "Kártya szerkesztése" gomb jelenik meg. (pull #104) - Ha egy kártya már létezik, akkor a Kártya megadása” helyett Kártya szerkesztése” lesz a gombfelirat. (pull #104)
- A színséma lágyabb az ikonnak megfelelően, és kártya nézet tisztítása. (pull #107) - A színséma lágyabb az ikonnak megfelelően, és kártyanézet tisztábban jelenik meg. (pull #107)
- Varázsló megjelenítése az első indításnál. (pull #108) - Varázsló megjelenítése az első indításnál. (pull #108)

View File

@@ -0,0 +1,7 @@
- Arab nyelvi támogatás
- Archivált kártyák számának megjelenítése a csoportáttekintőben
- Egyenlegértelmezési hibák javítása (Az arab, vagy a más nyelvű, nem nyugati számokat használó kártyák nem voltak menthetők)
- A főképernyőn nem helyesen voltak alkalmazva az egyéni témák
- A kiválasztott kártyák megjelenésének finomítása
- A jobbról balra írt kártyák esetén történő összeomlás javítása
- A jobbról balra irányú elrendezés esetén hibás irányba mutató vissza nyíl javítása

View File

@@ -0,0 +1 @@
- Az egyéni fejléc beállítási lehetőségének láthatóbbá tétele

View File

@@ -0,0 +1,3 @@
- Előző és következő gombok hozzáadása a hűségkártya nézethez
- Előtérszín javítása a szerkesztés gombon
- A floppy lemezt használó mentés ikon lecserélése egy pipára

View File

@@ -0,0 +1,3 @@
- Monokróm ikon hozzáadása az Android 13-hoz
- Az első indítási képernyő fejlesztése
- Fidme importálási javítások

View File

@@ -0,0 +1,4 @@
- Kép megnyitása a galériában hosszú lenyomásra
- Material stílus alkalmazása az a párbeszédablakokra
- Kártyák létrehozásának támogatása a kép a Catimával történő megosztásával
- Gyors költés gomb hozzáadása a kártya kéőernyőhöz

View File

@@ -0,0 +1,2 @@
- A gyors költési párbeszédablak nem támogatta a , elválasztót
- A fájlkezelőből történő képbetöltés támogatása

View File

@@ -0,0 +1,2 @@
- Felesleges engedélyek eltávolítása
- Android 13 célzása

View File

@@ -0,0 +1,2 @@
- A kártya érvényességének beállításának támogatása
- A Stocard importálás javítása (a Stocard exportálási formátuma megváltozott)

View File

@@ -0,0 +1 @@
- Material You színek használata több eszközön (Google programkönyvtár-frissítés)

View File

@@ -0,0 +1,3 @@
- A fő képernyő és a hűségkártya nézet teljes újratervezése
- Material You dizájn a beállítási képernyőn
- A tiltott kamera alkalmazás esetén, a „Fénykép készítése” lehetőségnél fellépő összeomlás javítása

View File

@@ -1,2 +1,2 @@
- 0.11-ben lecsökkentve a memória használat, cserébe csökkent a megjelenített karaktere száma is. (pull #126) - A v0.11-ben lecsökkent a vonalkódrajzolás memóriahasználata, de ez érintette a vonalkód méretét. Most már megtartja a méretet, miközben csökkenti a memóriahasználatot. (pull #126 (https://github.com/brarcher/loyalty-card-locker/pull/126))
- Francia és német fordítások frissítése. (pull #122, pull #124, pull #125) - A francia és német fordítások frissítése. (pull #122 (https://github.com/brarcher/loyalty-card-locker/pull/122), pull #124 (https://github.com/brarcher/loyalty-card-locker/pull/124), pull #125 (https://github.com/brarcher/loyalty-card-locker/pull/125))

View File

@@ -1,3 +1,3 @@
- Képernyő forgatás zárolása opció kártya megjelenítésénél. Zárás esetén az alap orientációban fog megjelenni, és nem lesz további forgatás. (pull #128) - Képernyőforgatás zárolása menüelem a kártya megjelenítésénél. Zárolás esetén a „természetes” tájolásában fog megjelenni. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
- Ha egy kártya kiválasztásra kerül, de nem betölthető, akkor egy hibaüzenet jelenik meg. (pull #132) - Ha egy kiválasztott kártya nem tölthető be, akkor az alkalmazás hibaüzenetet jelenít meg. (pull #132 (https://github.com/brarcher/loyalty-card-locker/pull/132))
- Fixálva a varázslónál fellépő elrendezés azonosító hiba. (pull #128) - A varázslóban fellépő, hiányzó elrendezésazonosító hibájának javítása. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))

View File

@@ -0,0 +1,2 @@
- Alkalmazásindítók támogatása (Android 7.1+), ahol a legutóbb használt kártyák jelennek meg indítóként. (pull #145 (https://github.com/brarcher/loyalty-card-locker/pull/145))
- Modul hozzáadása, amely úgy működik mint egy rögzített indító, hogy támogassa az Android 7.1-nél régebbi verziót futtató eszközöket. (pull #142 (https://github.com/brarcher/loyalty-card-locker/pull/142))

View File

@@ -0,0 +1,3 @@
- Olasz fordítás
- Az összes 1D vonalkódtípus támogatása (Eredetileg csak a termékek 1D-s vonalkódja volt támogatott)
- A szükséges kamera engedély hozzáadása, amely eredetileg hiányzott.

View File

@@ -1,22 +1,22 @@
Ne kotorásszon többé hűségkártyáiért a pénztárnál vagy a webshop fizetésnél. Ne kotorásszon többé hűségkártyáiért a pénztárnál vagy egy webshopnál történő fizetésnél.
<b>Szkennelje be a vonalkódokat a telefonja kamerájával, és felejtse el a kártyákat.</b> <b>Szkennelje be a vonalkódokat a telefonja kamerájával, és felejtse el a kártyákat.</b>
Felejtse el teljesen a pénztárcáját, vagy csak a legfontosabb értékeket tartsa benne innentől. Felejtse el teljesen a pénztárcáját, vagy innentől csak a legfontosabb értékeket tartsa benne.
Ezzel a mindennapi kellékkel felszabadul a pénztárcájában a plasztik kártyák helye. Ezzel a mindennapi kellékkel felszabadul a pénztárcájában a plasztikkártyák helye.
- A minimális engedélyeknek köszönhetően csökkentheti a kémkedés esélyét. Nem igényel internetet, és nincsenek reklámok. - A minimális engedélyeknek köszönhetően csökkentheti a kémkedés esélyét. Nem igényel internetet, és nincsenek reklámok.
- Adjon hozzá kártyákat, vagy sima kódokat, majd szabja személyre színezéssel. - Adjon hozzá kártyákat, vagy sima kódokat, majd szabja személyre színezéssel.
- Manuálisan is hozzáadhat kódot ha nincs a kártyán vonalkód, vagy nem olvasható be valamiért. - Kézileg is hozzáadhat kódot, ha nincs a kártyán vonalkód, vagy valamiért nem olvasható be.
- Importáljon kártyákat appokból: Catima, FidMe, Loyalty Card Keychain, Stocard és Voucher Vault. - Importáljon kártyákat más appokból: Catima, FidMe, Loyalty Card Keychain, Stocard és Voucher Vault.
- Készítsen biztonsági mentést kártyáiról, vagy hordozza át másik eszközre. - Készítsen biztonsági mentést kártyáiról, vagy hordozza át másik eszközre.
- Osszon meg kuponokat, exkluzív ajánlatokat, promóciós kódokat, vagy kártyákat és kódokat bármely appal. - Osszon meg kuponokat, exkluzív ajánlatokat, promóciós kódokat, vagy kártyákat és kódokat bármely appal.
- Sötét téma és kisegítő lehetőségek gyengén látó felhasználóinknak. - Sötét téma és akadálymentesítés a gyengén látó felhasználóinknak.
- Mindenki számára elérhető a gáttalan szoftver közösség jóvoltából. - Mindenki számára elérhető a szabad szoftveres közösség jóvoltából.
- Több mint 20 kézzel fordított nyelven elérhető. - Több mint 20 nyelven honosított.
- Grátisz, a közösség tagjai járulnak hozzá a fejlesztéshez. - Ingyenes, a közösség tagjai járulnak hozzá a fejlesztéshez.
- Használja, tanulmányozza, változtassa és ossza meg; <i>mindenkivel</i>. - Használja, tanulmányozza, változtassa és ossza meg; <i>mindenkivel</i>.
- Nem csak Ingyenes Szoftver / Nyílt Forráskódú. <i>Copyleft-elt</i> gáttalan szoftver (GPLv3+) kártya menedzser. - Nem csak szabad és nyílt forráskódú. <i>Copyleft</i> licencű, szabad (GPLv3+) kártyakezelő szoftver.
Egyszerűsítse le az életét és a vásárlást, ne hagyjon el több hűségkártyát vagy repjegyet. Egyszerűsítse le az életét és a vásárlást, ne hagyjon el több blokkot, hűségkártyát vagy repjegyet.
Vigye magával a hűségpontjait és bónuszait, és mentse el az útra. Vigye magával a hűségpontjait és bónuszait, és mentse el azokat útközben.

View File

@@ -1 +1 @@
A vonalkódokhoz, tagkártyákhoz, hűség programokhoz, kuponokhoz és jegyekhez. A vonalkódokhoz, tagkártyákhoz, hűségprogramokhoz, kuponokhoz és jegyekhez.

View File

@@ -1 +1 @@
Catima Hűségkártya Pénztárca Catima Hűségkártyatárca

View File

@@ -0,0 +1,4 @@
- Buka gambar di galeri dengan menekan lama
- Terapkan gaya Material ke dialog
- Mendukung pembuatan kartu dengan membagikan gambar ke Catima
- Tambahkan tombol belanja cepat ke layar kartu

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