Compare commits

...

80 Commits

Author SHA1 Message Date
Sylvia van Os
a514f285f7 Release Catima 2.36.0 2025-08-05 18:10:57 +02:00
Sylvia van Os
5634df1f5a Merge pull request #2601 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-05 18:09:02 +02:00
delvani
f2b46310de Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_BR/
2025-08-05 17:49:05 +02:00
Edgars Andersons
a646717277 Translated using Weblate (Latvian)
Currently translated at 9.4% (14 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-08-05 17:49:05 +02:00
Edgars Andersons
63e992be5c Translated using Weblate (Latvian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lv/
2025-08-05 17:49:04 +02:00
Sylvia van Os
98a574f223 Translated using Weblate (Dutch)
Currently translated at 59.4% (88 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/nl/
2025-08-05 17:49:04 +02:00
Sylvia van Os
6dfbcc3577 Translated using Weblate (Dutch)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2025-08-05 17:49:03 +02:00
Sylvia van Os
4c00c8b94d Merge pull request #2599 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-03 20:49:25 +02:00
Ömer
cde3dd8ecf Translated using Weblate (Turkish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2025-08-03 18:02:29 +00:00
Giovanni Donisi
e22ad2c4a8 Translated using Weblate (Italian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2025-08-03 18:02:28 +00:00
Sylvia van Os
62aeadae71 Merge pull request #2598 from CatimaLoyalty/create-pull-request/patch-1754196371
Update contributors
2025-08-03 10:24:36 +02:00
TheLastProject
7e89db428b Update contributors 2025-08-03 04:46:11 +00:00
Sylvia van Os
50e13c22c6 Merge pull request #2597 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-02 17:33:07 +02:00
ssantos
7e323dc342 Translated using Weblate (Portuguese)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2025-08-02 17:08:20 +02:00
josé m
c0cd051831 Translated using Weblate (Galician)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/gl/
2025-08-02 17:08:20 +02:00
Priit Jõerüüt
b1b97c8972 Translated using Weblate (Estonian)
Currently translated at 11.4% (17 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/et/
2025-08-02 17:08:19 +02:00
Priit Jõerüüt
256687ecdb Translated using Weblate (Estonian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/et/
2025-08-02 17:08:18 +02:00
ssantos
9829cc3100 Translated using Weblate (Portuguese)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-08-02 17:08:18 +02:00
ssantos
2aa8be2642 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt_PT/
2025-08-02 17:08:17 +02:00
ssantos
75a6482c0e Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-08-02 17:08:16 +02:00
109247019824
14e953db4c Translated using Weblate (Bulgarian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2025-08-02 17:08:16 +02:00
Ricky Tigg
60e3c864c8 Translated using Weblate (Finnish)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fi/
2025-08-02 17:08:15 +02:00
大王叫我来巡山
87ca4a5dd3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-08-02 17:08:14 +02:00
大王叫我来巡山
a70671cf0b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hans/
2025-08-02 17:08:14 +02:00
Warder
67d7ea4ca2 Translated using Weblate (Slovak)
Currently translated at 98.6% (146 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-08-02 17:08:13 +02:00
Fjuro
53f58940dd Translated using Weblate (Czech)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-08-02 17:08:13 +02:00
Максим Горпиніч
f2639612f0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-08-02 17:08:12 +02:00
solokot
d29344af73 Translated using Weblate (Russian)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-08-02 17:08:12 +02:00
Kachelkaiser
32635bdc9a Translated using Weblate (German)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-08-02 17:08:11 +02:00
Sylvain Pichon
8457cc06d2 Translated using Weblate (French)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-08-02 17:08:10 +02:00
Максим Горпиніч
a8316769a1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2025-08-02 17:08:10 +02:00
Warder
2f6bae7333 Translated using Weblate (Slovak)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sk/
2025-08-02 17:08:09 +02:00
solokot
e951402049 Translated using Weblate (Russian)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2025-08-02 17:08:08 +02:00
Sylvain Pichon
4d5e3043ff Translated using Weblate (French)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2025-08-02 17:08:08 +02:00
Vasilis K
d57f528165 Translated using Weblate (Greek)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/el/
2025-08-02 17:08:07 +02:00
Kachelkaiser
14e84e5e0f Translated using Weblate (German)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2025-08-02 17:08:07 +02:00
Fjuro
fe79d3e866 Translated using Weblate (Czech)
Currently translated at 100.0% (334 of 334 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/cs/
2025-08-02 17:08:06 +02:00
Sylvia van Os
88369ea070 Merge pull request #2596 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-08-01 17:18:04 +02:00
Warder
944e83e480 Translated using Weblate (Slovak)
Currently translated at 98.6% (146 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/sk/
2025-08-01 16:53:47 +02:00
Sylvia van Os
8bb15bcb57 Merge pull request #2593 from CatimaLoyalty/dependabot/gradle/com.android.application-8.12.0
Bump com.android.application from 8.11.1 to 8.12.0
2025-08-01 08:16:33 +02:00
dependabot[bot]
cb6358892b Bump com.android.application from 8.11.1 to 8.12.0
Bumps com.android.application from 8.11.1 to 8.12.0.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 02:06:11 +00:00
Sylvia van Os
9956f6de34 Merge pull request #2592 from CatimaLoyalty/create-pull-request/patch-1753994193
Update Fastlane changelogs
2025-07-31 22:38:06 +02:00
TheLastProject
893bd551e0 Update Fastlane changelogs 2025-07-31 20:36:32 +00:00
Sylvia van Os
5c67459330 Update CHANGELOG 2025-07-31 22:36:20 +02:00
Sylvia van Os
e2988ec29a Merge pull request #2566 from realwk/widget
Widget with all cards
2025-07-31 22:35:44 +02:00
Sylvia van Os
2c96b11725 Various widget bugfixes
Widget now updates on sorting order change and no cards is correctly
detected
2025-07-31 21:50:59 +02:00
Sylvia van Os
0d52a49e8b Merge pull request #2591 from CatimaLoyalty/dependabot/gradle/androidx.test.ext-junit-1.3.0
Bump androidx.test.ext:junit from 1.2.1 to 1.3.0
2025-07-31 08:46:53 +02:00
dependabot[bot]
504ab7f148 Bump androidx.test.ext:junit from 1.2.1 to 1.3.0
Bumps androidx.test.ext:junit from 1.2.1 to 1.3.0.

---
updated-dependencies:
- dependency-name: androidx.test.ext:junit
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-31 06:23:18 +00:00
Sylvia van Os
d75f228632 Merge pull request #2590 from CatimaLoyalty/dependabot/gradle/androidx.test.espresso-espresso-core-3.7.0
Bump androidx.test.espresso:espresso-core from 3.6.1 to 3.7.0
2025-07-31 08:22:07 +02:00
Sylvia van Os
410f0f2a6f Merge pull request #2588 from CatimaLoyalty/dependabot/gradle/androidXTestVersion-1.7.0
Bump androidXTestVersion from 1.6.1 to 1.7.0
2025-07-31 08:16:15 +02:00
dependabot[bot]
c4672d282c Bump androidx.test.espresso:espresso-core from 3.6.1 to 3.7.0
Bumps androidx.test.espresso:espresso-core from 3.6.1 to 3.7.0.

---
updated-dependencies:
- dependency-name: androidx.test.espresso:espresso-core
  dependency-version: 3.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-31 02:06:24 +00:00
dependabot[bot]
9297fee839 Bump androidXTestVersion from 1.6.1 to 1.7.0
Bumps `androidXTestVersion` from 1.6.1 to 1.7.0.

Updates `androidx.test:core` from 1.6.1 to 1.7.0

Updates `androidx.test:runner` from 1.6.1 to 1.7.0

---
updated-dependencies:
- dependency-name: androidx.test:core
  dependency-version: 1.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: androidx.test:runner
  dependency-version: 1.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-31 02:06:07 +00:00
Sylvia van Os
acc72c0937 Rename from CatimaWidget to ListWidget
This makes the codebase easier to understand if we get more widget types
in the future
2025-07-30 21:23:14 +02:00
Sylvia van Os
54c27f7038 Refactor widget to be the same size as regular cards
This isn't as automatic as I would've liked, but with some manual
trial-and-error I think this works well enough in keeping the aspect
ratio while somewhat "scaling" based on size (at least the number of
columns are scaled)
2025-07-30 21:23:14 +02:00
Sylvia van Os
7277ff26fc Refactor deprecated widget code
This replaces the deprecated widget method with the new one and ensures
it consistently updates on changes.
2025-07-30 21:23:14 +02:00
realwk
9a0149def8 Initial widget work
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2025-07-30 21:23:14 +02:00
Sylvia van Os
e217e99864 Merge pull request #2587 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-29 20:17:46 +02:00
Lilith Maria
9674af3bae Translated using Weblate (Lithuanian)
Currently translated at 4.0% (6 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lt/
2025-07-29 19:10:30 +02:00
Sylvia van Os
a2b85dd37a Merge pull request #2585 from StellarSand/mainfork
Migrate 2 actvities to kotlin
2025-07-29 18:15:01 +02:00
Sylvia van Os
220fe96268 Merge pull request #2586 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-28 18:45:19 +02:00
ssantos
917b6cfb7d Translated using Weblate (Portuguese)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt/
2025-07-28 18:22:47 +02:00
ssantos
0b687e1788 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/pt_PT/
2025-07-28 18:22:46 +02:00
Edgars Andersons
b35fa810ef Translated using Weblate (Latvian)
Currently translated at 9.4% (14 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/lv/
2025-07-28 18:22:45 +02:00
大王叫我来巡山
0d1e10d064 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hans/
2025-07-28 18:22:45 +02:00
StellarSand
96359e5942 minor changes 2025-07-28 04:03:06 +05:30
StellarSand
bf63390f65 convert BarcodeSelectorActivity to kotlin 2025-07-28 02:47:58 +05:30
StellarSand
6f54981333 Rename .java to .kt 2025-07-28 02:47:58 +05:30
StellarSand
aed145239b convert CardShortcutConfigure to kotlin 2025-07-28 02:47:44 +05:30
StellarSand
99a8c917b9 Rename .java to .kt 2025-07-28 02:47:44 +05:30
Sylvia van Os
ef39f30fd7 Merge pull request #2584 from weblate/weblate-catima-catima
Translations update from Hosted Weblate
2025-07-27 15:37:11 +02:00
Reptalica
24e996e1a9 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (332 of 332 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/vi/
2025-07-27 12:07:40 +00:00
Fjuro
4178dce4e2 Translated using Weblate (Czech)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/cs/
2025-07-27 12:07:38 +00:00
Максим Горпиніч
514eaae616 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2025-07-27 12:07:23 +00:00
solokot
5692251668 Translated using Weblate (Russian)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2025-07-27 12:07:07 +00:00
B o d o
6208dd3fd9 Translated using Weblate (German)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2025-07-27 12:06:52 +00:00
Sylvain Pichon
85288a3658 Translated using Weblate (French)
Currently translated at 100.0% (148 of 148 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2025-07-27 12:06:36 +00:00
Sylvia van Os
bae7e676b4 Merge pull request #2581 from CatimaLoyalty/create-pull-request/patch-1753466727
Update Fastlane changelogs
2025-07-25 20:05:51 +02:00
TheLastProject
6ae7491a18 Update Fastlane changelogs 2025-07-25 18:05:26 +00:00
Sylvia van Os
e5de694711 Update CHANGELOG 2025-07-25 20:05:13 +02:00
StellarSand
996cd2cd2c Proper fix for FAB being hidden by keyboard (#2579) 2025-07-25 20:04:24 +02:00
80 changed files with 701 additions and 329 deletions

View File

@@ -1,8 +1,9 @@
# Changelog
## Unreleased - 150
## v2.36.0 - 150 (2025-08-05)
- Made it harder to accidentally close edit view
- Add a widget showing all non-archived cards
- Prevent the keyboard from overlapping the save button in edit and group screens
## v2.35.1 - 149 (2025-06-17)

View File

@@ -17,8 +17,8 @@ android {
applicationId = "me.hackerchick.catima"
minSdk = 21
targetSdk = 35
versionCode = 149
versionName = "2.35.1"
versionCode = 150
versionName = "2.36.0"
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true
@@ -112,6 +112,7 @@ dependencies {
implementation("androidx.appcompat:appcompat:1.7.1")
implementation("androidx.constraintlayout:constraintlayout:2.2.1")
implementation("androidx.core:core-ktx:1.16.0")
implementation("androidx.core:core-remoteviews:1.1.0")
implementation("androidx.core:core-splashscreen:1.0.1")
implementation("androidx.exifinterface:exifinterface:1.4.1")
implementation("androidx.palette:palette:1.0.0")
@@ -128,7 +129,7 @@ dependencies {
implementation("net.lingala.zip4j:zip4j:2.11.5")
// Testing
val androidXTestVersion = "1.6.1"
val androidXTestVersion = "1.7.0"
val junitVersion = "4.13.2"
testImplementation("androidx.test:core:$androidXTestVersion")
testImplementation("junit:junit:$junitVersion")
@@ -136,10 +137,10 @@ dependencies {
androidTestImplementation("androidx.test:core:$androidXTestVersion")
androidTestImplementation("junit:junit:$junitVersion")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test.ext:junit:1.3.0")
androidTestImplementation("androidx.test:runner:$androidXTestVersion")
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0")
}
tasks.register("copyRawResFiles", Copy::class) {

View File

@@ -30,6 +30,20 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:localeConfig="@xml/locales_config">
<receiver
android:name=".ListWidget"
android:label="@string/card_list_widget_name"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/list_widget_info" />
</receiver>
<activity
android:name=".MainActivity"
android:exported="true"
@@ -75,7 +89,8 @@
<activity
android:name=".ManageGroupActivity"
android:label="@string/group_edit"
android:theme="@style/AppTheme.NoActionBar"/>
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".LoyaltyCardViewActivity"
android:exported="true"

View File

@@ -1,126 +0,0 @@
package protect.card_locker;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import com.google.zxing.BarcodeFormat;
import java.util.ArrayList;
import protect.card_locker.databinding.BarcodeSelectorActivityBinding;
/**
* This activity is callable and will allow a user to enter
* barcode data and generate all barcodes possible for
* the data. The user may then select any barcode, where its
* data and type will be returned to the caller.
*/
public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements BarcodeSelectorAdapter.BarcodeSelectorListener {
private BarcodeSelectorActivityBinding binding;
private static final String TAG = "Catima";
// Result this activity will return
public static final String BARCODE_CONTENTS = "contents";
public static final String BARCODE_FORMAT = "format";
private final Handler typingDelayHandler = new Handler(Looper.getMainLooper());
public static final Integer INPUT_DELAY = 250;
private BarcodeSelectorAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = BarcodeSelectorActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.selectBarcodeTitle);
setContentView(binding.getRoot());
Utils.applyWindowInsets(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
enableToolbarBackButton();
EditText cardId = binding.cardId;
ListView mBarcodeList = binding.barcodes;
mAdapter = new BarcodeSelectorAdapter(this, new ArrayList<>(), this);
mBarcodeList.setAdapter(mAdapter);
cardId.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Delay the input processing so we avoid overload
typingDelayHandler.removeCallbacksAndMessages(null);
typingDelayHandler.postDelayed(() -> {
Log.d(TAG, "Entered text: " + s);
runOnUiThread(() -> {
generateBarcodes(s.toString());
});
}, INPUT_DELAY);
}
});
final Bundle b = getIntent().getExtras();
final String initialCardId = b != null ? b.getString(LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID) : null;
if (initialCardId != null) {
cardId.setText(initialCardId);
} else {
generateBarcodes("");
}
}
private void generateBarcodes(String value) {
// Update barcodes
ArrayList<CatimaBarcodeWithValue> barcodes = new ArrayList<>();
for (BarcodeFormat barcodeFormat : CatimaBarcode.barcodeFormats) {
CatimaBarcode catimaBarcode = CatimaBarcode.fromBarcode(barcodeFormat);
barcodes.add(new CatimaBarcodeWithValue(catimaBarcode, value));
}
mAdapter.setBarcodes(barcodes);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
setResult(Activity.RESULT_CANCELED);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onRowClicked(int inputPosition, View view) {
CatimaBarcodeWithValue barcodeWithValue = mAdapter.getItem(inputPosition);
CatimaBarcode catimaBarcode = barcodeWithValue.catimaBarcode();
if (!mAdapter.isValid(view)) {
Toast.makeText(this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
return;
}
String barcodeFormat = catimaBarcode.format().name();
String value = barcodeWithValue.value();
Log.d(TAG, "Selected barcode type " + barcodeFormat);
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, barcodeFormat);
result.putExtra(BARCODE_CONTENTS, value);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
}
}

View File

@@ -0,0 +1,118 @@
package protect.card_locker
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.core.view.MenuProvider
import androidx.core.widget.doOnTextChanged
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import protect.card_locker.BarcodeSelectorAdapter.BarcodeSelectorListener
import protect.card_locker.databinding.BarcodeSelectorActivityBinding
/**
* This activity is callable and will allow a user to enter
* barcode data and generate all barcodes possible for
* the data. The user may then select any barcode, where its
* data and type will be returned to the caller.
*/
class BarcodeSelectorActivity : CatimaAppCompatActivity(), BarcodeSelectorListener, MenuProvider {
private lateinit var binding: BarcodeSelectorActivityBinding
private lateinit var mAdapter: BarcodeSelectorAdapter
companion object {
private const val TAG = "Catima"
// Result this activity will return
const val BARCODE_CONTENTS = "contents"
const val BARCODE_FORMAT = "format"
const val INPUT_DELAY = 250L
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
addMenuProvider(this)
binding = BarcodeSelectorActivityBinding.inflate(layoutInflater)
setTitle(R.string.selectBarcodeTitle)
setContentView(binding.getRoot())
Utils.applyWindowInsets(binding.getRoot())
setSupportActionBar(binding.toolbar)
enableToolbarBackButton()
var typingDelayJob: Job? = null
val cardId = binding.cardId
val mBarcodeList = binding.barcodes
mAdapter = BarcodeSelectorAdapter(this, ArrayList<CatimaBarcodeWithValue?>(), this)
mBarcodeList.adapter = mAdapter
cardId.doOnTextChanged { s, _, _, _ ->
typingDelayJob?.cancel()
typingDelayJob =
lifecycleScope.launch {
delay(INPUT_DELAY) // Delay the input processing so we avoid overload
Log.d(TAG, "Entered text: $s")
generateBarcodes(s.toString())
}
}
val initialCardId = intent.extras?.getString(LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID)
initialCardId?.let {
cardId.setText(initialCardId)
} ?: generateBarcodes("")
}
private fun generateBarcodes(value: String?) {
// Update barcodes
val barcodes = ArrayList<CatimaBarcodeWithValue?>()
CatimaBarcode.barcodeFormats.forEach {
val catimaBarcode = CatimaBarcode.fromBarcode(it)
barcodes.add(CatimaBarcodeWithValue(catimaBarcode, value))
}
mAdapter.setBarcodes(barcodes)
}
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
if (menuItem.itemId == android.R.id.home) {
setResult(RESULT_CANCELED)
finish()
}
return true
}
override fun onRowClicked(inputPosition: Int, view: View) {
val barcodeWithValue = mAdapter.getItem(inputPosition)
val catimaBarcode = barcodeWithValue!!.catimaBarcode()
if (!mAdapter.isValid(view)) {
Toast.makeText(this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show()
return
}
val barcodeFormat = catimaBarcode.format().name
val value = barcodeWithValue.value()
Log.d(TAG, "Selected barcode type $barcodeFormat")
Intent().apply {
putExtra(BARCODE_FORMAT, barcodeFormat)
putExtra(BARCODE_CONTENTS, value)
setResult(RESULT_OK, this)
}
finish()
}
}

View File

@@ -1,111 +0,0 @@
package protect.card_locker;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import protect.card_locker.databinding.CardShortcutConfigureActivityBinding;
import protect.card_locker.preferences.Settings;
/**
* The configuration screen for creating a shortcut.
*/
public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
private CardShortcutConfigureActivityBinding binding;
static final String TAG = "Catima";
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
binding = CardShortcutConfigureActivityBinding.inflate(getLayoutInflater());
mDatabase = new DBHelper(this).getReadableDatabase();
// Set the result to CANCELED. This will cause nothing to happen if the
// aback button is pressed.
setResult(RESULT_CANCELED);
setContentView(binding.getRoot());
Utils.applyWindowInsets(binding.getRoot());
Toolbar toolbar = binding.toolbar;
toolbar.setTitle(R.string.shortcutSelectCard);
setSupportActionBar(toolbar);
// If there are no cards, bail
int cardCount = DBHelper.getLoyaltyCardCount(mDatabase);
if (cardCount == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show();
finish();
}
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this, null);
binding.list.setAdapter(mAdapter);
}
@Override
protected void onResume() {
super.onResume();
var layoutManager = (GridLayoutManager) binding.list.getLayoutManager();
if (layoutManager != null) {
var settings = new Settings(this);
layoutManager.setSpanCount(settings.getPreferredColumnCount());
}
}
private void onClickAction(int position) {
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
selected.moveToPosition(position);
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(CardShortcutConfigure.this, selected);
Log.d(TAG, "Creating shortcut for card " + loyaltyCard.store + "," + loyaltyCard.id);
ShortcutInfoCompat shortcut = ShortcutHelper.createShortcutBuilder(CardShortcutConfigure.this, loyaltyCard).build();
setResult(RESULT_OK, ShortcutManagerCompat.createShortcutResultIntent(CardShortcutConfigure.this, shortcut));
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
getMenuInflater().inflate(R.menu.card_details_menu, inputMenu);
return super.onCreateOptionsMenu(inputMenu);
}
@Override
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog();
invalidateOptionsMenu();
return true;
}
return super.onOptionsItemSelected(inputItem);
}
@Override
public void onRowClicked(int inputPosition) {
onClickAction(inputPosition);
}
@Override
public void onRowLongClicked(int inputPosition) {
// do nothing
}
}

View File

@@ -0,0 +1,96 @@
package protect.card_locker
import android.database.sqlite.SQLiteDatabase
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.widget.Toast
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.view.MenuProvider
import androidx.recyclerview.widget.GridLayoutManager
import protect.card_locker.LoyaltyCardCursorAdapter.CardAdapterListener
import protect.card_locker.databinding.CardShortcutConfigureActivityBinding
import protect.card_locker.preferences.Settings
class CardShortcutConfigure : CatimaAppCompatActivity(), CardAdapterListener, MenuProvider {
private lateinit var binding: CardShortcutConfigureActivityBinding
private lateinit var mDatabase: SQLiteDatabase
private lateinit var mAdapter: LoyaltyCardCursorAdapter
private companion object {
private const val TAG: String = "Catima"
}
public override fun onCreate(savedInstanceBundle: Bundle?) {
super.onCreate(savedInstanceBundle)
addMenuProvider(this)
binding = CardShortcutConfigureActivityBinding.inflate(layoutInflater)
mDatabase = DBHelper(this).readableDatabase
// Set the result to CANCELED.
// This will cause nothing to happen if the back button is pressed.
setResult(RESULT_CANCELED)
setContentView(binding.getRoot())
Utils.applyWindowInsets(binding.getRoot())
binding.toolbar.apply {
setTitle(R.string.shortcutSelectCard)
setSupportActionBar(this)
}
// If there are no cards, bail
if (DBHelper.getLoyaltyCardCount(mDatabase) == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show()
finish()
}
val cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All)
mAdapter = LoyaltyCardCursorAdapter(this, cardCursor, this, null)
binding.list.setAdapter(mAdapter)
}
override fun onResume() {
super.onResume()
val layoutManager = binding.list.layoutManager as GridLayoutManager?
layoutManager?.setSpanCount(Settings(this).getPreferredColumnCount())
}
private fun onClickAction(position: Int) {
val selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All)
selected.moveToPosition(position)
val loyaltyCard = LoyaltyCard.fromCursor(this, selected)
Log.d(TAG, "Creating shortcut for card ${loyaltyCard.store}, ${loyaltyCard.id}")
val shortcut = ShortcutHelper.createShortcutBuilder(this, loyaltyCard).build()
setResult(RESULT_OK,
ShortcutManagerCompat.createShortcutResultIntent(this, shortcut))
finish()
}
override fun onCreateMenu(inputMenu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.card_details_menu, inputMenu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
if (menuItem.itemId == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog()
}
return true
}
override fun onRowClicked(inputPosition: Int) {
onClickAction(inputPosition)
}
override fun onRowLongClicked(inputPosition: Int) {
// do nothing
}
}

View File

@@ -0,0 +1,130 @@
package protect.card_locker
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.Icon
import android.os.Build
import android.view.View
import android.widget.RemoteViews
import androidx.core.widget.RemoteViewsCompat
import protect.card_locker.DBHelper.LoyaltyCardArchiveFilter
class ListWidget : AppWidgetProvider() {
fun updateAll(context: Context) {
val appWidgetManager = AppWidgetManager.getInstance(context)
val componentName = ComponentName(context, ListWidget::class.java)
onUpdate(
context,
appWidgetManager,
appWidgetManager.getAppWidgetIds(componentName)
)
}
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
val database = DBHelper(context).readableDatabase
// Get cards
val order = Utils.getLoyaltyCardOrder(context);
val orderDirection = Utils.getLoyaltyCardOrderDirection(context);
val loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(
database,
"",
null,
order,
orderDirection,
LoyaltyCardArchiveFilter.Unarchived
)
// Bind every card to cell in the grid
var hasCards = false
val remoteCollectionItemsBuilder = RemoteViewsCompat.RemoteCollectionItems.Builder()
if (loyaltyCardCursor.moveToFirst()) {
do {
val loyaltyCard = LoyaltyCard.fromCursor(context, loyaltyCardCursor)
remoteCollectionItemsBuilder.addItem(
loyaltyCard.id.toLong(),
createRemoteViews(
context, loyaltyCard
)
)
hasCards = true
} while (loyaltyCardCursor.moveToNext())
}
loyaltyCardCursor.close()
// Create the base empty view
var views = RemoteViews(context.packageName, R.layout.list_widget_empty)
if (hasCards) {
// If we have cards, create the list
views = RemoteViews(context.packageName, R.layout.list_widget)
val templateIntent = Intent(context, LoyaltyCardViewActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
context,
0,
templateIntent,
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
views.setPendingIntentTemplate(R.id.grid_view, pendingIntent)
RemoteViewsCompat.setRemoteAdapter(
context,
views,
appWidgetId,
R.id.grid_view,
remoteCollectionItemsBuilder.build()
)
}
// Let Android know the widget is ready for display
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
private fun createRemoteViews(context: Context, loyaltyCard: LoyaltyCard): RemoteViews {
// Create a single cell for the grid view, bind it to open in the LoyaltyCardViewActivity
// Note: Android 5 will not use bitmaps
val remoteViews = RemoteViews(context.packageName, R.layout.list_widget_item).apply {
val headerColor = Utils.getHeaderColor(context, loyaltyCard)
val foreground = if (Utils.needsDarkForeground(headerColor)) Color.BLACK else Color.WHITE
setInt(R.id.item_container_foreground, "setBackgroundColor", headerColor)
val icon = loyaltyCard.getImageThumbnail(context)
// setImageViewIcon is not supported on Android 5, so force Android 5 down the text path
if (icon != null && Build.VERSION.SDK_INT >= 23) {
setInt(R.id.item_container_foreground, "setBackgroundColor", foreground)
setImageViewIcon(R.id.item_image, Icon.createWithBitmap(icon))
setViewVisibility(R.id.item_text, View.INVISIBLE)
setViewVisibility(R.id.item_image, View.VISIBLE)
} else {
setImageViewBitmap(R.id.item_image, null)
setTextViewText(R.id.item_text, loyaltyCard.store)
setViewVisibility(R.id.item_text, View.VISIBLE)
setViewVisibility(R.id.item_image, View.INVISIBLE)
setTextColor(
R.id.item_text,
foreground
)
}
// Add the card ID to the intent template
val fillInIntent = Intent().apply {
putExtra(LoyaltyCardViewActivity.BUNDLE_ID, loyaltyCard.id)
}
setOnClickFillInIntent(R.id.item_container, fillInIntent)
}
return remoteViews
}
}

View File

@@ -24,7 +24,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
@@ -45,6 +44,9 @@ import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.exifinterface.media.ExifInterface;
import androidx.lifecycle.ViewModelProvider;
@@ -298,7 +300,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
super.onCreate(savedInstanceState);
binding = LoyaltyCardEditActivityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Utils.applyWindowInsets(binding.getRoot());
Utils.applyWindowInsetsAndFabOffset(binding.getRoot(), binding.fabSave);
viewModel = new ViewModelProvider(this).get(LoyaltyCardEditActivityViewModel.class);
@@ -681,15 +683,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
View view = getCurrentFocus();
if (view != null && imm.isAcceptingText()) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
view.clearFocus();
}
else {
askBeforeQuitIfChanged();
}
askBeforeQuitIfChanged();
}
});
}
@@ -1523,7 +1517,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
int id = item.getItemId();
if (id == android.R.id.home) {
getOnBackPressedDispatcher().onBackPressed();
askBeforeQuitIfChanged();
return true;
}

View File

@@ -880,6 +880,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} else if (id == R.id.action_star_unstar) {
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, loyaltyCard.starStatus == 0 ? 1 : 0);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
// Re-init loyaltyCard with new data from DB
onResume();
invalidateOptionsMenu();
@@ -890,6 +892,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show();
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
// Re-init loyaltyCard with new data from DB
onResume();
@@ -915,6 +918,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
DBHelper.deleteLoyaltyCard(database, LoyaltyCardViewActivity.this, loyaltyCardId);
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
finish();
dialog.dismiss();

View File

@@ -2,6 +2,8 @@ package protect.card_locker;
import android.app.Activity;
import android.app.SearchManager;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -330,22 +332,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
selectedTab = activeTabPref.getInt(getString(R.string.sharedpreference_active_tab), 0);
// Restore sort preferences from Shared Preferences
// If one of the sorting prefererences has never been set or is set to an invalid value,
// stick to the defaults.
SharedPreferences sortPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_sort),
Context.MODE_PRIVATE);
String orderString = sortPref.getString(getString(R.string.sharedpreference_sort_order), null);
String orderDirectionString = sortPref.getString(getString(R.string.sharedpreference_sort_direction), null);
if (orderString != null && orderDirectionString != null) {
try {
mOrder = DBHelper.LoyaltyCardOrder.valueOf(orderString);
mOrderDirection = DBHelper.LoyaltyCardOrderDirection.valueOf(orderDirectionString);
} catch (IllegalArgumentException ignored) {
}
}
mOrder = Utils.getLoyaltyCardOrder(this);
mOrderDirection = Utils.getLoyaltyCardOrderDirection(this);
mGroup = null;
@@ -442,6 +430,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
if (mCurrentActionMode != null) {
mCurrentActionMode.finish();
}
new ListWidget().updateAll(mAdapter.mContext);
}
private void processParseResultList(List<ParseResult> parseResultList, String group, boolean closeAppOnNoBarcode) {
@@ -709,6 +699,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
showReversed.isChecked() ? DBHelper.LoyaltyCardOrderDirection.Descending : DBHelper.LoyaltyCardOrderDirection.Ascending
);
new ListWidget().updateAll(this);
dialog.dismiss();
});

View File

@@ -48,7 +48,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
super.onCreate(inputSavedInstanceState);
binding = ActivityManageGroupBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Utils.applyWindowInsets(binding.getRoot());
Utils.applyWindowInsetsAndFabOffset(binding.getRoot(), binding.fabSave);
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);

View File

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -50,6 +51,7 @@ import androidx.palette.graphics.Palette;
import com.google.android.material.color.DynamicColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
@@ -1139,6 +1141,27 @@ public class Utils {
return WindowInsetsCompat.CONSUMED;
});
}
public static void applyWindowInsetsAndFabOffset(View root, FloatingActionButton fab) {
/* This function is a copy of applyWindowInsets, with the added behaviour that it ensures the FAB will be displayed vertically above the keyboard at all times */
ViewCompat.setOnApplyWindowInsetsListener(root, (view, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
layoutParams.leftMargin = insets.left;
layoutParams.bottomMargin = insets.bottom;
layoutParams.rightMargin = insets.right;
layoutParams.topMargin = insets.top;
view.setLayoutParams(layoutParams);
// This is required to move the FAB above the keyboard when keyboard is open
Insets imeInsets = windowInsets.getInsets(WindowInsetsCompat.Type.ime());
boolean isKeyboardVisible = windowInsets.isVisible(WindowInsetsCompat.Type.ime());
fab.setTranslationY(isKeyboardVisible ? (- imeInsets.bottom) : 0);
return WindowInsetsCompat.CONSUMED;
});
}
public static ImageView.ScaleType getRecommendedScaleTypeForThumbnailImage(@Nullable Bitmap image) {
// Return something sensible if no image
@@ -1154,4 +1177,40 @@ public class Utils {
return ImageView.ScaleType.FIT_CENTER;
}
public static DBHelper.LoyaltyCardOrder getLoyaltyCardOrder(Context context) {
SharedPreferences sortPref = context.getSharedPreferences(
"sharedpreference_sort",
Context.MODE_PRIVATE
);
String orderString = sortPref.getString("sharedpreference_sort_order", null);
if (orderString != null) {
try {
return DBHelper.LoyaltyCardOrder.valueOf(orderString);
} catch (IllegalArgumentException ignored) {
}
}
return DBHelper.LoyaltyCardOrder.Alpha;
}
public static DBHelper.LoyaltyCardOrderDirection getLoyaltyCardOrderDirection(Context context) {
SharedPreferences sortPref = context.getSharedPreferences(
"sharedpreference_sort",
Context.MODE_PRIVATE
);
String orderDirectionString = sortPref.getString("sharedpreference_sort_direction", null);
if (orderDirectionString != null) {
try {
return DBHelper.LoyaltyCardOrderDirection.valueOf(orderDirectionString);
} catch (IllegalArgumentException ignored) {
}
}
return DBHelper.LoyaltyCardOrderDirection.Ascending;
}
}

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- android:columnWidth must be kept in sync with list_widget_item.xml -->
<GridView
android:id="@+id/grid_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:numColumns="auto_fit"
android:columnWidth="107dp"
android:verticalSpacing="4dp"
android:horizontalSpacing="4dp"
android:gravity="center"/>
</LinearLayout>

View File

@@ -0,0 +1,17 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/widget_layout"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/no_cards_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/card_list_widget_empty"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="12sp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeStepGranularity="2sp" />
</LinearLayout>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
85.6dp : 53.98dp
Both multiplied by 1.25 to fit better
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="107dp"
android:layout_height="67.475dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:gravity="center"
android:id="@+id/item_container"
android:background="@drawable/round_outline"
android:clipToOutline="true">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/item_container_foreground">
<ImageView
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center|center" />
<TextView
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:autoSizeMinTextSize="6sp"
app:autoSizeTextType="uniform"
android:layout_gravity="center|center"
android:gravity="center" />
</FrameLayout>
</FrameLayout>

View File

@@ -16,15 +16,15 @@ Altonss
B o d o
Michael Moroni
Eric
Silvério Santos
Максим Горпиніч
GM
Joel A
Petr Novák
laralem
Priit Jõerüüt
Silvério Santos
Taco
laralem
Petr Novák
Joel A
Edgars Andersons
Taco
nadiafekihahmed
pfaffenrodt
Aayush Gupta
@@ -32,48 +32,49 @@ Scrambled777
ikanakova
Giovanni Donisi
HudobniVolk
Nyatsuki
Jiri Grönroos
Nyatsuki
josé m
Samantaz Fox
Balázs Meskó
Milo Ivir
josé m
Arno-github
Ankit Tiwari
Fjuro
Cliff Heraldo
Sergio Paredes
Jose Delvani
mdvhimself
Milan Šalka
தமிழ் நேரம்
huuhaa
Skrripy
Ankit Tiwari
Arno-github
Kachelkaiser
Fjuro
Projjal Moitra
Quentin PAGÈS
Jose Delvani
Warder
GitSpoon
Milan Šalka
mdvhimself
Skrripy
Vasilis
ngocanhtve
huuhaa
தமிழ் நேரம்
waffshappen
Marnick L'Eau
ngocanhtve
StellarSand
Quentin PAGÈS
Projjal Moitra
Robin
JungHee Lee
hajertabbane
Ziad OUALHADJ
Warder
GitSpoon
Robin Liu
Ricky Tigg
Renko
Denis Shilin
しいたけ
Alexander Ivanov
Viet Nguyen Hoang
Miha Frangež
Viet Nguyen Hoang
stavpup
ehrt74
Virginie
Tim Trek
Ricky Tigg
Peter Dave Hello
Michael Gangolf
rudy3
@@ -81,6 +82,6 @@ Kim Seohyun
Govind S Nair
Freddo espresso
Augustin LAVILLE
Aliaksandr Trush
arshbeerSingh
MisterCosta96
Aliaksandr Trush

View File

@@ -308,4 +308,6 @@
<string name="sort_by_valid_from">Начало валидност</string>
<string name="width">Ширина</string>
<string name="setBarcodeWidth">Задаване ширина на щрих кода</string>
<string name="card_list_widget_name">Списък с карти</string>
<string name="card_list_widget_empty">Когато добавите карти в Catima те ще се покажат тук. Ако имате карти уверете се, че са извън архива.</string>
</resources>

View File

@@ -314,4 +314,6 @@
<string name="sort_by_valid_from">Platnost od</string>
<string name="setBarcodeWidth">Nastavit šířku čárového kódu</string>
<string name="width">Šířka</string>
<string name="card_list_widget_name">Seznam karet</string>
<string name="card_list_widget_empty">Karty přidané do aplikace Catima se zobrazí zde. Pokud máte karty, ujistěte se, že nejsou všechny archivovány.</string>
</resources>

View File

@@ -304,4 +304,6 @@
<string name="sort_by_valid_from">Gültig ab</string>
<string name="width">Breite</string>
<string name="setBarcodeWidth">Barcodebreite einstellen</string>
<string name="card_list_widget_empty">Nachdem du einige Treuekarten in Catima hinzugefügt hast, werden sie hier angezeigt. Wenn du Karten hast, stelle sicher, dass sie nicht alle archiviert sind.</string>
<string name="card_list_widget_name">Kartenliste</string>
</resources>

View File

@@ -307,4 +307,6 @@
<string name="sort_by_valid_from">Έναρξη ισχύος</string>
<string name="setBarcodeWidth">Ορισμός πλάτους γραμμωτού κώδικα</string>
<string name="width">Πλάτος</string>
<string name="card_list_widget_empty">Αφού προσθέσετε μερικές κάρτες επιβράβευσης στο Catima, θα εμφανιστούν εδώ. Εάν έχετε κάρτες, βεβαιωθείτε ότι δεν είναι όλες αρχειοθετημένες.</string>
<string name="card_list_widget_name">Λίστα καρτών</string>
</resources>

View File

@@ -303,4 +303,6 @@
<string name="sort_by_valid_from">Kehtib alates</string>
<string name="setBarcodeWidth">Määratle triipkoodi laius</string>
<string name="width">Laius</string>
<string name="card_list_widget_name">Kaartide loend</string>
<string name="card_list_widget_empty">Kui lisad Catimasse kliendikaarte, siis saavad nad olema nähtavad siin. Kui sul on kaardid lisatud, siis palun kontrolli, et nad kõik poleks arhiveeritud.</string>
</resources>

View File

@@ -308,4 +308,6 @@
<string name="sort_by_valid_from">Voimassa alkaen</string>
<string name="width">Leveys</string>
<string name="setBarcodeWidth">Aseta viivakoodin leveys</string>
<string name="card_list_widget_name">Korttiluettelo</string>
<string name="card_list_widget_empty">Kun olet lisännyt kanta-asiakaskortteja Catimaan, ne näkyvät täällä. Jos sinulla on kortteja, varmista, etteivät ne kaikki ole arkistoituja.</string>
</resources>

View File

@@ -314,4 +314,6 @@
<string name="sort_by_valid_from">Valide à partir du</string>
<string name="width">Largeur</string>
<string name="setBarcodeWidth">Définir la largeur du code-barres</string>
<string name="card_list_widget_name">Liste des cartes</string>
<string name="card_list_widget_empty">Après avoir ajouter des cartes de fidélité dans Catima, elles apparaîtront ici. Si vous avez des cartes, assurez-vous qu\'elles ne soient pas archivées.</string>
</resources>

View File

@@ -302,4 +302,6 @@
<string name="sort_by_valid_from">Válido desde</string>
<string name="width">Anchura</string>
<string name="setBarcodeWidth">Establecer anchura do código de barras</string>
<string name="card_list_widget_name">Lista de tarxetas</string>
<string name="card_list_widget_empty">Aquí aparecerán as tarxetas fidelidade cando as engadas a Catima. Se tes tarxetas mira que non estean arquivadas.</string>
</resources>

View File

@@ -314,4 +314,6 @@
<string name="sort_by_valid_from">Valido da</string>
<string name="setBarcodeWidth">Imposta la larghezza del codice a barre</string>
<string name="width">Larghezza</string>
<string name="card_list_widget_name">Lista delle carte</string>
<string name="card_list_widget_empty">Dopo aver aggiunto alcune carte fedeltà in Catima, queste appariranno qui. Se hai delle carte, assicurati che non siano tutte archiviate.</string>
</resources>

View File

@@ -309,4 +309,6 @@
<string name="sort_by_valid_from">Derīga no</string>
<string name="setBarcodeWidth">Iestatīt svītrkoda platumu</string>
<string name="width">Platums</string>
<string name="card_list_widget_name">Karšu saraksts</string>
<string name="card_list_widget_empty">Pēc klienta karšu pievienošanas Catima tās parādīsies šeit. Ja Tev ir kartes, jāpārliecinās, ka tās visas nav arhivētas.</string>
</resources>

View File

@@ -308,4 +308,6 @@
<string name="sort_by_valid_from">Op geldig vanaf</string>
<string name="width">Breedte</string>
<string name="setBarcodeWidth">Stel Barcodebreedte in</string>
<string name="card_list_widget_name">Kaartenlijst</string>
<string name="card_list_widget_empty">Zodra er kaarten in Catima toegevoegd zijn worden deze hier getoond. Heb je al kaarten? Controleer dan of deze niet gearchiveerd zijn.</string>
</resources>

View File

@@ -314,4 +314,6 @@
<string name="sort_by_valid_from">Válido a partir de</string>
<string name="width">Largura</string>
<string name="setBarcodeWidth">Definir largura do código de barras</string>
<string name="card_list_widget_name">Lista de cartões</string>
<string name="card_list_widget_empty">Depois que você adicionar alguns cartões de fidelidade no Catima, eles aparecerão aqui. Se você tiver cartões, verifique se eles não estão todos arquivados.</string>
</resources>

View File

@@ -314,4 +314,6 @@
<string name="sort_by_valid_from">Válido a partir de</string>
<string name="width">Largura</string>
<string name="setBarcodeWidth">Definir a largura do código de barras</string>
<string name="card_list_widget_name">Lista de cartões</string>
<string name="card_list_widget_empty">Após adicionar cartões de fidelidade em Catima, eles aparecerão aqui. Se tem cartões, certifique-se de que não estão todos arquivados.</string>
</resources>

View File

@@ -308,4 +308,6 @@
<string name="generic_error_please_retry">Lamento, ocorreu um erro, tente novamente...</string>
<string name="setBarcodeWidth">Definir Largura do Código de Barra</string>
<string name="width">Largura</string>
<string name="card_list_widget_name">Lista de cartões</string>
<string name="card_list_widget_empty">Após adicionar cartões de fidelidade em Catima, eles aparecerão aqui. Se tem cartões, certifique-se de que não estão todos arquivados.</string>
</resources>

View File

@@ -320,4 +320,6 @@
<string name="sort_by_valid_from">Начало действия</string>
<string name="width">Ширина</string>
<string name="setBarcodeWidth">Указать ширину штрих-кода</string>
<string name="card_list_widget_name">Список карт</string>
<string name="card_list_widget_empty">После добавления карт лояльности в Catima, они появятся здесь. Если у вас есть карты, убедитесь, что они не архивированы.</string>
</resources>

View File

@@ -314,4 +314,6 @@
<string name="addFromPkpass">Vyberte súbor Passbook (.pkpass)</string>
<string name="settings_use_volume_keys_navigation">Zmena kariet pomocou tlačidiel hlasitosti</string>
<string name="settings_use_volume_keys_navigation_summary">Pre posúvanie medzi kartami používať tlačidlá hlasitosti</string>
<string name="card_list_widget_name">Zoznam kariet</string>
<string name="card_list_widget_empty">Po pridaní vernostných kariet do Catima sa zobrazia tu. Ak máte karty, uistite sa, že nie sú všetky archivované.</string>
</resources>

View File

@@ -308,4 +308,6 @@
<string name="sort_by_valid_from">İtibaren Geçerli</string>
<string name="width">Genişlik</string>
<string name="setBarcodeWidth">Barkod Genişliğini Ayarla</string>
<string name="card_list_widget_name">Kart listesi</string>
<string name="card_list_widget_empty">Catima\'ya sadakat kartları eklediğinizde, burada gözükecekler. Eğer kartlarınız varsa, arşivlemediğinizden emin olun.</string>
</resources>

View File

@@ -319,4 +319,6 @@
<string name="sort_by_valid_from">Діє з</string>
<string name="width">Ширина</string>
<string name="setBarcodeWidth">Встановити ширину штрих-коду</string>
<string name="card_list_widget_name">Список карток</string>
<string name="card_list_widget_empty">Після того, як ви додасте кілька карток лояльності в Catima, вони з’являться тут. Якщо у вас є картки, переконайтеся, що вони не всі заархівовані.</string>
</resources>

View File

@@ -296,4 +296,10 @@
<string name="settings_column_count_5">5</string>
<string name="settings_column_count_6">6</string>
<string name="settings_column_count_7">7</string>
<string name="sort_by_valid_from">Có hiệu lực từ</string>
<string name="addFromPkpass">Chọn tệp Passbook (.pkpass)</string>
<string name="unsupportedFile">Tập tin này không được hỗ trợ</string>
<string name="generic_error_please_retry">Xin lỗi, có gì đó không ổn, vui lòng thử lại...</string>
<string name="width">Chiều rộng</string>
<string name="setBarcodeWidth">Đặt chiều rộng mã vạch</string>
</resources>

View File

@@ -302,4 +302,6 @@
<string name="sort_by_valid_from">有效期开始日</string>
<string name="width">宽度</string>
<string name="setBarcodeWidth">设置条码宽度</string>
<string name="card_list_widget_name">卡片列表</string>
<string name="card_list_widget_empty">在 Catima 中添加了一些会员卡后,它们会出现在这里。如果你有卡片,确保不是所有都已归档。</string>
</resources>

View File

@@ -362,5 +362,7 @@
<string name="unsupportedFile">This file is not supported</string>
<string name="generic_error_please_retry">Sorry, something went wrong, please try again...</string>
<string name="width">Width</string>
<string name="card_list_widget_name">Card list</string>
<string name="setBarcodeWidth">Set Barcode Width</string>
<string name="card_list_widget_empty">After you add some loyalty cards in Catima, they will appear here. If you have cards, make sure they are not all archived.</string>
</resources>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialKeyguardLayout="@layout/list_widget"
android:initialLayout="@layout/list_widget"
android:minWidth="245dp"
android:minHeight="54dp"
android:previewImage="@drawable/widget_preview"
android:resizeMode="horizontal|vertical"
android:targetCellWidth="4"
android:targetCellHeight="2"
android:updatePeriodMillis="86400000"
android:widgetCategory="home_screen" />

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.11.1" apply false
id("com.android.application") version "8.12.0" apply false
id("org.jetbrains.kotlin.android") version "2.2.0" apply false
}

View File

@@ -0,0 +1,2 @@
- Přidán widget zobrazující všechny nearchivované karty
- Zabránění překrytí tlačítka uložení klávesnicí na stránkách úpravy a skupin

View File

@@ -0,0 +1,2 @@
- Widget, das alle nichtarchvierten Karten anzeigt, hinzugefügt
- Beugt dem Verdecken der „Speichern“-Taste durch die Tastatur in der Bearbeitungs- bzw. Gruppenansicht vor

View File

@@ -1 +1,2 @@
- Made it harder to accidentally close edit view
- Add a widget showing all non-archived cards
- Prevent the keyboard from overlapping the save button in edit and group screens

View File

@@ -0,0 +1 @@
- Sõltuvuste ja tõlgete uuendused

View File

@@ -0,0 +1,2 @@
- Vidin, mis näitab kõiki mittearhiveeritud kaarte
- Klahvistik enam ei varja muutmis- ja grupivaadetes salvestusnuppu

View File

@@ -0,0 +1,2 @@
- Ajout d'un widget affichant toutes les cartes non archivées
- Empêche le clavier de passer au-dessus du bouton de sauvegarde dans les écrans de modifications et de regroupements

View File

@@ -0,0 +1 @@
- Neleisti klaviatūrai uždengti išsaugojimo mygtuko, redagavimo ir grupių ekranuose

View File

@@ -0,0 +1,5 @@
- Pridėta galimybė pridėti sparčiuosius klavišus į pagrindinį ekraną kuriant arba redaguojant kortelę. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
- Valdiklis pašalintas, nes buvo prastas sparčiųjų klavišų pakaitalas. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
- Ištaisyta atsarginių kopijų eksportavimo klaida (Android 7+). pull #153 (https://github.com/brarcher/loyalty-card-locker/pull/153))
- Eksportuojant atsargines kopijas pateikiamas tikslesnis MIME tipas. (pull #156 (https://github.com/brarcher/loyalty-card-locker/pull/156))
- Pataisyta klaida, dėl kurios nebuvo galima redaguoti kortelės. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))

View File

@@ -0,0 +1,2 @@
- Pridėta galimybė pridėti kortelių sparčiąsias nuorodas tiesiai iš paleidiklio arba pagrindinio ekrano. (pull #161 (https://github.com/brarcher/loyalty-card-locker/pull/161))
- Pašalinta lojalumo kortelių sparčiųjų nuorodų kūrimo galimybė tiesiogiai programoje. Dėl to nebereikia leidimo sparčiųjų nuorodų kūrimui. (pull #163 (https://github.com/brarcher/loyalty-card-locker/pull/163))

View File

@@ -0,0 +1,2 @@
- Ištaisyta klaida „Android SDK 24+“ versijose, dėl kurios naudojant failų pasirinkimo importavimo funkciją programėlė sugestų. (pull #170 (https://github.com/brarcher/loyalty-card-locker/pull/170))
- Naujas piktograma ir spalvų schema. (pull #171 (https://github.com/brarcher/loyalty-card-locker/pull/171))

View File

@@ -0,0 +1,3 @@
- Pataisytas gedimas importuojant kai kuriuos sugadintus CSV failus. (pull #177 (https://github.com/brarcher/loyalty-card-locker/pull/177))
- Pataisytas atsarginių kopijų importavimas iš failų sistemos. (pull #180 (https://github.com/brarcher/loyalty-card-locker/pull/180))
- Pataisyta problema importuojant atsargines kopijas iš kai kurių turinio tiekėjų. (pull #179 (https://github.com/brarcher/loyalty-card-locker/pull/179))

View File

@@ -0,0 +1,3 @@
- Italų kalbos vertimai.
- Palaikymas visiems 1D brūkšninių kodų tipams. (anksčiau palaikomi tik produktų 1D brūkšniniai kodai)
- Pridėtas būtinas kameros leidimas, kuris iš pradžių trūko.

View File

@@ -0,0 +1,2 @@
- Pievienots logrīks, kurā ir parādītas visas nearhivētās kartes
- Labošanas un kopu skatos novērsta saglabāšanas pogas aizklāšana ar tastatūru

View File

@@ -1,5 +1,5 @@
- Bij het bewerken van een kaart-ID wordt de bestaande ID vooraf ingevuld. (Pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
- Beperk de breedte van barcodes om geheugenfouten te verminderen. (Pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
- Bij het bewerken van een kaart verandert "Kaart invoeren" in "Kaart bewerken" als er al een ID is. (Pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
- Zachter kleurenschema en schonere lay-out bij kaartweergave. (Pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
- Introductiewizard toegevoegd bij eerste app-start. (Pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
- Bij het bewerken van een kaart-ID wordt de bestaande ID vooraf ingevuld.
- Beperk de breedte van barcodes om geheugenfouten te verminderen.
- Bij het bewerken van een kaart verandert "Kaart invoeren" in "Kaart bewerken" als er al een ID is.
- Zachter kleurenschema en schonere lay-out bij kaartweergave.
- Introductiewizard toegevoegd bij eerste app-start.

View File

@@ -0,0 +1 @@
- Material You kleurenschema nu beschikbaar op meer apparaten

View File

@@ -1,4 +1,4 @@
- Kleine UI-fixes
- Herstel van datums bij roteren van het kaartbewerkingsscherm
- Voorkom dat datums gereset worden bij roteren van het kaartbewerkingsscherm
- Oplossen van crashes bij roteren met kleurkiezer zichtbaar
- Stocard-importfouten opgelost

View File

@@ -1,3 +1,4 @@
- Lange winkelnaam in de preview over meerdere regels splitsen
- Optie om voor- of achterkant afbeelding te gebruiken in thumbnail-menu
- Kleine import/export-fixes
- Kleine UI fixes

View File

@@ -0,0 +1 @@
- Terugswipen sluit niet meer het toetsenbord en zoekveld af op Android 13 en nieuwer

View File

@@ -0,0 +1,3 @@
- Optie om tussen kaarten te wisselen met de volumeknoppen toegevoegd
- Fix voor importeren van Stocard export
- Fix: De tekst "Importeren geannuleerd" verschijnt niet meer na succesvolle import

View File

@@ -0,0 +1 @@
- Zorg dat tekst correct past in het "Kaart toevoegen" dialoogvenster

View File

@@ -1,2 +1,4 @@
- toon standaard 4 kolommen op brede schermen
- laat toe het aantal kolommen in portret- en landschapmodus te veranderen in de instellingen
- Toon standaard 4 kolommen op brede schermen
- Laat toe het aantal kolommen in portret- en landschapmodus te veranderen in de instellingen
- Zoektekst verdwijnt niet langer bij het roteren van het hoofdscherm of openen van een kaart
- Limitier de maximale lengte van een notitie op het hoofdscherm

View File

@@ -0,0 +1,3 @@
- Ondersteuning voor Passbook (.pkpass bestanden) toegevoegd
- Fix voor issues met importeren van PDF bestanden met een transparante achtergrond
- Verbeter de display van kaarten met een transparante achtergrond

View File

@@ -0,0 +1 @@
- Fix crash bij het openen van een invalide pkpass bestand

View File

@@ -0,0 +1 @@
- Verbeter display van het archief/favoriet icoontje

View File

@@ -0,0 +1,3 @@
- Implementeer alle eisen voor Android 15 support
- Voorkom dat toetsenbord over de opsla knop in het bewerkscherm komt
- Verbeterde herkenning van pkpass bestanden (ondersteuning voor application/vnd-com.apple.pkpass mime type)

View File

@@ -0,0 +1,2 @@
- Kaarten kunnen nu ook op startdatum gesorteerd worden
- Schakel doelversie tijdelijk terug naar Android 14 om enkele gebruikersinterfaceissues op te lossen

View File

@@ -0,0 +1,3 @@
- Zet doelversie naar Android 15
- Fix crash bij het lezen van een niet ondersteund pkpass bestand
- Verbeter pkpass ondersteuning

View File

@@ -0,0 +1,4 @@
- De breedte van een barcode kan nu beheerd worden in volledig scherm modus
- Verwijder verwarrende opties in het import menu
- Verschillende fixes voor het scannen van kaarten
- Fix een crash bij het laden van een pkpass bestand zonder barcode

View File

@@ -0,0 +1 @@
- Updates van afhankelijkheden en vertalingen

View File

@@ -0,0 +1,2 @@
- Voeg een widget toe welke all niet-gearchiveerde kaarten toont
- Voorkom dat het toetsenbord de opslaknop verbergd in het bewerk en groep scherm

View File

@@ -0,0 +1,2 @@
- Adicionar um widget que mostra todos os cartões não arquivados
- Impedir que o teclado sobreponha o botão gravar em ecrãs de edição e grupo

View File

@@ -0,0 +1,2 @@
- Adicionar um widget que mostra todos os cartões não arquivados
- Impedir que o teclado sobreponha o botão gravar em ecrãs de edição e grupo

View File

@@ -0,0 +1,2 @@
- Добавлен виджет, показывающий все неархивные карты
- Исправлена ошибка перекрытия клавиатурой кнопки сохранения на экранах редактирования и групп

View File

@@ -2,4 +2,4 @@
- Obmedzte šírku čiarových kódov, aby ste znížili využitie pamäte a chyby spôsobené nedostatkom pamäte. (ťah #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
- Pri úprave karty zmeňte tlačidlo „Zadať kartu“ na „Upraviť kartu“, ak už ID karty existuje. (ťah #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
- Zmeňte farebnú schému na jemnejšiu a kompatibilnú s ikonou aplikácie a zmeňte rozloženie pri zobrazení karty, aby bolo prehľadnejšie. (ťah #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
- Pridať úvodného sprievodcu, ktorý sa spustí pri prvom spustení. (ťah #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
- Pridať sprievodcu, ktorý sa spustí pri prvom spustení aplikácie. (ťah #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))

View File

@@ -0,0 +1,2 @@
- Pridať widget zobrazujúci všetky nearchivované karty
- Zabrániť prekrývaniu tlačidla uloženia na obrazovkách úprav a zoskupenia z klávesnice

View File

@@ -1,11 +1,11 @@
- AKTUÁLNA ZMENA: Zmenený formát zálohy, https://github.com/TheLastProject/Catima/wiki/Export-format
- AKTUÁLNA ZMENA: Zmenený formát zdieľania URL, https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format
- Umožnite zapnut alebo vypnut baterku pri skenovani
- AKTUÁLNA ZMENA: Zmenil sa formát zálohy, - https://github.com/TheLastProject/Catima/wiki/Export-format
- AKTUÁLNA ZMENA: Zmenil sa formát zdieľania URL, - https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format
- Umožniť zapnutie alebo vypnutie baterky počas skenovania
- Pridaná podpora UPC-E
- Podpora pridania prednej a zadnej fotografie na každú kartu
- Podpora pridania fotografie prednej a zadnej strany u každej karty
- Podpora importu súborov zip chránených heslom
- Podpora importu zo Stocard (Beta)
- Oprava zbytočných medzier v poznámkach z importu Fidme
- Podpora importu Stocard (Beta)
- Oprava medzier v poznámkach z importu Fidme
- Podpora nového formátu exportu Voucher Vault
- Oprava plávajúcich akčných tlačidiel za inými prvkami UI v systéme Android 4
- Oprava horného okraja panela vernostných kariet
- Oprava plávajúcich akčných tlačidiel v Android 4
- Oprava horného okraja panela aplikácií prehliadača vernostných kariet

View File

@@ -1,22 +1,22 @@
Zastavte hľadanie plastových vernostných kariet počas pokladne v obchode alebo internetovom obchode.
Zastavte hľadanie vernostných kariet pri pokladni v obchode alebo internetovom obchode.
<b>Naskenujte čiarové kódy do zariadenia pomocou fotoaparátu, zabudnite na karty.</b>
Zabudnite na peňaženku alebo si ju uschovajte ako ultraľahkú na cennosti.
Zabudnite na peňaženku alebo si ju uschovajte.
S týmto základným nástrojom na každodenné nosenie (EDC) môžete nahradiť nepotrebné plastové karty hotovosťou.
- Vyhnite sa špehovaniu s veľmi malým počtom povolení. Bez prístupu na internet a bez reklám.
- Pridajte karty alebo kódy s menami a prispôsobiteľnými farbami.
- Manuálne zadanie kódu, ak nie je k dispozícii čiarový kód na uloženie alebo sa nedá použiť.
- Importujte karty a kódy zo súborov, Catima, FidMe, kľúčenky k vernostným kartám, Stocard a trezoru poukážok.
- Vyhnite sa špehovaniu s veľmi malým počtom povolení. Bez internetu a bez reklám.
- Pridajte karty alebo kódy s menami a farbami.
- Manuálne zadanie kódu, ak nie je k dispozícii čiarový kód.
- Importujte karty a kódy zo súborov, Catima, FidMe, kľúčenky k vernostným kartám, Stocard.
- Vytvorte si zálohu všetkých svojich kariet a v prípade potreby ich preneste do nového zariadenia.
- Zdieľajte kupóny, exkluzívne ponuky, promo kódy alebo karty a kódy pomocou ľubovoľnej aplikácie.
- Zdieľajte kupóny, exkluzívne ponuky, promo kódy alebo karty pomocou ľubovoľnej aplikácie.
- Tmavá téma a možnosti prístupnosti pre zrakovo postihnutých používateľov.
- Vytvorené pre všetkých komunitou softvéru libre.
- Lokalizované ručne vytvorené preklady pre viac ako 40 jazykov.
- Bezplatné, podporované príspevkami komunity.
- Používajte, študujte, upravujte a zdieľajte podľa vlastného uváženia; *so všetkým*.
- Ručne vytvorené preklady pre viac ako 40 jazykov.
- Bezplatné, podporované komunitou.
- Používajte, upravujte a zdieľajte podľa vlastného uváženia; *so všetkým*.
- Nielen slobodný softvér / otvorený zdrojový kód. *správa kariet s *copyleftom* (GPLv3+).
Zjednodušte si život a nakupovanie a už nikdy nestratíte papierový doklad, darčekovú kartu platobnú v obchode ani letenku.
Vezmite si všetky svoje odmeny a bonusy so sebou a ušetrite na cestách.
Zjednodušte si život a nakupovanie a už nikdy nestratíte žiadny doklad.
Vezmite si všetky svoje odmeny so sebou a ušetrite na cestách.

View File

@@ -0,0 +1,2 @@
- Додано віджет, який показує всі неархівовані картки
- Запобігання перекриттю кнопки збереження клавіатурою на екранах редагування та групування

View File

@@ -0,0 +1,2 @@
- 添加显示所有非已归档卡片的小部件
- 防止编辑与分组屏幕中键盘和保存按钮相重叠