mirror of
https://github.com/CatimaLoyalty/Android.git
synced 2026-01-15 18:38:03 -05:00
Compare commits
259 Commits
create-pul
...
create-pul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f62323431a | ||
|
|
117e08d957 | ||
|
|
c7bf1f5f30 | ||
|
|
1a7a2d31f4 | ||
|
|
8fd4335a98 | ||
|
|
6b4b0e846b | ||
|
|
451fa87990 | ||
|
|
2c50c2b48c | ||
|
|
8b9c26ad5a | ||
|
|
ef7db55d8c | ||
|
|
8f2d39d0ec | ||
|
|
3597e3098f | ||
|
|
0702fc579c | ||
|
|
017cf19d27 | ||
|
|
83a3a5b9e2 | ||
|
|
54828c3c93 | ||
|
|
31e517d7ee | ||
|
|
00957ac576 | ||
|
|
852c38d88d | ||
|
|
67314b09a9 | ||
|
|
944e2ca0c0 | ||
|
|
68564864d5 | ||
|
|
19bccc0c82 | ||
|
|
04905edab4 | ||
|
|
179a9adbe5 | ||
|
|
3925a79158 | ||
|
|
71de6f8c99 | ||
|
|
9d81ca5c9b | ||
|
|
75c393af92 | ||
|
|
3e16515b6c | ||
|
|
3e9857f14f | ||
|
|
20ee7c9324 | ||
|
|
fa6ee155ac | ||
|
|
c186e53eab | ||
|
|
75abd6f80c | ||
|
|
0a98e6154c | ||
|
|
c2b31fad43 | ||
|
|
2043dffc10 | ||
|
|
244aabcc1a | ||
|
|
a1faed8717 | ||
|
|
fcf9176523 | ||
|
|
30db9e3cd6 | ||
|
|
fb3df0ff4d | ||
|
|
9b4b48e6e3 | ||
|
|
9a9cdaff09 | ||
|
|
3a82efcf6f | ||
|
|
7c2d08b06f | ||
|
|
aebe84c2cd | ||
|
|
3768f0ebcf | ||
|
|
8f7d527c21 | ||
|
|
54ec5ee0d0 | ||
|
|
dccb244c8f | ||
|
|
a37084af1a | ||
|
|
af0a7ae89b | ||
|
|
315cbab4be | ||
|
|
bc3830d685 | ||
|
|
4893d28bb0 | ||
|
|
2a7670e19d | ||
|
|
86e6a1bb2d | ||
|
|
d1d3f95dfe | ||
|
|
ebfc90e998 | ||
|
|
704db9eb46 | ||
|
|
3557870d34 | ||
|
|
59354c7251 | ||
|
|
cae25599f8 | ||
|
|
e89eb46f79 | ||
|
|
039b433d0a | ||
|
|
0319d16f2b | ||
|
|
f11c45d169 | ||
|
|
572c0fea4a | ||
|
|
5e9d364e5e | ||
|
|
57d62fdb29 | ||
|
|
0c7332396b | ||
|
|
7bdca36f53 | ||
|
|
f8a8a84f1e | ||
|
|
8009baca26 | ||
|
|
e0786594bc | ||
|
|
7fe67960bf | ||
|
|
83fca93649 | ||
|
|
96a9850d9c | ||
|
|
1cb9ddecac | ||
|
|
f7697ce8bf | ||
|
|
9358348795 | ||
|
|
711ca1e761 | ||
|
|
8eeff0058b | ||
|
|
ea456c6d80 | ||
|
|
3bdc06b5b4 | ||
|
|
2c9fbfcae8 | ||
|
|
e4a28f9fc9 | ||
|
|
630bf14387 | ||
|
|
4dd85f845e | ||
|
|
8382d1975b | ||
|
|
4d4cac6a9e | ||
|
|
5bd276a32d | ||
|
|
e31ad60d32 | ||
|
|
f511b29fcb | ||
|
|
158abdb96c | ||
|
|
959f6770dd | ||
|
|
c429fef56d | ||
|
|
4ce8d293f4 | ||
|
|
ef9b28671b | ||
|
|
e3afaa1d49 | ||
|
|
094e6951d0 | ||
|
|
73f33e238c | ||
|
|
d1b8051771 | ||
|
|
17fd6db65f | ||
|
|
e6345bc2fe | ||
|
|
208b1a2eba | ||
|
|
b796425551 | ||
|
|
425a9f9a57 | ||
|
|
3701c1f2cb | ||
|
|
7a5233ed1a | ||
|
|
5df349c118 | ||
|
|
f97da3afcb | ||
|
|
d997759ccf | ||
|
|
5e710ba424 | ||
|
|
88c1dd1bc6 | ||
|
|
b63fbfa4c6 | ||
|
|
565b441444 | ||
|
|
6900cf3475 | ||
|
|
2c0c63aad4 | ||
|
|
b48e6f2437 | ||
|
|
37b4096713 | ||
|
|
7a0894e4d2 | ||
|
|
e6f8c29078 | ||
|
|
b1672408c3 | ||
|
|
b79f2ae51d | ||
|
|
2a758d2e57 | ||
|
|
07def17334 | ||
|
|
1c3fb47c89 | ||
|
|
d1e4deb7eb | ||
|
|
ad97571ab0 | ||
|
|
4bbf0983c5 | ||
|
|
13e86e5e53 | ||
|
|
454070c346 | ||
|
|
10458d9975 | ||
|
|
823c38c50c | ||
|
|
a593e68ffb | ||
|
|
5ef8cf5381 | ||
|
|
db94d5bc5d | ||
|
|
b6fe1bc2a7 | ||
|
|
78754ca313 | ||
|
|
8e8667b721 | ||
|
|
40731104cb | ||
|
|
879872202a | ||
|
|
0fcf16d9d2 | ||
|
|
23d27ab838 | ||
|
|
0b4df647d1 | ||
|
|
a74c4f822e | ||
|
|
389372e8f3 | ||
|
|
c228d274b5 | ||
|
|
d8e0e03aa5 | ||
|
|
171dd7af59 | ||
|
|
10bf27a246 | ||
|
|
199c243eb0 | ||
|
|
11b0143b1c | ||
|
|
f2e20eaea3 | ||
|
|
c8725a4588 | ||
|
|
f881965485 | ||
|
|
3e16d0daf6 | ||
|
|
7068f57443 | ||
|
|
8b611511f5 | ||
|
|
1c9f0ee724 | ||
|
|
2d816b39f6 | ||
|
|
c0b13bf040 | ||
|
|
e40d98f386 | ||
|
|
8af295a72b | ||
|
|
ac4dde1f8b | ||
|
|
2dc87fd37c | ||
|
|
aebceec1f6 | ||
|
|
95b59a9cc3 | ||
|
|
4ff72b66a8 | ||
|
|
d1162d0272 | ||
|
|
794ac2bab2 | ||
|
|
7b76fe86b2 | ||
|
|
4387c7ed1e | ||
|
|
f819fc7db9 | ||
|
|
fb5a882fdb | ||
|
|
be8c0a6787 | ||
|
|
5dc84fbd77 | ||
|
|
0c37827fb0 | ||
|
|
cee5d39b27 | ||
|
|
9c5603eae6 | ||
|
|
dd42c99ca7 | ||
|
|
403c60ec6c | ||
|
|
7c7e6d3b45 | ||
|
|
316e51efb2 | ||
|
|
9e838e266b | ||
|
|
a56b984c53 | ||
|
|
4040b270a8 | ||
|
|
eab8614bcc | ||
|
|
ef8befe0cd | ||
|
|
860b79fc9b | ||
|
|
93341fc4ec | ||
|
|
51f123bc41 | ||
|
|
f0512fbeca | ||
|
|
71f6fcd2e6 | ||
|
|
d1a244efa0 | ||
|
|
075478db17 | ||
|
|
6f4582eec9 | ||
|
|
91f5f9a8b4 | ||
|
|
f04adc0901 | ||
|
|
f184ee7e58 | ||
|
|
9abeec578e | ||
|
|
8deab5f94f | ||
|
|
50fca74267 | ||
|
|
9e7bf97cc9 | ||
|
|
96be72b4c6 | ||
|
|
5c31ac6d00 | ||
|
|
1675d591dd | ||
|
|
361495dfed | ||
|
|
2b81e861f6 | ||
|
|
657a761c3a | ||
|
|
6d401c4234 | ||
|
|
8a33d2e5ed | ||
|
|
66e994be60 | ||
|
|
4e50ca9340 | ||
|
|
af064d1cda | ||
|
|
585c444f2d | ||
|
|
85683a0b3f | ||
|
|
4c7aa2b26b | ||
|
|
af236e1099 | ||
|
|
79f6014e26 | ||
|
|
0fa3de40ba | ||
|
|
d77f938107 | ||
|
|
e44aaa6618 | ||
|
|
96d88bb08c | ||
|
|
b502f89da6 | ||
|
|
d7b8cd7e03 | ||
|
|
61681bdc2b | ||
|
|
dc65030a63 | ||
|
|
328c110a97 | ||
|
|
0b7cd32209 | ||
|
|
b1c0ab74d7 | ||
|
|
faee01cde2 | ||
|
|
6f456437f7 | ||
|
|
1b0fd94a8c | ||
|
|
268d04841f | ||
|
|
9408ac5d9f | ||
|
|
45d2b6206e | ||
|
|
a943fdcc5a | ||
|
|
06e02f0b0f | ||
|
|
5b29dc66a9 | ||
|
|
5187916fd3 | ||
|
|
d6e444c6e9 | ||
|
|
59f4ef1091 | ||
|
|
bab1b3e9df | ||
|
|
4e8cbdc93b | ||
|
|
d3e5c5b335 | ||
|
|
2b4b38ddc6 | ||
|
|
d3e6d775e8 | ||
|
|
ecf3b57679 | ||
|
|
115981ecc6 | ||
|
|
009f297f59 | ||
|
|
f539fb1acf | ||
|
|
297e1e79c2 | ||
|
|
d8a95d9d48 | ||
|
|
1d8e87981b | ||
|
|
5c97f9c89a |
@@ -37,12 +37,12 @@ for lang in "$script_location/../../fastlane/metadata/android/"*; do
|
|||||||
# We specifically need the Serif version because of the 200 weight
|
# We specifically need the Serif version because of the 200 weight
|
||||||
case "$(basename "$lang")" in
|
case "$(basename "$lang")" in
|
||||||
bg|el-GR|ru-RU|uk) sed -i "s/Lexend Deca/Noto Serif/" featureGraphic.svg ;;
|
bg|el-GR|ru-RU|uk) sed -i "s/Lexend Deca/Noto Serif/" featureGraphic.svg ;;
|
||||||
hi-IN) sed -i -e "s/Yesteryear/Noto Serif Devanagari/" -e "s/Lexend Deca/Noto Serif Devanagari/" featureGraphic.svg ;;
|
hi-IN) sed -i -e "s/Yesteryear/Noto Sans Devanagari/" -e "s/Lexend Deca/Noto Serif Devanagari/" featureGraphic.svg ;;
|
||||||
ja-JP) sed -i "s/Lexend Deca/Noto Serif CJK JP/" featureGraphic.svg ;;
|
ja-JP) sed -i "s/Lexend Deca/Noto Serif CJK JP/" featureGraphic.svg ;;
|
||||||
kn-IN) sed -i -e 's/font-size="150"/font-size="100"/' -e "s/Yesteryear/Noto Serif Kannada/" featureGraphic.svg ;;
|
kn-IN) sed -i -e 's/font-size="150"/font-size="100"/' -e "s/Yesteryear/Noto Serif Kannada/" featureGraphic.svg ;;
|
||||||
ko) sed -i "s/Lexend Deca/Noto Serif CJK KR/" featureGraphic.svg ;;
|
ko) sed -i "s/Lexend Deca/Noto Serif CJK KR/" featureGraphic.svg ;;
|
||||||
zh-CN) sed -i "s/Lexend Deca/Noto Serif CJK SC/" featureGraphic.svg ;;
|
zh-CN) sed -i "s/Lexend Deca/Noto Serif CJK SC/" featureGraphic.svg ;;
|
||||||
zh-TW) sed -i "s/Lexend Deca/Noto Serif CJK TC/" featureGraphic.svg ;;
|
zh-TW) sed -i -e "s/Yesteryear/Noto Sans CJK TC/" -e "s/Lexend Deca/Noto Serif CJK TC/" featureGraphic.svg ;;
|
||||||
*) ;;
|
*) ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|||||||
19
CHANGELOG.md
19
CHANGELOG.md
@@ -1,6 +1,23 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## Unreleased - 140
|
## v2.34.1 - 143 (2024-12-12)
|
||||||
|
|
||||||
|
- Fix crash when opening invalid pkpass files
|
||||||
|
|
||||||
|
## v2.34.0 - 142 (2024-12-10)
|
||||||
|
|
||||||
|
- Add Passbook (.pkpass) support
|
||||||
|
- Fix import of transparent PDF files
|
||||||
|
- Improve display of transparent thumbnails
|
||||||
|
|
||||||
|
## v2.33.0 - 141 (2024-11-19)
|
||||||
|
|
||||||
|
- Change default column on wide screens to 4
|
||||||
|
- Allow overriding column counts for portrait and landscape in settings
|
||||||
|
- Keep main screen search filter when rotating screen or opening a card
|
||||||
|
- Limit max length of note display on main screen
|
||||||
|
|
||||||
|
## v2.32.1 - 140 (2024-10-29)
|
||||||
|
|
||||||
- Fix text wrapping on add dialog
|
- Fix text wrapping on add dialog
|
||||||
|
|
||||||
|
|||||||
64
Gemfile.lock
64
Gemfile.lock
@@ -10,20 +10,20 @@ GEM
|
|||||||
artifactory (3.0.17)
|
artifactory (3.0.17)
|
||||||
atomos (0.1.3)
|
atomos (0.1.3)
|
||||||
aws-eventstream (1.3.0)
|
aws-eventstream (1.3.0)
|
||||||
aws-partitions (1.958.0)
|
aws-partitions (1.1020.0)
|
||||||
aws-sdk-core (3.201.3)
|
aws-sdk-core (3.214.0)
|
||||||
aws-eventstream (~> 1, >= 1.3.0)
|
aws-eventstream (~> 1, >= 1.3.0)
|
||||||
aws-partitions (~> 1, >= 1.651.0)
|
aws-partitions (~> 1, >= 1.992.0)
|
||||||
aws-sigv4 (~> 1.8)
|
aws-sigv4 (~> 1.9)
|
||||||
jmespath (~> 1, >= 1.6.1)
|
jmespath (~> 1, >= 1.6.1)
|
||||||
aws-sdk-kms (1.88.0)
|
aws-sdk-kms (1.96.0)
|
||||||
aws-sdk-core (~> 3, >= 3.201.0)
|
aws-sdk-core (~> 3, >= 3.210.0)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sdk-s3 (1.156.0)
|
aws-sdk-s3 (1.176.0)
|
||||||
aws-sdk-core (~> 3, >= 3.201.0)
|
aws-sdk-core (~> 3, >= 3.210.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sigv4 (1.9.0)
|
aws-sigv4 (1.10.1)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
babosa (1.0.4)
|
babosa (1.0.4)
|
||||||
base64 (0.2.0)
|
base64 (0.2.0)
|
||||||
@@ -38,8 +38,8 @@ GEM
|
|||||||
domain_name (0.6.20240107)
|
domain_name (0.6.20240107)
|
||||||
dotenv (2.8.1)
|
dotenv (2.8.1)
|
||||||
emoji_regex (3.2.3)
|
emoji_regex (3.2.3)
|
||||||
excon (0.111.0)
|
excon (0.112.0)
|
||||||
faraday (1.10.3)
|
faraday (1.10.4)
|
||||||
faraday-em_http (~> 1.0)
|
faraday-em_http (~> 1.0)
|
||||||
faraday-em_synchrony (~> 1.0)
|
faraday-em_synchrony (~> 1.0)
|
||||||
faraday-excon (~> 1.1)
|
faraday-excon (~> 1.1)
|
||||||
@@ -65,10 +65,10 @@ GEM
|
|||||||
faraday-patron (1.0.0)
|
faraday-patron (1.0.0)
|
||||||
faraday-rack (1.0.0)
|
faraday-rack (1.0.0)
|
||||||
faraday-retry (1.0.3)
|
faraday-retry (1.0.3)
|
||||||
faraday_middleware (1.2.0)
|
faraday_middleware (1.2.1)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
fastimage (2.3.1)
|
fastimage (2.3.1)
|
||||||
fastlane (2.222.0)
|
fastlane (2.226.0)
|
||||||
CFPropertyList (>= 2.3, < 4.0.0)
|
CFPropertyList (>= 2.3, < 4.0.0)
|
||||||
addressable (>= 2.8, < 3.0.0)
|
addressable (>= 2.8, < 3.0.0)
|
||||||
artifactory (~> 3.0)
|
artifactory (~> 3.0)
|
||||||
@@ -84,6 +84,7 @@ GEM
|
|||||||
faraday-cookie_jar (~> 0.0.6)
|
faraday-cookie_jar (~> 0.0.6)
|
||||||
faraday_middleware (~> 1.0)
|
faraday_middleware (~> 1.0)
|
||||||
fastimage (>= 2.1.0, < 3.0.0)
|
fastimage (>= 2.1.0, < 3.0.0)
|
||||||
|
fastlane-sirp (>= 1.0.0)
|
||||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||||
google-apis-androidpublisher_v3 (~> 0.3)
|
google-apis-androidpublisher_v3 (~> 0.3)
|
||||||
google-apis-playcustomapp_v1 (~> 0.1)
|
google-apis-playcustomapp_v1 (~> 0.1)
|
||||||
@@ -107,8 +108,10 @@ GEM
|
|||||||
tty-spinner (>= 0.8.0, < 1.0.0)
|
tty-spinner (>= 0.8.0, < 1.0.0)
|
||||||
word_wrap (~> 1.0.0)
|
word_wrap (~> 1.0.0)
|
||||||
xcodeproj (>= 1.13.0, < 2.0.0)
|
xcodeproj (>= 1.13.0, < 2.0.0)
|
||||||
xcpretty (~> 0.3.0)
|
xcpretty (~> 0.4.0)
|
||||||
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
|
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
|
||||||
|
fastlane-sirp (1.0.0)
|
||||||
|
sysrandom (~> 1.0)
|
||||||
gh_inspector (1.1.3)
|
gh_inspector (1.1.3)
|
||||||
google-apis-androidpublisher_v3 (0.54.0)
|
google-apis-androidpublisher_v3 (0.54.0)
|
||||||
google-apis-core (>= 0.11.0, < 2.a)
|
google-apis-core (>= 0.11.0, < 2.a)
|
||||||
@@ -126,7 +129,7 @@ GEM
|
|||||||
google-apis-core (>= 0.11.0, < 2.a)
|
google-apis-core (>= 0.11.0, < 2.a)
|
||||||
google-apis-storage_v1 (0.31.0)
|
google-apis-storage_v1 (0.31.0)
|
||||||
google-apis-core (>= 0.11.0, < 2.a)
|
google-apis-core (>= 0.11.0, < 2.a)
|
||||||
google-cloud-core (1.7.0)
|
google-cloud-core (1.7.1)
|
||||||
google-cloud-env (>= 1.0, < 3.a)
|
google-cloud-env (>= 1.0, < 3.a)
|
||||||
google-cloud-errors (~> 1.0)
|
google-cloud-errors (~> 1.0)
|
||||||
google-cloud-env (1.6.0)
|
google-cloud-env (1.6.0)
|
||||||
@@ -147,21 +150,21 @@ GEM
|
|||||||
os (>= 0.9, < 2.0)
|
os (>= 0.9, < 2.0)
|
||||||
signet (>= 0.16, < 2.a)
|
signet (>= 0.16, < 2.a)
|
||||||
highline (2.0.3)
|
highline (2.0.3)
|
||||||
http-cookie (1.0.6)
|
http-cookie (1.0.8)
|
||||||
domain_name (~> 0.5)
|
domain_name (~> 0.5)
|
||||||
httpclient (2.8.3)
|
httpclient (2.8.3)
|
||||||
jmespath (1.6.2)
|
jmespath (1.6.2)
|
||||||
json (2.7.2)
|
json (2.9.0)
|
||||||
jwt (2.8.2)
|
jwt (2.9.3)
|
||||||
base64
|
base64
|
||||||
mini_magick (4.13.2)
|
mini_magick (4.13.2)
|
||||||
mini_mime (1.1.5)
|
mini_mime (1.1.5)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.4.1)
|
multipart-post (2.4.1)
|
||||||
nanaimo (0.3.0)
|
nanaimo (0.4.0)
|
||||||
naturally (2.2.1)
|
naturally (2.2.1)
|
||||||
nkf (0.2.0)
|
nkf (0.2.0)
|
||||||
optparse (0.5.0)
|
optparse (0.6.0)
|
||||||
os (1.1.4)
|
os (1.1.4)
|
||||||
plist (3.7.1)
|
plist (3.7.1)
|
||||||
public_suffix (6.0.1)
|
public_suffix (6.0.1)
|
||||||
@@ -171,9 +174,8 @@ GEM
|
|||||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||||
uber (< 0.2.0)
|
uber (< 0.2.0)
|
||||||
retriable (3.1.2)
|
retriable (3.1.2)
|
||||||
rexml (3.2.9)
|
rexml (3.3.9)
|
||||||
strscan
|
rouge (3.28.0)
|
||||||
rouge (2.0.7)
|
|
||||||
ruby2_keywords (0.0.5)
|
ruby2_keywords (0.0.5)
|
||||||
rubyzip (2.3.2)
|
rubyzip (2.3.2)
|
||||||
security (0.1.5)
|
security (0.1.5)
|
||||||
@@ -185,7 +187,7 @@ GEM
|
|||||||
simctl (1.6.10)
|
simctl (1.6.10)
|
||||||
CFPropertyList
|
CFPropertyList
|
||||||
naturally
|
naturally
|
||||||
strscan (3.1.0)
|
sysrandom (1.0.5)
|
||||||
terminal-notifier (2.0.0)
|
terminal-notifier (2.0.0)
|
||||||
terminal-table (3.0.2)
|
terminal-table (3.0.2)
|
||||||
unicode-display_width (>= 1.1.1, < 3)
|
unicode-display_width (>= 1.1.1, < 3)
|
||||||
@@ -195,17 +197,17 @@ GEM
|
|||||||
tty-spinner (0.9.3)
|
tty-spinner (0.9.3)
|
||||||
tty-cursor (~> 0.7)
|
tty-cursor (~> 0.7)
|
||||||
uber (0.1.0)
|
uber (0.1.0)
|
||||||
unicode-display_width (2.5.0)
|
unicode-display_width (2.6.0)
|
||||||
word_wrap (1.0.0)
|
word_wrap (1.0.0)
|
||||||
xcodeproj (1.24.0)
|
xcodeproj (1.27.0)
|
||||||
CFPropertyList (>= 2.3.3, < 4.0)
|
CFPropertyList (>= 2.3.3, < 4.0)
|
||||||
atomos (~> 0.1.3)
|
atomos (~> 0.1.3)
|
||||||
claide (>= 1.0.2, < 2.0)
|
claide (>= 1.0.2, < 2.0)
|
||||||
colored2 (~> 3.1)
|
colored2 (~> 3.1)
|
||||||
nanaimo (~> 0.3.0)
|
nanaimo (~> 0.4.0)
|
||||||
rexml (~> 3.2.4)
|
rexml (>= 3.3.6, < 4.0)
|
||||||
xcpretty (0.3.0)
|
xcpretty (0.4.0)
|
||||||
rouge (~> 2.0.7)
|
rouge (~> 3.28.0)
|
||||||
xcpretty-travis-formatter (1.0.1)
|
xcpretty-travis-formatter (1.0.1)
|
||||||
xcpretty (~> 0.2, >= 0.0.7)
|
xcpretty (~> 0.2, >= 0.0.7)
|
||||||
|
|
||||||
@@ -216,4 +218,4 @@ DEPENDENCIES
|
|||||||
fastlane
|
fastlane
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.5.11
|
2.5.22
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.github.spotbugs.snom.SpotBugsTask
|
|||||||
plugins {
|
plugins {
|
||||||
id("com.android.application")
|
id("com.android.application")
|
||||||
id("com.github.spotbugs")
|
id("com.github.spotbugs")
|
||||||
|
id("org.jetbrains.kotlin.android")
|
||||||
}
|
}
|
||||||
|
|
||||||
spotbugs {
|
spotbugs {
|
||||||
@@ -21,13 +22,13 @@ android {
|
|||||||
applicationId = "me.hackerchick.catima"
|
applicationId = "me.hackerchick.catima"
|
||||||
minSdk = 21
|
minSdk = 21
|
||||||
targetSdk = 34
|
targetSdk = 34
|
||||||
versionCode = 139
|
versionCode = 143
|
||||||
versionName = "2.32.0"
|
versionName = "2.34.1"
|
||||||
|
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
multiDexEnabled = true
|
multiDexEnabled = true
|
||||||
|
|
||||||
resourceConfigurations += listOf("ar", "bg", "bn", "bn-rIN", "bs", "cs", "da", "de", "el-rGR", "en", "eo", "es", "es-rAR", "et", "fi", "fr", "he-rIL", "hi", "hr", "hu", "in-rID", "is", "it", "ja", "ko", "lt", "lv", "nb-rNO", "nl", "oc", "pl", "pt-rBR", "pt-rPT", "ro-rRO", "ru", "sk", "sl", "sr", "sv", "tr", "uk", "vi", "zh-rCN", "zh-rTW")
|
resourceConfigurations += listOf("ar", "bg", "bn", "bn-rIN", "bs", "cs", "da", "de", "el-rGR", "en", "eo", "es", "es-rAR", "et", "fi", "fr", "gl", "he-rIL", "hi", "hr", "hu", "in-rID", "is", "it", "ja", "ko", "lt", "lv", "nb-rNO", "nl", "oc", "pl", "pt-rBR", "pt-rPT", "ro-rRO", "ru", "sk", "sl", "sr", "sv", "ta", "tr", "uk", "vi", "zh-rCN", "zh-rTW")
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
@@ -62,8 +63,8 @@ android {
|
|||||||
// Flag to enable support for the new language APIs
|
// Flag to enable support for the new language APIs
|
||||||
isCoreLibraryDesugaringEnabled = true
|
isCoreLibraryDesugaringEnabled = true
|
||||||
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -84,25 +85,26 @@ android {
|
|||||||
lint {
|
lint {
|
||||||
lintConfig = file("lint.xml")
|
lintConfig = file("lint.xml")
|
||||||
}
|
}
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "17"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
// AndroidX
|
// AndroidX
|
||||||
implementation("androidx.appcompat:appcompat:1.7.0")
|
implementation("androidx.appcompat:appcompat:1.7.0")
|
||||||
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
|
implementation("androidx.constraintlayout:constraintlayout:2.2.0")
|
||||||
|
implementation("androidx.core:core-ktx:1.13.1")
|
||||||
|
implementation("androidx.core:core-splashscreen:1.0.1")
|
||||||
implementation("androidx.exifinterface:exifinterface:1.3.7")
|
implementation("androidx.exifinterface:exifinterface:1.3.7")
|
||||||
implementation("androidx.palette:palette:1.0.0")
|
implementation("androidx.palette:palette:1.0.0")
|
||||||
implementation("androidx.preference:preference:1.2.1")
|
implementation("androidx.preference:preference:1.2.1")
|
||||||
implementation("com.google.android.material:material:1.12.0")
|
implementation("com.google.android.material:material:1.12.0")
|
||||||
implementation("com.github.yalantis:ucrop:2.2.9")
|
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.3")
|
||||||
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.2")
|
|
||||||
|
|
||||||
// Splash Screen
|
|
||||||
implementation("androidx.core:core-splashscreen:1.0.1")
|
|
||||||
|
|
||||||
// Third-party
|
// Third-party
|
||||||
implementation("com.journeyapps:zxing-android-embedded:4.3.0@aar")
|
implementation("com.journeyapps:zxing-android-embedded:4.3.0@aar")
|
||||||
|
implementation("com.github.yalantis:ucrop:2.2.10")
|
||||||
implementation("com.google.zxing:core:3.5.3")
|
implementation("com.google.zxing:core:3.5.3")
|
||||||
implementation("org.apache.commons:commons-csv:1.9.0")
|
implementation("org.apache.commons:commons-csv:1.9.0")
|
||||||
implementation("com.jaredrummler:colorpicker:1.1.0")
|
implementation("com.jaredrummler:colorpicker:1.1.0")
|
||||||
@@ -116,7 +118,7 @@ dependencies {
|
|||||||
val junitVersion = "4.13.2"
|
val junitVersion = "4.13.2"
|
||||||
testImplementation("androidx.test:core:$androidXTestVersion")
|
testImplementation("androidx.test:core:$androidXTestVersion")
|
||||||
testImplementation("junit:junit:$junitVersion")
|
testImplementation("junit:junit:$junitVersion")
|
||||||
testImplementation("org.robolectric:robolectric:4.13")
|
testImplementation("org.robolectric:robolectric:4.14.1")
|
||||||
|
|
||||||
androidTestImplementation("androidx.test:core:$androidXTestVersion")
|
androidTestImplementation("androidx.test:core:$androidXTestVersion")
|
||||||
androidTestImplementation("junit:junit:$junitVersion")
|
androidTestImplementation("junit:junit:$junitVersion")
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources></resources>
|
<resources>
|
||||||
|
<string name="app_name">Catima-vianmääritys</string>
|
||||||
|
</resources>
|
||||||
4
app/src/debug/res/values-gl/strings.xml
Normal file
4
app/src/debug/res/values-gl/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Depuración de Catima</string>
|
||||||
|
</resources>
|
||||||
@@ -1,2 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources></resources>
|
<resources>
|
||||||
|
<string name="app_name">Catima atkļūdošana</string>
|
||||||
|
</resources>
|
||||||
@@ -40,12 +40,24 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
|
||||||
|
<data android:scheme="content"/>
|
||||||
|
<data android:host="*"/>
|
||||||
|
<data android:mimeType="image/*" />
|
||||||
|
<data android:mimeType="application/pdf" />
|
||||||
|
<data android:mimeType="application/vnd.apple.pkpass" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
|
||||||
<data android:mimeType="text/plain" />
|
<data android:mimeType="text/plain" />
|
||||||
<data android:mimeType="image/*" />
|
<data android:mimeType="image/*" />
|
||||||
<data android:mimeType="application/pdf" />
|
<data android:mimeType="application/pdf" />
|
||||||
|
<data android:mimeType="application/vnd.apple.pkpass" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
package protect.card_locker;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
public class BarcodeValues {
|
|
||||||
@Nullable
|
|
||||||
private final CatimaBarcode mFormat;
|
|
||||||
private final String mContent;
|
|
||||||
private String mNote;
|
|
||||||
|
|
||||||
public BarcodeValues(@Nullable CatimaBarcode format, String content) {
|
|
||||||
mFormat = format;
|
|
||||||
mContent = content;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNote(String note) {
|
|
||||||
mNote = note;
|
|
||||||
}
|
|
||||||
|
|
||||||
public @Nullable CatimaBarcode format() {
|
|
||||||
return mFormat;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String content() {
|
|
||||||
return mContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String note() { return mNote; }
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package protect.card_locker;
|
|
||||||
|
|
||||||
public interface BarcodeValuesListDisambiguatorCallback {
|
|
||||||
void onUserChoseBarcode(BarcodeValues barcodeValues);
|
|
||||||
void onUserDismissedSelector();
|
|
||||||
}
|
|
||||||
@@ -12,15 +12,15 @@ import androidx.appcompat.widget.Toolbar;
|
|||||||
import androidx.core.content.pm.ShortcutInfoCompat;
|
import androidx.core.content.pm.ShortcutInfoCompat;
|
||||||
import androidx.core.content.pm.ShortcutManagerCompat;
|
import androidx.core.content.pm.ShortcutManagerCompat;
|
||||||
import androidx.recyclerview.widget.GridLayoutManager;
|
import androidx.recyclerview.widget.GridLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
import protect.card_locker.databinding.SimpleToolbarListActivityBinding;
|
import protect.card_locker.databinding.CardShortcutConfigureActivityBinding;
|
||||||
|
import protect.card_locker.preferences.Settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The configuration screen for creating a shortcut.
|
* The configuration screen for creating a shortcut.
|
||||||
*/
|
*/
|
||||||
public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
|
public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
|
||||||
private SimpleToolbarListActivityBinding binding;
|
private CardShortcutConfigureActivityBinding binding;
|
||||||
static final String TAG = "Catima";
|
static final String TAG = "Catima";
|
||||||
private SQLiteDatabase mDatabase;
|
private SQLiteDatabase mDatabase;
|
||||||
private LoyaltyCardCursorAdapter mAdapter;
|
private LoyaltyCardCursorAdapter mAdapter;
|
||||||
@@ -28,7 +28,7 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle bundle) {
|
public void onCreate(Bundle bundle) {
|
||||||
super.onCreate(bundle);
|
super.onCreate(bundle);
|
||||||
binding = SimpleToolbarListActivityBinding.inflate(getLayoutInflater());
|
binding = CardShortcutConfigureActivityBinding.inflate(getLayoutInflater());
|
||||||
mDatabase = new DBHelper(this).getReadableDatabase();
|
mDatabase = new DBHelper(this).getReadableDatabase();
|
||||||
|
|
||||||
// Set the result to CANCELED. This will cause nothing to happen if the
|
// Set the result to CANCELED. This will cause nothing to happen if the
|
||||||
@@ -47,21 +47,26 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo
|
|||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
final RecyclerView cardList = binding.list;
|
|
||||||
GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager();
|
|
||||||
if (layoutManager != null) {
|
|
||||||
layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns));
|
|
||||||
}
|
|
||||||
|
|
||||||
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
|
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
|
||||||
mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this, null);
|
mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this, null);
|
||||||
cardList.setAdapter(mAdapter);
|
binding.list.setAdapter(mAdapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
|
||||||
|
var layoutManager = (GridLayoutManager) binding.list.getLayoutManager();
|
||||||
|
if (layoutManager != null) {
|
||||||
|
var settings = new Settings(this);
|
||||||
|
layoutManager.setSpanCount(settings.getPreferredColumnCount());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onClickAction(int position) {
|
private void onClickAction(int position) {
|
||||||
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
|
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
|
||||||
selected.moveToPosition(position);
|
selected.moveToPosition(position);
|
||||||
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(selected);
|
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(CardShortcutConfigure.this, selected);
|
||||||
|
|
||||||
Log.d(TAG, "Creating shortcut for card " + loyaltyCard.store + "," + loyaltyCard.id);
|
Log.d(TAG, "Creating shortcut for card " + loyaltyCard.store + "," + loyaltyCard.id);
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
|
|||||||
Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived);
|
Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived);
|
||||||
return subscriber -> {
|
return subscriber -> {
|
||||||
while (loyaltyCardCursor.moveToNext()) {
|
while (loyaltyCardCursor.moveToNext()) {
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(loyaltyCardCursor);
|
LoyaltyCard card = LoyaltyCard.fromCursor(this, loyaltyCardCursor);
|
||||||
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
|
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
.putExtra(LoyaltyCardViewActivity.BUNDLE_ID, card.id);
|
.putExtra(LoyaltyCardViewActivity.BUNDLE_ID, card.id);
|
||||||
@@ -69,7 +69,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
|
|||||||
for (String controlId : controlIds) {
|
for (String controlId : controlIds) {
|
||||||
Control control;
|
Control control;
|
||||||
Integer cardId = this.controlIdToCardId(controlId);
|
Integer cardId = this.controlIdToCardId(controlId);
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(this, mDatabase, cardId);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
|
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
@@ -99,7 +99,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Bitmap getIcon(Context context, LoyaltyCard loyaltyCard) {
|
private Bitmap getIcon(Context context, LoyaltyCard loyaltyCard) {
|
||||||
Bitmap cardIcon = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon);
|
Bitmap cardIcon = loyaltyCard.getImageThumbnail(context);
|
||||||
|
|
||||||
if (cardIcon != null) {
|
if (cardIcon != null) {
|
||||||
return cardIcon;
|
return cardIcon;
|
||||||
|
|||||||
@@ -332,10 +332,10 @@ public class DBHelper extends SQLiteOpenHelper {
|
|||||||
Set<String> files = new HashSet<>();
|
Set<String> files = new HashSet<>();
|
||||||
Cursor cardCursor = getLoyaltyCardCursor(database);
|
Cursor cardCursor = getLoyaltyCardCursor(database);
|
||||||
while (cardCursor.moveToNext()) {
|
while (cardCursor.moveToNext()) {
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor);
|
LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor);
|
||||||
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
|
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
|
||||||
String name = Utils.getCardImageFileName(card.id, imageLocationType);
|
String name = Utils.getCardImageFileName(card.id, imageLocationType);
|
||||||
if (Utils.retrieveCardImageAsFile(context, name).exists()) {
|
if (card.getImageForImageLocationType(context, imageLocationType) != null) {
|
||||||
files.add(name);
|
files.add(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -535,14 +535,14 @@ public class DBHelper extends SQLiteOpenHelper {
|
|||||||
return (rowsUpdated == 1);
|
return (rowsUpdated == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) {
|
public static LoyaltyCard getLoyaltyCard(Context context, SQLiteDatabase database, final int id) {
|
||||||
Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
|
Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null);
|
||||||
|
|
||||||
LoyaltyCard card = null;
|
LoyaltyCard card = null;
|
||||||
|
|
||||||
if (data.getCount() == 1) {
|
if (data.getCount() == 1) {
|
||||||
data.moveToFirst();
|
data.moveToFirst();
|
||||||
card = LoyaltyCard.fromCursor(data);
|
card = LoyaltyCard.fromCursor(context, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
data.close();
|
data.close();
|
||||||
|
|||||||
@@ -125,7 +125,29 @@ public class ImportURIHelper {
|
|||||||
headerColor = Integer.parseInt(unparsedHeaderColor);
|
headerColor = Integer.parseInt(unparsedHeaderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LoyaltyCard(-1, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100, 0);
|
return new LoyaltyCard(
|
||||||
|
-1,
|
||||||
|
store,
|
||||||
|
note,
|
||||||
|
validFrom,
|
||||||
|
expiry,
|
||||||
|
balance,
|
||||||
|
balanceType,
|
||||||
|
cardId,
|
||||||
|
barcodeId,
|
||||||
|
barcodeType,
|
||||||
|
headerColor,
|
||||||
|
0,
|
||||||
|
Utils.getUnixTime(),
|
||||||
|
100,
|
||||||
|
0,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
} catch (NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) {
|
} catch (NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) {
|
||||||
throw new InvalidObjectException("Not a valid import URI");
|
throw new InvalidObjectException("Not a valid import URI");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package protect.card_locker;
|
package protect.card_locker;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcel;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@@ -11,11 +11,10 @@ import androidx.annotation.Nullable;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Currency;
|
import java.util.Currency;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class LoyaltyCard implements Parcelable {
|
public class LoyaltyCard {
|
||||||
public int id;
|
public int id;
|
||||||
public String store;
|
public String store;
|
||||||
public String note;
|
public String note;
|
||||||
@@ -38,6 +37,19 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
public int zoomLevel;
|
public int zoomLevel;
|
||||||
public int archiveStatus;
|
public int archiveStatus;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Bitmap imageThumbnail;
|
||||||
|
@Nullable
|
||||||
|
private String imageThumbnailPath;
|
||||||
|
@Nullable
|
||||||
|
private Bitmap imageFront;
|
||||||
|
@Nullable
|
||||||
|
private String imageFrontPath;
|
||||||
|
@Nullable
|
||||||
|
private Bitmap imageBack;
|
||||||
|
@Nullable
|
||||||
|
private String imageBackPath;
|
||||||
|
|
||||||
public static final String BUNDLE_LOYALTY_CARD_ID = "loyaltyCardId";
|
public static final String BUNDLE_LOYALTY_CARD_ID = "loyaltyCardId";
|
||||||
public static final String BUNDLE_LOYALTY_CARD_STORE = "loyaltyCardStore";
|
public static final String BUNDLE_LOYALTY_CARD_STORE = "loyaltyCardStore";
|
||||||
public static final String BUNDLE_LOYALTY_CARD_NOTE = "loyaltyCardNote";
|
public static final String BUNDLE_LOYALTY_CARD_NOTE = "loyaltyCardNote";
|
||||||
@@ -53,6 +65,13 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
public static final String BUNDLE_LOYALTY_CARD_LAST_USED = "loyaltyCardLastUsed";
|
public static final String BUNDLE_LOYALTY_CARD_LAST_USED = "loyaltyCardLastUsed";
|
||||||
public static final String BUNDLE_LOYALTY_CARD_ZOOM_LEVEL = "loyaltyCardZoomLevel";
|
public static final String BUNDLE_LOYALTY_CARD_ZOOM_LEVEL = "loyaltyCardZoomLevel";
|
||||||
public static final String BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS = "loyaltyCardArchiveStatus";
|
public static final String BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS = "loyaltyCardArchiveStatus";
|
||||||
|
public static final String BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL = "loyaltyCardImageThumbnail";
|
||||||
|
public static final String BUNDLE_LOYALTY_CARD_IMAGE_FRONT = "loyaltyCardImageFront";
|
||||||
|
public static final String BUNDLE_LOYALTY_CARD_IMAGE_BACK = "loyaltyCardImageBack";
|
||||||
|
|
||||||
|
private static final String TEMP_IMAGE_THUMBNAIL_FILE_NAME = "loyaltyCardTempImageThumbnailFileName";
|
||||||
|
private static final String TEMP_IMAGE_FRONT_FILE_NAME = "loyaltyCardTempImageFrontFileName";
|
||||||
|
private static final String TEMP_IMAGE_BACK_FILE_NAME = "loyaltyCardTempImageBackFileName";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a loyalty card object with default values
|
* Create a loyalty card object with default values
|
||||||
@@ -73,6 +92,9 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
setLastUsed(Utils.getUnixTime());
|
setLastUsed(Utils.getUnixTime());
|
||||||
setZoomLevel(100);
|
setZoomLevel(100);
|
||||||
setArchiveStatus(0);
|
setArchiveStatus(0);
|
||||||
|
setImageThumbnail(null, null);
|
||||||
|
setImageFront(null, null);
|
||||||
|
setImageBack(null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -98,7 +120,10 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
@Nullable final Date expiry, final BigDecimal balance, @Nullable final Currency balanceType,
|
@Nullable final Date expiry, final BigDecimal balance, @Nullable final Currency balanceType,
|
||||||
final String cardId, @Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType,
|
final String cardId, @Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType,
|
||||||
@Nullable final Integer headerColor, final int starStatus,
|
@Nullable final Integer headerColor, final int starStatus,
|
||||||
final long lastUsed, final int zoomLevel, final int archiveStatus) {
|
final long lastUsed, final int zoomLevel, final int archiveStatus,
|
||||||
|
@Nullable Bitmap imageThumbnail, @Nullable String imageThumbnailPath,
|
||||||
|
@Nullable Bitmap imageFront, @Nullable String imageFrontPath,
|
||||||
|
@Nullable Bitmap imageBack, @Nullable String imageBackPath) {
|
||||||
setId(id);
|
setId(id);
|
||||||
setStore(store);
|
setStore(store);
|
||||||
setNote(note);
|
setNote(note);
|
||||||
@@ -114,6 +139,63 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
setLastUsed(lastUsed);
|
setLastUsed(lastUsed);
|
||||||
setZoomLevel(zoomLevel);
|
setZoomLevel(zoomLevel);
|
||||||
setArchiveStatus(archiveStatus);
|
setArchiveStatus(archiveStatus);
|
||||||
|
setImageThumbnail(imageThumbnail, imageThumbnailPath);
|
||||||
|
setImageFront(imageFront, imageFrontPath);
|
||||||
|
setImageBack(imageBack, imageBackPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Bitmap getImageThumbnail(Context context) {
|
||||||
|
if (imageThumbnailPath != null) {
|
||||||
|
if (imageThumbnailPath.equals(TEMP_IMAGE_THUMBNAIL_FILE_NAME)) {
|
||||||
|
imageThumbnail = Utils.loadTempImage(context, imageThumbnailPath);
|
||||||
|
} else {
|
||||||
|
imageThumbnail = Utils.retrieveCardImage(context, imageThumbnailPath);
|
||||||
|
}
|
||||||
|
imageThumbnailPath = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imageThumbnail == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return imageThumbnail.copy(imageThumbnail.getConfig(), imageThumbnail.isMutable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Bitmap getImageFront(Context context) {
|
||||||
|
if (imageFrontPath != null) {
|
||||||
|
if (imageFrontPath.equals(TEMP_IMAGE_FRONT_FILE_NAME)) {
|
||||||
|
imageFront = Utils.loadTempImage(context, imageFrontPath);
|
||||||
|
} else {
|
||||||
|
imageFront = Utils.retrieveCardImage(context, imageFrontPath);
|
||||||
|
}
|
||||||
|
imageFrontPath = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imageFront == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return imageFront.copy(imageFront.getConfig(), imageFront.isMutable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Bitmap getImageBack(Context context) {
|
||||||
|
if (imageBackPath != null) {
|
||||||
|
if (imageBackPath.equals(TEMP_IMAGE_BACK_FILE_NAME)) {
|
||||||
|
imageBack = Utils.loadTempImage(context, imageBackPath);
|
||||||
|
} else {
|
||||||
|
imageBack = Utils.retrieveCardImage(context, imageBackPath);
|
||||||
|
}
|
||||||
|
imageBackPath = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imageBack == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return imageBack.copy(imageBack.getConfig(), imageBack.isMutable());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(int id) {
|
public void setId(int id) {
|
||||||
@@ -188,59 +270,47 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
this.archiveStatus = archiveStatus;
|
this.archiveStatus = archiveStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected LoyaltyCard(Parcel in) {
|
public void setImageThumbnail(@Nullable Bitmap imageThumbnail, @Nullable String imageThumbnailPath) {
|
||||||
setId(in.readInt());
|
if (imageThumbnail != null && imageThumbnailPath != null) {
|
||||||
setStore(Objects.requireNonNull(in.readString()));
|
throw new IllegalArgumentException("Cannot set both thumbnail and path");
|
||||||
setNote(Objects.requireNonNull(in.readString()));
|
}
|
||||||
long tmpValidFrom = in.readLong();
|
|
||||||
setValidFrom(tmpValidFrom > 0 ? new Date(tmpValidFrom) : null);
|
this.imageThumbnailPath = imageThumbnailPath;
|
||||||
long tmpExpiry = in.readLong();
|
this.imageThumbnail = imageThumbnail != null ? imageThumbnail.copy(imageThumbnail.getConfig(), imageThumbnail.isMutable()) : null;
|
||||||
setExpiry(tmpExpiry > 0 ? new Date(tmpExpiry) : null);
|
|
||||||
setBalance((BigDecimal) in.readValue(BigDecimal.class.getClassLoader()));
|
|
||||||
setBalanceType((Currency) in.readValue(Currency.class.getClassLoader()));
|
|
||||||
setCardId(Objects.requireNonNull(in.readString()));
|
|
||||||
setBarcodeId(in.readString());
|
|
||||||
String tmpBarcodeType = in.readString();
|
|
||||||
setBarcodeType((tmpBarcodeType != null && !tmpBarcodeType.isEmpty()) ? CatimaBarcode.fromName(tmpBarcodeType) : null);
|
|
||||||
int tmpHeaderColor = in.readInt();
|
|
||||||
setHeaderColor(tmpHeaderColor != -1 ? tmpHeaderColor : null);
|
|
||||||
setStarStatus(in.readInt());
|
|
||||||
setLastUsed(in.readLong());
|
|
||||||
setZoomLevel(in.readInt());
|
|
||||||
setArchiveStatus(in.readInt());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void setImageFront(@Nullable Bitmap imageFront, @Nullable String imageFrontPath) {
|
||||||
public void writeToParcel(Parcel parcel, int flags) {
|
if (imageFront != null && imageFrontPath != null) {
|
||||||
parcel.writeInt(id);
|
throw new IllegalArgumentException("Cannot set both thumbnail and path");
|
||||||
parcel.writeString(store);
|
}
|
||||||
parcel.writeString(note);
|
|
||||||
parcel.writeLong(validFrom != null ? validFrom.getTime() : -1);
|
this.imageFrontPath = imageFrontPath;
|
||||||
parcel.writeLong(expiry != null ? expiry.getTime() : -1);
|
this.imageFront = imageFront != null ? imageFront.copy(imageFront.getConfig(), imageFront.isMutable()) : null;
|
||||||
parcel.writeValue(balance);
|
|
||||||
parcel.writeValue(balanceType);
|
|
||||||
parcel.writeString(cardId);
|
|
||||||
parcel.writeString(barcodeId);
|
|
||||||
parcel.writeString(barcodeType != null ? barcodeType.name() : "");
|
|
||||||
parcel.writeInt(headerColor != null ? headerColor : -1);
|
|
||||||
parcel.writeInt(starStatus);
|
|
||||||
parcel.writeLong(lastUsed);
|
|
||||||
parcel.writeInt(zoomLevel);
|
|
||||||
parcel.writeInt(archiveStatus);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoyaltyCard fromBundle(Bundle bundle, boolean requireFull) {
|
public void setImageBack(@Nullable Bitmap imageBack, @Nullable String imageBackPath) {
|
||||||
// Grab default card
|
if (imageBack != null && imageBackPath != null) {
|
||||||
LoyaltyCard loyaltyCard = new LoyaltyCard();
|
throw new IllegalArgumentException("Cannot set both thumbnail and path");
|
||||||
|
}
|
||||||
|
|
||||||
// Update from bundle
|
this.imageBackPath = imageBackPath;
|
||||||
loyaltyCard.updateFromBundle(bundle, requireFull);
|
this.imageBack = imageBack != null ? imageBack.copy(imageBack.getConfig(), imageBack.isMutable()) : null;
|
||||||
|
|
||||||
// Return updated version
|
|
||||||
return loyaltyCard;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateFromBundle(Bundle bundle, boolean requireFull) {
|
@Nullable
|
||||||
|
public Bitmap getImageForImageLocationType(Context context, ImageLocationType imageLocationType) {
|
||||||
|
if (imageLocationType == ImageLocationType.icon) {
|
||||||
|
return getImageThumbnail(context);
|
||||||
|
} else if (imageLocationType == ImageLocationType.front) {
|
||||||
|
return getImageFront(context);
|
||||||
|
} else if (imageLocationType == ImageLocationType.back) {
|
||||||
|
return getImageBack(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalArgumentException("Unknown image location type");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateFromBundle(@NonNull Bundle bundle, boolean requireFull) {
|
||||||
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_ID)) {
|
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_ID)) {
|
||||||
setId(bundle.getInt(BUNDLE_LOYALTY_CARD_ID));
|
setId(bundle.getInt(BUNDLE_LOYALTY_CARD_ID));
|
||||||
} else if (requireFull) {
|
} else if (requireFull) {
|
||||||
@@ -321,41 +391,107 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
} else if (requireFull) {
|
} else if (requireFull) {
|
||||||
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS);
|
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS);
|
||||||
}
|
}
|
||||||
|
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL)) {
|
||||||
|
setImageThumbnail(null, bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL));
|
||||||
|
} else if (requireFull) {
|
||||||
|
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL);
|
||||||
|
}
|
||||||
|
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_FRONT)) {
|
||||||
|
setImageFront(null, bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT));
|
||||||
|
} else if (requireFull) {
|
||||||
|
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_FRONT);
|
||||||
|
}
|
||||||
|
if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_BACK)) {
|
||||||
|
setImageBack(null, bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_BACK));
|
||||||
|
} else if (requireFull) {
|
||||||
|
throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_BACK);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bundle toBundle() {
|
public Bundle toBundle(Context context, List<String> exportLimit) {
|
||||||
|
boolean exportIsLimited = !exportLimit.isEmpty();
|
||||||
|
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
|
|
||||||
bundle.putInt(BUNDLE_LOYALTY_CARD_ID, id);
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_ID)) {
|
||||||
bundle.putString(BUNDLE_LOYALTY_CARD_STORE, store);
|
bundle.putInt(BUNDLE_LOYALTY_CARD_ID, id);
|
||||||
bundle.putString(BUNDLE_LOYALTY_CARD_NOTE, note);
|
|
||||||
if (validFrom != null) {
|
|
||||||
bundle.putLong(BUNDLE_LOYALTY_CARD_VALID_FROM, validFrom.getTime());
|
|
||||||
}
|
}
|
||||||
if (expiry != null) {
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_STORE)) {
|
||||||
bundle.putLong(BUNDLE_LOYALTY_CARD_EXPIRY, expiry.getTime());
|
bundle.putString(BUNDLE_LOYALTY_CARD_STORE, store);
|
||||||
}
|
}
|
||||||
bundle.putString(BUNDLE_LOYALTY_CARD_BALANCE, balance.toString());
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_NOTE)) {
|
||||||
if (balanceType != null) {
|
bundle.putString(BUNDLE_LOYALTY_CARD_NOTE, note);
|
||||||
bundle.putString(BUNDLE_LOYALTY_CARD_BALANCE_TYPE, balanceType.toString());
|
|
||||||
}
|
}
|
||||||
bundle.putString(BUNDLE_LOYALTY_CARD_CARD_ID, cardId);
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_VALID_FROM)) {
|
||||||
bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_ID, barcodeId);
|
bundle.putLong(BUNDLE_LOYALTY_CARD_VALID_FROM, validFrom != null ? validFrom.getTime() : -1);
|
||||||
if (barcodeType != null) {
|
|
||||||
bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_TYPE, barcodeType.name());
|
|
||||||
}
|
}
|
||||||
if (headerColor != null) {
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_EXPIRY)) {
|
||||||
bundle.putInt(BUNDLE_LOYALTY_CARD_HEADER_COLOR, headerColor);
|
bundle.putLong(BUNDLE_LOYALTY_CARD_EXPIRY, expiry != null ? expiry.getTime() : -1);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BALANCE)) {
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_BALANCE, balance.toString());
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BALANCE_TYPE)) {
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_BALANCE_TYPE, balanceType != null ? balanceType.toString() : null);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_CARD_ID)) {
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_CARD_ID, cardId);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BARCODE_ID)) {
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_ID, barcodeId);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BARCODE_TYPE)) {
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_HEADER_COLOR)) {
|
||||||
|
bundle.putInt(BUNDLE_LOYALTY_CARD_HEADER_COLOR, headerColor != null ? headerColor : -1);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_STAR_STATUS)) {
|
||||||
|
bundle.putInt(BUNDLE_LOYALTY_CARD_STAR_STATUS, starStatus);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_LAST_USED)) {
|
||||||
|
bundle.putLong(BUNDLE_LOYALTY_CARD_LAST_USED, lastUsed);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL)) {
|
||||||
|
bundle.putInt(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL, zoomLevel);
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS)) {
|
||||||
|
bundle.putInt(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS, archiveStatus);
|
||||||
|
}
|
||||||
|
// There is an (undocumented) size limit to bundles of around 2MB(?), when going over it you will experience a random crash
|
||||||
|
// So, instead of storing the bitmaps directly, we write the bitmap to a temp file and store the path
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL)) {
|
||||||
|
Bitmap thumbnail = getImageThumbnail(context);
|
||||||
|
if (thumbnail != null) {
|
||||||
|
Utils.saveTempImage(context, thumbnail, TEMP_IMAGE_THUMBNAIL_FILE_NAME, Bitmap.CompressFormat.PNG);
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL, TEMP_IMAGE_THUMBNAIL_FILE_NAME);
|
||||||
|
} else {
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_FRONT)) {
|
||||||
|
Bitmap front = getImageFront(context);
|
||||||
|
if (front != null) {
|
||||||
|
Utils.saveTempImage(context, front, TEMP_IMAGE_FRONT_FILE_NAME, Bitmap.CompressFormat.PNG);
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT, TEMP_IMAGE_FRONT_FILE_NAME);
|
||||||
|
} else {
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_BACK)) {
|
||||||
|
Bitmap back = getImageBack(context);
|
||||||
|
if (back != null) {
|
||||||
|
Utils.saveTempImage(context, back, TEMP_IMAGE_BACK_FILE_NAME, Bitmap.CompressFormat.PNG);
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_BACK, TEMP_IMAGE_BACK_FILE_NAME);
|
||||||
|
} else {
|
||||||
|
bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_BACK, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bundle.putInt(BUNDLE_LOYALTY_CARD_STAR_STATUS, starStatus);
|
|
||||||
bundle.putLong(BUNDLE_LOYALTY_CARD_LAST_USED, lastUsed);
|
|
||||||
bundle.putInt(BUNDLE_LOYALTY_CARD_ZOOM_LEVEL, zoomLevel);
|
|
||||||
bundle.putInt(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS, archiveStatus);
|
|
||||||
|
|
||||||
return bundle;
|
return bundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LoyaltyCard fromCursor(Cursor cursor) {
|
public static LoyaltyCard fromCursor(Context context, Cursor cursor) {
|
||||||
// id
|
// id
|
||||||
int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
|
int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
|
||||||
// store
|
// store
|
||||||
@@ -393,10 +529,33 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
// archiveStatus
|
// archiveStatus
|
||||||
int archiveStatus = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS));
|
int archiveStatus = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS));
|
||||||
|
|
||||||
return new LoyaltyCard(id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, zoomLevel, archiveStatus);
|
return new LoyaltyCard(
|
||||||
|
id,
|
||||||
|
store,
|
||||||
|
note,
|
||||||
|
validFrom,
|
||||||
|
expiry,
|
||||||
|
balance,
|
||||||
|
balanceType,
|
||||||
|
cardId,
|
||||||
|
barcodeId,
|
||||||
|
barcodeType,
|
||||||
|
headerColor,
|
||||||
|
starStatus,
|
||||||
|
lastUsed,
|
||||||
|
zoomLevel,
|
||||||
|
archiveStatus,
|
||||||
|
null,
|
||||||
|
Utils.getCardImageFileName(id, ImageLocationType.icon),
|
||||||
|
null,
|
||||||
|
Utils.getCardImageFileName(id, ImageLocationType.front),
|
||||||
|
null,
|
||||||
|
Utils.getCardImageFileName(id, ImageLocationType.back)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isDuplicate(final LoyaltyCard a, final LoyaltyCard b) {
|
public static boolean isDuplicate(Context context, final LoyaltyCard a, final LoyaltyCard b) {
|
||||||
|
// Note: Bitmap comparing is slow, be careful when calling this method
|
||||||
// Skip lastUsed & zoomLevel
|
// Skip lastUsed & zoomLevel
|
||||||
return a.id == b.id && // non-nullable int
|
return a.id == b.id && // non-nullable int
|
||||||
a.store.equals(b.store) && // non-nullable String
|
a.store.equals(b.store) && // non-nullable String
|
||||||
@@ -411,12 +570,23 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
b.barcodeType == null ? null : b.barcodeType.format()) && // nullable CatimaBarcode with no overridden .equals(), so we need to check .format()
|
b.barcodeType == null ? null : b.barcodeType.format()) && // nullable CatimaBarcode with no overridden .equals(), so we need to check .format()
|
||||||
Utils.equals(a.headerColor, b.headerColor) && // nullable Integer
|
Utils.equals(a.headerColor, b.headerColor) && // nullable Integer
|
||||||
a.starStatus == b.starStatus && // non-nullable int
|
a.starStatus == b.starStatus && // non-nullable int
|
||||||
a.archiveStatus == b.archiveStatus; // non-nullable int
|
a.archiveStatus == b.archiveStatus && // non-nullable int
|
||||||
|
nullableBitmapsEqual(a.getImageThumbnail(context), b.getImageThumbnail(context)) && // nullable Bitmap
|
||||||
|
nullableBitmapsEqual(a.getImageFront(context), b.getImageFront(context)) && // nullable Bitmap
|
||||||
|
nullableBitmapsEqual(a.getImageBack(context), b.getImageBack(context)); // nullable Bitmap
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public static boolean nullableBitmapsEqual(@Nullable Bitmap a, @Nullable Bitmap b) {
|
||||||
public int describeContents() {
|
if (a == null && b == null) {
|
||||||
return 0;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a != null && b != null) {
|
||||||
|
return a.sameAs(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// One is null and the other isn't, so it's not equal
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@@ -425,7 +595,8 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
return String.format(
|
return String.format(
|
||||||
"LoyaltyCard{%n id=%s,%n store=%s,%n note=%s,%n validFrom=%s,%n expiry=%s,%n"
|
"LoyaltyCard{%n id=%s,%n store=%s,%n note=%s,%n validFrom=%s,%n expiry=%s,%n"
|
||||||
+ " balance=%s,%n balanceType=%s,%n cardId=%s,%n barcodeId=%s,%n barcodeType=%s,%n"
|
+ " balance=%s,%n balanceType=%s,%n cardId=%s,%n barcodeId=%s,%n barcodeType=%s,%n"
|
||||||
+ " headerColor=%s,%n starStatus=%s,%n lastUsed=%s,%n zoomLevel=%s,%n archiveStatus=%s%n}",
|
+ " headerColor=%s,%n starStatus=%s,%n lastUsed=%s,%n zoomLevel=%s,%n archiveStatus=%s%n"
|
||||||
|
+ " imageThumbnail=%s,%n imageThumbnailPath=%s,%n imageFront=%s,%n imageFrontPath=%s,%n imageBack=%s,%n imageBackPath=%s,%n}",
|
||||||
this.id,
|
this.id,
|
||||||
this.store,
|
this.store,
|
||||||
this.note,
|
this.note,
|
||||||
@@ -440,19 +611,13 @@ public class LoyaltyCard implements Parcelable {
|
|||||||
this.starStatus,
|
this.starStatus,
|
||||||
this.lastUsed,
|
this.lastUsed,
|
||||||
this.zoomLevel,
|
this.zoomLevel,
|
||||||
this.archiveStatus
|
this.archiveStatus,
|
||||||
|
this.imageThumbnail,
|
||||||
|
this.imageThumbnailPath,
|
||||||
|
this.imageFront,
|
||||||
|
this.imageFrontPath,
|
||||||
|
this.imageBack,
|
||||||
|
this.imageBackPath
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<LoyaltyCard> CREATOR = new Creator<LoyaltyCard>() {
|
|
||||||
@Override
|
|
||||||
public LoyaltyCard createFromParcel(Parcel in) {
|
|
||||||
return new LoyaltyCard(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LoyaltyCard[] newArray(int size) {
|
|
||||||
return new LoyaltyCard[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import java.text.DateFormat;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import protect.card_locker.databinding.LoyaltyCardLayoutBinding;
|
import protect.card_locker.databinding.LoyaltyCardLayoutBinding;
|
||||||
|
import protect.card_locker.preferences.Settings;
|
||||||
|
|
||||||
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder> {
|
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder> {
|
||||||
private int mCurrentSelectedIndex = -1;
|
private int mCurrentSelectedIndex = -1;
|
||||||
@@ -79,7 +80,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
|||||||
|
|
||||||
public LoyaltyCard getCard(int position) {
|
public LoyaltyCard getCard(int position) {
|
||||||
mCursor.moveToPosition(position);
|
mCursor.moveToPosition(position);
|
||||||
return LoyaltyCard.fromCursor(mCursor);
|
return LoyaltyCard.fromCursor(mContext, mCursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
|
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
|
||||||
@@ -87,8 +88,8 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
|||||||
boolean showDivider = false;
|
boolean showDivider = false;
|
||||||
inputHolder.mDivider.setVisibility(View.GONE);
|
inputHolder.mDivider.setVisibility(View.GONE);
|
||||||
|
|
||||||
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(inputCursor);
|
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(mContext, inputCursor);
|
||||||
Bitmap icon = Utils.retrieveCardImage(mContext, loyaltyCard.id, ImageLocationType.icon);
|
Bitmap icon = loyaltyCard.getImageThumbnail(mContext);
|
||||||
|
|
||||||
if (mLoyaltyCardListDisplayOptions.showingNameBelowThumbnail() && icon != null) {
|
if (mLoyaltyCardListDisplayOptions.showingNameBelowThumbnail() && icon != null) {
|
||||||
showDivider = true;
|
showDivider = true;
|
||||||
@@ -111,19 +112,19 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mLoyaltyCardListDisplayOptions.showingValidity() && loyaltyCard.validFrom != null) {
|
if (mLoyaltyCardListDisplayOptions.showingValidity() && loyaltyCard.validFrom != null) {
|
||||||
inputHolder.setExtraField(inputHolder.mValidFromField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.validFrom), Utils.isNotYetValid(loyaltyCard.validFrom) ? Color.RED : null, showDivider);
|
inputHolder.setExtraField(inputHolder.mValidFromField, DateFormat.getDateInstance(DateFormat.MEDIUM).format(loyaltyCard.validFrom), Utils.isNotYetValid(loyaltyCard.validFrom) ? Color.RED : null, showDivider);
|
||||||
} else {
|
} else {
|
||||||
inputHolder.setExtraField(inputHolder.mValidFromField, null, null, false);
|
inputHolder.setExtraField(inputHolder.mValidFromField, null, null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mLoyaltyCardListDisplayOptions.showingValidity() && loyaltyCard.expiry != null) {
|
if (mLoyaltyCardListDisplayOptions.showingValidity() && loyaltyCard.expiry != null) {
|
||||||
inputHolder.setExtraField(inputHolder.mExpiryField, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry), Utils.hasExpired(loyaltyCard.expiry) ? Color.RED : null, showDivider);
|
inputHolder.setExtraField(inputHolder.mExpiryField, DateFormat.getDateInstance(DateFormat.MEDIUM).format(loyaltyCard.expiry), Utils.hasExpired(loyaltyCard.expiry) ? Color.RED : null, showDivider);
|
||||||
} else {
|
} else {
|
||||||
inputHolder.setExtraField(inputHolder.mExpiryField, null, null, false);
|
inputHolder.setExtraField(inputHolder.mExpiryField, null, null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inputHolder.mCardIcon.setContentDescription(loyaltyCard.store);
|
inputHolder.mCardIcon.setContentDescription(loyaltyCard.store);
|
||||||
inputHolder.mIconBackgroundColor = Utils.setIconOrTextWithBackground(mContext, loyaltyCard, icon, inputHolder.mCardIcon, inputHolder.mCardText);
|
inputHolder.mIconBackgroundColor = Utils.setIconOrTextWithBackground(mContext, loyaltyCard, icon, inputHolder.mCardIcon, inputHolder.mCardText, new Settings(mContext).getPreferredColumnCount());
|
||||||
|
|
||||||
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
|
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
|
||||||
|
|
||||||
@@ -192,7 +193,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; i < mSelectedItems.size(); i++) {
|
for (i = 0; i < mSelectedItems.size(); i++) {
|
||||||
mCursor.moveToPosition(mSelectedItems.keyAt(i));
|
mCursor.moveToPosition(mSelectedItems.keyAt(i));
|
||||||
result.add(LoyaltyCard.fromCursor(mCursor));
|
result.add(LoyaltyCard.fromCursor(mContext, mCursor));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -339,10 +340,4 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int dpToPx(int dp, Context mContext) {
|
|
||||||
Resources r = mContext.getResources();
|
|
||||||
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics());
|
|
||||||
return px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -329,7 +329,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
|||||||
binding.bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog());
|
binding.bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog());
|
||||||
|
|
||||||
binding.iconContainer.setOnClickListener(view -> {
|
binding.iconContainer.setOnClickListener(view -> {
|
||||||
if (Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon) != null) {
|
if (loyaltyCard.getImageThumbnail(this) != null) {
|
||||||
openImageInGallery(ImageType.ICON);
|
openImageInGallery(ImageType.ICON);
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(LoyaltyCardViewActivity.this, R.string.icon_header_click_text, Toast.LENGTH_LONG).show();
|
Toast.makeText(LoyaltyCardViewActivity.this, R.string.icon_header_click_text, Toast.LENGTH_LONG).show();
|
||||||
@@ -660,7 +660,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
|||||||
window.setAttributes(attributes);
|
window.setAttributes(attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId);
|
loyaltyCard = DBHelper.getLoyaltyCard(this, database, loyaltyCardId);
|
||||||
if (loyaltyCard == null) {
|
if (loyaltyCard == null) {
|
||||||
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
|
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
|
||||||
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
|
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
|
||||||
@@ -719,8 +719,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
|||||||
editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
|
editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
|
||||||
binding.fabEdit.setImageDrawable(editButtonIcon);
|
binding.fabEdit.setImageDrawable(editButtonIcon);
|
||||||
|
|
||||||
Bitmap icon = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon);
|
Bitmap icon = loyaltyCard.getImageThumbnail(this);
|
||||||
Utils.setIconOrTextWithBackground(this, loyaltyCard, icon, binding.iconImage, binding.iconText);
|
Utils.setIconOrTextWithBackground(this, loyaltyCard, icon, binding.iconImage, binding.iconText, 1);
|
||||||
|
|
||||||
// If the background is very bright, we should use dark icons
|
// If the background is very bright, we should use dark icons
|
||||||
backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor);
|
backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor);
|
||||||
@@ -748,12 +748,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
|
|||||||
imageTypes.add(ImageType.BARCODE);
|
imageTypes.add(ImageType.BARCODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
frontImageBitmap = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.front);
|
frontImageBitmap = loyaltyCard.getImageFront(this);
|
||||||
if (frontImageBitmap != null) {
|
if (frontImageBitmap != null) {
|
||||||
imageTypes.add(ImageType.IMAGE_FRONT);
|
imageTypes.add(ImageType.IMAGE_FRONT);
|
||||||
}
|
}
|
||||||
|
|
||||||
backImageBitmap = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.back);
|
backImageBitmap = loyaltyCard.getImageBack(this);
|
||||||
if (backImageBitmap != null) {
|
if (backImageBitmap != null) {
|
||||||
imageTypes.add(ImageType.IMAGE_BACK);
|
imageTypes.add(ImageType.IMAGE_BACK);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import android.content.Intent;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.database.CursorIndexOutOfBoundsException;
|
import android.database.CursorIndexOutOfBoundsException;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
@@ -27,12 +28,14 @@ import androidx.appcompat.app.AlertDialog;
|
|||||||
import androidx.appcompat.view.ActionMode;
|
import androidx.appcompat.view.ActionMode;
|
||||||
import androidx.appcompat.widget.SearchView;
|
import androidx.appcompat.widget.SearchView;
|
||||||
import androidx.core.splashscreen.SplashScreen;
|
import androidx.core.splashscreen.SplashScreen;
|
||||||
|
import androidx.recyclerview.widget.GridLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -43,6 +46,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
import protect.card_locker.databinding.ContentMainBinding;
|
import protect.card_locker.databinding.ContentMainBinding;
|
||||||
import protect.card_locker.databinding.MainActivityBinding;
|
import protect.card_locker.databinding.MainActivityBinding;
|
||||||
import protect.card_locker.databinding.SortingOptionBinding;
|
import protect.card_locker.databinding.SortingOptionBinding;
|
||||||
|
import protect.card_locker.preferences.Settings;
|
||||||
import protect.card_locker.preferences.SettingsActivity;
|
import protect.card_locker.preferences.SettingsActivity;
|
||||||
|
|
||||||
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
|
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
|
||||||
@@ -52,6 +56,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent";
|
public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent";
|
||||||
|
|
||||||
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
|
private static final int MEDIUM_SCALE_FACTOR_DIP = 460;
|
||||||
|
static final String STATE_SEARCH_QUERY = "SEARCH_QUERY";
|
||||||
|
|
||||||
private SQLiteDatabase mDatabase;
|
private SQLiteDatabase mDatabase;
|
||||||
private LoyaltyCardCursorAdapter mAdapter;
|
private LoyaltyCardCursorAdapter mAdapter;
|
||||||
@@ -59,6 +64,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
private SearchView mSearchView;
|
private SearchView mSearchView;
|
||||||
private int mLoyaltyCardCount = 0;
|
private int mLoyaltyCardCount = 0;
|
||||||
protected String mFilter = "";
|
protected String mFilter = "";
|
||||||
|
private String currentQuery = "";
|
||||||
|
private String finalQuery = "";
|
||||||
protected Object mGroup = null;
|
protected Object mGroup = null;
|
||||||
protected DBHelper.LoyaltyCardOrder mOrder = DBHelper.LoyaltyCardOrder.Alpha;
|
protected DBHelper.LoyaltyCardOrder mOrder = DBHelper.LoyaltyCardOrder.Alpha;
|
||||||
protected DBHelper.LoyaltyCardOrderDirection mOrderDirection = DBHelper.LoyaltyCardOrderDirection.Ascending;
|
protected DBHelper.LoyaltyCardOrderDirection mOrderDirection = DBHelper.LoyaltyCardOrderDirection.Ascending;
|
||||||
@@ -68,9 +75,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
private View mNoMatchingCardsText;
|
private View mNoMatchingCardsText;
|
||||||
private View mNoGroupCardsText;
|
private View mNoGroupCardsText;
|
||||||
private TabLayout groupsTabLayout;
|
private TabLayout groupsTabLayout;
|
||||||
|
|
||||||
private Runnable mUpdateLoyaltyCardListRunnable;
|
private Runnable mUpdateLoyaltyCardListRunnable;
|
||||||
|
|
||||||
private ActivityResultLauncher<Intent> mBarcodeScannerLauncher;
|
private ActivityResultLauncher<Intent> mBarcodeScannerLauncher;
|
||||||
private ActivityResultLauncher<Intent> mSettingsLauncher;
|
private ActivityResultLauncher<Intent> mSettingsLauncher;
|
||||||
|
|
||||||
@@ -198,6 +203,27 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
SplashScreen.installSplashScreen(this);
|
SplashScreen.installSplashScreen(this);
|
||||||
super.onCreate(inputSavedInstanceState);
|
super.onCreate(inputSavedInstanceState);
|
||||||
|
|
||||||
|
// Delete old cache files
|
||||||
|
// These could be temporary images for the cropper, temporary images in LoyaltyCard toBundle/writeParcel/ etc.
|
||||||
|
new Thread(() -> {
|
||||||
|
long twentyFourHoursAgo = System.currentTimeMillis() - (1000 * 60 * 60 * 24);
|
||||||
|
|
||||||
|
File[] tempFiles = getCacheDir().listFiles();
|
||||||
|
|
||||||
|
if (tempFiles == null) {
|
||||||
|
Log.e(TAG, "getCacheDir().listFiles() somehow returned null, this should never happen... Skipping cache cleanup...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (File file : tempFiles) {
|
||||||
|
if (file.lastModified() < twentyFourHoursAgo) {
|
||||||
|
if (!file.delete()) {
|
||||||
|
Log.w(TAG, "Failed to delete cache file " + file.getPath());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
// We should extract the share intent after we called the super.onCreate as it may need to spawn a dialog window and the app needs to be initialized to not crash
|
// We should extract the share intent after we called the super.onCreate as it may need to spawn a dialog window and the app needs to be initialized to not crash
|
||||||
extractIntentFields(getIntent());
|
extractIntentFields(getIntent());
|
||||||
|
|
||||||
@@ -249,21 +275,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
mCardList.setAdapter(mAdapter);
|
mCardList.setAdapter(mAdapter);
|
||||||
registerForContextMenu(mCardList);
|
registerForContextMenu(mCardList);
|
||||||
|
|
||||||
mGroup = null;
|
|
||||||
updateLoyaltyCardList(true);
|
|
||||||
|
|
||||||
mBarcodeScannerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
mBarcodeScannerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||||
// Exit early if the user cancelled the scan (pressed back/home)
|
// Exit early if the user cancelled the scan (pressed back/home)
|
||||||
if (result.getResultCode() != RESULT_OK) {
|
if (result.getResultCode() != RESULT_OK) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Intent intent = result.getData();
|
Intent editIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
|
||||||
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
|
editIntent.putExtras(result.getData().getExtras());
|
||||||
|
startActivity(editIntent);
|
||||||
Bundle inputBundle = intent.getExtras();
|
|
||||||
String group = inputBundle != null ? inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) : null;
|
|
||||||
processBarcodeValuesList(barcodeValuesList, group, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||||
@@ -299,7 +319,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
if (mSearchView != null && !mSearchView.isIconified()) {
|
if (mSearchView != null && !mSearchView.isIconified()) {
|
||||||
mFilter = mSearchView.getQuery().toString();
|
mFilter = mSearchView.getQuery().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start of active tab logic
|
// Start of active tab logic
|
||||||
updateTabGroups(groupsTabLayout);
|
updateTabGroups(groupsTabLayout);
|
||||||
|
|
||||||
@@ -357,6 +376,12 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
mBarcodeScannerLauncher.launch(intent);
|
mBarcodeScannerLauncher.launch(intent);
|
||||||
});
|
});
|
||||||
addButton.bringToFront();
|
addButton.bringToFront();
|
||||||
|
|
||||||
|
var layoutManager = (GridLayoutManager) mCardList.getLayoutManager();
|
||||||
|
if (layoutManager != null) {
|
||||||
|
var settings = new Settings(this);
|
||||||
|
layoutManager.setSpanCount(settings.getPreferredColumnCount());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displayCardSetupOptions(Menu menu, boolean shouldShow) {
|
private void displayCardSetupOptions(Menu menu, boolean shouldShow) {
|
||||||
@@ -418,21 +443,16 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processBarcodeValuesList(List<BarcodeValues> barcodeValuesList, String group, boolean closeAppOnNoBarcode) {
|
private void processParseResultList(List<ParseResult> parseResultList, String group, boolean closeAppOnNoBarcode) {
|
||||||
if (barcodeValuesList.isEmpty()) {
|
if (parseResultList.isEmpty()) {
|
||||||
throw new IllegalArgumentException("barcodesValues may not be empty");
|
throw new IllegalArgumentException("parseResultList may not be empty");
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils.makeUserChooseBarcodeFromList(MainActivity.this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
|
Utils.makeUserChooseParseResultFromList(MainActivity.this, parseResultList, new ParseResultListDisambiguatorCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
|
public void onUserChoseParseResult(ParseResult parseResult) {
|
||||||
CatimaBarcode barcodeType = barcodeValues.format();
|
|
||||||
|
|
||||||
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
|
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = parseResult.toLoyaltyCardBundle(MainActivity.this);
|
||||||
bundle.putString(LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID, barcodeValues.content());
|
|
||||||
bundle.putString(LoyaltyCard.BUNDLE_LOYALTY_CARD_BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null);
|
|
||||||
bundle.putString(LoyaltyCard.BUNDLE_LOYALTY_CARD_BARCODE_ID, null);
|
|
||||||
if (group != null) {
|
if (group != null) {
|
||||||
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
|
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
|
||||||
}
|
}
|
||||||
@@ -453,28 +473,48 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
String receivedAction = intent.getAction();
|
String receivedAction = intent.getAction();
|
||||||
String receivedType = intent.getType();
|
String receivedType = intent.getType();
|
||||||
|
|
||||||
// Check if an image or file was shared to us
|
if (receivedAction == null || receivedType == null) {
|
||||||
if (Intent.ACTION_SEND.equals(receivedAction)) {
|
return;
|
||||||
List<BarcodeValues> barcodeValuesList;
|
}
|
||||||
|
|
||||||
if (receivedType.equals("text/plain")) {
|
List<ParseResult> parseResultList;
|
||||||
barcodeValuesList = Collections.singletonList(new BarcodeValues(null, intent.getStringExtra(Intent.EXTRA_TEXT)));
|
|
||||||
} else if (receivedType.startsWith("image/")) {
|
// Check for shared text
|
||||||
barcodeValuesList = Utils.retrieveBarcodesFromImage(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
|
if (receivedAction.equals(Intent.ACTION_SEND) && receivedType.equals("text/plain")) {
|
||||||
|
LoyaltyCard loyaltyCard = new LoyaltyCard();
|
||||||
|
loyaltyCard.setCardId(intent.getStringExtra(Intent.EXTRA_TEXT));
|
||||||
|
parseResultList = Collections.singletonList(new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard));
|
||||||
|
} else {
|
||||||
|
// Parse whatever file was sent, regardless of opening or sharing
|
||||||
|
Uri data;
|
||||||
|
if (receivedAction.equals(Intent.ACTION_VIEW)) {
|
||||||
|
data = intent.getData();
|
||||||
|
} else if (receivedAction.equals(Intent.ACTION_SEND)) {
|
||||||
|
data = intent.getParcelableExtra(Intent.EXTRA_STREAM);
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "Wrong action type to parse intent");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (receivedType.startsWith("image/")) {
|
||||||
|
parseResultList = Utils.retrieveBarcodesFromImage(this, data);
|
||||||
} else if (receivedType.equals("application/pdf")) {
|
} else if (receivedType.equals("application/pdf")) {
|
||||||
barcodeValuesList = Utils.retrieveBarcodesFromPdf(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
|
parseResultList = Utils.retrieveBarcodesFromPdf(this, data);
|
||||||
|
} else if (receivedType.equals("application/vnd.apple.pkpass")) {
|
||||||
|
parseResultList = Utils.retrieveBarcodesFromPkPass(this, data);
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "Wrong mime-type");
|
Log.e(TAG, "Wrong mime-type");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barcodeValuesList.isEmpty()) {
|
|
||||||
finish();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
processBarcodeValuesList(barcodeValuesList, null, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Give up if we should parse but there is nothing to parse
|
||||||
|
if (parseResultList == null || parseResultList.isEmpty()) {
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
processParseResultList(parseResultList, null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void extractIntentFields(Intent intent) {
|
private void extractIntentFields(Intent intent) {
|
||||||
@@ -508,6 +548,24 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
// Saving currentQuery to finalQuery for user, this will be used to restore search history, happens when user clicks a card from list
|
||||||
|
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
finalQuery = currentQuery;
|
||||||
|
// Putting the query also into outState for later use in onRestoreInstanceState when rotating screen
|
||||||
|
if (mSearchView != null) {
|
||||||
|
outState.putString(STATE_SEARCH_QUERY, finalQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
// Restoring instance state when rotation of screen happens with the goal to restore search query for user
|
||||||
|
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
|
||||||
|
super.onRestoreInstanceState(savedInstanceState);
|
||||||
|
finalQuery = savedInstanceState.getString(STATE_SEARCH_QUERY, "");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreateOptionsMenu(Menu inputMenu) {
|
public boolean onCreateOptionsMenu(Menu inputMenu) {
|
||||||
getMenuInflater().inflate(R.menu.main_menu, inputMenu);
|
getMenuInflater().inflate(R.menu.main_menu, inputMenu);
|
||||||
@@ -520,7 +578,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
mSearchView = (SearchView) searchMenuItem.getActionView();
|
mSearchView = (SearchView) searchMenuItem.getActionView();
|
||||||
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
|
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
|
||||||
mSearchView.setSubmitButtonEnabled(false);
|
mSearchView.setSubmitButtonEnabled(false);
|
||||||
|
|
||||||
mSearchView.setOnCloseListener(() -> {
|
mSearchView.setOnCloseListener(() -> {
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
return false;
|
return false;
|
||||||
@@ -545,6 +602,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
mSearchView.clearFocus();
|
mSearchView.clearFocus();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
currentQuery = "";
|
||||||
|
mFilter = "";
|
||||||
|
updateLoyaltyCardList(false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -559,7 +619,21 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
@Override
|
@Override
|
||||||
public boolean onQueryTextChange(String newText) {
|
public boolean onQueryTextChange(String newText) {
|
||||||
mFilter = newText;
|
mFilter = newText;
|
||||||
|
// New logic to ensure search history after coming back from picked card - user will see the last search query
|
||||||
|
if (newText.isEmpty()) {
|
||||||
|
if(!finalQuery.isEmpty()){
|
||||||
|
// Setting the query text for user after coming back from picked card from finalQuery
|
||||||
|
mSearchView.setQuery(finalQuery, false);
|
||||||
|
}
|
||||||
|
else if(!currentQuery.isEmpty()){
|
||||||
|
// Else if is needed in case user deletes search - expected behaviour is to show all cards
|
||||||
|
currentQuery = "";
|
||||||
|
mSearchView.setQuery(currentQuery, false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Setting search query each time user changes the text in search to temporary variable to be used later in finalQuery String which will be used to restore search history
|
||||||
|
currentQuery = newText;
|
||||||
|
}
|
||||||
TabLayout.Tab currentTab = groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition());
|
TabLayout.Tab currentTab = groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition());
|
||||||
mGroup = currentTab != null ? currentTab.getTag() : null;
|
mGroup = currentTab != null ? currentTab.getTag() : null;
|
||||||
|
|
||||||
@@ -568,6 +642,14 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// Check if we came from a picked card back to search, in that case we want to show the search view with previous search query
|
||||||
|
if(!finalQuery.isEmpty()){
|
||||||
|
// Expand the search view to show the query
|
||||||
|
searchMenuItem.expandActionView();
|
||||||
|
// Setting the query text to empty String due to behaviour of onQueryTextChange after coming back from picked card - onQueryTextChange is called automatically without users interaction
|
||||||
|
finalQuery = "";
|
||||||
|
mSearchView.setQuery(currentQuery, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.onCreateOptionsMenu(inputMenu);
|
return super.onCreateOptionsMenu(inputMenu);
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
|
public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) {
|
||||||
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(inputCursor);
|
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(mContext, inputCursor);
|
||||||
Boolean overlayValue = mInGroupOverlay.get(loyaltyCard.id);
|
Boolean overlayValue = mInGroupOverlay.get(loyaltyCard.id);
|
||||||
if ((overlayValue != null ? overlayValue : isLoyaltyCardInGroup(loyaltyCard.id))) {
|
if ((overlayValue != null ? overlayValue : isLoyaltyCardInGroup(loyaltyCard.id))) {
|
||||||
mAnimationItemsIndex.put(inputCursor.getPosition(), true);
|
mAnimationItemsIndex.put(inputCursor.getPosition(), true);
|
||||||
|
|||||||
31
app/src/main/java/protect/card_locker/ParseResult.kt
Normal file
31
app/src/main/java/protect/card_locker/ParseResult.kt
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package protect.card_locker
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Bundle
|
||||||
|
|
||||||
|
class ParseResult(
|
||||||
|
val parseResultType: ParseResultType,
|
||||||
|
val loyaltyCard: LoyaltyCard) {
|
||||||
|
var note: String? = null
|
||||||
|
|
||||||
|
fun toLoyaltyCardBundle(context: Context): Bundle {
|
||||||
|
when (parseResultType) {
|
||||||
|
ParseResultType.FULL -> return loyaltyCard.toBundle(context, listOf())
|
||||||
|
ParseResultType.BARCODE_ONLY -> {
|
||||||
|
val defaultLoyaltyCard = LoyaltyCard()
|
||||||
|
defaultLoyaltyCard.setBarcodeId(null)
|
||||||
|
defaultLoyaltyCard.setBarcodeType(loyaltyCard.barcodeType)
|
||||||
|
defaultLoyaltyCard.setCardId(loyaltyCard.cardId)
|
||||||
|
|
||||||
|
return defaultLoyaltyCard.toBundle(
|
||||||
|
context,
|
||||||
|
listOf(
|
||||||
|
LoyaltyCard.BUNDLE_LOYALTY_CARD_BARCODE_ID,
|
||||||
|
LoyaltyCard.BUNDLE_LOYALTY_CARD_BARCODE_TYPE,
|
||||||
|
LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package protect.card_locker;
|
||||||
|
|
||||||
|
public interface ParseResultListDisambiguatorCallback {
|
||||||
|
void onUserChoseParseResult(ParseResult parseResult);
|
||||||
|
void onUserDismissedSelector();
|
||||||
|
}
|
||||||
6
app/src/main/java/protect/card_locker/ParseResultType.kt
Normal file
6
app/src/main/java/protect/card_locker/ParseResultType.kt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package protect.card_locker
|
||||||
|
|
||||||
|
enum class ParseResultType {
|
||||||
|
FULL,
|
||||||
|
BARCODE_ONLY
|
||||||
|
}
|
||||||
437
app/src/main/java/protect/card_locker/PkpassParser.kt
Normal file
437
app/src/main/java/protect/card_locker/PkpassParser.kt
Normal file
@@ -0,0 +1,437 @@
|
|||||||
|
package protect.card_locker
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.net.Uri
|
||||||
|
import android.util.ArrayMap
|
||||||
|
import android.util.Log
|
||||||
|
import com.google.zxing.BarcodeFormat
|
||||||
|
import net.lingala.zip4j.io.inputstream.ZipInputStream
|
||||||
|
import net.lingala.zip4j.model.LocalFileHeader
|
||||||
|
import org.json.JSONException
|
||||||
|
import org.json.JSONObject
|
||||||
|
import java.io.FileNotFoundException
|
||||||
|
import java.io.IOException
|
||||||
|
import java.math.BigDecimal
|
||||||
|
import java.text.DateFormat
|
||||||
|
import java.text.ParseException
|
||||||
|
import java.time.ZonedDateTime
|
||||||
|
import java.time.format.DateTimeParseException
|
||||||
|
import java.util.Currency
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
class PkpassParser(context: Context, uri: Uri?) {
|
||||||
|
private var mContext = context
|
||||||
|
|
||||||
|
private var translations: ArrayMap<String, Map<String, String>> = ArrayMap()
|
||||||
|
|
||||||
|
private var passContent: JSONObject? = null
|
||||||
|
|
||||||
|
private var store: String? = null
|
||||||
|
private var note: String? = null
|
||||||
|
private var validFrom: Date? = null
|
||||||
|
private var expiry: Date? = null
|
||||||
|
private val balance: BigDecimal = BigDecimal(0)
|
||||||
|
private val balanceType: Currency? = null
|
||||||
|
private var cardId: String? = null
|
||||||
|
private var barcodeId: String? = null
|
||||||
|
private var barcodeType: CatimaBarcode? = null
|
||||||
|
private var headerColor: Int? = null
|
||||||
|
private val starStatus = 0
|
||||||
|
private val lastUsed: Long = 0
|
||||||
|
private val zoomLevel = DBHelper.DEFAULT_ZOOM_LEVEL
|
||||||
|
private var archiveStatus = 0
|
||||||
|
|
||||||
|
var image: Bitmap? = null
|
||||||
|
private set
|
||||||
|
private var logoSize = 0
|
||||||
|
|
||||||
|
init {
|
||||||
|
if (passContent != null) {
|
||||||
|
throw IllegalStateException("Pkpass instance already initialized!")
|
||||||
|
}
|
||||||
|
|
||||||
|
mContext = context
|
||||||
|
|
||||||
|
Log.i(TAG, "Received Pkpass file")
|
||||||
|
if (uri == null) {
|
||||||
|
Log.e(TAG, "Uri did not contain any data")
|
||||||
|
throw IOException(context.getString(R.string.errorReadingFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mContext.contentResolver.openInputStream(uri).use { inputStream ->
|
||||||
|
ZipInputStream(inputStream).use { zipInputStream ->
|
||||||
|
var localFileHeader: LocalFileHeader
|
||||||
|
while ((zipInputStream.nextEntry.also { localFileHeader = it }) != null) {
|
||||||
|
// Ignore directories
|
||||||
|
if (localFileHeader.isDirectory) continue
|
||||||
|
|
||||||
|
// We assume there are three options, as per spec:
|
||||||
|
// language.lproj/pass.strings
|
||||||
|
// file.extension
|
||||||
|
// More directories are ignored
|
||||||
|
val filenameParts = localFileHeader.fileName.split('/')
|
||||||
|
if (filenameParts.size > 2) {
|
||||||
|
continue
|
||||||
|
} else if (filenameParts.size == 2) {
|
||||||
|
// Doesn't seem like a language directory, ignore
|
||||||
|
if (!filenameParts[0].endsWith(".lproj")) continue
|
||||||
|
|
||||||
|
val locale = filenameParts[0].removeSuffix(".lproj")
|
||||||
|
|
||||||
|
translations[locale] = parseLanguageStrings(ZipUtils.read(zipInputStream))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not a language, parse as normal files
|
||||||
|
when (localFileHeader.fileName) {
|
||||||
|
"logo.png" -> loadImageIfBiggerSize(1, zipInputStream)
|
||||||
|
"logo@2x.png" -> loadImageIfBiggerSize(2, zipInputStream)
|
||||||
|
"logo@3x.png" -> loadImageIfBiggerSize(3, zipInputStream)
|
||||||
|
"pass.json" -> passContent = ZipUtils.readJSON(zipInputStream) // Parse this last, so we're sure we have all language info
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkNotNull(passContent) { "File lacks pass.json" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: FileNotFoundException) {
|
||||||
|
throw IOException(mContext.getString(R.string.errorReadingFile))
|
||||||
|
} catch (e: Exception) {
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun listLocales(): List<String> {
|
||||||
|
return translations.keys.toList()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun toLoyaltyCard(locale: String?): LoyaltyCard {
|
||||||
|
parsePassJSON(checkNotNull(passContent) { "Pkpass instance not yet initialized!" }, locale)
|
||||||
|
|
||||||
|
return LoyaltyCard(
|
||||||
|
-1,
|
||||||
|
store,
|
||||||
|
note,
|
||||||
|
validFrom,
|
||||||
|
expiry,
|
||||||
|
balance,
|
||||||
|
balanceType,
|
||||||
|
cardId,
|
||||||
|
barcodeId,
|
||||||
|
barcodeType,
|
||||||
|
headerColor,
|
||||||
|
starStatus,
|
||||||
|
lastUsed,
|
||||||
|
zoomLevel,
|
||||||
|
archiveStatus,
|
||||||
|
image,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getTranslation(string: String, locale: String?): String {
|
||||||
|
if (locale == null) {
|
||||||
|
return string
|
||||||
|
}
|
||||||
|
|
||||||
|
val localeStrings = translations[locale]
|
||||||
|
|
||||||
|
return localeStrings?.get(string) ?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun loadImageIfBiggerSize(fileLogoSize: Int, zipInputStream: ZipInputStream) {
|
||||||
|
if (logoSize < fileLogoSize) {
|
||||||
|
image = ZipUtils.readImage(zipInputStream)
|
||||||
|
logoSize = fileLogoSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parseColor(color: String): Int? {
|
||||||
|
// First, try formats supported by Android natively
|
||||||
|
try {
|
||||||
|
return Color.parseColor(color)
|
||||||
|
} catch (ignored: IllegalArgumentException) {}
|
||||||
|
|
||||||
|
// If that didn't work, try parsing it as a rbg(0,0,255) value
|
||||||
|
val red: Int;
|
||||||
|
val green: Int;
|
||||||
|
val blue: Int;
|
||||||
|
|
||||||
|
// Parse rgb(0,0,0) string
|
||||||
|
val rgbInfo = Regex("""^rgb\(\s*(?<red>\d+)\s*,\s*(?<green>\d+)\s*,\s*(?<blue>\d+)\s*\)$""").find(color)
|
||||||
|
if (rgbInfo == null) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert to integers
|
||||||
|
try {
|
||||||
|
red = rgbInfo.groups[1]!!.value.toInt()
|
||||||
|
green = rgbInfo.groups[2]!!.value.toInt()
|
||||||
|
blue = rgbInfo.groups[3]!!.value.toInt()
|
||||||
|
} catch (e: NumberFormatException) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure everything is in a valid range as Color.rgb does not do range checks
|
||||||
|
if (red < 0 || red > 255) return null
|
||||||
|
if (green < 0 || green > 255) return null
|
||||||
|
if (blue < 0 || blue > 255) return null
|
||||||
|
|
||||||
|
return Color.rgb(red, green, blue)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parseDateTime(dateTime: String): Date {
|
||||||
|
return Date.from(ZonedDateTime.parse(dateTime).toInstant())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parseLanguageStrings(data: String): Map<String, String> {
|
||||||
|
val output = ArrayMap<String, String>()
|
||||||
|
|
||||||
|
// Translations look like this:
|
||||||
|
// "key_name" = "Translated value";
|
||||||
|
//
|
||||||
|
// However, "Translated value" may be multiple lines and may contain " (however, it'll be escaped)
|
||||||
|
var translationLine = StringBuilder()
|
||||||
|
|
||||||
|
for (line in data.lines()) {
|
||||||
|
translationLine.append(line)
|
||||||
|
|
||||||
|
// Make sure we don't have a false ending (this is the escaped double quote: \";)
|
||||||
|
if (!line.endsWith("\\\";") and line.endsWith("\";")) {
|
||||||
|
// We reached a translation ending, time to parse it
|
||||||
|
|
||||||
|
// 1. Split into key and value
|
||||||
|
// 2. Remove cruft of each
|
||||||
|
// 3. Clean up escape sequences
|
||||||
|
val keyValue = translationLine.toString().split("=", ignoreCase = false, limit = 2)
|
||||||
|
val key = keyValue[0].trim().removePrefix("\"").removeSuffix("\"")
|
||||||
|
val value = keyValue[1].trim().removePrefix("\"").removeSuffix("\";").replace("\\", "")
|
||||||
|
|
||||||
|
output[key] = value
|
||||||
|
|
||||||
|
translationLine = StringBuilder()
|
||||||
|
} else {
|
||||||
|
translationLine.append("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parsePassJSON(jsonObject: JSONObject, locale: String?) {
|
||||||
|
if (jsonObject.getInt("formatVersion") != 1) {
|
||||||
|
throw IllegalArgumentException(mContext.getString(R.string.unsupportedFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prefer logoText for store, it's generally shorter
|
||||||
|
try {
|
||||||
|
store = jsonObject.getString("logoText")
|
||||||
|
} catch (ignored: JSONException) {}
|
||||||
|
|
||||||
|
if (store.isNullOrEmpty()) {
|
||||||
|
store = jsonObject.getString("organizationName")
|
||||||
|
}
|
||||||
|
|
||||||
|
val noteText = StringBuilder()
|
||||||
|
noteText.append(getTranslation(jsonObject.getString("description"), locale))
|
||||||
|
|
||||||
|
try {
|
||||||
|
validFrom = parseDateTime(jsonObject.getString("relevantDate"))
|
||||||
|
} catch (ignored: JSONException) {}
|
||||||
|
|
||||||
|
try {
|
||||||
|
expiry = parseDateTime(jsonObject.getString("expirationDate"))
|
||||||
|
} catch (ignored: JSONException) {}
|
||||||
|
|
||||||
|
try {
|
||||||
|
headerColor = parseColor(jsonObject.getString("backgroundColor"))
|
||||||
|
} catch (ignored: JSONException) {}
|
||||||
|
|
||||||
|
var pkPassHasBarcodes = false
|
||||||
|
var validBarcodeFound = false
|
||||||
|
|
||||||
|
// Create a list of possible barcodes
|
||||||
|
val barcodes = ArrayList<JSONObject>()
|
||||||
|
|
||||||
|
// Append the non-deprecated entries
|
||||||
|
try {
|
||||||
|
val foundInBarcodesField = jsonObject.getJSONArray("barcodes")
|
||||||
|
|
||||||
|
for (i in 0 until foundInBarcodesField.length()) {
|
||||||
|
barcodes.add(foundInBarcodesField.getJSONObject(i))
|
||||||
|
}
|
||||||
|
} catch (ignored: JSONException) {}
|
||||||
|
|
||||||
|
// Append the deprecated entry if it exists
|
||||||
|
try {
|
||||||
|
barcodes.add(jsonObject.getJSONObject("barcode"))
|
||||||
|
} catch (ignored: JSONException) {}
|
||||||
|
|
||||||
|
for (barcode in barcodes) {
|
||||||
|
pkPassHasBarcodes = true
|
||||||
|
|
||||||
|
try {
|
||||||
|
parsePassJSONBarcodeField(barcode)
|
||||||
|
|
||||||
|
validBarcodeFound = true
|
||||||
|
break
|
||||||
|
} catch (ignored: IllegalArgumentException) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pkPassHasBarcodes && !validBarcodeFound) {
|
||||||
|
throw FormatException(mContext.getString(R.string.errorReadingFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
// An used card being "archived" probably is the most sensible way to map "voided"
|
||||||
|
archiveStatus = try {
|
||||||
|
if (jsonObject.getBoolean("voided")) 1 else 0
|
||||||
|
} catch (ignored: JSONException) {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append type-specific info to the pass
|
||||||
|
noteText.append("\n\n")
|
||||||
|
|
||||||
|
// Find the relevant pass type and parse it
|
||||||
|
var hasPassData = false
|
||||||
|
for (passType in listOf("boardingPass", "coupon", "eventTicket", "generic")) {
|
||||||
|
try {
|
||||||
|
noteText.append(
|
||||||
|
parsePassJSONPassFields(
|
||||||
|
jsonObject.getJSONObject(passType),
|
||||||
|
locale
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
hasPassData = true
|
||||||
|
|
||||||
|
break
|
||||||
|
} catch (ignored: JSONException) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Failed to parse anything, error out
|
||||||
|
if (!hasPassData) {
|
||||||
|
throw FormatException(mContext.getString(R.string.errorReadingFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
note = noteText.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return success or failure */
|
||||||
|
private fun parsePassJSONBarcodeField(barcodeInfo: JSONObject) {
|
||||||
|
val format = barcodeInfo.getString("format")
|
||||||
|
|
||||||
|
// We only need to check these 4 formats as no other options are valid in the PkPass spec
|
||||||
|
barcodeType = when(format) {
|
||||||
|
"PKBarcodeFormatQR" -> CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE)
|
||||||
|
"PKBarcodeFormatPDF417" -> CatimaBarcode.fromBarcode(BarcodeFormat.PDF_417)
|
||||||
|
"PKBarcodeFormatAztec" -> CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC)
|
||||||
|
"PKBarcodeFormatCode128" -> CatimaBarcode.fromBarcode(BarcodeFormat.CODE_128)
|
||||||
|
else -> throw IllegalArgumentException("No valid barcode type")
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: We probably need to do something with the messageEncoding field
|
||||||
|
try {
|
||||||
|
cardId = barcodeInfo.getString("altText")
|
||||||
|
barcodeId = barcodeInfo.getString("message")
|
||||||
|
} catch (ignored: JSONException) {
|
||||||
|
cardId = barcodeInfo.getString("message")
|
||||||
|
barcodeId = null
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't set barcodeId if it's the same as cardId
|
||||||
|
if (cardId == barcodeId) {
|
||||||
|
barcodeId = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parsePassJSONPassFields(fieldsParent: JSONObject, locale: String?): String {
|
||||||
|
// These fields contain a lot of info on where we're supposed to display them, but Catima doesn't really have anything for that
|
||||||
|
// So for now, throw them all into the description field in a logical order
|
||||||
|
val noteContents: MutableList<String> = ArrayList()
|
||||||
|
|
||||||
|
// Collect all the groups of fields that exist
|
||||||
|
for (fieldType in listOf("headerFields", "primaryFields", "secondaryFields", "auxiliaryFields", "backFields")) {
|
||||||
|
val content = StringBuilder()
|
||||||
|
|
||||||
|
try {
|
||||||
|
val fieldArray = fieldsParent.getJSONArray(fieldType)
|
||||||
|
for (i in 0 until fieldArray.length()) {
|
||||||
|
val entry = fieldArray.getJSONObject(i)
|
||||||
|
|
||||||
|
content.append(parsePassJSONPassField(entry, locale))
|
||||||
|
|
||||||
|
// If this is not the last part, add spacing on the end
|
||||||
|
if (i < (fieldArray.length() - 1)) {
|
||||||
|
content.append("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (ignore: JSONException) {
|
||||||
|
} catch (ignore: ParseException) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (content.isNotEmpty()) {
|
||||||
|
noteContents.add(content.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merge all field groups together, one paragraph for field group
|
||||||
|
val output = StringBuilder()
|
||||||
|
|
||||||
|
for (i in 0 until noteContents.size) {
|
||||||
|
output.append(noteContents[i])
|
||||||
|
|
||||||
|
// If this is not the last part, add newlines to separate
|
||||||
|
if (i < (noteContents.size - 1)) {
|
||||||
|
output.append("\n\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parsePassJSONPassField(field: JSONObject, locale: String?): String {
|
||||||
|
// Value may be a localizable string, a date or a number. So let's try to parse it as a date first
|
||||||
|
|
||||||
|
var value = getTranslation(field.getString("value"), locale)
|
||||||
|
try {
|
||||||
|
value = DateFormat.getDateTimeInstance().format(parseDateTime(value))
|
||||||
|
} catch (ignored: DateTimeParseException) {
|
||||||
|
// It's fine if it's not a date
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: Use the Android thing for formatted strings here
|
||||||
|
if (field.has("currencyCode")) {
|
||||||
|
val valueCurrency = Currency.getInstance(field.getString("currencyCode"))
|
||||||
|
|
||||||
|
value = Utils.formatBalance(
|
||||||
|
mContext,
|
||||||
|
Utils.parseBalance(value, valueCurrency),
|
||||||
|
valueCurrency
|
||||||
|
)
|
||||||
|
} else if (field.has("numberStyle")) {
|
||||||
|
if (field.getString("numberStyle") == "PKNumberStylePercent") {
|
||||||
|
// FIXME: Android formatting string
|
||||||
|
value = "${value}%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val label = getTranslation(field.getString("label"), locale)
|
||||||
|
|
||||||
|
if (label.isNotEmpty()) {
|
||||||
|
return "$label: $value"
|
||||||
|
}
|
||||||
|
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "Catima"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -67,6 +67,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
|
|
||||||
private static final int PERMISSION_SCAN_ADD_FROM_IMAGE = 100;
|
private static final int PERMISSION_SCAN_ADD_FROM_IMAGE = 100;
|
||||||
private static final int PERMISSION_SCAN_ADD_FROM_PDF = 101;
|
private static final int PERMISSION_SCAN_ADD_FROM_PDF = 101;
|
||||||
|
private static final int PERMISSION_SCAN_ADD_FROM_PKPASS = 102;
|
||||||
|
|
||||||
private CaptureManager capture;
|
private CaptureManager capture;
|
||||||
private DecoratedBarcodeView barcodeScannerView;
|
private DecoratedBarcodeView barcodeScannerView;
|
||||||
@@ -79,6 +80,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
// can't use the pre-made contract because that launches the file manager for image type instead of gallery
|
// can't use the pre-made contract because that launches the file manager for image type instead of gallery
|
||||||
private ActivityResultLauncher<Intent> photoPickerLauncher;
|
private ActivityResultLauncher<Intent> photoPickerLauncher;
|
||||||
private ActivityResultLauncher<Intent> pdfPickerLauncher;
|
private ActivityResultLauncher<Intent> pdfPickerLauncher;
|
||||||
|
private ActivityResultLauncher<Intent> pkpassPickerLauncher;
|
||||||
|
|
||||||
static final String STATE_SCANNER_ACTIVE = "scannerActive";
|
static final String STATE_SCANNER_ACTIVE = "scannerActive";
|
||||||
private boolean mScannerActive = true;
|
private boolean mScannerActive = true;
|
||||||
@@ -107,6 +109,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
manualAddLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.SELECT_BARCODE_REQUEST, result.getResultCode(), result.getData()));
|
manualAddLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.SELECT_BARCODE_REQUEST, result.getResultCode(), result.getData()));
|
||||||
photoPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_IMAGE_FILE, result.getResultCode(), result.getData()));
|
photoPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_IMAGE_FILE, result.getResultCode(), result.getData()));
|
||||||
pdfPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_PDF_FILE, result.getResultCode(), result.getData()));
|
pdfPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_PDF_FILE, result.getResultCode(), result.getData()));
|
||||||
|
pkpassPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_PKPASS_FILE, result.getResultCode(), result.getData()));
|
||||||
customBarcodeScannerBinding.fabOtherOptions.setOnClickListener(view -> {
|
customBarcodeScannerBinding.fabOtherOptions.setOnClickListener(view -> {
|
||||||
setScannerActive(false);
|
setScannerActive(false);
|
||||||
|
|
||||||
@@ -116,12 +119,14 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
getString(R.string.addManually),
|
getString(R.string.addManually),
|
||||||
getString(R.string.addFromImage),
|
getString(R.string.addFromImage),
|
||||||
getString(R.string.addFromPdfFile),
|
getString(R.string.addFromPdfFile),
|
||||||
|
getString(R.string.addFromPkpass)
|
||||||
};
|
};
|
||||||
Object[] icons = new Object[]{
|
Object[] icons = new Object[]{
|
||||||
R.drawable.baseline_block_24,
|
R.drawable.baseline_block_24,
|
||||||
R.drawable.ic_edit,
|
R.drawable.ic_edit,
|
||||||
R.drawable.baseline_image_24,
|
R.drawable.baseline_image_24,
|
||||||
R.drawable.baseline_picture_as_pdf_24,
|
R.drawable.baseline_picture_as_pdf_24,
|
||||||
|
R.drawable.local_activity_24px
|
||||||
};
|
};
|
||||||
String[] columns = new String[]{"text", "icon"};
|
String[] columns = new String[]{"text", "icon"};
|
||||||
|
|
||||||
@@ -156,7 +161,10 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
addFromImage();
|
addFromImage();
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
addFromPdfFile();
|
addFromPdf();
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
addFromPkPass();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Unknown 'Add a card in a different way' dialog option");
|
throw new IllegalArgumentException("Unknown 'Add a card in a different way' dialog option");
|
||||||
@@ -181,16 +189,11 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
barcodeScannerView.decodeSingle(new BarcodeCallback() {
|
barcodeScannerView.decodeSingle(new BarcodeCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void barcodeResult(BarcodeResult result) {
|
public void barcodeResult(BarcodeResult result) {
|
||||||
Intent scanResult = new Intent();
|
LoyaltyCard loyaltyCard = new LoyaltyCard();
|
||||||
Bundle scanResultBundle = new Bundle();
|
loyaltyCard.setCardId(result.getText());
|
||||||
scanResultBundle.putString(BARCODE_CONTENTS, result.getText());
|
loyaltyCard.setBarcodeType(CatimaBarcode.fromBarcode(result.getBarcodeFormat()));
|
||||||
scanResultBundle.putString(BARCODE_FORMAT, result.getBarcodeFormat().name());
|
|
||||||
if (addGroup != null) {
|
returnResult(new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard));
|
||||||
scanResultBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup);
|
|
||||||
}
|
|
||||||
scanResult.putExtras(scanResultBundle);
|
|
||||||
ScanActivity.this.setResult(RESULT_OK, scanResult);
|
|
||||||
finish();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -294,35 +297,31 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
mScannerActive = isActive;
|
mScannerActive = isActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void returnResult(String barcodeContents, String barcodeFormat) {
|
private void returnResult(ParseResult parseResult) {
|
||||||
Intent manualResult = new Intent();
|
Intent result = new Intent();
|
||||||
Bundle manualResultBundle = new Bundle();
|
Bundle bundle = parseResult.toLoyaltyCardBundle(ScanActivity.this);
|
||||||
manualResultBundle.putString(BARCODE_CONTENTS, barcodeContents);
|
|
||||||
manualResultBundle.putString(BARCODE_FORMAT, barcodeFormat);
|
|
||||||
if (addGroup != null) {
|
if (addGroup != null) {
|
||||||
manualResultBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup);
|
bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup);
|
||||||
}
|
}
|
||||||
manualResult.putExtras(manualResultBundle);
|
result.putExtras(bundle);
|
||||||
ScanActivity.this.setResult(RESULT_OK, manualResult);
|
ScanActivity.this.setResult(RESULT_OK, result);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleActivityResult(int requestCode, int resultCode, Intent intent) {
|
private void handleActivityResult(int requestCode, int resultCode, Intent intent) {
|
||||||
super.onActivityResult(requestCode, resultCode, intent);
|
super.onActivityResult(requestCode, resultCode, intent);
|
||||||
|
|
||||||
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
|
List<ParseResult> parseResultList = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
|
||||||
|
|
||||||
if (barcodeValuesList.isEmpty()) {
|
if (parseResultList.isEmpty()) {
|
||||||
setScannerActive(true);
|
setScannerActive(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils.makeUserChooseBarcodeFromList(this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
|
Utils.makeUserChooseParseResultFromList(this, parseResultList, new ParseResultListDisambiguatorCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
|
public void onUserChoseParseResult(ParseResult parseResult) {
|
||||||
CatimaBarcode barcodeType = barcodeValues.format();
|
returnResult(parseResult);
|
||||||
|
|
||||||
returnResult(barcodeValues.content(), barcodeType != null ? barcodeType.name() : null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -369,7 +368,9 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
|
builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
|
||||||
returnResult(input.getText().toString(), null);
|
LoyaltyCard loyaltyCard = new LoyaltyCard();
|
||||||
|
loyaltyCard.setCardId(input.getText().toString());
|
||||||
|
returnResult(new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard));
|
||||||
});
|
});
|
||||||
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
|
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
|
||||||
AlertDialog dialog = builder.create();
|
AlertDialog dialog = builder.create();
|
||||||
@@ -418,10 +419,14 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_IMAGE);
|
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_IMAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addFromPdfFile() {
|
public void addFromPdf() {
|
||||||
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_PDF);
|
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_PDF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addFromPkPass() {
|
||||||
|
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_PKPASS);
|
||||||
|
}
|
||||||
|
|
||||||
private void addFromImageOrFileAfterPermission(String mimeType, ActivityResultLauncher<Intent> launcher, int chooserText, int errorMessage) {
|
private void addFromImageOrFileAfterPermission(String mimeType, ActivityResultLauncher<Intent> launcher, int chooserText, int errorMessage) {
|
||||||
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
|
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
|
||||||
photoPickerIntent.setType(mimeType);
|
photoPickerIntent.setType(mimeType);
|
||||||
@@ -511,12 +516,14 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
|||||||
} else {
|
} else {
|
||||||
showCameraPermissionMissingText();
|
showCameraPermissionMissingText();
|
||||||
}
|
}
|
||||||
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE || requestCode == PERMISSION_SCAN_ADD_FROM_PDF) {
|
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE || requestCode == PERMISSION_SCAN_ADD_FROM_PDF || requestCode == PERMISSION_SCAN_ADD_FROM_PKPASS) {
|
||||||
if (granted) {
|
if (granted) {
|
||||||
if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
|
if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
|
||||||
addFromImageOrFileAfterPermission("image/*", photoPickerLauncher, R.string.addFromImage, R.string.failedLaunchingPhotoPicker);
|
addFromImageOrFileAfterPermission("image/*", photoPickerLauncher, R.string.addFromImage, R.string.failedLaunchingPhotoPicker);
|
||||||
} else {
|
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_PDF) {
|
||||||
addFromImageOrFileAfterPermission("application/pdf", pdfPickerLauncher, R.string.addFromPdfFile, R.string.failedLaunchingFileManager);
|
addFromImageOrFileAfterPermission("application/pdf", pdfPickerLauncher, R.string.addFromPdfFile, R.string.failedLaunchingFileManager);
|
||||||
|
} else {
|
||||||
|
addFromImageOrFileAfterPermission("application/*", pkpassPickerLauncher, R.string.addFromPkpass, R.string.failedLaunchingFileManager);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
setScannerActive(true);
|
setScannerActive(true);
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ class ShortcutHelper {
|
|||||||
private static final int ADAPTIVE_BITMAP_SIZE = 108 * ADAPTIVE_BITMAP_SCALE;
|
private static final int ADAPTIVE_BITMAP_SIZE = 108 * ADAPTIVE_BITMAP_SCALE;
|
||||||
private static final int ADAPTIVE_BITMAP_VISIBLE_SIZE = 72 * ADAPTIVE_BITMAP_SCALE;
|
private static final int ADAPTIVE_BITMAP_VISIBLE_SIZE = 72 * ADAPTIVE_BITMAP_SCALE;
|
||||||
private static final int ADAPTIVE_BITMAP_IMAGE_SIZE = ADAPTIVE_BITMAP_VISIBLE_SIZE + 5 * ADAPTIVE_BITMAP_SCALE;
|
private static final int ADAPTIVE_BITMAP_IMAGE_SIZE = ADAPTIVE_BITMAP_VISIBLE_SIZE + 5 * ADAPTIVE_BITMAP_SCALE;
|
||||||
private static final int PADDING_COLOR_OVERLAY = Color.argb(127, 0, 0, 0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a card to the app shortcuts, and maintain a list of the most
|
* Add a card to the app shortcuts, and maintain a list of the most
|
||||||
@@ -87,7 +86,7 @@ class ShortcutHelper {
|
|||||||
for (int index = 0; index < list.size(); index++) {
|
for (int index = 0; index < list.size(); index++) {
|
||||||
ShortcutInfoCompat prevShortcut = list.get(index);
|
ShortcutInfoCompat prevShortcut = list.get(index);
|
||||||
|
|
||||||
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(database, Integer.parseInt(prevShortcut.getId()));
|
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(context, database, Integer.parseInt(prevShortcut.getId()));
|
||||||
|
|
||||||
// skip outdated cards that no longer exist
|
// skip outdated cards that no longer exist
|
||||||
if (loyaltyCard != null) {
|
if (loyaltyCard != null) {
|
||||||
@@ -120,7 +119,7 @@ class ShortcutHelper {
|
|||||||
Bitmap createAdaptiveBitmap(@NotNull Bitmap in, int paddingColor) {
|
Bitmap createAdaptiveBitmap(@NotNull Bitmap in, int paddingColor) {
|
||||||
Bitmap ret = Bitmap.createBitmap(ADAPTIVE_BITMAP_SIZE, ADAPTIVE_BITMAP_SIZE, Bitmap.Config.ARGB_8888);
|
Bitmap ret = Bitmap.createBitmap(ADAPTIVE_BITMAP_SIZE, ADAPTIVE_BITMAP_SIZE, Bitmap.Config.ARGB_8888);
|
||||||
Canvas output = new Canvas(ret);
|
Canvas output = new Canvas(ret);
|
||||||
output.drawColor(ColorUtils.compositeColors(PADDING_COLOR_OVERLAY, paddingColor));
|
output.drawColor(paddingColor);
|
||||||
Bitmap resized = Utils.resizeBitmap(in, ADAPTIVE_BITMAP_IMAGE_SIZE);
|
Bitmap resized = Utils.resizeBitmap(in, ADAPTIVE_BITMAP_IMAGE_SIZE);
|
||||||
output.drawBitmap(resized, (ADAPTIVE_BITMAP_SIZE - resized.getWidth()) / 2f, (ADAPTIVE_BITMAP_SIZE - resized.getHeight()) / 2f, null);
|
output.drawBitmap(resized, (ADAPTIVE_BITMAP_SIZE - resized.getWidth()) / 2f, (ADAPTIVE_BITMAP_SIZE - resized.getHeight()) / 2f, null);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -136,11 +135,11 @@ class ShortcutHelper {
|
|||||||
bundle.putInt(LoyaltyCardViewActivity.BUNDLE_ID, loyaltyCard.id);
|
bundle.putInt(LoyaltyCardViewActivity.BUNDLE_ID, loyaltyCard.id);
|
||||||
intent.putExtras(bundle);
|
intent.putExtras(bundle);
|
||||||
|
|
||||||
Bitmap iconBitmap = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon);
|
Bitmap iconBitmap = loyaltyCard.getImageThumbnail(context);
|
||||||
if (iconBitmap == null) {
|
if (iconBitmap == null) {
|
||||||
iconBitmap = Utils.generateIcon(context, loyaltyCard, true).getLetterTile();
|
iconBitmap = Utils.generateIcon(context, loyaltyCard, true).getLetterTile();
|
||||||
} else {
|
} else {
|
||||||
iconBitmap = createAdaptiveBitmap(iconBitmap, Utils.getHeaderColor(context, loyaltyCard));
|
iconBitmap = createAdaptiveBitmap(iconBitmap, Utils.needsDarkForeground(Utils.getHeaderColor(context, loyaltyCard)) ? Color.BLACK : Color.WHITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
IconCompat icon = IconCompat.createWithAdaptiveBitmap(iconBitmap);
|
IconCompat icon = IconCompat.createWithAdaptiveBitmap(iconBitmap);
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import android.content.res.Resources;
|
|||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.ImageDecoder;
|
import android.graphics.ImageDecoder;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
@@ -78,6 +79,7 @@ import java.util.Collections;
|
|||||||
import java.util.Currency;
|
import java.util.Currency;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -95,12 +97,13 @@ public class Utils {
|
|||||||
public static final int BARCODE_SCAN = 3;
|
public static final int BARCODE_SCAN = 3;
|
||||||
public static final int BARCODE_IMPORT_FROM_IMAGE_FILE = 4;
|
public static final int BARCODE_IMPORT_FROM_IMAGE_FILE = 4;
|
||||||
public static final int BARCODE_IMPORT_FROM_PDF_FILE = 5;
|
public static final int BARCODE_IMPORT_FROM_PDF_FILE = 5;
|
||||||
public static final int CARD_IMAGE_FROM_CAMERA_FRONT = 6;
|
public static final int BARCODE_IMPORT_FROM_PKPASS_FILE = 6;
|
||||||
public static final int CARD_IMAGE_FROM_CAMERA_BACK = 7;
|
public static final int CARD_IMAGE_FROM_CAMERA_FRONT = 7;
|
||||||
public static final int CARD_IMAGE_FROM_CAMERA_ICON = 8;
|
public static final int CARD_IMAGE_FROM_CAMERA_BACK = 8;
|
||||||
public static final int CARD_IMAGE_FROM_FILE_FRONT = 9;
|
public static final int CARD_IMAGE_FROM_CAMERA_ICON = 9;
|
||||||
public static final int CARD_IMAGE_FROM_FILE_BACK = 10;
|
public static final int CARD_IMAGE_FROM_FILE_FRONT = 10;
|
||||||
public static final int CARD_IMAGE_FROM_FILE_ICON = 11;
|
public static final int CARD_IMAGE_FROM_FILE_BACK = 11;
|
||||||
|
public static final int CARD_IMAGE_FROM_FILE_ICON = 12;
|
||||||
|
|
||||||
public static final String CARD_IMAGE_FILENAME_REGEX = "^(card_)(\\d+)(_(?:front|back|icon)\\.png)$";
|
public static final String CARD_IMAGE_FILENAME_REGEX = "^(card_)(\\d+)(_(?:front|back|icon)\\.png)$";
|
||||||
|
|
||||||
@@ -143,7 +146,7 @@ public class Utils {
|
|||||||
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
|
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public List<BarcodeValues> retrieveBarcodesFromImage(Context context, Uri uri) {
|
static public List<ParseResult> retrieveBarcodesFromImage(Context context, Uri uri) {
|
||||||
Log.i(TAG, "Received image file with possible barcode");
|
Log.i(TAG, "Received image file with possible barcode");
|
||||||
|
|
||||||
if (uri == null) {
|
if (uri == null) {
|
||||||
@@ -162,7 +165,7 @@ public class Utils {
|
|||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<BarcodeValues> barcodesFromBitmap = getBarcodesFromBitmap(bitmap);
|
List<ParseResult> barcodesFromBitmap = getBarcodesFromBitmap(bitmap);
|
||||||
|
|
||||||
if (barcodesFromBitmap.isEmpty()) {
|
if (barcodesFromBitmap.isEmpty()) {
|
||||||
Log.i(TAG, "No barcode found in image file");
|
Log.i(TAG, "No barcode found in image file");
|
||||||
@@ -172,7 +175,39 @@ public class Utils {
|
|||||||
return barcodesFromBitmap;
|
return barcodesFromBitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public List<BarcodeValues> retrieveBarcodesFromPdf(Context context, Uri uri) {
|
static public List<ParseResult> retrieveBarcodesFromPkPass(Context context, Uri uri) {
|
||||||
|
Log.i(TAG, "Received Pkpass file with possible barcode");
|
||||||
|
if (uri == null) {
|
||||||
|
Log.e(TAG, "Pkpass did not contain any data");
|
||||||
|
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
PkpassParser pkpassParser;
|
||||||
|
try {
|
||||||
|
pkpassParser = new PkpassParser(context, uri);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "Error reading pkpass file", e);
|
||||||
|
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> locales = pkpassParser.listLocales();
|
||||||
|
if (locales.isEmpty()) {
|
||||||
|
return Collections.singletonList(new ParseResult(ParseResultType.FULL, pkpassParser.toLoyaltyCard(null)));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ParseResult> parseResultList = new ArrayList<>();
|
||||||
|
for (String locale : locales) {
|
||||||
|
ParseResult parseResult = new ParseResult(ParseResultType.FULL, pkpassParser.toLoyaltyCard(locale));
|
||||||
|
parseResult.setNote(locale);
|
||||||
|
parseResultList.add(parseResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
return parseResultList;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public List<ParseResult> retrieveBarcodesFromPdf(Context context, Uri uri) {
|
||||||
Log.i(TAG, "Received PDF file with possible barcode");
|
Log.i(TAG, "Received PDF file with possible barcode");
|
||||||
if (uri == null) {
|
if (uri == null) {
|
||||||
Log.e(TAG, "Uri did not contain any data");
|
Log.e(TAG, "Uri did not contain any data");
|
||||||
@@ -182,7 +217,7 @@ public class Utils {
|
|||||||
|
|
||||||
ParcelFileDescriptor parcelFileDescriptor = null;
|
ParcelFileDescriptor parcelFileDescriptor = null;
|
||||||
PdfRenderer renderer = null;
|
PdfRenderer renderer = null;
|
||||||
List<BarcodeValues> barcodesFromPdfPages = new ArrayList<>();
|
List<ParseResult> barcodesFromPdfPages = new ArrayList<>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
|
parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
|
||||||
@@ -194,13 +229,20 @@ public class Utils {
|
|||||||
for (int i = 0; i < renderer.getPageCount(); i++) {
|
for (int i = 0; i < renderer.getPageCount(); i++) {
|
||||||
PdfRenderer.Page page = renderer.openPage(i);
|
PdfRenderer.Page page = renderer.openPage(i);
|
||||||
renderedPage = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888);
|
renderedPage = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888);
|
||||||
|
|
||||||
|
// Ensure the page has a background
|
||||||
|
// Fixes some transparent PDF files not being read well
|
||||||
|
Canvas canvas = new Canvas(renderedPage);
|
||||||
|
canvas.drawColor(Color.WHITE);
|
||||||
|
canvas.drawBitmap(renderedPage, 0, 0, null);
|
||||||
|
|
||||||
page.render(renderedPage, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
|
page.render(renderedPage, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
|
||||||
page.close();
|
page.close();
|
||||||
|
|
||||||
List<BarcodeValues> barcodesFromPage = getBarcodesFromBitmap(renderedPage);
|
List<ParseResult> barcodesFromPage = getBarcodesFromBitmap(renderedPage);
|
||||||
for (BarcodeValues barcodeValues : barcodesFromPage) {
|
for (ParseResult parseResult : barcodesFromPage) {
|
||||||
barcodeValues.setNote(String.format(context.getString(R.string.pageWithNumber), i+1));
|
parseResult.setNote(String.format(context.getString(R.string.pageWithNumber), i+1));
|
||||||
barcodesFromPdfPages.add(barcodeValues);
|
barcodesFromPdfPages.add(parseResult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -229,17 +271,17 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Barcode format and content based on the result of an activity.
|
* Returns the ParseResult based on the result of an activity.
|
||||||
* It shows toasts to notify the end-user as needed itself and will return an empty
|
* It shows toasts to notify the end-user as needed itself and will return an empty list if the
|
||||||
* BarcodeValues object if the activity was cancelled or nothing could be found.
|
* activity was cancelled or nothing could be found.
|
||||||
*
|
*
|
||||||
* @param requestCode
|
* @param requestCode
|
||||||
* @param resultCode
|
* @param resultCode
|
||||||
* @param intent
|
* @param intent
|
||||||
* @param context
|
* @param context
|
||||||
* @return BarcodeValues
|
* @return List<ParseResult>
|
||||||
*/
|
*/
|
||||||
static public List<BarcodeValues> parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) {
|
static public List<ParseResult> parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) {
|
||||||
String contents;
|
String contents;
|
||||||
String format;
|
String format;
|
||||||
|
|
||||||
@@ -255,6 +297,10 @@ public class Utils {
|
|||||||
return retrieveBarcodesFromPdf(context, intent.getData());
|
return retrieveBarcodesFromPdf(context, intent.getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (requestCode == Utils.BARCODE_IMPORT_FROM_PKPASS_FILE) {
|
||||||
|
return retrieveBarcodesFromPkPass(context, intent.getData());
|
||||||
|
}
|
||||||
|
|
||||||
if (requestCode == Utils.BARCODE_SCAN || requestCode == Utils.SELECT_BARCODE_REQUEST) {
|
if (requestCode == Utils.BARCODE_SCAN || requestCode == Utils.SELECT_BARCODE_REQUEST) {
|
||||||
if (requestCode == Utils.BARCODE_SCAN) {
|
if (requestCode == Utils.BARCODE_SCAN) {
|
||||||
Log.i(TAG, "Received barcode information from camera");
|
Log.i(TAG, "Received barcode information from camera");
|
||||||
@@ -268,7 +314,15 @@ public class Utils {
|
|||||||
Log.i(TAG, "Read barcode id: " + contents);
|
Log.i(TAG, "Read barcode id: " + contents);
|
||||||
Log.i(TAG, "Read format: " + format);
|
Log.i(TAG, "Read format: " + format);
|
||||||
|
|
||||||
return Collections.singletonList(new BarcodeValues(format != null ? CatimaBarcode.fromName(format) : null, contents));
|
LoyaltyCard loyaltyCard = new LoyaltyCard();
|
||||||
|
if (format != null) {
|
||||||
|
loyaltyCard.setBarcodeType(CatimaBarcode.fromName(format));
|
||||||
|
}
|
||||||
|
if (contents != null) {
|
||||||
|
loyaltyCard.setCardId(contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.singletonList(new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard));
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new UnsupportedOperationException("Unknown request code for parseSetBarcodeActivityResult");
|
throw new UnsupportedOperationException("Unknown request code for parseSetBarcodeActivityResult");
|
||||||
@@ -288,7 +342,7 @@ public class Utils {
|
|||||||
return MediaStore.Images.Media.getBitmap(context.getContentResolver(), data);
|
return MediaStore.Images.Media.getBitmap(context.getContentResolver(), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public List<BarcodeValues> getBarcodesFromBitmap(Bitmap bitmap) {
|
static public List<ParseResult> getBarcodesFromBitmap(Bitmap bitmap) {
|
||||||
// This function is vulnerable to OOM, so we try again with a smaller bitmap is we get OOM
|
// This function is vulnerable to OOM, so we try again with a smaller bitmap is we get OOM
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
try {
|
try {
|
||||||
@@ -303,7 +357,7 @@ public class Utils {
|
|||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
static private List<BarcodeValues> getBarcodesFromBitmapReal(Bitmap bitmap) {
|
static private List<ParseResult> getBarcodesFromBitmapReal(Bitmap bitmap) {
|
||||||
// In order to decode it, the Bitmap must first be converted into a pixel array...
|
// In order to decode it, the Bitmap must first be converted into a pixel array...
|
||||||
int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
|
int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
|
||||||
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
|
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
|
||||||
@@ -312,7 +366,7 @@ public class Utils {
|
|||||||
LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
|
LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
|
||||||
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
|
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
|
||||||
|
|
||||||
List<BarcodeValues> barcodeValuesList = new ArrayList<>();
|
List<ParseResult> parseResultList = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
MultiFormatReader multiFormatReader = new MultiFormatReader();
|
MultiFormatReader multiFormatReader = new MultiFormatReader();
|
||||||
MultipleBarcodeReader multipleBarcodeReader = new GenericMultipleBarcodeReader(multiFormatReader);
|
MultipleBarcodeReader multipleBarcodeReader = new GenericMultipleBarcodeReader(multiFormatReader);
|
||||||
@@ -323,37 +377,42 @@ public class Utils {
|
|||||||
Log.i(TAG, "Read barcode id: " + barcodeResult.getText());
|
Log.i(TAG, "Read barcode id: " + barcodeResult.getText());
|
||||||
Log.i(TAG, "Read format: " + barcodeResult.getBarcodeFormat().name());
|
Log.i(TAG, "Read format: " + barcodeResult.getBarcodeFormat().name());
|
||||||
|
|
||||||
barcodeValuesList.add(new BarcodeValues(CatimaBarcode.fromBarcode(barcodeResult.getBarcodeFormat()), barcodeResult.getText()));
|
LoyaltyCard loyaltyCard = new LoyaltyCard();
|
||||||
|
loyaltyCard.setCardId(barcodeResult.getText());
|
||||||
|
loyaltyCard.setBarcodeType(CatimaBarcode.fromBarcode(barcodeResult.getBarcodeFormat()));
|
||||||
|
parseResultList.add(new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard));
|
||||||
}
|
}
|
||||||
|
|
||||||
return barcodeValuesList;
|
return parseResultList;
|
||||||
} catch (NotFoundException e) {
|
} catch (NotFoundException e) {
|
||||||
return barcodeValuesList;
|
return parseResultList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static public void makeUserChooseBarcodeFromList(Context context, List<BarcodeValues> barcodeValuesList, BarcodeValuesListDisambiguatorCallback callback) {
|
static public void makeUserChooseParseResultFromList(Context context, List<ParseResult> parseResultList, ParseResultListDisambiguatorCallback callback) {
|
||||||
// If there is only one choice, consider it chosen
|
// If there is only one choice, consider it chosen
|
||||||
if (barcodeValuesList.size() == 1) {
|
if (parseResultList.size() == 1) {
|
||||||
callback.onUserChoseBarcode(barcodeValuesList.get(0));
|
callback.onUserChoseParseResult(parseResultList.get(0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ask user to choose a barcode
|
// Ask user to choose a barcode
|
||||||
// TODO: This should contain an image of the barcode in question to help users understand the choice they're making
|
// TODO: This should contain an image of the barcode in question to help users understand the choice they're making
|
||||||
CharSequence[] barcodeDescriptions = new CharSequence[barcodeValuesList.size()];
|
CharSequence[] barcodeDescriptions = new CharSequence[parseResultList.size()];
|
||||||
for (int i = 0; i < barcodeValuesList.size(); i++) {
|
for (int i = 0; i < parseResultList.size(); i++) {
|
||||||
BarcodeValues barcodeValues = barcodeValuesList.get(i);
|
ParseResult parseResult = parseResultList.get(i);
|
||||||
CatimaBarcode catimaBarcode = barcodeValues.format();
|
CatimaBarcode catimaBarcode = parseResult.getLoyaltyCard().barcodeType;
|
||||||
|
|
||||||
String barcodeContent = barcodeValues.content();
|
String barcodeContent = parseResult.getLoyaltyCard().cardId;
|
||||||
// Shorten overly long barcodes
|
// Shorten overly long barcodes
|
||||||
if (barcodeContent.length() > 22) {
|
if (barcodeContent.length() > 22) {
|
||||||
barcodeContent = barcodeContent.substring(0, 20) + "…";
|
barcodeContent = barcodeContent.substring(0, 20) + "…";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barcodeValues.note() != null) {
|
String parseResultNote = parseResult.getNote();
|
||||||
barcodeDescriptions[i] = String.format("%s: %s (%s)", barcodeValues.note(), catimaBarcode != null ? catimaBarcode.prettyName() : context.getString(R.string.noBarcode), barcodeContent);
|
|
||||||
|
if (parseResultNote != null) {
|
||||||
|
barcodeDescriptions[i] = String.format("%s: %s (%s)", parseResultNote, catimaBarcode != null ? catimaBarcode.prettyName() : context.getString(R.string.noBarcode), barcodeContent);
|
||||||
} else {
|
} else {
|
||||||
barcodeDescriptions[i] = String.format("%s (%s)", catimaBarcode != null ? catimaBarcode.prettyName() : context.getString(R.string.noBarcode), barcodeContent);
|
barcodeDescriptions[i] = String.format("%s (%s)", catimaBarcode != null ? catimaBarcode.prettyName() : context.getString(R.string.noBarcode), barcodeContent);
|
||||||
}
|
}
|
||||||
@@ -363,7 +422,7 @@ public class Utils {
|
|||||||
builder.setTitle(context.getString(R.string.multipleBarcodesFoundPleaseChooseOne));
|
builder.setTitle(context.getString(R.string.multipleBarcodesFoundPleaseChooseOne));
|
||||||
builder.setItems(
|
builder.setItems(
|
||||||
barcodeDescriptions,
|
barcodeDescriptions,
|
||||||
(dialogInterface, i) -> callback.onUserChoseBarcode(barcodeValuesList.get(i))
|
(dialogInterface, i) -> callback.onUserChoseParseResult(parseResultList.get(i))
|
||||||
);
|
);
|
||||||
builder.setOnCancelListener(dialogInterface -> callback.onUserDismissedSelector());
|
builder.setOnCancelListener(dialogInterface -> callback.onUserDismissedSelector());
|
||||||
builder.show();
|
builder.show();
|
||||||
@@ -783,7 +842,7 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap loadImage(String path) {
|
public static @Nullable Bitmap loadImage(String path) {
|
||||||
try {
|
try {
|
||||||
return BitmapFactory.decodeStream(new FileInputStream(path));
|
return BitmapFactory.decodeStream(new FileInputStream(path));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -792,7 +851,7 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap loadTempImage(Context context, String name) {
|
public static @Nullable Bitmap loadTempImage(Context context, String name) {
|
||||||
return loadImage(context.getCacheDir() + "/" + name);
|
return loadImage(context.getCacheDir() + "/" + name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -869,7 +928,7 @@ public class Utils {
|
|||||||
return typedValue.data;
|
return typedValue.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getHeaderColorFromImage(Bitmap image, int fallback) {
|
public static int getHeaderColorFromImage(@Nullable Bitmap image, int fallback) {
|
||||||
if (image == null) {
|
if (image == null) {
|
||||||
return fallback;
|
return fallback;
|
||||||
}
|
}
|
||||||
@@ -934,27 +993,34 @@ public class Utils {
|
|||||||
* @param textWhenNoImage TextView to write the loyalty card name into if icon is null
|
* @param textWhenNoImage TextView to write the loyalty card name into if icon is null
|
||||||
* @return background colour
|
* @return background colour
|
||||||
*/
|
*/
|
||||||
public static int setIconOrTextWithBackground(Context context, LoyaltyCard loyaltyCard, Bitmap icon, ImageView backgroundOrIcon, TextView textWhenNoImage) {
|
public static int setIconOrTextWithBackground(Context context, LoyaltyCard loyaltyCard, Bitmap icon, ImageView backgroundOrIcon, TextView textWhenNoImage, int columnCount) {
|
||||||
int headerColor = getHeaderColor(context, loyaltyCard);
|
int headerColor = getHeaderColor(context, loyaltyCard);
|
||||||
backgroundOrIcon.setImageBitmap(icon);
|
backgroundOrIcon.setImageBitmap(icon);
|
||||||
backgroundOrIcon.setBackgroundColor(headerColor);
|
|
||||||
|
|
||||||
if (icon != null) {
|
if (icon != null) {
|
||||||
|
// Use header colour to decide if this image will need a white or black background
|
||||||
|
backgroundOrIcon.setBackgroundColor(needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||||
|
|
||||||
textWhenNoImage.setVisibility(View.GONE);
|
textWhenNoImage.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
|
// Use header colour as background colour
|
||||||
|
backgroundOrIcon.setBackgroundColor(headerColor);
|
||||||
|
|
||||||
// Manually calculate how many lines will be needed
|
// Manually calculate how many lines will be needed
|
||||||
// This is necessary because Android's auto sizing will split over lines way before reaching the minimum font size and store names split over multiple lines are harder to scan with a quick glance so we should try to prevent it
|
// This is necessary because Android's auto sizing will split over lines way before reaching the minimum font size and store names split over multiple lines are harder to scan with a quick glance so we should try to prevent it
|
||||||
// Because we have to write the text before we can actually know the exact laid out size (trying to delay this causes bugs where the autosize fails) we have to take some... weird shortcuts
|
// Because we have to write the text before we can actually know the exact laid out size (trying to delay this causes bugs where the autosize fails) we have to take some... weird shortcuts
|
||||||
|
|
||||||
// At this point textWhenNoImage.getWidth() still returns 0, so we cheat by calculating the whole width of the screen and then dividing it by the amount of columns
|
// At this point textWhenNoImage.getWidth() still returns 0, so we cheat by calculating the whole width of the screen and then dividing it by the amount of columns
|
||||||
int textviewWidth = Resources.getSystem().getDisplayMetrics().widthPixels / context.getResources().getInteger(R.integer.main_view_card_columns);
|
int columnWidth = Resources.getSystem().getDisplayMetrics().widthPixels / columnCount;
|
||||||
|
|
||||||
// Calculate how wide a character is and calculate how many characters fit in a line
|
// Calculate how wide a character is and calculate how many characters fit in a line
|
||||||
|
// text size is generally based on height, so setting 1:1 as width may be fishy
|
||||||
int characterWidth = TextViewCompat.getAutoSizeMinTextSize(textWhenNoImage);
|
int characterWidth = TextViewCompat.getAutoSizeMinTextSize(textWhenNoImage);
|
||||||
int maxWidthPerLine = textviewWidth - textWhenNoImage.getPaddingStart() - textWhenNoImage.getPaddingEnd();
|
int maxWidthPerLine = columnWidth - textWhenNoImage.getPaddingStart() - textWhenNoImage.getPaddingEnd();
|
||||||
|
|
||||||
// Set amount of lines based on what could fit at most
|
// Set number of lines based on what could fit at most
|
||||||
int maxLines = ((loyaltyCard.store.length() * characterWidth) / maxWidthPerLine) + 1;
|
int fullTextWidth = loyaltyCard.store.length() * characterWidth;
|
||||||
|
int maxLines = (fullTextWidth / maxWidthPerLine) + 1;
|
||||||
textWhenNoImage.setMaxLines(maxLines);
|
textWhenNoImage.setMaxLines(maxLines);
|
||||||
|
|
||||||
// Actually set the text and colour
|
// Actually set the text and colour
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class ZipUtils {
|
|||||||
return new JSONObject(read(zipInputStream));
|
return new JSONObject(read(zipInputStream));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String read(ZipInputStream zipInputStream) throws IOException {
|
public static String read(ZipInputStream zipInputStream) throws IOException {
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
Reader reader = new BufferedReader(new InputStreamReader(zipInputStream, StandardCharsets.UTF_8));
|
Reader reader = new BufferedReader(new InputStreamReader(zipInputStream, StandardCharsets.UTF_8));
|
||||||
int c;
|
int c;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public class CatimaExporter implements Exporter {
|
|||||||
// Generate CSV
|
// Generate CSV
|
||||||
ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream();
|
ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream();
|
||||||
OutputStreamWriter catimaOutputStreamWriter = new OutputStreamWriter(catimaOutputStream, StandardCharsets.UTF_8);
|
OutputStreamWriter catimaOutputStreamWriter = new OutputStreamWriter(catimaOutputStream, StandardCharsets.UTF_8);
|
||||||
writeCSV(database, catimaOutputStreamWriter);
|
writeCSV(context, database, catimaOutputStreamWriter);
|
||||||
|
|
||||||
// Add CSV to zip file
|
// Add CSV to zip file
|
||||||
ZipParameters csvZipParameters = createZipParameters("catima.csv", password);
|
ZipParameters csvZipParameters = createZipParameters("catima.csv", password);
|
||||||
@@ -64,12 +64,12 @@ public class CatimaExporter implements Exporter {
|
|||||||
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
|
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
|
||||||
while (cardCursor.moveToNext()) {
|
while (cardCursor.moveToNext()) {
|
||||||
// For each card
|
// For each card
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor);
|
LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor);
|
||||||
|
|
||||||
// For each image
|
// For each image
|
||||||
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
|
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
|
||||||
// If it exists, add to the .zip file
|
// If it exists, add to the .zip file
|
||||||
Bitmap image = Utils.retrieveCardImage(context, card.id, imageLocationType);
|
Bitmap image = card.getImageForImageLocationType(context, imageLocationType);
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
ZipParameters imageZipParameters = createZipParameters(Utils.getCardImageFileName(card.id, imageLocationType), password);
|
ZipParameters imageZipParameters = createZipParameters(Utils.getCardImageFileName(card.id, imageLocationType), password);
|
||||||
zipOutputStream.putNextEntry(imageZipParameters);
|
zipOutputStream.putNextEntry(imageZipParameters);
|
||||||
@@ -95,7 +95,7 @@ public class CatimaExporter implements Exporter {
|
|||||||
return zipParameters;
|
return zipParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeCSV(SQLiteDatabase database, OutputStreamWriter output) throws IOException, InterruptedException {
|
private void writeCSV(Context context, SQLiteDatabase database, OutputStreamWriter output) throws IOException, InterruptedException {
|
||||||
CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180);
|
CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180);
|
||||||
|
|
||||||
// Print the version
|
// Print the version
|
||||||
@@ -142,7 +142,7 @@ public class CatimaExporter implements Exporter {
|
|||||||
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
|
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database);
|
||||||
|
|
||||||
while (cardCursor.moveToNext()) {
|
while (cardCursor.moveToNext()) {
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor);
|
LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor);
|
||||||
|
|
||||||
printer.printRecord(card.id,
|
printer.printRecord(card.id,
|
||||||
card.store,
|
card.store,
|
||||||
@@ -176,7 +176,7 @@ public class CatimaExporter implements Exporter {
|
|||||||
Cursor cardCursor2 = DBHelper.getLoyaltyCardCursor(database);
|
Cursor cardCursor2 = DBHelper.getLoyaltyCardCursor(database);
|
||||||
|
|
||||||
while (cardCursor2.moveToNext()) {
|
while (cardCursor2.moveToNext()) {
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor2);
|
LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor2);
|
||||||
|
|
||||||
for (Group group : DBHelper.getLoyaltyCardGroups(database, card.id)) {
|
for (Group group : DBHelper.getLoyaltyCardGroups(database, card.id)) {
|
||||||
printer.printRecord(card.id, group._id);
|
printer.printRecord(card.id, group._id);
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ public class CatimaImporter implements Importer {
|
|||||||
Set<String> existingImages = DBHelper.imageFiles(context, database);
|
Set<String> existingImages = DBHelper.imageFiles(context, database);
|
||||||
|
|
||||||
for (LoyaltyCard card : data.cards) {
|
for (LoyaltyCard card : data.cards) {
|
||||||
LoyaltyCard existing = DBHelper.getLoyaltyCard(database, card.id);
|
LoyaltyCard existing = DBHelper.getLoyaltyCard(context, database, card.id);
|
||||||
if (existing == null) {
|
if (existing == null) {
|
||||||
DBHelper.insertLoyaltyCard(database, card.id, card.store, card.note, card.validFrom, card.expiry, card.balance, card.balanceType,
|
DBHelper.insertLoyaltyCard(database, card.id, card.store, card.note, card.validFrom, card.expiry, card.balance, card.balanceType,
|
||||||
card.cardId, card.barcodeId, card.barcodeType, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus);
|
card.cardId, card.barcodeId, card.barcodeType, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus);
|
||||||
@@ -152,7 +152,7 @@ public class CatimaImporter implements Importer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDuplicate(Context context, final LoyaltyCard existing, final LoyaltyCard card, final Set<String> existingImages, final Map<String, String> imageChecksums) throws IOException {
|
public boolean isDuplicate(Context context, final LoyaltyCard existing, final LoyaltyCard card, final Set<String> existingImages, final Map<String, String> imageChecksums) throws IOException {
|
||||||
if (!LoyaltyCard.isDuplicate(existing, card)) {
|
if (!LoyaltyCard.isDuplicate(context, existing, card)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
|
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
|
||||||
@@ -490,7 +490,29 @@ public class CatimaImporter implements Importer {
|
|||||||
// We catch this exception so we can still import old backups
|
// We catch this exception so we can still import old backups
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LoyaltyCard(id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, DBHelper.DEFAULT_ZOOM_LEVEL, archiveStatus);
|
return new LoyaltyCard(
|
||||||
|
id,
|
||||||
|
store,
|
||||||
|
note,
|
||||||
|
validFrom,
|
||||||
|
expiry,
|
||||||
|
balance,
|
||||||
|
balanceType,
|
||||||
|
cardId,
|
||||||
|
barcodeId,
|
||||||
|
barcodeType,
|
||||||
|
headerColor,
|
||||||
|
starStatus,
|
||||||
|
lastUsed,
|
||||||
|
DBHelper.DEFAULT_ZOOM_LEVEL,
|
||||||
|
archiveStatus,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -149,7 +149,29 @@ public class FidmeImporter implements Importer {
|
|||||||
// TODO: Front and back image
|
// TODO: Front and back image
|
||||||
|
|
||||||
// use -1 for the ID, it will be ignored when inserting the card into the DB
|
// use -1 for the ID, it will be ignored when inserting the card into the DB
|
||||||
return new LoyaltyCard(-1, store, note, null, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, starStatus, Utils.getUnixTime(), DBHelper.DEFAULT_ZOOM_LEVEL, archiveStatus);
|
return new LoyaltyCard(
|
||||||
|
-1,
|
||||||
|
store,
|
||||||
|
note,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
BigDecimal.valueOf(0),
|
||||||
|
null,
|
||||||
|
cardId,
|
||||||
|
null,
|
||||||
|
barcodeType,
|
||||||
|
headerColor,
|
||||||
|
starStatus,
|
||||||
|
Utils.getUnixTime(),
|
||||||
|
DBHelper.DEFAULT_ZOOM_LEVEL,
|
||||||
|
archiveStatus,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveAndDeduplicate(SQLiteDatabase database, final ImportedData data) {
|
public void saveAndDeduplicate(SQLiteDatabase database, final ImportedData data) {
|
||||||
|
|||||||
@@ -354,7 +354,29 @@ public class StocardImporter implements Importer {
|
|||||||
|
|
||||||
long lastUsed = record.lastUsed != null ? record.lastUsed : Utils.getUnixTime();
|
long lastUsed = record.lastUsed != null ? record.lastUsed : Utils.getUnixTime();
|
||||||
|
|
||||||
LoyaltyCard card = new LoyaltyCard(tempID, store, note, null, null, BigDecimal.valueOf(0), null, record.cardId, null, barcodeType, headerColor, 0, lastUsed, DBHelper.DEFAULT_ZOOM_LEVEL, 0);
|
LoyaltyCard card = new LoyaltyCard(
|
||||||
|
tempID,
|
||||||
|
store,
|
||||||
|
note,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
BigDecimal.valueOf(0),
|
||||||
|
null,
|
||||||
|
record.cardId,
|
||||||
|
null,
|
||||||
|
barcodeType,
|
||||||
|
headerColor,
|
||||||
|
0,
|
||||||
|
lastUsed,
|
||||||
|
DBHelper.DEFAULT_ZOOM_LEVEL,
|
||||||
|
0,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
importedData.cards.add(card);
|
importedData.cards.add(card);
|
||||||
|
|
||||||
Map<ImageLocationType, Bitmap> images = new HashMap<>();
|
Map<ImageLocationType, Bitmap> images = new HashMap<>();
|
||||||
|
|||||||
@@ -151,7 +151,29 @@ public class VoucherVaultImporter implements Importer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// use -1 for the ID, it will be ignored when inserting the card into the DB
|
// use -1 for the ID, it will be ignored when inserting the card into the DB
|
||||||
importedData.cards.add(new LoyaltyCard(-1, store, "", null, expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime(), DBHelper.DEFAULT_ZOOM_LEVEL, 0));
|
importedData.cards.add(new LoyaltyCard(
|
||||||
|
-1,
|
||||||
|
store,
|
||||||
|
"",
|
||||||
|
null,
|
||||||
|
expiry,
|
||||||
|
balance,
|
||||||
|
balanceType,
|
||||||
|
cardId,
|
||||||
|
null,
|
||||||
|
barcodeType,
|
||||||
|
headerColor,
|
||||||
|
0,
|
||||||
|
Utils.getUnixTime(),
|
||||||
|
DBHelper.DEFAULT_ZOOM_LEVEL,
|
||||||
|
0,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
return importedData;
|
return importedData;
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package protect.card_locker.preferences;
|
package protect.card_locker.preferences;
|
||||||
|
|
||||||
|
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.IntegerRes;
|
import androidx.annotation.IntegerRes;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StringRes;
|
import androidx.annotation.StringRes;
|
||||||
import androidx.appcompat.app.AppCompatDelegate;
|
import androidx.appcompat.app.AppCompatDelegate;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
@@ -14,8 +18,9 @@ import protect.card_locker.R;
|
|||||||
import protect.card_locker.Utils;
|
import protect.card_locker.Utils;
|
||||||
|
|
||||||
public class Settings {
|
public class Settings {
|
||||||
|
private static final String TAG = "Catima";
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private SharedPreferences mSettings;
|
private final SharedPreferences mSettings;
|
||||||
|
|
||||||
public Settings(Context context) {
|
public Settings(Context context) {
|
||||||
mContext = context.getApplicationContext();
|
mContext = context.getApplicationContext();
|
||||||
@@ -42,10 +47,11 @@ public class Settings {
|
|||||||
return mSettings.getBoolean(getResString(keyId), defaultValue);
|
return mSettings.getBoolean(getResString(keyId), defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
public Locale getLocale() {
|
public Locale getLocale() {
|
||||||
String value = getString(R.string.settings_key_locale, "");
|
String value = getString(R.string.settings_key_locale, "");
|
||||||
|
|
||||||
if (value.length() == 0) {
|
if (value.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,6 +98,21 @@ public class Settings {
|
|||||||
return getString(R.string.setting_key_theme_color, mContext.getResources().getString(R.string.settings_key_system_theme));
|
return getString(R.string.setting_key_theme_color, mContext.getResources().getString(R.string.settings_key_system_theme));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getPreferredColumnCount() {
|
||||||
|
var defaultSymbol = mContext.getResources().getString(R.string.settings_key_automatic_column_count);
|
||||||
|
var defaultColumnCount = mContext.getResources().getInteger(R.integer.main_view_card_columns);
|
||||||
|
var orientation = mContext.getResources().getConfiguration().orientation;
|
||||||
|
var columnCountPrefKey = orientation == ORIENTATION_PORTRAIT ? R.string.setting_key_column_count_portrait : R.string.setting_key_column_count_landscape;
|
||||||
|
var columnCountSetting = getString(columnCountPrefKey, defaultSymbol);
|
||||||
|
try {
|
||||||
|
// the pref may be unset or explicitly set to default
|
||||||
|
return columnCountSetting.equals(defaultSymbol) ? defaultColumnCount : Integer.parseInt(columnCountSetting);
|
||||||
|
} catch (NumberFormatException nfe) {
|
||||||
|
Log.e(TAG, "Failed to parseInt the column count pref", nfe);
|
||||||
|
return defaultColumnCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean useVolumeKeysForNavigation() {
|
public boolean useVolumeKeysForNavigation() {
|
||||||
return getBoolean(R.string.settings_key_use_volume_keys_navigation, false);
|
return getBoolean(R.string.settings_key_use_volume_keys_navigation, false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package protect.card_locker.viewmodels
|
||||||
|
|
||||||
|
import android.net.Uri
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import protect.card_locker.LoyaltyCard
|
||||||
|
import protect.card_locker.LoyaltyCardField
|
||||||
|
import protect.card_locker.async.TaskHandler
|
||||||
|
|
||||||
|
class LoyaltyCardEditActivityViewModel : ViewModel() {
|
||||||
|
var initialized: Boolean = false
|
||||||
|
var hasChanged: Boolean = false
|
||||||
|
|
||||||
|
var taskHandler: TaskHandler = TaskHandler();
|
||||||
|
|
||||||
|
var addGroup: String? = null
|
||||||
|
var openSetIconMenu: Boolean = false
|
||||||
|
var loyaltyCardId: Int = 0
|
||||||
|
var updateLoyaltyCard: Boolean = false
|
||||||
|
var duplicateFromLoyaltyCardId: Boolean = false
|
||||||
|
var importLoyaltyCardUri: Uri? = null
|
||||||
|
|
||||||
|
var tabIndex: Int = 0
|
||||||
|
var requestedImageType: Int = 0
|
||||||
|
var tempLoyaltyCardField: LoyaltyCardField? = null
|
||||||
|
|
||||||
|
var loyaltyCard: LoyaltyCard = LoyaltyCard()
|
||||||
|
}
|
||||||
10
app/src/main/res/drawable/local_activity_24px.xml
Normal file
10
app/src/main/res/drawable/local_activity_24px.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M368,640L480,556L590,640L548,504L660,416L524,416L480,280L436,416L300,416L410,504L368,640ZM160,800Q127,800 103.5,776.5Q80,753 80,720L80,585Q80,574 87,566Q94,558 105,556Q129,548 144.5,527Q160,506 160,480Q160,454 144.5,433Q129,412 105,404Q94,402 87,394Q80,386 80,375L80,240Q80,207 103.5,183.5Q127,160 160,160L800,160Q833,160 856.5,183.5Q880,207 880,240L880,375Q880,386 873,394Q866,402 855,404Q831,412 815.5,433Q800,454 800,480Q800,506 815.5,527Q831,548 855,556Q866,558 873,566Q880,574 880,585L880,720Q880,753 856.5,776.5Q833,800 800,800L160,800ZM160,720L800,720Q800,720 800,720Q800,720 800,720L800,618Q763,596 741.5,559.5Q720,523 720,480Q720,437 741.5,400.5Q763,364 800,342L800,240Q800,240 800,240Q800,240 800,240L160,240Q160,240 160,240Q160,240 160,240L160,342Q197,364 218.5,400.5Q240,437 240,480Q240,523 218.5,559.5Q197,596 160,618L160,720Q160,720 160,720Q160,720 160,720ZM480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480Z"/>
|
||||||
|
</vector>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/list"
|
android:id="@+id/list"
|
||||||
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
|
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
|
||||||
app:spanCount="1"
|
app:spanCount="@integer/main_view_card_columns"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_width="match_parent" />
|
android:layout_width="match_parent" />
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
@@ -41,9 +41,10 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
|
app:autoSizeMinTextSize="6sp"
|
||||||
app:autoSizeTextType="uniform"
|
app:autoSizeTextType="uniform"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:padding="20dp" />
|
android:padding="10dp" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:importantForAccessibility="no"
|
android:importantForAccessibility="no"
|
||||||
@@ -150,6 +151,8 @@
|
|||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:layout_marginBottom="4dp"
|
android:layout_marginBottom="4dp"
|
||||||
android:textAppearance="?attr/textAppearanceBody2"
|
android:textAppearance="?attr/textAppearanceBody2"
|
||||||
|
android:maxLines="5"
|
||||||
|
android:ellipsize="end"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible"
|
tools:visibility="visible"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/store"
|
app:layout_constraintTop_toBottomOf="@+id/store"
|
||||||
|
|||||||
@@ -12,29 +12,31 @@ SlavekB
|
|||||||
mondstern
|
mondstern
|
||||||
IllusiveMan196
|
IllusiveMan196
|
||||||
Altonss
|
Altonss
|
||||||
|
大王叫我来巡山
|
||||||
Michael Moroni
|
Michael Moroni
|
||||||
Eric
|
Eric
|
||||||
GM
|
GM
|
||||||
Petr Novák
|
Petr Novák
|
||||||
laralem
|
laralem
|
||||||
大王叫我来巡山
|
|
||||||
Joel A
|
Joel A
|
||||||
Taco
|
Taco
|
||||||
pfaffenrodt
|
pfaffenrodt
|
||||||
Aayush Gupta
|
Aayush Gupta
|
||||||
Scrambled777
|
Scrambled777
|
||||||
HudobniVolk
|
HudobniVolk
|
||||||
Nyatsuki
|
|
||||||
Jiri Grönroos
|
|
||||||
Giovanni Donisi
|
Giovanni Donisi
|
||||||
|
Nyatsuki
|
||||||
Priit Jõerüüt
|
Priit Jõerüüt
|
||||||
|
B o d o
|
||||||
|
Jiri Grönroos
|
||||||
|
Максим Горпиніч
|
||||||
Samantaz Fox
|
Samantaz Fox
|
||||||
Balázs Meskó
|
|
||||||
Milo Ivir
|
|
||||||
Arno-github
|
|
||||||
Ankit Tiwari
|
|
||||||
Sergio Paredes
|
|
||||||
Cliff Heraldo
|
Cliff Heraldo
|
||||||
|
Sergio Paredes
|
||||||
|
Ankit Tiwari
|
||||||
|
Arno-github
|
||||||
|
Milo Ivir
|
||||||
|
Balázs Meskó
|
||||||
Jose Delvani
|
Jose Delvani
|
||||||
mdvhimself
|
mdvhimself
|
||||||
Milan Šalka
|
Milan Šalka
|
||||||
@@ -42,26 +44,29 @@ ikanakova
|
|||||||
Skrripy
|
Skrripy
|
||||||
huuhaa
|
huuhaa
|
||||||
waffshappen
|
waffshappen
|
||||||
|
Marnick L'Eau
|
||||||
Silvério Santos
|
Silvério Santos
|
||||||
ngocanhtve
|
ngocanhtve
|
||||||
Quentin PAGÈS
|
Quentin PAGÈS
|
||||||
Projjal Moitra
|
Projjal Moitra
|
||||||
Denis Shilin
|
Kachelkaiser
|
||||||
Robin Liu
|
|
||||||
Ziad OUALHADJ
|
Ziad OUALHADJ
|
||||||
|
Robin Liu
|
||||||
|
Renko
|
||||||
|
Denis Shilin
|
||||||
しいたけ
|
しいたけ
|
||||||
Alexander Ivanov
|
Alexander Ivanov
|
||||||
Viet Nguyen Hoang
|
|
||||||
Miha Frangež
|
Miha Frangež
|
||||||
|
Viet Nguyen Hoang
|
||||||
stavpup
|
stavpup
|
||||||
|
josé m
|
||||||
ehrt74
|
ehrt74
|
||||||
Virginie
|
Virginie
|
||||||
Tim Trek
|
|
||||||
Renko
|
|
||||||
Michael Gangolf
|
|
||||||
rudy3
|
|
||||||
Kim Seohyun
|
|
||||||
Govind S Nair
|
|
||||||
Freddo espresso
|
|
||||||
arshbeerSingh
|
|
||||||
MisterCosta96
|
MisterCosta96
|
||||||
|
arshbeerSingh
|
||||||
|
Freddo espresso
|
||||||
|
Govind S Nair
|
||||||
|
Kim Seohyun
|
||||||
|
Tim Trek
|
||||||
|
rudy3
|
||||||
|
Michael Gangolf
|
||||||
|
|||||||
@@ -50,11 +50,11 @@
|
|||||||
<string name="settings">اعدادات</string>
|
<string name="settings">اعدادات</string>
|
||||||
<string name="settings_light_theme">فاتح</string>
|
<string name="settings_light_theme">فاتح</string>
|
||||||
<string name="settings_dark_theme">داكن</string>
|
<string name="settings_dark_theme">داكن</string>
|
||||||
<string name="settings_card_orientation">اتجاه الباركود</string>
|
<string name="settings_card_orientation">اتجاه الشاشة</string>
|
||||||
<string name="settings_portrait_orientation">الوضع الرأسي</string>
|
<string name="settings_portrait_orientation">الوضع الرأسي</string>
|
||||||
<string name="settings_landscape_orientation">الوضع الأفقي</string>
|
<string name="settings_landscape_orientation">الوضع الأفقي</string>
|
||||||
<string name="settings_theme">مظهر</string>
|
<string name="settings_theme">مظهر</string>
|
||||||
<string name="settings_display_barcode_max_brightness">عرض مشرق علي الباركود</string>
|
<string name="settings_display_barcode_max_brightness">عرض مشرق علي الشاشة</string>
|
||||||
<string name="importSuccessful">تم استيراد البيانات</string>
|
<string name="importSuccessful">تم استيراد البيانات</string>
|
||||||
<string name="exportSuccessful">تم تصدير البيانات</string>
|
<string name="exportSuccessful">تم تصدير البيانات</string>
|
||||||
<string name="enter_group_name">أدخل اسم المجموعة</string>
|
<string name="enter_group_name">أدخل اسم المجموعة</string>
|
||||||
@@ -277,7 +277,7 @@
|
|||||||
<string name="action_display_options">خيارات العرض</string>
|
<string name="action_display_options">خيارات العرض</string>
|
||||||
<string name="settings_oled_dark_summary">يقلل من استخدام البطارية على شاشات OLED</string>
|
<string name="settings_oled_dark_summary">يقلل من استخدام البطارية على شاشات OLED</string>
|
||||||
<string name="icon_header_click_text">اضغط لفترة طويلة لتحرير الصورة المصغرة</string>
|
<string name="icon_header_click_text">اضغط لفترة طويلة لتحرير الصورة المصغرة</string>
|
||||||
<string name="settings_category_title_cards">البطاقات</string>
|
<string name="settings_category_title_cards">البطاقات الظاهرة</string>
|
||||||
<string name="show_note">إظهار الملاحظة</string>
|
<string name="show_note">إظهار الملاحظة</string>
|
||||||
<string name="switchToBackImage">التبديل إلى الصورة الخلفية</string>
|
<string name="switchToBackImage">التبديل إلى الصورة الخلفية</string>
|
||||||
<string name="switchToFrontImage">التبديل إلى الصورة الأمامية</string>
|
<string name="switchToFrontImage">التبديل إلى الصورة الأمامية</string>
|
||||||
@@ -316,4 +316,20 @@
|
|||||||
<string name="exportCancelled">تم الغاء الاستخراج</string>
|
<string name="exportCancelled">تم الغاء الاستخراج</string>
|
||||||
<string name="useFrontImage">استخدام صورة أمامية</string>
|
<string name="useFrontImage">استخدام صورة أمامية</string>
|
||||||
<string name="useBackImage">استخدم صورة خلفية</string>
|
<string name="useBackImage">استخدم صورة خلفية</string>
|
||||||
|
<string name="addFromPkpass">اختر ملف الدفتر(.pkpass)</string>
|
||||||
|
<string name="unsupportedFile">هذا الملف غير مدعوم</string>
|
||||||
|
<string name="generic_error_please_retry">نعتذر، حدث خطأ ما، حاول مرة أخرى...</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">تبديل البطاقات باستخدام أزرار الصوت</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">تبديل البطاقات الظاهرة باستخدام أزرار الصوت</string>
|
||||||
|
<string name="settings_category_title_cards_overview">نظرة عامة على البطاقات</string>
|
||||||
|
<string name="settings_column_count_portrait">الأعمدة في الوضع الرأسي</string>
|
||||||
|
<string name="settings_column_count_landscape">الأعمدة في الوضع الأفقي</string>
|
||||||
|
<string name="settings_automatic_column_count">تلقائي</string>
|
||||||
|
<string name="settings_column_count_1">١</string>
|
||||||
|
<string name="settings_column_count_2">٢</string>
|
||||||
|
<string name="settings_column_count_3">٣</string>
|
||||||
|
<string name="settings_column_count_4">٤</string>
|
||||||
|
<string name="settings_column_count_5">٥</string>
|
||||||
|
<string name="settings_column_count_6">٦</string>
|
||||||
|
<string name="settings_column_count_7">٧</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -258,7 +258,7 @@
|
|||||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Без заключване на екрана при преглед на карта</string>
|
<string name="settings_disable_lockscreen_while_viewing_card_summary">Без заключване на екрана при преглед на карта</string>
|
||||||
<string name="settings_allow_content_provider_read_summary">Приложенията ще искат разрешение, за да получат достъп</string>
|
<string name="settings_allow_content_provider_read_summary">Приложенията ще искат разрешение, за да получат достъп</string>
|
||||||
<string name="settings_oled_dark_summary">Намалява разхода на батерия от OLED дисплеи</string>
|
<string name="settings_oled_dark_summary">Намалява разхода на батерия от OLED дисплеи</string>
|
||||||
<string name="settings_category_title_cards">Изглед с карти</string>
|
<string name="settings_category_title_cards">Преглед на карта</string>
|
||||||
<string name="settings_category_title_general">Общи</string>
|
<string name="settings_category_title_general">Общи</string>
|
||||||
<string name="settings_category_title_privacy">Поверителност</string>
|
<string name="settings_category_title_privacy">Поверителност</string>
|
||||||
<string name="settings_keep_screen_on_summary">Спира автоматичното заключване на екрана при преглед на карти</string>
|
<string name="settings_keep_screen_on_summary">Спира автоматичното заключване на екрана при преглед на карти</string>
|
||||||
@@ -294,4 +294,18 @@
|
|||||||
<string name="useBackImage">Използване на задната страна</string>
|
<string name="useBackImage">Използване на задната страна</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Сменяне на картите с бутоните за звука</string>
|
<string name="settings_use_volume_keys_navigation">Сменяне на картите с бутоните за звука</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Бутоните за силата на звука сменят видимата карта</string>
|
<string name="settings_use_volume_keys_navigation_summary">Бутоните за силата на звука сменят видимата карта</string>
|
||||||
|
<string name="settings_automatic_column_count">Автоматично</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_column_count_landscape">Колони в пейзажен изглед</string>
|
||||||
|
<string name="settings_column_count_portrait">Колони в портретен изглед</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Списък с карти</string>
|
||||||
|
<string name="generic_error_please_retry">Съжаляваме, нещо се обърка, опитайте отново…</string>
|
||||||
|
<string name="addFromPkpass">Изберете файл на Passbook (.pkpass)</string>
|
||||||
|
<string name="unsupportedFile">Този вид файлове не се поддържат</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -300,4 +300,18 @@
|
|||||||
<string name="useFrontImage">Použijte přední obrázek</string>
|
<string name="useFrontImage">Použijte přední obrázek</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Pomocí tlačítek hlasitosti můžete změnit, která karta se zobrazí</string>
|
<string name="settings_use_volume_keys_navigation_summary">Pomocí tlačítek hlasitosti můžete změnit, která karta se zobrazí</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Přepínat karty pomocí tlačítek hlasitosti</string>
|
<string name="settings_use_volume_keys_navigation">Přepínat karty pomocí tlačítek hlasitosti</string>
|
||||||
|
<string name="generic_error_please_retry">Je nám líto, něco se pokazilo, zkuste to prosím znovu...</string>
|
||||||
|
<string name="settings_column_count_portrait">Sloupce v režimu na výšku</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatický</string>
|
||||||
|
<string name="addFromPkpass">Vyberte soubor Passbook (.pkpass)</string>
|
||||||
|
<string name="unsupportedFile">Tento soubor není podporován</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Přehled karet</string>
|
||||||
|
<string name="settings_column_count_landscape">Sloupce v režimu na šířku</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||||
<string name="scanCardBarcode">Scanne kortets stregkode</string>
|
<string name="scanCardBarcode">Scan stregkode</string>
|
||||||
<string name="addCardTitle">Tilføj kort</string>
|
<string name="addCardTitle">Tilføj kort</string>
|
||||||
<string name="editCardTitle">Rediger kort</string>
|
<string name="editCardTitle">Rediger kort</string>
|
||||||
<string name="sendLabel">Afsend…</string>
|
<string name="sendLabel">Afsend…</string>
|
||||||
@@ -24,8 +24,8 @@
|
|||||||
<string name="cardId">Kort ID</string>
|
<string name="cardId">Kort ID</string>
|
||||||
<string name="note">Bemærk</string>
|
<string name="note">Bemærk</string>
|
||||||
<string name="storeName">Navn</string>
|
<string name="storeName">Navn</string>
|
||||||
<string name="noMatchingGiftCards">Jeg fandt ikke noget. Prøv at ændre din søgning.</string>
|
<string name="noMatchingGiftCards">Ingen resultater. Prøv at ændre din søgning.</string>
|
||||||
<string name="noGiftCards">Klik på + plus-knappen for at tilføje et kort, eller importer først nogle kort fra ⋮-menuen.</string>
|
<string name="noGiftCards">Klik på + plus-knappen for at tilføje et kort, eller importer kort fra ⋮ menuen.</string>
|
||||||
<plurals name="selectedCardCount">
|
<plurals name="selectedCardCount">
|
||||||
<item quantity="one"><xliff:g>%d</xliff:g> valgt kort</item>
|
<item quantity="one"><xliff:g>%d</xliff:g> valgt kort</item>
|
||||||
<item quantity="other"><xliff:g>%d</xliff:g> valgte kort</item>
|
<item quantity="other"><xliff:g>%d</xliff:g> valgte kort</item>
|
||||||
@@ -34,13 +34,13 @@
|
|||||||
<string name="action_search">Søg</string>
|
<string name="action_search">Søg</string>
|
||||||
<string name="importExport">Import/eksport</string>
|
<string name="importExport">Import/eksport</string>
|
||||||
<string name="exportName">Eksport</string>
|
<string name="exportName">Eksport</string>
|
||||||
<string name="importExportHelp">Hvis du sikkerhedskopierer dine kort, kan du flytte dem til en anden enhed.</string>
|
<string name="importExportHelp">Sikkerhedskopiering af dit data, giver dig mulighed for at flytte dem til en anden enhed.</string>
|
||||||
<string name="importSuccessfulTitle">Importeret</string>
|
<string name="importSuccessfulTitle">Importeret</string>
|
||||||
<string name="importFailedTitle">Import mislykkedes</string>
|
<string name="importFailedTitle">Import mislykkedes</string>
|
||||||
<string name="importFailed">Kunne ikke importere kort</string>
|
<string name="importFailed">Kunne ikke udføre importering</string>
|
||||||
<string name="exportSuccessfulTitle">Eksporteret</string>
|
<string name="exportSuccessfulTitle">Eksporteret</string>
|
||||||
<string name="exportFailedTitle">Eksport mislykkedes</string>
|
<string name="exportFailedTitle">Eksport mislykkedes</string>
|
||||||
<string name="exportFailed">Kunne ikke eksportere kort</string>
|
<string name="exportFailed">Kunne ikke udføre eksportering</string>
|
||||||
<string name="importing">Importere…</string>
|
<string name="importing">Importere…</string>
|
||||||
<string name="exporting">Eksportere…</string>
|
<string name="exporting">Eksportere…</string>
|
||||||
<string name="settings_dark_theme">Mørk</string>
|
<string name="settings_dark_theme">Mørk</string>
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
<string name="importOptionFilesystemTitle">Import fra filsystem</string>
|
<string name="importOptionFilesystemTitle">Import fra filsystem</string>
|
||||||
<string name="exportOptionExplanation">Dataene skrives til en placering efter eget valg.</string>
|
<string name="exportOptionExplanation">Dataene skrives til en placering efter eget valg.</string>
|
||||||
<string name="failedParsingImportUriError">Kunne ikke analysere import-URI\'en</string>
|
<string name="failedParsingImportUriError">Kunne ikke analysere import-URI\'en</string>
|
||||||
<string name="noCardExistsError">Kunne ikke finde kort</string>
|
<string name="noCardExistsError">Kunne ikke finde det kort</string>
|
||||||
<string name="deleteConfirmationGroup">Slet gruppe\?</string>
|
<string name="deleteConfirmationGroup">Slet gruppe\?</string>
|
||||||
<string name="all">Alle</string>
|
<string name="all">Alle</string>
|
||||||
<string name="noGroupCards">Denne gruppe indeholder ikke nogen kort</string>
|
<string name="noGroupCards">Denne gruppe indeholder ikke nogen kort</string>
|
||||||
@@ -88,4 +88,16 @@
|
|||||||
<item quantity="other">Slet disse <xliff:g>%d</xliff:g> kort permanent\?</item>
|
<item quantity="other">Slet disse <xliff:g>%d</xliff:g> kort permanent\?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="app_name">Catima</string>
|
<string name="app_name">Catima</string>
|
||||||
|
<string name="cameraPermissionRequired">Behov for kamera adgang krævet for denne funktion…</string>
|
||||||
|
<string name="storageReadPermissionRequired">Behov for lager adgang krævet for denne funktion…</string>
|
||||||
|
<string name="permissionReadCardsLabel">Læs Catima Kort</string>
|
||||||
|
<string name="permissionReadCardsDescription">læs dine Catima kort og alle deres detaljer, også noter og billeder</string>
|
||||||
|
<string name="cameraPermissionDeniedTitle">Kunne ikke få adgang til kamera</string>
|
||||||
|
<string name="noCameraPermissionDirectToSystemSetting">For at scanne stregkoder, har Catima behov for at få adgang til dit kamera. Klik her for at ændre dine tilladelser i indstillinger.</string>
|
||||||
|
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019–<xliff:g>%d</xliff:g> Sylvia van Os og hjælpere</string>
|
||||||
|
<string name="app_copyright_short">Copyright © Sylvia van Os og hjælpere</string>
|
||||||
|
<string name="about_title_fmt">Om <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_license">Copylefted libre software, GPLv3+ licens</string>
|
||||||
|
<string name="barcodeImageDescriptionWithType">Billede<xliff:g>%s</xliff:g> stregkode</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -291,4 +291,18 @@
|
|||||||
<string name="useBackImage">Rückseite verwenden</string>
|
<string name="useBackImage">Rückseite verwenden</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Karten mit Lautstärketasten wechseln</string>
|
<string name="settings_use_volume_keys_navigation">Karten mit Lautstärketasten wechseln</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Wähle mit den Lautstärketasten, welche Karte angezeigt werden soll</string>
|
<string name="settings_use_volume_keys_navigation_summary">Wähle mit den Lautstärketasten, welche Karte angezeigt werden soll</string>
|
||||||
|
<string name="settings_column_count_portrait">Spalten im Hochformat</string>
|
||||||
|
<string name="settings_column_count_landscape">Spalten im Querformat</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatisch</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Kartenübersicht</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="generic_error_please_retry">Entschuldigung, da ist etwas schief gelaufen, versuchen Sie es noch einmal ...</string>
|
||||||
|
<string name="unsupportedFile">Diese Datei wird nicht unterstützt</string>
|
||||||
|
<string name="addFromPkpass">Passbook-Datei (.pkpass) auswählen</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<string name="noGiftCards">Κάντε κλικ στο + κουμπί για να προσθέσετε μία κάρτα ή προσθέστε από το ⋮ μενού.</string>
|
<string name="noGiftCards">Κάντε κλικ στο + κουμπί για να προσθέσετε μία κάρτα ή προσθέστε από το ⋮ μενού.</string>
|
||||||
<string name="storeName">Όνομα</string>
|
<string name="storeName">Όνομα</string>
|
||||||
<string name="note">Σημείωση</string>
|
<string name="note">Σημείωση</string>
|
||||||
<string name="cardId">Κωδικός Κάρτας</string>
|
<string name="cardId">Κωδικός κάρτας</string>
|
||||||
<string name="cancel">Άκυρο</string>
|
<string name="cancel">Άκυρο</string>
|
||||||
<string name="save">Αποθήκευση</string>
|
<string name="save">Αποθήκευση</string>
|
||||||
<string name="edit">Επεξεργασία</string>
|
<string name="edit">Επεξεργασία</string>
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
<item quantity="other"><xliff:g>%d</xliff:g> επιλέγχθηκαν</item>
|
<item quantity="other"><xliff:g>%d</xliff:g> επιλέγχθηκαν</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="noGiftCardsGroup">Δημιούργησε κάρτες και βάλτες σε αυτή την ομάδα.</string>
|
<string name="noGiftCardsGroup">Δημιούργησε κάρτες και βάλτες σε αυτή την ομάδα.</string>
|
||||||
<string name="addManually">Εισαγάγετε τον γραμμωτό κώδικα με μη αυτόματο τρόπο</string>
|
<string name="addManually">Εισαγωγή γραμμωτού κώδικα με μη αυτόματο τρόπο</string>
|
||||||
<string name="never">Ποτέ</string>
|
<string name="never">Ποτέ</string>
|
||||||
<string name="share">Κοινοποίηση</string>
|
<string name="share">Κοινοποίηση</string>
|
||||||
<plurals name="balancePoints">
|
<plurals name="balancePoints">
|
||||||
@@ -71,12 +71,12 @@
|
|||||||
<string name="accept">Αποδοχή</string>
|
<string name="accept">Αποδοχή</string>
|
||||||
<string name="yes">Ναι</string>
|
<string name="yes">Ναι</string>
|
||||||
<string name="no">Όχι</string>
|
<string name="no">Όχι</string>
|
||||||
<string name="addFromImage">Επιλέξτε μια εικόνα από τη συλλογή</string>
|
<string name="addFromImage">Επιλογή εικόνας από τη συλλογή</string>
|
||||||
<string name="expiryStateSentence">Λήγει: <xliff:g>%s</xliff:g></string>
|
<string name="expiryStateSentence">Λήγει: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="expiryDate">Ημερομηνία λήξης</string>
|
<string name="expiryDate">Ημερομηνία λήξης</string>
|
||||||
<string name="settings_keep_screen_on">Κράτα την οθόνη ανοιχτή</string>
|
<string name="settings_keep_screen_on">Διατήρηση ενεργής οθόνης</string>
|
||||||
<string name="leaveWithoutSaveTitle">Έξοδος</string>
|
<string name="leaveWithoutSaveTitle">Έξοδος</string>
|
||||||
<string name="reverse">... σε αντίθετη σειρά</string>
|
<string name="reverse">...σε αντίστροφη σειρά</string>
|
||||||
<string name="version_history">Ιστορικό έκδοσης</string>
|
<string name="version_history">Ιστορικό έκδοσης</string>
|
||||||
<string name="sort_by">Ταξινόμηση κατά</string>
|
<string name="sort_by">Ταξινόμηση κατά</string>
|
||||||
<string name="credits">Πιστώσεις</string>
|
<string name="credits">Πιστώσεις</string>
|
||||||
@@ -91,8 +91,7 @@
|
|||||||
<string name="importLoyaltyCardKeychainMessage">Επιλέξτε την <i>LoyaltyCardKeychain.csv</i> εξαγωγή από το Loyalty Card Keychain για εισαγωγή.
|
<string name="importLoyaltyCardKeychainMessage">Επιλέξτε την <i>LoyaltyCardKeychain.csv</i> εξαγωγή από το Loyalty Card Keychain για εισαγωγή.
|
||||||
\nΔημιουργήστε το από το μενού Εισαγωγής/Εξαγωγής στο Loyalty Card Keychain επιλέγοντας Εξαγωγή.</string>
|
\nΔημιουργήστε το από το μενού Εισαγωγής/Εξαγωγής στο Loyalty Card Keychain επιλέγοντας Εξαγωγή.</string>
|
||||||
<string name="importFidme">Εισαγωγή από FidMe</string>
|
<string name="importFidme">Εισαγωγή από FidMe</string>
|
||||||
<string name="importFidmeMessage">Επιλέξτε την <i>fidme-export-request-xxxxxx.zip</i> εξαγωγή από το FidMe για εισαγωγή και επιλέξτε χειροκίνητα τους τύπους γραμμωτού κώδικα μετέπειτα.
|
<string name="importFidmeMessage">Επιλέξτε την <i>fidme-export-request-xxxxxx.zip</i> εξαγωγή από το FidMe για εισαγωγή και επιλέξτε χειροκίνητα τους τύπους γραμμωτού κώδικα μετέπειτα.\nΔημιουργήστε το από το FidMe προφίλ επιλέγοντας Προστασία Δεδομένων και πατώντας Εξαγωγή δεδομένων πρώτα.</string>
|
||||||
\nΔημιουργήστε το από το FidMe προφίλ επιλέγοντας Προστασία Δεδομένων και πατώντας Εξαγωγή δεδομένων πρώτα.</string>
|
|
||||||
<string name="setBarcodeId">Επιλέξτε τιμή γραμμωτού κώδικα</string>
|
<string name="setBarcodeId">Επιλέξτε τιμή γραμμωτού κώδικα</string>
|
||||||
<string name="wrongValueForBarcodeType">Η τιμή δεν είναι έγκυρη για τον επιλεγμένο γραμμωτό κώδικα</string>
|
<string name="wrongValueForBarcodeType">Η τιμή δεν είναι έγκυρη για τον επιλεγμένο γραμμωτό κώδικα</string>
|
||||||
<string name="setBackImage">Επιλογή οπίσθιας εικόνας</string>
|
<string name="setBackImage">Επιλογή οπίσθιας εικόνας</string>
|
||||||
@@ -101,7 +100,7 @@
|
|||||||
<string name="updateBarcodeQuestionText">Αλλάξατε τον κωδικό. Θέλετε να ενημερώσετε και τον γραμμωτό κώδικα στην ίδια τιμή;</string>
|
<string name="updateBarcodeQuestionText">Αλλάξατε τον κωδικό. Θέλετε να ενημερώσετε και τον γραμμωτό κώδικα στην ίδια τιμή;</string>
|
||||||
<string name="options">Επιλογές</string>
|
<string name="options">Επιλογές</string>
|
||||||
<string name="noGroupCards">Αυτή η ομάδα είναι άδεια</string>
|
<string name="noGroupCards">Αυτή η ομάδα είναι άδεια</string>
|
||||||
<string name="settings_display_barcode_max_brightness">Επιπλέον φωτισμός γραμμωτού κώδικα</string>
|
<string name="settings_display_barcode_max_brightness">Επιπλέον φωτισμός οθόνης</string>
|
||||||
<string name="group_name_is_empty">Το όνομα της ομάδας δεν πρέπει να είναι κενό</string>
|
<string name="group_name_is_empty">Το όνομα της ομάδας δεν πρέπει να είναι κενό</string>
|
||||||
<string name="group_edit">Επεξεργασία ομάδας</string>
|
<string name="group_edit">Επεξεργασία ομάδας</string>
|
||||||
<string name="star">Προσθήκη στα αγαπημένα</string>
|
<string name="star">Προσθήκη στα αγαπημένα</string>
|
||||||
@@ -125,16 +124,16 @@
|
|||||||
\nΠάρτε το στέλνοντας email στο: support@stocardapp.com ζητώντας μια εξαγωγή αρχείων των δεδομένων σας.</string>
|
\nΠάρτε το στέλνοντας email στο: support@stocardapp.com ζητώντας μια εξαγωγή αρχείων των δεδομένων σας.</string>
|
||||||
<string name="intent_import_card_from_url_share_multiple_text">Θέλω να μοιραστώ μερικές κάρτες μαζί σου</string>
|
<string name="intent_import_card_from_url_share_multiple_text">Θέλω να μοιραστώ μερικές κάρτες μαζί σου</string>
|
||||||
<string name="editGroup">Επεξεργασία Ομάδας: <xliff:g>%s</xliff:g></string>
|
<string name="editGroup">Επεξεργασία Ομάδας: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="setFrontImage">Επιλογή μπροστινής εικόνας</string>
|
<string name="setFrontImage">Επιλογή εμπρόσθιας εικόνας</string>
|
||||||
<string name="importVoucherVaultMessage">Επιλέξτε την <i>vouchervault.json</i> εξαγωγή από το Voucher Vault για εισαγωγή.
|
<string name="importVoucherVaultMessage">Επιλέξτε την <i>vouchervault.json</i> εξαγωγή από το Voucher Vault για εισαγωγή.
|
||||||
\nΔημιουργήστε το επιλέγοντας Εξαγωγή στο Voucher Vault.</string>
|
\nΔημιουργήστε το επιλέγοντας Εξαγωγή στο Voucher Vault.</string>
|
||||||
<string name="unsupportedBarcodeType">Ο τύπος γραμμωτού κώδικα δεν μπορεί να εμφανιστεί ακόμα. Μπορεί να υποστηρίζεται σε μια μελλοντική έκδοση της εφαρμογής.</string>
|
<string name="unsupportedBarcodeType">Ο τύπος γραμμωτού κώδικα δεν μπορεί να εμφανιστεί ακόμα. Μπορεί να υποστηρίζεται σε μια μελλοντική έκδοση της εφαρμογής.</string>
|
||||||
<string name="frontImageDescription">Μπροστινή εικόνα</string>
|
<string name="frontImageDescription">Εμπρόσθια</string>
|
||||||
<string name="photos">Φωτογραφίες</string>
|
<string name="photos">Φωτογραφίες</string>
|
||||||
<string name="backImageDescription">Οπίσθια εικόνα</string>
|
<string name="backImageDescription">Οπίσθια</string>
|
||||||
<string name="updateBarcodeQuestionTitle">Ενημέρωση τιμής γραμμωτού κώδικα;</string>
|
<string name="updateBarcodeQuestionTitle">Ενημέρωση τιμής γραμμωτού κώδικα;</string>
|
||||||
<string name="passwordRequired">Παρακαλώ εισάγετε τον κωδικό</string>
|
<string name="passwordRequired">Παρακαλώ εισάγετε τον κωδικό</string>
|
||||||
<string name="sort_by_most_recently_used">Χρησιμοποιήθηκαν πρόσφατα</string>
|
<string name="sort_by_most_recently_used">Χρήση</string>
|
||||||
<string name="shortcutSelectCard">Επιλέξτε μία κάρτα</string>
|
<string name="shortcutSelectCard">Επιλέξτε μία κάρτα</string>
|
||||||
<string name="barcodeImageDescriptionWithType">Εικόνα <xliff:g>%s</xliff:g> γραμμωτού κώδικα</string>
|
<string name="barcodeImageDescriptionWithType">Εικόνα <xliff:g>%s</xliff:g> γραμμωτού κώδικα</string>
|
||||||
<string name="app_libraries">Ελεύθερες βιβλιοθήκες τρίτων: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
<string name="app_libraries">Ελεύθερες βιβλιοθήκες τρίτων: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||||
@@ -169,11 +168,11 @@
|
|||||||
<string name="app_copyright_old">Βασισμένο στο Loyalty Card Keychain
|
<string name="app_copyright_old">Βασισμένο στο Loyalty Card Keychain
|
||||||
\nπνευματικά δικαιώματα © 2016-2020 Branden Archer</string>
|
\nπνευματικά δικαιώματα © 2016-2020 Branden Archer</string>
|
||||||
<string name="settings_follow_system_orientation">Ακολούθηση συστήματος</string>
|
<string name="settings_follow_system_orientation">Ακολούθηση συστήματος</string>
|
||||||
<string name="settings_card_orientation">Προσανατολισμός γραμμωτού κώδικα</string>
|
<string name="settings_card_orientation">Προσανατολισμός οθόνης</string>
|
||||||
<string name="settings_portrait_orientation">Πορτραίτο</string>
|
<string name="settings_portrait_orientation">Πορτραίτο</string>
|
||||||
<string name="settings_landscape_orientation">Οριζόντια</string>
|
<string name="settings_landscape_orientation">Οριζόντια</string>
|
||||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Πνευματικά δικαιώματα © 2019-<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Πνευματικά δικαιώματα © 2019-<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
||||||
<string name="settings_lock_on_opening_orientation">Κλείδωμα τωρινού προσανατολισμού όταν ανοίγει μία κάρτα</string>
|
<string name="settings_lock_on_opening_orientation">Κλείδωμα τρέχοντος προσανατολισμού όταν ανοίγει μία κάρτα</string>
|
||||||
<string name="intent_import_card_from_url_share_text">Θέλω να μοιραστώ μία κάρτα μαζί σου</string>
|
<string name="intent_import_card_from_url_share_text">Θέλω να μοιραστώ μία κάρτα μαζί σου</string>
|
||||||
<string name="enter_group_name">Εισάγετε όνομα ομάδας</string>
|
<string name="enter_group_name">Εισάγετε όνομα ομάδας</string>
|
||||||
<string name="groups">Ομάδες</string>
|
<string name="groups">Ομάδες</string>
|
||||||
@@ -214,7 +213,7 @@
|
|||||||
<string name="and_data_usage">και δεδομένα χρήσης</string>
|
<string name="and_data_usage">και δεδομένα χρήσης</string>
|
||||||
<string name="rate_this_app">Βαθμολογήστε την εφαρμογή</string>
|
<string name="rate_this_app">Βαθμολογήστε την εφαρμογή</string>
|
||||||
<string name="duplicateCard">Αντίγραφο</string>
|
<string name="duplicateCard">Αντίγραφο</string>
|
||||||
<string name="archive">Αρχειοθετήστε</string>
|
<string name="archive">Αρχειοθέτηση</string>
|
||||||
<string name="archived">Η κάρτα αρχειοθετήθηκε</string>
|
<string name="archived">Η κάρτα αρχειοθετήθηκε</string>
|
||||||
<string name="unarchived">Η κάρτα αφαιρέθηκε από το αρχείο</string>
|
<string name="unarchived">Η κάρτα αφαιρέθηκε από το αρχείο</string>
|
||||||
<string name="unarchive">Αφαίρεση από το αρχείο</string>
|
<string name="unarchive">Αφαίρεση από το αρχείο</string>
|
||||||
@@ -238,16 +237,16 @@
|
|||||||
<string name="settings_allow_content_provider_read_title">Να επιτρέπεται σε άλλες εφαρμογές να έχουν πρόσβαση στα δεδομένα μου</string>
|
<string name="settings_allow_content_provider_read_title">Να επιτρέπεται σε άλλες εφαρμογές να έχουν πρόσβαση στα δεδομένα μου</string>
|
||||||
<string name="app_copyright_short">Πνευματικά δικαιώματα © Sylvia van Os και συνεργάτες</string>
|
<string name="app_copyright_short">Πνευματικά δικαιώματα © Sylvia van Os και συνεργάτες</string>
|
||||||
<string name="height">Ύψος:</string>
|
<string name="height">Ύψος:</string>
|
||||||
<string name="switchToFrontImage">Μετάβαση στην μπροστινή εικόνα</string>
|
<string name="switchToFrontImage">Μετάβαση στην εμπρόσθια εικόνα</string>
|
||||||
<string name="switchToBackImage">Μετάβαση στην οπίσθια εικόνα</string>
|
<string name="switchToBackImage">Μετάβαση στην οπίσθια εικόνα</string>
|
||||||
<string name="switchToBarcode">Μετάβαση σε γραμμωτό κώδικα</string>
|
<string name="switchToBarcode">Μετάβαση σε γραμμωτό κώδικα</string>
|
||||||
<string name="validFromSentence">Ισχύει από: <xliff:g>%s</xliff:g></string>
|
<string name="validFromSentence">Ισχύει από: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="permissionReadCardsLabel">Διαβάστε τις κάρτες Catima</string>
|
<string name="permissionReadCardsLabel">Διαβάστε τις κάρτες Catima</string>
|
||||||
<string name="openBackImageInGalleryApp">Ανοίξτε την οπίσθια εικόνα στην εφαρμογή γκαλερί</string>
|
<string name="openBackImageInGalleryApp">Ανοίξτε την οπίσθια εικόνα στη συλλογή εικόνων</string>
|
||||||
<string name="permissionReadCardsDescription">Διάβασε τις Κάρτες σου Catima και όλες τους τις λεπτομέρειες, συμπεριλαμβανομένων των σημειώσεων και των εικόνων</string>
|
<string name="permissionReadCardsDescription">Διάβασε τις Κάρτες σου Catima και όλες τους τις λεπτομέρειες, συμπεριλαμβανομένων των σημειώσεων και των εικόνων</string>
|
||||||
<string name="donate">Δωρεά</string>
|
<string name="donate">Δωρεά</string>
|
||||||
<string name="icon_header_click_text">Πατήστε παρατεταμένα για επεξεργασία του εικονιδίου</string>
|
<string name="icon_header_click_text">Πατήστε παρατεταμένα για επεξεργασία του εικονιδίου</string>
|
||||||
<string name="openFrontImageInGalleryApp">Ανοίξτε την μπροστινή εικόνα στην εφαρμογή γκαλερί</string>
|
<string name="openFrontImageInGalleryApp">Ανοίξτε την εμπρόσθια εικόνα στη συλλογή εικόνων</string>
|
||||||
<string name="storageReadPermissionRequired">Δικαίωμα ανάγνωσης του χώρου αποθήκευσης απαραίτητο για αυτήν την ενέργεια…</string>
|
<string name="storageReadPermissionRequired">Δικαίωμα ανάγνωσης του χώρου αποθήκευσης απαραίτητο για αυτήν την ενέργεια…</string>
|
||||||
<string name="settings_follow_sensor_orientation">Πάντα σε περιστροφή (αγνοεί τις ρυθμίσεις του συστήματος)</string>
|
<string name="settings_follow_sensor_orientation">Πάντα σε περιστροφή (αγνοεί τις ρυθμίσεις του συστήματος)</string>
|
||||||
<string name="validFromDate">Ισχύει από</string>
|
<string name="validFromDate">Ισχύει από</string>
|
||||||
@@ -264,7 +263,7 @@
|
|||||||
<string name="amountParsingFailed">Μη έγκυρο ποσό</string>
|
<string name="amountParsingFailed">Μη έγκυρο ποσό</string>
|
||||||
<string name="show_balance">Προβολή υπολοίπου</string>
|
<string name="show_balance">Προβολή υπολοίπου</string>
|
||||||
<string name="action_display_options">Επιλογές εμφάνισης</string>
|
<string name="action_display_options">Επιλογές εμφάνισης</string>
|
||||||
<string name="settings_category_title_cards">Κάρτες</string>
|
<string name="settings_category_title_cards">Εμφάνιση καρτών</string>
|
||||||
<string name="settings_category_title_general">Γενικά</string>
|
<string name="settings_category_title_general">Γενικά</string>
|
||||||
<string name="show_archived_cards">Προβολή αρχειοθετημένων καρτών</string>
|
<string name="show_archived_cards">Προβολή αρχειοθετημένων καρτών</string>
|
||||||
<string name="addWithoutBarcode">Προσθήκη κάρτας χωρίς γραμμωτό κώδικα</string>
|
<string name="addWithoutBarcode">Προσθήκη κάρτας χωρίς γραμμωτό κώδικα</string>
|
||||||
@@ -279,17 +278,33 @@
|
|||||||
<string name="settings_oled_dark_summary">Μειώνει τη χρήση της μπαταρίας στις οθόνες OLED</string>
|
<string name="settings_oled_dark_summary">Μειώνει τη χρήση της μπαταρίας στις οθόνες OLED</string>
|
||||||
<string name="show_note">Εμφάνιση σημείωσης</string>
|
<string name="show_note">Εμφάνιση σημείωσης</string>
|
||||||
<string name="action_more_options">Περισσότερες επιλογές</string>
|
<string name="action_more_options">Περισσότερες επιλογές</string>
|
||||||
<string name="enter_card_id">Εισαγάγετε τον κωδικό αριθμό ή το κείμενο στην κάρτα σας</string>
|
<string name="enter_card_id">Εισάγετε τον κωδικό αριθμό ή το κείμενο στην κάρτα σας</string>
|
||||||
<string name="show_validity">Εμφάνιση εγκυρότητας</string>
|
<string name="show_validity">Εμφάνιση εγκυρότητας</string>
|
||||||
<string name="add_a_card_in_a_different_way">Προσθέστε μια κάρτα με διαφορετικό τρόπο</string>
|
<string name="add_a_card_in_a_different_way">Προσθέστε μια κάρτα με διαφορετικό τρόπο</string>
|
||||||
<string name="card_id_must_not_be_empty">Ο κωδικός αριθμός της κάρτας δεν πρέπει να είναι κενός</string>
|
<string name="card_id_must_not_be_empty">Ο κωδικός αριθμός της κάρτας δεν πρέπει να είναι κενός</string>
|
||||||
<string name="settings_allow_content_provider_read_summary">Οι εφαρμογές θα πρέπει ακόμα να ζητήσουν άδεια για να τους δοθεί πρόσβαση</string>
|
<string name="settings_allow_content_provider_read_summary">Οι εφαρμογές θα πρέπει ωστόσο να ζητήσουν άδεια για να τους δοθεί πρόσβαση</string>
|
||||||
<string name="field_must_not_be_empty">Το πεδίο δεν πρέπει να είναι κενό</string>
|
<string name="field_must_not_be_empty">Το πεδίο δεν πρέπει να είναι κενό</string>
|
||||||
<string name="manually_enter_barcode_instructions">Εισαγάγετε τον κωδικό αριθμό ή το κείμενο στην κάρτα σας και πατήστε τον γραμμωτό κώδικα που μοιάζει με αυτόν της κάρτας σας.</string>
|
<string name="manually_enter_barcode_instructions">Εισάγετε τον κωδικό αριθμό ή το κείμενο στην κάρτα σας και πατήστε τον γραμμωτό κώδικα που μοιάζει με αυτόν της κάρτας σας.</string>
|
||||||
<string name="add_manually_warning_title">Συνιστάται η σάρωση</string>
|
<string name="add_manually_warning_title">Συνιστάται η σάρωση</string>
|
||||||
<string name="noCameraFoundGuideText">Η συσκευή σας δεν φαίνεται να διαθέτει κάμερα. Αν έχει, δοκιμάστε να κάνετε επανεκκίνηση της συσκευής. Διαφορετικά, χρησιμοποιήστε το κουμπί Περισσότερες επιλογές παρακάτω για να προσθέσετε έναν γραμμωτό κώδικα με άλλο τρόπο.</string>
|
<string name="noCameraFoundGuideText">Η συσκευή σας δεν φαίνεται να διαθέτει κάμερα. Αν έχει, δοκιμάστε να κάνετε επανεκκίνηση της συσκευής. Διαφορετικά, χρησιμοποιήστε το κουμπί Περισσότερες επιλογές παρακάτω για να προσθέσετε έναν γραμμωτό κώδικα με άλλο τρόπο.</string>
|
||||||
<string name="importCancelled">Η εισαγωγή ακυρώθηκε</string>
|
<string name="importCancelled">Η εισαγωγή ακυρώθηκε</string>
|
||||||
<string name="exportCancelled">Η εξαγωγή ακυρώθηκε</string>
|
<string name="exportCancelled">Η εξαγωγή ακυρώθηκε</string>
|
||||||
<string name="useFrontImage">Χρήση μπροστινής εικόνας</string>
|
<string name="useFrontImage">Χρήση εμπρόσθιας εικόνας</string>
|
||||||
<string name="useBackImage">Χρήση οπίσθιας εικόνας</string>
|
<string name="useBackImage">Χρήση οπίσθιας εικόνας</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">Εναλλαγή καρτών με τα κουμπιά έντασης</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">Χρησιμοποιήστε τα κουμπιά έντασης ήχου για να αλλάξετε την κάρτα που εμφανίζεται</string>
|
||||||
|
<string name="settings_column_count_landscape">Στήλες σε οριζόντια λειτουργία</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Επισκόπηση καρτών</string>
|
||||||
|
<string name="settings_column_count_portrait">Στήλες σε κατακόρυφη λειτουργία</string>
|
||||||
|
<string name="settings_automatic_column_count">Αυτόματα</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="generic_error_please_retry">Λυπούμαστε, κάτι πήγε στραβά, δοκιμάστε ξανά...</string>
|
||||||
|
<string name="unsupportedFile">Το αρχείο δεν υποστηρίζεται</string>
|
||||||
|
<string name="addFromPkpass">Επιλογή αρχείου Passbook (.pkpass)</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -300,4 +300,18 @@
|
|||||||
<string name="useBackImage">Utilice la imagen trasera</string>
|
<string name="useBackImage">Utilice la imagen trasera</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Utiliza los botones de volumen para cambiar que tarjeta se muestra</string>
|
<string name="settings_use_volume_keys_navigation_summary">Utiliza los botones de volumen para cambiar que tarjeta se muestra</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Cambiar de tarjetas usando los botones de volumen</string>
|
<string name="settings_use_volume_keys_navigation">Cambiar de tarjetas usando los botones de volumen</string>
|
||||||
|
<string name="settings_automatic_column_count">Automático</string>
|
||||||
|
<string name="settings_column_count_portrait">Columnas en modo vertical</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Visión general de las tarjetas</string>
|
||||||
|
<string name="settings_column_count_landscape">Columnas en modo horizontal</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="generic_error_please_retry">Lo sentimos, algo salió mal, por favor inténtelo de nuevo...</string>
|
||||||
|
<string name="unsupportedFile">Este archivo no es compatible</string>
|
||||||
|
<string name="addFromPkpass">Seleccione un archivo Passbook (.pkpass)</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -289,4 +289,18 @@
|
|||||||
<string name="useBackImage">Kasuta tagakülje pilti</string>
|
<string name="useBackImage">Kasuta tagakülje pilti</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Vaheta kaarte helivaljuse nuppudega</string>
|
<string name="settings_use_volume_keys_navigation">Vaheta kaarte helivaljuse nuppudega</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Vaheta kuvatavaid vahekaarte helivaljuse nuppudega</string>
|
<string name="settings_use_volume_keys_navigation_summary">Vaheta kuvatavaid vahekaarte helivaljuse nuppudega</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Kaartide ülevaade</string>
|
||||||
|
<string name="settings_column_count_landscape">Veerge rõhtvaates</string>
|
||||||
|
<string name="settings_automatic_column_count">Automaatne</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_portrait">Veerge püstvaates</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="generic_error_please_retry">Vabandust, midagi läks nüüd viltu, palun proovi uuesti...</string>
|
||||||
|
<string name="unsupportedFile">See fail pole toetatud</string>
|
||||||
|
<string name="addFromPkpass">Vali Passbooki fail (.pkpass)</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
</plurals>
|
</plurals>
|
||||||
<plurals name="selectedCardCount">
|
<plurals name="selectedCardCount">
|
||||||
<item quantity="one"><xliff:g>%d</xliff:g> valittu</item>
|
<item quantity="one"><xliff:g>%d</xliff:g> valittu</item>
|
||||||
<item quantity="other"><xliff:g>%d</xliff:g> valittu</item>
|
<item quantity="other"><xliff:g>%d</xliff:g> valitut</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="importStocard">Tuo Stocardista</string>
|
<string name="importStocard">Tuo Stocardista</string>
|
||||||
<string name="importStocardMessage">Valitse tuotava <i>***.zip</i>-vienti Stocardista.
|
<string name="importStocardMessage">Valitse tuotava <i>***.zip</i>-vienti Stocardista.
|
||||||
@@ -294,4 +294,15 @@
|
|||||||
<string name="useFrontImage">Käytä etukuvaa</string>
|
<string name="useFrontImage">Käytä etukuvaa</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Vaihtele korttien välillä äänenvoimakkuuspainikkeilla</string>
|
<string name="settings_use_volume_keys_navigation">Vaihtele korttien välillä äänenvoimakkuuspainikkeilla</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Käytä äänenvoimakkuuspainikkeita vaihtaaksesi näytettävän kortin</string>
|
<string name="settings_use_volume_keys_navigation_summary">Käytä äänenvoimakkuuspainikkeita vaihtaaksesi näytettävän kortin</string>
|
||||||
|
<string name="settings_automatic_column_count">Automaattinen</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Korttinäkymä</string>
|
||||||
|
<string name="settings_column_count_portrait">Saraketta pystytilassa</string>
|
||||||
|
<string name="settings_column_count_landscape">Saraketta vaakatilassa</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -300,4 +300,15 @@
|
|||||||
<string name="useBackImage">Utiliser l\'image arrière</string>
|
<string name="useBackImage">Utiliser l\'image arrière</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Changer de cartes avec les boutons de volume</string>
|
<string name="settings_use_volume_keys_navigation">Changer de cartes avec les boutons de volume</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Utilisez les boutons de volume pour changer la carte affichée</string>
|
<string name="settings_use_volume_keys_navigation_summary">Utilisez les boutons de volume pour changer la carte affichée</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Aperçu des cartes</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_portrait">Colonnes en mode portrait</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_landscape">Colonnes en mode paysage</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatique</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
</resources>
|
</resources>
|
||||||
305
app/src/main/res/values-gl/strings.xml
Normal file
305
app/src/main/res/values-gl/strings.xml
Normal file
@@ -0,0 +1,305 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<string name="app_name">Catima</string>
|
||||||
|
<string name="action_add">Engadir</string>
|
||||||
|
<string name="noGiftCards">Preme no botón + para engadir unha tarxeta ou desde o menú ⋮.</string>
|
||||||
|
<string name="noGiftCardsGroup">Crear tarxetas e despois engádeas aquí ao grupo.</string>
|
||||||
|
<string name="noMatchingGiftCards">Sen resultados. Intenta cambiar a busca.</string>
|
||||||
|
<string name="storeName">Nome</string>
|
||||||
|
<string name="barcodeType">Tipo de código de barras</string>
|
||||||
|
<string name="noBarcode">Sen código de barras</string>
|
||||||
|
<string name="star">Engadir a favoritas</string>
|
||||||
|
<string name="save">Gardar</string>
|
||||||
|
<string name="edit">Editar</string>
|
||||||
|
<string name="cancel">Desbotar</string>
|
||||||
|
<string name="delete">Eliminar</string>
|
||||||
|
<string name="confirm">Confirmar</string>
|
||||||
|
<plurals name="deleteCardsTitle">
|
||||||
|
<item quantity="one">Eliminar <xliff:g>%d</xliff:g> tarxeta</item>
|
||||||
|
<item quantity="other">Eliminar <xliff:g>%d</xliff:g> tarxetas</item>
|
||||||
|
</plurals>
|
||||||
|
<string name="deleteConfirmation">Eliminar definitivamente esta tarxeta?</string>
|
||||||
|
<string name="ok">OK</string>
|
||||||
|
<string name="share">Compartir</string>
|
||||||
|
<string name="sendLabel">Enviar…</string>
|
||||||
|
<string name="editCardTitle">Editar Tarxeta</string>
|
||||||
|
<string name="addCardTitle">Engadir Tarxeta</string>
|
||||||
|
<string name="scanCardBarcode">Escanear Código de Barras</string>
|
||||||
|
<string name="cardShortcut">Atallo á Tarxeta</string>
|
||||||
|
<string name="noCardsMessage">Primeiro engade a tarxeta</string>
|
||||||
|
<string name="barcodeImageDescriptionWithType">Imaxe do código de barras de <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="failedParsingImportUriError">Non se puido procesar o URI de importación</string>
|
||||||
|
<string name="importExport">Importar/Exportar</string>
|
||||||
|
<string name="exportName">Exportar</string>
|
||||||
|
<string name="importExportHelp">Facendo copia de apoio dos datos podes movelos a outro dispositivo.</string>
|
||||||
|
<string name="importSuccessfulTitle">Importados</string>
|
||||||
|
<string name="importFailedTitle">Fallou a importación</string>
|
||||||
|
<string name="exportSuccessfulTitle">Exportado</string>
|
||||||
|
<string name="exportFailedTitle">Fallou a exportación</string>
|
||||||
|
<string name="exportFailed">Non se puido exportar</string>
|
||||||
|
<string name="importFailed">Non se puido importar</string>
|
||||||
|
<string name="importing">Importando…</string>
|
||||||
|
<string name="exporting">Exportando…</string>
|
||||||
|
<string name="storageReadPermissionRequired">O preciso o permiso de lectura para realizar esta acción…</string>
|
||||||
|
<string name="cameraPermissionRequired">O preciso o acceso á cámara para realizar esta acción…</string>
|
||||||
|
<string name="permissionReadCardsLabel">Ler Tarxetas Catima</string>
|
||||||
|
<string name="permissionReadCardsDescription">ler as tarxetas Catima e os seus detalles, incluíndo notas e imaxes</string>
|
||||||
|
<string name="cameraPermissionDeniedTitle">Non puido acceder á cámara</string>
|
||||||
|
<string name="noCameraPermissionDirectToSystemSetting">Catima precisa acceso á cámara para escanear códigos de barras. Toca aquí para cambiar os axustes do permiso.</string>
|
||||||
|
<string name="exportOptionExplanation">Os datos vanse escribir na localización que elixas.</string>
|
||||||
|
<string name="importOptionFilesystemTitle">Importar desde o sistema de ficheiros</string>
|
||||||
|
<string name="importOptionApplicationExplanation">Usa outra app ou o xestor de ficheiros favorito para abrir un ficheiro.</string>
|
||||||
|
<string name="importOptionApplicationButton">Usar outra app</string>
|
||||||
|
<string name="about">Sobre</string>
|
||||||
|
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019–<xliff:g>%d</xliff:g> Sylvia van Os e colaboradoras</string>
|
||||||
|
<string name="app_copyright_short">Copyright © Sylvia van Os e colaboradoras</string>
|
||||||
|
<string name="app_copyright_old">Baseada en Loyalty Card Keychain\ncopyright © 2016–2020 Branden Archer</string>
|
||||||
|
<string name="app_license">Software Libre con Copyleft, licenza GPLv3+</string>
|
||||||
|
<string name="about_title_fmt">Sobre <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_libraries">Bibliotecas libres alleas: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||||
|
<string name="app_resources">Recursos alleos libres: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||||
|
<string name="selectBarcodeTitle">Elixir Código de barras</string>
|
||||||
|
<string name="settings">Axustes</string>
|
||||||
|
<string name="settings_theme">Decorado</string>
|
||||||
|
<string name="settings_follow_sensor_orientation">Rotar sempre (ignora o axuste do sistema)</string>
|
||||||
|
<string name="settings_portrait_orientation">Retrato</string>
|
||||||
|
<string name="settings_landscape_orientation">Paisaxe</string>
|
||||||
|
<string name="settings_lock_on_opening_orientation">Fixar a orientación ao abrir a tarxeta</string>
|
||||||
|
<string name="settings_display_barcode_max_brightness">Brillo da pantalla</string>
|
||||||
|
<string name="settings_keep_screen_on_summary">Evita que se apague a pantalla cando se ve unha tarxeta</string>
|
||||||
|
<string name="settings_disable_lockscreen_while_viewing_card">Evitar bloqueo da pantalla</string>
|
||||||
|
<string name="settings_disable_lockscreen_while_viewing_card_summary">Desactiva o bloqueo da pantalla cando se ve unha tarxeta</string>
|
||||||
|
<string name="settings_allow_content_provider_read_title">Permitir a outras apps acceder aos meus datos</string>
|
||||||
|
<string name="settings_allow_content_provider_read_summary">As app terán que solicitar igualmente o permiso para acceder aos datos</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">Cambiar de tarxeta cos botóns de volume</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">Usar os botóns de volume para cambiar a tarxeta que se mostra</string>
|
||||||
|
<string name="intent_import_card_from_url_share_text">Quero compartir unha tarxeta contigo</string>
|
||||||
|
<string name="importSuccessful">Datos importados</string>
|
||||||
|
<string name="exportSuccessful">Datos exportados</string>
|
||||||
|
<string name="enter_group_name">Escribe o nome do grupo</string>
|
||||||
|
<string name="groups">Grupos</string>
|
||||||
|
<string name="group_edit">Editar Grupo</string>
|
||||||
|
<string name="noGroups">Preme no botón + para engadir grupos por categorías.</string>
|
||||||
|
<string name="noGroupCards">O grupo está baleiro</string>
|
||||||
|
<plurals name="groupCardCount">
|
||||||
|
<item quantity="one"><xliff:g>%d</xliff:g> tarxeta</item>
|
||||||
|
<item quantity="other"><xliff:g>%d</xliff:g> tarxetas</item>
|
||||||
|
</plurals>
|
||||||
|
<string name="group_name_already_in_use">O nome xa se está a usar</string>
|
||||||
|
<string name="group_name_is_empty">O nome do grupo non pode estar baleiro</string>
|
||||||
|
<string name="moveUp">Mover arriba</string>
|
||||||
|
<string name="moveDown">Mover abaixo</string>
|
||||||
|
<string name="leaveWithoutSaveTitle">Saír</string>
|
||||||
|
<string name="leaveWithoutSaveConfirmation">Saír antes de gardar?</string>
|
||||||
|
<string name="addManually">Escribir manualmente o código</string>
|
||||||
|
<string name="addFromImage">Elixe unha imaxe desde a galería</string>
|
||||||
|
<string name="groupsList">Grupos: <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="editGroup">Editando o Grupo: <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="expiryStateSentence">Caducidade: <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="expiryStateSentenceExpired">Caducou: <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
|
||||||
|
<plurals name="balancePoints">
|
||||||
|
<item quantity="one"><xliff:g>%s</xliff:g> punto</item>
|
||||||
|
<item quantity="other"><xliff:g>%s</xliff:g> puntos</item>
|
||||||
|
</plurals>
|
||||||
|
<string name="card">Tarxeta</string>
|
||||||
|
<string name="editBarcode">Editar código</string>
|
||||||
|
<string name="expiryDate">Data de caducidade</string>
|
||||||
|
<string name="never">Nunca</string>
|
||||||
|
<string name="chooseExpiryDate">Elixir data de caducidade</string>
|
||||||
|
<string name="moveBarcodeToTopOfScreen">Mover o código de barra á parte superior da pantalla</string>
|
||||||
|
<string name="noBarcodeFound">Non se atopou un código de barras</string>
|
||||||
|
<string name="errorReadingImage">Non se puido ler a imaxe</string>
|
||||||
|
<string name="balance">Saldo</string>
|
||||||
|
<string name="currency">Divisa</string>
|
||||||
|
<string name="points">Puntos</string>
|
||||||
|
<string name="balanceParsingFailed">Saldo non válido</string>
|
||||||
|
<string name="chooseImportType">Importar datos desde</string>
|
||||||
|
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||||
|
<string name="privacy_policy">Política de Privacidade</string>
|
||||||
|
<string name="accept">Aceptar</string>
|
||||||
|
<string name="importCatima">Importar desde Catima</string>
|
||||||
|
<string name="importCatimaMessage">Selecciona o ficheiro de exportación <i>catima.zip</i> para importalo.\nCréao no menú Importar/Exportar noutra app Catima premendo en Exportar.</string>
|
||||||
|
<string name="importFidme">Importar desde FidMe</string>
|
||||||
|
<string name="importFidmeMessage">Elixe o ficheiro exportado <i>fidme-export-request-xxxxxx.zip</i> desde FidMe, e despois elixe manualmente o tipo de código de barras.\nCréao no teu perfil FidMe en Protección de Datos e despois premendo en Extraer os meus datos.</string>
|
||||||
|
<string name="importLoyaltyCardKeychain">Importar desde Loyalty Card Keychain</string>
|
||||||
|
<string name="importLoyaltyCardKeychainMessage">Elixe o ficheiro de exportación <i>LoyaltyCardKeychain.csv</i> desde Loyalty Card Keychain \nCréao no menú Importar/Exportar en Loyalty Card Keychain premendo en Exportar.</string>
|
||||||
|
<string name="importStocard">Importar desde Stocard</string>
|
||||||
|
<string name="importStocardMessage">Elixe o ficheiro <i>***.zip</i> desde Stocard. \nPodes obtelo escribindo un correo a support@stocardapp.com e pedindo a exportación dos datos.</string>
|
||||||
|
<string name="importVoucherVault">Importar desde Voucher Vault</string>
|
||||||
|
<string name="importVoucherVaultMessage">Selecciona o ficheiro de exportación <i>vouchervault.json</i> desde Voucher Vault. \nCréao premendo en Exportar en Voucher Vault.</string>
|
||||||
|
<string name="barcodeId">Valor do código de barras</string>
|
||||||
|
<string name="sameAsCardId">Igual que o ID</string>
|
||||||
|
<string name="setBarcodeId">Establecer valor do código de barras</string>
|
||||||
|
<string name="unsupportedBarcodeType">Este tipo de código de barras aínda non se pode mostrar. Intentaremos engadir a compatibilidade no futuro.</string>
|
||||||
|
<string name="wrongValueForBarcodeType">O valor non é válido para o tipo de código de barras seleccionado</string>
|
||||||
|
<string name="intent_import_card_from_url_share_multiple_text">Quero compartir unhas tarxetas contigo</string>
|
||||||
|
<string name="frontImageDescription">Imaxe frontal</string>
|
||||||
|
<string name="backImageDescription">Imaxe posterior</string>
|
||||||
|
<string name="photos">Fotos</string>
|
||||||
|
<string name="setFrontImage">Establecer imaxe frontal</string>
|
||||||
|
<string name="setBackImage">Establecer imaxe posterior</string>
|
||||||
|
<string name="removeImage">Retirar a imaxe</string>
|
||||||
|
<string name="takePhoto">Facer unha foto</string>
|
||||||
|
<string name="updateBarcodeQuestionTitle">Actualizar o valor do código?</string>
|
||||||
|
<string name="updateBarcodeQuestionText">Cambiaches o ID. Queres cambiar tamén o código de barras para que use o mesmo valor?</string>
|
||||||
|
<string name="yes">Si</string>
|
||||||
|
<string name="no">Non</string>
|
||||||
|
<string name="failedGeneratingShareURL">Non se puido crear un URL para compartir. Informa sobre o fallo.</string>
|
||||||
|
<string name="turn_flashlight_on">Acender o flash</string>
|
||||||
|
<string name="turn_flashlight_off">Apagar o flash</string>
|
||||||
|
<string name="settings_oled_dark">Fondo en negro puro para o decorado escuro</string>
|
||||||
|
<string name="settings_oled_dark_summary">Diminúe o uso da batería nas pantallas OLED</string>
|
||||||
|
<string name="settings_system_locale">Sistema</string>
|
||||||
|
<string name="selectColor">Elixir cor</string>
|
||||||
|
<string name="settings_theme_color">Cor do decorado</string>
|
||||||
|
<string name="settings_catima_theme">Catima</string>
|
||||||
|
<string name="settings_pink_theme">Rosa</string>
|
||||||
|
<string name="settings_magenta_theme">Maxenta</string>
|
||||||
|
<string name="settings_violet_theme">Violeta</string>
|
||||||
|
<string name="settings_sky_blue_theme">Azul celeste</string>
|
||||||
|
<string name="settings_green_theme">Verde</string>
|
||||||
|
<string name="settings_brown_theme">Marrón</string>
|
||||||
|
<string name="app_contributors">Creada grazas a: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||||
|
<string name="sort">Orde</string>
|
||||||
|
<string name="showMoreInfo">Ver info</string>
|
||||||
|
<string name="updateBalance">Actualizar saldo</string>
|
||||||
|
<string name="failedToRetrieveImageFile">Fallou a obtención do ficheiro de imaxe</string>
|
||||||
|
<string name="barcodeLongPressMessage">Só imaxes que se abren na app de galería</string>
|
||||||
|
<string name="sort_by_name">Nome</string>
|
||||||
|
<string name="sort_by_most_recently_used">Usadas recentemente</string>
|
||||||
|
<string name="sort_by_expiry">Caducidade</string>
|
||||||
|
<string name="reverse">…orde inversa</string>
|
||||||
|
<string name="sort_by">Orde por</string>
|
||||||
|
<string name="version_history">Historial das versións</string>
|
||||||
|
<string name="credits">Recoñecementos</string>
|
||||||
|
<string name="help_translate_this_app">Axuda a traducir a app</string>
|
||||||
|
<string name="license">Licenza</string>
|
||||||
|
<string name="source_repository">Repositorio do código</string>
|
||||||
|
<string name="on_github">en GitHub</string>
|
||||||
|
<string name="and_data_usage">e uso de datos</string>
|
||||||
|
<string name="rate_this_app">Valora esta app</string>
|
||||||
|
<string name="on_google_play">en Google Play</string>
|
||||||
|
<string name="report_error">Informar de fallo</string>
|
||||||
|
<string name="translate_platform">en Weblate</string>
|
||||||
|
<string name="shortcutSelectCard">Elixe unha tarxeta</string>
|
||||||
|
<string name="options">Opcións</string>
|
||||||
|
<string name="starred">Con estrela</string>
|
||||||
|
<string name="include_if_asking_support">Se queres pedir axuda, inclúe esta información:</string>
|
||||||
|
<string name="duplicateCard">Duplicar</string>
|
||||||
|
<string name="archive">Arquivar</string>
|
||||||
|
<string name="unarchive">Sacar do arquivo</string>
|
||||||
|
<string name="archived">Arquivouse a tarxeta</string>
|
||||||
|
<string name="unarchived">Sacouse do arquivo</string>
|
||||||
|
<plurals name="groupCardCountWithArchived">
|
||||||
|
<item quantity="one"><xliff:g>%1$d</xliff:g> tarxeta (<xliff:g id="archivedCount">%2$d</xliff:g> arquivada)</item>
|
||||||
|
<item quantity="other"><xliff:g>%1$d</xliff:g> tarxetas (<xliff:g id="archivedCount">%2$d</xliff:g> arquivadas)</item>
|
||||||
|
</plurals>
|
||||||
|
<string name="previousCard">Anterior</string>
|
||||||
|
<string name="nextCard">Seguinte</string>
|
||||||
|
<string name="failedToOpenUrl">Primeiro instala un navegador web</string>
|
||||||
|
<string name="welcome">Ben vida a Catima</string>
|
||||||
|
<string name="updateBalanceTitle">Canto gastaches ou recibiches?</string>
|
||||||
|
<string name="updateBalanceHint">Escribe a cantidade</string>
|
||||||
|
<string name="currentBalanceSentence">Saldo actual: <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="newBalanceSentence">Novo saldo: <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="anyDate">Calquera data</string>
|
||||||
|
<string name="chooseValidFromDate">Elixe data de inicio válida</string>
|
||||||
|
<string name="validFromSentence">Válida desde: <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="height">Alto:</string>
|
||||||
|
<string name="switchToFrontImage">Cambiar á imaxe frontal</string>
|
||||||
|
<string name="switchToBackImage">Cambiar á imaxe posterior</string>
|
||||||
|
<string name="openFrontImageInGalleryApp">Abrir imaxe frontal na app de galería</string>
|
||||||
|
<string name="openBackImageInGalleryApp">Abrir imaxe posterior na app de galería</string>
|
||||||
|
<string name="setBarcodeHeight">Establecer altura do código de barras</string>
|
||||||
|
<string name="icon_header_click_text">Pulsación longa para editar a miniatura</string>
|
||||||
|
<string name="show_name_below_image_thumbnail">Mostrar nome debaixo da miniatura</string>
|
||||||
|
<string name="show_note">Ver nota</string>
|
||||||
|
<string name="show_balance">Ver saldo</string>
|
||||||
|
<string name="settings_category_title_cards">Vista de tarxeta</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Vista xeral de tarxetas</string>
|
||||||
|
<string name="settings_column_count_portrait">Columnas no modo retrato</string>
|
||||||
|
<string name="settings_automatic_column_count">Automático</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_category_title_general">Xeral</string>
|
||||||
|
<string name="settings_category_title_privacy">Privacidade</string>
|
||||||
|
<string name="action_display_options">Opcións ao mostrar</string>
|
||||||
|
<string name="show_archived_cards">Mostrar tarxetas arquivadas</string>
|
||||||
|
<string name="view_online">Ver en liña</string>
|
||||||
|
<string name="action_more_options">Máis opcións</string>
|
||||||
|
<string name="addWithoutBarcode">Engadir unha tarxeta sen código de barras</string>
|
||||||
|
<string name="enter_card_id">Escribe o número ID ou texto na túa tarxeta</string>
|
||||||
|
<string name="card_id_must_not_be_empty">O ID da tarxeta non pode estar baleiro</string>
|
||||||
|
<string name="add_a_card_in_a_different_way">Engadir unha tarxeta doutro xeito</string>
|
||||||
|
<string name="field_must_not_be_empty">O campo non pode quedar baleiro</string>
|
||||||
|
<string name="manually_enter_barcode_instructions">Escribe o número ID ou texto na túa tarxeta e preme no código de barras que se pareza ao da túa tarxeta.</string>
|
||||||
|
<string name="add_manually_warning_title">Recomendamos escanear</string>
|
||||||
|
<string name="add_manually_warning_message">Nalgunhas tendas o código de barras é diferente ao número escrito na tarxeta. Debido a isto escribir o código de barras manualmente non sempre funciona. Recomendamos que escanees o código de barras coa cámara. Queres continuar igualmente?</string>
|
||||||
|
<string name="continue_">Continuar</string>
|
||||||
|
<string name="spend">Gastar</string>
|
||||||
|
<string name="receive">Recibir</string>
|
||||||
|
<string name="amountParsingFailed">Cantidade non válida</string>
|
||||||
|
<string name="failedLaunchingFileManager">Non se atopa un xestor de ficheiros compatible</string>
|
||||||
|
<string name="multipleBarcodesFoundPleaseChooseOne">Cal destes códigos de barras atopados queres usar?</string>
|
||||||
|
<string name="pageWithNumber">Páxina <xliff:g>%d</xliff:g></string>
|
||||||
|
<string name="noCameraFoundGuideText">Parece que o teu dispositivo non ten cámara. Se a ten, intenta reiniciar o dispositivo. Se non, usa o botón inferior de Máis Opcións para engadir o código de barras doutro xeito.</string>
|
||||||
|
<string name="importCancelled">Cancelouse a importación</string>
|
||||||
|
<string name="exportCancelled">Cancelouse a exportación</string>
|
||||||
|
<string name="useFrontImage">Usar imaxe frontal</string>
|
||||||
|
<string name="useBackImage">Usar imaxe posterior</string>
|
||||||
|
<plurals name="selectedCardCount">
|
||||||
|
<item quantity="one"><xliff:g>%d</xliff:g> seleccionado</item>
|
||||||
|
<item quantity="other"><xliff:g>%d</xliff:g> seleccionados</item>
|
||||||
|
</plurals>
|
||||||
|
<string name="action_search">Buscar</string>
|
||||||
|
<string name="note">Nota</string>
|
||||||
|
<string name="cardId">ID da tarxeta</string>
|
||||||
|
<string name="unstar">Retirar das favoritas</string>
|
||||||
|
<string name="deleteTitle">Eliminar tarxeta</string>
|
||||||
|
<plurals name="deleteCardsConfirmation">
|
||||||
|
<item quantity="one">Eliminar definitivamente <xliff:g>%d</xliff:g> tarxeta?</item>
|
||||||
|
<item quantity="other">Eliminar definitivamente as <xliff:g>%d</xliff:g> tarxetas?</item>
|
||||||
|
</plurals>
|
||||||
|
<string name="noCardExistsError">Non atopamos esa tarxeta</string>
|
||||||
|
<string name="settings_light_theme">Claro</string>
|
||||||
|
<string name="importOptionFilesystemButton">Desde sistema de ficheiros</string>
|
||||||
|
<string name="importOptionFilesystemExplanation">Elixe un ficheiro concreto no sistema de ficheiros.</string>
|
||||||
|
<string name="importOptionApplicationTitle">Usar outra app</string>
|
||||||
|
<string name="thumbnailDescription">Miniatura</string>
|
||||||
|
<string name="starImage">Estrela de favorita</string>
|
||||||
|
<string name="settings_system_theme">Sistema</string>
|
||||||
|
<string name="settings_follow_system_orientation">Seguir ao sistema</string>
|
||||||
|
<string name="settings_display_barcode_max_brightness_summary">Preciso para que algúns escáneres funcionen</string>
|
||||||
|
<string name="settings_keep_screen_on">Manter pantalla acendida</string>
|
||||||
|
<string name="settings_dark_theme">Escuro</string>
|
||||||
|
<string name="settings_card_orientation">Orientación da pantalla</string>
|
||||||
|
<string name="group_updated">Grupo actualizado</string>
|
||||||
|
<string name="all">Todo</string>
|
||||||
|
<string name="deleteConfirmationGroup">Eliminar grupo?</string>
|
||||||
|
<string name="failedOpeningFileManager">Primeiro instala un xestor de ficheiros.</string>
|
||||||
|
<string name="settings_locale">Idioma</string>
|
||||||
|
<string name="settings_blue_theme">Azul</string>
|
||||||
|
<string name="passwordRequired">Escribe o contrasinal</string>
|
||||||
|
<string name="exportPassword">Establece un contrasinal para protexer a exportación (optativo)</string>
|
||||||
|
<string name="exportPasswordHint">Escribe o contrasinal</string>
|
||||||
|
<string name="setIcon">Establecer miniatura</string>
|
||||||
|
<string name="failedLaunchingPhotoPicker">Non se atopa unha app de galería compatible</string>
|
||||||
|
<string name="importCards">Importar tarxetas</string>
|
||||||
|
<string name="validFromDate">Válida desde</string>
|
||||||
|
<string name="switchToBarcode">Cambiar ao código de barras</string>
|
||||||
|
<string name="donate">Doar</string>
|
||||||
|
<string name="show_validity">Ver validez</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_landscape">Columnas no modo paisaxe</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="addFromPdfFile">Elixe un ficheiro PDF</string>
|
||||||
|
<string name="errorReadingFile">Non se puido ler o ficheiro</string>
|
||||||
|
<string name="unsupportedFile">Este ficheiro non é compatible</string>
|
||||||
|
<string name="addFromPkpass">Selecciona un ficheiro Passbook (.pkpass)</string>
|
||||||
|
<string name="generic_error_please_retry">Sentímolo, pero algo fallou, inténtao outra vez…</string>
|
||||||
|
</resources>
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
</plurals>
|
</plurals>
|
||||||
<string name="noCardsMessage">Először adjon hozzá egy kártyát</string>
|
<string name="noCardsMessage">Először adjon hozzá egy kártyát</string>
|
||||||
<string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string>
|
<string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string>
|
||||||
<string name="noMatchingGiftCards">Nincs találaat. Próbálja módosítani a keresést.</string>
|
<string name="noMatchingGiftCards">Nincs találat. Próbálja módosítani a keresést.</string>
|
||||||
<string name="storeName">Név</string>
|
<string name="storeName">Név</string>
|
||||||
<string name="note">Feljegyzés</string>
|
<string name="note">Feljegyzés</string>
|
||||||
<string name="cardId">Kártyaazonosító</string>
|
<string name="cardId">Kártyaazonosító</string>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
<string name="confirm">Jóváhagyás</string>
|
<string name="confirm">Jóváhagyás</string>
|
||||||
<plurals name="deleteCardsTitle">
|
<plurals name="deleteCardsTitle">
|
||||||
<item quantity="one"><xliff:g>%d</xliff:g> kártya törlése</item>
|
<item quantity="one"><xliff:g>%d</xliff:g> kártya törlése</item>
|
||||||
<item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item>
|
<item quantity="other"><xliff:g>%d</xliff:g> kártya törlése</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="deleteConfirmation">Véglegesen törli a kártyát\?</string>
|
<string name="deleteConfirmation">Véglegesen törli a kártyát\?</string>
|
||||||
<string name="ok">Rendben</string>
|
<string name="ok">Rendben</string>
|
||||||
@@ -294,4 +294,8 @@
|
|||||||
<string name="settings_use_volume_keys_navigation_summary">A hangerőgombok használata a megjelenített kártya átváltásához</string>
|
<string name="settings_use_volume_keys_navigation_summary">A hangerőgombok használata a megjelenített kártya átváltásához</string>
|
||||||
<string name="useFrontImage">Elülső kép használata</string>
|
<string name="useFrontImage">Elülső kép használata</string>
|
||||||
<string name="useBackImage">Hátsó kép használata</string>
|
<string name="useBackImage">Hátsó kép használata</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Kártyák áttekintése</string>
|
||||||
|
<string name="settings_column_count_landscape">Oszlopok fekvő módban</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatikus</string>
|
||||||
|
<string name="settings_column_count_portrait">Oszlopok álló módban</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -288,4 +288,15 @@
|
|||||||
<string name="useBackImage">Gunakan gambar belakang</string>
|
<string name="useBackImage">Gunakan gambar belakang</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Ganti kartu menggunakan tombol volume</string>
|
<string name="settings_use_volume_keys_navigation">Ganti kartu menggunakan tombol volume</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Gunakan tombol volume untuk mengubah kartu mana yang ditampilkan</string>
|
<string name="settings_use_volume_keys_navigation_summary">Gunakan tombol volume untuk mengubah kartu mana yang ditampilkan</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Ikhtisar kartu</string>
|
||||||
|
<string name="settings_column_count_portrait">Kolom dalam mode potret</string>
|
||||||
|
<string name="settings_column_count_landscape">Kolom dalam mode lanskap</string>
|
||||||
|
<string name="settings_automatic_column_count">Otomatis</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -300,4 +300,18 @@
|
|||||||
<string name="useFrontImage">Usa l\'immagine anteriore</string>
|
<string name="useFrontImage">Usa l\'immagine anteriore</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Cambia carte con i pulsanti di volume</string>
|
<string name="settings_use_volume_keys_navigation">Cambia carte con i pulsanti di volume</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Utilizza i pulsanti di volume per modificare la carta visualizzata</string>
|
<string name="settings_use_volume_keys_navigation_summary">Utilizza i pulsanti di volume per modificare la carta visualizzata</string>
|
||||||
|
<string name="settings_column_count_portrait">Colonne in modalità verticale</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_landscape">Colonne in modalità orizzontale</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatico</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Panoramica delle carte</string>
|
||||||
|
<string name="unsupportedFile">Questo file non è supportato</string>
|
||||||
|
<string name="generic_error_please_retry">Siamo spiacenti, qualcosa è andato storto, riprova...</string>
|
||||||
|
<string name="addFromPkpass">Seleziona un file Passbook (.pkpass)</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
<string name="leaveWithoutSaveTitle">종료</string>
|
<string name="leaveWithoutSaveTitle">종료</string>
|
||||||
<string name="moveDown">아래로 이동</string>
|
<string name="moveDown">아래로 이동</string>
|
||||||
<string name="starImage">즐겨찾기 별</string>
|
<string name="starImage">즐겨찾기 별</string>
|
||||||
<string name="settings_display_barcode_max_brightness">바코드를 표시할 때 화면 밝기 높이기</string>
|
<string name="settings_display_barcode_max_brightness">화면 밝게하기</string>
|
||||||
<string name="deleteConfirmation">정말 이 카드를 삭제하시겠습니까\?</string>
|
<string name="deleteConfirmation">정말 이 카드를 삭제하시겠습니까\?</string>
|
||||||
<string name="deleteTitle">카드 삭제</string>
|
<string name="deleteTitle">카드 삭제</string>
|
||||||
<plurals name="deleteCardsTitle">
|
<plurals name="deleteCardsTitle">
|
||||||
@@ -216,7 +216,7 @@
|
|||||||
<string name="importCards">카드 가져오기</string>
|
<string name="importCards">카드 가져오기</string>
|
||||||
<string name="updateBalanceTitle">지출하거나 수령한 금액은 얼마입니까?</string>
|
<string name="updateBalanceTitle">지출하거나 수령한 금액은 얼마입니까?</string>
|
||||||
<string name="newBalanceSentence">새 잔액: <xliff:g>%s</xliff:g></string>
|
<string name="newBalanceSentence">새 잔액: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="settings_card_orientation">바코드 방향</string>
|
<string name="settings_card_orientation">화면 방향</string>
|
||||||
<string name="settings_follow_system_orientation">기기 설정 따르기</string>
|
<string name="settings_follow_system_orientation">기기 설정 따르기</string>
|
||||||
<string name="settings_portrait_orientation">세로</string>
|
<string name="settings_portrait_orientation">세로</string>
|
||||||
<string name="settings_landscape_orientation">가로</string>
|
<string name="settings_landscape_orientation">가로</string>
|
||||||
@@ -257,7 +257,7 @@
|
|||||||
<string name="settings_category_title_general">일반</string>
|
<string name="settings_category_title_general">일반</string>
|
||||||
<string name="action_display_options">디스플레이 옵션</string>
|
<string name="action_display_options">디스플레이 옵션</string>
|
||||||
<string name="settings_display_barcode_max_brightness_summary">스캐너가 작동하는 데 필요합니다</string>
|
<string name="settings_display_barcode_max_brightness_summary">스캐너가 작동하는 데 필요합니다</string>
|
||||||
<string name="settings_category_title_cards">카드</string>
|
<string name="settings_category_title_cards">카드 보기</string>
|
||||||
<string name="show_archived_cards">보관된 카드 표시</string>
|
<string name="show_archived_cards">보관된 카드 표시</string>
|
||||||
<string name="settings_category_title_privacy">프라이버시</string>
|
<string name="settings_category_title_privacy">프라이버시</string>
|
||||||
<string name="card_id_must_not_be_empty">카드 ID는 비어 있으면 안됩니다</string>
|
<string name="card_id_must_not_be_empty">카드 ID는 비어 있으면 안됩니다</string>
|
||||||
@@ -286,4 +286,20 @@
|
|||||||
<string name="exportCancelled">내보내기 취소됨</string>
|
<string name="exportCancelled">내보내기 취소됨</string>
|
||||||
<string name="useFrontImage">전면 이미지 사용</string>
|
<string name="useFrontImage">전면 이미지 사용</string>
|
||||||
<string name="useBackImage">후면 이미지 사용</string>
|
<string name="useBackImage">후면 이미지 사용</string>
|
||||||
|
<string name="addFromPkpass">Passbook 파일 선택하기 (.pkpass)</string>
|
||||||
|
<string name="generic_error_please_retry">죄송합니다, 문제가 발생했습니다. 다시 시도해 주세요...</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">볼륨 버튼을 사용하여 카드 전환하기</string>
|
||||||
|
<string name="unsupportedFile">이 파일은 지원되지 않습니다</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">볼륨 버튼을 사용하여 표시되는 카드를 변경합니다</string>
|
||||||
|
<string name="settings_category_title_cards_overview">카드 개요</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_column_count_portrait">세로 모드의 열</string>
|
||||||
|
<string name="settings_column_count_landscape">가로 모드의 열</string>
|
||||||
|
<string name="settings_automatic_column_count">자동</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -2,27 +2,27 @@
|
|||||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||||
<string name="action_search">Meklēt</string>
|
<string name="action_search">Meklēt</string>
|
||||||
<string name="action_add">Pievienot</string>
|
<string name="action_add">Pievienot</string>
|
||||||
<string name="noGiftCards">Noklikšķiniet uz pogas + plus, lai pievienotu karti, vai vispirms importējiet no ⋮ izvēlnes.</string>
|
<string name="noGiftCards">Klikšķināt pogu \"+\", lai pievienotu karti, vai ievietot no ⋮izvēlnes.</string>
|
||||||
<string name="noMatchingGiftCards">Nav rezultātu. Mēģiniet mainīt meklējamo tekstu.</string>
|
<string name="noMatchingGiftCards">Nekas netika atrasts. Jāmēģina mainīt savu vaicājumu.</string>
|
||||||
<string name="storeName">Nosaukums</string>
|
<string name="storeName">Nosaukums</string>
|
||||||
<string name="note">Piezīme</string>
|
<string name="note">Piezīme</string>
|
||||||
<string name="barcodeType">Svītrkoda tips</string>
|
<string name="barcodeType">Svītrkoda veids</string>
|
||||||
<string name="noBarcode">Nav svītrkoda</string>
|
<string name="noBarcode">Nav svītrkoda</string>
|
||||||
<string name="star">Pievienot izlasei</string>
|
<string name="star">Pievienot izlasei</string>
|
||||||
<string name="unstar">Noņemt no izlases</string>
|
<string name="unstar">Noņemt no izlases</string>
|
||||||
<string name="cancel">Atcelt</string>
|
<string name="cancel">Atcelt</string>
|
||||||
<string name="save">Saglabāt</string>
|
<string name="save">Saglabāt</string>
|
||||||
<string name="edit">Rediģēt</string>
|
<string name="edit">Labot</string>
|
||||||
<string name="delete">Dzēst</string>
|
<string name="delete">Dzēst</string>
|
||||||
<string name="moveBarcodeToTopOfScreen">Pārvietojiet svītrkodu uz ekrāna augšdaļu</string>
|
<string name="moveBarcodeToTopOfScreen">Pārvietot svītrkodu uz ekrāna augšdaļu</string>
|
||||||
<string name="errorReadingImage">Nevarēja nolasīt attēlu</string>
|
<string name="errorReadingImage">Nevarēja nolasīt attēlu</string>
|
||||||
<string name="balance">Bilance</string>
|
<string name="balance">Atlikums</string>
|
||||||
<string name="noBarcodeFound">Svītrkods netika atrasts</string>
|
<string name="noBarcodeFound">Svītrkods netika atrasts</string>
|
||||||
<string name="currency">Valūta</string>
|
<string name="currency">Valūta</string>
|
||||||
<string name="points">Punkti</string>
|
<string name="points">Punkti</string>
|
||||||
<string name="chooseImportType">Importēt datus no</string>
|
<string name="chooseImportType">Ievietot datus no</string>
|
||||||
<string name="sendLabel">Nosūtīt…</string>
|
<string name="sendLabel">Nosūtīt…</string>
|
||||||
<string name="editCardTitle">Rediģēt karti</string>
|
<string name="editCardTitle">Labot karti</string>
|
||||||
<string name="share">Kopīgot</string>
|
<string name="share">Kopīgot</string>
|
||||||
<string name="confirm">Apstiprināt</string>
|
<string name="confirm">Apstiprināt</string>
|
||||||
<string name="deleteTitle">Dzēst karti</string>
|
<string name="deleteTitle">Dzēst karti</string>
|
||||||
@@ -31,30 +31,30 @@
|
|||||||
<string name="addCardTitle">Pievienot karti</string>
|
<string name="addCardTitle">Pievienot karti</string>
|
||||||
<string name="scanCardBarcode">Skenēt svītrkodu</string>
|
<string name="scanCardBarcode">Skenēt svītrkodu</string>
|
||||||
<string name="cardShortcut">Kartes saīsne</string>
|
<string name="cardShortcut">Kartes saīsne</string>
|
||||||
<string name="noCardsMessage">Vispirms pievienojiet karti</string>
|
<string name="noCardsMessage">Vispirms jāpievieno karte</string>
|
||||||
<string name="noCardExistsError">Nevarēja atrast karti</string>
|
<string name="noCardExistsError">Nevarēja atrast karti</string>
|
||||||
<string name="failedParsingImportUriError">Nevarēja parsēt importa URI</string>
|
<string name="failedParsingImportUriError">Nevarēja apstrādāt ievietošanas URI</string>
|
||||||
<string name="importExport">Imports/Eksports</string>
|
<string name="importExport">Ievietot/izgūt</string>
|
||||||
<string name="exportName">Eksports</string>
|
<string name="exportName">Izgūt</string>
|
||||||
<string name="importExportHelp">Dublējot Jūsu datus, tos var pārnest uz citu ierīci.</string>
|
<string name="importExportHelp">Dublējot Jūsu datus, tos var pārnest uz citu ierīci.</string>
|
||||||
<string name="importSuccessfulTitle">Importēts</string>
|
<string name="importSuccessfulTitle">Ievietots</string>
|
||||||
<string name="importFailedTitle">Imports neizdevās</string>
|
<string name="importFailedTitle">Ievietošana neizdevās</string>
|
||||||
<string name="importFailed">Karšu importu nevarēja veikt</string>
|
<string name="importFailed">Nevarēja veikt ievietošanu</string>
|
||||||
<string name="exportSuccessfulTitle">Eksportēts</string>
|
<string name="exportSuccessfulTitle">Izgūts</string>
|
||||||
<string name="exportFailedTitle">Eksports neizdevās</string>
|
<string name="exportFailedTitle">Izguve neizdevās</string>
|
||||||
<string name="exportFailed">Kartes neizdevās eksportēt</string>
|
<string name="exportFailed">Nevarēja veikt izguvi</string>
|
||||||
<string name="importing">Importē…</string>
|
<string name="importing">Ievieto…</string>
|
||||||
<string name="exporting">Eksportē…</string>
|
<string name="exporting">Izgūst…</string>
|
||||||
<string name="exportOptionExplanation">Dati tiks saglabāti Jūsu izvēlētajā vietā.</string>
|
<string name="exportOptionExplanation">Dati tiks saglabāti izvēlētajā atrašanās vietā.</string>
|
||||||
<string name="importOptionFilesystemTitle">Imports no failu sistēmas</string>
|
<string name="importOptionFilesystemTitle">Ievietot no datņu sistēmas</string>
|
||||||
<string name="importOptionFilesystemExplanation">Izvēlieties konkrētu failu no failu sistēmas.</string>
|
<string name="importOptionFilesystemExplanation">Izvēlēties noteiktu datni datņu sistēmā.</string>
|
||||||
<string name="importOptionFilesystemButton">No failu sistēmas</string>
|
<string name="importOptionFilesystemButton">No datņu sistēmas</string>
|
||||||
<string name="importOptionApplicationTitle">Izmantojot citu lietotni</string>
|
<string name="importOptionApplicationTitle">Izmantot citu lietotni</string>
|
||||||
<string name="importOptionApplicationExplanation">Izmantojiet jebkuru lietotni vai savu iecienītāko failu pārvaldnieku, lai atvērtu failu.</string>
|
<string name="importOptionApplicationExplanation">Izmantot jebkuru lietotni vai savu iecienītāko datņu pārvaldnieku, lai atvērtu datni.</string>
|
||||||
<string name="importOptionApplicationButton">Ar citu lietotni</string>
|
<string name="importOptionApplicationButton">Izmantot citu lietotni</string>
|
||||||
<string name="about">Par</string>
|
<string name="about">Par</string>
|
||||||
<string name="app_license">Copyleft brīva un atvērta programmatūra, licencēta GPLv3+</string>
|
<string name="app_license">Copyleft brīva un atvērta programmatūra, licencēta GPLv3+</string>
|
||||||
<string name="selectBarcodeTitle">Izvēlieties svītrkodu</string>
|
<string name="selectBarcodeTitle">Atlasīt svītrkodu</string>
|
||||||
<string name="thumbnailDescription">Sīktēls</string>
|
<string name="thumbnailDescription">Sīktēls</string>
|
||||||
<string name="starImage">Izlases zvaigzne</string>
|
<string name="starImage">Izlases zvaigzne</string>
|
||||||
<string name="settings">Iestatījumi</string>
|
<string name="settings">Iestatījumi</string>
|
||||||
@@ -62,35 +62,35 @@
|
|||||||
<string name="settings_system_theme">Sistēmas</string>
|
<string name="settings_system_theme">Sistēmas</string>
|
||||||
<string name="settings_light_theme">Gaiša</string>
|
<string name="settings_light_theme">Gaiša</string>
|
||||||
<string name="settings_dark_theme">Tumša</string>
|
<string name="settings_dark_theme">Tumša</string>
|
||||||
<string name="settings_display_barcode_max_brightness">Izgaismot svītrkoda skatu</string>
|
<string name="settings_display_barcode_max_brightness">Izgaismot ekrānu</string>
|
||||||
<string name="settings_keep_screen_on">Turēt ekrānu ieslēgtu</string>
|
<string name="settings_keep_screen_on">Turēt ekrānu ieslēgtu</string>
|
||||||
<string name="settings_disable_lockscreen_while_viewing_card">Neļaut ekrānam aizslēgties</string>
|
<string name="settings_disable_lockscreen_while_viewing_card">Neļaut ekrānam aizslēgties</string>
|
||||||
<string name="intent_import_card_from_url_share_text">Es vēlos ar Jums kopīgot karti</string>
|
<string name="intent_import_card_from_url_share_text">Es vēlos ar Tevi kopīgot karti</string>
|
||||||
<string name="importSuccessful">Dati importēti</string>
|
<string name="importSuccessful">Dati ievietoti</string>
|
||||||
<string name="exportSuccessful">Dati eksportēti</string>
|
<string name="exportSuccessful">Dati izgūti</string>
|
||||||
<string name="noGroups">Spiediet uz \"+\" plus pogas, lai pievienotu grupas karšu kategorizēšanai.</string>
|
<string name="noGroups">Klikšķināt pogu \"+\", lai pievienotu kopas karšu apkopošanai.</string>
|
||||||
<string name="noGroupCards">Šī grupa ir tukša</string>
|
<string name="noGroupCards">Šī kopa ir tukša</string>
|
||||||
<string name="all">Visas</string>
|
<string name="all">Visas</string>
|
||||||
<string name="deleteConfirmationGroup">Dzēst grupu\?</string>
|
<string name="deleteConfirmationGroup">Izdzēst kopu?</string>
|
||||||
<string name="failedOpeningFileManager">Vispirms instalējiet failu pārvaldnieku.</string>
|
<string name="failedOpeningFileManager">Vispirms jāuzstāda datņu pārvaldnieks.</string>
|
||||||
<string name="moveUp">Pārvietot uz augšu</string>
|
<string name="moveUp">Pārvietot uz augšu</string>
|
||||||
<string name="moveDown">Pārvietot uz leju</string>
|
<string name="moveDown">Pārvietot uz leju</string>
|
||||||
<string name="leaveWithoutSaveTitle">Iziet</string>
|
<string name="leaveWithoutSaveTitle">Iziet</string>
|
||||||
<string name="leaveWithoutSaveConfirmation">Iziet nesaglabājot\?</string>
|
<string name="leaveWithoutSaveConfirmation">Iziet nesaglabājot\?</string>
|
||||||
<string name="addFromImage">Izvēlēties attēlu no galerijas</string>
|
<string name="addFromImage">Atlasīt attēlu no galerijas</string>
|
||||||
<string name="card">Karte</string>
|
<string name="card">Karte</string>
|
||||||
<string name="expiryDate">Derīguma termiņš</string>
|
<string name="expiryDate">Derīguma termiņš</string>
|
||||||
<string name="never">Nekad</string>
|
<string name="never">Nekad</string>
|
||||||
<string name="chooseExpiryDate">Izvēlieties derīguma termiņu</string>
|
<string name="chooseExpiryDate">Izvēlēties beigu datumu</string>
|
||||||
<string name="failedToRetrieveImageFile">Neizdevās ielādēt attēla failu</string>
|
<string name="failedToRetrieveImageFile">Neizdevās iegūt attēla datni</string>
|
||||||
<string name="barcodeLongPressMessage">Galerijas lietotnē var atvērt tikai attēlus</string>
|
<string name="barcodeLongPressMessage">Galerijas lietotnē var atvērt tikai attēlus</string>
|
||||||
<string name="sort_by_expiry">Derīguma termiņš</string>
|
<string name="sort_by_expiry">Derīguma termiņš</string>
|
||||||
<string name="reverse">...apgrieztā secībā</string>
|
<string name="reverse">...apgrieztā secībā</string>
|
||||||
<string name="credits">Pateicības</string>
|
<string name="credits">Pateicības</string>
|
||||||
<string name="shortcutSelectCard">Izvēlieties karti</string>
|
<string name="shortcutSelectCard">Atlasīt karti</string>
|
||||||
<string name="duplicateCard">Dublēt</string>
|
<string name="duplicateCard">Dublēt</string>
|
||||||
<string name="archive">Arhivēt</string>
|
<string name="archive">Arhivēt</string>
|
||||||
<string name="translate_platform">vietnē Weblate</string>
|
<string name="translate_platform">Weblate</string>
|
||||||
<string name="starred">Izlase</string>
|
<string name="starred">Izlase</string>
|
||||||
<string name="cardId">Kartes numurs</string>
|
<string name="cardId">Kartes numurs</string>
|
||||||
<plurals name="deleteCardsConfirmation">
|
<plurals name="deleteCardsConfirmation">
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
</plurals>
|
</plurals>
|
||||||
<string name="about_title_fmt">Par <xliff:g id="app_name">%s</xliff:g></string>
|
<string name="about_title_fmt">Par <xliff:g id="app_name">%s</xliff:g></string>
|
||||||
<string name="expiryStateSentenceExpired">Derīguma termiņš beidzās: <xliff:g>%s</xliff:g></string>
|
<string name="expiryStateSentenceExpired">Derīguma termiņš beidzās: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="selectColor">Izvēlieties krāsu</string>
|
<string name="selectColor">Atlasīt krāsu</string>
|
||||||
<string name="settings_catima_theme">Catima</string>
|
<string name="settings_catima_theme">Catima</string>
|
||||||
<string name="settings_pink_theme">Rozā</string>
|
<string name="settings_pink_theme">Rozā</string>
|
||||||
<string name="settings_magenta_theme">Purpura</string>
|
<string name="settings_magenta_theme">Purpura</string>
|
||||||
@@ -108,32 +108,30 @@
|
|||||||
<string name="settings_green_theme">Zaļa</string>
|
<string name="settings_green_theme">Zaļa</string>
|
||||||
<string name="sort_by_name">Nosaukums</string>
|
<string name="sort_by_name">Nosaukums</string>
|
||||||
<string name="on_google_play">pakalpojumā Google Play</string>
|
<string name="on_google_play">pakalpojumā Google Play</string>
|
||||||
<string name="report_error">Ziņojiet par kļūdu</string>
|
<string name="report_error">Ziņot par kļūdu</string>
|
||||||
<plurals name="balancePoints">
|
<plurals name="balancePoints">
|
||||||
<item quantity="zero"><xliff:g>%s</xliff:g> punkti</item>
|
<item quantity="zero"><xliff:g>%s</xliff:g> punkti</item>
|
||||||
<item quantity="one"><xliff:g>%s</xliff:g> punkts</item>
|
<item quantity="one"><xliff:g>%s</xliff:g> punkts</item>
|
||||||
<item quantity="other"><xliff:g>%s</xliff:g> punkti</item>
|
<item quantity="other"><xliff:g>%s</xliff:g> punkti</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||||
<string name="importCatimaMessage">Izvēlieties jūstu <i>catima.zip</i> failu importam.
|
<string name="importCatimaMessage">Jāatlasa sava <i>catima.zip</i> izguves datne no Catima, lai ievietotu. \nTo var izveidot citā ierīcē esošas Catima lietotnes sadaļā \"Ievietot/izgūt\" spiežot \"Izgūt\".</string>
|
||||||
\nFailu var izveidot eksportējot datus no Catima lietotnes citā ierīce, sadaļā \"Imports/Eksports\".</string>
|
<string name="importLoyaltyCardKeychainMessage">Jāatlasa sava <i>LoyaltyCardKeychain.csv</i> izguves datne no Loyalty Card Keychain, lai ievietotu. \nTo var izveidot Loyalty Card Keychain sadaļā \"Import/Export\" spiežot \"Export\".</string>
|
||||||
<string name="importLoyaltyCardKeychainMessage">Importam izvēlieties Jūsu <i>LoyaltyCardKeychain.csv</i> eksporta failu no Loyalty Card Keychain.
|
|
||||||
\nFailu var izveidot \"Imports/Eksports\" izvēlnē Loyalty Card Keychain lietotnē, spiežot \"Eksportēt\".</string>
|
|
||||||
<string name="removeImage">Noņemt attēlu</string>
|
<string name="removeImage">Noņemt attēlu</string>
|
||||||
<string name="exportPasswordHint">Ievadiet paroli</string>
|
<string name="exportPasswordHint">Ievadīt paroli</string>
|
||||||
<string name="on_github">vietnē GitHub</string>
|
<string name="on_github">GitHub</string>
|
||||||
<string name="settings_locale">Valoda</string>
|
<string name="settings_locale">Valoda</string>
|
||||||
<string name="failedGeneratingShareURL">Nevarēja izveidot koplietojamu URL. Lūdzu, ziņojiet par šo kļūdu.</string>
|
<string name="failedGeneratingShareURL">Nevarēja izveidot kopīgojamu URL. Lūgums ziņot par šo.</string>
|
||||||
<string name="turn_flashlight_off">Izslēgt zibspuldzi</string>
|
<string name="turn_flashlight_off">Izslēgt zibspuldzi</string>
|
||||||
<string name="app_contributors">To padarīja iespējamu: <xliff:g id="app_contributors">%s</xliff:g></string>
|
<string name="app_contributors">To padarīja iespējamu: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||||
<string name="version_history">Versiju vēsture</string>
|
<string name="version_history">Versiju vēsture</string>
|
||||||
<string name="sort_by">Kārtot pēc</string>
|
<string name="sort_by">Kārtot pēc</string>
|
||||||
<string name="help_translate_this_app">Palīdziet tulkot šo lietotni</string>
|
<string name="help_translate_this_app">Palīdzi tulkot šo lietotni</string>
|
||||||
<string name="and_data_usage">un datu lietojums</string>
|
<string name="and_data_usage">un datu lietojums</string>
|
||||||
<string name="license">Licence</string>
|
<string name="license">Licence</string>
|
||||||
<string name="source_repository">Pirmkods</string>
|
<string name="source_repository">Pirmkods</string>
|
||||||
<string name="rate_this_app">Novērtējiet šo lietotni</string>
|
<string name="rate_this_app">Novērtēt šo lietotni</string>
|
||||||
<string name="noGiftCardsGroup">Izveidojiet kartes, un pēc tam šeit pievienojiet tās grupai.</string>
|
<string name="noGiftCardsGroup">Izveido kādas kartes, tad šeit pievieno tās kopai.</string>
|
||||||
<string name="options">Parametri</string>
|
<string name="options">Parametri</string>
|
||||||
<plurals name="groupCardCount">
|
<plurals name="groupCardCount">
|
||||||
<item quantity="zero"><xliff:g>%d</xliff:g> kartes</item>
|
<item quantity="zero"><xliff:g>%d</xliff:g> kartes</item>
|
||||||
@@ -150,11 +148,11 @@
|
|||||||
<string name="yes">Jā</string>
|
<string name="yes">Jā</string>
|
||||||
<string name="no">Nē</string>
|
<string name="no">Nē</string>
|
||||||
<string name="settings_system_locale">Sistēmas</string>
|
<string name="settings_system_locale">Sistēmas</string>
|
||||||
<string name="include_if_asking_support">Ja vēlaties lūgt atbalstu, lūdzu iekļaujiet sekojošo informāciju:</string>
|
<string name="include_if_asking_support">Ja vēlies lūgt atbalstu, jāiekļauj sekojošā informācija:</string>
|
||||||
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> svītrkoda attēls</string>
|
<string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> svītrkoda attēls</string>
|
||||||
<string name="privacy_policy">Privātuma politika</string>
|
<string name="privacy_policy">Privātuma politika</string>
|
||||||
<string name="accept">Apstiprināt</string>
|
<string name="accept">Pieņemt</string>
|
||||||
<string name="editGroup">Grupas rediģēšana: <xliff:g>%s</xliff:g></string>
|
<string name="editGroup">Kopas labošana: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="settings_brown_theme">Brūna</string>
|
<string name="settings_brown_theme">Brūna</string>
|
||||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autortiesības © 2019–<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autortiesības © 2019–<xliff:g>%d</xliff:g> Sylvia van Os</string>
|
||||||
<string name="app_copyright_old">Balstīta uz Loyalty Card Keychain
|
<string name="app_copyright_old">Balstīta uz Loyalty Card Keychain
|
||||||
@@ -162,56 +160,53 @@
|
|||||||
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
|
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
|
||||||
<string name="app_libraries">Brīvas trešo pušu programmatūras bibliotēkas: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
<string name="app_libraries">Brīvas trešo pušu programmatūras bibliotēkas: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||||
<string name="app_resources">Brīvi trešo pušu resursi: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
<string name="app_resources">Brīvi trešo pušu resursi: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||||
<string name="settings_card_orientation">Svītrkoda orientācija</string>
|
<string name="settings_card_orientation">Ekrāna novietojums</string>
|
||||||
<string name="settings_follow_system_orientation">Pēc sistēmas</string>
|
<string name="settings_follow_system_orientation">Pēc sistēmas</string>
|
||||||
<string name="settings_portrait_orientation">Portreta</string>
|
<string name="settings_portrait_orientation">Portreta</string>
|
||||||
<string name="settings_landscape_orientation">Ainavas</string>
|
<string name="settings_landscape_orientation">Ainavas</string>
|
||||||
<string name="settings_lock_on_opening_orientation">Ievērot to orientāciju, kādā karte atvērta</string>
|
<string name="settings_lock_on_opening_orientation">Ievērot to orientāciju, kādā karte atvērta</string>
|
||||||
<string name="enter_group_name">Ievadiet grupas nosaukumu</string>
|
<string name="enter_group_name">Ievadīt kopas nosaukumu</string>
|
||||||
<string name="groups">Grupas</string>
|
<string name="groups">Kopas</string>
|
||||||
<string name="group_edit">Rediģēt grupu</string>
|
<string name="group_edit">Labot kopu</string>
|
||||||
<string name="group_name_already_in_use">Jau ir grupa ar šādu nosaukumu</string>
|
<string name="group_name_already_in_use">Kopas nosaukums jau tiek izmantots</string>
|
||||||
<string name="group_name_is_empty">Grupas nosaukums nevar būt tukšs</string>
|
<string name="group_name_is_empty">Kopas nosaukums nedrīkst būt tukšs</string>
|
||||||
<string name="group_updated">Grupa atjaunināta</string>
|
<string name="group_updated">Kopa atjaunināta</string>
|
||||||
<string name="addManually">Ievadīt numuru manuāli</string>
|
<string name="addManually">Pašrocīgi ievadīt svītrkodu</string>
|
||||||
<string name="groupsList">Grupas: <xliff:g>%s</xliff:g></string>
|
<string name="groupsList">Kopas: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="expiryStateSentence">Derīguma termiņš: <xliff:g>%s</xliff:g></string>
|
<string name="expiryStateSentence">Derīguma termiņš: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="balanceSentence">Bilance: <xliff:g>%s</xliff:g></string>
|
<string name="balanceSentence">Atlikums: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="editBarcode">Rediģēt svītrkodu</string>
|
<string name="editBarcode">Labot svītrkodu</string>
|
||||||
<string name="importCatima">Importēt no Catima</string>
|
<string name="importCatima">Ievietot no Catima</string>
|
||||||
<string name="importFidme">Importēt no FidMe</string>
|
<string name="importFidme">Ievietot no FidMe</string>
|
||||||
<string name="importFidmeMessage">Importam izvēlieties Jūsu <i>fidme-export-request-xxxxxx.zip</i> FidMe eksportēto failu, un pēc tam manuāli precizējiet svītrkodu tipus.
|
<string name="importFidmeMessage">Jāatlasa sava <i>fidme-export-request-xxxxxx.zip</i> izguves datne no FidMe, lai ievietotu, un pēc tam pašrocīgi jāatlasa svītrkodu veidi. \nTo var izveidot savā FidMe profila sadaļā \"Data Protection\" spiežot \"Extract my data\".</string>
|
||||||
\nFailu var izveidot Jūsu FidMe profilā, ejot uz \"Data Protection\" un spiežot \"Extract my data\".</string>
|
<string name="importLoyaltyCardKeychain">Ievietot no Loyalty Card Keychain</string>
|
||||||
<string name="importLoyaltyCardKeychain">Importēt no Loyalty Card Keychain</string>
|
<string name="importStocard">Ievietot no Stocard</string>
|
||||||
<string name="importStocard">Importēt no Stocard</string>
|
<string name="importStocardMessage">Jāatlasa sava <i>***.zip</i> izguves datne no Stocard, lai ievietotu. \nTo var iegūt, ja nosūta lūgumu izgūt savus datus uz e-pasta adresi support@stocardapp.com.</string>
|
||||||
<string name="importStocardMessage">Importam izvēlieties Jūsu <i>***.zip</i> eksporta failu no Stocard.
|
<string name="importVoucherVault">Ievietot no Voucher Vault</string>
|
||||||
\nFailu var iegūt sūtot e-pastu uz support@stocardapp.com ar pieprasījumu eksportēt Jūsu datus.</string>
|
<string name="importVoucherVaultMessage">Jāatlasa sava <i>vouchervaldt.json</i> izguves datne no Voucher Vault, lai ievietotu. \nTo var izveidot spiežot \"Export\" Voucher Vault.</string>
|
||||||
<string name="importVoucherVault">Importēt no Voucher Vault</string>
|
|
||||||
<string name="importVoucherVaultMessage">Importam izvēlieties Jūsu <i>vouchervault.json</i> failu no Voucher Vault.
|
|
||||||
\nFailu var izveidot spiežot \"Eksportēt\" Voucher Vault lietotnē.</string>
|
|
||||||
<string name="barcodeId">Svītrkoda vērtība</string>
|
<string name="barcodeId">Svītrkoda vērtība</string>
|
||||||
<string name="sameAsCardId">Tāpat kā numurs</string>
|
<string name="sameAsCardId">Tāpat kā numurs</string>
|
||||||
<string name="setBarcodeId">Norādiet svītrkoda vērtību</string>
|
<string name="setBarcodeId">Ievadīt svītrkoda vērtību</string>
|
||||||
<string name="unsupportedBarcodeType">Šo svītrkoda tipu pagaidām nav iespējams attēlot. Iespējams, nākotnē tas tiks atbalstīts vēlākā lietotnes versijā.</string>
|
<string name="unsupportedBarcodeType">Šo svītrkoda veidu pagaidām nav iespējams attēlot. Tas nākotnē varbūt tiks atbalstīts jaunākā lietotnes versijā.</string>
|
||||||
<string name="wrongValueForBarcodeType">Šī vērtība nav derīga izvēlētajam svītrkoda tipam</string>
|
<string name="wrongValueForBarcodeType">Šī vērtība nav derīga atlasītajam svītrkoda veidam</string>
|
||||||
<string name="intent_import_card_from_url_share_multiple_text">Vēlos koplietot kartes</string>
|
<string name="intent_import_card_from_url_share_multiple_text">Vēlos ar Tevi kopīgot dažas kartes</string>
|
||||||
<string name="frontImageDescription">Priekšas attēls</string>
|
<string name="frontImageDescription">Priekšas attēls</string>
|
||||||
<string name="backImageDescription">Aizmugures attēls</string>
|
<string name="backImageDescription">Aizmugures attēls</string>
|
||||||
<string name="photos">Foto</string>
|
<string name="photos">Foto</string>
|
||||||
<string name="setFrontImage">Iestatīt priekšas attēlu</string>
|
<string name="setFrontImage">Iestatīt priekšas attēlu</string>
|
||||||
<string name="setBackImage">Iestatīt aizmugures attēlu</string>
|
<string name="setBackImage">Iestatīt aizmugures attēlu</string>
|
||||||
<string name="takePhoto">Fotografēt</string>
|
<string name="takePhoto">Fotografēt</string>
|
||||||
<string name="passwordRequired">Ievadiet paroli</string>
|
<string name="passwordRequired">Lūgums ievadīt paroli</string>
|
||||||
<string name="exportPassword">Iestatiet paroli, lai aizsargātu eksporta failu (nav obligāti)</string>
|
<string name="exportPassword">Iestatīt paroli, lai aizsargātu savu izguves datni (izvēles)</string>
|
||||||
<string name="turn_flashlight_on">Ieslēgt zibspuldzi</string>
|
<string name="turn_flashlight_on">Ieslēgt zibspuldzi</string>
|
||||||
<string name="settings_oled_dark">Tīri melns fons tumšajai tēmai</string>
|
<string name="settings_oled_dark">Tīri melns fons tumšajai tēmai</string>
|
||||||
<string name="setIcon">Iestatīt ikonu</string>
|
<string name="setIcon">Iestatīt sīktēlu</string>
|
||||||
<string name="settings_theme_color">Tēmas krāsa</string>
|
<string name="settings_theme_color">Tēmas krāsa</string>
|
||||||
<string name="settings_violet_theme">Violeta</string>
|
<string name="settings_violet_theme">Violeta</string>
|
||||||
<string name="settings_blue_theme">Zila</string>
|
<string name="settings_blue_theme">Zila</string>
|
||||||
<string name="sort">Kārtot</string>
|
<string name="sort">Kārtot</string>
|
||||||
<string name="showMoreInfo">Rādīt informāciju</string>
|
<string name="showMoreInfo">Rādīt informāciju</string>
|
||||||
<string name="sort_by_most_recently_used">Nesen lietotās</string>
|
<string name="sort_by_most_recently_used">Visnesenāk izmantotās</string>
|
||||||
<string name="unarchive">Atarhivēt</string>
|
<string name="unarchive">Atarhivēt</string>
|
||||||
<string name="archived">Karte arhivēta</string>
|
<string name="archived">Karte arhivēta</string>
|
||||||
<string name="unarchived">Karte atarhivēta</string>
|
<string name="unarchived">Karte atarhivēta</string>
|
||||||
@@ -223,16 +218,95 @@
|
|||||||
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> arhivēta)</item>
|
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> arhivēta)</item>
|
||||||
<item quantity="other"><xliff:g>%1$d</xliff:g> cards (<xliff:g id="archivedCount">%2$d</xliff:g> arhivētas)</item>
|
<item quantity="other"><xliff:g>%1$d</xliff:g> cards (<xliff:g id="archivedCount">%2$d</xliff:g> arhivētas)</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="failedToOpenUrl">Vispirms nepieciešams uzstādīt interneta pārlūku</string>
|
<string name="failedToOpenUrl">Vispirms nepieciešams uzstādīt pārlūku</string>
|
||||||
<string name="welcome">Laipni lūgti Catima</string>
|
<string name="welcome">Laipni lūdzam Catima</string>
|
||||||
<string name="cameraPermissionRequired">Ir nepieciešama pieeja kamerai lai veiktu šo darbību</string>
|
<string name="cameraPermissionRequired">Šai darbībai ir nepieciešama atļauja piekļūt kamerai…</string>
|
||||||
<string name="noCameraPermissionDirectToSystemSetting">Lai skanētu svītrkods, Catima ir nepieciešama pieeja jūsu kamerai. Nospied šeit lai nomainītu atļaujas iestatījumus.</string>
|
<string name="noCameraPermissionDirectToSystemSetting">Lai nolasītu svītrkodus, Catima būs nepieciešama piekļuve kamerai. Piesist šeit, lai mainītu savus atļauju iestatījumus.</string>
|
||||||
<string name="cameraPermissionDeniedTitle">Nevar pievienieties kamerai</string>
|
<string name="cameraPermissionDeniedTitle">Nevarēja piekļūt kamerai</string>
|
||||||
<string name="updateBalance">Atjaunināta bilance</string>
|
<string name="updateBalance">Atjaunināt atlikumu</string>
|
||||||
<string name="updateBalanceTitle">Cik daudz Tu iztērēji?</string>
|
<string name="updateBalanceTitle">Cik daudz iztērēji vai saņēmi?</string>
|
||||||
<string name="updateBalanceHint">Ievadi summu</string>
|
<string name="updateBalanceHint">Ievadīt summu</string>
|
||||||
<string name="currentBalanceSentence">Šābrīža bilance: <xliff:g>%s</xliff:g></string>
|
<string name="currentBalanceSentence">Pašreizējais atlikums: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="newBalanceSentence">Jauna bilance: <xliff:g>%s</xliff:g></string>
|
<string name="newBalanceSentence">Jaunais atlikums: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="storageReadPermissionRequired">Atļauja lasīt noliktavu ir nepieciešama šai darbībai…</string>
|
<string name="storageReadPermissionRequired">Atļauja lasīt noliktavu ir nepieciešama šai darbībai…</string>
|
||||||
<string name="importCards">Importēt kartes</string>
|
<string name="importCards">Ievietot kartes</string>
|
||||||
|
<string name="settings_oled_dark_summary">Samazina akumulatora lietojumu OLED ekrāniem</string>
|
||||||
|
<string name="icon_header_click_text">Ilgi piespiest, lai labotu sīktēlu</string>
|
||||||
|
<string name="anyDate">Jebkurš datums</string>
|
||||||
|
<string name="height">Augstums:</string>
|
||||||
|
<string name="openBackImageInGalleryApp">Atvērt aizmugures attēlu galerijas lietotnē</string>
|
||||||
|
<string name="donate">Ziedot</string>
|
||||||
|
<string name="field_must_not_be_empty">Lauks nedrīkst būt tukšs</string>
|
||||||
|
<string name="card_id_must_not_be_empty">Kartes identifikators nedrīkst būt tukšs</string>
|
||||||
|
<string name="add_a_card_in_a_different_way">Pievienot karti citā veidā</string>
|
||||||
|
<string name="add_manually_warning_message">Dažiem veikaliem svītrkoda vērtība atšķiras no numura, kas ir rakstīts uz kartes. Šī iemesla dēļ pašrocīgi ievadīts svītrkods ne vienmēr var darboties. Ir ļoti ieteicams nolasīt svītrkodu ar kameru. Vai joprojām turpināt?</string>
|
||||||
|
<string name="noCameraFoundGuideText">Šķiet, ka ierīcei nav kameras. Ja tā tomēr ir, jāmēģina pārsāknēt ierīci. Pretējā gadījumā jāizmanto zemāk esošā poga \"Vairāk iespēju\", lai pievienot svītrkodu citā veidā.</string>
|
||||||
|
<string name="settings_allow_content_provider_read_title">Ļaut citām lietotnēm piekļūt maniem datiem</string>
|
||||||
|
<string name="settings_allow_content_provider_read_summary">Lietotnēm joprojām būs jāpieprasa atļauja, lai nodrošinātu piekļuvi</string>
|
||||||
|
<string name="openFrontImageInGalleryApp">Atvērt priekšas attēlu galerijas lietotnē</string>
|
||||||
|
<string name="show_note">Rādīt piezīmi</string>
|
||||||
|
<string name="show_balance">Rādīt atlikumu</string>
|
||||||
|
<string name="settings_category_title_privacy">Privātums</string>
|
||||||
|
<string name="show_archived_cards">Rādīt arhivētās kartes</string>
|
||||||
|
<string name="view_online">Skatīt tiešsaistē</string>
|
||||||
|
<string name="action_display_options">Attēlošanas iespējas</string>
|
||||||
|
<string name="validFromSentence">Derīga no: <xliff:g>%s</xliff:g></string>
|
||||||
|
<string name="switchToBackImage">Pārslēgties uz aizmugures attēlu</string>
|
||||||
|
<string name="switchToBarcode">Pārslēgties uz svītrkodu</string>
|
||||||
|
<string name="add_manually_warning_title">Nolasīšana ir ieteicama</string>
|
||||||
|
<string name="settings_display_barcode_max_brightness_summary">Nepieciešams, lai darbotos atsevišķi nolasītāji</string>
|
||||||
|
<string name="importCancelled">Ievietošana atcelta</string>
|
||||||
|
<string name="permissionReadCardsLabel">Lasīt Catima kartes</string>
|
||||||
|
<string name="permissionReadCardsDescription">lasīt Catima kartes un to informāciju, tajā skaitā piezīmes un attēlus</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">Izmantot skaļuma pogas, lai mainītu, kura karte tiek attēlota</string>
|
||||||
|
<string name="chooseValidFromDate">Izvēlēties \"Derīga no\" datumu</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Karšu pārskats</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_automatic_column_count">Automātiski</string>
|
||||||
|
<plurals name="selectedCardCount">
|
||||||
|
<item quantity="zero">atlasītas <xliff:g>%d</xliff:g></item>
|
||||||
|
<item quantity="one">atlasīta <xliff:g>%d</xliff:g></item>
|
||||||
|
<item quantity="other">atlasītas <xliff:g>%d</xliff:g></item>
|
||||||
|
</plurals>
|
||||||
|
<string name="app_copyright_short">Autortiesības © Sylvia van Os un līdzdalībnieki</string>
|
||||||
|
<string name="settings_category_title_cards">Kartes skats</string>
|
||||||
|
<string name="settings_category_title_general">Vispārīgi</string>
|
||||||
|
<string name="errorReadingFile">Nevarēja nolasīt datni</string>
|
||||||
|
<string name="failedLaunchingFileManager">Nevarēja atrast atbalstītu datņu pārvaldnieku</string>
|
||||||
|
<string name="multipleBarcodesFoundPleaseChooseOne">Kuru no atrastajiem svītrkodiem izmantot?</string>
|
||||||
|
<string name="pageWithNumber"><xliff:g>%d</xliff:g>. lapa</string>
|
||||||
|
<string name="spend">Tērēt</string>
|
||||||
|
<string name="receive">Saņemt</string>
|
||||||
|
<string name="amountParsingFailed">Nederīga summa</string>
|
||||||
|
<string name="settings_follow_sensor_orientation">Vienmēr pagriezt (neņem vērā sistēmas iestatījumus)</string>
|
||||||
|
<string name="validFromDate">Derīga no</string>
|
||||||
|
<string name="setBarcodeHeight">Iestatīt svītrkoda augstumu</string>
|
||||||
|
<string name="switchToFrontImage">Pārslēgties uz priekšas attēlu</string>
|
||||||
|
<string name="show_validity">Rādīt derīgumu</string>
|
||||||
|
<string name="app_name">Catima</string>
|
||||||
|
<string name="settings_keep_screen_on_summary">Atspējo ekrāna noildzi kartes skatīšanas laikā</string>
|
||||||
|
<string name="settings_disable_lockscreen_while_viewing_card_summary">Atspējo ekrāna aizslēgšanu kartes skatīšanas laikā</string>
|
||||||
|
<string name="useFrontImage">Izmantot priekšas attēlu</string>
|
||||||
|
<string name="useBackImage">Izmantot aizmugures attēlu</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">Pārslēgt kartes ar skaļuma pogām</string>
|
||||||
|
<string name="balanceParsingFailed">Nederīgs atlikums</string>
|
||||||
|
<string name="show_name_below_image_thumbnail">Rādīt vārdu zem sīktēla</string>
|
||||||
|
<string name="action_more_options">Vairāk iespēju</string>
|
||||||
|
<string name="addWithoutBarcode">Pievienot karti bez svītrkoda</string>
|
||||||
|
<string name="enter_card_id">Ievadīt uz kartes esošu identifikatoru vai tekstu</string>
|
||||||
|
<string name="manually_enter_barcode_instructions">Jāievada uz kartes esošs identifikators vai teksts un jāspiež uz svītrkoda, kas izskatās kā tas, kas ir uz kartes.</string>
|
||||||
|
<string name="continue_">Turpināt</string>
|
||||||
|
<string name="addFromPdfFile">Atlasīt PDF datni</string>
|
||||||
|
<string name="exportCancelled">Izguve atcelta</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_column_count_portrait">Kolonnas stateniskā novietojumā</string>
|
||||||
|
<string name="settings_column_count_landscape">Kolonnas guleniskā novietojumā</string>
|
||||||
|
<string name="unsupportedFile">Šī datne netiek atbalstīta</string>
|
||||||
|
<string name="addFromPkpass">Atlasīt Passbook datni (.pkpass)</string>
|
||||||
|
<string name="generic_error_please_retry">Atvainojamies, kaut kas nogāja greizi. Lūgums mēģināt vēlreiz...</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
<string name="selectBarcodeTitle">Velg strekkode</string>
|
<string name="selectBarcodeTitle">Velg strekkode</string>
|
||||||
<string name="thumbnailDescription">Miniatyrbilde</string>
|
<string name="thumbnailDescription">Miniatyrbilde</string>
|
||||||
<string name="settings">Innstillinger</string>
|
<string name="settings">Innstillinger</string>
|
||||||
<string name="settings_display_barcode_max_brightness">Lysere strekkodevisning</string>
|
<string name="settings_display_barcode_max_brightness">Gjør skjermen lysere</string>
|
||||||
<string name="exportSuccessful">Data eksportert</string>
|
<string name="exportSuccessful">Data eksportert</string>
|
||||||
<string name="importSuccessful">Data importert</string>
|
<string name="importSuccessful">Data importert</string>
|
||||||
<string name="intent_import_card_from_url_share_text">Jeg ønsker å dele et kort med deg</string>
|
<string name="intent_import_card_from_url_share_text">Jeg ønsker å dele et kort med deg</string>
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
<string name="importCatima">Importer fra Catima</string>
|
<string name="importCatima">Importer fra Catima</string>
|
||||||
<string name="errorReadingImage">Kunne ikke lese bildet</string>
|
<string name="errorReadingImage">Kunne ikke lese bildet</string>
|
||||||
<string name="noBarcodeFound">Fant ingen strekkode</string>
|
<string name="noBarcodeFound">Fant ingen strekkode</string>
|
||||||
<string name="addFromImage">Velg bilde fra galleri</string>
|
<string name="addFromImage">Velg et bilde fra galleriet</string>
|
||||||
<string name="unsupportedBarcodeType">Denne strekkodetypen kan ikke vises for øyeblikket. Støtte kan bli lagt til i en senere versjon av programmet.</string>
|
<string name="unsupportedBarcodeType">Denne strekkodetypen kan ikke vises for øyeblikket. Støtte kan bli lagt til i en senere versjon av programmet.</string>
|
||||||
<string name="setBarcodeId">Sett strekkodeverdi</string>
|
<string name="setBarcodeId">Sett strekkodeverdi</string>
|
||||||
<string name="sameAsCardId">Samme som ID</string>
|
<string name="sameAsCardId">Samme som ID</string>
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
</plurals>
|
</plurals>
|
||||||
<string name="settings_oled_dark">Svart bakgrunn for mørk drakt</string>
|
<string name="settings_oled_dark">Svart bakgrunn for mørk drakt</string>
|
||||||
<string name="include_if_asking_support">Inkluder følgende info hvis du vil ha hjelp:</string>
|
<string name="include_if_asking_support">Inkluder følgende info hvis du vil ha hjelp:</string>
|
||||||
<string name="settings_card_orientation">Strekkoderetning</string>
|
<string name="settings_card_orientation">Skjermorientering</string>
|
||||||
<string name="settings_landscape_orientation">Liggende</string>
|
<string name="settings_landscape_orientation">Liggende</string>
|
||||||
<string name="settings_lock_on_opening_orientation">Lås til sideretning brukt ved åpning av kort</string>
|
<string name="settings_lock_on_opening_orientation">Lås til sideretning brukt ved åpning av kort</string>
|
||||||
<string name="duplicateCard">Dupliser</string>
|
<string name="duplicateCard">Dupliser</string>
|
||||||
@@ -228,7 +228,7 @@
|
|||||||
<string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string>
|
<string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string>
|
||||||
<string name="importCards">Importer kort</string>
|
<string name="importCards">Importer kort</string>
|
||||||
<string name="currentBalanceSentence">Nåværende saldo: <xliff:g>%s</xliff:g></string>
|
<string name="currentBalanceSentence">Nåværende saldo: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="updateBalanceTitle">Hvor mye brukte du?</string>
|
<string name="updateBalanceTitle">Hvor mye brukte eller fikk du?</string>
|
||||||
<string name="updateBalanceHint">Skriv inn beløp</string>
|
<string name="updateBalanceHint">Skriv inn beløp</string>
|
||||||
<string name="newBalanceSentence">Ny saldo: <xliff:g>%s</xliff:g></string>
|
<string name="newBalanceSentence">Ny saldo: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="updateBalance">Oppdater saldo</string>
|
<string name="updateBalance">Oppdater saldo</string>
|
||||||
@@ -258,7 +258,7 @@
|
|||||||
<string name="settings_keep_screen_on_summary">Skrur av skjermtidsavbrudd under visning av et kort</string>
|
<string name="settings_keep_screen_on_summary">Skrur av skjermtidsavbrudd under visning av et kort</string>
|
||||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Skrur av skjermlås under visning av et kort</string>
|
<string name="settings_disable_lockscreen_while_viewing_card_summary">Skrur av skjermlås under visning av et kort</string>
|
||||||
<string name="settings_allow_content_provider_read_title">Tillat andre programmer tilgang til min data</string>
|
<string name="settings_allow_content_provider_read_title">Tillat andre programmer tilgang til min data</string>
|
||||||
<string name="settings_category_title_cards">Kort</string>
|
<string name="settings_category_title_cards">Kortvisning</string>
|
||||||
<string name="settings_category_title_general">Generelt</string>
|
<string name="settings_category_title_general">Generelt</string>
|
||||||
<string name="settings_category_title_privacy">Personvern</string>
|
<string name="settings_category_title_privacy">Personvern</string>
|
||||||
<string name="settings_oled_dark_summary">Reduserer batteribruk for OLED-skjermer</string>
|
<string name="settings_oled_dark_summary">Reduserer batteribruk for OLED-skjermer</string>
|
||||||
@@ -279,17 +279,30 @@
|
|||||||
<string name="continue_">Fortsett</string>
|
<string name="continue_">Fortsett</string>
|
||||||
<string name="amountParsingFailed">Ugyldig beløp</string>
|
<string name="amountParsingFailed">Ugyldig beløp</string>
|
||||||
<string name="spend">Utgifter</string>
|
<string name="spend">Utgifter</string>
|
||||||
<string name="receive">Inntekt</string>
|
<string name="receive">Motta</string>
|
||||||
<string name="settings_follow_sensor_orientation">Alltid roter (ignorerer systeminnstilling)</string>
|
<string name="settings_follow_sensor_orientation">Alltid roter (ignorerer systeminnstilling)</string>
|
||||||
<string name="add_manually_warning_message">I noen butikker er strekkoden forskjellig fra nummeret på kortet. Som følge av dette kan det hende at å skrive inn strekkoden ikke virker. Det anbefales å skanne strekkoden med kameraet istedenfor. Fortsett?</string>
|
<string name="add_manually_warning_message">I noen butikker er strekkoden forskjellig fra nummeret på kortet. Som følge av dette kan det hende at å skrive inn strekkoden ikke virker. Det anbefales å skanne strekkoden med kameraet istedenfor. Vil du fortsette?</string>
|
||||||
<string name="pageWithNumber">Side <xliff:g>%d</xliff:g></string>
|
<string name="pageWithNumber">Side <xliff:g>%d</xliff:g></string>
|
||||||
<string name="addFromPdfFile">Velg en PDF-fil</string>
|
<string name="addFromPdfFile">Velg en PDF-fil</string>
|
||||||
<string name="errorReadingFile">Kunne ikke lese filen</string>
|
<string name="errorReadingFile">Kunne ikke lese filen</string>
|
||||||
<string name="failedLaunchingFileManager">Fant ikke støttet filbehandler</string>
|
<string name="failedLaunchingFileManager">Kunne ikke finne filbehandler som støttes</string>
|
||||||
<string name="multipleBarcodesFoundPleaseChooseOne">Hvilken av de oppdagede strekkodene vil du bruke?</string>
|
<string name="multipleBarcodesFoundPleaseChooseOne">Hvilken av de oppdagede strekkodene vil du bruke?</string>
|
||||||
<string name="noCameraFoundGuideText">Finner ikke kamera på enheten din. Hvis dette ikke stemmer kan du prøve en omstart av den. Ellers kan du legge til strekkoder med «Mer»-knappen nedenfor.</string>
|
<string name="noCameraFoundGuideText">Finner ikke kamera på enheten din. Hvis dette ikke stemmer kan du prøve en omstart av den. Ellers kan du legge til strekkoder med «Mer»-knappen nedenfor.</string>
|
||||||
<string name="importCancelled">Import avbrutt</string>
|
<string name="importCancelled">Import avbrutt</string>
|
||||||
<string name="exportCancelled">Eksport avbrutt</string>
|
<string name="exportCancelled">Eksport avbrutt</string>
|
||||||
<string name="useFrontImage">Bruk frontbilde</string>
|
<string name="useFrontImage">Bruk forsidebilde</string>
|
||||||
<string name="useBackImage">Bruk baksidebilde</string>
|
<string name="useBackImage">Bruk baksidebilde</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">Bytt kort ved å bruke volumknappene</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">Bruk volumknappene for å velge hvilket kort som skal vises</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Kortoversikt</string>
|
||||||
|
<string name="settings_column_count_portrait">Kolonner i portrettmodus</string>
|
||||||
|
<string name="settings_column_count_landscape">Kolonner i landskapsmodus</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatisk</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -260,7 +260,7 @@
|
|||||||
<string name="settings_display_barcode_max_brightness_summary">Benodigd voor de werking van sommige scanners</string>
|
<string name="settings_display_barcode_max_brightness_summary">Benodigd voor de werking van sommige scanners</string>
|
||||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Schakelt schermvergrendeling uit tijdens het bekijken van een kaart</string>
|
<string name="settings_disable_lockscreen_while_viewing_card_summary">Schakelt schermvergrendeling uit tijdens het bekijken van een kaart</string>
|
||||||
<string name="settings_oled_dark_summary">Verlaagt het accuverbruik op oledschermen</string>
|
<string name="settings_oled_dark_summary">Verlaagt het accuverbruik op oledschermen</string>
|
||||||
<string name="settings_category_title_cards">Kaartenoverzicht</string>
|
<string name="settings_category_title_cards">Kaart</string>
|
||||||
<string name="settings_category_title_general">Algemeen</string>
|
<string name="settings_category_title_general">Algemeen</string>
|
||||||
<string name="app_copyright_short">Auteursrecht © Sylvia van Os en bijdragers</string>
|
<string name="app_copyright_short">Auteursrecht © Sylvia van Os en bijdragers</string>
|
||||||
<string name="action_display_options">Weergave-instellingen</string>
|
<string name="action_display_options">Weergave-instellingen</string>
|
||||||
@@ -294,4 +294,18 @@
|
|||||||
<string name="useBackImage">Gebruik achterzijde van kaart</string>
|
<string name="useBackImage">Gebruik achterzijde van kaart</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Verwissel kaart met de volume knoppen</string>
|
<string name="settings_use_volume_keys_navigation">Verwissel kaart met de volume knoppen</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Gebruik de volume knoppen om te wisselen van getoonde kaart</string>
|
<string name="settings_use_volume_keys_navigation_summary">Gebruik de volume knoppen om te wisselen van getoonde kaart</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Kaartenoverzicht</string>
|
||||||
|
<string name="settings_column_count_landscape">Kolommen in landschapmodus</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatisch</string>
|
||||||
|
<string name="settings_column_count_portrait">Kolommen in portretmodus</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="addFromPkpass">Kies een Passbook bestand (.pkpass)</string>
|
||||||
|
<string name="unsupportedFile">Dit bestand wordt niet ondersteund</string>
|
||||||
|
<string name="generic_error_please_retry">Sorry, er ging iets mis. Probeer het opnieuw.</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -306,4 +306,18 @@
|
|||||||
<string name="useFrontImage">Użyj obrazu z przodu</string>
|
<string name="useFrontImage">Użyj obrazu z przodu</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Przełączaj karty przy użyciu przycisków głośności</string>
|
<string name="settings_use_volume_keys_navigation">Przełączaj karty przy użyciu przycisków głośności</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Użyj przycisków głośności do przełączania kart</string>
|
<string name="settings_use_volume_keys_navigation_summary">Użyj przycisków głośności do przełączania kart</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Przegląd kart</string>
|
||||||
|
<string name="settings_column_count_portrait">Kolumny w trybie portretu</string>
|
||||||
|
<string name="settings_column_count_landscape">Kolumny w trybie pejzażu</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatycznie</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="addFromPkpass">Wybierz plik Passbook (.pkpass)</string>
|
||||||
|
<string name="unsupportedFile">Ten plik nie jest obsługiwany</string>
|
||||||
|
<string name="generic_error_please_retry">Coś poszło nie tak, spróbuj ponownie później...</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -300,4 +300,18 @@
|
|||||||
<string name="useFrontImage">Usar imagem frontal</string>
|
<string name="useFrontImage">Usar imagem frontal</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Use os botões de volume para alterar qual cartão é exibido</string>
|
<string name="settings_use_volume_keys_navigation_summary">Use os botões de volume para alterar qual cartão é exibido</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Trocar de cartão usando botões de volume</string>
|
<string name="settings_use_volume_keys_navigation">Trocar de cartão usando botões de volume</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Resumo dos cartões</string>
|
||||||
|
<string name="settings_column_count_portrait">Colunas em modo retrato</string>
|
||||||
|
<string name="settings_automatic_column_count">Automático</string>
|
||||||
|
<string name="settings_column_count_landscape">Colunas em modo paisagem</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="unsupportedFile">Este arquivo não é suportado</string>
|
||||||
|
<string name="addFromPkpass">Selecionar um arquivo do gerenciador de senhas (.pkpass)</string>
|
||||||
|
<string name="generic_error_please_retry">Desculpe, alguma coisa deu errado, por favor tente novamente...</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
<string name="save">Guardar</string>
|
<string name="save">Guardar</string>
|
||||||
<string name="edit">Editar</string>
|
<string name="edit">Editar</string>
|
||||||
<string name="noGiftCards">Clique no botão + para adicionar um cartão ou importe-o no menu ⋮.</string>
|
<string name="noGiftCards">Clique no botão + para adicionar um cartão ou importe-o no menu ⋮.</string>
|
||||||
<string name="noBarcode">sem código de barras</string>
|
<string name="noBarcode">Sem código de barras</string>
|
||||||
<string name="unstar">Retirar dos favoritos</string>
|
<string name="unstar">Retirar dos favoritos</string>
|
||||||
<string name="importOptionFilesystemButton">Do sistema de ficheiros</string>
|
<string name="importOptionFilesystemButton">Do sistema de ficheiros</string>
|
||||||
<string name="importOptionApplicationTitle">Usar outra aplicação</string>
|
<string name="importOptionApplicationTitle">Usar outra aplicação</string>
|
||||||
@@ -36,10 +36,10 @@
|
|||||||
<string name="delete">Eliminar</string>
|
<string name="delete">Eliminar</string>
|
||||||
<string name="cardId">Identificador do cartão</string>
|
<string name="cardId">Identificador do cartão</string>
|
||||||
<string name="cardShortcut">Atalho do cartão</string>
|
<string name="cardShortcut">Atalho do cartão</string>
|
||||||
<string name="noCardsMessage">Adicione primeiro um cartão</string>
|
<string name="noCardsMessage">Adicione um cartão primeiro</string>
|
||||||
<string name="noCardExistsError">Não foi possível encontrar esse cartão</string>
|
<string name="noCardExistsError">Não foi possível encontrar esse cartão</string>
|
||||||
<string name="failedParsingImportUriError">Não foi possível analisar o URI de importação</string>
|
<string name="failedParsingImportUriError">Não foi possível analisar o URI de importação</string>
|
||||||
<string name="importExport">Importar / exportar</string>
|
<string name="importExport">Importar / Exportar</string>
|
||||||
<string name="exportName">Exportar</string>
|
<string name="exportName">Exportar</string>
|
||||||
<string name="importSuccessful">Dados importados</string>
|
<string name="importSuccessful">Dados importados</string>
|
||||||
<string name="noGroups">Clique no botão + para adicionar grupos para categorização.</string>
|
<string name="noGroups">Clique no botão + para adicionar grupos para categorização.</string>
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
<item quantity="other"><xliff:g>%d</xliff:g> cartões</item>
|
<item quantity="other"><xliff:g>%d</xliff:g> cartões</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="importOptionFilesystemTitle">Importar do sistema de ficheiros</string>
|
<string name="importOptionFilesystemTitle">Importar do sistema de ficheiros</string>
|
||||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019-<xliff:g>%d</xliff:g> Sylvia van Os e colaboradores</string>
|
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019-<xliff:g>%d</xliff:g> Sylvia van Os e contribuidores</string>
|
||||||
<string name="app_copyright_old">Baseado no Loyalty Card Keychain
|
<string name="app_copyright_old">Baseado no Loyalty Card Keychain
|
||||||
\ndireitos de autor © 2016–2020 Branden Archer</string>
|
\ndireitos de autor © 2016–2020 Branden Archer</string>
|
||||||
<string name="about_title_fmt">Sobre o <xliff:g id="app_name">%s</xliff:g></string>
|
<string name="about_title_fmt">Sobre o <xliff:g id="app_name">%s</xliff:g></string>
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
<string name="welcome">Bem-vindo ao Catima</string>
|
<string name="welcome">Bem-vindo ao Catima</string>
|
||||||
<string name="failedToRetrieveImageFile">Falha ao recuperar o ficheiro de imagem</string>
|
<string name="failedToRetrieveImageFile">Falha ao recuperar o ficheiro de imagem</string>
|
||||||
<string name="barcodeLongPressMessage">Só podem ser abertas imagens na aplicação da galeria</string>
|
<string name="barcodeLongPressMessage">Só podem ser abertas imagens na aplicação da galeria</string>
|
||||||
<string name="noCameraPermissionDirectToSystemSetting">Para digitalizar código de barras, o Catima tem de aceder à câmara. Clique aqui para mudar as configurações de permissão.</string>
|
<string name="noCameraPermissionDirectToSystemSetting">Para digitalizar códigos de barras, o Catima tem de aceder à câmara. Clique aqui para mudar as configurações de permissão.</string>
|
||||||
<string name="cameraPermissionDeniedTitle">Não foi possível aceder à câmara</string>
|
<string name="cameraPermissionDeniedTitle">Não foi possível aceder à câmara</string>
|
||||||
<string name="importCards">Importar cartões</string>
|
<string name="importCards">Importar cartões</string>
|
||||||
<string name="currentBalanceSentence">Saldo atual: <xliff:g>%s</xliff:g></string>
|
<string name="currentBalanceSentence">Saldo atual: <xliff:g>%s</xliff:g></string>
|
||||||
@@ -254,7 +254,7 @@
|
|||||||
<string name="donate">Doar</string>
|
<string name="donate">Doar</string>
|
||||||
<string name="show_validity">Mostrar validade</string>
|
<string name="show_validity">Mostrar validade</string>
|
||||||
<string name="show_balance">Mostrar saldo</string>
|
<string name="show_balance">Mostrar saldo</string>
|
||||||
<string name="permissionReadCardsLabel">Ler Cartas Catima</string>
|
<string name="permissionReadCardsLabel">Ler Cartões Catima</string>
|
||||||
<string name="permissionReadCardsDescription">leia seus cartões do Catima e todos os seus detalhes, incluindo notas e imagens</string>
|
<string name="permissionReadCardsDescription">leia seus cartões do Catima e todos os seus detalhes, incluindo notas e imagens</string>
|
||||||
<string name="show_note">Mostrar nota</string>
|
<string name="show_note">Mostrar nota</string>
|
||||||
<string name="show_name_below_image_thumbnail">Mostrar nome abaixo da miniatura do ícone</string>
|
<string name="show_name_below_image_thumbnail">Mostrar nome abaixo da miniatura do ícone</string>
|
||||||
@@ -277,7 +277,7 @@
|
|||||||
<string name="enter_card_id">Digite o número ID ou o texto em seu cartão</string>
|
<string name="enter_card_id">Digite o número ID ou o texto em seu cartão</string>
|
||||||
<string name="action_display_options">Opções de visualização</string>
|
<string name="action_display_options">Opções de visualização</string>
|
||||||
<string name="addWithoutBarcode">Adicione um cartão sem código de barras</string>
|
<string name="addWithoutBarcode">Adicione um cartão sem código de barras</string>
|
||||||
<string name="app_copyright_short">Copyright © Sylvia van Os e colaboradores</string>
|
<string name="app_copyright_short">Copyright © Sylvia van Os e contribuidores</string>
|
||||||
<string name="field_must_not_be_empty">O campo não pode estar vazio</string>
|
<string name="field_must_not_be_empty">O campo não pode estar vazio</string>
|
||||||
<string name="show_archived_cards">Mostrar cartões arquivados</string>
|
<string name="show_archived_cards">Mostrar cartões arquivados</string>
|
||||||
<string name="app_name">Catima</string>
|
<string name="app_name">Catima</string>
|
||||||
@@ -300,4 +300,18 @@
|
|||||||
<string name="useBackImage">Utilizar imagem do verso</string>
|
<string name="useBackImage">Utilizar imagem do verso</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Mudar de cartão usando os botões de volume</string>
|
<string name="settings_use_volume_keys_navigation">Mudar de cartão usando os botões de volume</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Utilize os botões de volume para alterar o cartão que é apresentado</string>
|
<string name="settings_use_volume_keys_navigation_summary">Utilize os botões de volume para alterar o cartão que é apresentado</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Resumo dos cartões</string>
|
||||||
|
<string name="settings_column_count_portrait">Colunas no modo vertical</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_landscape">Colunas no modo horizontal</string>
|
||||||
|
<string name="settings_automatic_column_count">Automático</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="addFromPkpass">Selecionar um ficheiro Passbook (.pkpass)</string>
|
||||||
|
<string name="unsupportedFile">Este ficheiro não é suportado</string>
|
||||||
|
<string name="generic_error_please_retry">Lamento, ocorreu um erro, tente novamente...</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -300,4 +300,12 @@
|
|||||||
<string name="useFrontImage">Utilizează imaginea din față</string>
|
<string name="useFrontImage">Utilizează imaginea din față</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Schimbă cardurile folosind butoanele de volum</string>
|
<string name="settings_use_volume_keys_navigation">Schimbă cardurile folosind butoanele de volum</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Folosiți butoanele de volum pentru a schimba ce card este afișat</string>
|
<string name="settings_use_volume_keys_navigation_summary">Folosiți butoanele de volum pentru a schimba ce card este afișat</string>
|
||||||
|
<string name="settings_automatic_column_count">Automat</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -34,9 +34,9 @@
|
|||||||
<string name="exportFailed">Невозможно выполнить экспорт</string>
|
<string name="exportFailed">Невозможно выполнить экспорт</string>
|
||||||
<string name="importing">Импорт…</string>
|
<string name="importing">Импорт…</string>
|
||||||
<string name="exporting">Экспорт…</string>
|
<string name="exporting">Экспорт…</string>
|
||||||
<string name="exportOptionExplanation">Данные будут записаны в выбранное место.</string>
|
<string name="exportOptionExplanation">Данные будут сохранены в выбранное место.</string>
|
||||||
<string name="importOptionFilesystemTitle">Импорт из файловой системы</string>
|
<string name="importOptionFilesystemTitle">Импорт из файла</string>
|
||||||
<string name="importOptionFilesystemExplanation">Выберете файл на файловой системе.</string>
|
<string name="importOptionFilesystemExplanation">Выберете файл в файловой системе.</string>
|
||||||
<string name="importOptionFilesystemButton">Выбрать файл</string>
|
<string name="importOptionFilesystemButton">Выбрать файл</string>
|
||||||
<string name="importOptionApplicationTitle">Использование другого приложения</string>
|
<string name="importOptionApplicationTitle">Использование другого приложения</string>
|
||||||
<string name="importOptionApplicationExplanation">Используйте любое приложение или ваш любимый файловый менеджер, чтобы открыть файл.</string>
|
<string name="importOptionApplicationExplanation">Используйте любое приложение или ваш любимый файловый менеджер, чтобы открыть файл.</string>
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
<string name="editBarcode">Изменить штрих-код</string>
|
<string name="editBarcode">Изменить штрих-код</string>
|
||||||
<string name="card">Карта</string>
|
<string name="card">Карта</string>
|
||||||
<string name="groupsList">Группы: <xliff:g>%s</xliff:g></string>
|
<string name="groupsList">Группы: <xliff:g>%s</xliff:g></string>
|
||||||
<string name="moveDown">Переместить ниже</string>
|
<string name="moveDown">Перейти вниз</string>
|
||||||
<string name="moveUp">Переместить выше</string>
|
<string name="moveUp">Переместить выше</string>
|
||||||
<string name="settings_disable_lockscreen_while_viewing_card">Не давать блокировать экран</string>
|
<string name="settings_disable_lockscreen_while_viewing_card">Не давать блокировать экран</string>
|
||||||
<string name="settings_keep_screen_on">Не отключать экран</string>
|
<string name="settings_keep_screen_on">Не отключать экран</string>
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
<string name="spend">Потрачено</string>
|
<string name="spend">Потрачено</string>
|
||||||
<string name="receive">Получено</string>
|
<string name="receive">Получено</string>
|
||||||
<string name="amountParsingFailed">Недопустимая сумма</string>
|
<string name="amountParsingFailed">Недопустимая сумма</string>
|
||||||
<string name="addFromPdfFile">Выберите PDF-файл</string>
|
<string name="addFromPdfFile">Выбрать PDF-файл</string>
|
||||||
<string name="errorReadingFile">Невозможно прочитать файл</string>
|
<string name="errorReadingFile">Невозможно прочитать файл</string>
|
||||||
<string name="pageWithNumber">Страница <xliff:g>%d</xliff:g></string>
|
<string name="pageWithNumber">Страница <xliff:g>%d</xliff:g></string>
|
||||||
<string name="failedLaunchingFileManager">Не найден поддерживаемый файловый менеджер</string>
|
<string name="failedLaunchingFileManager">Не найден поддерживаемый файловый менеджер</string>
|
||||||
@@ -306,4 +306,18 @@
|
|||||||
<string name="useBackImage">Использовать заднюю сторону</string>
|
<string name="useBackImage">Использовать заднюю сторону</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Использовать кнопки регулировки громкости для смены отображаемой карты</string>
|
<string name="settings_use_volume_keys_navigation_summary">Использовать кнопки регулировки громкости для смены отображаемой карты</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Переключать карты кнопками громкости</string>
|
<string name="settings_use_volume_keys_navigation">Переключать карты кнопками громкости</string>
|
||||||
|
<string name="settings_column_count_portrait">Столбцы в портретном режиме</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Список карт</string>
|
||||||
|
<string name="settings_column_count_landscape">Столбцы в альбомном режиме</string>
|
||||||
|
<string name="settings_automatic_column_count">Автовыбор</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="unsupportedFile">Данный файл не поддерживается</string>
|
||||||
|
<string name="addFromPkpass">Выбрать файл Passbook (.pkpass)</string>
|
||||||
|
<string name="generic_error_please_retry">Извините, что-то пошло не так, попробуйте ещё раз…</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -276,4 +276,31 @@
|
|||||||
<string name="field_must_not_be_empty">Obligatoriskt fält</string>
|
<string name="field_must_not_be_empty">Obligatoriskt fält</string>
|
||||||
<string name="app_name">Catima</string>
|
<string name="app_name">Catima</string>
|
||||||
<string name="settings_follow_sensor_orientation">Rotera automatiskt (ignorerar systeminställningar)</string>
|
<string name="settings_follow_sensor_orientation">Rotera automatiskt (ignorerar systeminställningar)</string>
|
||||||
|
<string name="continue_">Fortsätt</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatiskt</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="add_manually_warning_title">Skanning rekommenderas</string>
|
||||||
|
<string name="noCameraFoundGuideText">Din enhet verkar inte ha en kamera. Om den har det, prova att starta om enheten. Annars, använd knappen Fler alternativ nedan för att lägga till en streckkod på ett annat sätt.</string>
|
||||||
|
<string name="importCancelled">Importeringen avbröts</string>
|
||||||
|
<string name="exportCancelled">Exporteringen avbröts</string>
|
||||||
|
<string name="addFromPdfFile">Välj en PDF-fil</string>
|
||||||
|
<string name="errorReadingFile">Kunde inte läsa filen</string>
|
||||||
|
<string name="failedLaunchingFileManager">Kunde inte hitta en filhanterare som stöds</string>
|
||||||
|
<string name="spend">Spendera</string>
|
||||||
|
<string name="receive">Ta emot</string>
|
||||||
|
<string name="amountParsingFailed">Ogiltig summa</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">Byt kort genom att använda volymknapparna</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">Använd volymknapparna för att byta vilket kort som visas</string>
|
||||||
|
<string name="settings_column_count_portrait">Kolumner i porträttläge</string>
|
||||||
|
<string name="settings_column_count_landscape">Kolumner i landskapsläge</string>
|
||||||
|
<string name="pageWithNumber">Sida <xliff:g>%d</xliff:g></string>
|
||||||
|
<string name="useFrontImage">Använd bilden på framsidan</string>
|
||||||
|
<string name="useBackImage">Använd bilden på baksidan</string>
|
||||||
|
<string name="multipleBarcodesFoundPleaseChooseOne">Vilka av de hittade streckkoderna vill du använda?</string>
|
||||||
</resources>
|
</resources>
|
||||||
264
app/src/main/res/values-ta/strings.xml
Normal file
264
app/src/main/res/values-ta/strings.xml
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<string name="app_name">கேடிமா</string>
|
||||||
|
<string name="action_search">தேடல்</string>
|
||||||
|
<string name="action_add">கூட்டு</string>
|
||||||
|
<string name="noGiftCards">ஒரு அட்டையைச் சேர்க்க + பிளச் பொத்தானைக் சொடுக்கு செய்க அல்லது ⋮ மெனுவிலிருந்து இறக்குமதி செய்யுங்கள்.</string>
|
||||||
|
<string name="noGiftCardsGroup">சில அட்டைகளை உருவாக்கி, பின்னர் அவற்றை இங்கே குழுவிற்கு ஒதுக்குங்கள்.</string>
|
||||||
|
<string name="storeName">பெயர்</string>
|
||||||
|
<string name="note">குறிப்பு</string>
|
||||||
|
<string name="cardId">அட்டை ஐடி</string>
|
||||||
|
<string name="barcodeType">பார்கோடு வகை</string>
|
||||||
|
<string name="noBarcode">பார்கோடு இல்லை</string>
|
||||||
|
<string name="star">பிடித்தவைகளில் சேர்க்கவும்</string>
|
||||||
|
<string name="delete">நீக்கு</string>
|
||||||
|
<string name="confirm">உறுதிப்படுத்தவும்</string>
|
||||||
|
<string name="deleteConfirmation">இந்த அட்டையை நிரந்தரமாக நீக்கவா?</string>
|
||||||
|
<string name="ok">சரி</string>
|
||||||
|
<string name="share">பங்கு</string>
|
||||||
|
<string name="sendLabel">அனுப்பு…</string>
|
||||||
|
<string name="editCardTitle">அட்டையைத் திருத்து</string>
|
||||||
|
<string name="addCardTitle">அட்டை சேர்க்கவும்</string>
|
||||||
|
<string name="scanCardBarcode">ச்கேன் பார்கோடு</string>
|
||||||
|
<string name="cardShortcut">அட்டை குறுக்குவழி</string>
|
||||||
|
<string name="noCardExistsError">அந்த அட்டையை கண்டுபிடிக்க முடியவில்லை</string>
|
||||||
|
<string name="failedParsingImportUriError">இறக்குமதி யூரியை அலச முடியவில்லை</string>
|
||||||
|
<string name="importExport">இறக்குமதி/ஏற்றுமதி</string>
|
||||||
|
<string name="exportName">ஏற்றுமதி</string>
|
||||||
|
<string name="importFailedTitle">இறக்குமதி தோல்வியடைந்தது</string>
|
||||||
|
<string name="importFailed">இறக்குமதியை செய்ய முடியவில்லை</string>
|
||||||
|
<string name="exportSuccessfulTitle">ஏற்றுமதி</string>
|
||||||
|
<string name="exportFailedTitle">ஏற்றுமதி தோல்வியடைந்தது</string>
|
||||||
|
<string name="exportFailed">ஏற்றுமதி செய்ய முடியவில்லை</string>
|
||||||
|
<string name="importing">இறக்குமதி…</string>
|
||||||
|
<string name="exporting">ஏற்றுமதி செய்கிறது…</string>
|
||||||
|
<string name="storageReadPermissionRequired">இந்த செயலுக்கு தேவையான சேமிப்பிடத்தைப் படிக்க அனுமதி…</string>
|
||||||
|
<string name="cameraPermissionRequired">இந்த செயலுக்கு தேவையான கேமராவை அணுக அனுமதி…</string>
|
||||||
|
<string name="intent_import_card_from_url_share_text">நான் உங்களுடன் ஒரு அட்டையைப் பகிர விரும்புகிறேன்</string>
|
||||||
|
<string name="importSuccessful">இறக்குமதி செய்யப்பட்ட தரவு</string>
|
||||||
|
<string name="exportSuccessful">தரவு ஏற்றுமதி செய்யப்பட்டது</string>
|
||||||
|
<string name="enter_group_name">குழு பெயரை உள்ளிடவும்</string>
|
||||||
|
<string name="groups">குழுக்கள்</string>
|
||||||
|
<string name="group_edit">குழு திருத்து</string>
|
||||||
|
<string name="group_name_already_in_use">குழு பெயர் ஏற்கனவே பயன்பாட்டில் உள்ளது</string>
|
||||||
|
<string name="group_name_is_empty">குழு பெயர் காலியாக இருக்கக்கூடாது</string>
|
||||||
|
<string name="group_updated">குழு புதுப்பிக்கப்பட்டது</string>
|
||||||
|
<string name="all">அனைத்தும்</string>
|
||||||
|
<string name="deleteConfirmationGroup">குழுவை நீக்கவா?</string>
|
||||||
|
<string name="failedOpeningFileManager">முதலில் கோப்பு மேலாளரை நிறுவவும்.</string>
|
||||||
|
<string name="leaveWithoutSaveTitle">வெளியேறு</string>
|
||||||
|
<string name="leaveWithoutSaveConfirmation">சேமிக்காமல் விடலாமா?</string>
|
||||||
|
<string name="addManually">பார்கோடு கைமுறையாக உள்ளிடவும்</string>
|
||||||
|
<string name="addFromImage">கேலரியில் இருந்து ஒரு படத்தைத் தேர்ந்தெடுக்கவும்</string>
|
||||||
|
<string name="noBarcodeFound">பார்கோடு எதுவும் கிடைக்கவில்லை</string>
|
||||||
|
<string name="errorReadingImage">படத்தைப் படிக்க முடியவில்லை</string>
|
||||||
|
<string name="balance">இருப்பு</string>
|
||||||
|
<string name="currency">நாணயம்</string>
|
||||||
|
<string name="importFidme">FIDME இலிருந்து இறக்குமதி</string>
|
||||||
|
<string name="barcodeId">பார்கோடு மதிப்பு</string>
|
||||||
|
<string name="backImageDescription">பின் படம்</string>
|
||||||
|
<string name="photos">புகைப்படங்கள்</string>
|
||||||
|
<string name="setFrontImage">முன் படத்தை அமைக்கவும்</string>
|
||||||
|
<string name="setBackImage">படத்தை அமைக்கவும்</string>
|
||||||
|
<string name="removeImage">படத்தை அகற்று</string>
|
||||||
|
<string name="takePhoto">புகைப்படம் எடுக்கவும்</string>
|
||||||
|
<string name="settings_oled_dark_summary">OLED காட்சிகளில் பேட்டரி பயன்பாட்டைக் குறைக்கிறது</string>
|
||||||
|
<string name="settings_system_locale">மண்டலம்</string>
|
||||||
|
<string name="selectColor">வண்ணத்தைத் தேர்ந்தெடுக்கவும்</string>
|
||||||
|
<string name="setIcon">சிறு உருவத்தை அமைக்கவும்</string>
|
||||||
|
<string name="settings_blue_theme">நீலம்</string>
|
||||||
|
<string name="settings_green_theme">பச்சை</string>
|
||||||
|
<string name="sort">வரிசைப்படுத்து</string>
|
||||||
|
<string name="showMoreInfo">தகவலைக் காட்டு</string>
|
||||||
|
<string name="nextCard">அடுத்தது</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="spend">செலவு</string>
|
||||||
|
<string name="unsupportedFile">இந்த கோப்பு ஆதரிக்கப்படவில்லை</string>
|
||||||
|
<string name="generic_error_please_retry">மன்னிக்கவும், ஏதோ தவறு நடந்தது, தயவுசெய்து மீண்டும் முயற்சிக்கவும் ...</string>
|
||||||
|
<string name="noMatchingGiftCards">முடிவுகள் இல்லை. உங்கள் தேடலை மாற்ற முயற்சிக்கவும்.</string>
|
||||||
|
<string name="edit">தொகு</string>
|
||||||
|
<string name="deleteTitle">அட்டையை நீக்கு</string>
|
||||||
|
<string name="unstar">பிடித்தவைகளிலிருந்து அகற்று</string>
|
||||||
|
<string name="cancel">ரத்துசெய்</string>
|
||||||
|
<string name="save">சேமி</string>
|
||||||
|
<string name="noCardsMessage">முதலில் ஒரு அட்டையைச் சேர்க்கவும்</string>
|
||||||
|
<string name="importExportHelp">உங்கள் தரவை காப்புப் பிரதி எடுப்பது அதை மற்றொரு சாதனத்திற்கு நகர்த்த அனுமதிக்கிறது.</string>
|
||||||
|
<string name="importSuccessfulTitle">இறக்குமதி செய்யப்பட்டது</string>
|
||||||
|
<string name="permissionReadCardsLabel">கேடிமா அட்டைகளைப் படியுங்கள்</string>
|
||||||
|
<string name="permissionReadCardsDescription">உங்கள் கேடிமா அட்டைகள் மற்றும் குறிப்புகள் மற்றும் படங்கள் உட்பட அதன் அனைத்து விவரங்களையும் படியுங்கள்</string>
|
||||||
|
<string name="exportOptionExplanation">தரவு உங்கள் விருப்பப்படி இடத்திற்கு எழுதப்படும்.</string>
|
||||||
|
<string name="importOptionFilesystemTitle">கோப்பு முறைமையிலிருந்து இறக்குமதி</string>
|
||||||
|
<string name="importOptionFilesystemExplanation">கோப்பு முறைமையிலிருந்து ஒரு குறிப்பிட்ட கோப்பைத் தேர்வுசெய்க.</string>
|
||||||
|
<string name="importOptionFilesystemButton">கோப்பு முறைமையிலிருந்து</string>
|
||||||
|
<string name="cameraPermissionDeniedTitle">கேமராவை அணுக முடியவில்லை</string>
|
||||||
|
<string name="noCameraPermissionDirectToSystemSetting">பார்கோடுகளை ச்கேன் செய்ய, கேடிமாவுக்கு உங்கள் கேமராவுக்கு அணுகல் தேவைப்படும். உங்கள் இசைவு அமைப்புகளை மாற்ற இங்கே தட்டவும்.</string>
|
||||||
|
<string name="importOptionApplicationTitle">மற்றொரு பயன்பாட்டைப் பயன்படுத்தவும்</string>
|
||||||
|
<string name="importOptionApplicationExplanation">கோப்பைத் திறக்க எந்த பயன்பாடு அல்லது உங்களுக்கு பிடித்த கோப்பு மேலாளரைப் பயன்படுத்தவும்.</string>
|
||||||
|
<string name="about">பற்றி</string>
|
||||||
|
<string name="importOptionApplicationButton">மற்றொரு பயன்பாட்டைப் பயன்படுத்தவும்</string>
|
||||||
|
<string name="app_copyright_short">பதிப்புரிமை © சில்வியா வான் ஓஎச் மற்றும் பங்களிப்பாளர்கள்</string>
|
||||||
|
<string name="app_copyright_old">விசுவாச அட்டை கீச்சின் அடிப்படையில்\n பதிப்புரிமை © 2016–2020 பிராண்டன் ஆர்ச்சர்</string>
|
||||||
|
<string name="app_license">நகலெடுக்கப்பட்ட லிப்ரே மென்பொருள், உரிமம் பெற்ற GPLV3+</string>
|
||||||
|
<string name="selectBarcodeTitle">பார்கோடு தேர்ந்தெடுக்கவும்</string>
|
||||||
|
<string name="thumbnailDescription">சிறுபடம்</string>
|
||||||
|
<string name="starImage">பிடித்த விண்மீன்</string>
|
||||||
|
<string name="settings">அமைப்புகள்</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_orientation">திரை நோக்குநிலை</string>
|
||||||
|
<string name="settings_follow_system_orientation">அமைப்பைப் பின்தொடரவும்</string>
|
||||||
|
<string name="settings_keep_screen_on">திரையை தொடர்ந்து வைத்திருங்கள்</string>
|
||||||
|
<string name="settings_follow_sensor_orientation">எப்போதும் சுழற்றுங்கள் (கணினி அமைப்புகளை புறக்கணிக்கிறது)</string>
|
||||||
|
<string name="settings_keep_screen_on_summary">ஒரு அட்டையைப் பார்க்கும்போது திரை நேரத்தை முடக்குகிறது</string>
|
||||||
|
<string name="settings_portrait_orientation">உருவப்படம்</string>
|
||||||
|
<string name="settings_landscape_orientation">நிலப்பரப்பு</string>
|
||||||
|
<string name="settings_lock_on_opening_orientation">அட்டையைத் திறக்கும்போது பயன்படுத்தப்படும் நோக்குநிலைக்கு பூட்டு</string>
|
||||||
|
<string name="settings_display_barcode_max_brightness">திரை ஒளி</string>
|
||||||
|
<string name="settings_display_barcode_max_brightness_summary">சில ச்கேனர்கள் வேலை செய்ய தேவை</string>
|
||||||
|
<string name="settings_disable_lockscreen_while_viewing_card">திரை பூட்டைத் தடுக்கவும்</string>
|
||||||
|
<string name="settings_allow_content_provider_read_title">எனது தரவை அணுக மற்ற பயன்பாடுகளை அனுமதிக்கவும்</string>
|
||||||
|
<string name="settings_allow_content_provider_read_summary">பயன்பாடுகள் இன்னும் அணுகல் வழங்க இசைவு கோர வேண்டும்</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">தொகுதி பொத்தான்களைப் பயன்படுத்தி அட்டைகளை மாற்றவும்</string>
|
||||||
|
<string name="settings_disable_lockscreen_while_viewing_card_summary">அட்டையைப் பார்க்கும்போது திரை லாக் முடக்குகிறது</string>
|
||||||
|
<string name="noGroups">வகைப்படுத்தலுக்கான குழுக்களைச் சேர்க்க + பிளச் பொத்தானைக் சொடுக்கு செய்க.</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">எந்த அட்டை காட்டப்படும் என்பதை மாற்ற தொகுதி பொத்தான்களைப் பயன்படுத்தவும்</string>
|
||||||
|
<string name="noGroupCards">இந்த குழு காலியாக உள்ளது</string>
|
||||||
|
<string name="moveUp">மேல்நோக்கி நகர்த்தவும்</string>
|
||||||
|
<string name="moveDown">கீழ்நோக்கி நகர்த்தவும்</string>
|
||||||
|
<string name="card">அட்டை</string>
|
||||||
|
<string name="editBarcode">பார்கோடு திருத்து</string>
|
||||||
|
<string name="expiryDate">காலாவதி தேதி</string>
|
||||||
|
<string name="never">ஒருபோதும்</string>
|
||||||
|
<string name="chooseExpiryDate">காலாவதி தேதியைத் தேர்வுசெய்க</string>
|
||||||
|
<string name="moveBarcodeToTopOfScreen">பார்கோடு திரையின் மேற்பகுதிக்கு நகர்த்தவும்</string>
|
||||||
|
<string name="points">பிரிவகம்</string>
|
||||||
|
<string name="balanceParsingFailed">தவறான இருப்பு</string>
|
||||||
|
<string name="chooseImportType">இருந்து தரவை இறக்குமதி செய்யுங்கள்</string>
|
||||||
|
<string name="app_loyalty_card_keychain">விசுவாச அட்டை கீச்சின்</string>
|
||||||
|
<string name="privacy_policy">தனியுரிமைக் கொள்கை</string>
|
||||||
|
<string name="accept">ஏற்றுக்கொள்</string>
|
||||||
|
<string name="importCatima">கேடிமாவிலிருந்து இறக்குமதி</string>
|
||||||
|
<string name="importCatimaMessage">உங்கள் <i> catima.zip </i> இறக்குமதி செய்ய கேடிமாவிலிருந்து ஏற்றுமதி செய்யுங்கள்.\n முதலில் அங்கு ஏற்றுமதியை அழுத்துவதன் மூலம் மற்றொரு கேடிமா பயன்பாட்டின் இறக்குமதி/ஏற்றுமதி மெனுவிலிருந்து அதை உருவாக்கவும்.</string>
|
||||||
|
<string name="importLoyaltyCardKeychain">விசுவாச அட்டை கீச்சினிலிருந்து இறக்குமதி செய்யுங்கள்</string>
|
||||||
|
<string name="importFidmeMessage">உங்கள் <i> fidme-export-request-xxxxxx.zip </i> இறக்குமதி செய்ய FIDME இலிருந்து ஏற்றுமதி செய்து, பின்னர் பார்கோடு வகைகளை கைமுறையாகத் தேர்ந்தெடுக்கவும்.\n தரவு பாதுகாப்பைத் தேர்ந்தெடுப்பதன் மூலம் உங்கள் FIDME சுயவிவரத்திலிருந்து அதை உருவாக்கவும், பின்னர் எனது தரவைப் பிரித்தெடுக்கவும் அழுத்தவும்.</string>
|
||||||
|
<string name="importStocardMessage">உங்கள் <i> ***. சிப் </i> இறக்குமதி செய்ய ஏற்றுமதி.\n உங்கள் தரவை ஏற்றுமதி செய்யக் கேட்கும் support@stocardapp.com என்ற மின்னஞ்சல் மூலம் அதைப் பெறுங்கள்.</string>
|
||||||
|
<string name="importVoucherVault">வவுச்சர் பெட்டகத்திலிருந்து இறக்குமதி</string>
|
||||||
|
<string name="importStocard">ச்டார்ட் இருந்து இறக்குமதி</string>
|
||||||
|
<string name="sameAsCardId">ஐடி அதே</string>
|
||||||
|
<string name="setBarcodeId">பார்கோடு மதிப்பை அமைக்கவும்</string>
|
||||||
|
<string name="unsupportedBarcodeType">இந்த பார்கோடு வகையை இன்னும் காட்ட முடியாது. பயன்பாட்டின் பின்னர் பதிப்பில் இது ஆதரிக்கப்படலாம்.</string>
|
||||||
|
<string name="wrongValueForBarcodeType">தேர்ந்தெடுக்கப்பட்ட பார்கோடு வகைக்கு மதிப்பு செல்லுபடியாகாது</string>
|
||||||
|
<string name="intent_import_card_from_url_share_multiple_text">சில அட்டைகளை உங்களுடன் பகிர்ந்து கொள்ள விரும்புகிறேன்</string>
|
||||||
|
<string name="importVoucherVaultMessage">உங்கள் <i> vouchervault.json </i> வவுச்சர் பெட்டகத்திலிருந்து இறக்குமதி செய்ய ஏற்றுமதி என்பதைத் தேர்ந்தெடுக்கவும்.\n முதலில் வவுச்சர் வால்ட்டில் ஏற்றுமதியை அழுத்துவதன் மூலம் அதை உருவாக்கவும்.</string>
|
||||||
|
<string name="frontImageDescription">முன் படம்</string>
|
||||||
|
<string name="updateBarcodeQuestionTitle">பார்கோடு மதிப்பைப் புதுப்பிக்கவா?</string>
|
||||||
|
<string name="updateBarcodeQuestionText">நீங்கள் ஐடியை மாற்றினீர்கள். அதே மதிப்பைப் பயன்படுத்த பார்கோடு புதுப்பிக்க விரும்புகிறீர்களா?</string>
|
||||||
|
<string name="yes">ஆம்</string>
|
||||||
|
<string name="no">இல்லை</string>
|
||||||
|
<string name="passwordRequired">கடவுச்சொல்லை உள்ளிடவும்</string>
|
||||||
|
<string name="exportPassword">உங்கள் ஏற்றுமதியைப் பாதுகாக்க கடவுச்சொல்லை அமைக்கவும் (விரும்பினால்)</string>
|
||||||
|
<string name="exportPasswordHint">கடவுச்சொல்லை உள்ளிடவும்</string>
|
||||||
|
<string name="failedGeneratingShareURL">பகிரக்கூடிய முகவரி ஐ உருவாக்க முடியவில்லை. இதை புகாரளிக்கவும்.</string>
|
||||||
|
<string name="turn_flashlight_on">ஒளிரும் விளக்கை இயக்கவும்</string>
|
||||||
|
<string name="turn_flashlight_off">ஒளிரும் விளக்கை அணைக்கவும்</string>
|
||||||
|
<string name="settings_locale">மொழி</string>
|
||||||
|
<string name="settings_oled_dark">இருண்ட கருப்பொருளுக்கு தூய கருப்பு பின்னணி</string>
|
||||||
|
<string name="settings_theme_color">கருப்பொருள் நிறம்</string>
|
||||||
|
<string name="settings_catima_theme">கேடிமா</string>
|
||||||
|
<string name="settings_pink_theme">இளஞ்சிவப்பு</string>
|
||||||
|
<string name="settings_magenta_theme">மெசந்தா</string>
|
||||||
|
<string name="settings_violet_theme">கத்தரி</string>
|
||||||
|
<string name="settings_sky_blue_theme">வானம் நீலம்</string>
|
||||||
|
<string name="sort_by_name">பெயர்</string>
|
||||||
|
<string name="sort_by_most_recently_used">மிக அண்மைக் காலத்தில் பயன்படுத்தப்பட்டது</string>
|
||||||
|
<string name="sort_by_expiry">காலாவதியாகும்</string>
|
||||||
|
<string name="reverse">… தலைகீழ் வரிசையில்</string>
|
||||||
|
<string name="settings_brown_theme">பழுப்பு</string>
|
||||||
|
<string name="updateBalance">இருப்பு புதுப்பிக்கவும்</string>
|
||||||
|
<string name="failedToRetrieveImageFile">படக் கோப்பை மீட்டெடுப்பதில் தோல்வி</string>
|
||||||
|
<string name="sort_by">வரிசைப்படுத்தவும்</string>
|
||||||
|
<string name="barcodeLongPressMessage">கேலரி பயன்பாட்டில் படங்களை மட்டுமே திறக்க முடியும்</string>
|
||||||
|
<string name="version_history">பதிப்பு வரலாறு</string>
|
||||||
|
<string name="credits">வரவு</string>
|
||||||
|
<string name="on_google_play">கூகிள் பிளேயில்</string>
|
||||||
|
<string name="help_translate_this_app">இந்த பயன்பாட்டை மொழிபெயர்க்க உதவுங்கள்</string>
|
||||||
|
<string name="license">உரிமம்</string>
|
||||||
|
<string name="source_repository">மூல களஞ்சியம்</string>
|
||||||
|
<string name="on_github">கிட்அப்பில்</string>
|
||||||
|
<string name="and_data_usage">மற்றும் தரவு பயன்பாடு</string>
|
||||||
|
<string name="rate_this_app">இந்த பயன்பாட்டை மதிப்பிடுங்கள்</string>
|
||||||
|
<string name="report_error">பிழையைப் புகாரளிக்கவும்</string>
|
||||||
|
<string name="translate_platform">வெப்லேட்டில்</string>
|
||||||
|
<string name="shortcutSelectCard">ஒரு அட்டையைத் தேர்ந்தெடுக்கவும்</string>
|
||||||
|
<string name="duplicateCard">நகல்</string>
|
||||||
|
<string name="archive">காப்பகம்</string>
|
||||||
|
<string name="options">விருப்பங்கள்</string>
|
||||||
|
<string name="starred">நடித்தார்</string>
|
||||||
|
<string name="include_if_asking_support">நீங்கள் ஆதரவைக் கோர விரும்பினால், பின்வரும் தகவலைச் சேர்க்கவும்:</string>
|
||||||
|
<string name="unarchive">அன்கான்</string>
|
||||||
|
<string name="archived">அட்டை காப்பகப்படுத்தப்பட்டது</string>
|
||||||
|
<string name="unarchived">அட்டை பதிக்கப்படாதது</string>
|
||||||
|
<string name="failedLaunchingPhotoPicker">உதவி கேலரி பயன்பாட்டைக் கண்டுபிடிக்க முடியவில்லை</string>
|
||||||
|
<string name="previousCard">முந்தைய</string>
|
||||||
|
<string name="failedToOpenUrl">முதலில் ஒரு வலை உலாவியை நிறுவவும்</string>
|
||||||
|
<string name="welcome">கேடிமாவுக்கு வருக</string>
|
||||||
|
<string name="importCards">அட்டைகளை இறக்குமதி செய்யுங்கள்</string>
|
||||||
|
<string name="updateBalanceTitle">நீங்கள் எவ்வளவு செலவு செய்தீர்கள் அல்லது பெற்றீர்கள்?</string>
|
||||||
|
<string name="updateBalanceHint">தொகையை உள்ளிடவும்</string>
|
||||||
|
<string name="validFromDate">இருந்து செல்லுபடியாகும்</string>
|
||||||
|
<string name="anyDate">எந்த தேதி</string>
|
||||||
|
<string name="chooseValidFromDate">தேதியிலிருந்து செல்லுபடியாகும் என்பதைத் தேர்வுசெய்க</string>
|
||||||
|
<string name="height">உயரம்:</string>
|
||||||
|
<string name="switchToFrontImage">முன் படத்திற்கு மாறவும்</string>
|
||||||
|
<string name="switchToBackImage">பின் படத்திற்கு மாறவும்</string>
|
||||||
|
<string name="switchToBarcode">பார்கோடு மாறவும்</string>
|
||||||
|
<string name="openFrontImageInGalleryApp">கேலரி பயன்பாட்டில் முன் படத்தைத் திறக்கவும்</string>
|
||||||
|
<string name="openBackImageInGalleryApp">கேலரி பயன்பாட்டில் படத்தைத் திறக்கவும்</string>
|
||||||
|
<string name="setBarcodeHeight">பார்கோடு உயரத்தை அமைக்கவும்</string>
|
||||||
|
<string name="donate">நன்கொடை</string>
|
||||||
|
<string name="icon_header_click_text">சிறுபடத்தைத் திருத்த நீண்ட அழுத்தவும்</string>
|
||||||
|
<string name="show_name_below_image_thumbnail">பட சிறுபடத்திற்கு கீழே உள்ள பெயரைக் காட்டு</string>
|
||||||
|
<string name="show_note">குறிப்பைக் காட்டு</string>
|
||||||
|
<string name="show_balance">சமநிலையைக் காட்டு</string>
|
||||||
|
<string name="show_validity">செல்லுபடியைக் காட்டு</string>
|
||||||
|
<string name="settings_category_title_cards">அட்டை பார்வை</string>
|
||||||
|
<string name="settings_category_title_cards_overview">அட்டைகள் கண்ணோட்டம்</string>
|
||||||
|
<string name="settings_column_count_portrait">உருவப்படம் பயன்முறையில் நெடுவரிசைகள்</string>
|
||||||
|
<string name="settings_column_count_landscape">நிலப்பரப்பு பயன்முறையில் நெடுவரிசைகள்</string>
|
||||||
|
<string name="settings_automatic_column_count">தானியங்கி</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_category_title_general">பொது</string>
|
||||||
|
<string name="settings_category_title_privacy">தனியுரிமை</string>
|
||||||
|
<string name="show_archived_cards">காப்பகப்படுத்தப்பட்ட அட்டைகளைக் காட்டு</string>
|
||||||
|
<string name="view_online">ஆன்லைனில் காண்க</string>
|
||||||
|
<string name="action_more_options">மேலும் விருப்பங்கள்</string>
|
||||||
|
<string name="addWithoutBarcode">பார்கோடு இல்லாத அட்டையைச் சேர்க்கவும்</string>
|
||||||
|
<string name="action_display_options">காட்சி விருப்பங்கள்</string>
|
||||||
|
<string name="enter_card_id">உங்கள் அட்டையில் அடையாள எண் அல்லது உரையை உள்ளிடவும்</string>
|
||||||
|
<string name="card_id_must_not_be_empty">அட்டை ஐடி காலியாக இருக்கக்கூடாது</string>
|
||||||
|
<string name="add_a_card_in_a_different_way">ஒரு அட்டையை வேறு வழியில் சேர்க்கவும்</string>
|
||||||
|
<string name="field_must_not_be_empty">புலம் காலியாக இருக்கக்கூடாது</string>
|
||||||
|
<string name="manually_enter_barcode_instructions">உங்கள் அட்டையில் அடையாள எண் அல்லது உரையை உள்ளிட்டு, உங்கள் அட்டையில் உள்ளதைப் போல தோற்றமளிக்கும் பார்கோடு அழுத்தவும்.</string>
|
||||||
|
<string name="add_manually_warning_title">ச்கேனிங் பரிந்துரைக்கப்படுகிறது</string>
|
||||||
|
<string name="continue_">தொடரவும்</string>
|
||||||
|
<string name="receive">பெறுங்கள்</string>
|
||||||
|
<string name="amountParsingFailed">தவறான தொகை</string>
|
||||||
|
<string name="add_manually_warning_message">சில கடைகளுக்கு, பார்கோடு மதிப்பு அட்டையில் எழுதப்பட்ட எண்ணிலிருந்து வேறுபடுகிறது. இதன் காரணமாக, ஒரு பார்கோடு கைமுறையாக நுழைவது எப்போதும் வேலை செய்யாது. அதற்கு பதிலாக உங்கள் கேமராவுடன் பார்கோடு ச்கேன் செய்ய கடுமையாக பரிந்துரைக்கப்படுகிறது. நீங்கள் இன்னும் தொடர விரும்புகிறீர்களா?</string>
|
||||||
|
<string name="addFromPdfFile">PDF கோப்பைத் தேர்ந்தெடுக்கவும்</string>
|
||||||
|
<string name="errorReadingFile">கோப்பைப் படிக்க முடியவில்லை</string>
|
||||||
|
<string name="failedLaunchingFileManager">உதவி கோப்பு மேலாளரைக் கண்டுபிடிக்க முடியவில்லை</string>
|
||||||
|
<string name="multipleBarcodesFoundPleaseChooseOne">கண்டுபிடிக்கப்பட்ட பார்கோடுகளில் எது நீங்கள் பயன்படுத்த விரும்புகிறீர்கள்?</string>
|
||||||
|
<string name="noCameraFoundGuideText">உங்கள் சாதனத்தில் கேமரா இருப்பதாகத் தெரியவில்லை. அவ்வாறு செய்தால், சாதனத்தை மறுதொடக்கம் செய்ய முயற்சிக்கவும். இல்லையெனில், பார்கோடு மற்றொரு வழியில் சேர்க்க கீழே உள்ள கூடுதல் விருப்பங்கள் பொத்தானைப் பயன்படுத்தவும்.</string>
|
||||||
|
<string name="importCancelled">இறக்குமதி ரத்து செய்யப்பட்டது</string>
|
||||||
|
<string name="exportCancelled">ஏற்றுமதி ரத்து செய்யப்பட்டது</string>
|
||||||
|
<string name="useBackImage">பின் படத்தைப் பயன்படுத்தவும்</string>
|
||||||
|
<string name="addFromPkpass">பாச் புக் கோப்பைத் தேர்ந்தெடுக்கவும் (.pkpass)</string>
|
||||||
|
<string name="useFrontImage">முன் படத்தைப் பயன்படுத்தவும்</string>
|
||||||
|
</resources>
|
||||||
@@ -294,4 +294,18 @@
|
|||||||
<string name="useBackImage">Arka resmi kullan</string>
|
<string name="useBackImage">Arka resmi kullan</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Hangi kartın görüntüleneceğini değiştirmek için ses düğmelerini kullanın</string>
|
<string name="settings_use_volume_keys_navigation_summary">Hangi kartın görüntüleneceğini değiştirmek için ses düğmelerini kullanın</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Ses düğmelerini kullanarak kartları değiştir</string>
|
<string name="settings_use_volume_keys_navigation">Ses düğmelerini kullanarak kartları değiştir</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Kartları gözden geçir</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_landscape">Yatay alan modundaki sutunlar</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_automatic_column_count">Otomatik</string>
|
||||||
|
<string name="settings_column_count_portrait">Portre modundaki sutunlar</string>
|
||||||
|
<string name="unsupportedFile">Bu dosya desteklenmiyor</string>
|
||||||
|
<string name="generic_error_please_retry">Üzgünüz, bir şeyler ters gitti, lütfen tekrar deneyin...</string>
|
||||||
|
<string name="addFromPkpass">Bir Passbook dosyası seçin (.pkpass)</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -305,4 +305,18 @@
|
|||||||
<string name="useBackImage">Використати зворотне зображення</string>
|
<string name="useBackImage">Використати зворотне зображення</string>
|
||||||
<string name="settings_use_volume_keys_navigation">Перемикайте карти за допомогою кнопок гучності</string>
|
<string name="settings_use_volume_keys_navigation">Перемикайте карти за допомогою кнопок гучності</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">Використовуйте кнопки гучності, щоб змінити картку, яка відображається</string>
|
<string name="settings_use_volume_keys_navigation_summary">Використовуйте кнопки гучності, щоб змінити картку, яка відображається</string>
|
||||||
|
<string name="settings_automatic_column_count">Автоматичний</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Огляд карток</string>
|
||||||
|
<string name="settings_column_count_portrait">Стовпці в портретному режимі</string>
|
||||||
|
<string name="settings_column_count_landscape">Стовпці в ландшафтному режимі</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="unsupportedFile">Цей файл не підтримується</string>
|
||||||
|
<string name="generic_error_please_retry">Вибачте, щось пішло не так, спробуйте ще раз...</string>
|
||||||
|
<string name="addFromPkpass">Виберіть файл Passbook (.pkpass)</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
<string name="settings_system_theme">Hệ thống</string>
|
<string name="settings_system_theme">Hệ thống</string>
|
||||||
<string name="failedToOpenUrl">Trước tiên, hãy cài đặt trình duyệt web</string>
|
<string name="failedToOpenUrl">Trước tiên, hãy cài đặt trình duyệt web</string>
|
||||||
<string name="setBackImage">Đặt ảnh mặt sau</string>
|
<string name="setBackImage">Đặt ảnh mặt sau</string>
|
||||||
<string name="settings_display_barcode_max_brightness">Tăng sáng cho chế độ xem mã vạch</string>
|
<string name="settings_display_barcode_max_brightness">Tăng sáng màn hình</string>
|
||||||
<string name="chooseExpiryDate">Chọn ngày hết hạn</string>
|
<string name="chooseExpiryDate">Chọn ngày hết hạn</string>
|
||||||
<string name="permissionReadCardsDescription">đọc thẻ Catima của bạn và mọi thông tin trong đó, bao gồm cả ghi chú và ảnh</string>
|
<string name="permissionReadCardsDescription">đọc thẻ Catima của bạn và mọi thông tin trong đó, bao gồm cả ghi chú và ảnh</string>
|
||||||
<string name="anyDate">Bất cứ ngày nào</string>
|
<string name="anyDate">Bất cứ ngày nào</string>
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
<string name="importCards">Nhập thẻ</string>
|
<string name="importCards">Nhập thẻ</string>
|
||||||
<string name="icon_header_click_text">Nhấn đè để sửa ảnh con</string>
|
<string name="icon_header_click_text">Nhấn đè để sửa ảnh con</string>
|
||||||
<string name="importFailedTitle">Nhập dữ liệu hỏng</string>
|
<string name="importFailedTitle">Nhập dữ liệu hỏng</string>
|
||||||
<string name="settings_category_title_cards">Thẻ</string>
|
<string name="settings_category_title_cards">Xem thẻ</string>
|
||||||
<string name="setBarcodeId">Đặt giá trị mã vạch</string>
|
<string name="setBarcodeId">Đặt giá trị mã vạch</string>
|
||||||
<string name="ok">Đồng ý</string>
|
<string name="ok">Đồng ý</string>
|
||||||
<string name="unarchive">Bỏ lưu trữ</string>
|
<string name="unarchive">Bỏ lưu trữ</string>
|
||||||
@@ -219,7 +219,7 @@
|
|||||||
<string name="show_archived_cards">Hiện thẻ lưu trữ</string>
|
<string name="show_archived_cards">Hiện thẻ lưu trữ</string>
|
||||||
<string name="selectBarcodeTitle">Chọn Mã Vạch</string>
|
<string name="selectBarcodeTitle">Chọn Mã Vạch</string>
|
||||||
<string name="importSuccessful">Nhập dữ liệu xong</string>
|
<string name="importSuccessful">Nhập dữ liệu xong</string>
|
||||||
<string name="settings_card_orientation">Hướng đặt mã vạch</string>
|
<string name="settings_card_orientation">Hướng màn hình</string>
|
||||||
<string name="app_libraries">Thư viện mở từ bên thứ 3: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
<string name="app_libraries">Thư viện mở từ bên thứ 3: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||||
<string name="updateBalanceTitle">Bạn đã chi tiêu hoặc nhận được bao nhiêu?</string>
|
<string name="updateBalanceTitle">Bạn đã chi tiêu hoặc nhận được bao nhiêu?</string>
|
||||||
<string name="editCardTitle">Sửa Thẻ</string>
|
<string name="editCardTitle">Sửa Thẻ</string>
|
||||||
@@ -286,4 +286,17 @@
|
|||||||
<string name="useBackImage">Sử dụng hình ảnh phía sau</string>
|
<string name="useBackImage">Sử dụng hình ảnh phía sau</string>
|
||||||
<string name="importCancelled">Đã huỷ nhập</string>
|
<string name="importCancelled">Đã huỷ nhập</string>
|
||||||
<string name="exportCancelled">Đã hủy xuất</string>
|
<string name="exportCancelled">Đã hủy xuất</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation">Thay đổi thẻ bằng cách sử dụng phím âm lượng</string>
|
||||||
|
<string name="settings_use_volume_keys_navigation_summary">Sử dụng phím âm lượng để thay đổi thẻ được hiển thị</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Tổng quan thẻ</string>
|
||||||
|
<string name="settings_column_count_portrait">Cột trong chế độ dọc</string>
|
||||||
|
<string name="settings_column_count_landscape">Cột trong chế độ ngang</string>
|
||||||
|
<string name="settings_automatic_column_count">Tự động</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<integer name="main_view_card_columns">3</integer>
|
<integer name="main_view_card_columns">4</integer>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -288,4 +288,18 @@
|
|||||||
<string name="useBackImage">使用背面图</string>
|
<string name="useBackImage">使用背面图</string>
|
||||||
<string name="settings_use_volume_keys_navigation">用音量按钮切换卡片</string>
|
<string name="settings_use_volume_keys_navigation">用音量按钮切换卡片</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">是用音量按钮改变展示的卡片</string>
|
<string name="settings_use_volume_keys_navigation_summary">是用音量按钮改变展示的卡片</string>
|
||||||
|
<string name="settings_category_title_cards_overview">卡片概览</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_automatic_column_count">自动</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_portrait">竖屏模式下的列数</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_landscape">横屏模式下的列数</string>
|
||||||
|
<string name="addFromPkpass">选择 Passbook 文件(.pkpass)</string>
|
||||||
|
<string name="unsupportedFile">此文件不受支持</string>
|
||||||
|
<string name="generic_error_please_retry">抱歉,某个东西出错了,请再试…</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -246,7 +246,7 @@
|
|||||||
<string name="setBarcodeHeight">設定條碼高度</string>
|
<string name="setBarcodeHeight">設定條碼高度</string>
|
||||||
<string name="app_copyright_short">著作權所有© Sylvia van Os與其他貢獻者</string>
|
<string name="app_copyright_short">著作權所有© Sylvia van Os與其他貢獻者</string>
|
||||||
<string name="permissionReadCardsLabel">讀取Catima卡片</string>
|
<string name="permissionReadCardsLabel">讀取Catima卡片</string>
|
||||||
<string name="app_name">Catima</string>
|
<string name="app_name">卡提碼</string>
|
||||||
<string name="permissionReadCardsDescription">讀取Catima卡片及卡片資訊,包含註記與圖片</string>
|
<string name="permissionReadCardsDescription">讀取Catima卡片及卡片資訊,包含註記與圖片</string>
|
||||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">觀看卡片時避免螢幕鎖定</string>
|
<string name="settings_disable_lockscreen_while_viewing_card_summary">觀看卡片時避免螢幕鎖定</string>
|
||||||
<string name="settings_allow_content_provider_read_summary">其他程式仍然需要取得權限</string>
|
<string name="settings_allow_content_provider_read_summary">其他程式仍然需要取得權限</string>
|
||||||
@@ -287,4 +287,15 @@
|
|||||||
<string name="useBackImage">使用背面圖片</string>
|
<string name="useBackImage">使用背面圖片</string>
|
||||||
<string name="settings_use_volume_keys_navigation_summary">使用音量按鈕來切換顯示的卡片</string>
|
<string name="settings_use_volume_keys_navigation_summary">使用音量按鈕來切換顯示的卡片</string>
|
||||||
<string name="settings_use_volume_keys_navigation">使用音量按鈕切換卡片</string>
|
<string name="settings_use_volume_keys_navigation">使用音量按鈕切換卡片</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="settings_automatic_column_count">自動</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_category_title_cards_overview">卡片概覽</string>
|
||||||
|
<string name="settings_column_count_portrait">縱向模式下的列數</string>
|
||||||
|
<string name="settings_column_count_landscape">横向模式下的列數</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -36,6 +36,40 @@
|
|||||||
<item>@string/settings_brown_theme</item>
|
<item>@string/settings_brown_theme</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="column_count_portrait_values">
|
||||||
|
<item>@string/settings_key_automatic_column_count</item>
|
||||||
|
<item>1</item>
|
||||||
|
<item>2</item>
|
||||||
|
<item>3</item>
|
||||||
|
<item>4</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="column_count_portrait_value_strings">
|
||||||
|
<item>@string/settings_automatic_column_count</item>
|
||||||
|
<item>@string/settings_column_count_1</item>
|
||||||
|
<item>@string/settings_column_count_2</item>
|
||||||
|
<item>@string/settings_column_count_3</item>
|
||||||
|
<item>@string/settings_column_count_4</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="column_count_landscape_values">
|
||||||
|
<item>@string/settings_key_automatic_column_count</item>
|
||||||
|
<item>3</item>
|
||||||
|
<item>4</item>
|
||||||
|
<item>5</item>
|
||||||
|
<item>6</item>
|
||||||
|
<item>7</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="column_count_landscape_value_strings">
|
||||||
|
<item>@string/settings_automatic_column_count</item>
|
||||||
|
<item>@string/settings_column_count_3</item>
|
||||||
|
<item>@string/settings_column_count_4</item>
|
||||||
|
<item>@string/settings_column_count_5</item>
|
||||||
|
<item>@string/settings_column_count_6</item>
|
||||||
|
<item>@string/settings_column_count_7</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<string-array name="color_values_no_dynamic">
|
<string-array name="color_values_no_dynamic">
|
||||||
<item>@string/settings_key_system_theme</item>
|
<item>@string/settings_key_system_theme</item>
|
||||||
<item>@string/settings_key_pink_theme</item>
|
<item>@string/settings_key_pink_theme</item>
|
||||||
@@ -86,6 +120,7 @@
|
|||||||
<item>fi</item>
|
<item>fi</item>
|
||||||
<!-- <item>fil</item> -->
|
<!-- <item>fil</item> -->
|
||||||
<item>fr</item>
|
<item>fr</item>
|
||||||
|
<item>gl</item>
|
||||||
<item>he-rIL</item>
|
<item>he-rIL</item>
|
||||||
<item>hi</item>
|
<item>hi</item>
|
||||||
<item>hr</item>
|
<item>hr</item>
|
||||||
@@ -113,6 +148,7 @@
|
|||||||
<item>sl</item>
|
<item>sl</item>
|
||||||
<item>sr</item>
|
<item>sr</item>
|
||||||
<item>sv</item>
|
<item>sv</item>
|
||||||
|
<item>ta</item>
|
||||||
<!-- <item>ti</item> -->
|
<!-- <item>ti</item> -->
|
||||||
<item>tr</item>
|
<item>tr</item>
|
||||||
<item>uk</item>
|
<item>uk</item>
|
||||||
|
|||||||
@@ -318,6 +318,20 @@
|
|||||||
<string name="sharedpreference_card_details_show_validity" translatable="false">sharedpreference_card_details_show_validity</string>
|
<string name="sharedpreference_card_details_show_validity" translatable="false">sharedpreference_card_details_show_validity</string>
|
||||||
<string name="sharedpreference_card_details_show_archived_cards" translatable="false">sharedpreference_card_details_show_archived_cards</string>
|
<string name="sharedpreference_card_details_show_archived_cards" translatable="false">sharedpreference_card_details_show_archived_cards</string>
|
||||||
<string name="settings_category_title_cards">Card view</string>
|
<string name="settings_category_title_cards">Card view</string>
|
||||||
|
<string name="settings_category_title_cards_overview">Cards overview</string>
|
||||||
|
<string name="settings_column_count_portrait">Columns in portrait mode</string>
|
||||||
|
<string name="settings_column_count_landscape">Columns in landscape mode</string>
|
||||||
|
<string name="settings_automatic_column_count">Automatic</string>
|
||||||
|
<string name="settings_key_automatic_column_count" translatable="false">default</string>
|
||||||
|
<string name="settings_column_count_1">1</string>
|
||||||
|
<string name="settings_column_count_2">2</string>
|
||||||
|
<string name="settings_column_count_3">3</string>
|
||||||
|
<string name="settings_column_count_4">4</string>
|
||||||
|
<string name="settings_column_count_5">5</string>
|
||||||
|
<string name="settings_column_count_6">6</string>
|
||||||
|
<string name="settings_column_count_7">7</string>
|
||||||
|
<string name="setting_key_column_count_portrait" translatable="false">pref_column_count_portrait</string>
|
||||||
|
<string name="setting_key_column_count_landscape" translatable="false">pref_column_count_landscape</string>
|
||||||
<string name="settings_category_title_general">General</string>
|
<string name="settings_category_title_general">General</string>
|
||||||
<string name="settings_category_title_privacy">Privacy</string>
|
<string name="settings_category_title_privacy">Privacy</string>
|
||||||
<string name="action_display_options">Display options</string>
|
<string name="action_display_options">Display options</string>
|
||||||
@@ -346,4 +360,7 @@
|
|||||||
<string name="exportCancelled">Export cancelled</string>
|
<string name="exportCancelled">Export cancelled</string>
|
||||||
<string name="useFrontImage">Use front image</string>
|
<string name="useFrontImage">Use front image</string>
|
||||||
<string name="useBackImage">Use back image</string>
|
<string name="useBackImage">Use back image</string>
|
||||||
|
<string name="addFromPkpass">Select a Passbook file (.pkpass)</string>
|
||||||
|
<string name="unsupportedFile">This file is not supported</string>
|
||||||
|
<string name="generic_error_please_retry">Sorry, something went wrong, please try again...</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
<locale android:name="et" />
|
<locale android:name="et" />
|
||||||
<locale android:name="fi" />
|
<locale android:name="fi" />
|
||||||
<locale android:name="fr" />
|
<locale android:name="fr" />
|
||||||
|
<locale android:name="gl" />
|
||||||
<locale android:name="he-IL" />
|
<locale android:name="he-IL" />
|
||||||
<locale android:name="hi" />
|
<locale android:name="hi" />
|
||||||
<locale android:name="hr" />
|
<locale android:name="hr" />
|
||||||
@@ -39,6 +40,7 @@
|
|||||||
<locale android:name="sl" />
|
<locale android:name="sl" />
|
||||||
<locale android:name="sr" />
|
<locale android:name="sr" />
|
||||||
<locale android:name="sv" />
|
<locale android:name="sv" />
|
||||||
|
<locale android:name="ta" />
|
||||||
<locale android:name="tr" />
|
<locale android:name="tr" />
|
||||||
<locale android:name="uk" />
|
<locale android:name="uk" />
|
||||||
<locale android:name="vi" />
|
<locale android:name="vi" />
|
||||||
|
|||||||
@@ -46,6 +46,31 @@
|
|||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/settings_category_title_cards_overview"
|
||||||
|
app:iconSpaceReserved="false">
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/setting_key_column_count_portrait"
|
||||||
|
android:title="@string/settings_column_count_portrait"
|
||||||
|
android:defaultValue="@string/settings_key_automatic_column_count"
|
||||||
|
android:entries="@array/column_count_portrait_value_strings"
|
||||||
|
android:entryValues="@array/column_count_portrait_values"
|
||||||
|
app:iconSpaceReserved="false"
|
||||||
|
app:singleLineTitle="false"
|
||||||
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/setting_key_column_count_landscape"
|
||||||
|
android:title="@string/settings_column_count_landscape"
|
||||||
|
android:defaultValue="@string/settings_key_automatic_column_count"
|
||||||
|
android:entries="@array/column_count_landscape_value_strings"
|
||||||
|
android:entryValues="@array/column_count_landscape_values"
|
||||||
|
app:iconSpaceReserved="false"
|
||||||
|
app:singleLineTitle="false"
|
||||||
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/settings_category_title_cards"
|
android:title="@string/settings_category_title_cards"
|
||||||
app:iconSpaceReserved="false">
|
app:iconSpaceReserved="false">
|
||||||
@@ -112,4 +137,4 @@
|
|||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class DatabaseTest {
|
|||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1);
|
||||||
assertNotNull(loyaltyCard);
|
assertNotNull(loyaltyCard);
|
||||||
assertEquals("store", loyaltyCard.store);
|
assertEquals("store", loyaltyCard.store);
|
||||||
assertEquals("note", loyaltyCard.note);
|
assertEquals("note", loyaltyCard.note);
|
||||||
@@ -64,7 +64,7 @@ public class DatabaseTest {
|
|||||||
result = DBHelper.deleteLoyaltyCard(mDatabase, mActivity, 1);
|
result = DBHelper.deleteLoyaltyCard(mDatabase, mActivity, 1);
|
||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
assertNull(DBHelper.getLoyaltyCard(mDatabase, 1));
|
assertNull(DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -78,7 +78,7 @@ public class DatabaseTest {
|
|||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1);
|
||||||
assertNotNull(loyaltyCard);
|
assertNotNull(loyaltyCard);
|
||||||
assertEquals("store1", loyaltyCard.store);
|
assertEquals("store1", loyaltyCard.store);
|
||||||
assertEquals("note1", loyaltyCard.note);
|
assertEquals("note1", loyaltyCard.note);
|
||||||
@@ -105,7 +105,7 @@ public class DatabaseTest {
|
|||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1);
|
||||||
assertNotNull(loyaltyCard);
|
assertNotNull(loyaltyCard);
|
||||||
assertEquals("store", loyaltyCard.store);
|
assertEquals("store", loyaltyCard.store);
|
||||||
assertEquals("note", loyaltyCard.note);
|
assertEquals("note", loyaltyCard.note);
|
||||||
@@ -138,7 +138,7 @@ public class DatabaseTest {
|
|||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1);
|
||||||
assertNotNull(loyaltyCard);
|
assertNotNull(loyaltyCard);
|
||||||
assertEquals("", loyaltyCard.store);
|
assertEquals("", loyaltyCard.store);
|
||||||
assertEquals("", loyaltyCard.note);
|
assertEquals("", loyaltyCard.note);
|
||||||
@@ -480,7 +480,7 @@ public class DatabaseTest {
|
|||||||
dbHelper.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION);
|
dbHelper.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION);
|
||||||
|
|
||||||
// Determine that the entries are queryable and the fields are correct
|
// Determine that the entries are queryable and the fields are correct
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(database, newCardId);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), database, newCardId);
|
||||||
assertEquals("store", card.store);
|
assertEquals("store", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
assertEquals(null, card.validFrom);
|
assertEquals(null, card.validFrom);
|
||||||
@@ -496,7 +496,7 @@ public class DatabaseTest {
|
|||||||
assertEquals(100, card.zoomLevel);
|
assertEquals(100, card.zoomLevel);
|
||||||
|
|
||||||
// Determine that the entries are queryable and the fields are correct
|
// Determine that the entries are queryable and the fields are correct
|
||||||
LoyaltyCard card2 = DBHelper.getLoyaltyCard(database, newCardId2);
|
LoyaltyCard card2 = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), database, newCardId2);
|
||||||
assertEquals("store", card2.store);
|
assertEquals("store", card2.store);
|
||||||
assertEquals("", card2.note);
|
assertEquals("", card2.note);
|
||||||
assertEquals(null, card2.validFrom);
|
assertEquals(null, card2.validFrom);
|
||||||
@@ -523,7 +523,7 @@ public class DatabaseTest {
|
|||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1);
|
||||||
assertNotNull(loyaltyCard);
|
assertNotNull(loyaltyCard);
|
||||||
assertEquals("store", loyaltyCard.store);
|
assertEquals("store", loyaltyCard.store);
|
||||||
assertEquals("note", loyaltyCard.note);
|
assertEquals("note", loyaltyCard.note);
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ public class ImportExportTest {
|
|||||||
boolean result = (id != -1);
|
boolean result = (id != -1);
|
||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, (int) id);
|
||||||
assertEquals("No Expiry", card.store);
|
assertEquals("No Expiry", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
assertEquals(null, card.validFrom);
|
assertEquals(null, card.validFrom);
|
||||||
@@ -111,7 +111,7 @@ public class ImportExportTest {
|
|||||||
result = (id != -1);
|
result = (id != -1);
|
||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, (int) id);
|
||||||
assertEquals("Past", card.store);
|
assertEquals("Past", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
assertEquals(null, card.validFrom);
|
assertEquals(null, card.validFrom);
|
||||||
@@ -128,7 +128,7 @@ public class ImportExportTest {
|
|||||||
result = (id != -1);
|
result = (id != -1);
|
||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, (int) id);
|
||||||
assertEquals("Today", card.store);
|
assertEquals("Today", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
assertEquals(null, card.validFrom);
|
assertEquals(null, card.validFrom);
|
||||||
@@ -148,7 +148,7 @@ public class ImportExportTest {
|
|||||||
result = (id != -1);
|
result = (id != -1);
|
||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, (int) id);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, (int) id);
|
||||||
assertEquals("Future", card.store);
|
assertEquals("Future", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
assertEquals(null, card.validFrom);
|
assertEquals(null, card.validFrom);
|
||||||
@@ -174,7 +174,7 @@ public class ImportExportTest {
|
|||||||
int index = 1;
|
int index = 1;
|
||||||
|
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(cursor);
|
LoyaltyCard card = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor);
|
||||||
|
|
||||||
String expectedStore = String.format("store, \"%4d", index);
|
String expectedStore = String.format("store, \"%4d", index);
|
||||||
String expectedNote = String.format("note, \"%4d", index);
|
String expectedNote = String.format("note, \"%4d", index);
|
||||||
@@ -200,7 +200,7 @@ public class ImportExportTest {
|
|||||||
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
||||||
|
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(cursor);
|
LoyaltyCard card = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor);
|
||||||
|
|
||||||
// ID goes up for duplicates (b/c the cursor orders by store), down for originals
|
// ID goes up for duplicates (b/c the cursor orders by store), down for originals
|
||||||
int index = card.id > numCards ? card.id - numCards : numCards - card.id + 1;
|
int index = card.id > numCards ? card.id - numCards : numCards - card.id + 1;
|
||||||
@@ -236,7 +236,7 @@ public class ImportExportTest {
|
|||||||
|
|
||||||
while (index < 10) {
|
while (index < 10) {
|
||||||
cursor.moveToNext();
|
cursor.moveToNext();
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(cursor);
|
LoyaltyCard card = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor);
|
||||||
|
|
||||||
String expectedStore = String.format("store, \"%4d", index);
|
String expectedStore = String.format("store, \"%4d", index);
|
||||||
String expectedNote = String.format("note, \"%4d", index);
|
String expectedNote = String.format("note, \"%4d", index);
|
||||||
@@ -258,7 +258,7 @@ public class ImportExportTest {
|
|||||||
|
|
||||||
index = 1;
|
index = 1;
|
||||||
while (cursor.moveToNext() && index < 5) {
|
while (cursor.moveToNext() && index < 5) {
|
||||||
LoyaltyCard card = LoyaltyCard.fromCursor(cursor);
|
LoyaltyCard card = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor);
|
||||||
|
|
||||||
String expectedStore = String.format("store, \"%4d", index);
|
String expectedStore = String.format("store, \"%4d", index);
|
||||||
String expectedNote = String.format("note, \"%4d", index);
|
String expectedNote = String.format("note, \"%4d", index);
|
||||||
@@ -649,7 +649,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("store", card.store);
|
assertEquals("store", card.store);
|
||||||
assertEquals("note", card.note);
|
assertEquals("note", card.note);
|
||||||
@@ -675,7 +675,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("store", card.store);
|
assertEquals("store", card.store);
|
||||||
assertEquals("note", card.note);
|
assertEquals("note", card.note);
|
||||||
@@ -713,7 +713,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("store", card.store);
|
assertEquals("store", card.store);
|
||||||
assertEquals("note", card.note);
|
assertEquals("note", card.note);
|
||||||
@@ -739,7 +739,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("store", card.store);
|
assertEquals("store", card.store);
|
||||||
assertEquals("note", card.note);
|
assertEquals("note", card.note);
|
||||||
@@ -765,7 +765,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("store", card.store);
|
assertEquals("store", card.store);
|
||||||
assertEquals("note", card.note);
|
assertEquals("note", card.note);
|
||||||
@@ -798,7 +798,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("store", card.store);
|
assertEquals("store", card.store);
|
||||||
assertEquals("note", card.note);
|
assertEquals("note", card.note);
|
||||||
@@ -831,7 +831,7 @@ public class ImportExportTest {
|
|||||||
|
|
||||||
// Create card 1
|
// Create card 1
|
||||||
int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", new Date(1601510400), new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null,0);
|
int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", new Date(1601510400), new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null,0);
|
||||||
loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId));
|
loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, loyaltyCardId));
|
||||||
DBHelper.insertGroup(mDatabase, "One");
|
DBHelper.insertGroup(mDatabase, "One");
|
||||||
List<Group> groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One"));
|
List<Group> groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One"));
|
||||||
DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, groups);
|
DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, groups);
|
||||||
@@ -845,7 +845,7 @@ public class ImportExportTest {
|
|||||||
|
|
||||||
// Create card 2
|
// Create card 2
|
||||||
loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", null, null, new BigDecimal(0), null, "123456", null, null, 2, 1, null,0);
|
loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", null, null, new BigDecimal(0), null, "123456", null, null, 2, 1, null,0);
|
||||||
loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId));
|
loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, loyaltyCardId));
|
||||||
|
|
||||||
// Export everything
|
// Export everything
|
||||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
@@ -863,7 +863,7 @@ public class ImportExportTest {
|
|||||||
for (Integer loyaltyCardID : loyaltyCardHashMap.keySet()) {
|
for (Integer loyaltyCardID : loyaltyCardHashMap.keySet()) {
|
||||||
LoyaltyCard loyaltyCard = loyaltyCardHashMap.get(loyaltyCardID);
|
LoyaltyCard loyaltyCard = loyaltyCardHashMap.get(loyaltyCardID);
|
||||||
|
|
||||||
LoyaltyCard dbLoyaltyCard = DBHelper.getLoyaltyCard(mDatabase, loyaltyCardID);
|
LoyaltyCard dbLoyaltyCard = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, loyaltyCardID);
|
||||||
|
|
||||||
assertEquals(loyaltyCard.id, dbLoyaltyCard.id);
|
assertEquals(loyaltyCard.id, dbLoyaltyCard.id);
|
||||||
assertEquals(loyaltyCard.store, dbLoyaltyCard.store);
|
assertEquals(loyaltyCard.store, dbLoyaltyCard.store);
|
||||||
@@ -950,7 +950,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(Arrays.asList(8, 6), DBHelper.getGroupCardIds(mDatabase, "Fashion"));
|
assertEquals(Arrays.asList(8, 6), DBHelper.getGroupCardIds(mDatabase, "Fashion"));
|
||||||
|
|
||||||
// Check all cards
|
// Check all cards
|
||||||
LoyaltyCard card1 = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card1 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("Card 1", card1.store);
|
assertEquals("Card 1", card1.store);
|
||||||
assertEquals("Note 1", card1.note);
|
assertEquals("Note 1", card1.note);
|
||||||
@@ -967,7 +967,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.back));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.back));
|
||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.icon));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.icon));
|
||||||
|
|
||||||
LoyaltyCard card8 = DBHelper.getLoyaltyCard(mDatabase, 8);
|
LoyaltyCard card8 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 8);
|
||||||
|
|
||||||
assertEquals("Clothes Store", card8.store);
|
assertEquals("Clothes Store", card8.store);
|
||||||
assertEquals("Note about store", card8.note);
|
assertEquals("Note about store", card8.note);
|
||||||
@@ -984,7 +984,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.back));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.back));
|
||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.icon));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.icon));
|
||||||
|
|
||||||
LoyaltyCard card2 = DBHelper.getLoyaltyCard(mDatabase, 2);
|
LoyaltyCard card2 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2);
|
||||||
|
|
||||||
assertEquals("Department Store", card2.store);
|
assertEquals("Department Store", card2.store);
|
||||||
assertEquals("", card2.note);
|
assertEquals("", card2.note);
|
||||||
@@ -1001,7 +1001,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.back));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.back));
|
||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.icon));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.icon));
|
||||||
|
|
||||||
LoyaltyCard card3 = DBHelper.getLoyaltyCard(mDatabase, 3);
|
LoyaltyCard card3 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3);
|
||||||
|
|
||||||
assertEquals("Grocery Store", card3.store);
|
assertEquals("Grocery Store", card3.store);
|
||||||
assertEquals("Multiline note about grocery store\n\nwith blank line", card3.note);
|
assertEquals("Multiline note about grocery store\n\nwith blank line", card3.note);
|
||||||
@@ -1018,7 +1018,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.back));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.back));
|
||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.icon));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.icon));
|
||||||
|
|
||||||
LoyaltyCard card4 = DBHelper.getLoyaltyCard(mDatabase, 4);
|
LoyaltyCard card4 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 4);
|
||||||
|
|
||||||
assertEquals("Pharmacy", card4.store);
|
assertEquals("Pharmacy", card4.store);
|
||||||
assertEquals("", card4.note);
|
assertEquals("", card4.note);
|
||||||
@@ -1035,7 +1035,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.back));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.back));
|
||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.icon));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.icon));
|
||||||
|
|
||||||
LoyaltyCard card5 = DBHelper.getLoyaltyCard(mDatabase, 5);
|
LoyaltyCard card5 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 5);
|
||||||
|
|
||||||
assertEquals("Restaurant", card5.store);
|
assertEquals("Restaurant", card5.store);
|
||||||
assertEquals("Note about restaurant here", card5.note);
|
assertEquals("Note about restaurant here", card5.note);
|
||||||
@@ -1052,7 +1052,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.back));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.back));
|
||||||
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.icon));
|
assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.icon));
|
||||||
|
|
||||||
LoyaltyCard card6 = DBHelper.getLoyaltyCard(mDatabase, 6);
|
LoyaltyCard card6 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 6);
|
||||||
|
|
||||||
assertEquals("Shoe Store", card6.store);
|
assertEquals("Shoe Store", card6.store);
|
||||||
assertEquals("", card6.note);
|
assertEquals("", card6.note);
|
||||||
@@ -1081,7 +1081,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("Hema", card.store);
|
assertEquals("Hema", card.store);
|
||||||
assertEquals("2021-03-24 18:35:08 UTC", card.note);
|
assertEquals("2021-03-24 18:35:08 UTC", card.note);
|
||||||
@@ -1094,7 +1094,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(null, card.barcodeType);
|
assertEquals(null, card.barcodeType);
|
||||||
assertEquals(0, card.starStatus);
|
assertEquals(0, card.starStatus);
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, 2);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2);
|
||||||
|
|
||||||
assertEquals("test", card.store);
|
assertEquals("test", card.store);
|
||||||
assertEquals("Test\n2021-03-24 18:34:19 UTC", card.note);
|
assertEquals("Test\n2021-03-24 18:34:19 UTC", card.note);
|
||||||
@@ -1107,7 +1107,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(null, card.barcodeType);
|
assertEquals(null, card.barcodeType);
|
||||||
assertEquals(0, card.starStatus);
|
assertEquals(0, card.starStatus);
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, 3);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3);
|
||||||
|
|
||||||
assertEquals("Albert Heijn", card.store);
|
assertEquals("Albert Heijn", card.store);
|
||||||
assertEquals("Bonus Kaart\n2021-03-24 16:47:47 UTC\nFirst Last", card.note);
|
assertEquals("Bonus Kaart\n2021-03-24 16:47:47 UTC\nFirst Last", card.note);
|
||||||
@@ -1138,7 +1138,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("Air Miles", card.store);
|
assertEquals("Air Miles", card.store);
|
||||||
assertEquals("szjsbs", card.note);
|
assertEquals("szjsbs", card.note);
|
||||||
@@ -1156,7 +1156,7 @@ public class ImportExportTest {
|
|||||||
assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.back)));
|
assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.back)));
|
||||||
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.icon));
|
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.icon));
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, 2);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2);
|
||||||
|
|
||||||
assertEquals("GAMMA", card.store);
|
assertEquals("GAMMA", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
@@ -1174,7 +1174,7 @@ public class ImportExportTest {
|
|||||||
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.back));
|
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.back));
|
||||||
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.icon));
|
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.icon));
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, 3);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3);
|
||||||
|
|
||||||
assertEquals("jö", card.store);
|
assertEquals("jö", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
@@ -1205,7 +1205,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("Foo", card.store);
|
assertEquals("Foo", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
@@ -1223,7 +1223,7 @@ public class ImportExportTest {
|
|||||||
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.back));
|
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.back));
|
||||||
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.icon));
|
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.icon));
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, 2);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2);
|
||||||
|
|
||||||
assertEquals("Air Miles", card.store);
|
assertEquals("Air Miles", card.store);
|
||||||
assertEquals("szjsbs\nMiles", card.note);
|
assertEquals("szjsbs\nMiles", card.note);
|
||||||
@@ -1241,7 +1241,7 @@ public class ImportExportTest {
|
|||||||
assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.back)));
|
assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.back)));
|
||||||
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.icon));
|
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.icon));
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, 3);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3);
|
||||||
|
|
||||||
assertEquals("GAMMA", card.store);
|
assertEquals("GAMMA", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
@@ -1259,7 +1259,7 @@ public class ImportExportTest {
|
|||||||
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, ImageLocationType.back));
|
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, ImageLocationType.back));
|
||||||
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, ImageLocationType.icon));
|
assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, ImageLocationType.icon));
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, 4);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 4);
|
||||||
|
|
||||||
assertEquals("jö", card.store);
|
assertEquals("jö", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
@@ -1289,7 +1289,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(ImportExportResultType.Success, result.resultType());
|
assertEquals(ImportExportResultType.Success, result.resultType());
|
||||||
assertEquals(2, DBHelper.getLoyaltyCardCount(mDatabase));
|
assertEquals(2, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
assertEquals("Clothes Store", card.store);
|
assertEquals("Clothes Store", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
@@ -1303,7 +1303,7 @@ public class ImportExportTest {
|
|||||||
assertEquals(Color.GRAY, (long) card.headerColor);
|
assertEquals(Color.GRAY, (long) card.headerColor);
|
||||||
assertEquals(0, card.starStatus);
|
assertEquals(0, card.starStatus);
|
||||||
|
|
||||||
card = DBHelper.getLoyaltyCard(mDatabase, 2);
|
card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2);
|
||||||
|
|
||||||
assertEquals("Department Store", card.store);
|
assertEquals("Department Store", card.store);
|
||||||
assertEquals("", card.note);
|
assertEquals("", card.note);
|
||||||
|
|||||||
@@ -25,12 +25,13 @@ import java.util.Date;
|
|||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class ImportURITest {
|
public class ImportURITest {
|
||||||
|
private Activity activity;
|
||||||
private ImportURIHelper importURIHelper;
|
private ImportURIHelper importURIHelper;
|
||||||
private SQLiteDatabase mDatabase;
|
private SQLiteDatabase mDatabase;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
Activity activity = Robolectric.setupActivity(MainActivity.class);
|
activity = Robolectric.setupActivity(MainActivity.class);
|
||||||
importURIHelper = new ImportURIHelper(activity);
|
importURIHelper = new ImportURIHelper(activity);
|
||||||
mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase();
|
mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase();
|
||||||
}
|
}
|
||||||
@@ -43,7 +44,7 @@ public class ImportURITest {
|
|||||||
DBHelper.insertLoyaltyCard(mDatabase, "store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase, "store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null,0);
|
||||||
|
|
||||||
// Get card
|
// Get card
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
// Card to URI
|
// Card to URI
|
||||||
Uri cardUri = importURIHelper.toUri(card);
|
Uri cardUri = importURIHelper.toUri(card);
|
||||||
@@ -73,7 +74,7 @@ public class ImportURITest {
|
|||||||
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null,0);
|
||||||
|
|
||||||
// Get card
|
// Get card
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
// Card to URI
|
// Card to URI
|
||||||
Uri cardUri = importURIHelper.toUri(card);
|
Uri cardUri = importURIHelper.toUri(card);
|
||||||
@@ -103,7 +104,7 @@ public class ImportURITest {
|
|||||||
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null,0);
|
||||||
|
|
||||||
// Get card
|
// Get card
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
// Card to URI, with a trailing slash
|
// Card to URI, with a trailing slash
|
||||||
Uri cardUri = importURIHelper.toUri(card).buildUpon().path("/share/").build();
|
Uri cardUri = importURIHelper.toUri(card).buildUpon().path("/share/").build();
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void TestCursorAdapterEmptyNote() {
|
public void TestCursorAdapterEmptyNote() {
|
||||||
DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
||||||
cursor.moveToFirst();
|
cursor.moveToFirst();
|
||||||
@@ -112,7 +112,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void TestCursorAdapterWithNote() {
|
public void TestCursorAdapterWithNote() {
|
||||||
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
||||||
cursor.moveToFirst();
|
cursor.moveToFirst();
|
||||||
@@ -137,7 +137,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
assertEquals(4, cursor.getCount());
|
assertEquals(4, cursor.getCount());
|
||||||
|
|
||||||
assertTrue(cursor.moveToFirst());
|
assertTrue(cursor.moveToFirst());
|
||||||
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(cursor);
|
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor);
|
||||||
assertEquals("storeD", loyaltyCard.store);
|
assertEquals("storeD", loyaltyCard.store);
|
||||||
View view = createView(cursor);
|
View view = createView(cursor);
|
||||||
ConstraintLayout star = view.findViewById(R.id.star);
|
ConstraintLayout star = view.findViewById(R.id.star);
|
||||||
@@ -146,7 +146,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
assertEquals(View.GONE, archive.getVisibility());
|
assertEquals(View.GONE, archive.getVisibility());
|
||||||
|
|
||||||
assertTrue(cursor.moveToNext());
|
assertTrue(cursor.moveToNext());
|
||||||
loyaltyCard = LoyaltyCard.fromCursor(cursor);
|
loyaltyCard = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor);
|
||||||
assertEquals("storeC", loyaltyCard.store);
|
assertEquals("storeC", loyaltyCard.store);
|
||||||
view = createView(cursor);
|
view = createView(cursor);
|
||||||
star = view.findViewById(R.id.star);
|
star = view.findViewById(R.id.star);
|
||||||
@@ -155,7 +155,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
assertEquals(View.GONE, archive.getVisibility());
|
assertEquals(View.GONE, archive.getVisibility());
|
||||||
|
|
||||||
assertTrue(cursor.moveToNext());
|
assertTrue(cursor.moveToNext());
|
||||||
loyaltyCard = LoyaltyCard.fromCursor(cursor);
|
loyaltyCard = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor);
|
||||||
assertEquals("storeB", loyaltyCard.store);
|
assertEquals("storeB", loyaltyCard.store);
|
||||||
view = createView(cursor);
|
view = createView(cursor);
|
||||||
star = view.findViewById(R.id.star);
|
star = view.findViewById(R.id.star);
|
||||||
@@ -164,7 +164,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
assertEquals(View.VISIBLE, archive.getVisibility());
|
assertEquals(View.VISIBLE, archive.getVisibility());
|
||||||
|
|
||||||
assertTrue(cursor.moveToNext());
|
assertTrue(cursor.moveToNext());
|
||||||
loyaltyCard = LoyaltyCard.fromCursor(cursor);
|
loyaltyCard = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor);
|
||||||
assertEquals("storeA", loyaltyCard.store);
|
assertEquals("storeA", loyaltyCard.store);
|
||||||
view = createView(cursor);
|
view = createView(cursor);
|
||||||
star = view.findViewById(R.id.star);
|
star = view.findViewById(R.id.star);
|
||||||
@@ -178,7 +178,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void TestCursorAdapter0Points() {
|
public void TestCursorAdapter0Points() {
|
||||||
DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
||||||
cursor.moveToFirst();
|
cursor.moveToFirst();
|
||||||
@@ -193,7 +193,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void TestCursorAdapter0EUR() {
|
public void TestCursorAdapter0EUR() {
|
||||||
DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
||||||
cursor.moveToFirst();
|
cursor.moveToFirst();
|
||||||
@@ -208,7 +208,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void TestCursorAdapter100Points() {
|
public void TestCursorAdapter100Points() {
|
||||||
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
||||||
cursor.moveToFirst();
|
cursor.moveToFirst();
|
||||||
@@ -223,7 +223,7 @@ public class LoyaltyCardCursorAdapterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void TestCursorAdapter10USD() {
|
public void TestCursorAdapter10USD() {
|
||||||
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1);
|
||||||
|
|
||||||
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
|
||||||
cursor.moveToFirst();
|
cursor.moveToFirst();
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
|
|
||||||
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
|
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
|
||||||
|
|
||||||
LoyaltyCard card = DBHelper.getLoyaltyCard(database, 1);
|
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), database, 1);
|
||||||
assertEquals(store, card.store);
|
assertEquals(store, card.store);
|
||||||
assertEquals(note, card.note);
|
assertEquals(note, card.note);
|
||||||
assertEquals(balance, card.balance);
|
assertEquals(balance, card.balance);
|
||||||
@@ -216,7 +216,7 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
* Initiate and complete a barcode capture, either in success
|
* Initiate and complete a barcode capture, either in success
|
||||||
* or in failure
|
* or in failure
|
||||||
*/
|
*/
|
||||||
private void captureBarcodeWithResult(final Activity activity, final boolean success) throws IOException {
|
private void captureBarcodeWithResult(final Activity activity, final boolean success) {
|
||||||
// Start image capture
|
// Start image capture
|
||||||
final Button startButton = activity.findViewById(R.id.enterButton);
|
final Button startButton = activity.findViewById(R.id.enterButton);
|
||||||
startButton.performClick();
|
startButton.performClick();
|
||||||
@@ -231,10 +231,14 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
assertNotNull(bundle);
|
assertNotNull(bundle);
|
||||||
|
|
||||||
Intent resultIntent = new Intent(intent);
|
Intent resultIntent = new Intent(intent);
|
||||||
Bundle resultBundle = new Bundle();
|
|
||||||
resultBundle.putString(BarcodeSelectorActivity.BARCODE_CONTENTS, BARCODE_DATA);
|
LoyaltyCard loyaltyCard = new LoyaltyCard();
|
||||||
resultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, BARCODE_TYPE.name());
|
loyaltyCard.setBarcodeId(null);
|
||||||
resultIntent.putExtras(resultBundle);
|
loyaltyCard.setBarcodeType(BARCODE_TYPE);
|
||||||
|
loyaltyCard.setCardId(BARCODE_DATA);
|
||||||
|
ParseResult parseResult = new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard);
|
||||||
|
|
||||||
|
resultIntent.putExtras(parseResult.toLoyaltyCardBundle(activity));
|
||||||
|
|
||||||
// Respond to image capture, success
|
// Respond to image capture, success
|
||||||
shadowOf(activity).receiveResult(
|
shadowOf(activity).receiveResult(
|
||||||
@@ -247,7 +251,7 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
* Initiate and complete a barcode selection, either in success
|
* Initiate and complete a barcode selection, either in success
|
||||||
* or in failure
|
* or in failure
|
||||||
*/
|
*/
|
||||||
private void selectBarcodeWithResult(final Activity activity, final String barcodeData, final String barcodeType, final boolean success) throws IOException {
|
private void selectBarcodeWithResult(final Activity activity, final String barcodeData, final String barcodeType, final boolean success) {
|
||||||
// Start barcode selector
|
// Start barcode selector
|
||||||
final Button startButton = activity.findViewById(R.id.enterButton);
|
final Button startButton = activity.findViewById(R.id.enterButton);
|
||||||
startButton.performClick();
|
startButton.performClick();
|
||||||
@@ -267,10 +271,14 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
assertNotNull(bundle);
|
assertNotNull(bundle);
|
||||||
|
|
||||||
Intent resultIntent = new Intent(intent);
|
Intent resultIntent = new Intent(intent);
|
||||||
Bundle resultBundle = new Bundle();
|
|
||||||
resultBundle.putString(BarcodeSelectorActivity.BARCODE_FORMAT, barcodeType);
|
LoyaltyCard loyaltyCard = new LoyaltyCard();
|
||||||
resultBundle.putString(BarcodeSelectorActivity.BARCODE_CONTENTS, barcodeData);
|
loyaltyCard.setBarcodeId(null);
|
||||||
resultIntent.putExtras(resultBundle);
|
loyaltyCard.setBarcodeType(barcodeType != null ? CatimaBarcode.fromName(barcodeType) : null);
|
||||||
|
loyaltyCard.setCardId(barcodeData);
|
||||||
|
ParseResult parseResult = new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard);
|
||||||
|
|
||||||
|
resultIntent.putExtras(parseResult.toLoyaltyCardBundle(activity));
|
||||||
|
|
||||||
// Respond to barcode selection, success
|
// Respond to barcode selection, success
|
||||||
shadowOf(activity).receiveResult(
|
shadowOf(activity).receiveResult(
|
||||||
@@ -294,10 +302,17 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
} else if (fieldType == FieldTypeView.ImageView) {
|
} else if (fieldType == FieldTypeView.ImageView) {
|
||||||
ImageView imageView = (ImageView) view;
|
ImageView imageView = (ImageView) view;
|
||||||
Bitmap image = null;
|
Bitmap image = null;
|
||||||
if (imageView.getTag() != null) {
|
try {
|
||||||
image = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
|
image = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
// This is probably a VectorDrawable, the placeholder image. Aka: No image.
|
||||||
}
|
}
|
||||||
assertEquals(contents, image);
|
|
||||||
|
if (contents == null && image == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(image.sameAs((Bitmap) contents));
|
||||||
} else {
|
} else {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
@@ -411,8 +426,8 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
cardIdField.setText("12345678");
|
cardIdField.setText("12345678");
|
||||||
barcodeField.setText("87654321");
|
barcodeField.setText("87654321");
|
||||||
barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName());
|
barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName());
|
||||||
activity.setCardImage(frontImageView, frontBitmap, true);
|
activity.setCardImage(ImageLocationType.front, frontImageView, frontBitmap, true);
|
||||||
activity.setCardImage(backImageView, backBitmap, true);
|
activity.setCardImage(ImageLocationType.back, backImageView, backBitmap, true);
|
||||||
|
|
||||||
shadowOf(getMainLooper()).idle();
|
shadowOf(getMainLooper()).idle();
|
||||||
|
|
||||||
@@ -575,13 +590,13 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
// A change was made
|
// A change was made
|
||||||
shadowOf(activity).clickMenuItem(android.R.id.home);
|
shadowOf(activity).clickMenuItem(android.R.id.home);
|
||||||
assertEquals(true, activity.confirmExitDialog.isShowing());
|
assertEquals(true, activity.confirmExitDialog.isShowing());
|
||||||
assertEquals(true, activity.hasChanged);
|
assertEquals(true, activity.viewModel.getHasChanged());
|
||||||
assertEquals(false, activity.isFinishing());
|
assertEquals(false, activity.isFinishing());
|
||||||
|
|
||||||
// Exit after setting hasChanged to false
|
// Exit after setting hasChanged to false
|
||||||
activity.hasChanged = false;
|
activity.viewModel.setHasChanged(false);
|
||||||
shadowOf(activity).clickMenuItem(android.R.id.home);
|
shadowOf(activity).clickMenuItem(android.R.id.home);
|
||||||
assertEquals(false, activity.hasChanged);
|
assertEquals(false, activity.viewModel.getHasChanged());
|
||||||
assertEquals(true, activity.isFinishing());
|
assertEquals(true, activity.isFinishing());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -698,13 +713,13 @@ public class LoyaltyCardViewActivityTest {
|
|||||||
// A change was made
|
// A change was made
|
||||||
shadowOf(activity).clickMenuItem(android.R.id.home);
|
shadowOf(activity).clickMenuItem(android.R.id.home);
|
||||||
assertEquals(true, activity.confirmExitDialog.isShowing());
|
assertEquals(true, activity.confirmExitDialog.isShowing());
|
||||||
assertEquals(true, activity.hasChanged);
|
assertEquals(true, activity.viewModel.getHasChanged());
|
||||||
assertEquals(false, activity.isFinishing());
|
assertEquals(false, activity.isFinishing());
|
||||||
|
|
||||||
// Exit after setting hasChanged to false
|
// Exit after setting hasChanged to false
|
||||||
activity.hasChanged = false;
|
activity.viewModel.setHasChanged(false);
|
||||||
shadowOf(activity).clickMenuItem(android.R.id.home);
|
shadowOf(activity).clickMenuItem(android.R.id.home);
|
||||||
assertEquals(false, activity.hasChanged);
|
assertEquals(false, activity.viewModel.getHasChanged());
|
||||||
assertEquals(true, activity.isFinishing());
|
assertEquals(true, activity.isFinishing());
|
||||||
|
|
||||||
database.close();
|
database.close();
|
||||||
|
|||||||
@@ -3,18 +3,22 @@ package protect.card_locker;
|
|||||||
import static android.os.Looper.getMainLooper;
|
import static android.os.Looper.getMainLooper;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.robolectric.Shadows.shadowOf;
|
import static org.robolectric.Shadows.shadowOf;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.appcompat.widget.SearchView;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
@@ -210,9 +214,12 @@ public class MainActivityTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFiltering() {
|
public void testFiltering() {
|
||||||
|
// FIXME: This test directly sets mFilter instead of using mSearchView, making it not test the search flow correctly
|
||||||
|
// It may falsely succeed or fail, but we're leaving it here so we at least test something instead of nothing
|
||||||
ActivityController activityController = Robolectric.buildActivity(MainActivity.class).create();
|
ActivityController activityController = Robolectric.buildActivity(MainActivity.class).create();
|
||||||
|
|
||||||
MainActivity mainActivity = (MainActivity) activityController.get();
|
MainActivity mainActivity = (MainActivity) activityController.get();
|
||||||
|
|
||||||
activityController.start();
|
activityController.start();
|
||||||
activityController.resume();
|
activityController.resume();
|
||||||
|
|
||||||
@@ -244,6 +251,16 @@ public class MainActivityTest {
|
|||||||
activityController.pause();
|
activityController.pause();
|
||||||
activityController.resume();
|
activityController.resume();
|
||||||
|
|
||||||
|
Configuration configuration = mainActivity.getResources().getConfiguration();
|
||||||
|
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
||||||
|
mainActivity.onConfigurationChanged(configuration);
|
||||||
|
|
||||||
|
configuration.orientation = Configuration.ORIENTATION_PORTRAIT;
|
||||||
|
mainActivity.onConfigurationChanged(configuration);
|
||||||
|
|
||||||
|
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
||||||
|
mainActivity.onConfigurationChanged(configuration);
|
||||||
|
|
||||||
assertEquals(View.GONE, helpSection.getVisibility());
|
assertEquals(View.GONE, helpSection.getVisibility());
|
||||||
assertEquals(View.GONE, noMatchingCardsText.getVisibility());
|
assertEquals(View.GONE, noMatchingCardsText.getVisibility());
|
||||||
assertEquals(View.VISIBLE, list.getVisibility());
|
assertEquals(View.VISIBLE, list.getVisibility());
|
||||||
@@ -337,6 +354,12 @@ public class MainActivityTest {
|
|||||||
|
|
||||||
mainActivity.mFilter = "second";
|
mainActivity.mFilter = "second";
|
||||||
|
|
||||||
|
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
||||||
|
mainActivity.onConfigurationChanged(configuration);
|
||||||
|
|
||||||
|
configuration.orientation = Configuration.ORIENTATION_PORTRAIT;
|
||||||
|
mainActivity.onConfigurationChanged(configuration);
|
||||||
|
|
||||||
activityController.pause();
|
activityController.pause();
|
||||||
activityController.resume();
|
activityController.resume();
|
||||||
|
|
||||||
@@ -371,6 +394,10 @@ public class MainActivityTest {
|
|||||||
|
|
||||||
mainActivity.mFilter = "company";
|
mainActivity.mFilter = "company";
|
||||||
|
|
||||||
|
// Rotate to landscape (right)
|
||||||
|
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
||||||
|
mainActivity.onConfigurationChanged(configuration);
|
||||||
|
|
||||||
activityController.pause();
|
activityController.pause();
|
||||||
activityController.resume();
|
activityController.resume();
|
||||||
|
|
||||||
@@ -443,4 +470,43 @@ public class MainActivityTest {
|
|||||||
|
|
||||||
database.close();
|
database.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchQueryRestorationAfterNavigatingBack() {
|
||||||
|
ActivityController activityController = Robolectric.buildActivity(MainActivity.class).create();
|
||||||
|
|
||||||
|
MainActivity mainActivity = (MainActivity) activityController.get();
|
||||||
|
activityController.start();
|
||||||
|
activityController.resume();
|
||||||
|
|
||||||
|
final Menu menu = shadowOf(Robolectric.setupActivity(MainActivity.class)).getOptionsMenu();
|
||||||
|
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
|
||||||
|
SearchView mSearchView = (SearchView) searchMenuItem.getActionView();
|
||||||
|
|
||||||
|
|
||||||
|
SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase();
|
||||||
|
DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
||||||
|
DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
|
||||||
|
|
||||||
|
String finalQuery = "store";
|
||||||
|
assert mSearchView != null;
|
||||||
|
mSearchView.setQuery(finalQuery, false);
|
||||||
|
|
||||||
|
activityController.pause();
|
||||||
|
activityController.resume();
|
||||||
|
|
||||||
|
// Simulation of what happens when users comes back after picking up card
|
||||||
|
// We simulate expanding and setting the Query that we want to restore (in code it is from finalQuery String)
|
||||||
|
searchMenuItem.expandActionView();
|
||||||
|
|
||||||
|
mSearchView.setQuery(finalQuery, false);
|
||||||
|
|
||||||
|
activityController.pause();
|
||||||
|
activityController.resume();
|
||||||
|
|
||||||
|
assertTrue(searchMenuItem.isActionViewExpanded());
|
||||||
|
assertEquals("store", mSearchView.getQuery().toString());
|
||||||
|
|
||||||
|
database.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
238
app/src/test/java/protect/card_locker/PkpassTest.kt
Normal file
238
app/src/test/java/protect/card_locker/PkpassTest.kt
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
package protect.card_locker
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.net.Uri
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import com.google.zxing.BarcodeFormat
|
||||||
|
import org.junit.Assert
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.robolectric.RobolectricTestRunner
|
||||||
|
import org.robolectric.shadows.ShadowContentResolver
|
||||||
|
import org.robolectric.shadows.ShadowLog
|
||||||
|
import java.math.BigDecimal
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
@RunWith(RobolectricTestRunner::class)
|
||||||
|
class PkpassTest {
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
ShadowLog.stream = System.out
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testEurowingsPass() {
|
||||||
|
// Prepare
|
||||||
|
val context: Context = ApplicationProvider.getApplicationContext()
|
||||||
|
val pkpass = "pkpass/Eurowings/Eurowings.pkpass"
|
||||||
|
val image = "pkpass/Eurowings/logo@2x.png"
|
||||||
|
|
||||||
|
val pkpassUri = Uri.parse(pkpass)
|
||||||
|
val imageUri = Uri.parse(image)
|
||||||
|
ShadowContentResolver().registerInputStream(pkpassUri, javaClass.getResourceAsStream(pkpass))
|
||||||
|
ShadowContentResolver().registerInputStream(imageUri, javaClass.getResourceAsStream(image))
|
||||||
|
|
||||||
|
val parser = PkpassParser(context, pkpassUri)
|
||||||
|
val imageBitmap = BitmapFactory.decodeStream(context.contentResolver.openInputStream(imageUri))
|
||||||
|
|
||||||
|
// Confirm this does not have languages
|
||||||
|
Assert.assertEquals(listOf("de", "en"), parser.listLocales())
|
||||||
|
|
||||||
|
// Confirm correct parsing (en)
|
||||||
|
var parsedCard = parser.toLoyaltyCard("de")
|
||||||
|
|
||||||
|
Assert.assertEquals(-1, parsedCard.id)
|
||||||
|
Assert.assertEquals("EUROWINGS", parsedCard.store)
|
||||||
|
Assert.assertEquals("Eurowings Boarding Pass\n" +
|
||||||
|
"\n" +
|
||||||
|
"Gate: B61\n" +
|
||||||
|
"Sitz: 12D\n" +
|
||||||
|
"\n" +
|
||||||
|
"Cologne-Bonn: CGN\n" +
|
||||||
|
"Dubrovnik: DBV\n" +
|
||||||
|
"\n" +
|
||||||
|
"Name: John Doe\n" +
|
||||||
|
"Status: -\n" +
|
||||||
|
"Gruppe: GROUP 1\n" +
|
||||||
|
"Tarif: SMART\n" +
|
||||||
|
"\n" +
|
||||||
|
"Flug: EW 954\n" +
|
||||||
|
"Datum: 08/09/2019\n" +
|
||||||
|
"Boarding: 05:00\n" +
|
||||||
|
"Gate Schließt: 05:15\n" +
|
||||||
|
"\n" +
|
||||||
|
"Eurowings wünscht Ihnen einen angenehmen Flug.\n" +
|
||||||
|
"\n" +
|
||||||
|
"Wir bitten Sie, sich zur angegeben Boarding Zeit am Gate einzufinden.\n" +
|
||||||
|
"Buchungscode: JBZPPP\n" +
|
||||||
|
"Sequenz: 73\n" +
|
||||||
|
"Hinweis: Bitte beachten Sie, dass obwohl Ihr Flug verspätet sein mag, Sie dennoch wie geplant pünktlich am Check-in und am Abfluggate erscheinen müssen.\n" +
|
||||||
|
"\n" +
|
||||||
|
"Kostenlose Mitnahme eines Handgepäckstücks (8 Kg, 55 x 40 x 23cm).\n" +
|
||||||
|
"Mitnahme von Flüssigkeiten im Handgepäck: Neben den sonstigen Beschränkungen für das Handgepäck ist für alle Abflüge innerhalb der Europäischen Union sowie vielen weiteren Ländern (u.a. Schweiz, Russland, Island, Kroatien, Israel, Ägypten, Marokko, Tunesien, Norwegen) die Mitnahme von vor der Fluggastkontrolle erworbenen bzw. mitgebrachten Flüssigkeiten und Gels nur noch eingeschränkt erlaubt:\n" +
|
||||||
|
"\n" +
|
||||||
|
"- Sämtliche Flüssigkeiten (wie Kosmetik- und Toilettenartikel, Gels, Pasten, Cremes, Lotionen, Gemische aus flüssigen und festen Stoffen, Parfums, Behälter unter Druck, Dosen, Wasserflaschen etc.) sowie wachs- oder gelartige Stoffe dürfen nur noch in Behältnissen bis zu 100 ml bzw. 100 g mit an Bord genommen werden.\n" +
|
||||||
|
"\n" +
|
||||||
|
"- Diese Flüssigkeiten bzw. Stoffe müssen in einem transparenten, wiederverschließbaren Plastikbeutel (max. 1 kg Inhalt) vollständig geschlossen, verpackt sein.\n" +
|
||||||
|
"\n" +
|
||||||
|
"- Diese Beutel müssen Fluggäste selbst vor dem Abflug erwerben. Sie sind in vielen Supermärkten z. B. als Gefrierbeutel erhältlich. Es besteht zurzeit keine Möglichkeit, entsprechende Plastikbeutel am Eurowings Check-In zu erwerben bzw. auszugeben.\n" +
|
||||||
|
"\n" +
|
||||||
|
"- Verschreibungspflichtige Medikamente sowie Babynahrung dürfen weiterhin im Handgepäck transportiert werden. Der Fluggast muss nachweisen, dass die Medikamente und Babynahrung während des Fluges benötigt werden.\n" +
|
||||||
|
"\n" +
|
||||||
|
"- Produkte und Beutel, die nicht den Maßgaben entsprechen oder die nur mit Gummiband oder ähnlichem verschlossen sind, müssen leider abgegeben werden.\n" +
|
||||||
|
"\n" +
|
||||||
|
"Flüssigkeiten und Gels, die Sie nicht zwingend während Ihres Aufenthalts an Bord benötigen, sollten zur raschen Fluggastabfertigung nach Möglichkeit im aufzugebenden Gepäck untergebracht werden.\n" +
|
||||||
|
"\n" +
|
||||||
|
"Selbstverständlich ist die Mitnahme von allen Flüssigkeiten/Gels/Getränken aus Travel-Value oder Duty Free-Shops, die nach der Fluggastkontrolle erworben werden, weiterhin erlaubt.\n" +
|
||||||
|
"\n" +
|
||||||
|
"Eurowings übernimmt keine Haftung für Gegenstände, die der Fluggast nicht im Handgepäck mitführen darf und deshalb aus Sicherheitsgründen an der Fluggastkontrolle abgeben muss.\n" +
|
||||||
|
"Kontakt: Sie erreichen das deutsche Call Center unter der Telefonnummer\n" +
|
||||||
|
"\n" +
|
||||||
|
"0180 6 320 320 ( 0:00 Uhr - 24:00 Uhr )\n" +
|
||||||
|
"\n" +
|
||||||
|
"(0,20 € pro Anruf aus dem Festnetz der Deutschen Telekom - Mobilfunk maximal 0,60 € pro Anruf).", parsedCard.note)
|
||||||
|
Assert.assertEquals(Date(1567911600000), parsedCard.validFrom)
|
||||||
|
Assert.assertEquals(null, parsedCard.expiry)
|
||||||
|
Assert.assertEquals(BigDecimal(0), parsedCard.balance)
|
||||||
|
Assert.assertEquals(null, parsedCard.balanceType)
|
||||||
|
Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId)
|
||||||
|
Assert.assertEquals(null, parsedCard.barcodeId)
|
||||||
|
Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format())
|
||||||
|
Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor)
|
||||||
|
Assert.assertEquals(0, parsedCard.starStatus)
|
||||||
|
Assert.assertEquals(0, parsedCard.archiveStatus)
|
||||||
|
Assert.assertEquals(0, parsedCard.lastUsed)
|
||||||
|
Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL, parsedCard.zoomLevel)
|
||||||
|
|
||||||
|
// Confirm correct image is used
|
||||||
|
Assert.assertTrue(imageBitmap.sameAs(parser.image))
|
||||||
|
|
||||||
|
// Confirm correct parsing (en)
|
||||||
|
parsedCard = parser.toLoyaltyCard("en")
|
||||||
|
|
||||||
|
Assert.assertEquals(-1, parsedCard.id)
|
||||||
|
Assert.assertEquals("EUROWINGS", parsedCard.store)
|
||||||
|
Assert.assertEquals("Eurowings Boarding Pass\n" +
|
||||||
|
"\n" +
|
||||||
|
"Gate: B61\n" +
|
||||||
|
"Seat: 12D\n" +
|
||||||
|
"\n" +
|
||||||
|
"Cologne-Bonn: CGN\n" +
|
||||||
|
"Dubrovnik: DBV\n" +
|
||||||
|
"\n" +
|
||||||
|
"Name: John Doe\n" +
|
||||||
|
"Status: -\n" +
|
||||||
|
"Group: GROUP 1\n" +
|
||||||
|
"Fare: SMART\n" +
|
||||||
|
"\n" +
|
||||||
|
"Flight: EW 954\n" +
|
||||||
|
"Date: 08/09/2019\n" +
|
||||||
|
"Boarding: 05:00\n" +
|
||||||
|
"Gate closure: 05:15\n" +
|
||||||
|
"\n" +
|
||||||
|
"Eurowings wishes you a pleasant flight .\n" +
|
||||||
|
"\n" +
|
||||||
|
"We kindly ask you to be present at your departure gate on time.\n" +
|
||||||
|
"Booking code: JBZPPP\n" +
|
||||||
|
"Sequence: 73\n" +
|
||||||
|
"Notice: Please note that although your flight may be delayed, you will still need to check in and go to your departure gate on time as scheduled.\n" +
|
||||||
|
"\n" +
|
||||||
|
"Carry on one item of hand luggage (8 kg, 55 x 40 x 23 cm) for free.\n" +
|
||||||
|
"Carrying liquids in hand luggage: In addition to other restrictions on hand luggage, there are still restrictions on liquids and gels brought by the passenger or purchased before the security control on all departures within the European Union, as well as to many other countries (including Switzerland, Russia, Iceland, Croatia, Israel, Egypt, Morocco, Tunisia and Norway):\n" +
|
||||||
|
"\n" +
|
||||||
|
"- All liquids (such as toiletries and cosmetics, gels, pastes, creams, lotions, mixtures of liquids and solids, perfumes, pressurised containers, cans, water bottles etc) as well as wax and gel-like substances may only be carried on board in amounts less than 100ml or 100g.\n" +
|
||||||
|
"\n" +
|
||||||
|
"- These liquids or substances must be packed in closed containers in a transparent, re-sealable plastic bag (max. contents 1 kg).\n" +
|
||||||
|
"\n" +
|
||||||
|
"- It is the passenger’s responsibility to purchase this bag before departure. They are available in many supermarkets, e.g. as freezer bags. It is currently not possible for passengers to obtain or purchase the required bags from Eurowings check-in.\n" +
|
||||||
|
"\n" +
|
||||||
|
"- Prescription medicines and baby food may still be carried in hand baggage. The passenger must prove that such medicines and/or baby food are needed during the flight.\n" +
|
||||||
|
"\n" +
|
||||||
|
"- Products and bags which do not meet the requirements or are only sealed with a rubber band or similar will unfortunately have to be surrendered by passengers\n" +
|
||||||
|
"\n" +
|
||||||
|
"In order to pass through the airport as quickly as possible, you are strongly advised to pack any liquids or gels which are not essential for your journey on board the aircraft in your checked baggage if possible.\n" +
|
||||||
|
"\n" +
|
||||||
|
"As a matter of course, liquids from the Travel Value / Duty Free shops which have been purchased after you have passed through security are still allowed on board.\n" +
|
||||||
|
"\n" +
|
||||||
|
"Eurowings shall not be liable for any items which passengers are prohibited from carrying in their hand baggage for security reasons and are required to surrender at the security checkpoint.\n" +
|
||||||
|
"Contact: https://mobile.eurowings.com/booking/StaticContactInfo.aspx?culture=en-GB&back=home", parsedCard.note)
|
||||||
|
Assert.assertEquals(Date(1567911600000), parsedCard.validFrom)
|
||||||
|
Assert.assertEquals(null, parsedCard.expiry)
|
||||||
|
Assert.assertEquals(BigDecimal(0), parsedCard.balance)
|
||||||
|
Assert.assertEquals(null, parsedCard.balanceType)
|
||||||
|
Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId)
|
||||||
|
Assert.assertEquals(null, parsedCard.barcodeId)
|
||||||
|
Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format())
|
||||||
|
Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor)
|
||||||
|
Assert.assertEquals(0, parsedCard.starStatus)
|
||||||
|
Assert.assertEquals(0, parsedCard.archiveStatus)
|
||||||
|
Assert.assertEquals(0, parsedCard.lastUsed)
|
||||||
|
Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL, parsedCard.zoomLevel)
|
||||||
|
|
||||||
|
// Confirm correct image is used
|
||||||
|
Assert.assertTrue(imageBitmap.sameAs(parser.image))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testDCBPkPass() {
|
||||||
|
// Prepare
|
||||||
|
val context: Context = ApplicationProvider.getApplicationContext()
|
||||||
|
val pkpass = "pkpass/DCBLN24/DCBLN24-QLUKT-1-passbook.pkpass"
|
||||||
|
val image = "pkpass/DCBLN24/logo.png"
|
||||||
|
|
||||||
|
val pkpassUri = Uri.parse(pkpass)
|
||||||
|
val imageUri = Uri.parse(image)
|
||||||
|
ShadowContentResolver().registerInputStream(pkpassUri, javaClass.getResourceAsStream(pkpass))
|
||||||
|
ShadowContentResolver().registerInputStream(imageUri, javaClass.getResourceAsStream(image))
|
||||||
|
|
||||||
|
val parser = PkpassParser(context, pkpassUri)
|
||||||
|
val imageBitmap = BitmapFactory.decodeStream(context.contentResolver.openInputStream(imageUri))
|
||||||
|
|
||||||
|
// Confirm this does not have languages
|
||||||
|
Assert.assertEquals(listOf<String>(), parser.listLocales())
|
||||||
|
|
||||||
|
// Confirm correct parsing
|
||||||
|
val parsedCard = parser.toLoyaltyCard(null)
|
||||||
|
|
||||||
|
Assert.assertEquals(-1, parsedCard.id)
|
||||||
|
Assert.assertEquals("droidcon Berlin 2024", parsedCard.store)
|
||||||
|
Assert.assertEquals("Ticket for droidcon Berlin 2024 (Speaker)\n" +
|
||||||
|
"\n" +
|
||||||
|
"Admission time: 2024-07-03 08:00\n" +
|
||||||
|
"\n" +
|
||||||
|
"Event: droidcon Berlin 2024\n" +
|
||||||
|
"\n" +
|
||||||
|
"Product: Speaker\n" +
|
||||||
|
"\n" +
|
||||||
|
"Attendee name: Sylvia van Os\n" +
|
||||||
|
"From: 2024-07-03 08:00\n" +
|
||||||
|
"To: 2024-07-05 18:30\n" +
|
||||||
|
"\n" +
|
||||||
|
"Admission time: 2024-07-03 08:00\n" +
|
||||||
|
"Attendee name: Sylvia van Os\n" +
|
||||||
|
"Ordered by: REDACTED@example.com\n" +
|
||||||
|
"Organizer: droidcon\n" +
|
||||||
|
"Organizer contact: global@droidcon.de\n" +
|
||||||
|
"Order code: REDACTED\n" +
|
||||||
|
"Purchase date: 2024-06-06 07:26\n" +
|
||||||
|
"Website: https://pretix.eu/droidcon/dcbln24/", parsedCard.note)
|
||||||
|
Assert.assertEquals(null, parsedCard.validFrom)
|
||||||
|
Assert.assertEquals(null, parsedCard.expiry)
|
||||||
|
Assert.assertEquals(BigDecimal(0), parsedCard.balance)
|
||||||
|
Assert.assertEquals(null, parsedCard.balanceType)
|
||||||
|
Assert.assertEquals("ca4phaix1ahkahD2eiVi5iepahxa6rei", parsedCard.cardId)
|
||||||
|
Assert.assertEquals(null, parsedCard.barcodeId)
|
||||||
|
Assert.assertEquals(BarcodeFormat.QR_CODE, parsedCard.barcodeType!!.format())
|
||||||
|
Assert.assertEquals(Color.parseColor("#0014e6"), parsedCard.headerColor)
|
||||||
|
Assert.assertEquals(0, parsedCard.starStatus)
|
||||||
|
Assert.assertEquals(0, parsedCard.archiveStatus)
|
||||||
|
Assert.assertEquals(0, parsedCard.lastUsed)
|
||||||
|
Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL, parsedCard.zoomLevel)
|
||||||
|
|
||||||
|
// Confirm correct image is used
|
||||||
|
Assert.assertTrue(imageBitmap.sameAs(parser.image))
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
BIN
app/src/test/res/protect/card_locker/pkpass/DCBLN24/logo.png
Normal file
BIN
app/src/test/res/protect/card_locker/pkpass/DCBLN24/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
@@ -1,8 +1,9 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("com.android.application") version "8.7.1" apply false
|
id("com.android.application") version "8.7.3" apply false
|
||||||
id("com.github.spotbugs") version "5.1.4" apply false
|
id("com.github.spotbugs") version "5.1.4" apply false
|
||||||
|
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ Copylefted libre software (GPLv3+) card management app.
|
|||||||
|
|
||||||
[](https://github.com/CatimaLoyalty/Android/releases)
|
[](https://github.com/CatimaLoyalty/Android/releases)
|
||||||
[](https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima)
|
[](https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima)
|
||||||
|
[](https://f-droid.org/packages/me.hackerchick.catima/)
|
||||||
[](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
|
[](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
|
||||||
|
|
||||||

|

|
||||||
@@ -13,7 +14,8 @@ Copylefted libre software (GPLv3+) card management app.
|
|||||||
|
|
||||||
<a href="https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima" target="_blank">
|
<a href="https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima" target="_blank">
|
||||||
<img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="90"/></a>
|
<img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="90"/></a>
|
||||||
|
<a href="https://f-droid.org/repository/browse/?fdid=me.hackerchick.catima" target="_blank">
|
||||||
|
<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="90"/></a>
|
||||||
<a href="https://play.google.com/store/apps/details?id=me.hackerchick.catima" target="_blank">
|
<a href="https://play.google.com/store/apps/details?id=me.hackerchick.catima" target="_blank">
|
||||||
<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="90"/></a>
|
<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="90"/></a>
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1,3 @@
|
|||||||
- Možnost navigace po kartách pomocí tlačítek hlasitosti
|
- Možnost procházet kartami pomocí tlačítek hlasitosti
|
||||||
|
- Oprava importu Stocard
|
||||||
|
- Oprava zprávy "Import zrušen" objevující se po úspěšném importu
|
||||||
|
|||||||
1
fastlane/metadata/android/cs-CZ/changelogs/140.txt
Normal file
1
fastlane/metadata/android/cs-CZ/changelogs/140.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
- Oprava zalamování textu v dialogovém okně Přidat
|
||||||
4
fastlane/metadata/android/cs-CZ/changelogs/141.txt
Normal file
4
fastlane/metadata/android/cs-CZ/changelogs/141.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
- Změňte výchozí sloupec na širokoúhlých obrazovkách na 4
|
||||||
|
- Povolit přepsání počtu sloupců pro výšku a na šířku v nastavení
|
||||||
|
- Při otáčení obrazovky nebo otevírání karty ponechejte filtr vyhledávání na hlavní obrazovce
|
||||||
|
- Omezte maximální délku zobrazení poznámky na hlavní obrazovce
|
||||||
3
fastlane/metadata/android/cs-CZ/changelogs/142.txt
Normal file
3
fastlane/metadata/android/cs-CZ/changelogs/142.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
- Přidejte podporu Passbook (.pkpass).
|
||||||
|
- Oprava importu transparentních souborů PDF
|
||||||
|
- Zlepšení zobrazení průhledných miniatur
|
||||||
1
fastlane/metadata/android/cs-CZ/changelogs/143.txt
Normal file
1
fastlane/metadata/android/cs-CZ/changelogs/143.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
- Oprava pádu při otevírání neplatných souborů pkpass
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
- Möglichkeit, mit den Lautstärketasten durch die Karten zu navigieren
|
- Möglichkeit, mit den Lautstärketasten durch die Karten zu navigieren
|
||||||
- Stocard Importfehler behoben
|
- Korrigiert Stocard Import
|
||||||
|
- Behebt die Meldung „Import abgebrochen“ nach erfolgreichem Import
|
||||||
|
|||||||
1
fastlane/metadata/android/de-DE/changelogs/140.txt
Normal file
1
fastlane/metadata/android/de-DE/changelogs/140.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
- Textumbruch im Dialog „Hinzufügen“ korrigiert
|
||||||
4
fastlane/metadata/android/de-DE/changelogs/141.txt
Normal file
4
fastlane/metadata/android/de-DE/changelogs/141.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
- Voreingestellte Spaltenanzahl für breite Bildschirme auf 4 geändert
|
||||||
|
- Spaltenanzahl für Hoch- und Querformat kann in den Einstellungen überschrieben werden
|
||||||
|
- Suchfilter im Hauptbildschirm aktiv halten, wenn der Bildschirm gedreht oder eine Karte geöffnet wird
|
||||||
|
- Begrenzung der maximalen Länge, der im Hauptbildschirm angezeigten Notiz
|
||||||
3
fastlane/metadata/android/de-DE/changelogs/142.txt
Normal file
3
fastlane/metadata/android/de-DE/changelogs/142.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
- Unterstützung für Passbook (.pkpass) hinzugefügt
|
||||||
|
- Import transparenter PDF-Dateien repariert
|
||||||
|
- Anzeige transparenter Vorschaubilder verbessert
|
||||||
1
fastlane/metadata/android/de-DE/changelogs/143.txt
Normal file
1
fastlane/metadata/android/de-DE/changelogs/143.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
- Behebt Absturz beim Öffnen ungültiger pkpass-Dateien
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
- Unterstützung für App-Verknüpfungen hinzufügen (Android 7.1+), wobei die zuletzt verwendeten Karten als Verknüpfungen erscheinen. (Pull #145 (https://github.com/brarcher/loyalty-card-locker/pull/145))
|
- Unterstützung für App-Verknüpfungen hinzugefügt (Android 7.1+), wobei die zuletzt verwendeten Karten als Verknüpfungen erscheinen. (Pull #145 (https://github.com/brarcher/loyalty-card-locker/pull/145))
|
||||||
- Hinzufügen eines Widgets, das wie eine angeheftete App-Verknüpfung funktioniert, um Geräte zu unterstützen, die unter Android 7.1 laufen (pull #142 (https://github.com/brarcher/loyalty-card-locker/pull/142))
|
- Hinzufügen eines Widgets, das wie eine angeheftete App-Verknüpfung funktioniert, um Geräte zu unterstützen, die unter Android 7.1 laufen (pull #142 (https://github.com/brarcher/loyalty-card-locker/pull/142))
|
||||||
|
|||||||
4
fastlane/metadata/android/en-US/changelogs/141.txt
Normal file
4
fastlane/metadata/android/en-US/changelogs/141.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
- Change default column on wide screens to 4
|
||||||
|
- Allow overriding column counts for portrait and landscape in settings
|
||||||
|
- Keep main screen search filter when rotating screen or opening a card
|
||||||
|
- Limit max length of note display on main screen
|
||||||
3
fastlane/metadata/android/en-US/changelogs/142.txt
Normal file
3
fastlane/metadata/android/en-US/changelogs/142.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
- Add Passbook (.pkpass) support
|
||||||
|
- Fix import of transparent PDF files
|
||||||
|
- Improve display of transparent thumbnails
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user