Compare commits

...

212 Commits

Author SHA1 Message Date
Sylvia van Os
ee30180137 Release 1.5.0 2020-12-03 20:02:20 +01:00
Sylvia van Os
6bddeb2f75 Update screenshots 2020-12-03 19:42:21 +01:00
Sylvia van Os
3c69990b0d Make findBugs happy and improve bottom sheet logic 2020-12-03 19:33:20 +01:00
Sylvia van Os
43d5478ae3 Increase arrow size 2020-12-03 18:53:01 +01:00
Sylvia van Os
30a54ae22a Note size is no longer configurable 2020-12-03 18:18:32 +01:00
Sylvia van Os
9ff6b87092 More i18n fixes 2020-12-03 18:04:49 +01:00
Sylvia van Os
9763d9fb73 Merge pull request #124 from weblate/weblate-catima-catima
Translations update from Weblate
2020-12-03 18:00:59 +01:00
Heimen Stoffels
0b92686dad Translated using Weblate (Dutch)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-12-03 17:58:34 +01:00
Sylvia van Os
cb1c834057 Fix strings 2020-12-03 17:57:53 +01:00
Sylvia van Os
98a0487d0c Merge pull request #123 from weblate/weblate-catima-catima
Translations update from Weblate
2020-12-03 17:55:08 +01:00
J. Lavoie
2df165061d Translated using Weblate (French)
Currently translated at 100.0% (3 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2020-12-03 17:53:52 +01:00
Heimen Stoffels
fdd7ca03cf Translated using Weblate (Dutch)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-12-03 17:53:52 +01:00
J. Lavoie
29e996a5fe Translated using Weblate (German)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2020-12-03 17:53:52 +01:00
Sylvia van Os
3c1c8baaa0 Make bottom sheet button tapable and add group info 2020-12-03 17:53:23 +01:00
Sylvia van Os
6c186c2abb Merge pull request #122 from weblate/weblate-catima-catima
Translations update from Weblate
2020-12-03 17:33:23 +01:00
J. Lavoie
9deb0b94af Translated using Weblate (French)
Currently translated at 97.4% (115 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-12-03 17:32:16 +01:00
Samantaz Fox
97d54e87f2 Translated using Weblate (French)
Currently translated at 97.4% (115 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-12-03 17:32:16 +01:00
Sylvia van Os
0e329b3c31 Merge pull request #121 from weblate/weblate-catima-catima
Translations update from Weblate
2020-12-03 17:31:59 +01:00
Samantaz Fox
bd337d6da8 Translated using Weblate (French)
Currently translated at 98.3% (116 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-12-03 17:24:53 +01:00
Sylvia van Os
dc7f199e0c Fix crash 2020-12-02 21:27:58 +01:00
Sylvia van Os
b54e14def2 Create bottom sheet in loyalty card view to prevent FAB rendering over note 2020-12-02 21:17:00 +01:00
Sylvia van Os
f724e4c164 Always user white text on red buttons 2020-12-02 19:43:54 +01:00
Sylvia van Os
c389a02d69 Fix tests 2020-12-02 18:36:23 +01:00
Sylvia van Os
b7db58e7d0 Make Fastlane happy 2020-12-01 22:59:06 +01:00
Sylvia van Os
eefd26fa06 Downgrade dependencies again
It just doesn't build otherwise
2020-12-01 22:54:07 +01:00
Sylvia van Os
8d4a122cb5 Fix many lint checks 2020-12-01 21:33:36 +01:00
Sylvia van Os
13ea10d0b0 Lint fixes 2020-12-01 19:54:28 +01:00
Sylvia van Os
4366eab380 Actually show toast 2020-12-01 19:47:43 +01:00
Sylvia van Os
0c61d36cb3 Increase to minSdk 19
We were already kinda not compatible with pre-19 anymore
2020-12-01 19:46:52 +01:00
Sylvia van Os
6bc5e77bbd Release 1.4.1 2020-12-01 19:35:06 +01:00
Sylvia van Os
d8ddee0667 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-12-01 19:01:24 +01:00
Sylvia van Os
5e8312e816 Merge pull request #119 from weblate/weblate-catima-catima
Translations update from Weblate
2020-12-01 18:59:06 +01:00
Heimen Stoffels
8e10022158 Translated using Weblate (Dutch)
Currently translated at 100.0% (3 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2020-12-01 18:58:00 +01:00
Sylvia van Os
b209b670a5 Small UI cleanups 2020-12-01 18:49:59 +01:00
Sylvia van Os
ecdec0f773 Merge pull request #118 from weblate/weblate-catima-catima
Translations update from Weblate
2020-12-01 12:03:13 +01:00
Heimen Stoffels
5c90107a7b Translated using Weblate (Dutch)
Currently translated at 66.6% (2 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2020-12-01 12:01:32 +01:00
Samantaz Fox
6a8a9878d7 Translated using Weblate (French)
Currently translated at 66.6% (2 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2020-12-01 12:01:32 +01:00
Artem
3400d10cc6 Translated using Weblate (Russian)
Currently translated at 84.6% (105 of 124 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2020-12-01 12:01:32 +01:00
Sylvia van Os
05e171170b Translated using Weblate (Russian)
Currently translated at 84.6% (105 of 124 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2020-12-01 12:01:32 +01:00
Sylvia van Os
cb967a8d8d Translated using Weblate (Dutch)
Currently translated at 100.0% (124 of 124 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-12-01 12:01:32 +01:00
Sylvia van Os
5835da2931 Translated using Weblate (French)
Currently translated at 100.0% (124 of 124 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-12-01 12:01:32 +01:00
Sylvia van Os
2e9339b8aa Fix unnecessary file 2020-12-01 12:00:52 +01:00
Sylvia van Os
bbba4b2e11 Correctly use plural string 2020-11-30 21:44:38 +01:00
Sylvia van Os
d9659ecc9d Merge remote-tracking branch 'weblate/master' into master 2020-11-30 21:23:04 +01:00
Heimen Stoffels
c558278962 Translated using Weblate (Dutch)
Currently translated at 100.0% (124 of 124 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-11-30 21:19:44 +01:00
Sylvia van Os
c137cb9428 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-30 21:19:07 +01:00
Sylvia van Os
1d2f54c69b Translation fixes 2020-11-30 19:53:32 +01:00
Sylvia van Os
d4a377fe18 Merge pull request #116 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-29 00:30:43 +01:00
Allan Nordhøy
9844113568 Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.9% (119 of 124 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-29 00:29:00 +01:00
Sylvia van Os
c49f26db95 Release 1.4.0 2020-11-28 16:46:01 +01:00
Sylvia van Os
9744dfe6ff Make lint happy 2020-11-28 15:45:09 +01:00
Sylvia van Os
55dfd1fe09 Fix build 2020-11-28 15:24:07 +01:00
Sylvia van Os
0a3c81154c Fix colouring of manage group buttons 2020-11-28 14:44:09 +01:00
Sylvia van Os
70a9689bb2 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-28 13:52:01 +01:00
Sylvia van Os
54f6d8d26f Fix scan/manual icon colour on light theme 2020-11-28 13:51:13 +01:00
Sylvia van Os
c0622ddaec Merge pull request #115 from TheLastProject/create-pull-request/patch-1606514188
Compressed Images
2020-11-27 22:57:16 +01:00
TheLastProject
12578eab3e Compressed Images 2020-11-27 21:56:28 +00:00
Sylvia van Os
5dd57577af Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-27 22:55:20 +01:00
Sylvia van Os
d883c84b4e Fix migration guide 2020-11-27 22:54:40 +01:00
Sylvia van Os
0ebe1b387d Merge pull request #114 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-27 22:35:21 +01:00
Allan Nordhøy
942aff2af5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.9% (117 of 122 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-27 22:34:03 +01:00
Sylvia van Os
c1606fef62 Manual group ordering 2020-11-27 22:33:59 +01:00
Sylvia van Os
cc895353a9 Update CHANGELOG 2020-11-27 14:47:27 +01:00
Sylvia van Os
73bac0ae8d Make findBugs happy 2020-11-27 13:19:35 +01:00
Sylvia van Os
158e424a47 Add dialog giving the user scan/manually enter options (#111) 2020-11-27 12:58:55 +01:00
Sylvia van Os
133fa13d3b Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-27 09:42:49 +01:00
Sylvia van Os
44ff4d0cc6 Fix gitignore 2020-11-27 09:42:23 +01:00
Sylvia van Os
a7b280c08b Merge pull request #112 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-27 02:38:25 +01:00
J. Lavoie
5fe0429c98 Translated using Weblate (French)
Currently translated at 100.0% (120 of 120 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-27 02:28:59 +01:00
J. Lavoie
bf391022fd Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2020-11-27 02:28:59 +01:00
Sylvia van Os
a431bf8c30 Merge pull request #109 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-23 02:37:45 +01:00
Sylvia van Os
a242944ee6 Deleted translation using Weblate (French (Belgium)) 2020-11-23 02:17:54 +01:00
Samantaz Fox
84a7e84486 Translated using Weblate (French)
Currently translated at 100.0% (120 of 120 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-23 02:17:54 +01:00
Samantaz Fox
d4988f1d4c Added translation using Weblate (French (Belgium)) 2020-11-23 02:17:54 +01:00
Sylvia van Os
04e52f0a8a Move About dialog into own activity 2020-11-23 02:17:18 +01:00
Sylvia van Os
370db97af1 Release 1.3.0 2020-11-22 19:43:53 +01:00
Sylvia van Os
84d7f4fbba Fix unit tests 2020-11-22 18:26:05 +01:00
Sylvia van Os
afcbca251c Merge pull request #108 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-22 17:22:59 +01:00
Samantaz Fox
aa9df04c9c Translated using Weblate (French)
Currently translated at 99.1% (119 of 120 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-22 17:19:32 +01:00
Allan Nordhøy
a24452a962 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.1% (119 of 120 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-22 17:19:32 +01:00
Samantaz Fox
e74176abb0 Translated using Weblate (French)
Currently translated at 99.1% (119 of 120 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-22 17:19:32 +01:00
Sylvia van Os
6f4cec4cf4 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-22 17:15:41 +01:00
Sylvia van Os
febd0cf463 Really fix change detection 2020-11-22 17:13:02 +01:00
Sylvia van Os
a5f91486e9 Merge pull request #107 from SamantazFox/patch-1
Propose more explicit settings names
2020-11-22 17:12:44 +01:00
Samantaz Fox
d8300640af Propose more explicit settings names 2020-11-22 16:46:15 +01:00
Sylvia van Os
afef158169 Merge pull request #106 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-21 23:14:40 +01:00
Samantaz Fox
a728d1d84d Translated using Weblate (French)
Currently translated at 79.6% (94 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-21 23:12:42 +01:00
Sylvia van Os
9f88b6348b Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-21 23:10:56 +01:00
Sylvia van Os
6929ba1c0d Ask for confirmation before leaving edit view after changes 2020-11-21 23:08:19 +01:00
Sylvia van Os
49b296b983 Merge pull request #105 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-21 16:31:27 +01:00
Allan Nordhøy
f21a75b19a Translated using Weblate (Dutch)
Currently translated at 73.7% (87 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-11-21 16:28:58 +01:00
Allan Nordhøy
8946b0a9e1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.1% (117 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-21 16:28:57 +01:00
Allan Nordhøy
eae470f13c Translated using Weblate (Italian)
Currently translated at 73.7% (87 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2020-11-21 16:28:57 +01:00
Allan Nordhøy
5ce046b3f4 Translated using Weblate (French)
Currently translated at 74.5% (88 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-21 16:28:57 +01:00
Allan Nordhøy
a51debb2e1 Translated using Weblate (Spanish)
Currently translated at 62.7% (74 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2020-11-21 16:28:57 +01:00
Allan Nordhøy
7312a4bd1a Translated using Weblate (German)
Currently translated at 73.7% (87 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2020-11-21 16:28:57 +01:00
Sylvia van Os
3c1a54e456 Remove no longer relevant unit tests 2020-11-20 15:09:16 +01:00
Sylvia van Os
6d4babf944 Always show all import/export options 2020-11-20 14:56:11 +01:00
Sylvia van Os
7ecdf52f1a Fix typo 2020-11-20 00:29:49 +01:00
Sylvia van Os
c6f28272d9 Release 1.2.2 2020-11-19 21:16:36 +01:00
Sylvia van Os
ba8c20f415 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-19 16:48:55 +01:00
Sylvia van Os
b41dcc7ba1 Add IzzyOnDroid button 2020-11-19 16:45:33 +01:00
Sylvia van Os
6a14b5706b Merge pull request #102 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-17 18:36:27 +01:00
opsik
5bde6796b9 Translated using Weblate (Russian)
Currently translated at 66.6% (2 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2020-11-17 18:32:39 +01:00
Sylvia van Os
3c797b5ec9 Remember active group tab 2020-11-17 18:30:47 +01:00
Sylvia van Os
dec85d8fa9 Release 1.2.1 2020-11-17 14:19:21 +01:00
Sylvia van Os
979d88d2e6 Release 1.2.0 2020-11-17 13:52:57 +01:00
Sylvia van Os
67b961c672 Fix crash on rendering card with no header colour 2020-11-17 13:51:44 +01:00
Sylvia van Os
ed62ad321b Add support for swiping between groups in main view 2020-11-17 00:00:09 +01:00
Sylvia van Os
251bdcd500 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-16 20:01:35 +01:00
Sylvia van Os
16f9b8f3a5 Update deprecated requirements 2020-11-16 19:59:09 +01:00
Sylvia van Os
6be52f9b31 Merge pull request #98 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-16 17:31:37 +01:00
Airat
d8b901c3a0 Translated using Weblate (Russian)
Currently translated at 89.6% (104 of 116 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2020-11-16 17:28:49 +01:00
Franciszek Stefan
ed52d2d666 Translated using Weblate (Polish)
Currently translated at 100.0% (116 of 116 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2020-11-16 17:28:48 +01:00
Sylvia van Os
ff6b62c3f0 Merge pull request #97 from x-jokay/feature/update-name
Update csv filename
2020-11-13 20:21:22 +01:00
D. Domig
da8b15a985 Update csv filename 2020-11-13 20:20:05 +01:00
Sylvia van Os
eccf994379 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into master 2020-11-13 19:08:33 +01:00
Sylvia van Os
66622817cc Make more findable 2020-11-13 19:08:11 +01:00
Sylvia van Os
3fcfe8afe1 Merge pull request #96 from x-jokay/feature/fix-markdown-issues
Fix some markdownlint issues
2020-11-13 16:00:56 +01:00
D. Domig
2c5dae37fd Fix some markdownlint issues 2020-11-13 15:54:53 +01:00
Sylvia van Os
295e63981d Merge pull request #95 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-12 07:06:51 +01:00
Allan Nordhøy
9ac0ee53b5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.2% (114 of 116 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-12 00:28:38 +01:00
Sylvia van Os
7e1dbf905a Release 1.1.0 2020-11-11 18:35:01 +01:00
Sylvia van Os
63de6f50ed Merge pull request #92 from TheLastProject/feature/iconFriendlyEditUI
Icon-friendly edit UI
2020-11-10 22:50:03 +01:00
Sylvia van Os
6b24f56c79 Fix unit tests 2020-11-10 22:25:16 +01:00
Sylvia van Os
e601d1a659 Editable card ID and barcode type 2020-11-10 22:05:53 +01:00
Sylvia van Os
1641631bdc Get rid of headingStoreTextColorValue 2020-11-10 19:11:57 +01:00
Sylvia van Os
91c2efbdfc Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into feature/iconFriendlyEditUI 2020-11-10 18:28:56 +01:00
Sylvia van Os
462f77e26f Merge pull request #94 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-10 18:28:17 +01:00
Sylvia van Os
0aa1f8b7dd Translated using Weblate (Dutch)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-11-10 18:27:07 +01:00
Allan Nordhøy
0f9509c0e5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.2% (113 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-10 18:27:07 +01:00
Sylvia van Os
95d497c7bd Fix build 2020-11-10 18:26:54 +01:00
Sylvia van Os
d760fbd3cb Merge pull request #93 from comradekingu/patch-3
Strings reworked
2020-11-10 18:00:07 +01:00
Sylvia van Os
ad82492f63 Update app/src/main/res/values/strings.xml
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2020-11-10 17:59:46 +01:00
Allan Nordhøy
e84a23c58e Spelling: Try changing your search 2020-11-10 12:14:17 +00:00
Allan Nordhøy
67cbb34425 Spelling: Didn't find anything 2020-11-10 12:09:16 +00:00
Allan Nordhøy
0c4fed5c50 Spelling: Grouped 2020-11-10 12:03:28 +00:00
Allan Nordhøy
e1a72a948d Requested changes made 2020-11-10 12:01:58 +00:00
Allan Nordhøy
50d9205aef Spelling: Font size for card titles 2020-11-10 09:18:25 +00:00
Allan Nordhøy
9093c88e23 Strings reworked 2020-11-10 09:17:16 +00:00
Sylvia van Os
3c793fe54f Fix logic and unit tests 2020-11-09 22:31:35 +01:00
Sylvia van Os
a8960eb506 Initial edit UI changes 2020-11-09 21:34:29 +01:00
Sylvia van Os
7913e95abf Merge pull request #91 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-09 18:12:21 +01:00
Sylvia van Os
fac7b76798 Translated using Weblate (Dutch)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-11-09 18:10:03 +01:00
mondstern
aa9c4b81b4 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.1% (114 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-09 18:10:03 +01:00
J. Lavoie
5b3fc845f9 Translated using Weblate (Italian)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2020-11-09 18:10:03 +01:00
J. Lavoie
c8c7498dc9 Translated using Weblate (French)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-09 18:10:03 +01:00
J. Lavoie
712763969c Translated using Weblate (German)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2020-11-09 18:10:03 +01:00
Vancha March
d3f1e0d80b Translated using Weblate (Dutch)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-11-09 18:10:03 +01:00
mondstern
e8ab92d8c1 Translated using Weblate (Dutch)
Currently translated at 100.0% (115 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2020-11-09 18:10:03 +01:00
Sylvia van Os
e0e4ba0012 Fix build 2020-11-08 20:09:26 +01:00
Sylvia van Os
cb4cede2da Rename nb_NO for consistency 2020-11-08 19:23:44 +01:00
Sylvia van Os
7bfdb3a8c3 Merge pull request #87 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-08 05:46:41 +01:00
Allan Nordhøy
c4210da1a5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (3 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nb_NO/
2020-11-08 01:26:54 +01:00
Allan Nordhøy
e082f45333 Translated using Weblate (Norwegian Bokmål)
Currently translated at 93.9% (108 of 115 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-08 01:26:54 +01:00
Sylvia van Os
d10c8668b6 Fix crash detected by Google Play Console pre-launch report 2020-11-07 11:34:35 +01:00
Sylvia van Os
a766a25f6a Fix unit test 2020-11-06 21:13:57 +01:00
Sylvia van Os
daa2f4137c Forgot to update CHANGELOG 2020-11-06 20:28:52 +01:00
Sylvia van Os
e61d29417c Release Catima 1.0 2020-11-06 20:25:46 +01:00
Sylvia van Os
cc1be04cf7 Update CHANGELOG 2020-11-06 20:19:12 +01:00
Sylvia van Os
e0ed5bd11c Update screenshots 2020-11-06 20:18:28 +01:00
Sylvia van Os
1bda5410d8 Fix max db version 2020-11-06 20:17:57 +01:00
Sylvia van Os
4bbeb27714 Feature/groups (#71)
* Basic group management

* Assign cards to groups

* Fix lint

* Fix findbugs 'dodgy code'

* Group name as unique key

* More group tests

* Import/export groups

* Implement group renaming and deleting

* Fix findBugs

* Fix chip marking in edit activity

* Group import/export tests

* Fix some state bugs

* Some last fixes

* Remove redundant if statement

* Fix findBugs

* Deduplicate code

* Cleanup

* Fix groups not showing up with new card

* Fix capture and enter button touching

* Fix dialog button look
2020-11-06 18:12:06 +01:00
Sylvia van Os
c04f2c6785 Use longer en-US title 2020-11-06 18:09:52 +01:00
Sylvia van Os
70fa8ff11c Merge pull request #84 from TangentFoxy/patch-1
Fix typo in Import/Export Activity
2020-11-06 09:00:50 +01:00
Rose Liverman
1637895866 Fix typo in Import/Export Activity 2020-11-05 22:22:24 -07:00
Sylvia van Os
6e0d48e42d Update CHANGELOG 2020-11-05 21:38:34 +01:00
Sylvia van Os
9e71a0d86c Fix fastlane 2020-11-05 20:29:37 +01:00
Sylvia van Os
20365e31be Merge pull request #81 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-03 19:28:17 +01:00
J. Lavoie
fb29adbb22 Translated using Weblate (French)
Currently translated at 100.0% (3 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2020-11-03 19:26:48 +01:00
J. Lavoie
c4f0ab37a9 Translated using Weblate (Italian)
Currently translated at 99.0% (108 of 109 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2020-11-03 19:26:48 +01:00
J. Lavoie
038def0114 Translated using Weblate (French)
Currently translated at 99.0% (108 of 109 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-03 19:26:48 +01:00
Sylvia van Os
1f962d88c0 Merge pull request #80 from arshbeerSingh/master
Fix Issue #56
2020-11-03 18:12:00 +01:00
Arshbeer Singh
d897f3b137 Fix Issue #56 2020-11-03 03:31:04 -08:00
Sylvia van Os
dba3692521 Merge pull request #79 from IzzySoft/fastlane
Fastlane: add German summary/description
2020-11-02 22:37:26 +01:00
Izzy
7ab6ec5f75 Fastlane: add German summary/description 2020-11-02 21:52:00 +01:00
Sylvia van Os
0d6e002324 Fix README 2020-11-02 18:58:05 +01:00
Sylvia van Os
9b2748cf61 Migrate to Fastlane 2020-11-02 18:00:43 +01:00
Sylvia van Os
e505bce0ba Merge pull request #78 from weblate/weblate-catima-catima
Translations update from Weblate
2020-11-02 11:07:23 +01:00
Allan Nordhøy
e25d8910c5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.3% (105 of 109 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-11-01 14:26:48 +01:00
Artem
3e79001e84 Translated using Weblate (Russian)
Currently translated at 98.1% (104 of 106 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2020-11-01 14:26:48 +01:00
J. Lavoie
4b432ea94c Translated using Weblate (Italian)
Currently translated at 100.0% (106 of 106 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2020-11-01 14:26:48 +01:00
J. Lavoie
78752e1cf2 Translated using Weblate (French)
Currently translated at 100.0% (106 of 106 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-11-01 14:26:48 +01:00
J. Lavoie
129608befd Translated using Weblate (German)
Currently translated at 100.0% (106 of 106 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2020-11-01 14:26:48 +01:00
Sylvia van Os
0c2bf8b8a5 Add weblate link and button 2020-10-30 23:03:24 +01:00
Sylvia van Os
6bc08a21e8 Merge pull request #76 from TheLastProject/create-pull-request/patch-1603996252
Compressed Images
2020-10-29 21:40:23 +01:00
Sylvia van Os
fa5d094197 Add logo to migration guide 2020-10-29 20:04:56 +01:00
Sylvia van Os
c988276ced Release v0.29 2020-10-29 19:31:42 +01:00
TheLastProject
7d5f79b7e1 Compressed Images 2020-10-29 18:30:52 +00:00
Sylvia van Os
67ca1ad505 Fix README 2020-10-29 19:30:37 +01:00
Sylvia van Os
210a0c564a Add logo 2020-10-29 19:29:39 +01:00
Sylvia van Os
0a3df441d3 Merge pull request #75 from arshbeerSingh/master
Fix Issue #72
2020-10-28 18:49:07 +01:00
Arshbeer Singh
3a97d6b191 Fix Issue #72 2020-10-27 13:51:20 -07:00
Sylvia van Os
7f5ba2c133 Merge pull request #73 from TheLastProject/create-pull-request/patch-1603737257
Compressed Images
2020-10-26 19:58:26 +01:00
Sylvia van Os
ccb4c3c5a2 Revert "Optimize current images"
This reverts commit a160583b30.
2020-10-26 19:57:57 +01:00
TheLastProject
e8b436a696 Compressed Images 2020-10-26 18:34:16 +00:00
Sylvia van Os
a160583b30 Optimize current images 2020-10-26 19:33:12 +01:00
Sylvia van Os
6c24b64837 Update CHANGELOG 2020-10-26 19:28:19 +01:00
Sylvia van Os
04b824257b Add https://github.com/calibreapp/image-actions 2020-10-26 19:26:28 +01:00
Sylvia van Os
70251d7ea8 Fix app bypassing Android orientation confirmation 2020-10-26 18:48:57 +01:00
Sylvia van Os
fa4ab0ba59 Fix lint 2020-10-25 23:01:39 +01:00
Sylvia van Os
8880e35a7a Fix some merge issues 2020-10-25 18:14:35 +01:00
t351206
c9f3054682 New feature: Favorite cards (#70) 2020-10-25 18:01:26 +01:00
Sylvia van Os
537141fd70 Fix build 2020-10-25 18:00:18 +01:00
Sylvia van Os
f027b1f1b8 Merge remote-tracking branch 'weblate/master' 2020-10-25 17:55:54 +01:00
Allan Nordhøy
44d7c8520d Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.6% (114 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2020-10-25 17:26:45 +01:00
J. Lavoie
9d9f73fbba Translated using Weblate (Italian)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2020-10-25 17:26:44 +01:00
J. Lavoie
5c74517e13 Translated using Weblate (French)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2020-10-25 17:26:44 +01:00
J. Lavoie
ded2f003f6 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2020-10-25 17:26:44 +01:00
Adolfo Jayme Barrientos
fd89caee64 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2020-10-25 17:26:44 +01:00
J. Lavoie
3fd7991663 Translated using Weblate (German)
Currently translated at 100.0% (118 of 118 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2020-10-25 17:26:43 +01:00
Sylvia van Os
565449d17c Update CHANGELOG 2020-10-24 22:34:29 +02:00
175 changed files with 4694 additions and 1618 deletions

View File

@@ -0,0 +1,31 @@
name: Compress Images on Push to Master
on:
push:
branches:
- master
paths:
- '**.jpg'
- '**.jpeg'
- '**.png'
- '**.webp'
jobs:
build:
name: calibreapp/image-actions
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Compress Images
id: calibre
uses: calibreapp/image-actions@master
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
compressOnly: true
- name: Create New Pull Request If Needed
if: steps.calibre.outputs.markdown != ''
uses: peter-evans/create-pull-request@master
with:
title: Compressed Images
branch-suffix: timestamp
commit-message: Compressed Images
body: ${{ steps.calibre.outputs.markdown }}

2
.gitignore vendored
View File

@@ -6,3 +6,5 @@
.DS_Store
/build
/captures
/app/release
/app/debug

View File

@@ -1,10 +0,0 @@
[main]
host = https://www.transifex.com
[loyalty-card-locker.stringsxml]
file_filter = app/src/main/res/values-<lang>/strings.xml
minimum_perc = 0
source_file = app/src/main/res/values/strings.xml
source_lang = en
type = ANDROID

View File

@@ -1,6 +1,89 @@
# Changelog
## v1.5.0 (2020-12-03)
Changes:
- Improve contrast by always using white text on red buttons
- Draggable bottom sheet in loyalty card view
## v1.4.1 (2020-12-01)
Changes:
- Improved translations
- Small UI fixes
## v1.4.0 (2020-11-28)
Changes:
- Move About screen into its own activity
- Ask user if they want to use their camera or manually enter ID on add/edit card
- Make group ordering manual instead of forced alphabetically
## v1.3.0 (2020-11-22)
Changes:
- Always show all import/export options and show a toast on actual issues (improves compat with XPrivacyLua)
- Ask for confirmation when leaving edit view after making changes without saving
## v1.2.2 (2020-11-19)
Changes:
- Remember active group tab between screens and sessions
## v1.2.1 (2020-11-17)
Changes:
- Fix home screen swiping triggering during vertical swipes too
## v1.2.0 (2020-11-17)
Changes:
- Add swiping between groups on the home screen
- Fix crash with cards lacking header colour
## v1.1.0 (2020-11-11)
Changes:
- Improved edit UI
- Removed header text colour option (now automatically generated based on brightness)
- Updated translations
## v1.0.1 (2020-11-07)
Changes:
- Fix crash in search with no groups
## v1.0 (2020-11-06)
Changes:
- Added rounded edges to card icons on main overview
- Added support for grouping entries
## v0.29 (2020-10-29)
Changes:
- Rebrand to Catima
- Removed intro
- Add floating action buttons
- Fix Android 5 crash when opening About screen
- Add favourites support
- Fix disabled auto-rotate being ignored
## v0.28 (2020-03-09)
Changes:
- Fix barcode centering when exiting full screen ([#351](https://github.com/brarcher/loyalty-card-locker/pull/351))
- Allow backup export location to be selected ([#352](https://github.com/brarcher/loyalty-card-locker/pull/352))
- Update translations ([#357](https://github.com/brarcher/loyalty-card-locker/pull/357)) & ([#362](https://github.com/brarcher/loyalty-card-locker/pull/362))
@@ -8,6 +91,7 @@ Changes:
## v0.27 (2020-01-26)
Changes:
- Tapping on a barcode now moves it to the top of the screen ([#348](https://github.com/brarcher/loyalty-card-locker/pull/348))
- Add white space around barcodes to improve scanning in dark mode ([#328](https://github.com/brarcher/loyalty-card-locker/issues/328))
- Fix swapped import buttons. ([#346](https://github.com/brarcher/loyalty-card-locker/pull/346))
@@ -15,11 +99,13 @@ Changes:
## v0.26.1 (2020-01-09)
Changes:
- Fix issue with sharing cards without background color ([#343](https://github.com/brarcher/loyalty-card-locker/pull/343))
## v0.26 (2020-01-05)
Changes:
- Add ability to search for a card ([#320](https://github.com/brarcher/loyalty-card-locker/pull/320))
- Add ability to share and receive loyalty cards ([#321](https://github.com/brarcher/loyalty-card-locker/pull/321))
- Dark mode support ([#322](https://github.com/brarcher/loyalty-card-locker/pull/322))
@@ -29,178 +115,203 @@ Changes:
- Improve notification and app icon visibility ([#330](https://github.com/brarcher/loyalty-card-locker/pull/330))
- Update target SDK to Android 10
- Improve the following translations:
* German
* Italian
* Dutch
* Polish
* Russian
- German
- Italian
- Dutch
- Polish
- Russian
## v0.25.4 (2019-10-04)
Changes
Changes:
- Enable app backups
- Update French and Slovenian translations
## v0.25.3 (2019-03-02)
Changes
Changes:
- Update Russian translations
## v0.25.2 (2019-01-05)
Changes
Changes:
- Update and add translations
## v0.25.1 (2018-10-14)
Changes:
- Fix creating new card by manually entering barcode (https://github.com/brarcher/loyalty-card-locker/issues/272)
- Fix creating new card by manually entering barcode ([issue #272](https://github.com/brarcher/loyalty-card-locker/issues/272))
## v0.25 (2018-10-07)
Changes:
- Sort card list case insensitive (https://github.com/brarcher/loyalty-card-locker/pull/266)
- Add setting to lock orientation for all cards (https://github.com/brarcher/loyalty-card-locker/pull/269)
- Sort card list case insensitive ([pull #266](https://github.com/brarcher/loyalty-card-locker/pull/266))
- Add setting to lock orientation for all cards ([pull #269](https://github.com/brarcher/loyalty-card-locker/pull/269)
## v0.24 (2018-07-31)
Changes:
- Add a setting to control screen brightness when displaying a barcode (https://github.com/brarcher/loyalty-card-locker/pull/259)
- Add Greek translations (https://github.com/brarcher/loyalty-card-locker/pull/252)
- Add Slovenian translations (https://github.com/brarcher/loyalty-card-locker/pull/260)
- Update translations (https://github.com/brarcher/loyalty-card-locker/pull/260, https://github.com/brarcher/loyalty-card-locker/pull/254)
- Add a setting to control screen brightness when displaying a barcode ([pull #259](https://github.com/brarcher/loyalty-card-locker/pull/259))
- Add Greek translations ([pull #252](https://github.com/brarcher/loyalty-card-locker/pull/252))
- Add Slovenian translations ([pull #260](https://github.com/brarcher/loyalty-card-locker/pull/260))
- Update translations ([pull #260](https://github.com/brarcher/loyalty-card-locker/pull/260), [pull #254](https://github.com/brarcher/loyalty-card-locker/pull/254))
## v0.23.4 (2018-05-12)
Changes:
- Fix Spanish translations (https://github.com/brarcher/loyalty-card-locker/pull/244)
- Update translations (https://github.com/brarcher/loyalty-card-locker/pull/244)
Changes:
- Fix Spanish translations ([pull #244](https://github.com/brarcher/loyalty-card-locker/pull/244))
- Update translations ([pull #244](https://github.com/brarcher/loyalty-card-locker/pull/244))
## v0.23.3 (2018-05-05)
Changes:
- Added translations
* Polish (https://github.com/brarcher/loyalty-card-locker/pull/232)
* Spanish (https://github.com/brarcher/loyalty-card-locker/pull/232)
* Slovak (https://github.com/brarcher/loyalty-card-locker/pull/232)
- Updated translations (https://github.com/brarcher/loyalty-card-locker/pull/239)
- Polish ([pull #232](https://github.com/brarcher/loyalty-card-locker/pull/232))
- Spanish ([pull #232](https://github.com/brarcher/loyalty-card-locker/pull/232))
- Slovak ([pull #232](https://github.com/brarcher/loyalty-card-locker/pull/232))
- Updated translations ([pull #239](https://github.com/brarcher/loyalty-card-locker/pull/239))
## v0.23.2 (2018-03-11)
Changes:
- Reduce min SDK from 17 to 15. (https://github.com/brarcher/loyalty-card-locker/pull/226)
- Remove usage of legacy apache library, used only in unit tests but no longer needed. (https://github.com/brarcher/loyalty-card-locker/pull/225)
- Reduce min SDK from 17 to 15. ([pull #226](https://github.com/brarcher/loyalty-card-locker/pull/226))
- Remove usage of legacy apache library, used only in unit tests but no longer needed. ([pull #225](https://github.com/brarcher/loyalty-card-locker/pull/225))
## v0.23.1 (2018-03-07)
Changes:
- Prevent crash when rendering a barcode exhausts the application's memory. (https://github.com/brarcher/loyalty-card-locker/pull/219)
- Prevent crash when rendering a barcode exhausts the application's memory. ([pull #219](https://github.com/brarcher/loyalty-card-locker/pull/219))
## v0.23 (2018-02-28)
Changes:
- Reduce space in header when viewing a card. (https://github.com/brarcher/loyalty-card-locker/pull/213)
- Disable beep when scanning a barcode. (https://github.com/brarcher/loyalty-card-locker/pull/216)
- Reduce space in header when viewing a card. ([pull #213](https://github.com/brarcher/loyalty-card-locker/pull/213))
- Disable beep when scanning a barcode. ([pull #216](https://github.com/brarcher/loyalty-card-locker/pull/216))
## v0.22 (2018-02-19)
Changes:
- Update translations. (https://github.com/brarcher/loyalty-card-locker/pull/208)
- Barcode rendering updates: (https://github.com/brarcher/loyalty-card-locker/pull/209)
* Reload card view activity when screen is rotated, so barcode image is correct size.
* Render 1D barcodes in a larger space, allowing them to better fill the screen.
- Update translations. ([pull #208](https://github.com/brarcher/loyalty-card-locker/pull/208))
- Barcode rendering updates: ([pull #209](https://github.com/brarcher/loyalty-card-locker/pull/209))
- Reload card view activity when screen is rotated, so barcode image is correct size.
- Render 1D barcodes in a larger space, allowing them to better fill the screen.
## v0.21 (2018-02-17)
Changes
- Add quiet space at the start/end of barcodes. (https://github.com/brarcher/loyalty-card-locker/pull/200)
- Add options to configure the colors used for the store name font and background. (https://github.com/brarcher/loyalty-card-locker/pull/203)
- Add options to adjust font sizes on the card listing page and single card page. (https://github.com/brarcher/loyalty-card-locker/pull/204)
Changes:
- Add quiet space at the start/end of barcodes. ([pull #200](https://github.com/brarcher/loyalty-card-locker/pull/200))
- Add options to configure the colors used for the store name font and background. ([pull #203](https://github.com/brarcher/loyalty-card-locker/pull/203))
- Add options to adjust font sizes on the card listing page and single card page. ([pull #204](https://github.com/brarcher/loyalty-card-locker/pull/204))
## v0.20 (2018-02-10)
Changes:
- Changes to Card view to display the note, allow the card ID to take multiple lines, and show the store name. (https://github.com/brarcher/loyalty-card-locker/pull/197)
- Changes to Card view to display the note, allow the card ID to take multiple lines, and show the store name. ([pull #197](https://github.com/brarcher/loyalty-card-locker/pull/197))
## v0.19 (2018-02-01)
Changes:
- Improved layout for card list. (https://github.com/brarcher/loyalty-card-locker/pull/188)
- Improved layout when viewing a card. (https://github.com/brarcher/loyalty-card-locker/pull/190)
- Improved layout for card list. ([pull #188](https://github.com/brarcher/loyalty-card-locker/pull/188))
- Improved layout when viewing a card. ([pull #190](https://github.com/brarcher/loyalty-card-locker/pull/190))
## v0.18.1 (2018-01-24)
Changes:
- Workaround crash during install on some Android versions (likely Android 5 and below). (https://github.com/brarcher/loyalty-card-locker/pull/184)
- Workaround crash during install on some Android versions (likely Android 5 and below). ([pull #184](https://github.com/brarcher/loyalty-card-locker/pull/184))
## v0.18 (2018-01-19)
Changes:
- Fix crash when importing certain types of corrupted CSV files. (https://github.com/brarcher/loyalty-card-locker/pull/177)
- Fix importing backups directly from the file system. (https://github.com/brarcher/loyalty-card-locker/pull/180)
- Fix importing backups from certain types of content providers. (https://github.com/brarcher/loyalty-card-locker/pull/179)
- Fix crash when importing certain types of corrupted CSV files. ([pull #177](https://github.com/brarcher/loyalty-card-locker/pull/177))
- Fix importing backups directly from the file system. ([pull #180](https://github.com/brarcher/loyalty-card-locker/pull/180))
- Fix importing backups from certain types of content providers. ([pull #179](https://github.com/brarcher/loyalty-card-locker/pull/179))
## v0.17 (2018-01-11)
Changes:
- Fix issue on Android SDK 24+ where using the file chooser import option would cause a crash. (https://github.com/brarcher/loyalty-card-locker/pull/170)
- New icon and color scheme. (https://github.com/brarcher/loyalty-card-locker/pull/171)
- Fix issue on Android SDK 24+ where using the file chooser import option would cause a crash. ([pull #170](https://github.com/brarcher/loyalty-card-locker/pull/170))
- New icon and color scheme. ([pull #171](https://github.com/brarcher/loyalty-card-locker/pull/171))
## v0.16 (2017-11-29)
Changes:
- Add support for adding loyalty card shortcuts from the launcher/homescreen. (https://github.com/brarcher/loyalty-card-locker/pull/161)
- Remove support for adding loyalty card shortcuts from the app itself. This removes the need for the shortcut permission. (https://github.com/brarcher/loyalty-card-locker/pull/163)
- Add support for adding loyalty card shortcuts from the launcher/homescreen. ([pull #161](https://github.com/brarcher/loyalty-card-locker/pull/161))
- Remove support for adding loyalty card shortcuts from the app itself. This removes the need for the shortcut permission. ([pull #163](https://github.com/brarcher/loyalty-card-locker/pull/163))
## v0.15 (2017-11-25)
Changes:
- Add support for adding shortcuts to home screen when adding or editing a card. (https://github.com/brarcher/loyalty-card-locker/pull/155)
- Remove widget, as it was a poor substitute for shortcuts. (https://github.com/brarcher/loyalty-card-locker/pull/155)
- Fix exporting backups on Android 7+. (https://github.com/brarcher/loyalty-card-locker/pull/153)
- Report more accurate mime type when exporting backup data. (https://github.com/brarcher/loyalty-card-locker/pull/156)
- Fix bug where a card could not be edited. (https://github.com/brarcher/loyalty-card-locker/pull/155)
- Add support for adding shortcuts to home screen when adding or editing a card. ([pull #155](https://github.com/brarcher/loyalty-card-locker/pull/155))
- Remove widget, as it was a poor substitute for shortcuts. ([pull #155](https://github.com/brarcher/loyalty-card-locker/pull/155))
- Fix exporting backups on Android 7+. ([pull #153](https://github.com/brarcher/loyalty-card-locker/pull/153))
- Report more accurate mime type when exporting backup data. ([pull #156](https://github.com/brarcher/loyalty-card-locker/pull/156))
- Fix bug where a card could not be edited. ([pull #155](https://github.com/brarcher/loyalty-card-locker/pull/155))
## v0.14 (2017-10-26)
Changes:
- Add support for app shortcuts (Android 7.1+), where the most recently used cards will appear as shortcuts. (https://github.com/brarcher/loyalty-card-locker/pull/145)
- Add a widget which works like a pinned app shortcut, to support devices which run below Android 7.1. (https://github.com/brarcher/loyalty-card-locker/pull/142)
- Add support for app shortcuts (Android 7.1+), where the most recently used cards will appear as shortcuts. ([pull #145](https://github.com/brarcher/loyalty-card-locker/pull/145))
- Add a widget which works like a pinned app shortcut, to support devices which run below Android 7.1. ([pull #142](https://github.com/brarcher/loyalty-card-locker/pull/142))
## v0.13 (2017-07-25)
Changes:
- Add screen rotation lock menu option when displaying a card. If locked, the screen will transition to its "natural" orientation and further screen rotation will be blocked. (https://github.com/brarcher/loyalty-card-locker/pull/128)
- If a card is selected from the main screen but cannot be loaded, the application fails gracefully and posts a message. (https://github.com/brarcher/loyalty-card-locker/pull/132)
- Fix case where layout IDs for intro wizard could not be found. (https://github.com/brarcher/loyalty-card-locker/pull/128)
- Add screen rotation lock menu option when displaying a card. If locked, the screen will transition to its "natural" orientation and further screen rotation will be blocked. ([pull #128](https://github.com/brarcher/loyalty-card-locker/pull/128))
- If a card is selected from the main screen but cannot be loaded, the application fails gracefully and posts a message. ([pull #132](https://github.com/brarcher/loyalty-card-locker/pull/132))
- Fix case where layout IDs for intro wizard could not be found. ([pull #128](https://github.com/brarcher/loyalty-card-locker/pull/128))
## v0.12 (2017-07-16)
Changes:
- A change in v0.11 reduced the memory usage of barcode drawing, but affected the barcode dimensions. This is now changed to maintain the barcode dimensions while reducing memory usage. (https://github.com/brarcher/loyalty-card-locker/pull/126)
- Update German and French translations. (https://github.com/brarcher/loyalty-card-locker/pull/122, https://github.com/brarcher/loyalty-card-locker/pull/124, https://github.com/brarcher/loyalty-card-locker/pull/125)
- A change in v0.11 reduced the memory usage of barcode drawing, but affected the barcode dimensions. This is now changed to maintain the barcode dimensions while reducing memory usage. ([pull #126](https://github.com/brarcher/loyalty-card-locker/pull/126))
- Update German and French translations. ([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))
## v0.11.1 (2017-06-29)
Changes:
- Prevent a crash when rotation the screen in the first run intro wizard.
## v0.11 (2017-06-26)
Improvements:
- When editing a card ID, pre-populate the existing ID to start. (https://github.com/brarcher/loyalty-card-locker/pull/94)
- Limit the width of generated barcodes to reduce memory usage and out of memory errors. (https://github.com/brarcher/loyalty-card-locker/pull/103)
- When editing a card, change the "Enter Card" button to say "Edit Card" if a card ID already exists. (https://github.com/brarcher/loyalty-card-locker/pull/104)
- Change the color scheme to be softer and compatible with the app icon, and change the layout when viewing a card to be cleaner. (https://github.com/brarcher/loyalty-card-locker/pull/107)
- Add an intro wizard which launches on the app's first launch. (https://github.com/brarcher/loyalty-card-locker/pull/108)
- When editing a card ID, pre-populate the existing ID to start. ([pull #94](https://github.com/brarcher/loyalty-card-locker/pull/94))
- Limit the width of generated barcodes to reduce memory usage and out of memory errors. ([pull #103](https://github.com/brarcher/loyalty-card-locker/pull/103))
- When editing a card, change the "Enter Card" button to say "Edit Card" if a card ID already exists. ([pull #104](https://github.com/brarcher/loyalty-card-locker/pull/104))
- Change the color scheme to be softer and compatible with the app icon, and change the layout when viewing a card to be cleaner. ([pull #107](https://github.com/brarcher/loyalty-card-locker/pull/107))
- Add an intro wizard which launches on the app's first launch. ([pull #108](https://github.com/brarcher/loyalty-card-locker/pull/108))
## v0.10 (2017-02-12)
Improvements:
- Changed the default import/export filename. (https://github.com/brarcher/loyalty-card-locker/pull/84)
- Correct string on the import/export page. (https://github.com/brarcher/loyalty-card-locker/pull/87)
- Improve layout of card view page. The text should be easier to read, and is selectable with a long click. (https://github.com/brarcher/loyalty-card-locker/pull/91)
- Changed the default import/export filename. ([pull #84](https://github.com/brarcher/loyalty-card-locker/pull/84))
- Correct string on the import/export page. ([pull #87](https://github.com/brarcher/loyalty-card-locker/pull/87))
- Improve layout of card view page. The text should be easier to read, and is selectable with a long click. ([pull #91](https://github.com/brarcher/loyalty-card-locker/pull/91))
## v0.9 (2017-01-17)
@@ -208,43 +319,50 @@ The "Locker" part of the name was not intuitive. To help remedy this a new appli
Additional features/improvements:
- Importing/Exporting cards was changed to be more flexible. (https://github.com/brarcher/loyalty-card-locker/pull/76)
- Translations for Lithuanian added. (https://github.com/brarcher/loyalty-card-locker/pull/62)
- Translations for French added. (https://github.com/brarcher/loyalty-card-locker/pull/80)
- Importing/Exporting cards was changed to be more flexible. ([pull #76](https://github.com/brarcher/loyalty-card-locker/pull/76))
- Translations for Lithuanian added. ([pull #62](https://github.com/brarcher/loyalty-card-locker/pull/62))
- Translations for French added. ([pull #80](https://github.com/brarcher/loyalty-card-locker/pull/80))
## v0.8 (2016-11-22)
New features/improvements:
- Screen brightness increased to its maximum when displaying a card, to help barcode scanners successfully capture the barcode. (https://github.com/brarcher/loyalty-card-locker/pull/54)
- Add a delete confirmation when deleting a card. (https://github.com/brarcher/loyalty-card-locker/pull/55)
- Add translations for German (https://github.com/brarcher/loyalty-card-locker/pull/57) and Czech (https://github.com/brarcher/loyalty-card-locker/pull/58).
- Clarification change for Italian translation. (https://github.com/brarcher/loyalty-card-locker/pull/66)
- Screen brightness increased to its maximum when displaying a card, to help barcode scanners successfully capture the barcode. ([pull #54](https://github.com/brarcher/loyalty-card-locker/pull/54))
- Add a delete confirmation when deleting a card. ([pull #55](https://github.com/brarcher/loyalty-card-locker/pull/55))
- Add translations for German ([pull #57](https://github.com/brarcher/loyalty-card-locker/pull/57)) and Czech ([pull #58](https://github.com/brarcher/loyalty-card-locker/pull/58)).
- Clarification change for Italian translation. ([pull #66](https://github.com/brarcher/loyalty-card-locker/pull/66))
## v0.7 (2016-07-14)
New features/improvements:
- Long-click of a card brings up option to copy card ID to the clipboard. (https://github.com/brarcher/loyalty-card-locker/issues/49)
- Long-click of a card brings up option to copy card ID to the clipboard. ([pull #49](https://github.com/brarcher/loyalty-card-locker/issues/49))
Bug fixes:
- Back button on Input/Export view now works, moving user to main view
## v0.6 (2016-05-23)
New features/improvements:
- Allow user to enter barcode manually. If a user elects to enter a barcode manually, a list of all valid and supported barcode images is displayed. The user then may select the barcode image which matches what the user wants. https://github.com/brarcher/loyalty-card-locker/issues/33, https://github.com/brarcher/loyalty-card-locker/pull/44
- Allow user to enter barcode manually. If a user elects to enter a barcode manually, a list of all valid and supported barcode images is displayed. The user then may select the barcode image which matches what the user wants. [issue #33](https://github.com/brarcher/loyalty-card-locker/issues/33), [pull #44](https://github.com/brarcher/loyalty-card-locker/pull/44)
Bug fixes:
- Resolve issue where some displayed barcodes were blurry. (https://github.com/brarcher/loyalty-card-locker/issues/37)
- Resolve issue where some displayed barcodes were blurry. ([issue #37](https://github.com/brarcher/loyalty-card-locker/issues/37))
## v0.5 (2016-05-16)
New features/improvements:
- An about dialog can be opened from the main screen, which gives details about the application and project on GitHub (https://github.com/brarcher/loyalty-card-locker/issues/19)
- Allow loyalty card information to be imported from/exported to a CSV file in external storage (https://github.com/brarcher/loyalty-card-locker/issues/36 https://github.com/brarcher/loyalty-card-locker/issues/20)
- An about dialog can be opened from the main screen, which gives details about the application and project on GitHub ([issue #19](https://github.com/brarcher/loyalty-card-locker/issues/19))
- Allow loyalty card information to be imported from/exported to a CSV file in external storage ([issue #36](https://github.com/brarcher/loyalty-card-locker/issues/36), [issue #20](https://github.com/brarcher/loyalty-card-locker/issues/20))
## v0.4 (2016-04-09)
New features/improvements:
- Dutch translation
- Allow name field to be editable after adding loyalty card
- Add an optional note field
@@ -256,17 +374,18 @@ Bug fixes:
## v0.3 (2016-02-11)
- Now officially supports the following list of 1D and 2D barcodes:
* AZTEC
* CODABAR
* CODE_39
* CODE_128
* DATA_MATRIX
* EAN_8
* EAN_13
* ITF
* PDF_417
* QR_CODE
* UPC_A
- AZTEC
- CODABAR
- CODE_39
- CODE_128
- DATA_MATRIX
- EAN_8
- EAN_13
- ITF
- PDF_417
- QR_CODE
- UPC_A
- Generated barcodes are larger, easier to scan from a scanning device
## v0.2 (2016-02-07)
@@ -275,7 +394,6 @@ Bug fixes:
- Support for all 1D barcode types. (Originally only product 1D barcodes were supported)
- Add required camera permission, which was initially missing.
## v0.1 (2016-01-30)
- Ability to create/edit/delete loyalty cards

3
Gemfile Normal file
View File

@@ -0,0 +1,3 @@
source "https://rubygems.org"
gem "fastlane"

180
Gemfile.lock Normal file
View File

@@ -0,0 +1,180 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.2)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
atomos (0.1.3)
aws-eventstream (1.1.0)
aws-partitions (1.388.0)
aws-sdk-core (3.109.1)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
aws-sdk-kms (1.39.0)
aws-sdk-core (~> 3, >= 3.109.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.83.1)
aws-sdk-core (~> 3, >= 3.109.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.1)
aws-sigv4 (1.2.2)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.0.3)
colored (1.2)
colored2 (3.1.2)
commander-fastlane (4.4.6)
highline (~> 1.7.2)
declarative (0.0.20)
declarative-option (0.1.0)
digest-crc (0.6.1)
rake (~> 13.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6)
emoji_regex (3.2.0)
excon (0.78.0)
faraday (1.1.0)
multipart-post (>= 1.2, < 3)
ruby2_keywords
faraday-cookie_jar (0.0.7)
faraday (>= 0.8.0)
http-cookie (~> 1.0.0)
faraday_middleware (1.0.0)
faraday (~> 1.0)
fastimage (2.2.0)
fastlane (2.165.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.3, < 3.0.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
colored
commander-fastlane (>= 4.4.6, < 5.0.0)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-api-client (>= 0.37.0, < 0.39.0)
google-cloud-storage (>= 1.15.0, < 2.0.0)
highline (>= 1.7.2, < 2.0.0)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (~> 2.0.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.3)
simctl (~> 1.6.3)
slack-notifier (>= 2.0.0, < 3.0.0)
terminal-notifier (>= 2.0.0, < 3.0.0)
terminal-table (>= 1.4.5, < 2.0.0)
tty-screen (>= 0.6.3, < 1.0.0)
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3)
google-api-client (0.38.0)
addressable (~> 2.5, >= 2.5.1)
googleauth (~> 0.9)
httpclient (>= 2.8.1, < 3.0)
mini_mime (~> 1.0)
representable (~> 3.0)
retriable (>= 2.0, < 4.0)
signet (~> 0.12)
google-cloud-core (1.5.0)
google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0)
google-cloud-env (1.4.0)
faraday (>= 0.17.3, < 2.0)
google-cloud-errors (1.0.1)
google-cloud-storage (1.29.1)
addressable (~> 2.5)
digest-crc (~> 0.4)
google-api-client (~> 0.33)
google-cloud-core (~> 1.2)
googleauth (~> 0.9)
mini_mime (~> 1.0)
googleauth (0.14.0)
faraday (>= 0.17.3, < 2.0)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (~> 0.14)
highline (1.7.10)
http-cookie (1.0.3)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.4.0)
json (2.3.1)
jwt (2.2.2)
memoist (0.16.2)
mini_magick (4.10.1)
mini_mime (1.0.2)
multi_json (1.15.0)
multipart-post (2.0.0)
nanaimo (0.3.0)
naturally (2.2.0)
os (1.1.1)
plist (3.5.0)
public_suffix (4.0.6)
rake (13.0.1)
representable (3.0.4)
declarative (< 0.1.0)
declarative-option (< 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rouge (2.0.7)
ruby2_keywords (0.0.2)
rubyzip (2.3.0)
security (0.1.3)
signet (0.14.0)
addressable (~> 2.3)
faraday (>= 0.17.3, < 2.0)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.8)
CFPropertyList
naturally
slack-notifier (2.3.2)
terminal-notifier (2.0.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
tty-cursor (0.7.1)
tty-screen (0.8.1)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.7)
unicode-display_width (1.7.0)
word_wrap (1.0.0)
xcodeproj (1.19.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.3.0)
xcpretty (0.3.0)
rouge (~> 2.0.7)
xcpretty-travis-formatter (1.0.0)
xcpretty (~> 0.2, >= 0.0.7)
PLATFORMS
ruby
DEPENDENCIES
fastlane
BUNDLED WITH
2.1.4

View File

@@ -11,10 +11,11 @@ android {
defaultConfig {
applicationId "me.hackerchick.catima"
minSdkVersion 16
minSdkVersion 19
targetSdkVersion 29
versionCode 39
versionName "0.28"
versionCode 50
versionName "1.5.0"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
@@ -43,20 +44,20 @@ android {
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'androidx.appcompat:appcompat:1.2.0'
compile 'com.google.android.material:material:1.2.0-alpha03'
compile 'androidx.legacy:legacy-support-v4:1.0.0'
compile 'com.journeyapps:zxing-android-embedded:3.5.0@aar'
compile 'com.google.zxing:core:3.3.0'
compile 'org.apache.commons:commons-csv:1.5'
compile 'androidx.constraintlayout:constraintlayout:1.1.3'
compile 'com.jaredrummler:colorpicker:1.0.2'
compile group: 'com.google.guava', name: 'guava', version: '20.0'
compile 'com.github.apl-devs:appintro:v4.2.0'
compile "com.vanniktech:vntnumberpickerpreference:1.0.0"
testCompile 'junit:junit:4.12'
testCompile "org.robolectric:robolectric:4.0.2"
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.journeyapps:zxing-android-embedded:3.5.0@aar'
implementation 'com.google.zxing:core:3.3.0'
implementation 'org.apache.commons:commons-csv:1.5'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.jaredrummler:colorpicker:1.0.2'
implementation group: 'com.google.guava', name: 'guava', version: '20.0'
implementation "com.vanniktech:vntnumberpickerpreference:1.0.0"
implementation 'androidx.cardview:cardview:1.0.0'
testImplementation 'junit:junit:4.12'
testImplementation "org.robolectric:robolectric:4.0.2"
}
task findbugs(type: FindBugs, dependsOn: 'assembleDebug') {

View File

@@ -12,4 +12,4 @@ public class ApplicationTest extends ApplicationTestCase<Application>
{
super(Application.class);
}
}
}

View File

@@ -33,6 +33,16 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".AboutActivity"
android:label="@string/about"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
android:name=".ManageGroupsActivity"
android:label="@string/groups"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
android:name=".LoyaltyCardViewActivity"
android:theme="@style/AppTheme.NoActionBar"
@@ -42,7 +52,6 @@
<activity
android:name=".LoyaltyCardEditActivity"
android:theme="@style/AppTheme.NoActionBar"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="stateHidden"
android:exported="true">
<intent-filter android:label="@string/app_name">
@@ -62,21 +71,17 @@
android:name=".BarcodeSelectorActivity"
android:label="@string/selectBarcodeTitle"
android:theme="@style/AppTheme.NoActionBar"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="stateHidden"/>
<activity
android:name=".preferences.SettingsActivity"
android:label="@string/settings"
android:configChanges="orientation|screenSize"/>
android:label="@string/settings"/>
<activity
android:name=".ImportExportActivity"
android:label="@string/importExport"
android:configChanges="orientation|screenSize"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".CardShortcutConfigure"
android:label="@string/cardShortcut"
android:configChanges="orientation|screenSize"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT"/>

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,125 @@
package protect.card_locker;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.text.InputType;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.common.collect.ImmutableMap;
import org.w3c.dom.Text;
import java.util.Calendar;
import java.util.Map;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.text.HtmlCompat;
public class AboutActivity extends AppCompatActivity
{
private static final String TAG = "Catima";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.about_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
final Map<String, String> USED_LIBRARIES = new ImmutableMap.Builder<String, String>()
.put("Commons CSV", "https://commons.apache.org/proper/commons-csv/")
.put("Guava", "https://github.com/google/guava")
.put("ZXing", "https://github.com/zxing/zxing")
.put("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded")
.put("Color Picker", "https://github.com/jaredrummler/ColorPicker")
.put("VNTNumberPickerPreference", "https://github.com/vanniktech/VNTNumberPickerPreference")
.build();
final Map<String, String> USED_ASSETS = ImmutableMap.of
(
"Save by Bernar Novalyi", "https://thenounproject.com/term/save/716011"
);
StringBuilder libs = new StringBuilder().append("<br/>");
for (Map.Entry<String, String> entry : USED_LIBRARIES.entrySet())
{
libs.append("<br/><a href=\"").append(entry.getValue()).append("\">").append(entry.getKey()).append("</a><br/>");
}
StringBuilder resources = new StringBuilder().append("<br/>");
for (Map.Entry<String, String> entry : USED_ASSETS.entrySet())
{
resources.append("<br/><a href=\"").append(entry.getValue()).append("\">").append(entry.getKey()).append("</a><br/>");
}
String appName = getString(R.string.app_name);
int year = Calendar.getInstance().get(Calendar.YEAR);
String version = "?";
try
{
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
version = pi.versionName;
}
catch (PackageManager.NameNotFoundException e)
{
Log.w(TAG, "Package name not found", e);
}
setTitle(String.format(getString(R.string.about_title_fmt), appName));
TextView aboutTextView = findViewById(R.id.aboutText);
aboutTextView.setText(HtmlCompat.fromHtml(String.format(getString(R.string.debug_version_fmt), version) +
"<br/><br/>" +
String.format(getString(R.string.app_revision_fmt),
"<a href=\"" + getString(R.string.app_revision_url) + "\">" +
"GitHub" +
"</a>") +
"<br/><br/>" +
String.format(getString(R.string.app_copyright_fmt), year) +
"<br/><br/>" +
getString(R.string.app_copyright_old) +
"<br/><br/>" +
getString(R.string.app_license) +
"<br/><br/>" +
String.format(getString(R.string.app_libraries), appName, libs.toString()) +
"<br/><br/>" +
String.format(getString(R.string.app_resources), appName, resources.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
aboutTextView.setMovementMethod(LinkMovementMethod.getInstance());
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
}

View File

@@ -191,14 +191,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity
public void onGlobalLayout()
{
Log.d(TAG, "Global layout finished, type: + " + formatType + ", width: " + image.getWidth());
if (Build.VERSION.SDK_INT < 16)
{
image.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
else
{
image.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
image.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "Generating barcode for type " + formatType);
BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text);

View File

@@ -0,0 +1,23 @@
package protect.card_locker;
public class BarcodeValues {
private final String mFormat;
private final String mContent;
public BarcodeValues(String format, String content) {
mFormat = format;
mContent = content;
}
public String format() {
return mFormat;
}
public String content() {
return mContent;
}
public boolean isEmpty() {
return mFormat == null && mContent == null;
}
}

View File

@@ -18,28 +18,21 @@ public class CsvDatabaseExporter implements DatabaseExporter
{
CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180);
// Print the header
printer.printRecord(DBHelper.LoyaltyCardDbIds.ID,
DBHelper.LoyaltyCardDbIds.STORE,
DBHelper.LoyaltyCardDbIds.NOTE,
DBHelper.LoyaltyCardDbIds.CARD_ID,
DBHelper.LoyaltyCardDbIds.HEADER_COLOR,
DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR,
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE);
// Print the version
printer.printRecord("2");
Cursor cursor = db.getLoyaltyCardCursor();
printer.println();
while(cursor.moveToNext())
// Print the header for groups
printer.printRecord(DBHelper.LoyaltyCardDbGroups.ID);
Cursor groupCursor = db.getGroupCursor();
while(groupCursor.moveToNext())
{
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cursor);
Group group = Group.toGroup(groupCursor);
printer.printRecord(card.id,
card.store,
card.note,
card.cardId,
card.headerColor,
card.headerTextColor,
card.barcodeType);
printer.printRecord(group._id);
if(Thread.currentThread().isInterrupted())
{
@@ -47,7 +40,66 @@ public class CsvDatabaseExporter implements DatabaseExporter
}
}
cursor.close();
groupCursor.close();
// Print an empty line
printer.println();
// Print the header for cards
printer.printRecord(DBHelper.LoyaltyCardDbIds.ID,
DBHelper.LoyaltyCardDbIds.STORE,
DBHelper.LoyaltyCardDbIds.NOTE,
DBHelper.LoyaltyCardDbIds.CARD_ID,
DBHelper.LoyaltyCardDbIds.HEADER_COLOR,
DBHelper.LoyaltyCardDbIds.BARCODE_TYPE,
DBHelper.LoyaltyCardDbIds.STAR_STATUS);
Cursor cardCursor = db.getLoyaltyCardCursor();
while(cardCursor.moveToNext())
{
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor);
printer.printRecord(card.id,
card.store,
card.note,
card.cardId,
card.headerColor,
card.barcodeType,
card.starStatus);
if(Thread.currentThread().isInterrupted())
{
throw new InterruptedException();
}
}
cardCursor.close();
// Print an empty line
printer.println();
// Print the header for card group mappings
printer.printRecord(DBHelper.LoyaltyCardDbIdsGroups.cardID,
DBHelper.LoyaltyCardDbIdsGroups.groupID);
Cursor cardCursor2 = db.getLoyaltyCardCursor();
while(cardCursor2.moveToNext())
{
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor2);
for (Group group : db.getLoyaltyCardGroups(card.id)) {
printer.printRecord(card.id, group._id);
}
if(Thread.currentThread().isInterrupted())
{
throw new InterruptedException();
}
}
cardCursor2.close();
printer.close();
}

View File

@@ -6,8 +6,11 @@ import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.List;
/**
* Class for importing a database from CSV (Comma Separate Values)
@@ -19,6 +22,34 @@ import java.io.InputStreamReader;
public class CsvDatabaseImporter implements DatabaseImporter
{
public void importData(DBHelper db, InputStreamReader input) throws IOException, FormatException, InterruptedException
{
BufferedReader bufferedReader = new BufferedReader(input);
bufferedReader.mark(100);
Integer version = 1;
try {
version = Integer.parseInt(bufferedReader.readLine());
} catch (NumberFormatException _e) {
// Assume version 1
}
bufferedReader.reset();
switch (version) {
case 1:
parseV1(db, bufferedReader);
break;
case 2:
parseV2(db, bufferedReader);
break;
default:
throw new FormatException(String.format("No code to parse version %s", version));
}
}
public void parseV1(DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException
{
final CSVParser parser = new CSVParser(input, CSVFormat.RFC4180.withHeader());
@@ -51,6 +82,116 @@ public class CsvDatabaseImporter implements DatabaseImporter
}
}
public void parseV2(DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException
{
SQLiteDatabase database = db.getWritableDatabase();
database.beginTransaction();
Integer part = 0;
String stringPart = "";
try {
while (true) {
String tmp = input.readLine();
if (tmp == null || tmp.isEmpty()) {
switch (part) {
case 0:
// This is the version info, ignore
break;
case 1:
parseV2Groups(db, database, stringPart);
break;
case 2:
parseV2Cards(db, database, stringPart);
break;
case 3:
parseV2CardGroups(db, database, stringPart);
break;
default:
throw new FormatException("Issue parsing CSV data, too many parts for v2 parsing");
}
if (tmp == null) {
break;
}
part += 1;
stringPart = "";
} else {
stringPart += tmp + "\n";
}
}
database.setTransactionSuccessful();
} catch (FormatException e) {
throw new FormatException("Issue parsing CSV data", e);
} finally {
database.endTransaction();
database.close();
}
}
public void parseV2Groups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException
{
// Parse groups
final CSVParser groupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.withHeader());
try {
for (CSVRecord record : groupParser) {
importGroup(database, db, record);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
}
groupParser.close();
} catch (IllegalArgumentException | IllegalStateException e) {
throw new FormatException("Issue parsing CSV data", e);
}
}
public void parseV2Cards(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException
{
// Parse cards
final CSVParser cardParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.withHeader());
try {
for (CSVRecord record : cardParser) {
importLoyaltyCard(database, db, record);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
}
cardParser.close();
} catch (IllegalArgumentException | IllegalStateException e) {
throw new FormatException("Issue parsing CSV data", e);
}
}
public void parseV2CardGroups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException
{
// Parse card group mappings
final CSVParser cardGroupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.withHeader());
try {
for (CSVRecord record : cardGroupParser) {
importCardGroupMapping(database, db, record);
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
}
cardGroupParser.close();
} catch (IllegalArgumentException | IllegalStateException e) {
throw new FormatException("Issue parsing CSV data", e);
}
}
/**
* Extract a string from the items array. The index into the array
* is determined by looking up the index in the fields map using the
@@ -133,15 +274,47 @@ public class CsvDatabaseImporter implements DatabaseImporter
String barcodeType = extractString(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, record, "");
Integer headerColor = null;
Integer headerTextColor = null;
if(record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_COLOR) &&
record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR))
if(record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_COLOR))
{
headerColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record, true);
headerTextColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, record, true);
}
helper.insertLoyaltyCard(database, id, store, note, cardId, barcodeType, headerColor, headerTextColor);
int starStatus = 0;
try {
starStatus = extractInt(DBHelper.LoyaltyCardDbIds.STAR_STATUS, record, false);
} catch (FormatException _e ) {
// This field did not exist in versions 0.28 and before
// We catch this exception so we can still import old backups
}
if (starStatus != 1) starStatus = 0;
helper.insertLoyaltyCard(database, id, store, note, cardId, barcodeType, headerColor, starStatus);
}
}
/**
* Import a single group into the database using the given
* session.
*/
private void importGroup(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException
{
String id = extractString(DBHelper.LoyaltyCardDbGroups.ID, record, null);
helper.insertGroup(database, id);
}
/**
* Import a single card to group mapping into the database using the given
* session.
*/
private void importCardGroupMapping(SQLiteDatabase database, DBHelper helper, CSVRecord record)
throws IOException, FormatException
{
Integer cardId = extractInt(DBHelper.LoyaltyCardDbIdsGroups.cardID, record, false);
String groupId = extractString(DBHelper.LoyaltyCardDbIdsGroups.groupID, record, null);
List<Group> cardGroups = helper.getLoyaltyCardGroups(cardId);
cardGroups.add(helper.getGroup(groupId));
helper.setLoyaltyCardGroups(database, cardId, cardGroups);
}
}

View File

@@ -1,17 +1,27 @@
package protect.card_locker;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Color;
import java.util.ArrayList;
import java.util.List;
public class DBHelper extends SQLiteOpenHelper
{
public static final String DATABASE_NAME = "Catima.db";
public static final int ORIGINAL_DATABASE_VERSION = 1;
public static final int DATABASE_VERSION = 3;
public static final int DATABASE_VERSION = 6;
static class LoyaltyCardDbGroups
{
public static final String TABLE = "groups";
public static final String ID = "_id";
public static final String ORDER = "orderId";
}
static class LoyaltyCardDbIds
{
@@ -23,6 +33,14 @@ public class DBHelper extends SQLiteOpenHelper
public static final String HEADER_TEXT_COLOR = "headertextcolor";
public static final String CARD_ID = "cardid";
public static final String BARCODE_TYPE = "barcodetype";
public static final String STAR_STATUS = "starstatus";
}
static class LoyaltyCardDbIdsGroups
{
public static final String TABLE = "cardsGroups";
public static final String cardID = "cardId";
public static final String groupID = "groupId";
}
public DBHelper(Context context)
@@ -33,7 +51,12 @@ public class DBHelper extends SQLiteOpenHelper
@Override
public void onCreate(SQLiteDatabase db)
{
// create table for gift cards
// create table for card groups
db.execSQL("create table " + LoyaltyCardDbGroups.TABLE + "(" +
LoyaltyCardDbGroups.ID + " TEXT primary key not null," +
LoyaltyCardDbGroups.ORDER + " INTEGER DEFAULT '0')");
// create table for cards
db.execSQL("create table " + LoyaltyCardDbIds.TABLE + "(" +
LoyaltyCardDbIds.ID + " INTEGER primary key autoincrement," +
LoyaltyCardDbIds.STORE + " TEXT not null," +
@@ -41,7 +64,14 @@ public class DBHelper extends SQLiteOpenHelper
LoyaltyCardDbIds.HEADER_COLOR + " INTEGER," +
LoyaltyCardDbIds.HEADER_TEXT_COLOR + " INTEGER," +
LoyaltyCardDbIds.CARD_ID + " TEXT not null," +
LoyaltyCardDbIds.BARCODE_TYPE + " TEXT not null)");
LoyaltyCardDbIds.BARCODE_TYPE + " TEXT not null," +
LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0' )");
// create associative table for cards in groups
db.execSQL("create table " + LoyaltyCardDbIdsGroups.TABLE + "(" +
LoyaltyCardDbIdsGroups.cardID + " INTEGER," +
LoyaltyCardDbIdsGroups.groupID + " TEXT," +
"primary key (" + LoyaltyCardDbIdsGroups.cardID + "," + LoyaltyCardDbIdsGroups.groupID +"))");
}
@Override
@@ -62,11 +92,37 @@ public class DBHelper extends SQLiteOpenHelper
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.HEADER_TEXT_COLOR + " INTEGER");
}
// Upgrade from version 3 to version 4
if(oldVersion < 4 && newVersion >= 4)
{
db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE
+ " ADD COLUMN " + LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0'");
}
// Upgrade from version 4 to version 5
if(oldVersion < 5 && newVersion >= 5)
{
db.execSQL("create table " + LoyaltyCardDbGroups.TABLE + "(" +
LoyaltyCardDbGroups.ID + " TEXT primary key not null)");
db.execSQL("create table " + LoyaltyCardDbIdsGroups.TABLE + "(" +
LoyaltyCardDbIdsGroups.cardID + " INTEGER," +
LoyaltyCardDbIdsGroups.groupID + " TEXT," +
"primary key (" + LoyaltyCardDbIdsGroups.cardID + "," + LoyaltyCardDbIdsGroups.groupID +"))");
}
// Upgrade from version 5 to 6
if(oldVersion < 6 && newVersion >= 6)
{
db.execSQL("ALTER TABLE " + LoyaltyCardDbGroups.TABLE
+ " ADD COLUMN " + LoyaltyCardDbGroups.ORDER + " INTEGER DEFAULT '0'");
}
}
public long insertLoyaltyCard(final String store, final String note, final String cardId,
final String barcodeType, final Integer headerColor,
final Integer headerTextColor)
final int starStatus)
{
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
@@ -75,15 +131,16 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, headerTextColor);
contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, Color.WHITE);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus);
final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
return newId;
}
public boolean insertLoyaltyCard(final SQLiteDatabase db, final int id,
final String store, final String note, final String cardId,
public boolean insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store,
final String note, final String cardId,
final String barcodeType, final Integer headerColor,
final Integer headerTextColor)
final int starStatus)
{
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.ID, id);
@@ -92,15 +149,15 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, headerTextColor);
contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, Color.WHITE);
contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus);
final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues);
return (newId != -1);
}
public boolean updateLoyaltyCard(final int id, final String store, final String note,
final String cardId, final String barcodeType,
final Integer headerColor, final Integer headerTextColor)
final Integer headerColor)
{
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
@@ -109,7 +166,18 @@ public class DBHelper extends SQLiteOpenHelper
contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId);
contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType);
contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor);
contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, headerTextColor);
contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, Color.WHITE);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
LoyaltyCardDbIds.ID + "=?",
new String[]{Integer.toString(id)});
return (rowsUpdated == 1);
}
public boolean updateLoyaltyCardStarStatus(final int id, final int starStatus)
{
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus);
int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues,
LoyaltyCardDbIds.ID + "=?",
new String[]{Integer.toString(id)});
@@ -127,6 +195,7 @@ public class DBHelper extends SQLiteOpenHelper
if(data.getCount() == 1)
{
data.moveToFirst();
card = LoyaltyCard.toLoyaltyCard(data);
}
@@ -135,12 +204,76 @@ public class DBHelper extends SQLiteOpenHelper
return card;
}
public List<Group> getLoyaltyCardGroups(final int id)
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " +
" LEFT JOIN " + LoyaltyCardDbIdsGroups.TABLE + " ig ON ig." + LoyaltyCardDbIdsGroups.groupID + " = g." + LoyaltyCardDbGroups.ID +
" where " + LoyaltyCardDbIdsGroups.cardID + "=?" +
" ORDER BY " + LoyaltyCardDbIdsGroups.groupID, new String[]{String.format("%d", id)});
List<Group> groups = new ArrayList<>();
if (!data.moveToFirst()) {
return groups;
}
groups.add(Group.toGroup(data));
while (data.moveToNext()) {
groups.add(Group.toGroup(data));
}
return groups;
}
public void setLoyaltyCardGroups(final int id, List<Group> groups)
{
SQLiteDatabase db = getWritableDatabase();
// First delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
LoyaltyCardDbIdsGroups.cardID + " = ? ",
new String[]{String.format("%d", id)});
// Then create entries for selected values
for (Group group : groups) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIdsGroups.cardID, id);
contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id);
db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
}
}
public void setLoyaltyCardGroups(final SQLiteDatabase db, final int id, List<Group> groups)
{
// First delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
LoyaltyCardDbIdsGroups.cardID + " = ? ",
new String[]{String.format("%d", id)});
// Then create entries for selected values
for (Group group : groups) {
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbIdsGroups.cardID, id);
contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id);
db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues);
}
}
public boolean deleteLoyaltyCard (final int id)
{
SQLiteDatabase db = getWritableDatabase();
int rowsDeleted = db.delete(LoyaltyCardDbIds.TABLE,
// Delete card
int rowsDeleted = db.delete(LoyaltyCardDbIds.TABLE,
LoyaltyCardDbIds.ID + " = ? ",
new String[]{String.format("%d", id)});
// And delete lookup table entries associated with this card
db.delete(LoyaltyCardDbIdsGroups.TABLE,
LoyaltyCardDbIdsGroups.cardID + " = ? ",
new String[]{String.format("%d", id)});
return (rowsDeleted == 1);
}
@@ -157,16 +290,52 @@ public class DBHelper extends SQLiteOpenHelper
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(final String filter)
{
return getLoyaltyCardCursor(filter, null);
}
/**
* Returns a cursor to all loyalty cards with the filter text in either the store or note in a certain group.
*
* @param filter
* @param group
* @return Cursor
*/
public Cursor getLoyaltyCardCursor(final String filter, Group group)
{
String actualFilter = String.format("%%%s%%", filter);
String[] selectionArgs = { actualFilter, actualFilter };
StringBuilder groupFilter = new StringBuilder();
String limitString = "";
SQLiteDatabase db = getReadableDatabase();
if (group != null) {
List<Integer> allowedIds = getGroupCardIds(group._id);
// Empty group
if (allowedIds.size() > 0) {
groupFilter.append("AND (");
for (int i = 0; i < allowedIds.size(); i++) {
groupFilter.append(LoyaltyCardDbIds.ID + " = " + allowedIds.get(i));
if (i != allowedIds.size() - 1) {
groupFilter.append(" OR ");
}
}
groupFilter.append(") ");
} else {
limitString = "LIMIT 0";
}
}
Cursor res = db.rawQuery("select * from " + LoyaltyCardDbIds.TABLE +
" WHERE " + LoyaltyCardDbIds.STORE + " LIKE ? " +
" OR " + LoyaltyCardDbIds.NOTE + " LIKE ? " +
" ORDER BY " + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC", selectionArgs, null);
" WHERE (" + LoyaltyCardDbIds.STORE + " LIKE ? " +
" OR " + LoyaltyCardDbIds.NOTE + " LIKE ? )" +
groupFilter.toString() +
" ORDER BY " + LoyaltyCardDbIds.STAR_STATUS + " DESC," + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC " +
limitString, selectionArgs, null);
return res;
}
@@ -205,5 +374,194 @@ public class DBHelper extends SQLiteOpenHelper
return numItems;
}
/**
* Returns a cursor to all groups.
*
* @return Cursor
*/
public Cursor getGroupCursor()
{
SQLiteDatabase db = getReadableDatabase();
Cursor res = db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
" ORDER BY " + LoyaltyCardDbGroups.ORDER + " ASC," + LoyaltyCardDbGroups.ID + " COLLATE NOCASE ASC", null, null);
return res;
}
public List<Group> getGroups() {
Cursor data = getGroupCursor();
List<Group> groups = new ArrayList<>();
if (!data.moveToFirst()) {
return groups;
}
groups.add(Group.toGroup(data));
while (data.moveToNext()) {
groups.add(Group.toGroup(data));
}
return groups;
}
public void reorderGroups(final List<Group> groups)
{
Integer order = 0;
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues;
for (Group group : groups)
{
contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ORDER, order);
db.update(LoyaltyCardDbGroups.TABLE, contentValues,
LoyaltyCardDbGroups.ID + "=?",
new String[]{group._id});
order++;
}
}
public Group getGroup(final String groupName)
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
" where " + LoyaltyCardDbGroups.ID + "=?", new String[]{groupName});
Group group = null;
if(data.getCount() == 1)
{
data.moveToFirst();
group = Group.toGroup(data);
}
data.close();
return group;
}
public int getGroupCount()
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.rawQuery("SELECT Count(*) FROM " + LoyaltyCardDbGroups.TABLE, null);
int numItems = 0;
if(data.getCount() == 1)
{
data.moveToFirst();
numItems = data.getInt(0);
}
data.close();
return numItems;
}
public List<Integer> getGroupCardIds(final String groupName)
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.rawQuery("SELECT " + LoyaltyCardDbIdsGroups.cardID +
" FROM " + LoyaltyCardDbIdsGroups.TABLE +
" WHERE " + LoyaltyCardDbIdsGroups.groupID + " =? ", new String[]{groupName});
List<Integer> cardIds = new ArrayList<>();
if (!data.moveToFirst()) {
return cardIds;
}
cardIds.add(data.getInt(0));
while (data.moveToNext()) {
cardIds.add(data.getInt(0));
}
data.close();
return cardIds;
}
public long insertGroup(final String name)
{
if (name.isEmpty()) return -1;
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, name);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
final long newId = db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
return newId;
}
public boolean insertGroup(final SQLiteDatabase db, final String name)
{
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, name);
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
final long newId = db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
return (newId != -1);
}
public boolean updateGroup(final String groupName, final String newName)
{
if (newName.isEmpty()) return false;
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(LoyaltyCardDbGroups.ID, newName);
try {
int rowsUpdated = db.update(LoyaltyCardDbGroups.TABLE, contentValues,
LoyaltyCardDbGroups.ID + "=?",
new String[]{groupName});
return (rowsUpdated == 1);
} catch (android.database.sqlite.SQLiteConstraintException _e) {
return false;
}
}
public boolean deleteGroup(final String groupName)
{
SQLiteDatabase db = getWritableDatabase();
// Delete group
int rowsDeleted = db.delete(LoyaltyCardDbGroups.TABLE,
LoyaltyCardDbGroups.ID + " = ? ",
new String[]{groupName});
// And delete lookup table entries associated with this group
db.delete(LoyaltyCardDbIdsGroups.TABLE,
LoyaltyCardDbIdsGroups.groupID + " = ? ",
new String[]{groupName});
return (rowsDeleted == 1);
}
public int getGroupCardCount(final String groupName)
{
SQLiteDatabase db = getReadableDatabase();
Cursor data = db.rawQuery("SELECT Count(*) FROM " + LoyaltyCardDbIdsGroups.TABLE +
" where " + LoyaltyCardDbIdsGroups.groupID + "=?",
new String[]{groupName});
int numItems = 0;
if(data.getCount() == 1)
{
data.moveToFirst();
numItems = data.getInt(0);
}
data.close();
return numItems;
}
}

View File

@@ -0,0 +1,20 @@
package protect.card_locker;
import android.database.Cursor;
public class Group
{
public final String _id;
public Group(final String _id)
{
this._id = _id;
}
public static Group toGroup(Cursor cursor)
{
String _id = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbGroups.ID));
return new Group(_id);
}
}

View File

@@ -0,0 +1,56 @@
package protect.card_locker;
import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;
import protect.card_locker.preferences.Settings;
class GroupCursorAdapter extends CursorAdapter
{
Settings settings;
DBHelper db;
public GroupCursorAdapter(Context context, Cursor cursor)
{
super(context, cursor, 0);
settings = new Settings(context);
db = new DBHelper(context);
}
// The newView method is used to inflate a new view and return it,
// you don't bind any data to the view at this point.
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
return LayoutInflater.from(context).inflate(R.layout.group_layout, parent, false);
}
// The bindView method is used to bind all data to a given view
// such as setting the text on a TextView.
@Override
public void bindView(View view, Context context, Cursor cursor)
{
// Find fields to populate in inflated template
TextView nameField = view.findViewById(R.id.name);
TextView countField = view.findViewById(R.id.cardCount);
// Extract properties from cursor
Group group = Group.toGroup(cursor);
Integer groupCardCount = db.getGroupCardCount(group._id);
// Populate fields with extracted properties
nameField.setText(group._id);
countField.setText(context.getResources().getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount));
nameField.setTextSize(settings.getCardTitleListFontSize());
countField.setTextSize(settings.getCardNoteListFontSize());
}
}

View File

@@ -100,14 +100,6 @@ public class ImportExportActivity extends AppCompatActivity
}
});
if(isCallable(getApplicationContext(), intentGetContentAction) == false)
{
findViewById(R.id.dividerImportFilesystem).setVisibility(View.GONE);
findViewById(R.id.importOptionFilesystemTitle).setVisibility(View.GONE);
findViewById(R.id.importOptionFilesystemExplanation).setVisibility(View.GONE);
importFilesystem.setVisibility(View.GONE);
}
// Check that there is an app that data can be imported from
final Intent intentPickAction = new Intent(Intent.ACTION_PICK);
@@ -120,14 +112,6 @@ public class ImportExportActivity extends AppCompatActivity
chooseFileWithIntent(intentPickAction, CHOOSE_EXPORTED_FILE);
}
});
if(isCallable(getApplicationContext(), intentPickAction) == false)
{
findViewById(R.id.dividerImportApplication).setVisibility(View.GONE);
findViewById(R.id.importOptionApplicationTitle).setVisibility(View.GONE);
findViewById(R.id.importOptionApplicationExplanation).setVisibility(View.GONE);
importApplication.setVisibility(View.GONE);
}
}
private void startImport(final InputStream target, final Uri targetUri)
@@ -295,31 +279,6 @@ public class ImportExportActivity extends AppCompatActivity
builder.create().show();
}
/**
* Determines if there is at least one activity that can perform the given intent
*/
private boolean isCallable(Context context, final Intent intent)
{
PackageManager manager = context.getPackageManager();
if(manager == null)
{
return false;
}
List<ResolveInfo> list = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for(ResolveInfo info : list)
{
if(info.activityInfo.exported)
{
// There is one activity which is available to be called
return true;
}
}
return false;
}
private void chooseFileWithIntent(Intent intent, int requestCode)
{
try
@@ -328,6 +287,7 @@ public class ImportExportActivity extends AppCompatActivity
}
catch (ActivityNotFoundException e)
{
Toast.makeText(getApplicationContext(), R.string.failedOpeningFileManager, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}

View File

@@ -10,8 +10,8 @@ public class ImportURIHelper {
private static final String NOTE = DBHelper.LoyaltyCardDbIds.NOTE;
private static final String CARD_ID = DBHelper.LoyaltyCardDbIds.CARD_ID;
private static final String BARCODE_TYPE = DBHelper.LoyaltyCardDbIds.BARCODE_TYPE;
private static final String HEADER_COLOR = DBHelper.LoyaltyCardDbIds.HEADER_COLOR;
private static final String HEADER_TEXT_COLOR = DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR;
private final Context context;
private final String host;
@@ -47,17 +47,15 @@ public class ImportURIHelper {
String note = uri.getQueryParameter(NOTE);
String cardId = uri.getQueryParameter(CARD_ID);
String barcodeType = uri.getQueryParameter(BARCODE_TYPE);
if (store == null || note == null || cardId == null || barcodeType == null) throw new InvalidObjectException("Not a valid import URI");
String unparsedHeaderColor = uri.getQueryParameter(HEADER_COLOR);
if(unparsedHeaderColor != null)
{
headerColor = Integer.parseInt(unparsedHeaderColor);
}
String unparsedHeaderTextColor = uri.getQueryParameter(HEADER_TEXT_COLOR);
if(unparsedHeaderTextColor != null)
{
headerTextColor = Integer.parseInt(unparsedHeaderTextColor);
}
return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor);
return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor, 0);
} catch (NullPointerException | NumberFormatException ex) {
throw new InvalidObjectException("Not a valid import URI");
}
@@ -77,11 +75,7 @@ public class ImportURIHelper {
{
uriBuilder.appendQueryParameter(HEADER_COLOR, loyaltyCard.headerColor.toString());
}
if(loyaltyCard.headerTextColor != null)
{
uriBuilder.appendQueryParameter(HEADER_TEXT_COLOR, loyaltyCard.headerTextColor.toString());
}
//StarStatus will not be exported
return uriBuilder.build();
}

View File

@@ -1,6 +1,7 @@
package protect.card_locker;
import android.database.Cursor;
import androidx.annotation.Nullable;
public class LoyaltyCard
@@ -17,8 +18,11 @@ public class LoyaltyCard
@Nullable
public final Integer headerTextColor;
public final int starStatus;
public LoyaltyCard(final int id, final String store, final String note, final String cardId,
final String barcodeType, final Integer headerColor, final Integer headerTextColor)
final String barcodeType, final Integer headerColor, final Integer headerTextColor,
final int starStatus)
{
this.id = id;
this.store = store;
@@ -27,6 +31,7 @@ public class LoyaltyCard
this.barcodeType = barcodeType;
this.headerColor = headerColor;
this.headerTextColor = headerTextColor;
this.starStatus = starStatus;
}
public static LoyaltyCard toLoyaltyCard(Cursor cursor)
@@ -36,6 +41,8 @@ public class LoyaltyCard
String note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE));
String cardId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID));
String barcodeType = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE));
int starred = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS));
int headerColorColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR);
int headerTextColorColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR);
@@ -53,6 +60,6 @@ public class LoyaltyCard
headerTextColor = cursor.getInt(headerTextColorColumn);
}
return new LoyaltyCard(id, store, note, cardId, barcodeType, headerColor, headerTextColor);
return new LoyaltyCard(id, store, note, cardId, barcodeType, headerColor, headerTextColor, starred);
}
}

View File

@@ -2,13 +2,14 @@ package protect.card_locker;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import protect.card_locker.preferences.Settings;
class LoyaltyCardCursorAdapter extends CursorAdapter
@@ -36,8 +37,9 @@ class LoyaltyCardCursorAdapter extends CursorAdapter
{
// Find fields to populate in inflated template
ImageView thumbnail = view.findViewById(R.id.thumbnail);
TextView storeField = (TextView) view.findViewById(R.id.store);
TextView noteField = (TextView) view.findViewById(R.id.note);
TextView storeField = view.findViewById(R.id.store);
TextView noteField = view.findViewById(R.id.note);
ImageView star = view.findViewById(R.id.star);
// Extract properties from cursor
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor);
@@ -47,7 +49,7 @@ class LoyaltyCardCursorAdapter extends CursorAdapter
storeField.setTextSize(settings.getCardTitleListFontSize());
if(loyaltyCard.note.isEmpty() == false)
if(!loyaltyCard.note.isEmpty())
{
noteField.setVisibility(View.VISIBLE);
noteField.setText(loyaltyCard.note);
@@ -58,13 +60,9 @@ class LoyaltyCardCursorAdapter extends CursorAdapter
noteField.setVisibility(View.GONE);
}
int tileLetterFontSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterFontSize);
int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.cardThumbnailSize);
if (loyaltyCard.starStatus!=0) star.setVisibility(View.VISIBLE);
else star.setVisibility(View.GONE);
Integer letterBackgroundColor = loyaltyCard.headerColor;
Integer letterTextColor = loyaltyCard.headerTextColor;
LetterBitmap letterBitmap = new LetterBitmap(context, loyaltyCard.store, loyaltyCard.store,
tileLetterFontSize, pixelSize, pixelSize, letterBackgroundColor, letterTextColor);
thumbnail.setImageBitmap(letterBitmap.getLetterTile());
thumbnail.setImageBitmap(Utils.generateIcon(context, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile());
}
}

View File

@@ -9,17 +9,25 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
@@ -33,45 +41,51 @@ import com.jaredrummler.android.colorpicker.ColorPickerDialog;
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener;
import java.io.InvalidObjectException;
import java.util.ArrayList;
import java.util.List;
public class LoyaltyCardEditActivity extends AppCompatActivity
{
private static final String TAG = "Catima";
protected static final String NO_BARCODE = "_NO_BARCODE_";
protected static final int SELECT_BARCODE_REQUEST = 1;
ImageView thumbnail;
EditText storeFieldEdit;
EditText noteFieldEdit;
ImageView headingColorSample;
Button headingColorSelectButton;
ImageView headingStoreTextColorSample;
Button headingStoreTextColorSelectButton;
ChipGroup groupsChips;
View cardAndBarcodeLayout;
TextView cardIdFieldView;
View cardIdDivider;
View cardIdTableRow;
TextView barcodeTypeField;
View barcodeTypeView;
AutoCompleteTextView barcodeTypeField;
ImageView barcodeImage;
View barcodeImageLayout;
View barcodeCaptureLayout;
Button captureButton;
Button enterButton;
int loyaltyCardId;
boolean updateLoyaltyCard;
String barcodeType;
String cardId;
Uri importLoyaltyCardUri = null;
Integer headingColorValue = null;
Integer headingStoreTextColorValue = null;
DBHelper db;
ImportURIHelper importUriHelper;
boolean hasChanged = false;
boolean initDone = false;
AlertDialog confirmExitDialog = null;
private void extractIntentFields(Intent intent)
{
final Bundle b = intent.getExtras();
loyaltyCardId = b != null ? b.getInt("id") : 0;
updateLoyaltyCard = b != null && b.getBoolean("update", false);
barcodeType = b != null ? b.getString("barcodeType") : null;
cardId = b != null ? b.getString("cardId") : null;
importLoyaltyCardUri = intent.getData();
Log.d(TAG, "View activity: id=" + loyaltyCardId
@@ -97,22 +111,78 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
db = new DBHelper(this);
importUriHelper = new ImportURIHelper(this);
thumbnail = findViewById(R.id.thumbnail);
storeFieldEdit = findViewById(R.id.storeNameEdit);
noteFieldEdit = findViewById(R.id.noteEdit);
headingColorSample = findViewById(R.id.headingColorSample);
headingColorSelectButton = findViewById(R.id.headingColorSelectButton);
headingStoreTextColorSample = findViewById(R.id.headingStoreTextColorSample);
headingStoreTextColorSelectButton = findViewById(R.id.headingStoreTextColorSelectButton);
groupsChips = findViewById(R.id.groupChips);
cardAndBarcodeLayout = findViewById(R.id.cardAndBarcodeLayout);
cardIdFieldView = findViewById(R.id.cardIdView);
cardIdDivider = findViewById(R.id.cardIdDivider);
cardIdTableRow = findViewById(R.id.cardIdTableRow);
barcodeTypeField = findViewById(R.id.barcodeTypeView);
barcodeTypeView = findViewById(R.id.barcodeTypeView);
barcodeTypeField = findViewById(R.id.barcodeTypeField);
barcodeImage = findViewById(R.id.barcode);
barcodeImageLayout = findViewById(R.id.barcodeLayout);
barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout);
captureButton = findViewById(R.id.captureButton);
enterButton = findViewById(R.id.enterButton);
storeFieldEdit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
generateIcon(s.toString());
}
@Override
public void afterTextChanged(Editable s) { }
});
cardIdFieldView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
String formatString = barcodeTypeField.getText().toString();
if (!formatString.isEmpty()) {
if (formatString.equals(getString(R.string.noBarcode))) {
hideBarcode();
} else {
generateBarcode(s.toString(), BarcodeFormat.valueOf(formatString));
}
}
}
@Override
public void afterTextChanged(Editable s) { }
});
barcodeTypeField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
if (!s.toString().isEmpty()) {
if (s.toString().equals(getString(R.string.noBarcode))) {
hideBarcode();
} else {
generateBarcode(cardIdFieldView.getText().toString(), BarcodeFormat.valueOf(s.toString()));
}
}
}
@Override
public void afterTextChanged(Editable s) { }
});
}
@Override
@@ -165,7 +235,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
if(barcodeTypeField.getText().length() == 0)
{
barcodeTypeField.setText(loyaltyCard.barcodeType.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : loyaltyCard.barcodeType);
barcodeTypeField.setText(loyaltyCard.barcodeType.isEmpty() ? getString(R.string.noBarcode) : loyaltyCard.barcodeType);
}
if(headingColorValue == null)
@@ -177,15 +247,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
}
if(headingStoreTextColorValue == null)
{
headingStoreTextColorValue = loyaltyCard.headerTextColor;
if(headingStoreTextColorValue == null)
{
headingStoreTextColorValue = Color.WHITE;
}
}
setTitle(R.string.editCardTitle);
}
else if(importLoyaltyCardUri != null)
@@ -205,7 +266,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
cardIdFieldView.setText(importCard.cardId);
barcodeTypeField.setText(importCard.barcodeType);
headingColorValue = importCard.headerColor;
headingStoreTextColorValue = importCard.headerTextColor;
}
else
{
@@ -213,6 +273,43 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
hideBarcode();
}
if(groupsChips.getChildCount() == 0)
{
List<Group> existingGroups = db.getGroups();
List<Group> loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId);
if (existingGroups.isEmpty()) {
groupsChips.setVisibility(View.GONE);
} else {
groupsChips.setVisibility(View.VISIBLE);
}
for (Group group : db.getGroups()) {
Chip chip = (Chip) getLayoutInflater().inflate(R.layout.layout_chip_choice, groupsChips, false);
chip.setText(group._id);
chip.setTag(group);
chip.setChecked(false);
for (Group loyaltyCardGroup : loyaltyCardGroups) {
if (loyaltyCardGroup._id.equals(group._id)) {
chip.setChecked(true);
break;
}
}
chip.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
hasChanged = true;
return false;
}
});
groupsChips.addView(chip);
}
}
if(headingColorValue == null)
{
// Select a random color to start out with.
@@ -222,110 +319,47 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
colors.recycle();
}
if(headingStoreTextColorValue == null) {
headingStoreTextColorValue = Color.WHITE;
thumbnail.setOnClickListener(new ColorSelectListener(headingColorValue));
if (!initDone) {
hasChanged = false;
initDone = true;
}
headingColorSample.setBackgroundColor(headingColorValue);
headingStoreTextColorSample.setBackgroundColor(headingStoreTextColorValue);
headingColorSelectButton.setOnClickListener(new ColorSelectListener(headingColorValue, true));
headingStoreTextColorSelectButton.setOnClickListener(new ColorSelectListener(headingStoreTextColorValue, false));
// Update from intent
if (barcodeType != null) {
barcodeTypeField.setText(barcodeType.isEmpty() ? getString(R.string.noBarcode) : barcodeType);
barcodeType = null;
}
if (cardId != null) {
cardIdFieldView.setText(cardId);
cardId = null;
}
if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0)
{
if(barcodeTypeField.getText().toString().equals(NO_BARCODE))
String formatString = barcodeTypeField.getText().toString();
if(formatString.isEmpty() || formatString.equals(getString(R.string.noBarcode)))
{
hideBarcode();
}
else
{
String formatString = barcodeTypeField.getText().toString();
final BarcodeFormat format = BarcodeFormat.valueOf(formatString);
final String cardIdString = cardIdFieldView.getText().toString();
if(barcodeImage.getHeight() == 0)
{
Log.d(TAG, "ImageView size is not known known at start, waiting for load");
// The size of the ImageView is not yet available as it has not
// yet been drawn. Wait for it to be drawn so the size is available.
barcodeImage.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
if (Build.VERSION.SDK_INT < 16)
{
barcodeImage.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
else
{
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
Log.d(TAG, "ImageView size now known");
new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
}
});
}
else
{
Log.d(TAG, "ImageView size known known, creating barcode");
new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
}
showBarcode();
generateBarcode(cardIdString, format);
}
}
View.OnClickListener captureCallback = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
IntentIntegrator integrator = new IntentIntegrator(LoyaltyCardEditActivity.this);
integrator.setDesiredBarcodeFormats(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES);
enterButton.setOnClickListener(new EditCardIdAndBarcode());
barcodeImage.setOnClickListener(new EditCardIdAndBarcode());
String prompt = getResources().getString(R.string.scanCardBarcode);
integrator.setPrompt(prompt);
integrator.setBeepEnabled(false);
integrator.initiateScan();
}
};
captureButton.setOnClickListener(captureCallback);
enterButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent i = new Intent(getApplicationContext(), BarcodeSelectorActivity.class);
String cardId = cardIdFieldView.getText().toString();
if(cardId.length() > 0)
{
final Bundle b = new Bundle();
b.putString("initialCardId", cardId);
i.putExtras(b);
}
startActivityForResult(i, SELECT_BARCODE_REQUEST);
}
});
if(cardIdFieldView.getText().length() > 0)
{
cardIdDivider.setVisibility(View.VISIBLE);
cardIdTableRow.setVisibility(View.VISIBLE);
enterButton.setText(R.string.editCard);
}
else
{
cardIdDivider.setVisibility(View.GONE);
cardIdTableRow.setVisibility(View.GONE);
enterButton.setText(R.string.enterCard);
}
ArrayList<String> barcodeList = new ArrayList<>(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES);
barcodeList.add(0, getString(R.string.noBarcode));
ArrayAdapter<String> barcodeAdapter = new ArrayAdapter<>(this, android.R.layout.select_dialog_item, barcodeList);
barcodeTypeField.setAdapter(barcodeAdapter);
FloatingActionButton saveButton = findViewById(R.id.fabSave);
saveButton.setOnClickListener(new View.OnClickListener() {
@@ -334,17 +368,59 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
doSave();
}
});
generateIcon(storeFieldEdit.getText().toString());
}
@Override
public void onBackPressed() {
askBeforeQuitIfChanged();
}
private void askBeforeQuitIfChanged() {
if (!hasChanged) {
finish();
return;
}
if (confirmExitDialog == null) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.leaveWithoutSaveTitle);
builder.setMessage(R.string.leaveWithoutSaveConfirmation);
builder.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
dialog.dismiss();
}
});
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
confirmExitDialog = builder.create();
}
confirmExitDialog.show();
}
class EditCardIdAndBarcode implements View.OnClickListener
{
@Override
public void onClick(View v)
{
Utils.createSetBarcodeDialog(LoyaltyCardEditActivity.this, LoyaltyCardEditActivity.this, true, cardIdFieldView.getText().toString());
}
}
class ColorSelectListener implements View.OnClickListener
{
final int defaultColor;
final boolean isBackgroundColor;
ColorSelectListener(int defaultColor, boolean isBackgroundColor)
ColorSelectListener(int defaultColor)
{
this.defaultColor = defaultColor;
this.isBackgroundColor = isBackgroundColor;
}
@Override
@@ -356,16 +432,11 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
@Override
public void onColorSelected(int dialogId, int color)
{
if(isBackgroundColor)
{
headingColorSample.setBackgroundColor(color);
headingColorValue = color;
}
else
{
headingStoreTextColorSample.setBackgroundColor(color);
headingStoreTextColorValue = color;
}
hasChanged = true;
headingColorValue = color;
generateIcon(storeFieldEdit.getText().toString());
}
@Override
@@ -387,7 +458,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
// We do not want to save the no barcode string to the database
// it is simply an empty there for no barcode
if(barcodeType.equals(NO_BARCODE))
if(barcodeType.equals(getString(R.string.noBarcode)))
{
barcodeType = "";
}
@@ -404,16 +475,25 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
return;
}
List<Group> selectedGroups = new ArrayList<>();
for (Integer chipId : groupsChips.getCheckedChipIds()) {
Chip chip = groupsChips.findViewById(chipId);
selectedGroups.add((Group) chip.getTag());
}
if(updateLoyaltyCard)
{
db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType, headingColorValue, headingStoreTextColorValue);
{ //update of "starStatus" not necessary, since it cannot be changed in this activity (only in ViewActivity)
db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType, headingColorValue);
Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId);
}
else
{
loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType, headingColorValue, headingStoreTextColorValue);
loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType, headingColorValue, 0);
}
db.setLoyaltyCardGroups(loyaltyCardId, selectedGroups);
finish();
}
@@ -440,7 +520,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
switch(id)
{
case android.R.id.home:
finish();
askBeforeQuitIfChanged();
break;
case R.id.action_delete:
@@ -485,50 +565,60 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
{
super.onActivityResult(requestCode, resultCode, intent);
String contents = null;
String format = null;
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent);
IntentResult result =
IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (result != null)
{
Log.i(TAG, "Received barcode information from capture");
contents = result.getContents();
format = result.getFormatName();
}
barcodeType = barcodeValues.format();
cardId = barcodeValues.content();
if(requestCode == SELECT_BARCODE_REQUEST && resultCode == Activity.RESULT_OK)
{
Log.i(TAG, "Received barcode information from typing it");
contents = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_CONTENTS);
format = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_FORMAT);
}
if(contents != null && contents.isEmpty() == false &&
format != null)
{
Log.i(TAG, "Read barcode id: " + contents);
Log.i(TAG, "Read format: " + format);
TextView cardIdView = findViewById(R.id.cardIdView);
cardIdView.setText(contents);
// Set special NO_BARCODE value to prevent onResume from overwriting it
barcodeTypeField.setText(format.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : format);
onResume();
}
onResume();
}
private void showBarcode() {
barcodeImageLayout.setVisibility(View.VISIBLE);
findViewById(R.id.barcodeTypeDivider).setVisibility(View.VISIBLE);
findViewById(R.id.barcodeTypeTableRow).setVisibility(View.VISIBLE);
}
private void hideBarcode() {
barcodeImageLayout.setVisibility(View.GONE);
findViewById(R.id.barcodeTypeDivider).setVisibility(View.GONE);
findViewById(R.id.barcodeTypeTableRow).setVisibility(View.GONE);
}
private void generateBarcode(final String cardId, final BarcodeFormat barcodeFormat) {
if (barcodeImage.getHeight() == 0) {
Log.d(TAG, "ImageView size is not known known at start, waiting for load");
// The size of the ImageView is not yet available as it has not
// yet been drawn. Wait for it to be drawn so the size is available.
barcodeImage.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known");
new BarcodeImageWriterTask(barcodeImage, cardId, barcodeFormat).execute();
}
});
} else {
Log.d(TAG, "ImageView size known known, creating barcode");
new BarcodeImageWriterTask(barcodeImage, cardId, barcodeFormat).execute();
}
showBarcode();
}
private void generateIcon(String store) {
if (headingColorValue == null) {
return;
}
thumbnail.setBackgroundColor(headingColorValue);
LetterBitmap letterBitmap = Utils.generateIcon(this, store, headingColorValue);
if (letterBitmap != null) {
thumbnail.setImageBitmap(letterBitmap.getLetterTile());
} else {
thumbnail.setImageBitmap(null);
}
thumbnail.setMinimumWidth(thumbnail.getHeight());
}
}

View File

@@ -1,6 +1,5 @@
package protect.card_locker;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
@@ -8,8 +7,8 @@ import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.TextViewCompat;
import androidx.appcompat.app.ActionBar;
@@ -29,20 +28,23 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.zxing.BarcodeFormat;
import protect.card_locker.preferences.Settings;
import java.util.List;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardViewActivity extends AppCompatActivity
{
private static final String TAG = "Catima";
private static final double LUMINANCE_MIDPOINT = 0.5;
TextView cardIdFieldView;
View bottomSheet;
ImageView bottomSheetButton;
TextView noteView;
View noteViewDivider;
TextView groupsView;
TextView storeName;
ImageView barcodeImage;
View collapsingToolbarLayout;
@@ -56,6 +58,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
String cardIdString;
BarcodeFormat format;
boolean starred;
boolean backgroundNeedsDarkIcons;
boolean barcodeIsFullscreen = false;
ViewGroup.LayoutParams barcodeImageState;
@@ -106,8 +109,10 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
importURIHelper = new ImportURIHelper(this);
cardIdFieldView = findViewById(R.id.cardIdView);
bottomSheet = findViewById(R.id.bottom_sheet);
bottomSheetButton = findViewById(R.id.bottomSheetButton);
noteView = findViewById(R.id.noteView);
noteViewDivider = findViewById(R.id.noteViewDivider);
groupsView = findViewById(R.id.groupsView);
storeName = findViewById(R.id.storeName);
barcodeImage = findViewById(R.id.barcode);
collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout);
@@ -128,6 +133,50 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
}
}
});
final FloatingActionButton editButton = findViewById(R.id.fabEdit);
editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("id", loyaltyCardId);
bundle.putBoolean("update", true);
intent.putExtras(bundle);
startActivity(intent);
finish();
}
});
final BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_DRAGGING) {
editButton.hide();
} else if (newState == BottomSheetBehavior.STATE_EXPANDED) {
bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24);
editButton.hide();
} else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
bottomSheetButton.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24);
editButton.show();
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) { }
});
bottomSheetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
} else {
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
}
});
}
@Override
@@ -186,31 +235,42 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
if(loyaltyCard.note.length() > 0)
{
noteView.setVisibility(View.VISIBLE);
noteView.setText(loyaltyCard.note);
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(noteView,
getResources().getInteger(R.integer.settings_card_note_min_font_size_sp)-1,
settings.getCardNoteFontSize(), 1, TypedValue.COMPLEX_UNIT_SP);
}
else
{
noteView.setVisibility(View.GONE);
noteViewDivider.setVisibility(View.GONE);
}
List<Group> loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId);
if(loyaltyCardGroups.size() > 0) {
StringBuilder groupsString = new StringBuilder();
for (Group group : loyaltyCardGroups) {
groupsString.append(group._id);
groupsString.append(" ");
}
groupsView.setVisibility(View.VISIBLE);
groupsView.setText(getString(R.string.groupsList, groupsString.toString()));
}
else
{
groupsView.setVisibility(View.GONE);
}
if (noteView.getVisibility() == View.VISIBLE || groupsView.getVisibility() == View.VISIBLE) {
bottomSheet.setVisibility(View.VISIBLE);
}
else
{
bottomSheet.setVisibility(View.GONE);
}
storeName.setText(loyaltyCard.store);
storeName.setTextSize(settings.getCardTitleFontSize());
int textColor;
if(loyaltyCard.headerTextColor != null)
{
textColor = loyaltyCard.headerTextColor;
}
else
{
textColor = Color.WHITE;
}
storeName.setTextColor(textColor);
int backgroundHeaderColor;
if(loyaltyCard.headerColor != null)
{
@@ -223,8 +283,19 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
collapsingToolbarLayout.setBackgroundColor(backgroundHeaderColor);
int textColor;
if(Utils.needsDarkForeground(backgroundHeaderColor))
{
textColor = Color.BLACK;
}
else
{
textColor = Color.WHITE;
}
storeName.setTextColor(textColor);
// If the background is very bright, we should use dark icons
backgroundNeedsDarkIcons = (ColorUtils.calculateLuminance(backgroundHeaderColor) > LUMINANCE_MIDPOINT);
backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
@@ -275,20 +346,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
{
findViewById(R.id.barcode).setVisibility(View.GONE);
}
FloatingActionButton editButton = findViewById(R.id.fabEdit);
editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("id", loyaltyCardId);
bundle.putBoolean("update", true);
intent.putExtras(bundle);
startActivity(intent);
finish();
}
});
}
@Override
@@ -317,11 +374,29 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
item.setVisible(false);
}
loyaltyCard = db.getLoyaltyCard(loyaltyCardId);
starred = loyaltyCard.starStatus != 0;
menu.findItem(R.id.action_share).setIcon(getIcon(R.drawable.ic_share_white, backgroundNeedsDarkIcons));
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (starred) {
menu.findItem(R.id.action_star_unstar).setIcon(getIcon(R.drawable.ic_starred_white, backgroundNeedsDarkIcons));
menu.findItem(R.id.action_star_unstar).setTitle(R.string.unstar);
}
else {
menu.findItem(R.id.action_star_unstar).setIcon(getIcon(R.drawable.ic_unstarred_white, backgroundNeedsDarkIcons));
menu.findItem(R.id.action_star_unstar).setTitle(R.string.star);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
@@ -348,11 +423,18 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
}
rotationEnabled = !rotationEnabled;
return true;
case R.id.action_star_unstar:
starred = !starred;
db.updateLoyaltyCardStarStatus(loyaltyCardId, starred ? 1 : 0);
invalidateOptionsMenu();
return true;
}
return super.onOptionsItemSelected(item);
}
private void setOrientatonLock(MenuItem item, boolean lock)
{
if(lock)
@@ -366,7 +448,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
{
item.setIcon(getIcon(R.drawable.ic_lock_open_white_24dp, backgroundNeedsDarkIcons));
item.setTitle(R.string.lockScreen);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}

View File

@@ -1,49 +1,48 @@
package protect.card_locker;
import android.app.AlertDialog;
import android.app.SearchManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ClipboardManager;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.database.Cursor;
import android.os.Bundle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import android.util.Log;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.common.collect.ImmutableMap;
import java.util.Calendar;
import java.util.Map;
import com.google.android.material.tabs.TabLayout;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import java.util.List;
import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends AppCompatActivity
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener
{
private static final String TAG = "Catima";
private static final int MAIN_REQUEST_CODE = 1;
private Menu menu;
private GestureDetector gestureDetector;
protected String filter = "";
protected int selectedTab = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
@@ -53,7 +52,51 @@ public class MainActivity extends AppCompatActivity
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
updateLoyaltyCardList("");
updateLoyaltyCardList(filter, null);
TabLayout groupsTabLayout = findViewById(R.id.groups);
groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
selectedTab = tab.getPosition();
updateLoyaltyCardList(filter, tab.getTag());
// Store active tab in Shared Preference to restore next app launch
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
Context.MODE_PRIVATE);
SharedPreferences.Editor activeTabPrefEditor = activeTabPref.edit();
activeTabPrefEditor.putInt(getString(R.string.sharedpreference_active_tab), selectedTab);
activeTabPrefEditor.apply();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
gestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(final View v, final MotionEvent event){
return gestureDetector.onTouchEvent(event);
}
};
final View helpText = findViewById(R.id.helpText);
final View noMatchingCardsText = findViewById(R.id.noMatchingCardsText);
final View list = findViewById(R.id.list);
helpText.setOnTouchListener(gestureTouchListener);
noMatchingCardsText.setOnTouchListener(gestureTouchListener);
list.setOnTouchListener(gestureTouchListener);
}
@Override
@@ -69,24 +112,45 @@ public class MainActivity extends AppCompatActivity
}
}
updateLoyaltyCardList(filter);
// Start of active tab logic
TabLayout groupsTabLayout = findViewById(R.id.groups);
updateTabGroups(groupsTabLayout);
// Restore active tab from Shared Preference
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
Context.MODE_PRIVATE);
selectedTab = activeTabPref.getInt(getString(R.string.sharedpreference_active_tab), 0);
Object group = null;
if (groupsTabLayout.getTabCount() != 0) {
TabLayout.Tab tab = groupsTabLayout.getTabAt(0);
if (selectedTab < groupsTabLayout.getTabCount()) {
tab = groupsTabLayout.getTabAt(selectedTab);
}
groupsTabLayout.selectTab(tab);
group = tab.getTag();
}
updateLoyaltyCardList(filter, group);
// End of active tab logic
FloatingActionButton addButton = findViewById(R.id.fabAdd);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
startActivityForResult(i, MAIN_REQUEST_CODE);
Utils.createSetBarcodeDialog(MainActivity.this, MainActivity.this, false, null);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == MAIN_REQUEST_CODE)
{
if (requestCode == Utils.MAIN_REQUEST) {
// We're coming back from another view so clear the search
// We only do this now to prevent a flash of all entries right after picking one
filter = "";
@@ -98,6 +162,19 @@ public class MainActivity extends AppCompatActivity
// In case the theme changed
recreate();
return;
}
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent);
if(!barcodeValues.isEmpty()) {
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString("barcodeType", barcodeValues.format());
newBundle.putString("cardId", barcodeValues.content());
newIntent.putExtras(newBundle);
startActivity(newIntent);
}
}
@@ -114,17 +191,31 @@ public class MainActivity extends AppCompatActivity
if (!searchView.isIconified()) {
searchView.setIconified(true);
} else {
super.onBackPressed();
TabLayout groupsTabLayout = findViewById(R.id.groups);
if (groupsTabLayout.getVisibility() == View.VISIBLE && selectedTab != 0) {
selectedTab = 0;
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(0));
} else {
super.onBackPressed();
}
}
}
private void updateLoyaltyCardList(String filterText)
private void updateLoyaltyCardList(String filterText, Object tag)
{
Group group = null;
if (tag != null) {
group = (Group) tag;
}
final ListView cardList = findViewById(R.id.list);
final TextView helpText = findViewById(R.id.helpText);
final TextView noMatchingCardsText = findViewById(R.id.noMatchingCardsText);
final DBHelper db = new DBHelper(this);
Cursor cardCursor = db.getLoyaltyCardCursor(filterText, group);
if(db.getLoyaltyCardCount() > 0)
{
// We want the cardList to be visible regardless of the filtered match count
@@ -132,7 +223,7 @@ public class MainActivity extends AppCompatActivity
// the keyboard
cardList.setVisibility(View.VISIBLE);
helpText.setVisibility(View.GONE);
if(db.getLoyaltyCardCount(filterText) > 0)
if(cardCursor.getCount() > 0)
{
noMatchingCardsText.setVisibility(View.GONE);
}
@@ -148,8 +239,6 @@ public class MainActivity extends AppCompatActivity
noMatchingCardsText.setVisibility(View.GONE);
}
Cursor cardCursor = db.getLoyaltyCardCursor(filterText);
final LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(this, cardCursor);
cardList.setAdapter(adapter);
@@ -171,11 +260,40 @@ public class MainActivity extends AppCompatActivity
ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard, i);
startActivityForResult(i, MAIN_REQUEST_CODE);
startActivityForResult(i, Utils.MAIN_REQUEST);
}
});
}
public void updateTabGroups(TabLayout groupsTabLayout)
{
final DBHelper db = new DBHelper(this);
List<Group> newGroups = db.getGroups();
if (newGroups.size() == 0) {
groupsTabLayout.removeAllTabs();
groupsTabLayout.setVisibility(View.GONE);
return;
}
groupsTabLayout.removeAllTabs();
TabLayout.Tab allTab = groupsTabLayout.newTab();
allTab.setText(R.string.all);
allTab.setTag(null);
groupsTabLayout.addTab(allTab, false);
for (Group group : newGroups) {
TabLayout.Tab tab = groupsTabLayout.newTab();
tab.setText(group._id);
tab.setTag(group);
groupsTabLayout.addTab(tab, false);
}
groupsTabLayout.setVisibility(View.VISIBLE);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
{
@@ -196,23 +314,20 @@ public class MainActivity extends AppCompatActivity
Cursor cardCursor = (Cursor)listView.getItemAtPosition(info.position);
LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor);
if(card != null)
if(item.getItemId() == R.id.action_clipboard)
{
if(item.getItemId() == R.id.action_clipboard)
{
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(card.store, card.cardId);
clipboard.setPrimaryClip(clip);
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(card.store, card.cardId);
clipboard.setPrimaryClip(clip);
Toast.makeText(this, R.string.copy_to_clipboard_toast, Toast.LENGTH_LONG).show();
return true;
}
else if(item.getItemId() == R.id.action_share)
{
final ImportURIHelper importURIHelper = new ImportURIHelper(this);
importURIHelper.startShareIntent(card);
return true;
}
Toast.makeText(this, R.string.copy_to_clipboard_toast, Toast.LENGTH_LONG).show();
return true;
}
else if(item.getItemId() == R.id.action_share)
{
final ImportURIHelper importURIHelper = new ImportURIHelper(this);
importURIHelper.startShareIntent(card);
return true;
}
return super.onContextItemSelected(item);
@@ -248,7 +363,10 @@ public class MainActivity extends AppCompatActivity
@Override
public boolean onQueryTextChange(String newText) {
filter = newText;
updateLoyaltyCardList(newText);
TabLayout groupsTabLayout = findViewById(R.id.groups);
updateLoyaltyCardList(newText, groupsTabLayout.getTabCount() > 0 ? groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition()).getTag() : null);
return true;
}
});
@@ -262,124 +380,111 @@ public class MainActivity extends AppCompatActivity
{
int id = item.getItemId();
if (id == R.id.action_manage_groups)
{
Intent i = new Intent(getApplicationContext(), ManageGroupsActivity.class);
startActivityForResult(i, Utils.MAIN_REQUEST);
return true;
}
if(id == R.id.action_import_export)
{
Intent i = new Intent(getApplicationContext(), ImportExportActivity.class);
startActivityForResult(i, MAIN_REQUEST_CODE);
startActivityForResult(i, Utils.MAIN_REQUEST);
return true;
}
if(id == R.id.action_settings)
{
Intent i = new Intent(getApplicationContext(), SettingsActivity.class);
startActivityForResult(i, MAIN_REQUEST_CODE);
startActivityForResult(i, Utils.MAIN_REQUEST);
return true;
}
if(id == R.id.action_about)
{
displayAboutDialog();
Intent i = new Intent(getApplicationContext(), AboutActivity.class);
startActivityForResult(i, Utils.MAIN_REQUEST);
return true;
}
return super.onOptionsItemSelected(item);
}
private void displayAboutDialog()
protected static boolean isDarkModeEnabled(Context inputContext)
{
final Map<String, String> USED_LIBRARIES = new ImmutableMap.Builder<String, String>()
.put("Commons CSV", "https://commons.apache.org/proper/commons-csv/")
.put("Guava", "https://github.com/google/guava")
.put("ZXing", "https://github.com/zxing/zxing")
.put("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded")
.put("AppIntro", "https://github.com/apl-devs/AppIntro")
.put("Color Picker", "https://github.com/jaredrummler/ColorPicker")
.put("VNTNumberPickerPreference", "https://github.com/vanniktech/VNTNumberPickerPreference")
.build();
final Map<String, String> USED_ASSETS = ImmutableMap.of
(
"Save by Bernar Novalyi", "https://thenounproject.com/term/save/716011"
);
StringBuilder libs = new StringBuilder().append("<ul>");
for (Map.Entry<String, String> entry : USED_LIBRARIES.entrySet())
{
libs.append("<li><a href=\"").append(entry.getValue()).append("\">").append(entry.getKey()).append("</a></li>");
}
libs.append("</ul>");
StringBuilder resources = new StringBuilder().append("<ul>");
for (Map.Entry<String, String> entry : USED_ASSETS.entrySet())
{
resources.append("<li><a href=\"").append(entry.getValue()).append("\">").append(entry.getKey()).append("</a></li>");
}
resources.append("</ul>");
String appName = getString(R.string.app_name);
int year = Calendar.getInstance().get(Calendar.YEAR);
String version = "?";
try
{
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
version = pi.versionName;
}
catch (PackageManager.NameNotFoundException e)
{
Log.w(TAG, "Package name not found", e);
}
WebView wv = new WebView(this);
// Set CSS for dark mode if dark mode
String css = "";
Configuration config = getResources().getConfiguration();
Configuration config = inputContext.getResources().getConfiguration();
int currentNightMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK;
if(currentNightMode == Configuration.UI_MODE_NIGHT_YES)
{
css = "<style>body {color:white; background-color:black;}</style>";
return (currentNightMode == Configuration.UI_MODE_NIGHT_YES);
}
@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 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;
}
String html =
"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />" +
css +
"<h1>" +
String.format(getString(R.string.about_title_fmt),
"<a href=\"" + getString(R.string.app_webpage_url)) + "\">" +
appName +
"</a>" +
"</h1><p>" +
appName +
" " +
String.format(getString(R.string.debug_version_fmt), version) +
"</p><p>" +
String.format(getString(R.string.app_revision_fmt),
"<a href=\"" + getString(R.string.app_revision_url) + "\">" +
"GitHub" +
"</a>") +
"</p><hr/><p>" +
String.format(getString(R.string.app_copyright_fmt), year) +
"</p><p>" +
getString(R.string.app_copyright_old) +
"</p><hr/><p>" +
getString(R.string.app_license) +
"</p><hr/><p>" +
String.format(getString(R.string.app_libraries), appName, libs.toString()) +
"</p><hr/><p>" +
String.format(getString(R.string.app_resources), appName, resources.toString());
TabLayout groupsTabLayout = findViewById(R.id.groups);
if (groupsTabLayout.getTabCount() < 2) {
return false;
}
wv.loadDataWithBaseURL("file:///android_res/drawable/", html, "text/html", "utf-8", null);
new AlertDialog.Builder(this)
.setView(wv)
.setCancelable(true)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
})
.show();
Integer currentTab = groupsTabLayout.getSelectedTabPosition();
// Swipe right
if (velocityX < -150) {
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) {
Integer nextTab = currentTab - 1;
if (nextTab < 0) {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(groupsTabLayout.getTabCount() - 1));
} else {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(nextTab));
}
return true;
}
return false;
}
}

View File

@@ -0,0 +1,254 @@
package protect.card_locker;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
public class ManageGroupsActivity extends AppCompatActivity
{
private static final String TAG = "Catima";
private AlertDialog newGroupDialog;
private final DBHelper db = new DBHelper(this);
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.manage_groups_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
newGroupDialog = createNewGroupDialog();
updateGroupList();
}
@Override
protected void onResume() {
super.onResume();
updateGroupList();
FloatingActionButton addButton = findViewById(R.id.fabAdd);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
newGroupDialog.show();
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
private void updateGroupList()
{
final ListView groupList = findViewById(R.id.list);
final TextView helpText = findViewById(R.id.helpText);
final DBHelper db = new DBHelper(this);
if(db.getGroupCount() > 0)
{
groupList.setVisibility(View.VISIBLE);
helpText.setVisibility(View.GONE);
}
else
{
groupList.setVisibility(View.GONE);
helpText.setVisibility(View.VISIBLE);
}
Cursor groupCursor = db.getGroupCursor();
final GroupCursorAdapter adapter = new GroupCursorAdapter(this, groupCursor);
groupList.setAdapter(adapter);
registerForContextMenu(groupList);
}
private void invalidateHomescreenActiveTab()
{
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
Context.MODE_PRIVATE);
SharedPreferences.Editor activeTabPrefEditor = activeTabPref.edit();
activeTabPrefEditor.putInt(getString(R.string.sharedpreference_active_tab), 0);
activeTabPrefEditor.apply();
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
public void moveGroupUp(View view) {
moveGroup(view, true);
}
public void moveGroupDown(View view) {
moveGroup(view, false);
}
public void editGroup(View view) {
final String groupName = getGroupname(view);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.enter_group_name);
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
input.setText(groupName);
builder.setView(input);
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
db.updateGroup(groupName, input.getText().toString());
updateGroupList();
}
});
builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
public void deleteGroup(View view) {
final String groupName = getGroupname(view);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.deleteConfirmationGroup);
builder.setMessage(groupName);
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
db.deleteGroup(groupName);
updateGroupList();
// Delete may change ordering, so invalidate
invalidateHomescreenActiveTab();
}
});
builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
private AlertDialog createNewGroupDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.enter_group_name);
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
db.insertGroup(input.getText().toString());
updateGroupList();
}
});
builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog dialog = builder.create();
return dialog;
}
private String getGroupname(View view) {
LinearLayout parentRow = (LinearLayout) view.getParent().getParent();
TextView groupNameTextView = parentRow.findViewById(R.id.name);
return (String) groupNameTextView.getText();
}
private void moveGroup(View view, boolean up) {
final String groupName = getGroupname(view);
List<Group> groups = db.getGroups();
int currentIndex = -1;
Integer newIndex;
// Get current index in group list
for (int i = 0; i < groups.size(); i++) {
if (groups.get(i)._id.equals(groupName)) {
currentIndex = i;
break;
}
}
if (currentIndex == -1) {
throw new IndexOutOfBoundsException();
}
// Reinsert group in correct position
if (up) {
newIndex = currentIndex - 1;
} else {
newIndex = currentIndex + 1;
}
// Don't try to move out of bounds
if (newIndex < 0 || newIndex >= groups.size()) {
return;
}
Group group = groups.remove(currentIndex);
groups.add(newIndex, group);
// Update database
db.reorderGroups(groups);
// Update UI
updateGroupList();
// Ordering may have changed, so invalidate
invalidateHomescreenActiveTab();
}
}

View File

@@ -0,0 +1,138 @@
package protect.card_locker;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import androidx.core.graphics.ColorUtils;
public class Utils {
private static final String TAG = "Catima";
// Barcode config dialog
private static AlertDialog setBarcodeDialog;
// Activity request codes
public static final int MAIN_REQUEST = 1;
public static final int SELECT_BARCODE_REQUEST = 2;
static final double LUMINANCE_MIDPOINT = 0.5;
static public LetterBitmap generateIcon(Context context, String store, Integer backgroundColor) {
if (store.length() == 0) {
return null;
}
int tileLetterFontSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterFontSize);
int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.cardThumbnailSize);
if (backgroundColor == null) {
backgroundColor = LetterBitmap.getDefaultColor(context, store);
}
return new LetterBitmap(context, store, store,
tileLetterFontSize, pixelSize, pixelSize, backgroundColor, needsDarkForeground(backgroundColor) ? Color.BLACK : Color.WHITE);
}
static public boolean needsDarkForeground(Integer backgroundColor) {
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
}
static public void startCameraBarcodeScan(Context context, Activity activity) {
IntentIntegrator integrator = new IntentIntegrator(activity);
integrator.setDesiredBarcodeFormats(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES);
String prompt = context.getResources().getString(R.string.scanCardBarcode);
integrator.setPrompt(prompt);
integrator.setBeepEnabled(false);
integrator.initiateScan();
}
static public void createSetBarcodeDialog(final Context context, final Activity activity, boolean isUpdate, final String initialCardId) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
// Get the layout inflater
LayoutInflater inflater = activity.getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.dialog_create, null));
if (isUpdate) {
builder.setTitle(context.getString(R.string.editCardTitle));
} else {
builder.setTitle(context.getString(R.string.addCardTitle));
}
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
setBarcodeDialog.cancel();
}
});
setBarcodeDialog = builder.create();
setBarcodeDialog.show();
View addFromCamera = setBarcodeDialog.getWindow().findViewById(R.id.add_from_camera);
View addManually = setBarcodeDialog.getWindow().findViewById(R.id.add_manually);
addFromCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utils.startCameraBarcodeScan(context, activity);
setBarcodeDialog.hide();
}
});
addManually.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(context, BarcodeSelectorActivity.class);
if (initialCardId != null) {
final Bundle b = new Bundle();
b.putString("initialCardId", initialCardId);
i.putExtras(b);
}
activity.startActivityForResult(i, Utils.SELECT_BARCODE_REQUEST);
setBarcodeDialog.hide();
}
});
}
static public BarcodeValues parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent) {
String contents = null;
String format = null;
IntentResult result =
IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (result != null)
{
Log.i(TAG, "Received barcode information from capture");
contents = result.getContents();
format = result.getFormatName();
}
if(requestCode == Utils.SELECT_BARCODE_REQUEST && resultCode == Activity.RESULT_OK)
{
Log.i(TAG, "Received barcode information from typing it");
contents = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_CONTENTS);
format = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_FORMAT);
}
Log.i(TAG, "Read barcode id: " + contents);
Log.i(TAG, "Read format: " + format);
return new BarcodeValues(format, contents);
}
}

View File

@@ -81,11 +81,6 @@ public class Settings
return getInt(R.string.settings_key_card_id_font_size, R.integer.settings_card_id_font_size_sp);
}
public int getCardNoteFontSize()
{
return getInt(R.string.settings_key_card_note_font_size, R.integer.settings_card_note_font_size_sp);
}
public boolean useMaxBrightnessDisplayingBarcode()
{
return getBoolean(R.string.settings_key_display_barcode_max_brightness, true);

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 519 B

After

Width:  |  Height:  |  Size: 368 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 303 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 651 B

After

Width:  |  Height:  |  Size: 466 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 B

After

Width:  |  Height:  |  Size: 606 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 758 B

View File

@@ -0,0 +1,66 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="192dp"
android:height="192dp"
android:viewportWidth="50.8"
android:viewportHeight="50.8">
<path
android:pathData="M14.3354,20.1954l20.7318,-9.2304l5.7612,12.9398l-20.7318,9.2304z"
android:strokeLineJoin="miter"
android:strokeWidth="0.529167"
android:fillColor="#f0f0f0"
android:strokeColor="#c80000"/>
<path
android:pathData="M14.8755,10.9648l23.2041,10.3311l-6.8874,15.4694l-23.2041,-10.3311z"
android:strokeLineJoin="miter"
android:strokeWidth="0.529167"
android:fillColor="#f0f0f0"
android:strokeColor="#c80000"/>
<path
android:pathData="M16.5599,16.1348l26.5459,7.6119l-4.5489,15.8639l-26.5459,-7.6119z"
android:strokeLineJoin="round"
android:strokeWidth="1.5875"
android:fillColor="#c80000"
android:strokeColor="#c80000"
android:fillType="evenOdd"/>
<path
android:pathData="M12.011,15.4955h27.6157v16.5032h-27.6157z"
android:strokeLineJoin="round"
android:strokeWidth="1.5875"
android:fillColor="#ff0000"
android:strokeColor="#ff0000"
android:fillType="evenOdd"/>
<path
android:pathData="M7.8471,23.7471a4.3659,8.5899 0,1 0,8.7317 0a4.3659,8.5899 0,1 0,-8.7317 0z"
android:strokeLineJoin="round"
android:strokeWidth="0.91078"
android:fillColor="#ff0000"
android:strokeColor="#ff0000"/>
<path
android:pathData="m24.4983,25.781a1.6711,1.6711 0,0 1,-1.3809 1.6457,1.6711 1.6711,0 0,1 -1.8605,-1.0741"
android:strokeLineJoin="round"
android:strokeWidth="0.529167"
android:fillColor="#00000000"
android:strokeColor="#f0f0f0"
android:strokeLineCap="round"/>
<path
android:pathData="m27.7991,26.333a1.6711,1.6711 0,0 1,-1.8605 1.0741,1.6711 1.6711,0 0,1 -1.3809,-1.6457"
android:strokeLineJoin="round"
android:strokeWidth="0.529167"
android:fillColor="#00000000"
android:strokeColor="#f0f0f0"
android:strokeLineCap="round"/>
<path
android:pathData="m16.0606,22.271 l2.6458,-2.6458 2.6458,2.6458"
android:strokeLineJoin="miter"
android:strokeWidth="0.529167"
android:fillColor="#00000000"
android:strokeColor="#f0f0f0"
android:strokeLineCap="butt"/>
<path
android:pathData="m27.7023,22.271 l2.6458,-2.6458 2.6458,2.6458"
android:strokeLineJoin="miter"
android:strokeWidth="0.529167"
android:fillColor="#00000000"
android:strokeColor="#f0f0f0"
android:strokeLineCap="butt"/>
</vector>

View File

@@ -0,0 +1,71 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group android:scaleX="1.5307087"
android:scaleY="1.5307087"
android:translateX="15.12"
android:translateY="15.12">
<path
android:pathData="M14.3354,20.1954l20.7318,-9.2304l5.7612,12.9398l-20.7318,9.2304z"
android:strokeLineJoin="miter"
android:strokeWidth="0.529167"
android:fillColor="#f0f0f0"
android:strokeColor="#c80000"/>
<path
android:pathData="M14.8755,10.9648l23.2041,10.3311l-6.8874,15.4694l-23.2041,-10.3311z"
android:strokeLineJoin="miter"
android:strokeWidth="0.529167"
android:fillColor="#f0f0f0"
android:strokeColor="#c80000"/>
<path
android:pathData="M16.5599,16.1348l26.5459,7.6119l-4.5489,15.8639l-26.5459,-7.6119z"
android:strokeLineJoin="round"
android:strokeWidth="1.5875"
android:fillColor="#c80000"
android:strokeColor="#c80000"
android:fillType="evenOdd"/>
<path
android:pathData="M12.011,15.4955h27.6157v16.5032h-27.6157z"
android:strokeLineJoin="round"
android:strokeWidth="1.5875"
android:fillColor="#ff0000"
android:strokeColor="#ff0000"
android:fillType="evenOdd"/>
<path
android:pathData="M7.8471,23.7471a4.3659,8.5899 0,1 0,8.7317 0a4.3659,8.5899 0,1 0,-8.7317 0z"
android:strokeLineJoin="round"
android:strokeWidth="0.91078"
android:fillColor="#ff0000"
android:strokeColor="#ff0000"/>
<path
android:pathData="m24.4983,25.781a1.6711,1.6711 0,0 1,-1.3809 1.6457,1.6711 1.6711,0 0,1 -1.8605,-1.0741"
android:strokeLineJoin="round"
android:strokeWidth="0.529167"
android:fillColor="#00000000"
android:strokeColor="#f0f0f0"
android:strokeLineCap="round"/>
<path
android:pathData="m27.7991,26.333a1.6711,1.6711 0,0 1,-1.8605 1.0741,1.6711 1.6711,0 0,1 -1.3809,-1.6457"
android:strokeLineJoin="round"
android:strokeWidth="0.529167"
android:fillColor="#00000000"
android:strokeColor="#f0f0f0"
android:strokeLineCap="round"/>
<path
android:pathData="m16.0606,22.271 l2.6458,-2.6458 2.6458,2.6458"
android:strokeLineJoin="miter"
android:strokeWidth="0.529167"
android:fillColor="#00000000"
android:strokeColor="#f0f0f0"
android:strokeLineCap="butt"/>
<path
android:pathData="m27.7023,22.271 l2.6458,-2.6458 2.6458,2.6458"
android:strokeLineJoin="miter"
android:strokeWidth="0.529167"
android:fillColor="#00000000"
android:strokeColor="#f0f0f0"
android:strokeLineCap="butt"/>
</group>
</vector>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="protect.card_locker.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
android:orientation="vertical">
<TextView
android:id="@+id/aboutText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:linksClickable="true"
android:singleLine="false"
android:focusable="true" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -55,6 +55,7 @@
android:labelFor="@+id/cardId"
android:text="@string/cardId" />
<EditText android:id="@+id/cardId"
android:importantForAutofill="no"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"/>
@@ -69,6 +70,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/barcodeNoBarcode"
android:textColor="#FFFFFF"
android:enabled="false" />
<LinearLayout android:orientation="vertical"
android:padding="10.0dp"

View File

@@ -13,7 +13,8 @@
style="@style/AppTheme.TextView.NoData"
android:id="@+id/helpText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/noGiftCards"
android:visibility="gone"/>
@@ -21,13 +22,14 @@
style="@style/AppTheme.TextView.NoData"
android:id="@+id/noMatchingCardsText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/noMatchingGiftCards"
android:visibility="gone"/>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:id="@+id/list"
android:visibility="gone"/>
</RelativeLayout>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/add_from_camera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/addWithCamera"
android:padding="@dimen/inputPadding"
android:drawablePadding="@dimen/inputPadding"
app:drawableStartCompat="@drawable/ic_camera_white"
app:drawableTint="@color/iconColor" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray"/>
<TextView
android:id="@+id/add_manually"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/addManually"
android:padding="@dimen/inputPadding"
android:drawablePadding="@dimen/inputPadding"
app:drawableStartCompat="@drawable/ic_mode_edit_white_24dp"
app:drawableTint="@color/iconColor" />
</LinearLayout>

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:baselineAligned="false"
android:padding="@dimen/activity_margin">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:textSize="@dimen/storeNameTextSize"
android:textStyle="bold"/>
<TextView
android:id="@+id/cardCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:maxLines="1"
android:ellipsize="end"
android:textSize="@dimen/noteTextSize"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/moveUp"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_weight="1"
android:src="@drawable/ic_baseline_arrow_drop_up_24"
android:contentDescription="@string/moveUp"
app:tint="@color/iconColor"
android:onClick="moveGroupUp"/>
<ImageButton
android:id="@+id/moveDown"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_weight="1"
android:src="@drawable/ic_baseline_arrow_drop_down_24"
android:contentDescription="@string/moveDown"
app:tint="@color/iconColor"
android:onClick="moveGroupDown"/>
<ImageButton
android:id="@+id/edit"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_weight="1"
android:src="@drawable/ic_mode_edit_white_24dp"
android:contentDescription="@string/edit"
app:tint="@color/iconColor"
android:onClick="editGroup" />
<ImageButton
android:id="@+id/delete"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_weight="1"
android:src="@drawable/ic_delete_white_24dp"
android:contentDescription="@string/delete"
app:tint="@color/iconColor"
android:onClick="deleteGroup"/>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="protect.card_locker.MainActivity"
tools:showIn="@layout/main_activity">
<TextView
style="@style/AppTheme.TextView.NoData"
android:id="@+id/helpText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noGroups"
android:visibility="gone"/>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list"
android:visibility="gone"/>
</RelativeLayout>

View File

@@ -0,0 +1,9 @@
<com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
style="@style/Widget.MaterialComponents.Chip.Choice"
app:checkedIconVisible="true"
android:textAppearance="?android:attr/textAppearance" />

View File

@@ -32,420 +32,175 @@
android:layout_height="wrap_content"
android:background="@color/inputContrastBackground"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<LinearLayout
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TableLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:shrinkColumns="1"
android:background="@color/inputContrastBackground">
<!-- Store Name -->
<View
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
<!-- Store -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
<RelativeLayout
android:layout_weight="1"
<androidx.cardview.widget.CardView
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_gravity="center_vertical"
app:cardCornerRadius="4dp"
android:paddingHorizontal="@dimen/inputPadding"
app:cardElevation="0dp">
<ImageView
android:id="@+id/thumbnail"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:contentDescription="@string/thumbnailDescription"
android:src="@mipmap/ic_launcher"/>
</androidx.cardview.widget.CardView>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/storeNameField"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/storeName">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/storeNameEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
/>
<TextView
android:id="@+id/storeNameField"
android:text="@string/storeName"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<EditText
android:id="@+id/storeNameEdit"
android:inputType="textCapWords"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:layout_toEndOf="@id/storeNameField"
android:layout_toRightOf="@id/storeNameField"
/>
<!-- Note -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
</RelativeLayout>
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<!-- Note -->
<View
android:layout_height="@dimen/inputBorderThickness"
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/noteField"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
android:layout_height="wrap_content"
android:hint="@string/note">
<RelativeLayout
android:layout_weight="1"
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/noteEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
/>
<TextView
android:id="@+id/noteField"
android:text="@string/note"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<EditText
android:id="@+id/noteEdit"
android:inputType="textMultiLine"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:layout_toEndOf="@id/noteField"
android:layout_toRightOf="@id/noteField"
/>
</RelativeLayout>
<!-- Group -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<!-- Store Header Background Color -->
<View
android:layout_height="@dimen/inputBorderThickness"
<com.google.android.material.chip.ChipGroup
android:id="@+id/groupChips"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize" />
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
<!-- Buttons -->
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/barcodeCaptureLayout">
<Button android:id="@+id/enterButton"
android:layout_margin="@dimen/inputMargin"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/editCard"
android:textColor="#FFFFFF"
android:layout_weight="1.0"/>
</LinearLayout>
<TextView
android:id="@+id/headingField"
android:text="@string/storeTextBackgroundColorTitle"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/headingColorSampleBorder"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="@dimen/colorSamplePadding"
app:layout_constraintStart_toEndOf="@id/headingField"
app:layout_constraintEnd_toStartOf="@+id/headingColorSelectButton"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@android:color/black">
<ImageView
android:id="@+id/headingColorSample"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="1dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@android:color/white"
android:contentDescription="@string/storeNameBackgroundColorDescription"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<Button
android:id="@+id/headingColorSelectButton"
android:text="@string/change"
android:padding="@dimen/inputPadding"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toEndOf="@id/headingColorSampleBorder"
android:layout_toRightOf="@id/headingColorSampleBorder"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<!-- Store Text Color -->
<View
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
<TextView
android:id="@+id/storeTextField"
android:text="@string/storeTextColorTitle"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/headingStoreTextColorSampleBorder"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="@dimen/colorSamplePadding"
app:layout_constraintStart_toEndOf="@id/storeTextField"
app:layout_constraintEnd_toStartOf="@+id/headingStoreTextColorSelectButton"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@android:color/black">
<ImageView
android:id="@+id/headingStoreTextColorSample"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="1dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@android:color/white"
android:contentDescription="@string/storeNameColorDescription"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<Button
android:id="@+id/headingStoreTextColorSelectButton"
android:text="@string/change"
android:padding="@dimen/inputPadding"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toEndOf="@id/headingStoreTextColorSampleBorder"
android:layout_toRightOf="@id/headingStoreTextColorSampleBorder"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<!-- Card ID and Barcode type -->
<LinearLayout
android:id="@+id/cardAndBarcodeLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/inputPadding"
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal"
android:baselineAligned="false">
<!-- Card ID -->
<View
android:id="@+id/cardIdDivider"
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:id="@+id/cardIdTableRow"
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/cardIdField"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:hint="@string/cardId">
<RelativeLayout
android:orientation="horizontal"
android:layout_weight="1"
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/cardIdView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
/>
<TextView
android:id="@+id/cardIdField"
android:text="@string/cardId"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
/>
</com.google.android.material.textfield.TextInputLayout>
<TextView
android:id="@+id/cardIdView"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:textIsSelectable="true"
android:layout_toEndOf="@id/cardIdField"
android:layout_toRightOf="@id/cardIdField"
/>
</RelativeLayout>
<!-- Barcode type -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/barcodeTypeView"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:hint="@string/barcodeType"
android:labelFor="@+id/barcodeTypeField">
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<!-- Barcode Type -->
<View
android:id="@+id/barcodeTypeDivider"
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:id="@+id/barcodeTypeTableRow"
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
<RelativeLayout
android:orientation="horizontal"
android:layout_weight="1"
<AutoCompleteTextView
android:id="@+id/barcodeTypeField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
android:inputType="none"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<TextView
android:id="@+id/barcodeTypeField"
android:text="@string/barcodeType"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
/>
<!-- Barcode -->
<View
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent" />
<TextView
android:id="@+id/barcodeTypeView"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:textIsSelectable="true"
android:layout_toEndOf="@id/barcodeTypeField"
android:layout_toRightOf="@id/barcodeTypeField"
/>
</RelativeLayout>
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<View
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:id="@+id/barcodeLayout">
<ImageView
android:layout_width="0dp"
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:padding="10.0dp"
android:background="#ffffff"
android:id="@+id/barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
</LinearLayout>
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/inputBackground">
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/barcodeCaptureLayout">
<Button android:id="@+id/captureButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/capture"
android:layout_weight="1.0"/>
<Button android:id="@+id/enterButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/enterCard"
android:layout_weight="1.0"/>
</LinearLayout>
</LinearLayout>
</TableLayout>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:id="@+id/barcodeLayout">
<ImageView
android:layout_width="0dp"
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:padding="10.0dp"
android:background="#ffffff"
android:id="@+id/barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
</LinearLayout>
</TableLayout>
</ScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -8,14 +8,21 @@
android:baselineAligned="false"
android:padding="@dimen/activity_margin">
<ImageView
android:id="@+id/thumbnail"
<androidx.cardview.widget.CardView
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:src="@mipmap/ic_launcher"
android:contentDescription="@string/thumbnailDescription"/>
app:cardCornerRadius="4dp"
app:cardElevation="0dp">
<ImageView
android:id="@+id/thumbnail"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:contentDescription="@string/thumbnailDescription"
android:src="@mipmap/ic_launcher"/>
</androidx.cardview.widget.CardView>
<LinearLayout
android:orientation="vertical"
@@ -24,23 +31,17 @@
android:layout_weight="1">
<LinearLayout
android:id="@+id/valueLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
android:layout_height="wrap_content"
android:visibility="visible" >
<LinearLayout
android:id="@+id/valueLayout"
<TextView
android:id="@+id/store"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible">
<TextView
android:id="@+id/store"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/storeNameTextSize"
android:textStyle="bold"/>
</LinearLayout>
android:textSize="@dimen/storeNameTextSize"
android:textStyle="bold"/>
</LinearLayout>
@@ -52,5 +53,12 @@
android:ellipsize="end"
android:textSize="@dimen/noteTextSize"/>
</LinearLayout>
<ImageView
android:id="@+id/star"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_marginStart="@dimen/activity_margin"
android:src="@drawable/ic_starred_white"
app:tint="@color/iconColor"
android:contentDescription="@string/starImage"/>
</LinearLayout>

View File

@@ -59,44 +59,14 @@
android:layout_marginLeft="10.0dip"
android:layout_marginRight="10.0dip"
app:layout_constraintTop_toBottomOf="@+id/barcode"
app:layout_constraintBottom_toTopOf="@+id/noteViewDivider"
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"
android:textIsSelectable="true"/>
<View
android:id="@id/noteViewDivider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/black"
app:layout_constraintTop_toBottomOf="@id/cardIdView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="@+id/noteView"
/>
<TextView
android:id="@id/noteView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="10.0dip"
android:layout_gravity="bottom"
app:layout_constraintTop_toBottomOf="@id/noteViewDivider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="@dimen/singleCardNoteTextSizeMin"
app:autoSizeMaxTextSize="@dimen/singleCardNoteTextSizeMax"
android:textIsSelectable="true"
android:scrollbars="vertical"/>
android:ellipsize="end"/>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -107,6 +77,48 @@
android:layout_gravity="top"/>
</FrameLayout>
<LinearLayout
android:id="@+id/bottom_sheet"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:behavior_hideable="false"
app:behavior_peekHeight="80dp"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
<ImageButton
android:id="@+id/bottomSheetButton"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/colorPrimary"
android:gravity="center"
android:src="@drawable/ic_baseline_arrow_drop_up_24"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:tint="@android:color/white" />
<TextView
android:id="@+id/noteView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="20dp"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="@dimen/singleCardNoteTextSizeMin"
app:autoSizeMaxTextSize="@dimen/singleCardNoteTextSizeMax" />
<TextView
android:id="@+id/groupsView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="20dp"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="@dimen/singleCardNoteTextSizeMin"
app:autoSizeMaxTextSize="@dimen/singleCardNoteTextSizeMax" />
</LinearLayout>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:background="@android:color/transparent"

View File

@@ -29,6 +29,13 @@
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/groups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="scrollable"
android:visibility="gone"/>
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main"/>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="protect.card_locker.ManageGroupsActivity">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:src="@drawable/ic_add_white_24dp"
android:contentDescription="@string/action_add"
android:layout_margin="16dp" />
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/group_main"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -12,4 +12,9 @@
android:icon="@drawable/ic_share_white"
android:title="@string/share"
app:showAsAction="always"/>
<item
android:id="@+id/action_star_unstar"
android:icon="@drawable/ic_unstarred_white"
android:title="@string/star"
app:showAsAction="always" />
</menu>

View File

@@ -8,6 +8,11 @@
android:icon="@drawable/ic_search_white"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always|collapseActionView"/>
<item
android:id="@+id/action_manage_groups"
android:icon="@drawable/ic_folder_white"
android:title="@string/groups"
app:showAsAction="always"/>
<item
android:id="@+id/action_import_export"
android:icon="@drawable/ic_import_export_white_24dp"

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png Executable file → Normal file
View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -10,7 +10,6 @@
<string name="cancel">Zrušit</string>
<string name="save">Uložit</string>
<string name="capture">Naskenovat kartu</string>
<string name="enterCard">Vložit vlastnoručně</string>
<string name="edit">Editovat</string>
<string name="delete">Smazat</string>
<string name="confirm">Potvrdit</string>
@@ -26,7 +25,6 @@
<string name="noStoreError">Nebyl zadán Obchod</string>
<string name="noCardIdError">Nebylo zadáno ID karty</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Zálohování dat vám umožní přesunout vaše uložené karty na jiné zařízení.</string>
@@ -47,7 +45,6 @@
<string name="importOptionApplicationButton">Použít externí aplikaci</string>
<string name="about">O aplikaci</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Licensed under the GPLv3.</string>
<string name="about_title_fmt">O aplikaci <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verze: <xliff:g id="version">%s</xliff:g></string>

View File

@@ -1,88 +1,109 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_search">Suche</string>
<string name="action_add">Neu</string>
<string name="noGiftCards">Sie haben noch keine Kundenkarte angelegt. Über den \"+\"-Button oben rechts können welche angelegt werden.\n\nDiese App ermöglicht es, Kundenkarten immer mit zu führen.</string>
<string name="noMatchingGiftCards">Es passen keine Kundenkarten zum Suchfilter. Bitte probiere verschiedene Begriffe aus.</string>
<string name="noGiftCards">Klicken Sie auf die Schaltfläche + (plus), um zuerst eine Karte hinzuzufügen.
\n
\nCatima trägt Ihre Karten auf dem Gerät, so dass sie immer in Reichweite sind.</string>
<string name="noMatchingGiftCards">Nichts gefunden. Versuchen Sie, Ihre Suche zu ändern.</string>
<string name="storeName">Geschäft</string>
<string name="note">Notiz</string>
<string name="cardId">Kartennummer</string>
<string name="cancel">Abbrechen</string>
<string name="save">Speichern</string>
<string name="capture">Karte scannen</string>
<string name="enterCard">Manuell eingeben</string>
<string name="editCard">Karte bearbeiten</string>
<string name="edit">Bearbeiten</string>
<string name="delete">Löschen</string>
<string name="confirm">Bestätigen</string>
<string name="lockScreen">Rotation blockieren</string>
<string name="unlockScreen">Rotation zulassen</string>
<string name="star">Zu den Favoriten hinzufügen</string>
<string name="unstar">Aus der Favoritenliste entfernen</string>
<string name="deleteTitle">Karte entfernen</string>
<string name="deleteConfirmation">Bitte bestätigen Sie, dass diese Karte gelöscht werden soll.</string>
<string name="ok">Ok</string>
<string name="copy_to_clipboard">Kopiere die Nummer in die Zwischenablage</string>
<string name="sendLabel">Senden&#8230;</string>
<string name="sendLabel">Senden</string>
<string name="editCardTitle">Kundenkarte bearbeiten</string>
<string name="addCardTitle">Neue Kundenkarte</string>
<string name="scanCardBarcode">Barcode scannen</string>
<string name="scanCardBarcode">Strichcode scannen</string>
<string name="cardShortcut">Shortcut zu einer Karte</string>
<string name="noCardsMessage">Es ist noch keine Karte vorhanden, bitte zuerst eine hinzufügen</string>
<string name="barcodeImageDescription">Bild des Barcodes</string>
<string name="noCardsMessage">Fügen Sie zuerst eine Karte hinzu</string>
<string name="barcodeImageDescription">Bild des Strichcodes</string>
<string name="noStoreError">Kein Geschäft angegeben</string>
<string name="noCardIdError">Keine Kartennummer angegeben</string>
<string name="noCardExistsError">Karte konnte nicht gefunden werden</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Exportieren</string>
<string name="importExportHelp">Gesicherte Daten ermöglichen das Verschieben der Kundenkarten auf ein anderes Gerät.</string>
<string name="importSuccessfulTitle">Import erfolgreich</string>
<string name="importExportHelp">Durch das Sichern Ihrer Karten können Sie sie auf ein anderes Gerät verschieben.</string>
<string name="importSuccessfulTitle">Importiert</string>
<string name="importFailedTitle">Import fehlgeschlagen</string>
<string name="importFailed">Import fehlgeschlagen</string>
<string name="exportSuccessfulTitle">Export erfolgreich</string>
<string name="importFailed">Karten konnten nicht importiert werden</string>
<string name="exportSuccessfulTitle">Exportiert</string>
<string name="exportFailedTitle">Export fehlgeschlagen</string>
<string name="exportFailed">Export fehlgeschlagen</string>
<string name="exportFailed">Karten konnten nicht exportiert werden</string>
<string name="importing">Importiere…</string>
<string name="exporting">Exportiere…</string>
<string name="noExternalStoragePermissionError">Ohne die Berechtigung für den externen Speicher kann kein Import oder Export erfolgen.</string>
<string name="noExternalStoragePermissionError">Erteilen Sie zuerst die Erlaubnis zur externen Speicherung, um Karten zu importieren oder zu exportieren</string>
<string name="importOptionFilesystemTitle">Importiere aus Dateisystem</string>
<string name="importOptionFilesystemExplanation">Wähle eine Datei aus dem Speicher aus.</string>
<string name="importOptionFilesystemButton">Aus Dateisystem</string>
<string name="importOptionApplicationTitle">Externe App verwenden</string>
<string name="importOptionApplicationExplanation">Wählen Sie eine Datei aus einer App wie Dropbox, Google Drive, oder Ihrem bevorzugten Dateisystem aus.</string>
<string name="importOptionApplicationButton">Nutze eine externe App</string>
<string name="importOptionApplicationTitle">Externe Anwendung verwenden</string>
<string name="importOptionApplicationExplanation">Verwenden Sie eine beliebige Anwendung oder Ihren bevorzugten Dateiverwaltungsprogramm, um eine Datei zu öffnen.</string>
<string name="importOptionApplicationButton">Externe Anwendung nutzen</string>
<string name="about">Über</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Lizensiert unter der GPLv3.</string>
<string name="app_license">Freie Software, lizensiert unter der GPLv3+.</string>
<string name="about_title_fmt">Über <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informationen zu dieser Version: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> benutzt die folgenden Fremdbibliotheken: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> verwendet folgenden Dritt-Ressourcen: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Barcode auswählen</string>
<string name="selectBarcodeTitle">Strichcode auswählen</string>
<string name="copy_to_clipboard_toast">Nummer in die Zwischenablage kopiert</string>
<string name="thumbnailDescription">Vorschaubild für die Karte</string>
<string name="change">Anpassen</string>
<string name="storeTextColorTitle">Textfarbe</string>
<string name="storeTextBackgroundColorTitle">Hintergrundfarbe</string>
<string name="storeNameBackgroundColorDescription">Hintergrundfarbe für den Geschäftsnamen</string>
<string name="storeNameColorDescription">Farbe für den Geschäftsnamen</string>
<string name="settings">Einstellungen</string>
<string name="settings_category_title_ui">Benutzeroberfläche</string>
<string name="settings_card_title_list_font_size">Schriftgröße des Titels in der Listenansicht</string>
<string name="settings_card_note_list_font_size">Schriftgröße der Notiz in der Listenansicht</string>
<string name="settings_card_title_font_size">Schriftgröße des Titels</string>
<string name="settings_card_title_list_font_size">Schriftgröße des Kartentitels (Listenmodus)</string>
<string name="settings_card_note_list_font_size">Schriftgröße der Kartennotiz (Listenmodus)</string>
<string name="settings_card_title_font_size">Schriftgröße des Kartentitels (Vorschau)</string>
<string name="settings_card_id_font_size">Schriftgröße der Kartennummer</string>
<string name="settings_card_note_font_size">Schriftgröße der Notiz</string>
<string name="settings_display_barcode_max_brightness">Helligkeit bei Barcode Ansicht erhöhen</string>
<string name="settings_lock_barcode_orientation">Barcodeausrichtung sperren</string>
</resources>
<string name="settings_card_note_font_size">Schriftgröße der Kartennotiz (Vorschau)</string>
<string name="settings_display_barcode_max_brightness">Helligkeit bei Strichcode Ansicht erhöhen</string>
<string name="settings_lock_barcode_orientation">Strichcodeausrichtung sperren</string>
<string name="exportSuccessful">Kartendaten exportiert</string>
<string name="importSuccessful">Kartendaten importiert</string>
<string name="intent_import_card_from_url_share_text">Ich will eine Karte mit Ihnen teilen</string>
<string name="settings_dark_theme">Dunkel</string>
<string name="settings_light_theme">Hell</string>
<string name="settings_system_theme">System</string>
<string name="settings_theme">Design</string>
<string name="enterBarcodeInstructions">Geben Sie die Karten-ID ein und wählen Sie das Bild aus, das den Strichcode darstellt, den Sie verwenden möchten, oder wählen Sie „Diese Karte hat keinen Strichcode“, um keinen Strichcode zu verwenden.</string>
<string name="app_copyright_old">Basiert auf Loyalty Card Keychain, Copyright 20162020 Branden Archer.</string>
<string name="exportOptionExplanation">Die Daten werden an einen Ort Ihrer Wahl geschrieben.</string>
<string name="failedParsingImportUriError">Der Import-URI konnte nicht analysiert werden</string>
<string name="share">Teilen</string>
<string name="barcodeNoBarcode">Diese Karte hat keinen Strichcode</string>
<string name="barcodeType">Strichcode-Typ</string>
<string name="starImage">Favoritenstern</string>
<string name="deleteConfirmationGroup">Bitte bestätigen Sie, dass Sie diese Gruppe löschen möchten</string>
<string name="all">Alle</string>
<string name="noGroups">Klicken Sie auf die Schaltfläche + (plus), um zuerst Gruppen hinzuzufügen.
\n
\nGruppen machen es einfacher, Dinge zu finden.</string>
<string name="groups">Gruppen</string>
<string name="enter_group_name">Geben Sie den Gruppennamen ein</string>
<string name="leaveWithoutSaveConfirmation">Sind Sie sicher, dass Sie diesen Bildschirm verlassen wollen\? Vorgenommene Änderungen werden nicht gespeichert.</string>
<string name="leaveWithoutSaveTitle">Beenden ohne zu speichern</string>
<string name="failedOpeningFileManager">Fehler beim Öffnen eines Dateiverwaltungsprogrammes. Stellen Sie sicher, dass eine installiert ist.</string>
<string name="noBarcode">Kein Strichcode</string>
<string name="addManually">Die Karten-ID manuell eingeben</string>
<string name="addWithCamera">Scannen Sie den Strichcode mit Ihrer Kamera</string>
<string name="moveDown">In der Liste nach unten verschieben</string>
<string name="moveUp">In der Liste nach oben verschieben</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> Karte</item>
<item quantity="other"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> Karten</item>
</plurals>
</resources>

View File

@@ -10,7 +10,6 @@
<string name="cancel">Άκυρο</string>
<string name="save">Αποθήκευση</string>
<string name="capture">Φωτογράφιση Κάρτας</string>
<string name="enterCard">Εισάγετε Κάρτα</string>
<string name="editCard">Επεξεργασία Κάρτας</string>
<string name="edit">Επεξεργασία</string>
<string name="delete">Διαγραφή</string>
@@ -33,7 +32,6 @@
<string name="noStoreError">Δεν δώσατε κατάστημα</string>
<string name="noCardIdError">Δεν δώσατε κωδικό κάρτας</string>
<string name="noCardExistsError">Δεν ήταν δυνατό να εντοπιστεί κάρτα</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Εισαγωγή/Εξαγωγή</string>
<string name="exportName">Εξαγωγή</string>
<string name="importExportHelp">Τα εφεδρικά δεδομένα σας δίνουν την δυνατότητα να μεταφέρετε τις κάρτες σας σε μία άλλη συσκευή.</string>
@@ -54,7 +52,6 @@
<string name="importOptionApplicationButton">Χρήση εξωτερικής εφαρμογής</string>
<string name="about">Σχετικά</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Άδεια χρήσης υπό το GPLv3.</string>
<string name="about_title_fmt">Σχετικά με <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Έκδοση: <xliff:g id="version">%s</xliff:g></string>
@@ -68,10 +65,6 @@
<string name="thumbnailDescription">Μικρογραφία κάρτας</string>
<string name="change">Αλλαγή</string>
<string name="storeTextColorTitle">Χρώμα Κειμένου Καταστήματος</string>
<string name="storeTextBackgroundColorTitle">Χρώμα Κεφαλίδας</string>
<string name="storeNameBackgroundColorDescription">Χρώμα για το υπόβαθρο του καταστήματος</string>
<string name="storeNameColorDescription">Χρώμα για το κείμενο του καταστήματος</string>
<string name="settings">Ρυθμίσεις</string>
<string name="settings_category_title_ui">Διεπαφή χρήστη</string>

View File

@@ -1,83 +1,81 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_add">Añadir</string>
<string name="noGiftCards">Actualmente no tienes ninguna tarjeta guardada. Presiona el botón \"+\" para comenzar.\n\nEsta cartera te permite llevar tus tarjetas de fidelización en tu teléfono para que estén siempre a tu alcance.</string>
<string name="noGiftCards">Actualmente no tiene ninguna tarjeta guardada. Pulse el botón «+» para comenzar.
\n
\nCatima le permite llevar sus tarjetas en el teléfono para que estén siempre a su alcance.</string>
<string name="storeName">Tienda</string>
<string name="note">Nota</string>
<string name="cardId">ID de la Tarjeta</string>
<string name="cardId">Id. de tarjeta</string>
<string name="cancel">Cancelar</string>
<string name="save">Guardar</string>
<string name="capture">Escanear Tarjeta</string>
<string name="enterCard">Introducir Tarjeta</string>
<string name="editCard">Editar Tarjeta</string>
<string name="capture">Capturar tarjeta</string>
<string name="editCard">Editar tarjeta</string>
<string name="edit">Editar</string>
<string name="delete">Eliminar</string>
<string name="confirm">Confirmar</string>
<string name="lockScreen">Bloquear Rotación de Pantalla</string>
<string name="unlockScreen">Rotación de Pantalla Automática</string>
<string name="deleteTitle">Eliminar Tarjeta de Fidelización</string>
<string name="deleteConfirmation">Por favor, confirma si quieres eliminar esta tarjeta.</string>
<string name="ok">OK</string>
<string name="copy_to_clipboard">Copiar ID al portapapeles</string>
<string name="sendLabel">Enviar&#8230;</string>
<string name="editCardTitle">Editar Tarjeta de Fidelización</string>
<string name="addCardTitle">Añadir Tarjeta de Fidelización</string>
<string name="scanCardBarcode">Escanear el Código de Barras de la Tarjeta</string>
<string name="cardShortcut">Atajo de Tarjeta</string>
<string name="noCardsMessage">No hay ninguna tarjeta, añade una primero</string>
<string name="lockScreen">Bloquear rotación</string>
<string name="unlockScreen">Desbloquear rotación</string>
<string name="deleteTitle">Eliminar tarjeta</string>
<string name="deleteConfirmation">Confirme que quiere eliminar esta tarjeta.</string>
<string name="ok">Aceptar</string>
<string name="copy_to_clipboard">Copiar id. en portapapeles</string>
<string name="sendLabel">Enviar</string>
<string name="editCardTitle">Editar tarjeta</string>
<string name="addCardTitle">Añadir tarjeta</string>
<string name="scanCardBarcode">Escanear código de barras de la tarjeta</string>
<string name="cardShortcut">Atajo de tarjeta</string>
<string name="noCardsMessage">No hay ninguna tarjeta; añada una primero</string>
<string name="barcodeImageDescription">Imagen del código de barras de la tarjeta</string>
<string name="noStoreError">Establecimiento no especificado</string>
<string name="noCardIdError">ID de la Tarjeta no especificado</string>
<string name="noCardIdError">Id. de tarjeta no especificado</string>
<string name="noCardExistsError">No se ha podido encontrar la tarjeta de fidelización</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Importar/Exportar</string>
<string name="importExport">Importar/exportar</string>
<string name="exportName">Exportar</string>
<string name="importExportHelp">La copia de seguridad te permite transferir tus tarjetas a otro dispositivo.</string>
<string name="importExportHelp">La copia de respaldo le permite transferir sus tarjetas a otro dispositivo.</string>
<string name="importSuccessfulTitle">Datos importados correctamente</string>
<string name="importFailedTitle">Ha ocurrido un error al importar los datos</string>
<string name="importFailed">Error al importar</string>
<string name="importFailedTitle">Falló la importación</string>
<string name="importFailed">No se pudo importar</string>
<string name="exportSuccessfulTitle">Datos exportados correctamente</string>
<string name="exportFailedTitle">Ha ocurrido un error al exportar los datos</string>
<string name="exportFailed">Error al exportar</string>
<string name="importing">Importando&#8230;</string>
<string name="exporting">Exportando&#8230;</string>
<string name="exportFailedTitle">Falló la exportación</string>
<string name="exportFailed">No se pudo exportar</string>
<string name="importing">Importando</string>
<string name="exporting">Exportando</string>
<string name="noExternalStoragePermissionError">No se pueden importar o exportar tarjetas sin el permiso de almacenamiento</string>
<string name="importOptionFilesystemTitle">Importar desde el sistema de archivos</string>
<string name="importOptionFilesystemExplanation">Seleccionar un archivo del sistema de archivos</string>
<string name="importOptionFilesystemExplanation">Elegir un archivo concreto del sistema de archivos.</string>
<string name="importOptionFilesystemButton">Desde el sistema de archivos</string>
<string name="importOptionApplicationTitle">Usar una applicación externa</string>
<string name="importOptionApplicationTitle">Utilizar aplicación externa</string>
<string name="importOptionApplicationExplanation">Use una aplicación externa como Dropbox, Google Drive o tu gestor de archivos favoritos para abrir un archivo.</string>
<string name="importOptionApplicationButton">Usar aplicación externa</string>
<string name="importOptionApplicationButton">Utilizar aplicación externa</string>
<string name="about">Acerca de</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Licencia GPLv3</string>
<string name="app_license">Disponible en virtud de la GPLv3.</string>
<string name="about_title_fmt">Acerca de <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versión: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Información sobre la Revisión: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> utiliza las siguientes librerías de terceros: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> utiliza los siguientes recursos de terceros: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Selecciona el Código de Barras</string>
<string name="copy_to_clipboard_toast">ID de la Tarjeta copiado al portapapeles</string>
<string name="thumbnailDescription">Miniatura para la tarjeta</string>
<string name="change">Cambiar</string>
<string name="storeTextColorTitle">Color del Texto de la Tienda</string>
<string name="storeTextBackgroundColorTitle">Color Principal</string>
<string name="storeNameBackgroundColorDescription">Color de fondo para el texto de la tienda</string>
<string name="storeNameColorDescription">Color del texto de la tienda</string>
<string name="settings">Configuración</string>
<string name="settings_category_title_ui">Interfaz de Usuario</string>
<string name="settings_category_title_ui">Interfaz de usuario</string>
<string name="settings_card_title_list_font_size">Tamaño de la letra para el título (lista)</string>
<string name="settings_card_note_list_font_size">Tamaño de la letra para notas (lista)</string>
<string name="settings_card_title_font_size">Tamaño de la letra para el título</string>
<string name="settings_card_id_font_size">Tamaño de la letra para el ID de la tarjeta</string>
<string name="settings_card_note_font_size">Tamaño de la letra para notas</string>
</resources>
<string name="settings_display_barcode_max_brightness">Iluminar vista de código de barras</string>
<string name="exportSuccessful">Se exportaron correctamente los datos de tarjetas de fidelización</string>
<string name="importSuccessful">Se importaron correctamente los datos de tarjetas de fidelización</string>
<string name="intent_import_card_from_url_share_text">Quiero compartirle una tarjeta</string>
<string name="settings_lock_barcode_orientation">Bloquear orientación de código de barras</string>
<string name="settings_dark_theme">Tema oscuro</string>
<string name="settings_light_theme">Tema claro</string>
<string name="settings_system_theme">Tema del sistema</string>
<string name="settings_theme">Tema</string>
<string name="enterBarcodeInstructions">Introduzca el identificador de tarjeta y seleccione la imagen que represente el código de barras que se utilizará, o bien, elija «Esta tarjeta no tiene código de barras» para no utilizar ninguno.</string>
<string name="app_copyright_old">Basado en Loyalty Card Keychain, derechos de autor 20162020 de Branden Archer.</string>
<string name="exportOptionExplanation">Los datos se guardarán en la ubicación que elija.</string>
<string name="failedParsingImportUriError">No se pudo procesar el URI de importación</string>
<string name="share">Compartir</string>
<string name="barcodeNoBarcode">Esta tarjeta no tiene código de barras</string>
<string name="barcodeType">Tipo de código de barras</string>
<string name="noMatchingGiftCards">Ninguna tarjeta coincide con el filtro de búsqueda. Pruebe con términos distintos.</string>
<string name="action_search">Buscar</string>
</resources>

View File

@@ -1,16 +1,15 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_add">Ajouter</string>
<string name="noGiftCards">Aucune carte de fidélité enregistrée. Appuyez sur le bouton \"+\" (plus) pour commencer.\n\nLoyalty Card Locker vous permet d\'enregistrer vos cartes de fidélité sur votre téléphone pour toujours les avoir à portée de main.</string>
<string name="storeName">Nom</string>
<string name="note">Note</string>
<string name="noGiftCards">Appuyez d\'abord sur le bouton \"+\" (plus) pour ajouter une carte.
\n
\nCatima enregistre vos cartes sur votre appareil, pour toujours les avoir à portée de main.</string>
<string name="storeName">Nom du Magasin</string>
<string name="note">Notes</string>
<string name="cardId">Numéro</string>
<string name="cancel">Annuler</string>
<string name="save">Enregistrer</string>
<string name="capture">Mode capture</string>
<string name="enterCard">Mode manuel</string>
<string name="editCard">Modifier</string>
<string name="edit">Modifier</string>
<string name="delete">Supprimer</string>
@@ -18,68 +17,93 @@
<string name="lockScreen">Désactiver la rotation</string>
<string name="unlockScreen">Activer la rotation</string>
<string name="deleteTitle">Supprimer la carte de fidélité</string>
<string name="deleteConfirmation">Confirmez que vous souhaitez supprimer cette carte</string>
<string name="deleteConfirmation">Confirmez la suppression de cette carte.</string>
<string name="ok">OK</string>
<string name="copy_to_clipboard">Copier le numéro dans le presse-papier</string>
<string name="sendLabel">Envoyer&#8230;</string>
<string name="sendLabel">Envoyer</string>
<string name="editCardTitle">Modifier la carte de fidélité</string>
<string name="addCardTitle">Ajouter une carte de fidélité</string>
<string name="scanCardBarcode">Flasher le code-barres de la carte</string>
<string name="scanCardBarcode">Scanner le code-barres</string>
<string name="cardShortcut">Raccourci de carte</string>
<string name="noCardsMessage">Il n\'y a aucune carte. Ajoutez en une d\'abord.</string>
<string name="barcodeImageDescription">Image du code-barres de la carte</string>
<string name="noStoreError">Aucun nom n\'a été saisi</string>
<string name="noCardIdError">Aucun numéro n\'a été saisi</string>
<string name="noCardExistsError">N\'a pas pu retrouver la carte de fidélité</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="noCardsMessage">Ajoutez d\'abord une carte</string>
<string name="barcodeImageDescription">Image du code-barres</string>
<string name="noStoreError">Aucun nom de magasin saisi</string>
<string name="noCardIdError">Aucun numéro de carte saisi</string>
<string name="noCardExistsError">Aucune carte trouvée</string>
<string name="importExport">Importer/Exporter</string>
<string name="exportName">Exporter</string>
<string name="importExportHelp">Exporter vos données vous permet de récupérer vos cartes sur un autre appareil.</string>
<string name="importSuccessfulTitle">Importé avec succès</string>
<string name="importExportHelp">Exporter vos cartes vous permet de les récupérer sur un autre appareil.</string>
<string name="importSuccessfulTitle">Importé</string>
<string name="importFailedTitle">Échec de l\'import</string>
<string name="importFailed">Échec de l\'import </string>
<string name="exportSuccessfulTitle">Exporté avec succès</string>
<string name="importFailed">Impossible d\'importer les cartes</string>
<string name="exportSuccessfulTitle">Exporté</string>
<string name="exportFailedTitle">Échec de l\'export</string>
<string name="exportFailed">Échec de l\'export </string>
<string name="importing">Import &#8230;</string>
<string name="exporting">Export &#8230;</string>
<string name="noExternalStoragePermissionError">Impossible d\'importer ou d\'exporter les données sans l\'autorisation d\'accès au stockage externe</string>
<string name="importOptionFilesystemTitle">Importer depuis le système de fichiers.</string>
<string name="exportFailed">Impossible d\'exporter les cartes</string>
<string name="importing">Import </string>
<string name="exporting">Export </string>
<string name="noExternalStoragePermissionError">Veuillez autoriser l\'accès au stockage externe avant d\'importer/exporter les données</string>
<string name="importOptionFilesystemTitle">Importer depuis le système de fichiers</string>
<string name="importOptionFilesystemExplanation">Choisissez le fichier à importer.</string>
<string name="importOptionFilesystemButton">Système de fichiers</string>
<string name="importOptionApplicationTitle">Application externe</string>
<string name="importOptionApplicationExplanation">Utilisez une application externe comme Dropbox, Google Drive, ou votre gestionnaire de fichiers favori pour ouvrir un fichier.</string>
<string name="importOptionApplicationButton">Application externe</string>
<string name="importOptionApplicationTitle">Utiliser une application externe</string>
<string name="importOptionApplicationExplanation">Utilisez le gestionnaire de fichiers de votre choix pour importer un fichier.</string>
<string name="importOptionApplicationButton">Utiliser une application externe</string>
<string name="about">À propos</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Licence GPLv3.</string>
<string name="app_license">Logiciel libre à copyleft, sous licence GPLv3+.</string>
<string name="about_title_fmt">À propos de <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Version : <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Notes sur les versions : <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_revision_fmt">Notes de version : <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> utilise les bibliothèques-tierces suivantes : <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> utilise les ressources-tierces suivantes : <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Choisissez le code-barre</string>
<string name="app_resources"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_name">%s</xliff:g> utilise les ressources tierces suivantes : <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Choisissez le code-barres</string>
<string name="copy_to_clipboard_toast">Numéro de carte copié dans le presse-papier</string>
<string name="thumbnailDescription">Miniature pour la carte</string>
<string name="thumbnailDescription">Miniature de la carte</string>
<string name="change">Modifier</string>
<string name="storeTextColorTitle">Couleur du texte du magasin</string>
<string name="storeTextBackgroundColorTitle">Couleur du titre</string>
<string name="storeNameBackgroundColorDescription">Couleur de fond du texte du magasin</string>
<string name="storeNameColorDescription">Couleur pour le nom du magasin</string>
<string name="settings">Paramètres</string>
<string name="settings_category_title_ui">Interface</string>
<string name="settings_card_title_list_font_size">Taille de police pour les titres de carte en liste</string>
<string name="settings_card_note_list_font_size">Taille de police pour les notes de carte en liste</string>
<string name="settings_card_title_font_size">Taille de police pour les titres de carte</string>
<string name="settings_card_id_font_size">Taille de police pour les numéros de carte</string>
<string name="settings_card_note_font_size">Taille de police pour les notes de carte</string>
<string name="settings_category_title_ui">Interface utilisateur</string>
<string name="settings_card_title_list_font_size">Taille du nom des cartes (mode liste)</string>
<string name="settings_card_note_list_font_size">Taille de la description (mode liste)</string>
<string name="settings_card_title_font_size">Taille du nom de la carte (aperçu)</string>
<string name="settings_card_id_font_size">Taille des numéros de carte</string>
<string name="settings_card_note_font_size">Taille de la description (aperçu)</string>
<string name="settings_display_barcode_max_brightness">Augmenter la luminosité du code-barres</string>
<string name="settings_lock_barcode_orientation">Verrouiller l\'orientation du code-barres</string>
</resources>
<string name="exportSuccessful">Carte exportée avec succès</string>
<string name="importSuccessful">Carte de fidélité importée</string>
<string name="intent_import_card_from_url_share_text">Je veux partager une carte avec toi</string>
<string name="settings_dark_theme">Sombre</string>
<string name="settings_light_theme">Clair</string>
<string name="settings_system_theme">Système</string>
<string name="settings_theme">Thème</string>
<string name="enterBarcodeInstructions">Entrez l\'identifiant de la carte puis sélectionnez l\'image qui représente le code-barres que vous souhaitez utiliser, ou sélectionnez « Cette carte n\'a pas de code-barres » pour ne pas utiliser de code-barres.</string>
<string name="app_copyright_old">Basé sur Loyalty Card Keychain, copyright 20162020 Branden Archer.</string>
<string name="exportOptionExplanation">Les données seront eportées vers l\'emplacement de votre choix.</string>
<string name="failedParsingImportUriError">Impossible d\'analyser l\'URI d\'importation</string>
<string name="share">Partager</string>
<string name="barcodeNoBarcode">Cette carte n\'a pas de code-barres</string>
<string name="barcodeType">Type de code-barres</string>
<string name="noMatchingGiftCards">Aucun résultat. Essayez de modifier votre recherche.</string>
<string name="action_search">Rechercher</string>
<string name="unstar">Retirer des favoris</string>
<string name="star">Ajouter aux favoris</string>
<string name="starImage">Étoile favorite</string>
<string name="deleteConfirmationGroup">Confirmez que vous voulez supprimer cette carte</string>
<string name="all">Tous</string>
<string name="noGroups">Cliquez d\'abord sur le bouton \"+\" (plus) pour ajouter un groupe.
\n
\nLes groupes permettent de facilement retrouver vos cartes.</string>
<string name="groups">Groupes</string>
<string name="enter_group_name">Entrez le nom du groupe</string>
<string name="noBarcode">Aucun code-barres</string>
<string name="leaveWithoutSaveConfirmation">Voulez-vous quitter la page \? Toutes vos modifications seront perdues.</string>
<string name="leaveWithoutSaveTitle">Quitter sans enregistrer</string>
<string name="failedOpeningFileManager">Gestionnaire de fichiers introuvable. Installez-en un si nécessaire.</string>
<string name="addManually">Entrer manuellement l\'identifiant de la carte</string>
<string name="addWithCamera">Scannez le code-barres avec votre appareil photo</string>
<string name="moveDown">Descendre dans la liste</string>
<string name="moveUp">Monter dans la liste</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> carte</item>
<item quantity="other"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> cartes</item>
</plurals>
</resources>

View File

@@ -7,6 +7,5 @@
<string name="cancel">ביטול</string>
<string name="save">שמור</string>
<string name="capture">צלם כרטיס</string>
<string name="enterCard">הכנס כרטיס</string>
<string name="editCard">עריכת כרטיס</string>
</resources>

View File

@@ -1,21 +1,16 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_search">Cerca</string>
<string name="action_add">Aggiungi</string>
<string name="noGiftCards">Non hai ancora alcuna carta fedeltà. Premi sul bottone +(più) in alto per incominciare.\n\nL\'app ti permette di portare con te le tue carte fedeltà, così da averle sempre a disposizione.</string>
<string name="noMatchingGiftCards">Nessuna carta fedeltà corrisponde al filtro. Riprovare con altri valori</string>
<string name="noMatchingGiftCards">Nessuna carta fedeltà corrisponde al filtro. Riprovare con altri valori.</string>
<string name="storeName">Negozio</string>
<string name="note">Note</string>
<string name="cardId">Codice</string>
<string name="barcodeNoBarcode">Questa carta non ha un codice a barre</string>
<string name="cancel">Annulla</string>
<string name="save">Salva</string>
<string name="capture">Scansione carta</string>
<string name="enterCard">Inserisci carta</string>
<string name="editCard">Modifica carta</string>
<string name="edit">Modifica</string>
<string name="delete">Elimina</string>
@@ -27,20 +22,17 @@
<string name="ok">Ok</string>
<string name="copy_to_clipboard">Copia ID negli appunti</string>
<string name="share">Condividi</string>
<string name="sendLabel">Invia&#8230;</string>
<string name="sendLabel">Invia</string>
<string name="editCardTitle">Modifica carta</string>
<string name="addCardTitle">Aggiungi carta</string>
<string name="scanCardBarcode">Scansiona codice carta</string>
<string name="cardShortcut">Scorciatoia per la carta</string>
<string name="noCardsMessage">Non ci sono carte. Aggiungine prima una</string>
<string name="barcodeImageDescription">Immagine del codice a barre della carta</string>
<string name="noStoreError">Nessun negozio inserito</string>
<string name="noCardIdError">Nessun codice carta inserito</string>
<string name="noCardExistsError">Impossibile trovare la carta</string>
<string name="failedParsingImportUriError">Impossibile analizzare l\'URI</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Importa/Esporta</string>
<string name="exportName">Esporta</string>
<string name="importExportHelp">Fare il backup dei dati ti permette di spostare le tue carte da un dispositivo ad un altro.</string>
@@ -50,38 +42,27 @@
<string name="exportSuccessfulTitle">Esportazione avvenuta con successo</string>
<string name="exportFailedTitle">Esportazione fallita</string>
<string name="exportFailed">Impossibile esportare</string>
<string name="importing">Importazione in corso&#8230;</string>
<string name="exporting">Esportazione in corso&#8230;</string>
<string name="noExternalStoragePermissionError">Impossibile importare o esportare i dati senza il permesso per l\'uso della memoria esterna.</string>
<string name="importing">Importazione in corso</string>
<string name="exporting">Esportazione in corso</string>
<string name="noExternalStoragePermissionError">Impossibile importare o esportare i dati senza il permesso per l\'uso della memoria esterna</string>
<string name="importOptionFilesystemTitle">Importa dal file system</string>
<string name="importOptionFilesystemExplanation">Scegli un file dal file system.</string>
<string name="importOptionFilesystemButton">Dal file system</string>
<string name="importOptionApplicationTitle">Usa un\'applicazione esterna</string>
<string name="importOptionApplicationExplanation">Usa un\'applicazione esterna come Dropbox, Google Drive o il tuo file manager preferito per aprire il file.</string>
<string name="importOptionApplicationButton">Usa un\'applicazione esterna</string>
<string name="about">Informazioni</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Pubblicato sotto licenza GPLv3.</string>
<string name="about_title_fmt">Informazioni su <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versione: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informazione sulla versione: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> usa le seguenti librerie di terze parti: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> usa le seguenti risorse di terze parti: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Seleziona codice a barre</string>
<string name="enterBarcodeInstructions">Immettere l\'ID della carta, quindi selezionare l\'immagine che rappresenta il codice a barre desiderato oppure selezionare &#8220;Questa carta non ha un codice a barre&#8221; per non valorizzare il dato.</string>
<string name="enterBarcodeInstructions">Immettere l\'ID della carta, quindi selezionare l\'immagine che rappresenta il codice a barre desiderato oppure selezionare «Questa carta non ha un codice a barre» per non valorizzare il dato.</string>
<string name="copy_to_clipboard_toast">ID della carta copiato negli appunti</string>
<string name="thumbnailDescription">Miniatura carta</string>
<string name="change">Cambia</string>
<string name="storeTextColorTitle">Colore titolo</string>
<string name="storeTextBackgroundColorTitle">Colore scheda</string>
<string name="storeNameBackgroundColorDescription">Colore di sfondo del titolo carta</string>
<string name="storeNameColorDescription">Colore del titolo carta</string>
<string name="settings">Impostazioni</string>
<string name="settings_category_title_ui">Interfaccia utente</string>
<string name="settings_theme">Tema</string>
@@ -96,4 +77,19 @@
<string name="settings_display_barcode_max_brightness">Aumenta luminosità dello schermo quando apro un codice a barre</string>
<string name="settings_lock_barcode_orientation">Blocca orientamento del codice a barre</string>
<string name="intent_import_card_from_url_share_text">Voglio condividere una carta fedeltà con te</string>
</resources>
<string name="exportSuccessful">Dati della carta fedeltà esportati correttamente</string>
<string name="importSuccessful">Dati della carta fedeltà importati correttamente</string>
<string name="app_copyright_old">Basato su Loyalty Card Keychain, copyright 20162020 Branden Archer.</string>
<string name="exportOptionExplanation">I dati verranno scritti in una posizione a tua scelta.</string>
<string name="barcodeType">Tipo di codice a barre</string>
<string name="unstar">Rimuovi dai preferiti</string>
<string name="star">Aggiungi ai preferiti</string>
<string name="starImage">Stella preferita</string>
<string name="deleteConfirmationGroup">Conferma di voler eliminare questo gruppo</string>
<string name="all">Tutti</string>
<string name="noGroups">Al momento non hai gruppi. Fai clic sul pulsante + (più) per iniziare.
\n
\nLe carte possono essere assegnate a gruppi per renderle più facili da trovare.</string>
<string name="groups">Gruppi</string>
<string name="enter_group_name">Inserisci il nome del gruppo</string>
</resources>

View File

@@ -10,7 +10,6 @@
<string name="cancel">Atšaukti</string>
<string name="save">Išsaugoti</string>
<string name="capture">Nufotografuoti kortelę</string>
<string name="enterCard">Įvesti kortelę</string>
<string name="edit">Redaguoti</string>
<string name="delete">Ištrinti</string>
<string name="confirm">Patvirtinti</string>
@@ -25,7 +24,6 @@
<string name="noStoreError">Parduotuvė neįvesta</string>
<string name="noCardIdError">Neįvestas kortelės ID</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Importuoti/Exportuoti</string>
<string name="exportName">Exportuoti</string>
<string name="importFailed">Nepavyko importuoti</string>
@@ -34,7 +32,6 @@
<string name="exporting">Eksportuoja&#8230;</string>
<string name="noExternalStoragePermissionError">Negalima importuoti/eksportuoti kortelių be išorinės atminties leidimo</string>
<string name="about">Apie</string>
<string name="app_copyright_fmt">Visos teisės saugomos 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Licenzijuota pagal GPLv3.</string>
<string name="about_title_fmt">Apie <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>

View File

@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_add">Legg til</string>
<string name="noGiftCards">Du har ingen kundekort for øyeblikket. Klikk på \"+\" (pluss)-knappen øverst for å komme igang.\n\nDa har du dem alltid hendig.</string>
<string name="noGiftCards">Klikk på \"+\" (pluss)-knappen for å legge til et kort først.
\n
\nDa har du dem alltid hendig.</string>
<string name="storeName">Butikk</string>
<string name="note">Merknad</string>
<string name="cardId">Kort-ID</string>
@@ -9,7 +11,6 @@
<string name="cancel">Avbryt</string>
<string name="save">Lagre</string>
<string name="capture">Les inn kort</string>
<string name="enterCard">Skriv inn kort</string>
<string name="editCard">Rediger kort</string>
<string name="edit">Rediger</string>
<string name="delete">Slett</string>
@@ -21,7 +22,6 @@
<string name="ok">OK</string>
<string name="copy_to_clipboard">Kopier ID til utklippstavle</string>
<string name="sendLabel">Send…</string>
<string name="addedShortcut">Lagt til på hjemmeskjerm</string>
<string name="editCardTitle">Rediger kundekort</string>
<string name="addCardTitle">Legg til kundekort</string>
<string name="scanCardBarcode">Skann kortets strekkode</string>
@@ -30,50 +30,38 @@
<string name="barcodeImageDescription">Bilde av kortets strekkode</string>
<string name="noStoreError">Ingen butikk angitt</string>
<string name="noCardIdError">Ingen kort-ID innskrevet</string>
<string name="noCardExistsError">Kunne ikke finne kundekort</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="noCardExistsError">Kunne ikke finne kort</string>
<string name="importExport">Import/eksport</string>
<string name="exportName">Eksporter</string>
<string name="importExportHelp">Sikkerhetskopiering av data lar deg flytte kortene til en annen enhet.</string>
<string name="importExportHelp">Sikkerhetskopiering av kort lar deg flytte dem til en annen enhet.</string>
<string name="importSuccessfulTitle">Importert</string>
<string name="importFailedTitle">Kunne ikke importere</string>
<string name="importFailed">Klarte ikke å importere</string>
<string name="importFailed">Klarte ikke å importere kort</string>
<string name="exportSuccessfulTitle">Eksportert</string>
<string name="exportFailedTitle">Kunne ikke eksportere</string>
<string name="exportFailed">Klarte ikke å eksportere</string>
<string name="exportFailed">Kunne ikke eksportere kort</string>
<string name="importing">Importerer…</string>
<string name="exporting">Exporterer…</string>
<string name="noExternalStoragePermissionError">Kan ikke importere eller eksportere kort uten tilgang til ekstern lagring</string>
<string name="exportOptionExplanation">Data skrives til rotmappen i eksternt lagringsområde.</string>
<string name="noExternalStoragePermissionError">Innvilg lagringstilgang til eksternlager for å importere eller eksportere kort først</string>
<string name="exportOptionExplanation">Data skrives dit du ønsker det.</string>
<string name="importOptionFilesystemTitle">Importer fra filsystem</string>
<string name="importOptionFilesystemExplanation">Velg spesifikk fil fra filsystemet.</string>
<string name="importOptionFilesystemButton">Fra filsystem</string>
<string name="importOptionApplicationTitle">Brukt eksternt program</string>
<string name="importOptionApplicationExplanation">Bruk eksternt program som Nextcloud, eller din favorittfilbehandler til å åpne ei fil.</string>
<string name="importOptionApplicationTitle">Bruk eksternt program</string>
<string name="importOptionApplicationExplanation">Bruk hvilket som helst program, eller din favoritt-filutforsker for å åpne en fil.</string>
<string name="importOptionApplicationButton">Bruk eksternt program</string>
<string name="about">Om</string>
<string name="app_copyright_fmt">Kopirett 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Lisensiert GPLv3+.</string>
<string name="about_title_fmt">Om <xliff:g id="app_name">%s</xliff:g>
</string>
<string name="debug_version_fmt">Versjon: <xliff:g id="version">%s</xliff:g>
</string>
<string name="app_license">Gemenhetslig fri programvare, lisensiert GPLv3+.</string>
<string name="about_title_fmt">Om <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versjon: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Utgivelsesinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries">
<xliff:g id="app_name">%s</xliff:g> brukfer følgende tredjepartsbibliotek: <xliff:g id="app_libraries_list">%s</xliff:g>
</string>
<string name="app_resources">
<xliff:g id="app_name">%s</xliff:g> bruker følgende tredjepartsressurser: <xliff:g id="app_resources_list">%s</xliff:g>
</string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> brukfer følgende tredjepartsbibliotek: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> bruker følgende tredjepartsressurser: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Velg strekkode</string>
<string name="enterBarcodeInstructions">Skriv inn strekkodeverdien og velg så bildet som representerer strekkoden du ønsker å bruke.</string>
<string name="copy_to_clipboard_toast">Kort-ID kopiert til utklippstavle</string>
<string name="thumbnailDescription">Miniatyrbilde for kort</string>
<string name="change">Endre</string>
<string name="storeTextColorTitle">Skriftstørrelse for butikktekst</string>
<string name="storeTextBackgroundColorTitle">Overskriftsfarge</string>
<string name="storeNameBackgroundColorDescription">Farge for butikktekstbakgrunn</string>
<string name="storeNameColorDescription">Butikktekstfarge</string>
<string name="settings">Innstillinger</string>
<string name="settings_category_title_ui">Brukergrensesnitt</string>
<string name="settings_card_title_list_font_size">Korttittelskriftstørrelse</string>
@@ -83,4 +71,35 @@
<string name="settings_card_note_font_size">Skriftstørrelse for kortmerknad</string>
<string name="settings_display_barcode_max_brightness">Lysere strekkodevisning</string>
<string name="settings_lock_barcode_orientation">Lås strekkodesideretning</string>
<string name="exportSuccessful">Kortdata eksportert</string>
<string name="importSuccessful">Kortdata importert</string>
<string name="intent_import_card_from_url_share_text">Jeg ønsker å dele et kort med deg</string>
<string name="settings_dark_theme">Mørk</string>
<string name="settings_light_theme">Lys</string>
<string name="settings_system_theme">System</string>
<string name="settings_theme">Drakt</string>
<string name="app_copyright_old">Basert på Kundekortknippe, opphavsrett 20162020 Branden Archer.</string>
<string name="failedParsingImportUriError">Kunne ikke tolke importerings-URI</string>
<string name="share">Del</string>
<string name="barcodeNoBarcode">Dette kortet har ingen strekkode</string>
<string name="noMatchingGiftCards">Fant ikke noe. Prøv å endre søket.</string>
<string name="action_search">Søk</string>
<string name="starImage">Favorittstjerne</string>
<string name="unstar">Fjern fra favoritter</string>
<string name="star">Legg til i favoritter</string>
<string name="noGroups">Klikk på «+»-tegnet for å legge til grupper først.
\n
\nGrupper gjør ting enklere å finne.</string>
<string name="deleteConfirmationGroup">Bekreft at du ønsker å slette denne gruppen</string>
<string name="all">Alle</string>
<string name="groups">Grupper</string>
<string name="enter_group_name">Skriv inn gruppenavn</string>
<string name="noBarcode">Ingen strekkode</string>
<string name="failedOpeningFileManager">Klarte ikke å åpne noen filbehandler. Forsikre deg om at du har installert en.</string>
<string name="leaveWithoutSaveConfirmation">Er du sikker på at du vil forlate denne skjermen\? Endringer vil ikke bli lagret.</string>
<string name="leaveWithoutSaveTitle">Forlat uten å lagre</string>
<string name="addManually">Skriv inn kort-ID manuelt</string>
<string name="addWithCamera">Skann strekkoden med kameraet ditt</string>
<string name="moveDown">Flytt nedover i listen</string>
<string name="moveUp">Flytt oppover i listen</string>
</resources>

View File

@@ -15,4 +15,6 @@
<color name="inputBackground">#000000</color>
<color name="inputBorder">#222222</color>
<color name="inputDividerBorder">#666666</color>
<color name="iconColor">#ffffff</color>
</resources>

View File

@@ -1,22 +1,19 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_search">Zoeken</string>
<string name="action_add">Toevoegen</string>
<string name="noGiftCards">Je hebt nog geen klantenkaarten toegevoegd. Druk op de knop \'+\' (plus) om te beginnen.\n\nMet Klantenkaartkluis beheer je je klantenkaarten op je smartphone of tablet zodat ze altijd binnen handbereik zijn.</string>
<string name="noMatchingGiftCards">Er zijn geen kaarten die overeenkomen met je zoekopdracht. Probeer het opnieuw.</string>
<string name="noGiftCards">Druk op de knop \'+\' (plus) om een kaart toe te voegen.
\n
\nMet Catima heb je je klantenkaarten altijd binnen handbereik, gewoon op je apparaat.</string>
<string name="noMatchingGiftCards">Geen zoekresultaten. Probeer een andere zoekopdracht.</string>
<string name="storeName">Winkel</string>
<string name="note">Aantekening</string>
<string name="cardId">Kaartnummer</string>
<string name="barcodeType">Soort barcode</string>
<string name="barcodeNoBarcode">Deze kaart heeft geen barcode</string>
<string name="cancel">Annuleren</string>
<string name="save">Opslaan</string>
<string name="capture">Scan een kaart</string>
<string name="enterCard">Voer een kaartnummer in</string>
<string name="editCard">Kaart bewerken</string>
<string name="edit">Bewerken</string>
<string name="delete">Verwijderen</string>
@@ -28,75 +25,86 @@
<string name="ok">Oké</string>
<string name="copy_to_clipboard">Kaartnummer kopiëren naar klembord</string>
<string name="share">Delen</string>
<string name="sendLabel">Versturen&#8230;</string>
<string name="addedShortcut">Snelkoppeling is toegevoegd</string>
<string name="editCardTitle">Klantenkaart bewerken</string>
<string name="addCardTitle">Klantenkaart toevoegen</string>
<string name="sendLabel">Versturen</string>
<string name="editCardTitle">Kaart bewerken</string>
<string name="addCardTitle">Kaart toevoegen</string>
<string name="scanCardBarcode">Scan de barcode van de kaart</string>
<string name="cardShortcut">Kaartsnelkoppeling</string>
<string name="noCardsMessage">Je hebt nog geen kaarten toegevoegd.</string>
<string name="noCardsMessage">Voeg eerst een kaart toe</string>
<string name="barcodeImageDescription">Afbeelding van barcode</string>
<string name="noStoreError">Geen winkelnaam ingevoerd</string>
<string name="noCardIdError">Geen kaartnummer ingevoerd</string>
<string name="noCardExistsError">De klantenkaart kan niet worden opgevraagd</string>
<string name="noCardExistsError">De kaart is niet aangetroffen</string>
<string name="failedParsingImportUriError">Kan de import-uri niet verwerken</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Importeren/Exporteren</string>
<string name="exportName">Exporteren</string>
<string name="importExportHelp">Door de gegevens te back-uppen kun je je kaarten overzetten naar een ander apparaat.</string>
<string name="importExportHelp">Door je kaarten te back-uppen, kun je ze overzetten naar een ander apparaat.</string>
<string name="importSuccessfulTitle">Importeren voltooid</string>
<string name="importFailedTitle">Importeren mislukt</string>
<string name="importFailed">Het importeren is mislukt</string>
<string name="exportSuccessfulTitle">Exporteren voltooid</string>
<string name="exportFailedTitle">Exporteren mislukt</string>
<string name="exportFailed">Het exporteren is mislukt</string>
<string name="importing">Bezig met importeren&#8230;...</string>
<string name="exporting">Bezig met exporteren&#8230;...</string>
<string name="noExternalStoragePermissionError">Het importeren of exporteren van kaarten is niet mogelijk zonder de machtiging \'externe opslag\'.</string>
<string name="importing">Bezig met importeren</string>
<string name="exporting">Bezig met exporteren</string>
<string name="noExternalStoragePermissionError">Verleen het recht \'externe opslag\' om kaarten te kunnen im- of exporteren</string>
<string name="exportOptionExplanation">De gegevens worden weggeschreven op een locatie naar keuze.</string>
<string name="importOptionFilesystemTitle">Importeren uit bestandssysteem</string>
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand uit het bestandssysteem.</string>
<string name="importOptionFilesystemButton">Uit bestandssysteem</string>
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand vanop het bestandssysteem.</string>
<string name="importOptionFilesystemButton">Van bestandssysteem</string>
<string name="importOptionApplicationTitle">Externe app gebruiken</string>
<string name="importOptionApplicationExplanation">Open een bestand middels een externe app, zoals Dropbox, Google Drive of je favoriete bestandsbeheerder.</string>
<string name="importOptionApplicationExplanation">Open een bestand middels een app of je favoriete bestandsbeheerder.</string>
<string name="importOptionApplicationButton">Externe app gebruiken</string>
<string name="about">Over</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Uitgebracht onder de GPLv3-licentie.</string>
<string name="app_license">Vrije software, uitgebracht onder de GPLv3-licentie.</string>
<string name="about_title_fmt">Over <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versie: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Versie-informatie: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> gebruikt de volgende bibliotheken van externe partijen: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> gebruikt de volgende bronnen van externe partijen: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Barcode toevoegen</string>
<string name="enterBarcodeInstructions">Voer de barcode in en kies daarna de afbeelding van de barcode die je wilt gebruiken., of druk op &#8220;Deze kaart heeft geen barcode&#8221; om geen barcode te gebruiken.</string>
<string name="enterBarcodeInstructions">Voer de barcode in en kies daarna de afbeelding van de barcode die je wilt gebruiken of druk op Deze kaart heeft geen barcode om geen barcode te gebruiken.</string>
<string name="copy_to_clipboard_toast">Kaartnummer is gekopieerd naar het klembord</string>
<string name="thumbnailDescription">Miniatuurvoorbeeld van kaart</string>
<string name="change">Aanpassen</string>
<string name="storeTextColorTitle">Tekstkleur van winkelnaam</string>
<string name="storeTextBackgroundColorTitle">Kopkleur</string>
<string name="storeNameBackgroundColorDescription">Achtergrondkleur van winkeltekst</string>
<string name="storeNameColorDescription">Kleur van winkeltekst</string>
<string name="settings">Instellingen</string>
<string name="settings_category_title_ui">Uiterlijk en bediening</string>
<string name="settings_category_title_ui">Vormgeving</string>
<string name="settings_theme">Thema</string>
<string name="settings_system_theme">Systeemthema</string>
<string name="settings_system_theme">Systeem</string>
<string name="settings_light_theme">Licht</string>
<string name="settings_dark_theme">Donker</string>
<string name="settings_card_title_list_font_size">Lettergrootte van kaartnamen op de lijst</string>
<string name="settings_card_note_list_font_size">Lettergrootte van aantekeningen op de lijst</string>
<string name="settings_card_title_font_size">Lettergrootte van kaartnamen</string>
<string name="settings_card_title_list_font_size">Lettergrootte van kaartnamen (lijstmodus)</string>
<string name="settings_card_note_list_font_size">Lettergrootte van aantekeningen (lijstmodus)</string>
<string name="settings_card_title_font_size">Lettergrootte van kaartnamen (voorvertoning)</string>
<string name="settings_card_id_font_size">Lettergrootte van kaartnummer</string>
<string name="settings_card_note_font_size">Lettergrootte van aantekeningen</string>
<string name="settings_card_note_font_size">Lettergrootte van aantekeningen (voorvertoning)</string>
<string name="settings_display_barcode_max_brightness">Scherm helderder maken bij tonen van barcode</string>
<string name="settings_lock_barcode_orientation">Barcode-oriëntatie vergrendelen</string>
<string name="intent_import_card_from_url_share_text">Ik wil een klantenkaart met je delen</string>
</resources>
<string name="all">Alles</string>
<string name="importSuccessful">De kaartgegevens zijn geïmporteerd</string>
<string name="deleteConfirmationGroup">Bevestig dat je deze groep wilt verwijderen</string>
<string name="noGroups">Druk op de knop \'+\' (plus) om een groep toe te voegen.
\n
\nDoor kaarten te groeperen vind je ze makkelijker terug.</string>
<string name="exportSuccessful">De kaartgegevens zijn geëxporteerd</string>
<string name="groups">Groepen</string>
<string name="enter_group_name">Voer een groepsnaam in</string>
<string name="starImage">Favoriete ster</string>
<string name="app_copyright_old">Gebaseerd op Loyalty Card Keychain, copyright 20162020 Branden Archer.</string>
<string name="unstar">Verwijderen uit favorieten</string>
<string name="star">Toevoegen aan favorieten</string>
<string name="addManually">Kaartnummer handmatig invoeren</string>
<string name="addWithCamera">Barcode scannen met camera</string>
<string name="leaveWithoutSaveConfirmation">Weet je zeker dat je dit wilt\? Hierdoor worden je aanpassingen niet opgeslagen.</string>
<string name="leaveWithoutSaveTitle">Afbreken zonder opslaan</string>
<string name="moveDown">Omlaag verplaatsen</string>
<string name="moveUp">Omhoog verplaatsen</string>
<string name="failedOpeningFileManager">Kan de bestandsbeheerder niet openen - zorg dat je er een hebt geïnstalleerd.</string>
<string name="noBarcode">Geen barcode</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> kaart</item>
<item quantity="other"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> kaarten</item>
</plurals>
<string name="groupsList">Groepen: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g></string>
</resources>

View File

@@ -1,21 +1,16 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_search">Szukaj</string>
<string name="action_add">Dodaj</string>
<string name="noGiftCards">W tej chwili nie masz żadnych kart lojalnościowych. Kliknij przycisk \"+\" (plus) u góry, aby rozpocząć. \n\nLoyalty Locker Card pozwala nosić karty lojalnościowe w telefonie, dzięki czemu są zawsze w zasięgu ręki.</string>
<string name="noMatchingGiftCards">Żadne karty lojalnościowe nie pasują do filtra wyszukiwania. Spróbuj użyć innych warunków.</string>
<string name="noMatchingGiftCards">Nic nie znaleziono. Spróbuj zmienić wyszukiwanie.</string>
<string name="storeName">Sklep</string>
<string name="note">Notatka</string>
<string name="cardId">Identyfikator karty</string>
<string name="barcodeNoBarcode">Ta karta nie ma kodu kreskowego</string>
<string name="cancel">Anuluj</string>
<string name="save">Zapisz</string>
<string name="capture">Zeskanuj kod</string>
<string name="enterCard">Wprowadź ręcznie</string>
<string name="editCard">Edytuj kartę</string>
<string name="edit">Edytuj</string>
<string name="delete">Usuń</string>
@@ -27,61 +22,47 @@
<string name="ok">OK</string>
<string name="copy_to_clipboard">Skopiuj identyfikator do schowka</string>
<string name="share">Udostępnij</string>
<string name="sendLabel">Wyślij&#8230;</string>
<string name="sendLabel">Wyślij</string>
<string name="editCardTitle">Edytuj kartę lojalnościową</string>
<string name="addCardTitle">Dodaj kartę lojalnościową</string>
<string name="scanCardBarcode">Zeskanuj kod kreskowy karty lojalnościowej</string>
<string name="cardShortcut">Skrót karty</string>
<string name="noCardsMessage">Nie ma kart, należy dodać pierwszą</string>
<string name="noCardsMessage">Najpierw dodaj kartę</string>
<string name="barcodeImageDescription">Obraz kodu kreskowego karty</string>
<string name="noStoreError">Nie wprowadzono nazwy sklepu</string>
<string name="noCardIdError">Nie wprowadzono identyfikatora karty</string>
<string name="noCardExistsError">Nie można wyszukać karty lojalnościowej</string>
<string name="failedParsingImportUriError">Nie można przeanalizować identyfikatora importu URI</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Importuj/Eksportuj</string>
<string name="exportName">Eksportuj</string>
<string name="importExportHelp">Zarchiwizowane dane umożliwiają przeniesienie kart na inne urządzenie.</string>
<string name="importSuccessfulTitle">Zaimportowano pomyślnie</string>
<string name="importSuccessfulTitle">Zaimportowano</string>
<string name="importFailedTitle">Import nie powiódł się</string>
<string name="importFailed">Nie udało się zaimportować</string>
<string name="exportSuccessfulTitle">Wyeksportowano pomyślnie</string>
<string name="exportSuccessfulTitle">Wyeksportowano</string>
<string name="exportFailedTitle">Eksport nie powiódł się</string>
<string name="exportFailed">Nie udało się wyeksportować</string>
<string name="importing">Importowanie&#8230;</string>
<string name="exporting">Eksportowanie&#8230;</string>
<string name="noExternalStoragePermissionError">Nie można importować ani eksportować kart bez uprawnień do pamięci zewnętrznej</string>
<string name="importing">Importowanie</string>
<string name="exporting">Eksportowanie</string>
<string name="noExternalStoragePermissionError">Najpierw przyznaj uprawnienia pamięci zewnętrznej do importowania lub eksportowania kart</string>
<string name="importOptionFilesystemTitle">Importuj z systemu plików</string>
<string name="importOptionFilesystemExplanation">Wybierz określony plik z systemu plików.</string>
<string name="importOptionFilesystemButton">Z systemu plików</string>
<string name="importOptionApplicationTitle">Użyj zewnętrznej aplikacji</string>
<string name="importOptionApplicationExplanation">Użyj zewnętrznej aplikacji jak Dropbox, Google Drive, bądź ulubiony menedżer plików, aby otworzyć plik.</string>
<string name="importOptionApplicationExplanation">Użyj dowolnej aplikacji lub ulubionego menedżera plików, aby otworzyć plik.</string>
<string name="importOptionApplicationButton">Użyj zewnętrznej aplikacji</string>
<string name="about">O aplikacji</string>
<string name="app_copyright_fmt">© 2016 — <xliff:g>%d</xliff:g> Branden Archer.</string>
<string name="app_license">Licencjonowane na podstawie GNU General Public License, wersji 3.0.</string>
<string name="app_license">Wolne oprogramowanie copylefted, licencjonowane GPLv3 +.</string>
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Wersja: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informacje o wersji: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_revision_fmt">Info o wydaniu: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> wykorzystuje następujące biblioteki osób trzecich: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> wykorzystuje następujące zasoby osób trzecich: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Wybierz kod kreskowy</string>
<string name="enterBarcodeInstructions">Wprowadź identyfikator karty, a następnie wybierz obraz reprezentujący kod kreskowy, którego chcesz użyć, lub wybierz &#8220;Ta karta nie ma kodu kreskowego&#8221;, aby nie używać kodu kreskowego.</string>
<string name="enterBarcodeInstructions">Wprowadź identyfikator karty, a następnie wybierz obraz reprezentujący kod kreskowy, którego chcesz użyć, lub wybierz Ta karta nie ma kodu kreskowego, aby nie używać kodu kreskowego.</string>
<string name="copy_to_clipboard_toast">Skopiowano identyfikator karty do schowka</string>
<string name="thumbnailDescription">Miniaturka karty</string>
<string name="change">Zmień</string>
<string name="storeTextColorTitle">Kolor tekstu nazwy sklepu</string>
<string name="storeTextBackgroundColorTitle">Kolor nagłówka</string>
<string name="storeNameBackgroundColorDescription">Kolor tła tekstu nazwy sklepu</string>
<string name="storeNameColorDescription">Kolor dla tekstu sklepu</string>
<string name="settings">Ustawienia</string>
<string name="settings_category_title_ui">Interfejs użytkownika</string>
<string name="settings_theme">Motyw</string>
@@ -96,4 +77,20 @@
<string name="settings_display_barcode_max_brightness">Rozjaśnij widok kodu kreskowego</string>
<string name="settings_lock_barcode_orientation">Zablokuj autoobracanie kodów kreskowych</string>
<string name="intent_import_card_from_url_share_text">Chcę udostępnić Ci kartę lojalnościową</string>
</resources>
<string name="deleteConfirmationGroup">Potwierdź, że chcesz usunąć tę grupę</string>
<string name="all">Wszystko</string>
<string name="noGroups">Kliknij przycisk + (plus), aby najpierw dodać grupy.
\n
\nGrupy ułatwiają wyszukiwanie.</string>
<string name="groups">Grupy</string>
<string name="enter_group_name">Wpisz nazwę grupy</string>
<string name="exportSuccessful">Dane karty zostały wyeksportowane</string>
<string name="importSuccessful">Zaimportowano dane karty</string>
<string name="starImage">Ulubiona gwiazda</string>
<string name="app_copyright_old">Na podstawie Loyalty Card Keychain, prawa autorskie 20162020 Branden Archer.</string>
<string name="exportOptionExplanation">Dane zostaną zapisane w wybranym przez Ciebie miejscu.</string>
<string name="unstar">Usuń z ulubionych</string>
<string name="star">Dodaj do ulubionych</string>
<string name="noBarcode">Brak kodu kreskowego</string>
<string name="barcodeType">Typ kodu kreskowego</string>
</resources>

View File

@@ -1,22 +1,19 @@
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_search">Поиск</string>
<string name="action_add">Добавить карту</string>
<string name="noGiftCards">Пока нет ни одной карты. Нажмите на кнопку «+» (плюс) сверху для добавления.\n\n«Карты лояльности» позволяют хранить карты скидок в телефоне, так что они всегда будут под рукой.</string>
<string name="noMatchingGiftCards">Карт не найдено, попробуйте поискать по-другому.</string>
<string name="noGiftCards">Нажмите кнопку + (плюс), чтобы сначала добавить карту.
\n
\nCatima хранит ваши карты на устройстве, поэтому они всегда под рукой.</string>
<string name="noMatchingGiftCards">"Ничего не найдено. Попробуйте изменить свой поиск."</string>
<string name="storeName">Магазин</string>
<string name="note">Примечание</string>
<string name="cardId">Номер карты</string>
<string name="barcodeType">Тип штрихкода</string>
<string name="barcodeNoBarcode">Эта карта без штрихкода</string>
<string name="cancel">Отменить</string>
<string name="save">Сохранить</string>
<string name="capture">Сканировать карту</string>
<string name="enterCard">Ввести номер</string>
<string name="editCard">Редактировать штрих-код</string>
<string name="edit">Редактировать</string>
<string name="delete">Удалить карту</string>
@@ -28,70 +25,55 @@
<string name="ok">ОК</string>
<string name="copy_to_clipboard">Скопировать номер карты в буфер обмена</string>
<string name="share">Переслать</string>
<string name="sendLabel">Отправить&#8230;</string>
<string name="addedShortcut">Добавленный ярлык</string>
<string name="sendLabel">Отправить</string>
<string name="editCardTitle">Редактировать карту</string>
<string name="addCardTitle">Добавить карту</string>
<string name="scanCardBarcode">Отсканируйте штрих-код</string>
<string name="cardShortcut">Ярлык карты</string>
<string name="noCardsMessage">Карт нет, добавьте одну для начала</string>
<string name="barcodeImageDescription">Изображение штрих-кода</string>
<string name="noCardsMessage">Сначала добавьте карту</string>
<string name="barcodeImageDescription">Изображение штрих-кода карты</string>
<string name="noStoreError">Название магазина не указано</string>
<string name="noCardIdError">Номер карты не указан</string>
<string name="noCardExistsError">Карта не найдена</string>
<string name="failedParsingImportUriError">Не удалось разобрать импортируемый URI</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Импорт/Экспорт</string>
<string name="exportName">Экспорт</string>
<string name="importExportHelp">Сохранение карт позволяет перенести их на другое устройство.</string>
<string name="importSuccessfulTitle">Успешный импорт</string>
<string name="importExportHelp">Резервное копирование карт позволяет переместить их на другое устройство.</string>
<string name="importSuccessfulTitle">Импортировано</string>
<string name="importFailedTitle">Импорт не удался</string>
<string name="importFailed">Не удалось импортировать</string>
<string name="exportSuccessfulTitle">Успешный экспорт</string>
<string name="importFailed">Не удалось импортировать карты</string>
<string name="exportSuccessfulTitle">Экспортировано</string>
<string name="exportFailedTitle">Экспорт не удался</string>
<string name="exportFailed">Не удалось экспортировать</string>
<string name="importing">Импорт&#8230;</string>
<string name="exporting">Экспорт&#8230;</string>
<string name="importing">Импорт</string>
<string name="exporting">Экспорт</string>
<string name="noExternalStoragePermissionError">Импорт или экспорт невозможен без разрешения на доступ к хранилищу</string>
<string name="exportOptionExplanation">Данные будут записаны в выбранное место.</string>
<string name="importOptionFilesystemTitle">Импорт из файловой системы</string>
<string name="importOptionFilesystemExplanation">Выберете файл на файловой системе.</string>
<string name="importOptionFilesystemButton">Выбрать файл</string>
<string name="importOptionApplicationTitle">Использование другого приложения</string>
<string name="importOptionApplicationExplanation">Использовать другое приложение такое как Dropbox, Google Drive, или ваш любимый файловый менеджер чтобы открыть файл.</string>
<string name="importOptionApplicationExplanation">Используйте любое приложение или ваш любимый файловый менеджер, чтобы открыть файл.</string>
<string name="importOptionApplicationButton">Использовать другое приложение</string>
<string name="about">О программе</string>
<string name="app_copyright_fmt">Все права защищены 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Лицензия GPLv3.</string>
<string name="app_license">Авторское лево свободного программного обеспечения, лицензия GPLv3+.</string>
<string name="about_title_fmt">О программе <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Версия: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Информация о версиях: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> использует следующие сторонние библиотеки: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> использует следующие сторонние ресурсы: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Выбор штрих-кода</string>
<string name="enterBarcodeInstructions">Введите ID карты и выберите тип штрих-кода.</string>
<string name="copy_to_clipboard_toast">Номер карты скопирован в буфер обмена</string>
<string name="thumbnailDescription">Логотип карты</string>
<string name="change">Изменить</string>
<string name="storeTextColorTitle">Цвет текста</string>
<string name="storeTextBackgroundColorTitle">Цвет фона</string>
<string name="storeNameBackgroundColorDescription">Цвет фона названия магазина</string>
<string name="storeNameColorDescription">Цвет текста названия магазина</string>
<string name="settings">Настройки</string>
<string name="settings_category_title_ui">Внешний вид</string>
<string name="settings_theme">Тема</string>
<string name="settings_system_theme">Системная тема</string>
<string name="settings_light_theme">Светлая тема</string>
<string name="settings_dark_theme">Тёмная тема</string>
<string name="settings_card_title_list_font_size">Размер шрифта названия карты для списка</string>
<string name="settings_system_theme">Системная</string>
<string name="settings_light_theme">Светлая</string>
<string name="settings_dark_theme">Тёмная</string>
<string name="settings_card_title_list_font_size">Размер шрифта для названий карт</string>
<string name="settings_card_note_list_font_size">Размер шрифта примечания для списка</string>
<string name="settings_card_title_font_size">Размер шрифта названия карты</string>
<string name="settings_card_id_font_size">Размер шрифта номера карты</string>
@@ -99,4 +81,21 @@
<string name="settings_display_barcode_max_brightness">Максимальная яркость при показе карты</string>
<string name="settings_lock_barcode_orientation">Портретная ориентация экрана при показе карты</string>
<string name="intent_import_card_from_url_share_text">Я хочу поделиться картой с вами</string>
</resources>
<string name="exportSuccessful">Данные карты экспортированы</string>
<string name="all">Все</string>
<string name="noGroups">Нажмите кнопку + (плюс), чтобы сначала добавить группы.
\n
\nГруппы упрощают поиск.</string>
<string name="groups">Группы</string>
<string name="enter_group_name">Введите название группы</string>
<string name="importSuccessful">Данные карты лояльности успешно импортированы</string>
<string name="starImage">Любимая звезда</string>
<string name="app_copyright_old">На основе Loyalty Card Keychain, авторские права 20162020 Branden Archer.</string>
<string name="unstar">Удалить из избранного</string>
<string name="star">Добавить в избранное</string>
<string name="noBarcode">Нет штрих-кода</string>
<string name="deleteConfirmationGroup">Подтвердите, что хотите удалить эту группу</string>
<string name="leaveWithoutSaveConfirmation">Вы уверены, что хотите покинуть этот экран\? Изменения не будут сохранены.</string>
<string name="leaveWithoutSaveTitle">Выйти без сохранения</string>
<string name="failedOpeningFileManager">Не удалось открыть файловый менеджер. Пожалуйста, убедитись, что он установлен.</string>
</resources>

View File

@@ -10,7 +10,6 @@
<string name="cancel">Zrušiť</string>
<string name="save">Uložiť</string>
<string name="capture">Zosnímať kartu</string>
<string name="enterCard">Zadať kód</string>
<string name="editCard">Úprava karty</string>
<string name="edit">Upraviť</string>
<string name="delete">Vymazať</string>
@@ -33,7 +32,6 @@
<string name="noStoreError">Nebol zadaný obchod</string>
<string name="noCardIdError">Nebolo zadané ID karty</string>
<string name="noCardExistsError">Nie je možné vyhľadať vernostnú kartu</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="importExport">Import/Export</string>
<string name="exportName">Export</string>
<string name="importExportHelp">Zálohovanie dát Vám umožní presunúť Vaše uložené karty na iné zariadenie.</string>
@@ -54,7 +52,6 @@
<string name="importOptionApplicationButton">Použiť externú aplikáciu</string>
<string name="about">O aplikácii</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Licencované GPLv3.</string>
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verzia: <xliff:g id="version">%s</xliff:g></string>
@@ -68,10 +65,6 @@
<string name="thumbnailDescription">Náhľad karty</string>
<string name="change">Upraviť</string>
<string name="storeTextColorTitle">Farba textu</string>
<string name="storeTextBackgroundColorTitle">Farba hlavičky</string>
<string name="storeNameBackgroundColorDescription">Farba hlavičky</string>
<string name="storeNameColorDescription">Farba textu</string>
<string name="settings">Nastavenia</string>
<string name="settings_category_title_ui">Používateľské prostredie</string>

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