Compare commits

...

124 Commits

Author SHA1 Message Date
Sylvia van Os
d67b17c58a Release Catima 2.29.0 2024-04-19 18:48:09 +02:00
Sylvia van Os
5033fbba50 Merge pull request #1840 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-19 18:46:39 +02:00
Heimen Stoffels
5e752ecfb4 Translated using Weblate (Dutch)
Currently translated at 13.6% (18 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2024-04-19 18:39:00 +02:00
Heimen Stoffels
e976bf3ef6 Translated using Weblate (Dutch)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2024-04-19 18:38:59 +02:00
Sylvia van Os
24ae8d3c4c Merge pull request #1839 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-18 21:04:05 +02:00
LEGEND OG (LEGEND)
26fb9482aa Translated using Weblate (Arabic)
Currently translated at 100.0% (1 of 1 strings)

Translation: Catima/Android (Debug)
Translate-URL: https://hosted.weblate.org/projects/catima/android-debug/ar/
2024-04-18 20:03:24 +02:00
LEGEND OG (LEGEND)
1a3019b94f Translated using Weblate (Arabic)
Currently translated at 7.5% (10 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ar/
2024-04-18 20:03:24 +02:00
LEGEND OG (LEGEND)
67136b708f Translated using Weblate (Arabic)
Currently translated at 99.6% (311 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ar/
2024-04-18 20:03:24 +02:00
Eji-san
07990cea6f Translated using Weblate (Indonesian)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/id/
2024-04-18 20:03:24 +02:00
syntheticbonus
a92895f96e Translated using Weblate (Dutch)
Currently translated at 99.6% (311 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2024-04-18 20:03:23 +02:00
Aglag257
861df94e69 Translated using Weblate (Greek)
Currently translated at 98.7% (308 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2024-04-18 20:03:23 +02:00
Sylvia van Os
5efd18dac7 Merge pull request #1836 from CatimaLoyalty/dependabot/gradle/com.github.yalantis-ucrop-2.2.9
Bump com.github.yalantis:ucrop from 2.2.8 to 2.2.9
2024-04-17 19:56:15 +02:00
Sylvia van Os
77fcc8cd7e Merge pull request #1837 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-17 18:09:45 +02:00
tabby
b5e53eb076 Translated using Weblate (Korean)
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ko/
2024-04-17 11:03:50 +02:00
tabby
39fe0a17b8 Translated using Weblate (Korean)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ko/
2024-04-17 11:03:50 +02:00
solokot
524278a94c Translated using Weblate (Russian)
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-04-17 11:03:50 +02:00
dependabot[bot]
8d3f36d62c Bump com.github.yalantis:ucrop from 2.2.8 to 2.2.9
Bumps [com.github.yalantis:ucrop](https://github.com/Yalantis/uCrop) from 2.2.8 to 2.2.9.
- [Release notes](https://github.com/Yalantis/uCrop/releases)
- [Commits](https://github.com/Yalantis/uCrop/compare/2.2.8...2.2.9)

---
updated-dependencies:
- dependency-name: com.github.yalantis:ucrop
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-17 02:06:36 +00:00
Sylvia van Os
459b318fdf Merge pull request #1835 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-16 17:30:56 +02:00
Andre Costa
68e7930835 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2024-04-16 10:02:02 +02:00
Scrambled777
947b3f79be Translated using Weblate (Hindi)
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2024-04-16 10:02:01 +02:00
Rodolphe Veniel
8070e5564b Translated using Weblate (French)
Currently translated at 97.7% (129 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2024-04-16 10:02:00 +02:00
simosathan9
443a67581e Translated using Weblate (Greek)
Currently translated at 91.6% (286 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2024-04-16 10:01:59 +02:00
Sylvia van Os
60aaff9f38 Merge pull request #1834 from CatimaLoyalty/dependabot/github_actions/gradle/wrapper-validation-action-3
Bump gradle/wrapper-validation-action from 2 to 3
2024-04-15 20:27:58 +02:00
Sylvia van Os
0464e3dbfe Migrate to new location 2024-04-15 19:05:55 +02:00
Sylvia van Os
6f892e5174 Merge pull request #1831 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-15 17:10:56 +02:00
大王叫我来巡山
187cbb7d67 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2024-04-15 09:23:02 +02:00
Hendrik
b114b6da81 Translated using Weblate (German)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2024-04-15 09:23:02 +02:00
dependabot[bot]
1228d55fcb Bump gradle/wrapper-validation-action from 2 to 3
Bumps [gradle/wrapper-validation-action](https://github.com/gradle/wrapper-validation-action) from 2 to 3.
- [Release notes](https://github.com/gradle/wrapper-validation-action/releases)
- [Commits](https://github.com/gradle/wrapper-validation-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: gradle/wrapper-validation-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-15 05:01:40 +00:00
Sylvia van Os
b5c17c9776 Merge pull request #1833 from CatimaLoyalty/dependabot/github_actions/peter-evans/create-pull-request-6.0.3
Bump peter-evans/create-pull-request from 6.0.2 to 6.0.3
2024-04-15 07:01:04 +02:00
dependabot[bot]
27ee52b5c0 Bump peter-evans/create-pull-request from 6.0.2 to 6.0.3
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v6.0.2...v6.0.3)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-15 02:07:53 +00:00
Sylvia van Os
ccbbd2555a Merge pull request #1830 from CatimaLoyalty/create-pull-request/patch-1713069410
Update contributors
2024-04-14 10:12:59 +02:00
TheLastProject
d78b7b2fee Update contributors 2024-04-14 04:36:49 +00:00
Sylvia van Os
047639a36e Merge pull request #1829 from CatimaLoyalty/screenshotUpdate
Update screenshots
2024-04-13 18:41:09 +02:00
Sylvia van Os
86b5007ba5 Update screenshots 2024-04-13 18:34:40 +02:00
Sylvia van Os
4879aab701 Merge pull request #1828 from CatimaLoyalty/create-pull-request/patch-1712939446
Update Fastlane changelogs
2024-04-12 18:31:58 +02:00
TheLastProject
da49b651b8 Update Fastlane changelogs 2024-04-12 16:30:45 +00:00
Sylvia van Os
c2e9c0eebc Update CHANGELOG 2024-04-12 18:30:30 +02:00
fynngodau
9ed6bc921d Draw app bar under status bar (#1817)
* Draw app bar under status bar

* Add tint-on-scroll effect to more activites

One remaining problem is the `ListView` in
`barcode_selector_activity.xml`. While it would theoretically be
sufficient to set
`app:layout_behavior="@string/appbar_scrolling_view_behavior"` on
`ListView` if `android:nestedScrollingEnabled="true"` is also set, this
leads to odd visual glitches.

* Appropriate color for tab bar

* Fix remaining tab bar coloring

Remove unused tab group from group activity
2024-04-12 17:22:35 +02:00
Sylvia van Os
d78ecf17e2 Merge pull request #1826 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-11 20:52:34 +02:00
gallegonovato
8aeddf1141 Translated using Weblate (Spanish)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2024-04-11 16:01:52 +02:00
Sylvia van Os
31924276d3 Merge pull request #1819 from fynngodau/about-layout
Improve About layout
2024-04-10 17:18:07 +02:00
Sylvia van Os
3321b11e2a Merge pull request #1821 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-10 08:10:42 +02:00
Sylvia van Os
920379c5af Merge pull request #1822 from CatimaLoyalty/dependabot/gradle/com.android.application-8.3.2
Bump com.android.application from 8.3.1 to 8.3.2
2024-04-10 07:40:23 +02:00
dependabot[bot]
598a4345f0 Bump com.android.application from 8.3.1 to 8.3.2
Bumps com.android.application from 8.3.1 to 8.3.2.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-10 02:24:46 +00:00
109247019824
ff8013ed44 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2024-04-10 02:02:09 +02:00
Lionel HANNEQUIN
20b69b4286 Translated using Weblate (French)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2024-04-10 02:02:09 +02:00
Sylvia van Os
60165bad5c Merge pull request #1820 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-08 23:11:57 +02:00
Balanda Nazarii
149f7ff106 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2024-04-08 23:01:56 +02:00
Julia Deoniziak
ac699a1c76 Translated using Weblate (Polish)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pl/
2024-04-08 23:01:56 +02:00
Fynn Godau
a43c480e0c Improve layout of about screen
* Selectable item ripple background for each row
* Center Donate text in its row
* Don't clip too low when scrolling
2024-04-07 22:48:04 +02:00
Sylvia van Os
6eda7791c6 Merge pull request #1818 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-07 21:16:29 +02:00
Jiri Grönroos
7dc0bf027a Translated using Weblate (Finnish)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2024-04-07 21:01:58 +02:00
solokot
c218518805 Translated using Weblate (Russian)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2024-04-07 21:01:58 +02:00
Sylvia van Os
0505c51ee8 Merge pull request #1816 from CatimaLoyalty/create-pull-request/patch-1712463357
Update contributors
2024-04-07 09:32:59 +02:00
TheLastProject
f29da33bcf Update contributors 2024-04-07 04:15:57 +00:00
Sylvia van Os
5f8e3069b3 Merge pull request #1815 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-07 00:26:16 +02:00
solokot
8d7abddace Translated using Weblate (Russian)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2024-04-06 20:42:21 +02:00
Evgeniy Khramov
39fe61f57e Translated using Weblate (Russian)
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-04-06 20:42:21 +02:00
Mika
176f7a0cc8 Translated using Weblate (Russian)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2024-04-06 20:42:21 +02:00
Sylvia van Os
e9ec9889d4 Merge pull request #1814 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-06 09:55:45 +02:00
Andre Costa
0a161bdf55 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2024-04-06 07:02:14 +02:00
Andre Costa
e817f190b6 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2024-04-06 07:02:14 +02:00
phat dang thanh
f88a96cd4f Translated using Weblate (Vietnamese)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2024-04-06 07:02:13 +02:00
Scrambled777
7cf47935e0 Translated using Weblate (Hindi)
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/hi/
2024-04-06 07:02:13 +02:00
Scrambled777
f2844003e8 Translated using Weblate (Hindi)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/hi/
2024-04-06 07:02:12 +02:00
Oğuz Ersen
9702fd6ce5 Translated using Weblate (Turkish)
Currently translated at 73.4% (97 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2024-04-06 07:02:12 +02:00
Oğuz Ersen
577c3f2990 Translated using Weblate (Turkish)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2024-04-06 07:02:12 +02:00
大王叫我来巡山
bf9216168b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (132 of 132 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2024-04-06 07:02:11 +02:00
大王叫我来巡山
95dc2f1235 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2024-04-06 07:02:11 +02:00
Giovanni Donisi
84503253d2 Translated using Weblate (Italian)
Currently translated at 100.0% (312 of 312 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2024-04-06 07:02:10 +02:00
Sylvia van Os
5fd48c6707 Merge pull request #1813 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-04-05 08:32:56 +02:00
Stefan Racic
335668c03a Translated using Weblate (Bosnian)
Currently translated at 45.9% (141 of 307 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bs/
2024-04-05 05:50:14 +02:00
Sylvia van Os
cba4b6856c Merge pull request #1811 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.12.1
Bump org.robolectric:robolectric from 4.12 to 4.12.1
2024-04-03 08:19:08 +02:00
dependabot[bot]
c345c6cdd1 Bump org.robolectric:robolectric from 4.12 to 4.12.1
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.12 to 4.12.1.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.12...robolectric-4.12.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-03 02:55:01 +00:00
Sylvia van Os
a1e214e657 Merge pull request #1810 from CatimaLoyalty/dependabot/github_actions/actions/setup-python-5.1.0
Bump actions/setup-python from 5.0.0 to 5.1.0
2024-04-01 07:41:31 +02:00
Sylvia van Os
ff1654b3f7 Merge pull request #1809 from CatimaLoyalty/dependabot/gradle/org.robolectric-robolectric-4.12
Bump org.robolectric:robolectric from 4.11.1 to 4.12
2024-04-01 07:40:06 +02:00
dependabot[bot]
12e24abdd6 Bump actions/setup-python from 5.0.0 to 5.1.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.0.0...v5.1.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 02:37:45 +00:00
dependabot[bot]
33a9d7fbcf Bump org.robolectric:robolectric from 4.11.1 to 4.12
Bumps [org.robolectric:robolectric](https://github.com/robolectric/robolectric) from 4.11.1 to 4.12.
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.11.1...robolectric-4.12)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-01 02:16:22 +00:00
Dimitrios Papathanasiou
bdff59e628 Minor cleanups in PDF barcode retrieval (#1807) 2024-03-31 12:08:21 +02:00
Sylvia van Os
c1ef5c346a Merge pull request #1808 from CatimaLoyalty/create-pull-request/patch-1711858517
Update contributors
2024-03-31 10:01:21 +02:00
TheLastProject
a573db1be9 Update contributors 2024-03-31 04:15:16 +00:00
Sylvia van Os
84e3e37a44 Merge pull request #1802 from CatimaLoyalty/create-pull-request/patch-1711486318
Update Fastlane changelogs
2024-03-26 22:38:26 +01:00
TheLastProject
f5724dfca0 Update Fastlane changelogs 2024-03-26 20:51:58 +00:00
Sylvia van Os
f848710afa Merge pull request #1795 from CatimaLoyalty/pdfImport
PDF import + multiple barcode support
2024-03-26 21:51:44 +01:00
Sylvia van Os
1e0dc4f541 Merge pull request #1799 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-03-26 08:45:47 +01:00
Viet Nguyem
470bbf4261 Translated using Weblate (Vietnamese)
Currently translated at 11.4% (15 of 131 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/vi/
2024-03-26 07:02:08 +01:00
Sylvia van Os
8519e12aa7 Add page number to barcode selector for PDF scan results 2024-03-24 20:31:03 +01:00
Sylvia van Os
026bfaf7a9 Merge pull request #1798 from CatimaLoyalty/create-pull-request/patch-1711274306
Update locales
2024-03-24 11:30:07 +01:00
TheLastProject
4d4e76960f Update locales 2024-03-24 09:58:25 +00:00
Sylvia van Os
3637c37cca Merge pull request #1797 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-03-24 10:58:14 +01:00
Amir Ghasemi
a5ed6caa5a Added translation using Weblate (Persian) 2024-03-24 10:46:57 +01:00
Sylvia van Os
1429abd94d Update CHANGELOG 2024-03-23 23:55:03 +01:00
Sylvia van Os
0e873b9ea5 Basic selector when multiple barcodes found 2024-03-23 23:54:57 +01:00
Sylvia van Os
cbc8886241 Load barcode from PDF when sharing to Catima 2024-03-23 17:52:07 +01:00
Sylvia van Os
6c7bfb4c50 Initial PDF import through More Options menu 2024-03-23 17:52:07 +01:00
Sylvia van Os
6ed5e52890 Merge pull request #1796 from CatimaLoyalty/create-pull-request/patch-1711174860
Update Gradle to 8.7
2024-03-23 17:51:46 +01:00
TheLastProject
bc1bd88d75 Update Gradle to 8.7 2024-03-23 06:20:59 +00:00
Sylvia van Os
09e1201086 Merge pull request #1794 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-03-22 08:31:46 +01:00
gallegonovato
df829a4956 Translated using Weblate (Spanish)
Currently translated at 46.5% (61 of 131 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2024-03-22 02:02:22 +01:00
Axus Wizix
46dc163e06 Translated using Weblate (Russian)
Currently translated at 100.0% (131 of 131 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-03-22 02:02:22 +01:00
Sylvia van Os
e70b2bdbbd Merge pull request #1792 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-03-19 21:56:57 +01:00
Tim Trek
c1f8e930bb Translated using Weblate (German)
Currently translated at 93.8% (123 of 131 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-03-19 21:40:22 +01:00
Sylvia van Os
c8dd1d8509 Merge pull request #1791 from CatimaLoyalty/dependabot/gradle/com.android.application-8.3.1
Bump com.android.application from 8.3.0 to 8.3.1
2024-03-19 07:23:04 +01:00
dependabot[bot]
e50adc39c5 Bump com.android.application from 8.3.0 to 8.3.1
Bumps com.android.application from 8.3.0 to 8.3.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-19 02:11:33 +00:00
Sylvia van Os
09948b6a21 Merge pull request #1790 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-03-18 22:11:52 +01:00
solokot
f50e80d24d Translated using Weblate (Russian)
Currently translated at 100.0% (131 of 131 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2024-03-18 21:02:09 +01:00
Sylvia van Os
777512aad7 Merge pull request #1789 from CatimaLoyalty/dependabot/github_actions/peter-evans/create-pull-request-6.0.2
Bump peter-evans/create-pull-request from 6.0.1 to 6.0.2
2024-03-18 18:18:03 +01:00
dependabot[bot]
423fd272d4 Bump peter-evans/create-pull-request from 6.0.1 to 6.0.2
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v6.0.1...v6.0.2)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-18 02:08:29 +00:00
Sylvia van Os
969256f130 Merge pull request #1787 from CatimaLoyalty/create-pull-request/patch-1710648875
Update contributors
2024-03-17 09:33:40 +01:00
TheLastProject
702d4af8d9 Update contributors 2024-03-17 04:14:35 +00:00
Sylvia van Os
02696c1328 Merge pull request #1786 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-03-15 17:53:01 +01:00
Tim Trek
dcffdf3329 Translated using Weblate (German)
Currently translated at 92.3% (121 of 131 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2024-03-15 01:53:02 +01:00
richard01000
4110b5ab48 Translated using Weblate (Romanian)
Currently translated at 100.0% (307 of 307 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ro/
2024-03-15 01:53:02 +01:00
Sylvia van Os
dea96069b0 Merge pull request #1785 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-03-14 18:16:26 +01:00
Allan Nordhøy
04c5cb08f1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.7% (297 of 307 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2024-03-14 07:01:56 +01:00
Sylvia van Os
b37f8943c7 Merge pull request #1784 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2024-03-10 14:18:14 +01:00
ngocanhtve
54d4f8b70b Translated using Weblate (Vietnamese)
Currently translated at 100.0% (307 of 307 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2024-03-10 14:02:02 +01:00
unnerving duck
658cc43f86 Translated using Weblate (Finnish)
Currently translated at 100.0% (307 of 307 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2024-03-10 14:02:01 +01:00
Sylvia van Os
958abe5ed7 Merge pull request #1780 from CatimaLoyalty/fix/shortcutFixes
Several fixes for shortcut handling
2024-03-10 13:20:45 +01:00
Sylvia van Os
fa99c2ef7c Several fixes for shortcut handling
- Update the card priority in the dynamic shortcut manager also when the
  card isn't opened from the main screen
- Remove from dynamic shortcut manager when the card gets archived
- Fix icons disappearing of other cards when one card gets removed
2024-03-10 13:00:41 +01:00
Sylvia van Os
2b38f474fd Merge pull request #1781 from CatimaLoyalty/fix/rb
Fix RB failure
2024-03-10 09:23:05 +01:00
Sylvia van Os
5643814e65 Merge pull request #1783 from CatimaLoyalty/create-pull-request/patch-1710044020
Update contributors
2024-03-10 08:51:01 +01:00
TheLastProject
59b588b797 Update contributors 2024-03-10 04:13:40 +00:00
Sylvia van Os
757321930d Fix RB failure
AGP 8.3 includes the commit hash in the build metadata, so for the
official build to be reproducible it needs to be on the same commit as
third-party builds. This commit reorders the instructions to ensure I
will create the commit before building and thus fixes an RB failure in
AGP 8.3+.
2024-03-09 11:42:55 +01:00
98 changed files with 670 additions and 252 deletions

View File

@@ -32,7 +32,7 @@ jobs:
- uses: actions/checkout@v4.1.1
- name: Fail on bad translations
run: if grep -ri "&lt;xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
- uses: gradle/wrapper-validation-action@v2
- uses: gradle/actions/wrapper-validation@v3
- name: set up OpenJDK 17
run: |
sudo apt-get update

View File

@@ -29,13 +29,13 @@ jobs:
id: checkout
uses: actions/checkout@v4.1.1
- name: Setup Python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: '3.x'
- name: Run converter script
run: python .scripts/changelog_to_fastlane.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.1
uses: peter-evans/create-pull-request@v6.0.3
with:
title: "Update Fastlane changelogs"
commit-message: "Update Fastlane changelogs"

View File

@@ -33,7 +33,7 @@ jobs:
file_in_repo: app/src/main/res/raw/contributors.txt
min_commit_count: 5
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.1
uses: peter-evans/create-pull-request@v6.0.3
with:
title: "Update contributors"
commit-message: "Update contributors"

View File

@@ -38,7 +38,7 @@ jobs:
- name: Generate featureGraphic.png for each language
run: .scripts/generate_feature_graphic/generate_feature_graphic.sh
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.1
uses: peter-evans/create-pull-request@v6.0.3
with:
title: "Update feature graphic"
commit-message: "Update feature graphic"

View File

@@ -24,9 +24,9 @@ jobs:
- uses: actions/checkout@v4.1.1
- uses: obfusk/gradle-update-action@v2.0.0
id: gradle-update
- uses: gradle/wrapper-validation-action@v2
- uses: gradle/actions/wrapper-validation@v3
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.1
uses: peter-evans/create-pull-request@v6.0.3
with:
title: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"
commit-message: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"

View File

@@ -31,7 +31,7 @@ jobs:
- name: Update locales
run: .scripts/locales.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.1
uses: peter-evans/create-pull-request@v6.0.3
with:
title: "Update locales"
commit-message: "Update locales"

View File

@@ -1,5 +1,11 @@
# Changelog
## v2.29.0 - 134 (2024-04-19)
- Support for scanning PDF files for barcodes
- Support for image files with multiple barcodes
- Minor UI fixes
## v2.28.0 - 133 (2024-03-08)
- Target Android 14

View File

@@ -21,8 +21,8 @@ android {
applicationId = "me.hackerchick.catima"
minSdk = 21
targetSdk = 34
versionCode = 133
versionName = "2.28.0"
versionCode = 134
versionName = "2.29.0"
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true
@@ -93,7 +93,7 @@ dependencies {
implementation("androidx.palette:palette:1.0.0")
implementation("androidx.preference:preference:1.2.1")
implementation("com.google.android.material:material:1.11.0")
implementation("com.github.yalantis:ucrop:2.2.8")
implementation("com.github.yalantis:ucrop:2.2.9")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4")
// Splash Screen
@@ -112,7 +112,7 @@ dependencies {
// Testing
testImplementation("androidx.test:core:1.5.0")
testImplementation("junit:junit:4.13.2")
testImplementation("org.robolectric:robolectric:4.11.1")
testImplementation("org.robolectric:robolectric:4.12.1")
}
tasks.withType<SpotBugsTask>().configureEach {

View File

@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="app_name">تصحيح Catima</string>
</resources>

View File

@@ -44,6 +44,7 @@
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
<data android:mimeType="application/pdf" />
</intent-filter>
</activity>
<activity

View File

@@ -3,12 +3,17 @@ package protect.card_locker;
public class BarcodeValues {
private final String mFormat;
private final String mContent;
private String mNote;
public BarcodeValues(String format, String content) {
mFormat = format;
mContent = content;
}
public void setNote(String note) {
mNote = note;
}
public String format() {
return mFormat;
}
@@ -17,7 +22,5 @@ public class BarcodeValues {
return mContent;
}
public boolean isEmpty() {
return mFormat == null && mContent == null;
}
}
public String note() { return mNote; }
}

View File

@@ -0,0 +1,6 @@
package protect.card_locker;
public interface BarcodeValuesListDisambiguatorCallback {
void onUserChoseBarcode(BarcodeValues barcodeValues);
void onUserDismissedSelector();
}

View File

@@ -646,11 +646,22 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
Log.d("barcode card id editor", "barcode and card id editor picker returned without an intent");
return;
}
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, getApplicationContext());
cardId = barcodeValues.content();
barcodeType = barcodeValues.format();
barcodeId = "";
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, getApplicationContext());
Utils.makeUserChooseBarcodeFromList(this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
cardId = barcodeValues.content();
barcodeType = barcodeValues.format();
barcodeId = "";
}
@Override
public void onUserDismissedSelector() {
}
});
}
});

View File

@@ -736,6 +736,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
invalidateOptionsMenu();
ShortcutHelper.updateShortcuts(this, loyaltyCard);
}
private void setStateBasedOnImageTypes() {
@@ -835,6 +837,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 1);
Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show();
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
// Re-init loyaltyCard with new data from DB
onResume();
invalidateOptionsMenu();

View File

@@ -7,8 +7,6 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.database.CursorIndexOutOfBoundsException;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -33,7 +31,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -150,6 +147,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Archiving card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 1);
ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id);
updateLoyaltyCardList(false);
inputMode.finish();
invalidateOptionsMenu();
@@ -194,10 +192,12 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
@Override
protected void onCreate(Bundle inputSavedInstanceState) {
extractIntentFields(getIntent());
SplashScreen.installSplashScreen(this);
super.onCreate(inputSavedInstanceState);
// 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());
binding = MainActivityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
@@ -287,11 +287,11 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
Intent intent = result.getData();
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
Bundle inputBundle = intent.getExtras();
String group = inputBundle != null ? inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) : null;
processBarcodeValues(barcodeValues, group);
processBarcodeValuesList(barcodeValuesList, group, false);
});
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
@@ -446,63 +446,57 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
}
private void processBarcodeValues(BarcodeValues barcodeValues, String group) {
if (barcodeValues.isEmpty()) {
private void processBarcodeValuesList(List<BarcodeValues> barcodeValuesList, String group, boolean closeAppOnNoBarcode) {
if (barcodeValuesList.isEmpty()) {
throw new IllegalArgumentException("barcodesValues may not be empty");
}
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
if (group != null) {
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
}
newIntent.putExtras(newBundle);
startActivity(newIntent);
Utils.makeUserChooseBarcodeFromList(MainActivity.this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
if (group != null) {
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
}
newIntent.putExtras(newBundle);
startActivity(newIntent);
}
@Override
public void onUserDismissedSelector() {
if (closeAppOnNoBarcode) {
finish();
}
}
});
}
private void onSharedIntent(Intent intent) {
String receivedAction = intent.getAction();
String receivedType = intent.getType();
// Check if an image was shared to us
// Check if an image or file was shared to us
if (Intent.ACTION_SEND.equals(receivedAction)) {
if (!receivedType.startsWith("image/")) {
List<BarcodeValues> barcodeValuesList;
if (receivedType.startsWith("image/")) {
barcodeValuesList = Utils.retrieveBarcodesFromImage(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
} else if (receivedType.equals("application/pdf")) {
barcodeValuesList = Utils.retrieveBarcodesFromPdf(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
} else {
Log.e(TAG, "Wrong mime-type");
return;
}
BarcodeValues barcodeValues;
Bitmap bitmap;
Uri data = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (data == null) {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
if (barcodeValuesList.isEmpty()) {
finish();
return;
}
try {
bitmap = Utils.retrieveImageFromUri(this, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
barcodeValues = Utils.getBarcodeFromBitmap(bitmap);
if (barcodeValues.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(this, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
finish();
return;
}
processBarcodeValues(barcodeValues, null);
processBarcodeValuesList(barcodeValuesList, null, true);
}
}
@@ -798,8 +792,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
b.putIntegerArrayList("cardList", cardList);
intent.putExtras(b);
ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard);
startActivity(intent);
}
}

View File

@@ -62,6 +62,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
private static final int COMPAT_SCALE_FACTOR_DIP = 320;
private static final int PERMISSION_SCAN_ADD_FROM_IMAGE = 100;
private static final int PERMISSION_SCAN_ADD_FROM_PDF = 101;
private CaptureManager capture;
private DecoratedBarcodeView barcodeScannerView;
@@ -73,6 +74,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
private ActivityResultLauncher<Intent> manualAddLauncher;
// can't use the pre-made contract because that launches the file manager for image type instead of gallery
private ActivityResultLauncher<Intent> photoPickerLauncher;
private ActivityResultLauncher<Intent> pdfPickerLauncher;
static final String STATE_SCANNER_ACTIVE = "scannerActive";
private boolean mScannerActive = true;
@@ -99,6 +101,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
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()));
pdfPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_PDF_FILE, result.getResultCode(), result.getData()));
customBarcodeScannerBinding.fabOtherOptions.setOnClickListener(view -> {
setScannerActive(false);
@@ -108,7 +111,8 @@ public class ScanActivity extends CatimaAppCompatActivity {
new CharSequence[]{
getString(R.string.addWithoutBarcode),
getString(R.string.addManually),
getString(R.string.addFromImage)
getString(R.string.addFromImage),
getString(R.string.addFromPdfFile)
},
(dialogInterface, i) -> {
switch (i) {
@@ -121,6 +125,9 @@ public class ScanActivity extends CatimaAppCompatActivity {
case 2:
addFromImage();
break;
case 3:
addFromPdfFile();
break;
default:
throw new IllegalArgumentException("Unknown 'Add a card in a different way' dialog option");
}
@@ -268,14 +275,24 @@ public class ScanActivity extends CatimaAppCompatActivity {
private void handleActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
if (barcodeValues.isEmpty()) {
if (barcodeValuesList.isEmpty()) {
setScannerActive(true);
return;
}
returnResult(barcodeValues.content(), barcodeValues.format());
Utils.makeUserChooseBarcodeFromList(this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
returnResult(barcodeValues.content(), barcodeValues.format());
}
@Override
public void onUserDismissedSelector() {
setScannerActive(true);
}
});
}
private void addWithoutBarcode() {
@@ -364,19 +381,23 @@ public class ScanActivity extends CatimaAppCompatActivity {
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_IMAGE);
}
private void addFromImageAfterPermission() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentIntent.setType("image/*");
public void addFromPdfFile() {
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_PDF);
}
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
private void addFromImageOrFileAfterPermission(String mimeType, ActivityResultLauncher<Intent> launcher, int chooserText, int errorMessage) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType(mimeType);
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentIntent.setType(mimeType);
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(chooserText));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
try {
photoPickerLauncher.launch(chooserIntent);
launcher.launch(chooserIntent);
} catch (ActivityNotFoundException e) {
setScannerActive(true);
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
@@ -424,9 +445,13 @@ public class ScanActivity extends CatimaAppCompatActivity {
if (requestCode == CaptureManager.getCameraPermissionReqCode()) {
showCameraPermissionMissingText(!granted);
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE || requestCode == PERMISSION_SCAN_ADD_FROM_PDF) {
if (granted) {
addFromImageAfterPermission();
if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
addFromImageOrFileAfterPermission("image/*", photoPickerLauncher, R.string.addFromImage, R.string.failedLaunchingPhotoPicker);
} else {
addFromImageOrFileAfterPermission("application/pdf", pdfPickerLauncher, R.string.addFromPdfFile, R.string.failedLaunchingFileManager);
}
} else {
setScannerActive(true);
Toast.makeText(this, R.string.storageReadPermissionRequired, Toast.LENGTH_LONG).show();

View File

@@ -43,6 +43,11 @@ class ShortcutHelper {
* used card shortcut is discarded.
*/
static void updateShortcuts(Context context, LoyaltyCard card) {
if (card.archiveStatus == 1) {
// Don't add archived card to menu
return;
}
LinkedList<ShortcutInfoCompat> list = new LinkedList<>(ShortcutManagerCompat.getDynamicShortcuts(context));
SQLiteDatabase database = new DBHelper(context).getReadableDatabase();
@@ -108,18 +113,7 @@ class ShortcutHelper {
* shortcut exists.
*/
static void removeShortcut(Context context, int cardId) {
List<ShortcutInfoCompat> list = ShortcutManagerCompat.getDynamicShortcuts(context);
String shortcutId = Integer.toString(cardId);
for (int index = 0; index < list.size(); index++) {
if (list.get(index).getId().equals(shortcutId)) {
list.remove(index);
break;
}
}
ShortcutManagerCompat.setDynamicShortcuts(context, list);
ShortcutManagerCompat.removeDynamicShortcuts(context, Collections.singletonList(Integer.toString(cardId)));
}
static @NotNull

View File

@@ -12,8 +12,10 @@ import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.ImageDecoder;
import android.graphics.Matrix;
import android.graphics.pdf.PdfRenderer;
import android.net.Uri;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.text.Layout;
import android.text.Spanned;
@@ -39,6 +41,7 @@ import androidx.exifinterface.media.ExifInterface;
import androidx.palette.graphics.Palette;
import com.google.android.material.color.DynamicColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
@@ -46,6 +49,8 @@ import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.multi.GenericMultipleBarcodeReader;
import com.google.zxing.multi.MultipleBarcodeReader;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
@@ -64,6 +69,7 @@ import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Currency;
import java.util.Date;
import java.util.GregorianCalendar;
@@ -83,12 +89,13 @@ public class Utils {
public static final int SELECT_BARCODE_REQUEST = 2;
public static final int BARCODE_SCAN = 3;
public static final int BARCODE_IMPORT_FROM_IMAGE_FILE = 4;
public static final int CARD_IMAGE_FROM_CAMERA_FRONT = 5;
public static final int CARD_IMAGE_FROM_CAMERA_BACK = 6;
public static final int CARD_IMAGE_FROM_CAMERA_ICON = 7;
public static final int CARD_IMAGE_FROM_FILE_FRONT = 8;
public static final int CARD_IMAGE_FROM_FILE_BACK = 9;
public static final int CARD_IMAGE_FROM_FILE_ICON = 10;
public static final int BARCODE_IMPORT_FROM_PDF_FILE = 5;
public static final int CARD_IMAGE_FROM_CAMERA_FRONT = 6;
public static final int CARD_IMAGE_FROM_CAMERA_BACK = 7;
public static final int CARD_IMAGE_FROM_CAMERA_ICON = 8;
public static final int CARD_IMAGE_FROM_FILE_FRONT = 9;
public static final int CARD_IMAGE_FROM_FILE_BACK = 10;
public static final int CARD_IMAGE_FROM_FILE_ICON = 11;
public static final String CARD_IMAGE_FILENAME_REGEX = "^(card_)(\\d+)(_(?:front|back|icon)\\.png)$";
@@ -131,6 +138,91 @@ public class Utils {
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
}
static public List<BarcodeValues> retrieveBarcodesFromImage(Context context, Uri uri) {
Log.i(TAG, "Received image file with possible barcode");
if (uri == null) {
Log.e(TAG, "Uri did not contain any data");
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new ArrayList<>();
}
Bitmap bitmap;
try {
bitmap = retrieveImageFromUri(context, uri);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new ArrayList<>();
}
List<BarcodeValues> barcodesFromBitmap = getBarcodesFromBitmap(bitmap);
if (barcodesFromBitmap.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(context, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
}
return barcodesFromBitmap;
}
static public List<BarcodeValues> retrieveBarcodesFromPdf(Context context, Uri uri) {
Log.i(TAG, "Received PDF file with possible barcode");
if (uri == null) {
Log.e(TAG, "Uri did not contain any data");
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
return new ArrayList<>();
}
ParcelFileDescriptor parcelFileDescriptor = null;
PdfRenderer renderer = null;
List<BarcodeValues> barcodesFromPdfPages = new ArrayList<>();
try {
parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
if (parcelFileDescriptor != null) {
renderer = new PdfRenderer(parcelFileDescriptor);
// Loop over all pages to find barcodes
Bitmap renderedPage;
for (int i = 0; i < renderer.getPageCount(); i++) {
PdfRenderer.Page page = renderer.openPage(i);
renderedPage = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888);
page.render(renderedPage, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
List<BarcodeValues> barcodesFromPage = getBarcodesFromBitmap(renderedPage);
for (BarcodeValues barcodeValues : barcodesFromPage) {
barcodeValues.setNote(String.format(context.getString(R.string.pageWithNumber), i+1));
barcodesFromPdfPages.add(barcodeValues);
}
}
}
} catch (IOException e) {
Log.e(TAG, "Error reading PDF file", e);
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
} finally {
// Resource handling
if (renderer != null) {
renderer.close();
}
if (parcelFileDescriptor != null) {
try {
parcelFileDescriptor.close();
} catch (IOException e) {
Log.e(TAG, "Error closing ParcelFileDescriptor", e);
}
}
}
if (barcodesFromPdfPages.isEmpty()) {
Log.i(TAG, "No barcode found in pdf file");
Toast.makeText(context, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
}
return barcodesFromPdfPages;
}
/**
* Returns the Barcode format and content based on the result of an activity.
* It shows toasts to notify the end-user as needed itself and will return an empty
@@ -142,45 +234,20 @@ public class Utils {
* @param context
* @return BarcodeValues
*/
static public BarcodeValues parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) {
static public List<BarcodeValues> parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) {
String contents;
String format;
if (resultCode != Activity.RESULT_OK) {
return new BarcodeValues(null, null);
return new ArrayList<>();
}
if (requestCode == Utils.BARCODE_IMPORT_FROM_IMAGE_FILE) {
Log.i(TAG, "Received image file with possible barcode");
return retrieveBarcodesFromImage(context, intent.getData());
}
Uri data = intent.getData();
if (data == null) {
Log.e(TAG, "Intent did not contain any data");
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new BarcodeValues(null, null);
}
Bitmap bitmap;
try {
bitmap = retrieveImageFromUri(context, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new BarcodeValues(null, null);
}
BarcodeValues barcodeFromBitmap = getBarcodeFromBitmap(bitmap);
if (barcodeFromBitmap.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(context, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
}
Log.i(TAG, "Read barcode id: " + barcodeFromBitmap.content());
Log.i(TAG, "Read format: " + barcodeFromBitmap.format());
return barcodeFromBitmap;
if (requestCode == Utils.BARCODE_IMPORT_FROM_PDF_FILE) {
return retrieveBarcodesFromPdf(context, intent.getData());
}
if (requestCode == Utils.BARCODE_SCAN || requestCode == Utils.SELECT_BARCODE_REQUEST) {
@@ -196,7 +263,7 @@ public class Utils {
Log.i(TAG, "Read barcode id: " + contents);
Log.i(TAG, "Read format: " + format);
return new BarcodeValues(format, contents);
return Collections.singletonList(new BarcodeValues(format, contents));
}
throw new UnsupportedOperationException("Unknown request code for parseSetBarcodeActivityResult");
@@ -216,22 +283,22 @@ public class Utils {
return MediaStore.Images.Media.getBitmap(context.getContentResolver(), data);
}
static public BarcodeValues getBarcodeFromBitmap(Bitmap bitmap) {
static public List<BarcodeValues> getBarcodesFromBitmap(Bitmap bitmap) {
// This function is vulnerable to OOM, so we try again with a smaller bitmap is we get OOM
for (int i = 0; i < 10; i++) {
try {
return Utils.getBarcodeFromBitmapReal(bitmap);
return Utils.getBarcodesFromBitmapReal(bitmap);
} catch (OutOfMemoryError e) {
Log.w(TAG, "Ran OOM in getBarcodeFromBitmap! Trying again with smaller picture! Retry " + i + " of 10.");
Log.w(TAG, "Ran OOM in getBarcodesFromBitmap! Trying again with smaller picture! Retry " + i + " of 10.");
bitmap = Bitmap.createScaledBitmap(bitmap, (int) Math.round(0.75 * bitmap.getWidth()), (int) Math.round(0.75 * bitmap.getHeight()), false);
}
}
// Give up
return new BarcodeValues(null, null);
return new ArrayList<>();
}
static private BarcodeValues getBarcodeFromBitmapReal(Bitmap bitmap) {
static private List<BarcodeValues> getBarcodesFromBitmapReal(Bitmap bitmap) {
// In order to decode it, the Bitmap must first be converted into a pixel array...
int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
@@ -240,15 +307,63 @@ public class Utils {
LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
List<BarcodeValues> barcodeValuesList = new ArrayList<>();
try {
Result barcodeResult = new MultiFormatReader().decode(binaryBitmap);
MultiFormatReader multiFormatReader = new MultiFormatReader();
MultipleBarcodeReader multipleBarcodeReader = new GenericMultipleBarcodeReader(multiFormatReader);
return new BarcodeValues(barcodeResult.getBarcodeFormat().name(), barcodeResult.getText());
Result[] barcodeResults = multipleBarcodeReader.decodeMultiple(binaryBitmap);
for (Result barcodeResult : barcodeResults) {
Log.i(TAG, "Read barcode id: " + barcodeResult.getText());
Log.i(TAG, "Read format: " + barcodeResult.getBarcodeFormat().name());
barcodeValuesList.add(new BarcodeValues(barcodeResult.getBarcodeFormat().name(), barcodeResult.getText()));
}
return barcodeValuesList;
} catch (NotFoundException e) {
return new BarcodeValues(null, null);
return barcodeValuesList;
}
}
static public void makeUserChooseBarcodeFromList(Context context, List<BarcodeValues> barcodeValuesList, BarcodeValuesListDisambiguatorCallback callback) {
// If there is only one choice, consider it chosen
if (barcodeValuesList.size() == 1) {
callback.onUserChoseBarcode(barcodeValuesList.get(0));
return;
}
// 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
CharSequence[] barcodeDescriptions = new CharSequence[barcodeValuesList.size()];
for (int i = 0; i < barcodeValuesList.size(); i++) {
BarcodeValues barcodeValues = barcodeValuesList.get(i);
CatimaBarcode catimaBarcode = CatimaBarcode.fromName(barcodeValues.format());
String barcodeContent = barcodeValues.content();
// Shorten overly long barcodes
if (barcodeContent.length() > 22) {
barcodeContent = barcodeContent.substring(0, 20) + "";
}
if (barcodeValues.note() != null) {
barcodeDescriptions[i] = String.format("%s: %s (%s)", barcodeValues.note(), catimaBarcode.prettyName(), barcodeContent);
} else {
barcodeDescriptions[i] = String.format("%s (%s)", catimaBarcode.prettyName(), barcodeContent);
}
}
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context);
builder.setTitle(context.getString(R.string.multipleBarcodesFoundPleaseChooseOne));
builder.setItems(
barcodeDescriptions,
(dialogInterface, i) -> callback.onUserChoseBarcode(barcodeValuesList.get(i))
);
builder.setOnCancelListener(dialogInterface -> callback.onUserDismissedSelector());
builder.show();
}
static public Boolean isNotYetValid(Date validFromDate) {
// The note in `hasExpired` does not apply here, since the bug was fixed before this feature was added.
return validFromDate.after(getStartOfToday().getTime());

View File

@@ -10,7 +10,8 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
@@ -20,11 +21,12 @@
</com.google.android.material.appbar.AppBarLayout>
<ScrollView
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:padding="10dp">
android:paddingVertical="8dp"
android:clipToPadding="false">
<LinearLayout
android:layout_width="match_parent"
@@ -35,7 +37,9 @@
android:id="@+id/version_history"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/version_history_main"
@@ -74,7 +78,9 @@
android:id="@+id/credits"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/credits_main"
@@ -113,7 +119,9 @@
android:id="@+id/translate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/translate_main"
@@ -153,7 +161,9 @@
android:id="@+id/license"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/license_main"
@@ -193,7 +203,9 @@
android:id="@+id/repo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/repo_main"
@@ -233,7 +245,9 @@
android:id="@+id/privacy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/privacy_main"
@@ -273,7 +287,9 @@
android:id="@+id/donate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/donate_main"
@@ -284,6 +300,7 @@
android:text="@string/donate"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
@@ -303,7 +320,9 @@
android:id="@+id/rate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/rate_main"
@@ -340,10 +359,12 @@
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:padding="8dp"
android:id="@+id/report_error"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:paddingVertical="8dp"
android:paddingHorizontal="16dp"
android:background="?android:selectableItemBackground">
<TextView
android:id="@+id/report_error_main"
@@ -379,5 +400,5 @@
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</ScrollView>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -31,13 +31,6 @@
android:layout_height="?attr/actionBarSize"
style="?attr/toolbarStyle" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/groups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:tabMode="scrollable" />
</com.google.android.material.appbar.AppBarLayout>

View File

@@ -7,7 +7,8 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
@@ -17,11 +18,11 @@
</com.google.android.material.appbar.AppBarLayout>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
@@ -127,7 +128,7 @@
android:layout_marginTop="8dp"
android:text="@string/importOptionApplicationButton" />
</LinearLayout>
</ScrollView>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -18,7 +18,8 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
@@ -29,7 +30,8 @@
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -46,9 +48,10 @@
</com.google.android.material.appbar.AppBarLayout>
<ScrollView android:layout_width="fill_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<androidx.core.widget.NestedScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -473,6 +476,6 @@
</LinearLayout>
</TableLayout>
</TableLayout>
</ScrollView>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -19,7 +19,8 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
@@ -31,6 +32,7 @@
android:id="@+id/groups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
app:tabMode="scrollable"
android:visibility="gone"/>

View File

@@ -19,7 +19,8 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"

View File

@@ -8,7 +8,8 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"

View File

@@ -8,7 +8,8 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"

View File

@@ -23,31 +23,32 @@ pfaffenrodt
Aayush Gupta
HudobniVolk
Nyatsuki
Samantaz Fox
Giovanni Donisi
Jiri Grönroos
Samantaz Fox
arno-github
大王叫我来巡山
Cliff Heraldo
Sergio Paredes
Ankit Tiwari
Milan Šalka
Giovanni Donisi
Balázs Meskó
mdvhimself
Balázs Meskó
Milo Ivir
Scrambled777
Skrripy
huuhaa
大王叫我来巡山
Projjal Moitra
Quentin PAGÈS
ikanakova
waffshappen
Eryk Michalak
ngocanhtve
Ziad OUALHADJ
Scrambled777
Robin Liu
Denis Shilin
Alexander Ivanov
Miha Frangež
Viet Nguyen Hoang
Silvério Santos
Virginie
Michael Gangolf

View File

@@ -318,4 +318,9 @@
<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">اي من الـbarcodes تريد استخدامه؟</string>
<string name="pageWithNumber">صفحة<xliff:g>%d</xliff:g></string>
</resources>

View File

@@ -290,4 +290,9 @@
<string name="amountParsingFailed">Неприемлива сума</string>
<string name="spend">Похарчено</string>
<string name="receive">Получено</string>
<string name="pageWithNumber">Страница <xliff:g>%d</xliff:g></string>
<string name="addFromPdfFile">Изберете PDF</string>
<string name="errorReadingFile">Файлът не може да бъде прочетен</string>
<string name="failedLaunchingFileManager">Не е намерено приложение за управление на файлове</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Кой от намерените щрихкодове желаете да бъде използван?</string>
</resources>

View File

@@ -2,13 +2,13 @@
<resources>
<string name="save">Snimi</string>
<string name="cancel">Odustani</string>
<string name="unstar">Ukloni sve omiljene</string>
<string name="star">Omiljene</string>
<string name="barcodeType">Barcode tip</string>
<string name="note">Bilježnica</string>
<string name="unstar">Ukloni iz omiljenih</string>
<string name="star">Dodaj u omiljene</string>
<string name="barcodeType">Tip barkoda</string>
<string name="note">Zabilješka</string>
<string name="storeName">Ime</string>
<string name="noMatchingGiftCards">Nema rezultata. Pokušaj promijeniti pretragu.</string>
<string name="noGiftCards">Kliknite + Plus dugme da dodate kartu ili uvozite nešto iz menija prvo.</string>
<string name="noGiftCards">Kliknite + Plus dugme da dodate kartu ili uvezete nešto iz menija prvo.</string>
<string name="action_add">Dodaj</string>
<string name="all">Sve</string>
<string name="noGroupCards">Ova grupa ne sadrži nikakve karte</string>
@@ -104,4 +104,6 @@
<string name="importOptionApplicationExplanation">Koristi bilo koju aplikaciju ili Vašu omiljenu aplikaciju da bi otvorili file.</string>
<string name="importOptionApplicationButton">Koristi drugu aplikaciju</string>
<string name="about">O</string>
</resources>
<string name="noBarcode">Nema barkoda</string>
<string name="deleteTitle">Obriši karticu</string>
</resources>

View File

@@ -290,4 +290,9 @@
<string name="spend">Zahlen</string>
<string name="receive">Erhalten</string>
<string name="amountParsingFailed">Ungültiger Betrag</string>
<string name="addFromPdfFile">PDF-Datei auswählen</string>
<string name="errorReadingFile">Datei konnte nicht gelesen werden</string>
<string name="failedLaunchingFileManager">Konnte keinen unterstützten Dateimanager finden</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Welchen der gefundenen Barcodes möchten Sie verwenden?</string>
<string name="pageWithNumber">Seite <xliff:g>%d</xliff:g></string>
</resources>

View File

@@ -54,7 +54,7 @@
<item quantity="other"><xliff:g>%d</xliff:g> επιλέγχθηκαν</item>
</plurals>
<string name="noGiftCardsGroup">Δημιούργησε κάρτες και βάλτες σε αυτή την ομάδα.</string>
<string name="addManually">Χειροκίνητη εισαγωγή κωδικού</string>
<string name="addManually">Εισαγάγετε τον γραμμωτό κώδικα με μη αυτόματο τρόπο</string>
<string name="never">Ποτέ</string>
<string name="share">Κοινοποίηση</string>
<plurals name="balancePoints">
@@ -71,7 +71,7 @@
<string name="accept">Αποδοχή</string>
<string name="yes">Ναι</string>
<string name="no">Όχι</string>
<string name="addFromImage">Επιλογή εικόνας από την συλλογή</string>
<string name="addFromImage">Επιλέξτε μια εικόνα από τη συλλογή</string>
<string name="expiryStateSentence">Λήγει: <xliff:g>%s</xliff:g></string>
<string name="expiryDate">Ημερομηνία λήξης</string>
<string name="settings_keep_screen_on">Κράτα την οθόνη ανοιχτή</string>
@@ -102,7 +102,7 @@
<string name="options">Επιλογές</string>
<string name="noGroupCards">Αυτή η ομάδα είναι άδεια</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="star">Προσθήκη στα αγαπημένα</string>
<string name="unstar">Αφαίρεση από τα αγαπημένα</string>
@@ -240,10 +240,10 @@
<string name="newBalanceSentence">Νέο υπόλοιπο: <xliff:g>%s</xliff:g></string>
<string name="failedToOpenUrl">Εγκαταστήστε έναν περιηγητή πρώτα</string>
<string name="welcome">Καλώς ήρθατε στο 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_display_barcode_max_brightness_summary">Απαραίτητο για να δουλέψει σε κάποια σκάνερ</string>
<string name="cameraPermissionRequired">Δικαίωμα πρόσβασης στην κάμερα απαραίτητο γι\' αυτή την ενέργεια…</string>
<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="height">Ύψος:</string>
<string name="switchToFrontImage">Μετάβαση στην μπροστινή εικόνα</string>
@@ -253,7 +253,7 @@
<string name="permissionReadCardsLabel">Διαβάστε τις κάρτες Catima</string>
<string name="openBackImageInGalleryApp">Ανοίξτε την πίσω εικόνα στην εφαρμογή γκαλερί</string>
<string name="permissionReadCardsDescription">Διάβασε τις Κάρτες σου Catima και όλες τους τις λεπτομέρειες, συμπεριλαμβανομένων των σημειώσεων και των εικόνων</string>
<string name="donate">Προσφέρω</string>
<string name="donate">Δωρίζω</string>
<string name="icon_header_click_text">Πατήστε παρατεταμένα για επεξεργασία του εικονιδίου</string>
<string name="openFrontImageInGalleryApp">Ανοίξτε την μπροστινή εικόνα στην εφαρμογή γκαλερί</string>
<string name="storageReadPermissionRequired">Δικαίωμα ανάγνωσης του χώρου αποθήκευσης απαραίτητο για αυτήν την ενέργεια…</string>
@@ -264,4 +264,35 @@
<string name="setBarcodeHeight">Ρυθμίστε το ύψος του barcode</string>
<string name="show_name_below_image_thumbnail">Εμφάνιση ονόματος κάτω από το εικονίδιο</string>
<string name="app_name">Catima</string>
<string name="balanceParsingFailed">Μη έγκυρο υπόλοιπο</string>
<string name="continue_">Συνέχεια</string>
<string name="settings_category_title_privacy">Απόρρητο</string>
<string name="addFromPdfFile">Επιλογή PDF αρχείου</string>
<string name="add_manually_warning_message">Για ορισμένα καταστήματα, ο γραμμοκώδικας διαφέρει από τον αριθμό που αναγράφεται πάνω στην κάρτα. Εξαιτίας αυτού, η εισαγωγή γραμμοκώδικα χειροκίνητα ενδέχεται να μην λειτουργεί πάντα. Προτείνεται να σκανάρετε τον γραμμοκώδικα με χρήση της κάμερας. Επιθυμείτε να συνεχίσετε ;</string>
<string name="amountParsingFailed">Μη έγκυρο ποσό</string>
<string name="show_balance">Προβολή υπολοίπου</string>
<string name="action_display_options">Επιλογές Εμφάνισης</string>
<string name="settings_category_title_cards">Κάρτες</string>
<string name="settings_category_title_general">Γενικά</string>
<string name="show_archived_cards">Προβολή αρχειοθετημένων καρτών</string>
<string name="addWithoutBarcode">Προσθήκη κάρτας χωρίς γραμμοκώδικα</string>
<string name="view_online">Προβολή διαδικτυακά</string>
<string name="errorReadingFile">Δεν ήταν δυνατή η ανάγνωση του αρχείου</string>
<string name="failedLaunchingFileManager">Δεν ήταν δυνατή η εύρεση υποστηριζόμενης διαχείρισης αρχείων</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Ποιους από τους γραμμωτούς κώδικες που βρέθηκαν θέλετε να χρησιμοποιήσετε;</string>
<string name="pageWithNumber">Σελίδα <xliff:g>%d</xliff:g></string>
<string name="spend">Δαπάνησε</string>
<string name="receive">Λαμβάνω</string>
<string name="settings_keep_screen_on_summary">Απενεργοποιεί το χρονικό όριο της οθόνης κατά την προβολή μιας κάρτας</string>
<string name="settings_oled_dark_summary">Μειώνει τη χρήση της μπαταρίας στις οθόνες OLED</string>
<string name="show_note">Εμφάνιση σημείωσης</string>
<string name="action_more_options">Περισσότερες επιλογές</string>
<string name="enter_card_id">Εισαγάγετε τον αριθμό ταυτότητας ή το κείμενο στην κάρτα σας</string>
<string name="show_validity">Δείξτε εγκυρότητα</string>
<string name="add_a_card_in_a_different_way">Προσθέστε μια κάρτα με διαφορετικό τρόπο</string>
<string name="card_id_must_not_be_empty">Ο αναγνωριστικός αριθμός της κάρτας δεν πρέπει να είναι κενός</string>
<string name="settings_allow_content_provider_read_summary">Οι εφαρμογές θα πρέπει ακόμα να ζητήσουν άδεια για να τους δοθεί πρόσβαση</string>
<string name="field_must_not_be_empty">Το πεδίο δεν πρέπει να είναι κενό</string>
<string name="manually_enter_barcode_instructions">Εισαγάγετε τον αριθμό ταυτότητας ή το κείμενο στην κάρτα σας και πατήστε τον γραμμωτό κώδικα που μοιάζει με αυτόν της κάρτας σας.</string>
<string name="add_manually_warning_title">Συνιστάται η σάρωση</string>
</resources>

View File

@@ -297,4 +297,9 @@
<string name="spend">Gastar</string>
<string name="receive">Recibió</string>
<string name="amountParsingFailed">Importe incorrecto</string>
<string name="addFromPdfFile">Seleccionar un archivo PDF</string>
<string name="errorReadingFile">No se ha podido leer el archivo</string>
<string name="failedLaunchingFileManager">No se ha podido encontrar un gestor de archivos compatible</string>
<string name="multipleBarcodesFoundPleaseChooseOne">¿Cuál de los códigos de barras encontrados desea utilizar?</string>
<string name="pageWithNumber">Página <xliff:g>%d</xliff:g></string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -228,7 +228,7 @@
<item quantity="one">Näytä arkisto (<xliff:g>%1$d</xliff:g> kortti)</item>
<item quantity="other">Näytä arkisto (<xliff:g>%1$d</xliff:g> korttia)</item>
</plurals>
<string name="updateBalanceTitle">Kuinka paljon kulutit?</string>
<string name="updateBalanceTitle">Kuinka paljon kulutit tai tienasit?</string>
<string name="updateBalanceHint">Syötä summa</string>
<string name="barcodeLongPressMessage">Vain kuvia on mahdollista avata galleriasovelluksessa</string>
<string name="archive">Arkistoi</string>
@@ -285,4 +285,14 @@
<string name="view_online">Näytä verkossa</string>
<string name="settings_follow_sensor_orientation">Kierrä aina (ohittaa järjestelmän asetukset)</string>
<string name="continue_">Jatka</string>
<string name="add_manually_warning_title">Skannausta suositellaan</string>
<string name="spend">Kuluta</string>
<string name="receive">Vastaanota</string>
<string name="amountParsingFailed">Virheellinen määrä</string>
<string name="add_manually_warning_message">Joidenkin kauppojen kohdalla viivakoodin arvo eroaa kortilla olevasta numerosta. Tämän takia viivakoodin syöttäminen käsin ei aina toimi. On vahvasti suositeltua skannata viivakoodi kameralla. Haluatko silti jatkaa?</string>
<string name="addFromPdfFile">Valitse PDF-tiedosto</string>
<string name="errorReadingFile">Tiedostoa ei voitu lukea</string>
<string name="failedLaunchingFileManager">Tuettua tiedostonhallintasovellusta ei löytynyt</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Mitä löytyneistä viivakoodeista haluat käyttää?</string>
<string name="pageWithNumber">Sivu <xliff:g>%d</xliff:g></string>
</resources>

View File

@@ -297,4 +297,9 @@
<string name="spend">Dépenser</string>
<string name="receive">Reçevoir</string>
<string name="amountParsingFailed">Montant Invalide</string>
<string name="addFromPdfFile">Sélectionner un fichier PDF</string>
<string name="errorReadingFile">Lecture du fichier impossible</string>
<string name="failedLaunchingFileManager">Impossible de trouver un gestionnaire de fichiers supporté</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Quel code-barre, parmi ceux trouvés, voulez-vous utiliser?</string>
<string name="pageWithNumber">Page <xliff:g>%d</xliff:g></string>
</resources>

View File

@@ -290,4 +290,9 @@
<string name="spend">खर्च किया</string>
<string name="receive">प्राप्त किया</string>
<string name="amountParsingFailed">अमान्य राशि</string>
<string name="multipleBarcodesFoundPleaseChooseOne">आप पाए गए बारकोड में से कौन सा उपयोग करना चाहते हैं?</string>
<string name="pageWithNumber">पृष्ठ <xliff:g>%d</xliff:g></string>
<string name="addFromPdfFile">एक PDF फाइल चुनें</string>
<string name="errorReadingFile">फाइल को पढ़ा नहीं जा सका</string>
<string name="failedLaunchingFileManager">समर्थित फाइल प्रबंधक नहीं मिल सका</string>
</resources>

View File

@@ -231,7 +231,7 @@
<string name="updateBalance">Perbarui saldo</string>
<string name="updateBalanceHint">Masukkan jumlah</string>
<string name="currentBalanceSentence">Saldo saat ini: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceTitle">Berapa banyak yang telah kamu habiskan ?</string>
<string name="updateBalanceTitle">Berapa banyak yang kamu belanjakan atau terima?</string>
<string name="noCameraPermissionDirectToSystemSetting">Untuk memindai barcode, Catima membutuhkan akses ke kamera mu. Tap disini untuk mengganti pengaturan perizinan mu.</string>
<string name="cameraPermissionRequired">Berikan izin untuk mengakses kamera anda…</string>
<string name="storageReadPermissionRequired">Berikan izin untuk membaca penyimpanan anda…</string>
@@ -277,4 +277,15 @@
<string name="field_must_not_be_empty">Isian tidak boleh kosong</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Selalu rotasi (abaikan pengaturan sistem)</string>
<string name="add_manually_warning_title">Pemindaian sangat dianjurkan</string>
<string name="continue_">Lanjut</string>
<string name="failedLaunchingFileManager">Tidak dapat menemukan pengelola file yang didukung</string>
<string name="errorReadingFile">Tidak dapat membaca file</string>
<string name="addFromPdfFile">Pilih file PDF</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Barcode mana yang ingin Anda gunakan?</string>
<string name="pageWithNumber">Halaman <xliff:g>%d</xliff:g></string>
<string name="spend">Dibelanjakan</string>
<string name="receive">Terima</string>
<string name="amountParsingFailed">Jumlah tidak valid</string>
<string name="add_manually_warning_message">Untuk beberapa toko, nilai barcode berbeda dengan nomor yang tertulis di kartu. Oleh karena itu, memasukkan barcode secara manual mungkin tidak selalu berhasil. Sangat disarankan untuk memindai barcode dengan kamera anda. Apakah anda masih ingin melanjutkan?</string>
</resources>

View File

@@ -297,4 +297,9 @@
<string name="amountParsingFailed">Importo non valido</string>
<string name="spend">Spendi</string>
<string name="receive">Ricevi</string>
<string name="errorReadingFile">Impossibile leggere il file</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Quale dei codici a barre trovati vuoi utilizzare?</string>
<string name="addFromPdfFile">Seleziona un file PDF</string>
<string name="failedLaunchingFileManager">Impossibile trovare un file manager supportato</string>
<string name="pageWithNumber">Pagina <xliff:g>%d</xliff:g></string>
</resources>

View File

@@ -278,4 +278,14 @@
<string name="app_name">Catima</string>
<string name="add_manually_warning_title">스캔을 권장합니다</string>
<string name="settings_follow_sensor_orientation">항상 회전 (시스템 설정 무시)</string>
<string name="continue_">계속</string>
<string name="addFromPdfFile">PDF 파일 선택</string>
<string name="errorReadingFile">파일을 읽을 수 없습니다</string>
<string name="failedLaunchingFileManager">지원되는 파일 관리자를 찾을 수 없습니다</string>
<string name="multipleBarcodesFoundPleaseChooseOne">검색된 바코드 중 어떤 바코드를 사용하시겠습니까?</string>
<string name="pageWithNumber">페이지 <xliff:g>%d</xliff:g></string>
<string name="spend">보내기</string>
<string name="receive">받기</string>
<string name="amountParsingFailed">잘못된 금액</string>
<string name="add_manually_warning_message">일부 매장의 경우 바코드 값이 카드에 적힌 숫자와 다릅니다. 이 때문에 수동으로 바코드를 입력하는 것이 항상 작동하지 않을 수 있습니다. 대신 카메라로 바코드를 스캔하는 것이 좋습니다. 계속하시겠습니까?</string>
</resources>

View File

@@ -283,4 +283,11 @@
<string name="manually_enter_barcode_instructions">Skriv inn ID-nummer eller tekst fra kortet og trykk på strekkoden som ser ut til å ligne.</string>
<string name="enter_card_id">Skriv inn ID-nummeret eller teksten på kortet</string>
<string name="field_must_not_be_empty">Feltet må fylles ut</string>
<string name="add_manually_warning_title">Skanning anbefales</string>
<string name="continue_">Fortsett</string>
<string name="amountParsingFailed">Ugyldig beløp</string>
<string name="spend">Utgifter</string>
<string name="receive">Inntekt</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>
</resources>

View File

@@ -290,4 +290,9 @@
<string name="spend">Geef uit</string>
<string name="receive">Ontvang</string>
<string name="amountParsingFailed">Ongeldig bedrag</string>
<string name="addFromPdfFile">Kies een pdf-bestand</string>
<string name="errorReadingFile">Lezen bestand mislukt</string>
<string name="failedLaunchingFileManager">Geen ondersteunde bestandsbeheerder aangetroffen</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Welke van de gevonden barcodes wil je gebruiken?</string>
<string name="pageWithNumber">Pagina <xliff:g>%d</xliff:g></string>
</resources>

View File

@@ -248,7 +248,7 @@
</plurals>
<string name="currentBalanceSentence">Bieżące saldo: <xliff:g>%s</xliff:g></string>
<string name="noCameraPermissionDirectToSystemSetting">By zeskanować kody kreskowe, Catima musi mieć dostęp do twojej kamery. Dotknij tutaj by zmienić swoje ustawienia dostępu.</string>
<string name="updateBalanceTitle">Ile wydałeś?</string>
<string name="updateBalanceTitle">Ile wydałeś lub otrzymałeś?</string>
<string name="updateBalanceHint">Wpisz sumę</string>
<string name="updateBalance">Zaktualizuj balans</string>
<string name="cameraPermissionDeniedTitle">Odmówiono dostępu do kamery</string>
@@ -298,4 +298,15 @@
<string name="field_must_not_be_empty">Pole nie może być puste</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Zawsze obracaj (ignoruje ustawienia systemowe)</string>
<string name="continue_">Kontynuuj</string>
<string name="addFromPdfFile">Wybierz plik PDF</string>
<string name="errorReadingFile">Nie można odczytać pliku</string>
<string name="pageWithNumber">Strona <xliff:g>%d</xliff:g></string>
<string name="spend">Wydaj</string>
<string name="receive">Otrzymaj</string>
<string name="amountParsingFailed">Nieprawidłowa ilość</string>
<string name="add_manually_warning_title">Skanowanie jest zalecane</string>
<string name="failedLaunchingFileManager">Nie można znaleźć obsługiwanego menedżera plików</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Którego ze znalezionych kodów kreskowych chciałbyś użyć?</string>
<string name="add_manually_warning_message">W przypadku niektórych sklepów wartość kodu kreskowego różni się od liczby zapisanej na karcie. Z tego powodu ręczne wprowadzanie kodu kreskowego może nie zawsze działać. Zdecydowanie zaleca się zeskanowanie kodu kreskowego za pomocą aparatu. Czy nadal chcesz kontynuować?</string>
</resources>

View File

@@ -297,4 +297,9 @@
<string name="receive">Receber</string>
<string name="amountParsingFailed">Montante inválida</string>
<string name="settings_follow_sensor_orientation">Rodar sempre (ignora as definições do sistema)</string>
<string name="addFromPdfFile">Selecionar um ficheiro PDF</string>
<string name="errorReadingFile">Não foi possível ler o ficheiro</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Qual dos códigos de barras encontrados pretende utilizar?</string>
<string name="pageWithNumber">Página <xliff:g>%d</xliff:g></string>
<string name="failedLaunchingFileManager">Não foi possível encontrar um gestor de ficheiros suportado</string>
</resources>

View File

@@ -257,7 +257,7 @@
<string name="show_archived_cards">Afișați cardurile arhivate</string>
<string name="settings_card_orientation">Orientarea codului de bare</string>
<string name="app_libraries">Biblioteci terță deschise: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="updateBalanceTitle">Cât de mult ați folosit?</string>
<string name="updateBalanceTitle">Cât de mult ați cheltuit sau primit?</string>
<string name="settings_blue_theme">Albastru</string>
<string name="app_resources">Resurse terță deschise: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_name">Catima</string>
@@ -294,4 +294,7 @@
<string name="continue_">Continua</string>
<string name="add_manually_warning_title">Se recomandă scanarea</string>
<string name="add_manually_warning_message">Pentru unele magazine, valoarea codului de bare diferă de numărul scris pe card. Din acest motiv, este posibil ca introducerea manuală a unui cod de bare să nu funcționeze întotdeauna. În schimb, este recomandat să scanați codul de bare cu camera dvs. Mai vrei să continui?</string>
<string name="spend">Cheltuie</string>
<string name="receive">Primește</string>
<string name="amountParsingFailed">Sumă nevalidă</string>
</resources>

View File

@@ -304,4 +304,9 @@
<string name="spend">Потрачено</string>
<string name="receive">Получено</string>
<string name="amountParsingFailed">Недопустимая сумма</string>
<string name="addFromPdfFile">Выберите PDF-файл</string>
<string name="errorReadingFile">Невозможно прочитать файл</string>
<string name="pageWithNumber">Страница <xliff:g>%d</xliff:g></string>
<string name="failedLaunchingFileManager">Не найден поддерживаемый файловый менеджер</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Какой из найденных штрих-кодов вы хотите использовать?</string>
</resources>

View File

@@ -290,4 +290,9 @@
<string name="spend">Harca</string>
<string name="receive">Al</string>
<string name="amountParsingFailed">Geçersiz miktar</string>
<string name="errorReadingFile">Dosya okunamadı</string>
<string name="failedLaunchingFileManager">Desteklenen dosya yöneticisi bulunamadı</string>
<string name="addFromPdfFile">PDF dosyası seç</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Bulunan barkodlardan hangisini kullanmak istiyorsunuz?</string>
<string name="pageWithNumber">Sayfa <xliff:g>%d</xliff:g></string>
</resources>

View File

@@ -247,7 +247,7 @@
<string name="failedToRetrieveImageFile">Збій доступу до файлу зображення</string>
<string name="barcodeLongPressMessage">Галерея може відкривати лише зображення</string>
<string name="importCards">Імпорт карток</string>
<string name="updateBalanceTitle">Скільки витратили?</string>
<string name="updateBalanceTitle">Скільки ви витратили або отримали?</string>
<string name="updateBalanceHint">Введіть суму</string>
<string name="currentBalanceSentence">Поточний баланс: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Новий баланс: <xliff:g>%s</xliff:g></string>
@@ -301,4 +301,12 @@
<string name="add_manually_warning_message">У деяких магазинах значення штрихкоду відрізняється від номера, записаного на картці. Через це введення штрихкоду вручну може не завжди спрацювати. Наполегливо рекомендуємо відсканувати штрихкод за допомогою камери. Ви все ще хочете продовжити?</string>
<string name="continue_">Продовжити</string>
<string name="add_manually_warning_title">Рекомендується відсканувати</string>
<string name="failedLaunchingFileManager">Не вдалося знайти підтримуваний файловий менеджер</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Який зі знайдених штрих-кодів ви хочете використати?</string>
<string name="addFromPdfFile">Виберіть PDF файл</string>
<string name="errorReadingFile">Не вдалося прочитати файл</string>
<string name="pageWithNumber">Сторінка <xliff:g>%d</xliff:g></string>
<string name="spend">Витратити</string>
<string name="receive">Отримайте</string>
<string name="amountParsingFailed">Неправильна сума</string>
</resources>

View File

@@ -127,7 +127,7 @@
<string name="settings_brown_theme">Màu nâu</string>
<string name="app_copyright_short">Bản quyền © Sylvia van Os và các cộng sự</string>
<string name="importExportHelp">Sao lưu cho phép bạn chuyển dữ liệu của mình đến thiết bị khác.</string>
<string name="settings_oled_dark">Màu nền đen cho chủ đề tối</string>
<string name="settings_oled_dark">Nền đen tuyền cho chủ đề tối</string>
<string name="starred">Ưa thích</string>
<string name="field_must_not_be_empty">Không được để ô trống</string>
<string name="importOptionFilesystemExplanation">Chọn 1 tập tin cụ thể từ hệ thống (filesystem).</string>
@@ -282,4 +282,10 @@
<string name="spend">Tiêu</string>
<string name="receive">Nhận được</string>
<string name="amountParsingFailed">Số tiền không hợp lệ</string>
<string name="add_manually_warning_message">Đối với một số cửa hàng, giá trị mã vạch khác với số ghi trên thẻ. Vì lý do này, việc nhập mã vạch theo cách thủ công không phải lúc nào cũng hiệu quả. Thay vào đó, bạn nên quét mã vạch bằng máy ảnh của mình. Bạn vẫn muốn tiếp tục chứ?</string>
<string name="addFromPdfFile">Chọn tệp PDF</string>
<string name="errorReadingFile">Không thể đọc tệp</string>
<string name="pageWithNumber">Page <xliff:g>%d</xliff:g></string>
<string name="multipleBarcodesFoundPleaseChooseOne">Bạn muốn sử dụng mã vạch nào được tìm thấy?</string>
<string name="failedLaunchingFileManager">Không thể tìm thấy trình quản lý tệp được hỗ trợ</string>
</resources>

View File

@@ -283,4 +283,9 @@
<string name="receive">接收</string>
<string name="amountParsingFailed">无效金额</string>
<string name="spend">支出</string>
<string name="errorReadingFile">无法读取文件</string>
<string name="failedLaunchingFileManager">找不到支持的文件管理器</string>
<string name="pageWithNumber"><xliff:g>%d</xliff:g></string>
<string name="addFromPdfFile">选择 PDF 文件</string>
<string name="multipleBarcodesFoundPleaseChooseOne">找到的多个条形码中,你希望使用哪个?</string>
</resources>

View File

@@ -81,6 +81,7 @@
<item>eo</item>
<item>es</item>
<item>es-rAR</item>
<!-- <item>fa</item> -->
<item>fi</item>
<item>fr</item>
<item>he-rIL</item>

View File

@@ -341,4 +341,9 @@
<string name="spend">Spend</string>
<string name="receive">Receive</string>
<string name="amountParsingFailed">Invalid amount</string>
<string name="addFromPdfFile">Select a PDF file</string>
<string name="errorReadingFile">Could not read the file</string>
<string name="failedLaunchingFileManager">Could not find a supported file manager</string>
<string name="multipleBarcodesFoundPleaseChooseOne">Which of the found barcodes do you want to use?</string>
<string name="pageWithNumber">Page <xliff:g>%d</xliff:g></string>
</resources>

View File

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

View File

@@ -5,8 +5,9 @@
2. Merge Weblate pull request
3. Update `CHANGELOG.md` with the new version name and the release date
4. Update `app/build.gradle.kts` with the new `versionCode` and `versionName`
5. Build a new .apk: `KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh`
6. Upload the APK to Google Play Open Testing
7. Push the version update: `git add CHANGELOG.md app/build.gradle.kts && git commit -m "Release Catima <VERSION>" && git push`
8. Create a new release on GitHub and attach the `app-release.apk` and `SHA256SUMS` files
9. After the release has been approved on Google Play Production, update the metadata there: `bundle exec fastlane supply --version_code <VERSION_CODE>`
5. Create a commit for the new release: `git add CHANGELOG.md app/build.gradle.kts && git commit -m "Release Catima <VERSION>"`
6. Build a new .apk: `KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh`
7. Upload the APK to Google Play Open Testing
8. Push the version update commit: `git push`
9. Create a new release on GitHub and attach the `app-release.apk` and `SHA256SUMS` files
10. After the release has been approved on Google Play Production, update the metadata there: `bundle exec fastlane supply --version_code <VERSION_CODE>`

View File

@@ -0,0 +1 @@
- تم تغيير اسم ملف الاستيراد/التصدير الافتراضي. (سحب رقم 84 (https://github.com/brarcher/loyalty-card-locker/pull/84)) - السلسلة الصحيحة في صفحة الاستيراد/التصدير. (سحب رقم 87 (https://github.com/brarcher/loyalty-card-locker/pull/87)) - تحسين تخطيط صفحة عرض البطاقة. يجب أن يكون النص أسهل في القراءة، ويمكن تحديده بنقرة طويلة. (سحب رقم 91 (https://github.com/brarcher/loyalty-card-locker/pull/91))

View File

@@ -0,0 +1,3 @@
- إصلاح cropper لايمكنه استخدم لون السمة
- إصلاح مشاكل السمات البسيطة
- إضافة سمة سوداء خالصة داكنة لشاشات OLED

View File

@@ -0,0 +1,2 @@
- إصلاحات طفيفة مختلفة
- إصلاح العطل عند استخدام الترجمة النرويجية

View File

@@ -0,0 +1,2 @@
- إصلاح عدم تطبيق الاختيار اليدوي للغة في كل مكان
- إصلاح العطل في طريقة عرض التحرير على لغة بلا منطقة

View File

@@ -0,0 +1,2 @@
- حفظ حالة توسيع تفاصيل البطاقة
- إصلاحات بسيطة لواجهة المستخدم

View File

@@ -0,0 +1,2 @@
- إصلاح ظهور الكتلة الرمادية على قيمة غير صالحة للباركود
- إصلاحات استيراد Stocard

View File

@@ -0,0 +1 @@
- إصلاح بعض تسلسلات الأحرف التي تظهر كحرف واحد

View File

@@ -0,0 +1 @@
- إصلاحات استيراد Stocard

View File

@@ -1,7 +1,7 @@
- Unterstützung der arabischen Sprache
- Arabisch wird unterstützt
- Anzeige der archivierten Kartenanzahl in der Gruppenübersicht
- Behebung von Fehlern bei der Guthabenanalyse (Karten in arabischer oder anderen nicht-westlichen Zahlen wurden nicht gespeichert)
- Benutzerdefiniertes Thema wird nicht korrekt auf den Hauptbildschirm angewendet
- Verbesserte Anzeige der ausgewählten Karten
- Absturz beim Verlassen der Kartenansicht in RTL-Layouts für Karten mit Ablaufdatum oder Guthaben behoben
- Rückwärtspfeil in der Kartenansicht zeigt in RTL-Layouts nicht mehr in die falsche Richtung
- Guthabenanalyse - Fehler beseitigt (Arabisch bzw. Sprachen mit nicht-westlichen Zahlen wurden nicht gespeichert)
- Benutzerdefiniertes Thema wird nun korrekt auf dem Hauptbildschirm gezeigt
- Verbesserte Anzeige ausgewählter Karten
- Kein Absturz beim Verlassen der Kartenansicht bei Karten mit Ablaufdatum/Guthaben
- Rückwärtspfeil in der Kartenansicht zeigt nicht mehr die falsche Richtung (RTL-Layout)

View File

@@ -1 +1,4 @@
- auf Android 14 richten
- Angepasst für Android 14
- „Touch“ auf Karten-Symbol öffnet dieses in Galerie
- Design der Registerkarte „Fotos“ in der Bearbeitungsansicht verbessert
- Bildschirm für „Guthaben“ aktualisiert, um auch „Einnahmen“ anzeigen zu können

View File

@@ -1,4 +1,4 @@
- Einstellung zur Steuerung der Bildschirmhelligkeit bei der Bacrode-Anzeige (Pull #259 (https://github.com/brarcher/loyalty-card-locker/pull/259))
- Griechische Übersetzungen hinzugefügt (Pull #252 (https://github.com/brarcher/loyalty-card-locker/pull/252))
- Slowenischen Übersetzungen hinzugefügt (Pull #260 (https://github.com/brarcher/loyalty-card-locker/pull/260))
- Steuerung der Bildschirmhelligkeit bei Anzeige des Barcode eingefügt (Pull #259 (https://github.com/brarcher/loyalty-card-locker/pull/259))
- Griechisch eingefügt (Pull #252 (https://github.com/brarcher/loyalty-card-locker/pull/252))
- Slowenisch eingefügt (Pull #260 (https://github.com/brarcher/loyalty-card-locker/pull/260))
- Übersetzungen aktualisiert (pull #260 (https://github.com/brarcher/loyalty-card-locker/pull/260), pull #254 (https://github.com/brarcher/loyalty-card-locker/pull/254))

View File

@@ -0,0 +1,3 @@
- Support for scanning PDF files for barcodes
- Support for image files with multiple barcodes
- Minor UI fixes

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 104 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 79 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -1,5 +1,5 @@
- Al editar un ID de tarjeta, pre-poblar el ID existente para comenzar. (pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
- Limitar el ancho de los códigos de barras generados para reducir el uso de memoria y los errores de memoria. (pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
- Cuando edite una tarjeta, cambie el botón "Enter Card" para decir "Editar Tarjeta" si ya existe una tarjeta ID. (pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
- Cambiar el esquema de color para que sea más suave y compatible con el icono de la aplicación, y cambiar el diseño al ver una tarjeta para que sea más limpio. (pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
- Añadir un asistente de introducción que se inicia en el primer lanzamiento de la aplicación. (pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
- Al editar un ID de tarjeta, rellenar previamente el ID existente para empezar. (pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
- Limitar el ancho de los códigos de barras generados para reducir el uso de memoria y los errores de memoria insuficiente. (pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
- Al editar una tarjeta, cambiar el botón "Introducir tarjeta" por "Editar tarjeta" si ya existe un ID de tarjeta. (pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
- Cambiar la combinación de colores para que sea más suave y compatible con el icono de la aplicación, y cambiar el diseño al ver una tarjeta para que sea más limpio. (pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
- Añadir un asistente de introducción que se lanza en el primer lanzamiento de la aplicación. (pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))

View File

@@ -2,3 +2,5 @@
- Améliorations du flux de validation
- Correction du cas de bord qui causait un état de l'interface invalide au basculement sur l'affichage de l'archive
- Utilisation du thème ou de la couleur de carte pour la barre de navigation (Android 8.1+)
- Mise à jour du sélecteur de date de validité et d'expiration
- Ajout d'une option pour toujours pivoter (ignore les paramètres système)

View File

@@ -0,0 +1,3 @@
- बारकोड के लिए पीडीएफ फाइलों को स्कैन करने के लिए समर्थन
- एकाधिक बारकोड वाली छवि फाइलों के लिए समर्थन
- मामूली UI सुधार

View File

@@ -1,4 +1,6 @@
- "카드 추가" 워크플로 개선
- 유효성 검증 흐름 개선
- 아카이브 표시를 전환할 때 잘못된 UI 상태를 일으키는 특수 사례 수정
- 비게이션 바에 테마 또는 카드 색상 사용 (Android 8.1+)
- "카드 추가" 워크플로 개선
- 검증 흐름 개선
- 보관 표시 토글 시 잘못된 UI 상태를 유발하는 에지 케이스 수정
- 비게이션 바에 테마 또는 카드 색상 사용(Android 8.1+)
- 업데이트된 유효 기간 및 만료 날짜 선택기
- 항상 회전하도록 옵션 추가(시스템 설정 무시)

View File

@@ -0,0 +1,4 @@
- 타겟 안드로이드 14
- 터치 시 갤러리에서 카드 아이콘 열기
- 편집 보기에서 사진 탭의 디자인 개선
- 수신도 지원하도록 지출 화면 업데이트

View File

@@ -0,0 +1,3 @@
- PDF 파일에서 바코드 검색 지원
- 여러 바코드가 있는 이미지 파일 지원
- 사소한 UI 수정

View File

@@ -1,22 +1,22 @@
상점 또는 웹샵 결제 중에 플라스틱 보상 카드 검색을 중지하십시오.
<b>카메라를 사용하여 바코드를 장치로 스캔하고 카드 잊어버리십시오.</b>
상점이나 웹샵에서 결제할 때 플라스틱 고객 카드를 찾는 것을 중단합니다.
<b>카메라에 바코드를 저장하고 카드 잊어버립니다.</b>
지갑을 잊어버리거나 귀중품을 위해 초경량으로 유지하십시오.
지갑을 집에 두거나 적어도 중요한 귀중품을 위한 충분한 공간을 남겨두세요.
이 필수 일상 휴대(EDC) 도구를 사용하면 쓸모 없는 플라스틱을 현금으로 교체할 수 있습니다.
이 필수 프로그램은 쓸모없는 플라스틱 대신 현금을 위한 공간을 만든다.
- 아주 적은 권한으로 스파이 활동을 피하세요. 인터넷 액세스 및 광고습니다.
- 이름 사용자 정 가능한 색상으로 카드 또는 코드를 추가합니다.
- 저장할 바코드가 없거나 사용할 수 없는 경우 수동 코드 입력.
- 파일, Catima, FidMe, 로열티 카드 키체인, Stocard 및 바우처 금고에서 카드와 코드를 가져옵니다.
- 모든 카드를 백업하고 원하는 경우 새 장치로 전송하십시오.
- 모든 앱을 사용하여 쿠폰, 독점 제공, 프로모션 코드 또는 카드와 코드를 공유하세요.
- 시각 장애가 있는 사용자를 위한 어두운 테마 및 접근성 옵션.
- libre 소프트웨어 커뮤니티에서 모두를 위해 만들었습니다.
- 20개 이상의 언어 현지화된 수작업 번역.
- 커뮤니티 기여로 지원되는 무료.
- 원하는 대로 사용, 연구, 변경 및 공유 <i>모두</i>.
- 자유 소프트웨어/오픈 소스 뿐만닙니다. <i>Copylefted</i> 자유 소프트웨어(GPLv3+) 카드 관리.
- 아주 적은 자격으로 감시당하지 않을 것이다. 인터넷 접속도 없고 광고 없다.
- 이름 사용자 정 가능한 색상으로 카드 또는 코드를 추가합니다.
- 바코드가 없거나 작동하지 않는 경우 수동 코드 입력.
- Catima, FidMe, 로열티 카드 키체인, Stocard 또는 Voucher Vault 파일에서 지도와 코드를 가져옵니다.
- 모든 카드를 백업하고 새 장치로 전송합니다.
- 쿠폰, 독점 제공, 프로모션 코드 또는 카드 및 기타 코드를 모든 앱과 공유합니다.
- 시각 장애가 있는 사용자를 위한 어두운 디자인과 접근성.
- 모두를 위한 무료 소프트웨어 커뮤니티에해 만들어졌다.
- 40개 이상의 언어를 위한 현지화된 인간 번역.
- 지역 사회 공헌을 통해 무료로 제공됩니다.
- 원하는 대로 앱을 사용, 확인, 수정 및 공유합니다.
- 무료 오픈 소스 소프트웨어뿐만 아니라. 무료 <i> Copylefted </i> 소프트웨어 맵 관리(GPLv3+).
삶과 쇼핑을 단순화하고 종이 영수증, 매장 내 결제 기프트 카드 또는 비행기 티켓을 다시는 잃어버리지 마십시오.
모든 보상과 보너스를 가지고 가서 저장하십시오.
더 이상 영수증, 상품권 또는 항공권을 잃지 않도록 삶과 쇼핑을 단순화하십시오.
항상 보너스와 보너스를 가지고 다니면서 돈을 절약하세요.

View File

@@ -13,7 +13,7 @@ Met deze essentiële app kun je die waardeloze plastic kaarten weggooien.
- Deel coupons, exclusieve aanbiedingen, promocodes of kaarten en codes met andere apps;
- Donker thema en toegankelijkheidsopties voor blinden en slechtzienden;
- Gemaakt voor iedereen door de vrijesoftwaregemeenschap;
- De app is met de hand vertaald naar meer dan 20 talen;
- De app is met de hand vertaald naar meer dan 40 talen;
- Gratis, ondersteund door de gemeenschap;
- Bekijk de broncode, pas deze aan en deel deze <i>met iedereen</i> (indien gewenst);
- Niet alleen vrije software/open source, maar ook <i>copyleft</i> vrije software (GPLv3+).

View File

@@ -0,0 +1,3 @@
- Suporte para digitalização de códigos de barras em ficheiros PDF
- Suporte para ficheiros de imagem com múltiplos códigos de barras
- Pequenas correções da IU

View File

@@ -1,4 +1,4 @@
- Ориентация на Android 14
- Значок карты в галерее открывается нажатием
- Значок карты открывается в галерее нажатием
- Улучшен дизайн вкладки фотографий в режиме редактирования
- Обновлён экран баланса баллов: теперь поддерживается получение

View File

@@ -0,0 +1,3 @@
- Поддержка сканирования PDF-файлов на наличие штрих-кодов
- Поддержка файлов изображений с несколькими штрихкодами
- Незначительные исправления в интерфейсе

View File

@@ -1,9 +1,14 @@
- Возможность поиска карты (№320)
- Возможность отправки и получения карт (№321)
- Добавлена возможность поиска карты (№320)
- Добавлена возможность отправки и получения карт (№321)
- Поддержка тёмного режима (№322)
- Поддержка карт без штрих-кодов (№324)
- Примечания могут отображаться в несколько строк (№326)
- Улучшено масштабирование примечаний (№319)
- Улучшена видимость уведомлений и значка приложения (№330)
- Целевой SDK обновлён до Android 10
- Улучшены переводы: немецкий, итальянский, нидерландский, польский, русский.
- Улучшены переводы:
- Немецкий
- Итальянский
- Нидерландский
- Польский
- Русский

View File

@@ -0,0 +1,2 @@
- Barkodlar için PDF dosyalarını tarama desteği
- Birden fazla barkod içeren resim dosyaları desteği

View File

@@ -0,0 +1,3 @@
- Sửa lỗi tính năng cắt xén không theo màu chủ đề
- Sửa những vấn đề nhỏ về chủ đề
- Thêm chủ đề đen tuyền cho màn hình OLED

View File

@@ -0,0 +1,2 @@
- Sửa một vài lỗi nhỏ
- Sửa lỗi bị văng khi sử dụng công cụ dịch tiếng Na-uy

View File

@@ -0,0 +1,2 @@
- Sửa lỗi lựa chọn ngôn ngữ không áp dụng toàn bộ
- Sửa lỗi bị văn trong cửa sổ xem chỉnh sửa trên địa phương không có khu vực

View File

@@ -0,0 +1,2 @@
- Sửa lỗi khối xám xuất hiện trong giá trị lỗi của mã vạch
- Sửa lỗi nhập Stocard

View File

@@ -0,0 +1 @@
- Sửa lỗi vài chuỗi ký tự hiển thị rời rạc

View File

@@ -0,0 +1 @@
- Sửa lỗi nhập Stocard

View File

@@ -0,0 +1,5 @@
- Tính năng thêm thẻ trùng lặp
- Không cho phép lựa chọn hết hạn trước 1970 (Hiển nhiên nó sẽ không hoạt động)
- Tính năng hỗ trợ lưu trữ thẻ
- Tính năng di chuyển, xoá từ chỉnh sửa sang xem
- Loại bỏ tính năng khoá biểu tượng khoá xoay màn hình để thêm một cơ chế khoá xoay màn hình mới

View File

@@ -0,0 +1 @@
- Sửa lỗi sai lệch màu chữ trong nút "No barcode"

View File

@@ -0,0 +1,3 @@
- 支持扫描 PDF 文件获取条形码
- 支持有多个条形码的图像文件
- 用户界面小修复

View File

Binary file not shown.

View File

@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME