Compare commits

..

1 Commits

Author SHA1 Message Date
TheLastProject
f62323431a Update feature graphic 2024-12-14 13:09:50 +00:00
101 changed files with 245 additions and 577 deletions

View File

@@ -30,45 +30,39 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
flavor: [Foss, Gplay]
api-level: [ 21, 34 ]
steps:
- uses: actions/checkout@v4.2.2
- name: Fail on bad translations
run: if grep -ri "<xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
- uses: gradle/actions/wrapper-validation@v4
- name: set up OpenJDK 17
run: |
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk-headless
sudo update-alternatives --auto java
- name: Build
run: ./gradlew assemble${{ matrix.flavor }}Release
- name: Check lint
run: ./gradlew lint${{ matrix.flavor }}Release
- name: Run unit tests
run: timeout 5m ./gradlew test${{ matrix.flavor }}ReleaseUnitTest || { ./gradlew --stop && timeout 5m ./gradlew test${{ matrix.flavor }}ReleaseUnitTest; }
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run instrumented tests (API 21)
uses: ReactiveCircus/android-emulator-runner@v2
with:
api-level: 21
arch: x86_64
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
- name: Run instrumented tests (API 34)
uses: ReactiveCircus/android-emulator-runner@v2
with:
api-level: 34
arch: x86_64
script: ./gradlew connected${{ matrix.flavor }}DebugAndroidTest
- name: SpotBugs
run: ./gradlew spotbugs${{ matrix.flavor }}Release
- name: Archive test results
if: always()
uses: actions/upload-artifact@v4.6.0
with:
name: test-results-flavor${{ matrix.flavor }}
path: app/build/reports
- uses: actions/checkout@v4.2.2
- name: Fail on bad translations
run: if grep -ri "<xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
- uses: gradle/actions/wrapper-validation@v4
- name: set up OpenJDK 17
run: |
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk-headless
sudo update-alternatives --auto java
- name: Build
run: ./gradlew assembleRelease
- name: Check lint
run: ./gradlew lintRelease
- name: Run unit tests
run: timeout 5m ./gradlew testReleaseUnitTest || { ./gradlew --stop && timeout 5m ./gradlew testReleaseUnitTest; }
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run instrumented tests
uses: ReactiveCircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-level }}
arch: x86_64
script: ./gradlew connectedCheck
- name: SpotBugs
run: ./gradlew spotbugsRelease
- name: Archive test results
if: always()
uses: actions/upload-artifact@v4.4.3
with:
name: test-results-api${{ matrix.api-level }}
path: app/build/reports

View File

@@ -35,7 +35,7 @@ jobs:
- name: Run converter script
run: python .scripts/changelog_to_fastlane.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7.0.6
uses: peter-evans/create-pull-request@v7.0.5
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@v7.0.6
uses: peter-evans/create-pull-request@v7.0.5
with:
title: "Update contributors"
commit-message: "Update contributors"

View File

@@ -39,7 +39,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@v7.0.6
uses: peter-evans/create-pull-request@v7.0.5
with:
title: "Update feature graphic"
commit-message: "Update feature graphic"

View File

@@ -26,7 +26,7 @@ jobs:
id: gradle-update
- uses: gradle/actions/wrapper-validation@v4
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7.0.6
uses: peter-evans/create-pull-request@v7.0.5
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@v7.0.6
uses: peter-evans/create-pull-request@v7.0.5
with:
title: "Update locales"
commit-message: "Update locales"

3
.gitignore vendored
View File

@@ -25,6 +25,3 @@
/.bundle/
/vendor/bundle
/lib/bundler/man/
# Catima-specific
SHA256SUMS

View File

@@ -1,20 +1,5 @@
# Changelog
## v2.34.4 - 146 (2025-01-17)
- Ability to sort cards by start of validity
- Temporarily revert to targeting Android 14 to fix some UI issues
## v2.34.3 - 145 (2025-01-15)
- Target Android 15
- Fix keyboard covering save button in edit screen
- Fix some pkpass files not being detected as pkpass (application/vnd-com.apple.pkpass mime type support)
## v2.34.2 - 144 (2024-12-26)
- Improve archive/starred icon display
## v2.34.1 - 143 (2024-12-12)
- Fix crash when opening invalid pkpass files

View File

@@ -1,128 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
catima.g9ex3@hackerchick.me.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@@ -16,14 +16,14 @@ spotbugs {
android {
namespace = "protect.card_locker"
compileSdk = 35
compileSdk = 34
defaultConfig {
applicationId = "me.hackerchick.catima"
minSdk = 21
targetSdk = 34
versionCode = 146
versionName = "2.34.4"
versionCode = 143
versionName = "2.34.1"
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true
@@ -31,9 +31,6 @@ android {
resourceConfigurations += listOf("ar", "bg", "bn", "bn-rIN", "bs", "cs", "da", "de", "el-rGR", "en", "eo", "es", "es-rAR", "et", "fi", "fr", "gl", "he-rIL", "hi", "hr", "hu", "in-rID", "is", "it", "ja", "ko", "lt", "lv", "nb-rNO", "nl", "oc", "pl", "pt-rBR", "pt-rPT", "ro-rRO", "ru", "sk", "sl", "sr", "sv", "ta", "tr", "uk", "vi", "zh-rCN", "zh-rTW")
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("boolean", "showDonate", "true")
buildConfigField("boolean", "showRateOnGooglePlay", "false")
}
buildTypes {
@@ -54,21 +51,6 @@ android {
viewBinding = true
}
flavorDimensions.add("type")
productFlavors {
create("foss") {
dimension = "type"
isDefault = true
}
create("gplay") {
dimension = "type"
// Google doesn't allow donation links
buildConfigField("boolean", "showDonate", "false")
buildConfigField("boolean", "showRateOnGooglePlay", "true")
}
}
bundle {
language {
enableSplit = false
@@ -112,13 +94,13 @@ dependencies {
// AndroidX
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("androidx.constraintlayout:constraintlayout:2.2.0")
implementation("androidx.core:core-ktx:1.15.0")
implementation("androidx.core:core-ktx:1.13.1")
implementation("androidx.core:core-splashscreen:1.0.1")
implementation("androidx.exifinterface:exifinterface:1.3.7")
implementation("androidx.palette:palette:1.0.0")
implementation("androidx.preference:preference:1.2.1")
implementation("com.google.android.material:material:1.12.0")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.3")
// Third-party
implementation("com.journeyapps:zxing-android-embedded:4.3.0@aar")

View File

@@ -49,8 +49,6 @@
<data android:mimeType="image/*" />
<data android:mimeType="application/pdf" />
<data android:mimeType="application/vnd.apple.pkpass" />
<data android:mimeType="application/vnd-com.apple.pkpass" />
<data android:mimeType="application/vnd.espass-espass" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
@@ -60,8 +58,6 @@
<data android:mimeType="image/*" />
<data android:mimeType="application/pdf" />
<data android:mimeType="application/vnd.apple.pkpass" />
<data android:mimeType="application/vnd-com.apple.pkpass" />
<data android:mimeType="application/vnd.espass-espass" />
</intent-filter>
</activity>
<activity
@@ -79,12 +75,13 @@
<activity
android:name=".LoyaltyCardViewActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar" />
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".LoyaltyCardEditActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize">
android:windowSoftInputMode="stateHidden">
<intent-filter
android:autoVerify="true"
android:label="@string/app_name">
@@ -122,7 +119,8 @@
<activity
android:name=".BarcodeSelectorActivity"
android:label="@string/selectBarcodeTitle"
android:theme="@style/AppTheme.NoActionBar" />
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".preferences.SettingsActivity"
android:label="@string/settings"

View File

@@ -45,10 +45,11 @@ public class AboutActivity extends CatimaAppCompatActivity {
binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima");
binding.donate.setTag("https://catima.app/donate");
boolean installedFromGooglePlay = Utils.installedFromGooglePlay(this);
// Hide Google Play rate button if not on Google Play
binding.rate.setVisibility(BuildConfig.showRateOnGooglePlay ? View.VISIBLE : View.GONE);
binding.rate.setVisibility(installedFromGooglePlay ? View.VISIBLE : View.GONE);
// Hide donate button on Google Play (Google Play doesn't allow donation links)
binding.donate.setVisibility(BuildConfig.showDonate ? View.VISIBLE : View.GONE);
binding.donate.setVisibility(installedFromGooglePlay ? View.GONE : View.VISIBLE);
bindClickListeners();
}

View File

@@ -70,7 +70,6 @@ public class DBHelper extends SQLiteOpenHelper {
public enum LoyaltyCardOrder {
Alpha,
LastUsed,
ValidFrom,
Expiry
}
@@ -917,10 +916,6 @@ public class DBHelper extends SQLiteOpenHelper {
return LoyaltyCardDbIds.LAST_USED;
}
if (order == LoyaltyCardOrder.ValidFrom) {
return LoyaltyCardDbIds.VALID_FROM;
}
if (order == LoyaltyCardOrder.Expiry) {
return LoyaltyCardDbIds.EXPIRY;
}

View File

@@ -124,9 +124,9 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
}
inputHolder.mCardIcon.setContentDescription(loyaltyCard.store);
Utils.setIconOrTextWithBackground(mContext, loyaltyCard, icon, inputHolder.mCardIcon, inputHolder.mCardText, new Settings(mContext).getPreferredColumnCount());
inputHolder.mIconBackgroundColor = Utils.setIconOrTextWithBackground(mContext, loyaltyCard, icon, inputHolder.mCardIcon, inputHolder.mCardText, new Settings(mContext).getPreferredColumnCount());
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0);
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
inputHolder.itemView.setActivated(mSelectedItems.get(inputCursor.getPosition(), false));
applyIconAnimation(inputHolder, inputCursor.getPosition());
@@ -212,11 +212,13 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mCardText, mStoreField, mNoteField, mBalanceField, mValidFromField, mExpiryField;
public ImageView mCardIcon, mTickIcon;
public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground;
public MaterialCardView mRow;
public ConstraintLayout mStar, mArchived;
public View mDivider;
private int mIconBackgroundColor;
protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) {
super(loyaltyCardLayoutBinding.getRoot());
View inputView = loyaltyCardLayoutBinding.getRoot();
@@ -230,7 +232,10 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mCardIcon = loyaltyCardLayoutBinding.thumbnail;
mCardText = loyaltyCardLayoutBinding.thumbnailText;
mStar = loyaltyCardLayoutBinding.star;
mStarBackground = loyaltyCardLayoutBinding.starBackground;
mStarBorder = loyaltyCardLayoutBinding.starBorder;
mArchived = loyaltyCardLayoutBinding.archivedIcon;
mArchivedBackground = loyaltyCardLayoutBinding.archiveBackground;
mTickIcon = loyaltyCardLayoutBinding.selectedThumbnail;
inputView.setOnLongClickListener(view -> {
inputListener.onRowClicked(getAdapterPosition());
@@ -292,7 +297,31 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mNoteField.requestLayout();
}
public void toggleCardStateIcon(boolean enableStar, boolean enableArchive) {
public void toggleCardStateIcon(boolean enableStar, boolean enableArchive, boolean colorByTheme) {
/* the below code does not work in android 5! hence the change of drawable instead
boolean needDarkForeground = Utils.needsDarkForeground(mIconBackgroundColor);
Drawable borderDrawable = mStarBorder.getDrawable().mutate();
Drawable backgroundDrawable = mStarBackground.getDrawable().mutate();
DrawableCompat.setTint(borderDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
DrawableCompat.setTint(backgroundDrawable, needsDarkForeground ? Color.BLACK : Color.WHITE);
mStarBorder.setImageDrawable(borderDrawable);
mStarBackground.setImageDrawable(backgroundDrawable);
*/
boolean dark = Utils.needsDarkForeground(mIconBackgroundColor);
if (colorByTheme) {
dark = !mDarkModeEnabled;
}
if (dark) {
mStarBorder.setImageResource(R.drawable.ic_unstarred_white);
mStarBackground.setImageResource(R.drawable.ic_starred_black);
mArchivedBackground.setImageResource(R.drawable.ic_baseline_archive_24_black);
} else {
mStarBorder.setImageResource(R.drawable.ic_unstarred_black);
mStarBackground.setImageResource(R.drawable.ic_starred_white);
mArchivedBackground.setImageResource(R.drawable.ic_baseline_archive_24);
}
if (enableStar) {
mStar.setVisibility(View.VISIBLE);
} else{
@@ -304,6 +333,11 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
} else{
mArchived.setVisibility(View.GONE);
}
mStarBorder.invalidate();
mStarBackground.invalidate();
mArchivedBackground.invalidate();
}
}
}

View File

@@ -500,12 +500,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
parseResultList = Utils.retrieveBarcodesFromImage(this, data);
} else if (receivedType.equals("application/pdf")) {
parseResultList = Utils.retrieveBarcodesFromPdf(this, data);
} else if (Arrays.asList("application/vnd.apple.pkpass", "application/vnd-com.apple.pkpass").contains(receivedType)) {
parseResultList = Utils.retrieveBarcodesFromPkPass(this, data);
} else if (receivedType.equals("application/vnd.espass-espass")) {
// FIXME: espass is not pkpass
// However, several users stated in https://github.com/CatimaLoyalty/Android/issues/2197 that the formats are extremely similar to the point they could rename an .espass file to .pkpass and have it imported
// So it makes sense to "unofficially" treat it as a PKPASS for now, even though not completely correct
} else if (receivedType.equals("application/vnd.apple.pkpass")) {
parseResultList = Utils.retrieveBarcodesFromPkPass(this, data);
} else {
Log.e(TAG, "Wrong mime-type");

View File

@@ -1032,6 +1032,21 @@ public class Utils {
return headerColor;
}
public static boolean installedFromGooglePlay(Context context) {
try {
String packageName = context.getPackageName();
String installer;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
installer = context.getPackageManager().getInstallSourceInfo(packageName).getInstallingPackageName();
} else {
installer = context.getPackageManager().getInstallerPackageName(packageName);
}
return installer.equals("com.android.vending");
} catch (Throwable ignored) {
return false;
}
}
public static int getHeaderColor(Context context, LoyaltyCard loyaltyCard) {
return loyaltyCard.headerColor != null ? loyaltyCard.headerColor : LetterBitmap.getDefaultColor(context, loyaltyCard.store);
}

View File

@@ -2,10 +2,9 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:viewportHeight="24"
android:tint="@android:color/white">
<path
android:fillColor="#D3D3D3"
android:pathData="M20.54,5.23l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6c-0.47,0 -0.88,0.21 -1.16,0.55L3.46,5.23C3.17,5.57 3,6.02 3,6.5V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5c0,-0.48 -0.17,-0.93 -0.46,-1.27zM12,17.5L6.5,12H10v-2h4v2h3.5L12,17.5zM5.12,5l0.81,-1h12l0.94,1H5.12z"
android:strokeWidth="0.25"
android:strokeColor="#777777"/>
android:fillColor="@android:color/white"
android:pathData="M20.54,5.23l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6c-0.47,0 -0.88,0.21 -1.16,0.55L3.46,5.23C3.17,5.57 3,6.02 3,6.5V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5c0,-0.48 -0.17,-0.93 -0.46,-1.27zM12,17.5L6.5,12H10v-2h4v2h3.5L12,17.5zM5.12,5l0.81,-1h12l0.94,1H5.12z"/>
</vector>

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@android:color/black">
<path
android:fillColor="@android:color/black"
android:pathData="M20.54,5.23l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6c-0.47,0 -0.88,0.21 -1.16,0.55L3.46,5.23C3.17,5.57 3,6.02 3,6.5V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5c0,-0.48 -0.17,-0.93 -0.46,-1.27zM12,17.5L6.5,12H10v-2h4v2h3.5L12,17.5zM5.12,5l0.81,-1h12l0.94,1H5.12z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
</vector>

View File

@@ -1,11 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#D3D3D3"
android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"
android:strokeWidth="0.25"
android:strokeColor="#777777"/>
</vector>

View File

@@ -15,7 +15,8 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/textView"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_archive_24" />
<TextView
android:id="@+id/textView"

View File

@@ -72,15 +72,29 @@
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_gravity="end"
android:alpha="0.8"
android:alpha="0.5"
android:contentDescription="@string/starred"
android:elevation="4dp"
android:rotationX="2"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/loyalty_card_icon_starred"
tools:ignore="ImageContrastCheck"/>
app:srcCompat="@drawable/ic_starred_white"
tools:ignore="ImageContrastCheck" />
<ImageView
android:importantForAccessibility="no"
android:id="@+id/star_border"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_gravity="end"
android:alpha="0.5"
android:contentDescription="@string/starImage"
android:elevation="4dp"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_unstarred_black"
tools:ignore="ImageContrastCheck" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -96,18 +110,18 @@
<ImageView
android:id="@+id/archive_background"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_width="41dp"
android:layout_height="44dp"
android:layout_gravity="end"
android:alpha="0.8"
android:alpha="0.5"
android:contentDescription="@string/archived"
android:elevation="4dp"
android:rotationX="2"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/loyalty_card_icon_archived"
tools:ignore="ImageContrastCheck" />
app:srcCompat="@drawable/ic_baseline_archive_24"
tools:ignore="ImageContrastCheck,MissingConstraints"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="-1dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

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

View File

@@ -41,7 +41,7 @@
<string name="removeImage">Премахване на изображение</string>
<string name="takePhoto">Снимане</string>
<string name="intent_import_card_from_url_share_multiple_text">Искам да споделя тези карти с вас</string>
<string name="wrongValueForBarcodeType">Стойността е неприемлива за избрания вид щрихкод</string>
<string name="wrongValueForBarcodeType">Стойноста е неприемлива за избрания щрихкод</string>
<string name="setBarcodeId">Задаване на стойност</string>
<string name="sameAsCardId">Като номера</string>
<string name="barcodeId">Стойност на щрихкода</string>
@@ -308,5 +308,4 @@
<string name="generic_error_please_retry">Съжаляваме, нещо се обърка, опитайте отново…</string>
<string name="addFromPkpass">Изберете файл на Passbook (.pkpass)</string>
<string name="unsupportedFile">Този вид файлове не се поддържат</string>
<string name="sort_by_valid_from">Начало валидност</string>
</resources>
</resources>

View File

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

View File

@@ -314,5 +314,4 @@
<string name="settings_column_count_7">7</string>
<string name="settings_column_count_4">4</string>
<string name="settings_column_count_5">5</string>
<string name="sort_by_valid_from">Platnost od</string>
</resources>
</resources>

View File

@@ -48,7 +48,7 @@
<string name="settings_theme">Tema</string>
<string name="settings">Indstillinger</string>
<string name="starImage">Favorit stjerne</string>
<string name="thumbnailDescription">Thumbnail</string>
<string name="thumbnailDescription">Miniaturebillede til kort</string>
<string name="selectBarcodeTitle">Vælg stregkode</string>
<string name="app_copyright_old">Baseret på Loyalty Card Keychain
\ncopyright © 2016-2020 Branden Archer.</string>
@@ -66,22 +66,22 @@
<string name="noCardExistsError">Kunne ikke finde det kort</string>
<string name="deleteConfirmationGroup">Slet gruppe\?</string>
<string name="all">Alle</string>
<string name="noGroupCards">Denne gruppe er tom</string>
<string name="noGroups">Klik på + plus-knappen for at tilføje grupper til kategorisering.</string>
<string name="noGroupCards">Denne gruppe indeholder ikke nogen kort</string>
<string name="noGroups">Klik på + plus-knappen for først at tilføje grupper til kategorisering.</string>
<string name="groups">Grupper</string>
<string name="enter_group_name">Indtast gruppenavn</string>
<string name="exportSuccessful">Data eksporteret</string>
<string name="importSuccessful">Data importeret</string>
<string name="exportSuccessful">Eksporterede kortdata</string>
<string name="importSuccessful">Kortdata importeret</string>
<string name="intent_import_card_from_url_share_text">Jeg vil dele et kort med jer</string>
<string name="settings_disable_lockscreen_while_viewing_card">Forebyg låseskærm</string>
<string name="settings_keep_screen_on">LHold skærm tændt</string>
<string name="moveUp">Bevæg dig opad</string>
<string name="leaveWithoutSaveConfirmation">Forlade uden at gemme\?</string>
<string name="settings_display_barcode_max_brightness">Gør skærm lysere</string>
<string name="settings_display_barcode_max_brightness">Lysere stregkodevisning</string>
<string name="failedOpeningFileManager">Installer først en filhåndteringsprogram.</string>
<string name="moveDown">Bevæger sig nedad</string>
<string name="leaveWithoutSaveTitle">Afslut</string>
<string name="addManually">Indtast stregkoden manuelt</string>
<string name="addManually">Indtast kort-ID manuelt</string>
<string name="noGiftCardsGroup">Opret kort og tildel dem gupper her.</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Slet dette <xliff:g>%d</xliff:g> kort permanent\?</item>
@@ -100,58 +100,4 @@
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="app_license">Copylefted libre software, GPLv3+ licens</string>
<string name="barcodeImageDescriptionWithType">Billede<xliff:g>%s</xliff:g> stregkode</string>
<string name="group_name_already_in_use">Gruppenavn allerede i brug</string>
<string name="editGroup">Redigerer Gruppe: <xliff:g>%s</xliff:g></string>
<string name="importFidme">Importer fra FidMe</string>
<string name="settings_card_orientation">Skærm orientation</string>
<string name="settings_follow_system_orientation">Følg system</string>
<string name="settings_portrait_orientation">Portræt</string>
<string name="settings_landscape_orientation">Landskab</string>
<string name="settings_disable_lockscreen_while_viewing_card_summary">Deaktiver låseskærm når et kort er åbent</string>
<string name="groupsList">Grupper: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Udløber: <xliff:g>%s</xliff:g></string>
<string name="moveBarcodeToTopOfScreen">Flyt stregkoden til toppen af skærmen</string>
<string name="accept">Acceptér</string>
<string name="importCatima">Importer fra Catima</string>
<string name="expiryDate">Udløbsdato</string>
<string name="never">Aldrig</string>
<string name="chooseExpiryDate">Vælg udløbsdato</string>
<string name="balance">Balance</string>
<string name="importStocard">Importer fra Stocard</string>
<string name="balanceSentence">Balance: <xliff:g>%s</xliff:g></string>
<string name="group_name_is_empty">Gruppenavn må ikke være tom</string>
<string name="group_updated">Gruppe opdateret</string>
<string name="card">Kort</string>
<string name="currency">Valuta</string>
<string name="settings_display_barcode_max_brightness_summary">Nødvendigt for nogle scannere til at fungerer</string>
<string name="editBarcode">Rediger stregkode</string>
<string name="points">Point</string>
<string name="privacy_policy">Privatlivspolitik</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kort</item>
<item quantity="other"><xliff:g>%d</xliff:g> kort</item>
</plurals>
<string name="settings_allow_content_provider_read_title">Tillid andre apps tilgang til min data</string>
<string name="settings_allow_content_provider_read_summary">Apps vil stadig have behov for at spørge om tilladelse for at få adgang</string>
<string name="barcodeId">Stregkode værdi</string>
<string name="setBarcodeId">Vælg stregkode værdi</string>
<string name="sameAsCardId">Samme som ID</string>
<string name="settings_system_theme">System</string>
<string name="settings_lock_on_opening_orientation">Lås til orientation når kort åbnes</string>
<string name="settings_keep_screen_on_summary">Deaktiver skærm tids slukning når et kort er åbent</string>
<string name="group_edit">Rediger gruppe</string>
<string name="settings_follow_sensor_orientation">Altid roter (ignorer system indstillinger)</string>
<string name="chooseImportType">Importer data fra</string>
<string name="importVoucherVault">Importer fra Voucher Vault</string>
<string name="settings_use_volume_keys_navigation">Skift kort ved brug af lydstyrke knapperne</string>
<string name="settings_use_volume_keys_navigation_summary">Brug lydstyrke knapperne til at ændre hvilket kort bliver vist</string>
<string name="addFromImage">Vælg et billede fra galleri</string>
<string name="expiryStateSentenceExpired">Udløbet: <xliff:g>%s</xliff:g></string>
<string name="noBarcodeFound">Ingen stregkode blev fundet</string>
<string name="errorReadingImage">Kunne ikke læse billedet</string>
<string name="balanceParsingFailed">Ugyldig balance</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> point</item>
<item quantity="other"><xliff:g>%s</xliff:g> point</item>
</plurals>
</resources>

View File

@@ -163,7 +163,7 @@
<string name="app_contributors">Ermöglicht durch: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="barcodeImageDescriptionWithType">Bild <xliff:g>%s</xliff:g> Barcode</string>
<string name="sort_by">Sortieren nach</string>
<string name="sort_by_expiry">Gültig bis</string>
<string name="sort_by_expiry">Ablauf</string>
<string name="sort_by_most_recently_used">Zuletzt verwendet</string>
<string name="sort_by_name">Name</string>
<string name="sort">Sortieren</string>
@@ -305,5 +305,4 @@
<string name="generic_error_please_retry">Entschuldigung, da ist etwas schief gelaufen, versuchen Sie es noch einmal ...</string>
<string name="unsupportedFile">Diese Datei wird nicht unterstützt</string>
<string name="addFromPkpass">Passbook-Datei (.pkpass) auswählen</string>
<string name="sort_by_valid_from">Gültig ab</string>
</resources>
</resources>

View File

@@ -307,5 +307,4 @@
<string name="generic_error_please_retry">Λυπούμαστε, κάτι πήγε στραβά, δοκιμάστε ξανά...</string>
<string name="unsupportedFile">Το αρχείο δεν υποστηρίζεται</string>
<string name="addFromPkpass">Επιλογή αρχείου Passbook (.pkpass)</string>
<string name="sort_by_valid_from">Έναρξη ισχύος</string>
</resources>
</resources>

View File

@@ -303,5 +303,4 @@
<string name="generic_error_please_retry">Vabandust, midagi läks nüüd viltu, palun proovi uuesti...</string>
<string name="unsupportedFile">See fail pole toetatud</string>
<string name="addFromPkpass">Vali Passbooki fail (.pkpass)</string>
<string name="sort_by_valid_from">Kehtib alates</string>
</resources>
</resources>

View File

@@ -305,7 +305,4 @@
<string name="settings_column_count_4">4</string>
<string name="settings_column_count_5">5</string>
<string name="settings_column_count_7">7</string>
<string name="addFromPkpass">Valitse Passbook-tiedosto (.pkpass)</string>
<string name="unsupportedFile">Tämä tiedosto ei ole tuettu</string>
<string name="generic_error_please_retry">Pahoittelut, jokin meni pieleen. Yritä uudelleen...</string>
</resources>

View File

@@ -311,7 +311,4 @@
<string name="settings_automatic_column_count">Automatique</string>
<string name="settings_column_count_6">6</string>
<string name="settings_column_count_7">7</string>
<string name="addFromPkpass">Sélectionner un fichier Cartes / Passbook (.pkpass)</string>
<string name="unsupportedFile">Ce fichier n\'est pas supporté</string>
<string name="generic_error_please_retry">Désolé, un problème est survenu, veuillez réessayer...</string>
</resources>

View File

@@ -302,5 +302,4 @@
<string name="unsupportedFile">Este ficheiro non é compatible</string>
<string name="addFromPkpass">Selecciona un ficheiro Passbook (.pkpass)</string>
<string name="generic_error_please_retry">Sentímolo, pero algo fallou, inténtao outra vez…</string>
<string name="sort_by_valid_from">Válido desde</string>
</resources>
</resources>

View File

@@ -298,14 +298,4 @@
<string name="settings_column_count_landscape">Oszlopok fekvő módban</string>
<string name="settings_automatic_column_count">Automatikus</string>
<string name="settings_column_count_portrait">Oszlopok álló módban</string>
<string name="settings_column_count_5">5</string>
<string name="settings_column_count_2">2</string>
<string name="settings_column_count_6">6</string>
<string name="settings_column_count_3">3</string>
<string name="settings_column_count_1">1</string>
<string name="addFromPkpass">Válassz egy Passbook fájlt (.pkpass)</string>
<string name="unsupportedFile">Ez a fájl nem támogatott</string>
<string name="generic_error_please_retry">Sajnálom, valami rosszul ment, próbálkozz újra...</string>
<string name="settings_column_count_4">4</string>
<string name="settings_column_count_7">7</string>
</resources>

View File

@@ -299,7 +299,4 @@
<string name="settings_column_count_1">1</string>
<string name="settings_column_count_4">4</string>
<string name="settings_column_count_5">5</string>
<string name="addFromPkpass">Pilih file Buku Tabungan (.pkpass)</string>
<string name="unsupportedFile">File ini tidak didukung</string>
<string name="generic_error_please_retry">Maaf, terjadi kesalahan, silakan coba lagi...</string>
</resources>

View File

@@ -36,7 +36,7 @@
<string name="failedParsingImportUriError">Nevarēja apstrādāt ievietošanas URI</string>
<string name="importExport">Ievietot/izgūt</string>
<string name="exportName">Izgūt</string>
<string name="importExportHelp">Datu rezerves kopijas izveidošana ļauj tos pārnest uz citu ierīci.</string>
<string name="importExportHelp">Dublējot Jūsu datus, tos var pārnest uz citu ierīci.</string>
<string name="importSuccessfulTitle">Ievietots</string>
<string name="importFailedTitle">Ievietošana neizdevās</string>
<string name="importFailed">Nevarēja veikt ievietošanu</string>

View File

@@ -305,7 +305,4 @@
<string name="settings_column_count_2">2</string>
<string name="settings_column_count_3">3</string>
<string name="settings_column_count_7">7</string>
<string name="addFromPkpass">Velg en Passbook-fil (.pkpass)</string>
<string name="unsupportedFile">Denne filen støttes ikke</string>
<string name="generic_error_please_retry">Beklager, men noe gikk galt. Prøv igjen…</string>
</resources>

View File

@@ -308,5 +308,4 @@
<string name="addFromPkpass">Kies een Passbook bestand (.pkpass)</string>
<string name="unsupportedFile">Dit bestand wordt niet ondersteund</string>
<string name="generic_error_please_retry">Sorry, er ging iets mis. Probeer het opnieuw.</string>
<string name="sort_by_valid_from">Op geldig vanaf</string>
</resources>
</resources>

View File

@@ -294,7 +294,7 @@
<string name="spend">Потрачено</string>
<string name="receive">Получено</string>
<string name="amountParsingFailed">Недопустимая сумма</string>
<string name="addFromPdfFile">Выбрать файл PDF</string>
<string name="addFromPdfFile">Выбрать PDF-файл</string>
<string name="errorReadingFile">Невозможно прочитать файл</string>
<string name="pageWithNumber">Страница <xliff:g>%d</xliff:g></string>
<string name="failedLaunchingFileManager">Не найден поддерживаемый файловый менеджер</string>
@@ -320,5 +320,4 @@
<string name="unsupportedFile">Данный файл не поддерживается</string>
<string name="addFromPkpass">Выбрать файл Passbook (.pkpass)</string>
<string name="generic_error_please_retry">Извините, что-то пошло не так, попробуйте ещё раз…</string>
<string name="sort_by_valid_from">Начало действия</string>
</resources>
</resources>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="settings_display_barcode_max_brightness">Gör skärmen ljusare</string>
<string name="settings_display_barcode_max_brightness">Gör streckkodsvyn ljusare</string>
<string name="settings_keep_screen_on">Håll skärmen påslagen</string>
<string name="importFidmeMessage">Välj den exporterade <i>fidme-export-request-xxxxxx.zip</i> från FidMe som du vill importera och välj streckkodstyper manuellt efteråt.
\nSkapa den från din FidMe-profil först genom att välja \"Data Protection\" och sen trycka på \"Extract my data\".</string>

View File

@@ -3,10 +3,6 @@
<string name="app_name">கேடிமா</string>
<string name="action_search">தேடல்</string>
<string name="action_add">கூட்டு</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> தேர்ந்தெடுக்கப்பட்டது</item>
<item quantity="other"><xliff:g>%d</xliff:g> தேர்ந்தெடுக்கப்பட்டன</item>
</plurals>
<string name="noGiftCards">ஒரு அட்டையைச் சேர்க்க + பிளச் பொத்தானைக் சொடுக்கு செய்க அல்லது ⋮ மெனுவிலிருந்து இறக்குமதி செய்யுங்கள்.</string>
<string name="noGiftCardsGroup">சில அட்டைகளை உருவாக்கி, பின்னர் அவற்றை இங்கே குழுவிற்கு ஒதுக்குங்கள்.</string>
<string name="storeName">பெயர்</string>
@@ -265,41 +261,4 @@
<string name="useBackImage">பின் படத்தைப் பயன்படுத்தவும்</string>
<string name="addFromPkpass">பாச் புக் கோப்பைத் தேர்ந்தெடுக்கவும் (.pkpass)</string>
<string name="useFrontImage">முன் படத்தைப் பயன்படுத்தவும்</string>
<plurals name="deleteCardsTitle">
<item quantity="one"><xliff:g>%d</xliff:g> அட்டை நீக்கு</item>
<item quantity="other"><xliff:g>%d</xliff:g> அட்டைகளை நீக்கு</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="one">இந்த <xliff:g>%d</xliff:g> அட்டையை நிரந்தரமாக நீக்கவா?</item>
<item quantity="other">இந்த <xliff:g>%d</xliff:g> அட்டைகளை நிரந்தரமாக நீக்கவா?</item>
</plurals>
<string name="editGroup">திருத்துதல் குழு: <xliff:g>%s</xliff:g></string>
<string name="debug_version_fmt">பதிப்பு: <xliff:g id="version">%s</xliff:g></string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> அட்டை</item>
<item quantity="other"><xliff:g>%d</xliff:g> அட்டைகள்</item>
</plurals>
<string name="expiryStateSentenceExpired">காலாவதியானது: <xliff:g>%s</xliff:g></string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> புள்ளி</item>
<item quantity="other"><xliff:g>%s</xliff:g> புள்ளிகள்</item>
</plurals>
<string name="importLoyaltyCardKeychainMessage">இறக்குமதி செய்ய உங்கள் <i>LoyaltyCardKeychain.csv</i> விசுவாச அட்டை சாவிக்கொத்திலிருந்து ஏற்றுமதி செய். \nமுதலில் அங்கு ஏற்றுமதியை அழுத்துவதன் மூலம் விசுவாச அட்டை சாவிக்கொத்தில் இறக்குமதி/ஏற்றுமதி பட்டியலிலிருந்து அதை உருவாக்கு.</string>
<string name="validFromSentence">இதிலிருந்து செல்லுபடியாகும்: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">புதிய இருப்பு: <xliff:g>%s</xliff:g></string>
<string name="pageWithNumber">பக்கம் <xliff:g>%d</xliff:g></string>
<string name="currentBalanceSentence">தற்போதைய இருப்பு: <xliff:g>%s</xliff:g></string>
<string name="app_contributors">வழங்கியவர்: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="about_title_fmt">படம் <xliff:g>%s</xliff:g> பட்டைகுறியீடு</string>
<string name="barcodeImageDescriptionWithType">படம் <xliff:g>%s</xliff:g> பட்டை குறியீடு</string>
<string name="app_libraries">விடுதலை மூன்றாம் தரப்பு நூலகங்கள்: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="expiryStateSentence">காலாவதியாகிறது: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">இருப்பு: <xliff:g>%s</xliff:g></string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> அட்டை (<xliff:g id="archivedCount">%2$d</xliff:g> காப்பகப்படுத்தப்பட்டது)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> அட்டைகள் (<xliff:g id="archivedCount">%2$d</xliff:g> காப்பகப்படுத்தப்பட்டது)</item>
</plurals>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">பதிப்புரிமை © 2019<xliff:g>%d</xliff:g> சில்வியா வான் ஓஎச் மற்றும் பங்களிப்பாளர்கள்</string>
<string name="app_resources">விடுதலை மூன்றாம் தரப்பு வளங்கள்: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="groupsList">குழுக்கள்: <xliff:g>%s</xliff:g></string>
</resources>
</resources>

View File

@@ -285,7 +285,7 @@
<string name="enter_card_id">Введіть ID або текст на вашій картці</string>
<string name="addWithoutBarcode">Додати картку без штрих-коду</string>
<string name="field_must_not_be_empty">Поле вводу не повинно бути порожнім</string>
<string name="app_name">Катіма</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Завжди обертати (ігнорувати системні налаштування)</string>
<string name="add_manually_warning_message">У деяких магазинах значення штрихкоду відрізняється від номера, записаного на картці. Через це введення штрихкоду вручну може не завжди спрацювати. Наполегливо рекомендуємо відсканувати штрихкод за допомогою камери. Ви все ще хочете продовжити?</string>
<string name="continue_">Продовжити</string>
@@ -319,5 +319,4 @@
<string name="unsupportedFile">Цей файл не підтримується</string>
<string name="generic_error_please_retry">Вибачте, щось пішло не так, спробуйте ще раз...</string>
<string name="addFromPkpass">Виберіть файл Passbook (.pkpass)</string>
<string name="sort_by_valid_from">Діє з</string>
</resources>
</resources>

View File

@@ -302,5 +302,4 @@
<string name="addFromPkpass">选择 Passbook 文件(.pkpass</string>
<string name="unsupportedFile">此文件不受支持</string>
<string name="generic_error_please_retry">抱歉,某个东西出错了,请再试…</string>
<string name="sort_by_valid_from">有效期开始日</string>
</resources>
</resources>

View File

@@ -298,7 +298,4 @@
<string name="settings_category_title_cards_overview">卡片概覽</string>
<string name="settings_column_count_portrait">縱向模式下的列數</string>
<string name="settings_column_count_landscape">横向模式下的列數</string>
<string name="addFromPkpass">選擇 Passbook 檔案 (.pkpass)</string>
<string name="unsupportedFile">不支援此檔案</string>
<string name="generic_error_please_retry">抱歉,似乎出了點錯誤,請您再試一次...</string>
</resources>

View File

@@ -11,7 +11,6 @@
<string-array name="sort_types_array">
<item>@string/sort_by_name</item>
<item>@string/sort_by_most_recently_used</item>
<item>@string/sort_by_valid_from</item>
<item>@string/sort_by_expiry</item>
</string-array>
</resources>

View File

@@ -255,7 +255,6 @@
<string name="barcodeLongPressMessage">Only images can be opened in the gallery app</string>
<string name="sort_by_name">Name</string>
<string name="sort_by_most_recently_used">Most Recently Used</string>
<string name="sort_by_valid_from">Valid From</string>
<string name="sort_by_expiry">Expiry</string>
<!-- \"Reversed order\" is also OK. This is an option in the card sorting list -->
<string name="reverse">…in reversed order</string>

View File

@@ -31,6 +31,7 @@
<item name="alertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="windowActionModeOverlay">true</item>
</style>
<style name="ThemeOverlay.App.MaterialAlertDialog.Monet" parent="ThemeOverlay.Material3.MaterialAlertDialog">

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.8.0" apply false
id("com.android.application") version "8.7.3" apply false
id("com.github.spotbugs") version "5.1.4" apply false
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
}

View File

@@ -3,7 +3,7 @@ set -euo pipefail
IFS=$'\n\t'
### build.sh
### Builds Catima the same way rbtlog/IzzyOnDroid does for reproducible builds
### Builds Catima the same way F-Droid does for reproducible builds
if [ -z "${ANDROID_SDK_ROOT:-}" ]; then
echo "ANDROID_SDK_ROOT is not set, setting to $HOME/Android/Sdk";
@@ -25,11 +25,7 @@ echo "Starting build"
./gradlew clean assembleRelease
echo "Build finished (unsigned)"
flavourDirs=$(find app/build/outputs/apk/ -mindepth 1 -maxdepth 1 -type d)
for flavourDir in $flavourDirs; do
flavourName="$(basename "$flavourDir")"
echo "Your $flavourName flavour is at $flavourDir/release/app-$flavourName-release-unsigned.apk"
done
echo "Your build is at app/build/outputs/apk/release/app-release-unsigned.apk"
if [ -z "${KEYSTORE:-}" ]; then
echo "KEYSTORE not set, skipping signing..."
@@ -40,26 +36,16 @@ else
fi
apksigner_version="$(ls -1 "$HOME/Android/Sdk/build-tools/" | tail -n 1)"
cp app/build/outputs/apk/release/app-release-unsigned.apk app/build/outputs/apk/release/app-release.apk
"$HOME/Android/Sdk/build-tools/$apksigner_version/apksigner" sign -v --ks "$KEYSTORE" --ks-key-alias "$KEYSTORE_ALIAS" app/build/outputs/apk/release/app-release.apk
for flavourDir in $flavourDirs; do
flavourName="$(basename "$flavourDir")"
echo "Signing $flavourName flavour..."
cp "$flavourDir/release/app-$flavourName-release-unsigned.apk" "$flavourDir/release/app-$flavourName-release.apk"
"$HOME/Android/Sdk/build-tools/$apksigner_version/apksigner" sign -v --ks "$KEYSTORE" --ks-key-alias "$KEYSTORE_ALIAS" "$flavourDir/release/app-$flavourName-release.apk"
echo "Build finished (signed)"
echo "Your $flavourName flavour is at $flavourDir/release/app-$flavourName-release.apk"
done
shasumPath="$(pwd)/SHA256SUMS"
echo "" > "$shasumPath"
for flavourDir in $flavourDirs; do
pushd "$flavourDir/release/"
sha256sum -- *.apk >> "$shasumPath"
popd
done
echo "SHA256SUMS generated"
echo "Your SHA256SUMS are at SHA256SUMS"
echo "Build finished (signed)"
echo "Your build is at app/build/outputs/apk/release/app-release.apk"
fi
pushd app/build/outputs/apk/release/
sha256sum -- *.apk > SHA256SUMS
popd
echo "SHA256SUMS generated"
echo "Your SHA256SUMS is at app/build/outputs/apk/release/SHA256SUMS"

View File

@@ -6,8 +6,8 @@
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. Create a commit for the new release: `git add CHANGELOG.md app/build.gradle.kts && git commit -m "Release Catima <VERSION>"`
6. Build the new .apks: `KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh`
7. Upload `app/build/outputs/apk/gplay/release/app-gplay-release.apk` to Google Play Open Testing
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/build/outputs/apk/foss/release/app-foss-release.apk` and `SHA256SUMS` files
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

@@ -1 +0,0 @@
- Zlepšení zobrazení ikon archivu/hvězdiček

View File

@@ -1,3 +0,0 @@
- Cíl Android 15
- Oprava klávesnice zakrývající tlačítko pro uložení na obrazovce úprav
- Oprava některých souborů pkpass, které nejsou detekovány jako pkpass (podpora typu mime application/vnd-com.apple.pkpass)

View File

@@ -1 +0,0 @@
- Možnost třídit karty podle začátku platnosti

View File

@@ -1 +0,0 @@
- Verbesserte Anzeige der Symbole Archiv/Favoriten

View File

@@ -1,3 +0,0 @@
- Ziel Android 15
- Die Tastatur verdeckt jetzt nicht mehr den "Speichern"-Button im Bearbeitungsbildschirm
- Einige pkpass-Dateien wurden nicht als pkpass erkannt (Unterstützung des Mime-Typs application/vnd-com.apple.pkpass)

View File

@@ -1 +0,0 @@
- Ermöglicht Kartensortierung nach „Beginn der Gültigkeit“

View File

@@ -1,7 +1,7 @@
Schluss mit der Suche nach Kundenkarten aus Plastik beim Bezahlen im Geschäft oder Webshop.
<b>Speichere Barcodes mit der Kamera auf dein Gerät und vergiss deine Karten.</b>
<b>Speichere Barcodes mit der Kamera auf dein Gerät und vergesse deine Karten.</b>
Lass deine Geldbörse daheim oder schaffe zumindest Platz für die wichtigen Wertsachen.
Lass deine Geldbörse daheim, oder schaffe wenigstens viel Platz für die wichtigen Wertsachen.
Mit diesem unverzichtbaren Programm schaffst du Platz für Bargeld statt für nutzloses Plastik.
@@ -11,12 +11,12 @@ Mit diesem unverzichtbaren Programm schaffst du Platz für Bargeld statt für nu
- Importiere Karten und Codes aus Dateien, von Catima, FidMe, Loyalty Card Keychain, Stocard oder Voucher Vault.
- Erstelle ein Backup aller deiner Karten und übertrage diese auf ein neues Gerät.
- Teile Gutscheine, exklusive Angebote, Werbeaktionscodes oder Karten und sonstige Codes mit allen Apps.
- Dunkles Design und Barrierefreiheit für Nutzer mit Sehbehinderung.
- Dunkles Design und Barrierefreiheit für sehbehinderte Nutzer.
- Von der Freien-Software-Gemeinschaft für alle Menschen gemacht.
- Lokalisierte, menschliche Übersetzungen für mehr als 40 Sprachen.
- Kostenlos, unterstützt durch Gemeinschaftsbeiträge.
- Verwende, prüfe, ändere und teile die App, wie du willst; <i>mit allen</i>.
- Nicht nur freie und quelloffene Software. Eine freie, <i>Copylefted</i> Software-Kartenverwaltung (GPLv3+).
Vereinfache dein Leben und deine Einkäufe verliere nie wieder einen Beleg, eine Gutscheinkarte oder ein Flugticket.
Nimm deine Prämien und Boni mit und spare unterwegs.
Vereinfache dein Leben und deine Einkäufe, und verliere nie wieder einen Beleg, eine Gutscheinkarte oder ein Flugticket.
Habe deine Prämien und Boni immer bei dir, und spare unterwegs.

View File

@@ -1 +0,0 @@
- Improve archive/starred icon display

View File

@@ -1,3 +0,0 @@
- Target Android 15
- Fix keyboard covering save button in edit screen
- Fix some pkpass files not being detected as pkpass (application/vnd-com.apple.pkpass mime type support)

View File

@@ -1,2 +0,0 @@
- Ability to sort cards by start of validity
- Temporarily revert to targeting Android 14 to fix some UI issues

View File

@@ -1,3 +0,0 @@
- Lisasime võimaluse liikuda kaartide vahel helivaljuse nuppudega
- Parandasime Stocardi impordi vead
- Parandasime "Import on katkestatud" vea peale õnnestunud importi

View File

@@ -1,3 +0,0 @@
- Lisasime Passbooki failide (.pkpass) toe
- Parandasime läbipaistvate pdf-failide importimise
- Parandasime läbipaistvate pisipiltide kuvamist

View File

@@ -1 +0,0 @@
- Parandasime rakenduse kokkujooksmise vigase pkpass-faili avamisel

View File

@@ -1 +0,0 @@
- Parandasime arhiveeritud/lemmik ikoonide kuvamise

View File

@@ -1,3 +0,0 @@
- Alusplatvorm on nüüd Android 15
- Parandasime olukorra, kus klahvistik kattis muutmisvaates salvestusnupu
- Parandasime olukorra, kus mõned pkpass failid jäid tuvastamata (application/vnd-com.apple.pkpass mime-tüüpi tugi)

View File

@@ -1 +0,0 @@
- Parandasime erinevad TalkBacki vead

View File

@@ -1 +0,0 @@
- Võtsime kasutusele Material You kujunduskeele

View File

@@ -1 +0,0 @@
- Corriger le retour à la ligne sur la fenêtre d'ajout

View File

@@ -1,4 +1,2 @@
- Modifie la colonne par défaut sur les écrans larges à 4
- Modifier la colonne par défaut sur les écrans larges à 4
- Permet de surcharger le nombre de colonnes pour le portrait et le paysage dans les paramètres
- Conserve le filtre de recherche de l'écran principal lors de la rotation de l'écran ou de l'ouverture d'une carte
- Limite la longueur maximale de l'affichage des notes sur l'écran principal

View File

@@ -1,3 +1 @@
- Ajoute le support des fichiers Cartes / Passbook (.pkpass)
- Corrige l'import des fiches PDF transparents
- Améliorer l'affichage des miniatures transparentes

View File

@@ -1 +0,0 @@
- Correction d'un crash lors de l'ouverture de fichiers pkpass invalides

View File

@@ -1 +0,0 @@
- Améliorer l'affichage des icônes d'archive/étoile

View File

@@ -1 +0,0 @@
- mellora da aparencia da icona arquivar/estrela

View File

@@ -1,3 +0,0 @@
- versión obxectivo Android 15
- solución a teclado que tapa o botón gardar na pantalla de edición
- solución a que non detectaba algúns ficheiros .pkpass como tales (compatibilidade co tipo mime application/vnd-com.apple.pkpass)

View File

@@ -1,4 +0,0 @@
- mellora na xestión dos grupos
- pódense recortar as imaxes
- solución da perda de datos da imaxe ao gardar despois de rotar na edición
- pódese poñer unha imaxe persoal como icona da tarxeta

View File

@@ -1,2 +0,0 @@
- nova disposición da pantalla principal
- arranxo do tamaño da parte inferior cando se entraba e saía de pantalla completa

View File

@@ -1,2 +0,0 @@
- Engadir Catima a Quick Access Device Controls (https://developer.android.com/guide/topics/ui/device-control)
- Arranxo de algúns grupos que non se mostran correctamente na pantalla de xestión dos grupos

View File

@@ -1,3 +0,0 @@
- arranxo da borrosidade nas iconas de letras na pantalla principal
- arranxo da desaparición puntual de iconas despois da selección
- arranxo das iconas na barra de estado non visibles en Android 5

View File

@@ -1 +0,0 @@
- solución ao problema na tarxeta compartir

View File

@@ -1,2 +0,0 @@
- engadida compatibilidade con CODE 93
- arranxos menores e melloras

View File

@@ -1,4 +0,0 @@
- solución a crear múltiples entradas a premer varias veces o botón gardar
- menor tamaño da cabeceira das tarxetas en ocultar detalles para que se vexan aínda máis tarxetas
- reorganización da pantalla de edición
- mellora do contraste da icona da estrela na pantalla principal

View File

@@ -1,3 +0,0 @@
- Iespēja pārslēgties starp kartēm ar skaļuma pogām
- Salabota Stocard ievietošana
- Novērsta ziņojuma "Ievietošana atcelta" parādīšanās pēc sekmīgas ievietošanas

View File

@@ -1 +0,0 @@
- Novērsta avārija, kad tika atvērtas nederīgas pkpass datnes

View File

@@ -1 +0,0 @@
- Uzlabota arhivēšanas/izlasē ikonas attēlošana

View File

@@ -1,3 +0,0 @@
- Android 15 atbalsts
- Labošanas ekrānā novērsta saglabāšanas pogas aizsegšana ar tastatūru
- Novērsta atsevišķu pkpass datņu neatpazīšana kā pkpass (application/vnd-com.apple.pkpass MIME veida atbalsts)

View File

@@ -1 +1 @@
Svītrkodiem, biedru kartēm, lojalitātes programmām, kuponiem un biļetēm.
Jūsu svītrkodiem, biedru kartēm, lojalitātes programmām, kuponiem un biļetēm.

View File

@@ -1 +0,0 @@
- Улучшено отображение значка архивированных/избранных карт

View File

@@ -1,3 +0,0 @@
- Ориентация на Android 15
- Исправлено перекрывание клавиатурой кнопки сохранения на экране редактирования
- Исправлено нераспознавание некоторых файлов pkpass (поддержка mime-типа application/vnd-com.apple.pkpass)

View File

@@ -1 +0,0 @@
- Возможность сортировки карт по началу действия

View File

@@ -1 +0,0 @@
— Покращено відображення піктограм архіву/зірочки

View File

@@ -1,3 +0,0 @@
- Цільова версія Android 15
— Виправлено клавіатуру, яка закриває кнопку збереження на екрані редагування
— Виправлено деякі файли pkpass, які не виявлялися як pkpass (підтримка типу mime у додатку/vnd-com.apple.pkpass)

View File

@@ -1 +0,0 @@
- Можливість сортування карток за терміном дії

View File

@@ -1 +0,0 @@
- Sửa lỗi văng khi mở tệp tin pkpass không hợp lệ

View File

@@ -1 +0,0 @@
- 改进存档/收藏图标显示

View File

@@ -1,3 +0,0 @@
- 以 Android 15API 级别35为目标平台
- 修复编辑屏中键盘遮住保存按钮的问题
- 修复一些 pkpass 文件未被检测未pkpass 的问题 application/vnd-com.apple.pkpass mime 类型支持)

View File

@@ -1 +0,0 @@
- 可以根据有效期开始日排序卡片

View File

@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
distributionSha256Sum=f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

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