Compare commits

..

2 Commits

Author SHA1 Message Date
Sylvia van Os
4fe43bccff Catch new UncheckedIOException 2023-04-18 19:58:40 +02:00
dependabot[bot]
3732f8483b Bump org.apache.commons:commons-csv from 1.9.0 to 1.10.0
Bumps [org.apache.commons:commons-csv](https://github.com/apache/commons-csv) from 1.9.0 to 1.10.0.
- [Release notes](https://github.com/apache/commons-csv/releases)
- [Changelog](https://github.com/apache/commons-csv/blob/master/RELEASE-NOTES.txt)
- [Commits](https://github.com/apache/commons-csv/compare/rel/commons-csv-1.9.0...rel/commons-csv-1.10.0)

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-csv
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-18 16:58:12 +00:00
315 changed files with 1177 additions and 2001 deletions

View File

@@ -1,11 +1,5 @@
# Changelog # Changelog
## v2.23.0 - 120
- Complete redesign of main and loyalty card view screens
- Material You design for the settings screen
- Fix crash when using "Take a photo" with disabled camera app
## v2.22.1 - 119 ## v2.22.1 - 119
- Use Material You colours on more devices (Google library update) - Use Material You colours on more devices (Google library update)

View File

@@ -3,21 +3,21 @@ GEM
specs: specs:
CFPropertyList (3.0.6) CFPropertyList (3.0.6)
rexml rexml
addressable (2.8.4) addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0) public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15) artifactory (3.0.15)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.2.0) aws-eventstream (1.2.0)
aws-partitions (1.749.0) aws-partitions (1.701.0)
aws-sdk-core (3.171.0) aws-sdk-core (3.170.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5) aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.63.0) aws-sdk-kms (1.62.0)
aws-sdk-core (~> 3, >= 3.165.0) aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.120.1) aws-sdk-s3 (1.119.0)
aws-sdk-core (~> 3, >= 3.165.0) aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4) aws-sigv4 (~> 1.4)
@@ -36,7 +36,7 @@ GEM
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
dotenv (2.8.1) dotenv (2.8.1)
emoji_regex (3.2.3) emoji_regex (3.2.3)
excon (0.99.0) excon (0.98.0)
faraday (1.10.3) faraday (1.10.3)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
@@ -66,7 +66,7 @@ GEM
faraday_middleware (1.2.0) faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.2.6) fastimage (2.2.6)
fastlane (2.212.2) fastlane (2.211.0)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@@ -106,9 +106,9 @@ GEM
xcpretty (~> 0.3.0) xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3) xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.39.0) google-apis-androidpublisher_v3 (0.32.0)
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.9.1, < 2.a)
google-apis-core (0.11.0) google-apis-core (0.10.0)
addressable (~> 2.5, >= 2.5.1) addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a) httpclient (>= 2.8.1, < 3.a)
@@ -117,10 +117,10 @@ GEM
retriable (>= 2.0, < 4.a) retriable (>= 2.0, < 4.a)
rexml rexml
webrick webrick
google-apis-iamcredentials_v1 (0.17.0) google-apis-iamcredentials_v1 (0.16.0)
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.9.1, < 2.a)
google-apis-playcustomapp_v1 (0.13.0) google-apis-playcustomapp_v1 (0.12.0)
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.9.1, < 2.a)
google-apis-storage_v1 (0.19.0) google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.9.0, < 2.a) google-apis-core (>= 0.9.0, < 2.a)
google-cloud-core (1.6.0) google-cloud-core (1.6.0)
@@ -128,7 +128,7 @@ GEM
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0) google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0) faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.1) google-cloud-errors (1.3.0)
google-cloud-storage (1.44.0) google-cloud-storage (1.44.0)
addressable (~> 2.8) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
@@ -137,7 +137,7 @@ GEM
google-cloud-core (~> 1.6) google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0) mini_mime (~> 1.0)
googleauth (1.5.2) googleauth (1.3.0)
faraday (>= 0.17.3, < 3.a) faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
memoist (~> 0.16) memoist (~> 0.16)
@@ -150,7 +150,7 @@ GEM
httpclient (2.8.3) httpclient (2.8.3)
jmespath (1.6.2) jmespath (1.6.2)
json (2.6.3) json (2.6.3)
jwt (2.7.0) jwt (2.6.0)
memoist (0.16.2) memoist (0.16.2)
mini_magick (4.12.0) mini_magick (4.12.0)
mini_mime (1.1.2) mini_mime (1.1.2)
@@ -160,7 +160,7 @@ GEM
naturally (2.2.1) naturally (2.2.1)
optparse (0.1.1) optparse (0.1.1)
os (1.1.4) os (1.1.4)
plist (3.7.0) plist (3.6.0)
public_suffix (5.0.1) public_suffix (5.0.1)
rake (13.0.6) rake (13.0.6)
representable (3.2.0) representable (3.2.0)

View File

@@ -19,8 +19,8 @@ android {
applicationId "me.hackerchick.catima" applicationId "me.hackerchick.catima"
minSdk 21 minSdk 21
targetSdk 33 targetSdk 33
versionCode 120 versionCode 119
versionName "2.23.0" versionName "2.22.1"
vectorDrawables.useSupportLibrary true vectorDrawables.useSupportLibrary true
multiDexEnabled true multiDexEnabled true
@@ -100,7 +100,7 @@ dependencies {
// Third-party // Third-party
implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar' implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar'
implementation 'com.google.zxing:core:3.5.1' implementation 'com.google.zxing:core:3.5.1'
implementation 'org.apache.commons:commons-csv:1.9.0' implementation 'org.apache.commons:commons-csv:1.10.0'
implementation 'com.jaredrummler:colorpicker:1.1.0' implementation 'com.jaredrummler:colorpicker:1.1.0'
implementation 'com.github.invissvenska:NumberPickerPreference:1.0.4' implementation 'com.github.invissvenska:NumberPickerPreference:1.0.4'
implementation 'net.lingala.zip4j:zip4j:2.11.5' implementation 'net.lingala.zip4j:zip4j:2.11.5'
@@ -111,7 +111,7 @@ dependencies {
// Testing // Testing
testImplementation 'androidx.test:core:1.5.0' testImplementation 'androidx.test:core:1.5.0'
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
testImplementation 'org.robolectric:robolectric:4.10.3' testImplementation 'org.robolectric:robolectric:4.10'
} }
tasks.withType(SpotBugsTask) { tasks.withType(SpotBugsTask) {

View File

@@ -39,13 +39,6 @@ public class AboutActivity extends CatimaAppCompatActivity {
binding.privacy.setTag("https://catima.app/privacy-policy/"); binding.privacy.setTag("https://catima.app/privacy-policy/");
binding.reportError.setTag("https://github.com/CatimaLoyalty/Android/issues"); binding.reportError.setTag("https://github.com/CatimaLoyalty/Android/issues");
binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima"); binding.rate.setTag("https://play.google.com/store/apps/details?id=me.hackerchick.catima");
binding.donate.setTag("https://catima.app/contribute/#donating");
boolean installedFromGooglePlay = Utils.installedFromGooglePlay(this);
// Hide Google Play rate button if not on Google Play
binding.rate.setVisibility(installedFromGooglePlay ? View.VISIBLE : View.GONE);
// Hide donate button on Google Play (Google Play doesn't allow donation links)
binding.donate.setVisibility(installedFromGooglePlay ? View.GONE : View.VISIBLE);
bindClickListeners(); bindClickListeners();
} }
@@ -81,7 +74,6 @@ public class AboutActivity extends CatimaAppCompatActivity {
binding.privacy.setOnClickListener(openExternalBrowser); binding.privacy.setOnClickListener(openExternalBrowser);
binding.reportError.setOnClickListener(openExternalBrowser); binding.reportError.setOnClickListener(openExternalBrowser);
binding.rate.setOnClickListener(openExternalBrowser); binding.rate.setOnClickListener(openExternalBrowser);
binding.donate.setOnClickListener(openExternalBrowser);
binding.credits.setOnClickListener(view -> showCredits()); binding.credits.setOnClickListener(view -> showCredits());
} }
@@ -94,8 +86,6 @@ public class AboutActivity extends CatimaAppCompatActivity {
binding.privacy.setOnClickListener(null); binding.privacy.setOnClickListener(null);
binding.reportError.setOnClickListener(null); binding.reportError.setOnClickListener(null);
binding.rate.setOnClickListener(null); binding.rate.setOnClickListener(null);
binding.donate.setOnClickListener(null);
binding.credits.setOnClickListener(null); binding.credits.setOnClickListener(null);
} }

View File

@@ -1,5 +0,0 @@
package protect.card_locker;
public interface BarcodeImageWriterResultCallback {
void onBarcodeImageWriterResult(boolean success);
}

View File

@@ -42,12 +42,12 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
private final int imageHeight; private final int imageHeight;
private final int imageWidth; private final int imageWidth;
private final boolean showFallback; private final boolean showFallback;
private final BarcodeImageWriterResultCallback callback; private final Runnable callback;
BarcodeImageWriterTask( BarcodeImageWriterTask(
Context context, ImageView imageView, String cardIdString, Context context, ImageView imageView, String cardIdString,
CatimaBarcode barcodeFormat, TextView textView, CatimaBarcode barcodeFormat, TextView textView,
boolean showFallback, BarcodeImageWriterResultCallback callback, boolean roundCornerPadding boolean showFallback, Runnable callback, boolean roundCornerPadding
) { ) {
mContext = context; mContext = context;
@@ -282,7 +282,7 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
} }
if (callback != null) { if (callback != null) {
callback.onBarcodeImageWriterResult(isSuccesful); callback.run();
} }
} }

View File

@@ -17,6 +17,7 @@ import protect.card_locker.databinding.GroupLayoutBinding;
import protect.card_locker.preferences.Settings; import protect.card_locker.preferences.Settings;
public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder> { public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder> {
Settings mSettings;
public final Context mContext; public final Context mContext;
private final GroupAdapterListener mListener; private final GroupAdapterListener mListener;
SQLiteDatabase mDatabase; SQLiteDatabase mDatabase;
@@ -24,6 +25,7 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupAdapterListener inputListener) { public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupAdapterListener inputListener) {
super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER); super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER);
setHasStableIds(true); setHasStableIds(true);
mSettings = new Settings(inputContext);
mContext = inputContext; mContext = inputContext;
mListener = inputListener; mListener = inputListener;
mDatabase = new DBHelper(inputContext).getReadableDatabase(); mDatabase = new DBHelper(inputContext).getReadableDatabase();
@@ -61,6 +63,8 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
} }
inputHolder.mCardCount.setText(cardCountText); inputHolder.mCardCount.setText(cardCountText);
inputHolder.mName.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
inputHolder.mCardCount.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
applyClickEvents(inputHolder); applyClickEvents(inputHolder);
} }

View File

@@ -35,6 +35,7 @@ import protect.card_locker.preferences.Settings;
public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder> { public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder> {
private int mCurrentSelectedIndex = -1; private int mCurrentSelectedIndex = -1;
Settings mSettings;
boolean mDarkModeEnabled; boolean mDarkModeEnabled;
public final Context mContext; public final Context mContext;
private final CardAdapterListener mListener; private final CardAdapterListener mListener;
@@ -46,6 +47,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public LoyaltyCardCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener) { public LoyaltyCardCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener) {
super(inputCursor, DBHelper.LoyaltyCardDbIds.ID); super(inputCursor, DBHelper.LoyaltyCardDbIds.ID);
setHasStableIds(true); setHasStableIds(true);
mSettings = new Settings(inputContext);
mContext = inputContext; mContext = inputContext;
mListener = inputListener; mListener = inputListener;
mSelectedItems = new SparseBooleanArray(); mSelectedItems = new SparseBooleanArray();
@@ -105,6 +107,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor); LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(inputCursor);
inputHolder.setStoreField(loyaltyCard.store);
if (mShowDetails && !loyaltyCard.note.isEmpty()) { if (mShowDetails && !loyaltyCard.note.isEmpty()) {
inputHolder.setNoteField(loyaltyCard.note); inputHolder.setNoteField(loyaltyCard.note);
} else { } else {
@@ -129,8 +132,15 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.setExtraField(inputHolder.mExpiryField, null, null); inputHolder.setExtraField(inputHolder.mExpiryField, null, null);
} }
inputHolder.mCardIcon.setContentDescription(loyaltyCard.store); setHeaderHeight(inputHolder, mShowDetails);
Utils.setIconOrTextWithBackground(mContext, loyaltyCard, inputHolder.mCardIcon, inputHolder.mCardText); Bitmap cardIcon = Utils.retrieveCardImage(mContext, loyaltyCard.id, ImageLocationType.icon);
if (cardIcon != null) {
inputHolder.mCardIcon.setImageBitmap(cardIcon);
inputHolder.mCardIcon.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
inputHolder.mCardIcon.setImageBitmap(Utils.generateIcon(mContext, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile());
inputHolder.mCardIcon.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : androidx.appcompat.R.attr.colorPrimary); inputHolder.setIconBackgroundColor(loyaltyCard.headerColor != null ? loyaltyCard.headerColor : androidx.appcompat.R.attr.colorPrimary);
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition())); inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
@@ -143,6 +153,19 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
inputHolder.mRow.requestLayout(); inputHolder.mRow.requestLayout();
} }
private void setHeaderHeight(LoyaltyCardListItemViewHolder inputHolder, boolean expanded) {
int iconHeight;
if (expanded) {
iconHeight = ViewGroup.LayoutParams.MATCH_PARENT;
} else {
iconHeight = (int) mContext.getResources().getDimension(R.dimen.cardThumbnailSize);
}
inputHolder.mIconLayout.getLayoutParams().height = expanded ? 0 : iconHeight;
inputHolder.mCardIcon.getLayoutParams().height = iconHeight;
inputHolder.mTickIcon.getLayoutParams().height = iconHeight;
}
private void applyClickEvents(LoyaltyCardListItemViewHolder inputHolder, final int inputPosition) { private void applyClickEvents(LoyaltyCardListItemViewHolder inputHolder, final int inputPosition) {
inputHolder.mRow.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition)); inputHolder.mRow.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition));
@@ -218,25 +241,28 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder { public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder {
public TextView mCardText, mNoteField, mBalanceField, mValidFromField, mExpiryField; public TextView mStoreField, mNoteField, mBalanceField, mValidFromField, mExpiryField;
public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground; public ImageView mCardIcon, mStarBackground, mStarBorder, mTickIcon, mArchivedBackground;
public MaterialCardView mRow; public MaterialCardView mRow, mIconLayout;
public ConstraintLayout mStar, mArchived; public ConstraintLayout mStar, mArchived;
public View mDivider; public View mDivider;
private int mIconBackgroundColor; private int mIconBackgroundColor;
protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) { protected LoyaltyCardListItemViewHolder(LoyaltyCardLayoutBinding loyaltyCardLayoutBinding, CardAdapterListener inputListener) {
super(loyaltyCardLayoutBinding.getRoot()); super(loyaltyCardLayoutBinding.getRoot());
View inputView = loyaltyCardLayoutBinding.getRoot(); View inputView = loyaltyCardLayoutBinding.getRoot();
mRow = loyaltyCardLayoutBinding.row; mRow = loyaltyCardLayoutBinding.row;
mDivider = loyaltyCardLayoutBinding.infoDivider; mDivider = loyaltyCardLayoutBinding.infoDivider;
mStoreField = loyaltyCardLayoutBinding.store;
mNoteField = loyaltyCardLayoutBinding.note; mNoteField = loyaltyCardLayoutBinding.note;
mBalanceField = loyaltyCardLayoutBinding.balance; mBalanceField = loyaltyCardLayoutBinding.balance;
mValidFromField = loyaltyCardLayoutBinding.validFrom; mValidFromField = loyaltyCardLayoutBinding.validFrom;
mExpiryField = loyaltyCardLayoutBinding.expiry; mExpiryField = loyaltyCardLayoutBinding.expiry;
mIconLayout = loyaltyCardLayoutBinding.iconLayout;
mCardIcon = loyaltyCardLayoutBinding.thumbnail; mCardIcon = loyaltyCardLayoutBinding.thumbnail;
mCardText = loyaltyCardLayoutBinding.thumbnailText;
mStar = loyaltyCardLayoutBinding.star; mStar = loyaltyCardLayoutBinding.star;
mStarBackground = loyaltyCardLayoutBinding.starBackground; mStarBackground = loyaltyCardLayoutBinding.starBackground;
mStarBorder = loyaltyCardLayoutBinding.starBorder; mStarBorder = loyaltyCardLayoutBinding.starBorder;
@@ -259,15 +285,20 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
return; return;
} }
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
field.setVisibility(View.VISIBLE); field.setVisibility(View.VISIBLE);
field.setText(text); field.setText(text);
field.setTextSize(size);
field.setTextColor(color != null ? color : MaterialColors.getColor(mContext, com.google.android.material.R.attr.colorSecondary, ContextCompat.getColor(mContext, mDarkModeEnabled ? R.color.md_theme_dark_secondary : R.color.md_theme_light_secondary))); field.setTextColor(color != null ? color : MaterialColors.getColor(mContext, com.google.android.material.R.attr.colorSecondary, ContextCompat.getColor(mContext, mDarkModeEnabled ? R.color.md_theme_dark_secondary : R.color.md_theme_light_secondary)));
int drawableSize = dpToPx((size * 24) / 14, mContext);
mDivider.setVisibility(View.VISIBLE); mDivider.setVisibility(View.VISIBLE);
field.setVisibility(View.VISIBLE); field.setVisibility(View.VISIBLE);
Drawable icon = field.getCompoundDrawables()[0]; Drawable icon = field.getCompoundDrawables()[0];
if (icon != null) { if (icon != null) {
icon.mutate(); icon.mutate();
icon.setBounds(0, 0, drawableSize, drawableSize);
field.setCompoundDrawablesRelative(icon, null, null, null); field.setCompoundDrawablesRelative(icon, null, null, null);
if (color != null) { if (color != null) {
@@ -280,12 +311,19 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
field.requestLayout(); field.requestLayout();
} }
public void setStoreField(String text) {
mStoreField.setText(text);
mStoreField.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont()));
mStoreField.requestLayout();
}
public void setNoteField(String text) { public void setNoteField(String text) {
if (text == null) { if (text == null) {
mNoteField.setVisibility(View.GONE); mNoteField.setVisibility(View.GONE);
} else { } else {
mNoteField.setVisibility(View.VISIBLE); mNoteField.setVisibility(View.VISIBLE);
mNoteField.setText(text); mNoteField.setText(text);
mNoteField.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont()));
} }
mNoteField.requestLayout(); mNoteField.requestLayout();
} }

View File

@@ -83,7 +83,7 @@ import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.LayoutChipChoiceBinding; import protect.card_locker.databinding.LayoutChipChoiceBinding;
import protect.card_locker.databinding.LoyaltyCardEditActivityBinding; import protect.card_locker.databinding.LoyaltyCardEditActivityBinding;
public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements BarcodeImageWriterResultCallback { public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
private LoyaltyCardEditActivityBinding binding; private LoyaltyCardEditActivityBinding binding;
private static final String TAG = "Catima"; private static final String TAG = "Catima";
@@ -169,6 +169,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
AlertDialog confirmExitDialog = null; AlertDialog confirmExitDialog = null;
boolean validBalance = true; boolean validBalance = true;
Runnable barcodeImageGenerationFinishedCallback;
HashMap<String, Currency> currencies = new HashMap<>(); HashMap<String, Currency> currencies = new HashMap<>();
LoyaltyCard tempLoyaltyCard; LoyaltyCard tempLoyaltyCard;
@@ -346,6 +348,13 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
enterButton = binding.enterButton; enterButton = binding.enterButton;
barcodeImageGenerationFinishedCallback = () -> {
if (!(boolean) barcodeImage.getTag()) {
barcodeImageLayout.setVisibility(View.GONE);
Toast.makeText(LoyaltyCardEditActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
}
};
storeFieldEdit.addTextChangedListener(new SimpleTextWatcher() { storeFieldEdit.addTextChangedListener(new SimpleTextWatcher() {
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
@@ -1120,12 +1129,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
Uri photoURI = FileProvider.getUriForFile(LoyaltyCardEditActivity.this, BuildConfig.APPLICATION_ID, Utils.createTempFile(this, TEMP_CAMERA_IMAGE_NAME)); Uri photoURI = FileProvider.getUriForFile(LoyaltyCardEditActivity.this, BuildConfig.APPLICATION_ID, Utils.createTempFile(this, TEMP_CAMERA_IMAGE_NAME));
mRequestedImage = type; mRequestedImage = type;
try {
mPhotoTakerLauncher.launch(photoURI); mPhotoTakerLauncher.launch(photoURI);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.cameraPermissionDeniedTitle, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
} }
private void selectImageFromGallery(int type) { private void selectImageFromGallery(int type) {
@@ -1146,14 +1150,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
} }
} }
@Override
public void onBarcodeImageWriterResult(boolean success) {
if (!success) {
barcodeImageLayout.setVisibility(View.GONE);
Toast.makeText(LoyaltyCardEditActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
}
}
class EditCardIdAndBarcode implements View.OnClickListener { class EditCardIdAndBarcode implements View.OnClickListener {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@@ -1551,13 +1547,13 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this); barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known"); Log.d(TAG, "ImageView size now known");
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, LoyaltyCardEditActivity.this, true); BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, barcodeImageGenerationFinishedCallback, true);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
} }
}); });
} else { } else {
Log.d(TAG, "ImageView size known known, creating barcode"); Log.d(TAG, "ImageView size known known, creating barcode");
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, this, true); BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, barcodeImageGenerationFinishedCallback, true);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
} }
} }

View File

@@ -9,6 +9,8 @@ import android.content.res.Configuration;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.Rect;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@@ -21,10 +23,13 @@ import android.text.style.ForegroundColorSpan;
import android.text.util.Linkify; import android.text.util.Linkify;
import android.util.Log; import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.view.Window; import android.view.Window;
import android.view.WindowInsets; import android.view.WindowInsets;
@@ -42,17 +47,23 @@ import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Guideline;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.FileProvider; import androidx.core.content.FileProvider;
import androidx.core.graphics.BlendModeColorFilterCompat; import androidx.core.graphics.BlendModeColorFilterCompat;
import androidx.core.graphics.BlendModeCompat; import androidx.core.graphics.BlendModeCompat;
import androidx.core.graphics.ColorUtils; import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsControllerCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import androidx.core.widget.TextViewCompat; import androidx.core.widget.TextViewCompat;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.bottomappbar.BottomAppBar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputEditText;
import java.io.File; import java.io.File;
@@ -71,10 +82,31 @@ import protect.card_locker.async.TaskHandler;
import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding; import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding;
import protect.card_locker.preferences.Settings; import protect.card_locker.preferences.Settings;
public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements BarcodeImageWriterResultCallback { public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements GestureDetector.OnGestureListener {
private LoyaltyCardViewLayoutBinding binding; private LoyaltyCardViewLayoutBinding binding;
private static final String TAG = "Catima"; private static final String TAG = "Catima";
private GestureDetector mGestureDetector;
CoordinatorLayout coordinatorLayout;
ConstraintLayout mainLayout;
TextView cardIdFieldView;
BottomAppBar bottomAppBar;
ImageButton bottomAppBarInfoButton;
ImageButton bottomAppBarPreviousButton;
ImageButton bottomAppBarNextButton;
ImageButton bottomAppBarUpdateBalanceButton;
AppCompatTextView storeName;
ImageButton maximizeButton;
ImageView mainImage;
LinearLayout dotIndicator;
ImageButton minimizeButton;
View collapsingToolbarLayout;
AppBarLayout appBarLayout;
ImageView iconImage;
Toolbar portraitToolbar;
Toolbar landscapeToolbar;
int loyaltyCardId; int loyaltyCardId;
ArrayList<Integer> cardList; ArrayList<Integer> cardList;
@@ -89,36 +121,56 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
String barcodeIdString; String barcodeIdString;
CatimaBarcode format; CatimaBarcode format;
FloatingActionButton editButton;
Guideline centerGuideline;
SeekBar barcodeScaler;
Bitmap frontImageBitmap; Bitmap frontImageBitmap;
Bitmap backImageBitmap; Bitmap backImageBitmap;
boolean starred;
boolean backgroundNeedsDarkIcons; boolean backgroundNeedsDarkIcons;
boolean isFullscreen = false; boolean isFullscreen = false;
ImageView barcodeRenderTarget;
int mainImageIndex = 0; int mainImageIndex = 0;
List<ImageType> imageTypes; List<ImageType> imageTypes;
private ImageView[] dots;
boolean isBarcodeSupported = true; boolean isBarcodeSupported = true;
static final String STATE_IMAGEINDEX = "imageIndex"; static final String STATE_IMAGEINDEX = "imageIndex";
static final String STATE_FULLSCREEN = "isFullscreen"; static final String STATE_FULLSCREEN = "isFullscreen";
private final int HEADER_FILTER_ALPHA = 127;
final private TaskHandler mTasks = new TaskHandler(); final private TaskHandler mTasks = new TaskHandler();
Runnable barcodeImageGenerationFinishedCallback; Runnable barcodeImageGenerationFinishedCallback;
public void onMainImageTap() { @Override
// If we're in fullscreen, leave fullscreen public boolean onDown(MotionEvent e) {
if (isFullscreen) { return true;
setFullscreen(false);
return;
} }
// If the barcode is shown, switch to fullscreen layout @Override
if (imageTypes.get(mainImageIndex) == ImageType.BARCODE) { public void onShowPress(MotionEvent e) {
setFullscreen(true);
return;
} }
// If this is an image, open it in the gallery. @Override
public boolean onSingleTapUp(MotionEvent e) {
if (imageTypes.size() > 1) {
Toast.makeText(this, getString(R.string.swipeToSwitchImages), Toast.LENGTH_SHORT).show();
}
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
openCurrentMainImageInGallery(); openCurrentMainImageInGallery();
} }
@@ -160,17 +212,46 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} }
@Override @Override
public void onBarcodeImageWriterResult(boolean success) { public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (!success) { Log.d(TAG, "On fling");
imageTypes.remove(ImageType.BARCODE);
setStateBasedOnImageTypes(); if (Math.abs(velocityY) > (0.75 * Math.abs(velocityX))) {
// Vertical swipe
// Call correct drawMainImage // Swipe up
setFullscreen(isFullscreen); if (velocityY < -150) {
if (!isFullscreen) {
Toast.makeText(LoyaltyCardViewActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show(); setFullscreen(true);
} }
return false;
}
// Swipe down
if (velocityY > 150) {
if (isFullscreen) {
setFullscreen(false);
}
return false;
}
} else if (Math.abs(velocityX) > (0.75 * Math.abs(velocityY))) {
// Horizontal swipe
// Swipe right
if (velocityX < -150) {
setMainImage(true, false);
return false;
}
// Swipe left
if (velocityX > 150) {
setMainImage(false, false);
return false;
}
}
if (imageTypes.size() > 1) {
Toast.makeText(this, getString(R.string.swipeToSwitchImages), Toast.LENGTH_SHORT).show();
}
return true;
} }
enum ImageType { enum ImageType {
@@ -187,13 +268,40 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
Log.d(TAG, "View activity: id=" + loyaltyCardId); Log.d(TAG, "View activity: id=" + loyaltyCardId);
} }
private void setScalerGuideline(int zoomLevel) { private Drawable getDotIcon(boolean active, boolean darkMode) {
Drawable unwrappedIcon = AppCompatResources.getDrawable(this, active ? R.drawable.active_dot : R.drawable.inactive_dot);
assert unwrappedIcon != null;
Drawable wrappedIcon = DrawableCompat.wrap(unwrappedIcon);
if (darkMode) {
DrawableCompat.setTint(wrappedIcon, Color.WHITE);
} else {
DrawableCompat.setTint(wrappedIcon, Color.BLACK);
}
return wrappedIcon;
}
private Drawable getIcon(int icon, boolean dark) {
Drawable unwrappedIcon = AppCompatResources.getDrawable(this, icon);
assert unwrappedIcon != null;
Drawable wrappedIcon = DrawableCompat.wrap(unwrappedIcon);
wrappedIcon.mutate();
if (dark) {
DrawableCompat.setTint(wrappedIcon, Color.BLACK);
} else {
DrawableCompat.setTintList(wrappedIcon, null);
}
return wrappedIcon;
}
private void setCenterGuideline(int zoomLevel) {
float scale = zoomLevel / 100f; float scale = zoomLevel / 100f;
if (format != null && format.isSquare()) { if (format != null && format.isSquare()) {
binding.scalerGuideline.setGuidelinePercent(0.75f * scale); centerGuideline.setGuidelinePercent(0.75f * scale);
} else { } else {
binding.scalerGuideline.setGuidelinePercent(0.5f * scale); centerGuideline.setGuidelinePercent(0.5f * scale);
} }
} }
@@ -221,9 +329,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
binding = LoyaltyCardViewLayoutBinding.inflate(getLayoutInflater()); binding = LoyaltyCardViewLayoutBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
settings = new Settings(this); settings = new Settings(this);
@@ -250,7 +355,43 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
database = new DBHelper(this).getWritableDatabase(); database = new DBHelper(this).getWritableDatabase();
importURIHelper = new ImportURIHelper(this); importURIHelper = new ImportURIHelper(this);
binding.barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { coordinatorLayout = binding.coordinatorLayout;
mainLayout = binding.mainLayout;
cardIdFieldView = binding.cardIdView;
storeName = binding.storeName;
maximizeButton = binding.maximizeButton;
mainImage = binding.mainImage;
mainImage.setClipToOutline(true);
dotIndicator = binding.dotIndicator;
minimizeButton = binding.minimizeButton;
collapsingToolbarLayout = binding.collapsingToolbarLayout;
appBarLayout = binding.appBarLayout;
bottomAppBar = binding.bottomAppBar;
iconImage = binding.iconImage;
portraitToolbar = binding.toolbar;
landscapeToolbar = binding.toolbarLandscape;
bottomAppBarInfoButton = binding.buttonShowInfo;
bottomAppBarPreviousButton = binding.buttonPrevious;
bottomAppBarNextButton = binding.buttonNext;
bottomAppBarUpdateBalanceButton = binding.buttonUpdateBalance;
barcodeImageGenerationFinishedCallback = () -> {
if (!(boolean) mainImage.getTag()) {
mainImage.setVisibility(View.GONE);
imageTypes.remove(ImageType.BARCODE);
// Redraw UI
setDotIndicator(Utils.isDarkModeEnabled(LoyaltyCardViewActivity.this));
setFullscreen(isFullscreen);
Toast.makeText(LoyaltyCardViewActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
}
};
centerGuideline = binding.centerGuideline;
barcodeScaler = binding.barcodeScaler;
barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (!fromUser) { if (!fromUser) {
@@ -258,14 +399,14 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return; return;
} }
Log.d(TAG, "Progress is " + progress); Log.d(TAG, "Progress is " + progress);
Log.d(TAG, "Max is " + binding.barcodeScaler.getMax()); Log.d(TAG, "Max is " + barcodeScaler.getMax());
float scale = (float) progress / (float) binding.barcodeScaler.getMax(); float scale = (float) progress / (float) barcodeScaler.getMax();
Log.d(TAG, "Scaling to " + scale); Log.d(TAG, "Scaling to " + scale);
loyaltyCard.zoomLevel = progress; loyaltyCard.zoomLevel = progress;
DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel); DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel);
setScalerGuideline(loyaltyCard.zoomLevel); setCenterGuideline(loyaltyCard.zoomLevel);
drawMainImage(mainImageIndex, true, isFullscreen); drawMainImage(mainImageIndex, true, isFullscreen);
} }
@@ -283,9 +424,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
rotationEnabled = true; rotationEnabled = true;
binding.fullscreenButtonMinimize.setOnClickListener(v -> setFullscreen(false)); // Allow making barcode fullscreen on tap
maximizeButton.setOnClickListener(v -> setFullscreen(true));
minimizeButton.setOnClickListener(v -> setFullscreen(false));
binding.fabEdit.setOnClickListener(v -> { editButton = binding.fabEdit;
editButton.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt("id", loyaltyCardId); bundle.putInt("id", loyaltyCardId);
@@ -294,21 +438,35 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
startActivity(intent); startActivity(intent);
finish(); finish();
}); });
binding.fabEdit.bringToFront(); editButton.bringToFront();
binding.bottomAppBarInfoButton.setOnClickListener(view -> showInfoDialog()); appBarLayout.setOutlineProvider(new ViewOutlineProvider() {
binding.bottomAppBarPreviousButton.setOnClickListener(view -> prevNextCard(false)); @Override
binding.bottomAppBarNextButton.setOnClickListener(view -> prevNextCard(true)); public void getOutline(View view, Outline outline) {
binding.bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog()); ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
outline.setAlpha(0f);
binding.mainImage.setOnClickListener(view -> onMainImageTap()); }
// This long-press was originally only intended for when Talkback was used but sadly limiting
// this doesn't seem to work well
binding.mainImage.setOnLongClickListener(view -> {
setMainImage(true, true);
return true;
}); });
binding.fullscreenImage.setOnClickListener(view -> onMainImageTap());
bottomAppBarInfoButton.setOnClickListener(view -> showInfoDialog());
bottomAppBarPreviousButton.setOnClickListener(view -> prevNextCard(false));
bottomAppBarNextButton.setOnClickListener(view -> prevNextCard(true));
bottomAppBarUpdateBalanceButton.setOnClickListener(view -> showBalanceUpdateDialog());
mGestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
mainImage.setOnTouchListener(gestureTouchListener);
appBarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
iconImage.setLayoutParams(new CoordinatorLayout.LayoutParams(
CoordinatorLayout.LayoutParams.MATCH_PARENT, appBarLayout.getHeight())
);
iconImage.setClipBounds(new Rect(left, top, right, bottom));
}
});
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
} }
private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) { private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) {
@@ -335,6 +493,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
dialogContentPadding, dialogContentPadding,
dialogTitlePadding dialogTitlePadding
); );
infoTitleView.setTextSize(settings.getFontSizeMax(settings.getMediumFont()));
infoTitleView.setText(loyaltyCard.store); infoTitleView.setText(loyaltyCard.store);
infoDialog.setCustomTitle(infoTitleView); infoDialog.setCustomTitle(infoTitleView);
infoDialog.setTitle(loyaltyCard.store); infoDialog.setTitle(loyaltyCard.store);
@@ -471,20 +630,20 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void setBottomAppBarButtonState() { private void setBottomAppBarButtonState() {
if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.validFrom != null || loyaltyCard.expiry != null) { if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.validFrom != null || loyaltyCard.expiry != null) {
binding.bottomAppBarInfoButton.setVisibility(View.VISIBLE); bottomAppBarInfoButton.setVisibility(View.VISIBLE);
} else { } else {
binding.bottomAppBarInfoButton.setVisibility(View.GONE); bottomAppBarInfoButton.setVisibility(View.GONE);
} }
if (cardList == null || cardList.size() == 1) { if (cardList == null || cardList.size() == 1) {
binding.bottomAppBarPreviousButton.setVisibility(View.GONE); bottomAppBarPreviousButton.setVisibility(View.GONE);
binding.bottomAppBarNextButton.setVisibility(View.GONE); bottomAppBarNextButton.setVisibility(View.GONE);
} else { } else {
binding.bottomAppBarPreviousButton.setVisibility(View.VISIBLE); bottomAppBarPreviousButton.setVisibility(View.VISIBLE);
binding.bottomAppBarNextButton.setVisibility(View.VISIBLE); bottomAppBarNextButton.setVisibility(View.VISIBLE);
} }
binding.bottomAppBarUpdateBalanceButton.setVisibility(hasBalance(loyaltyCard) ? View.VISIBLE : View.GONE); bottomAppBarUpdateBalanceButton.setVisibility(hasBalance(loyaltyCard) ? View.VISIBLE : View.GONE);
} }
private void prevNextCard(boolean next) { private void prevNextCard(boolean next) {
@@ -579,8 +738,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return; return;
} }
setTitle(loyaltyCard.store);
loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId); loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId);
setupOrientation(); setupOrientation();
@@ -589,7 +746,19 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
cardIdString = loyaltyCard.cardId; cardIdString = loyaltyCard.cardId;
barcodeIdString = loyaltyCard.barcodeId; barcodeIdString = loyaltyCard.barcodeId;
binding.cardIdView.setText(loyaltyCard.cardId); cardIdFieldView.setText(loyaltyCard.cardId);
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(cardIdFieldView,
settings.getFontSizeMin(settings.getLargeFont()), settings.getFontSizeMax(settings.getLargeFont()),
1, TypedValue.COMPLEX_UNIT_SP);
storeName.setText(loyaltyCard.store);
storeName.setTextSize(settings.getFontSizeMax(settings.getLargeFont()));
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
storeName,
settings.getFontSizeMin(settings.getLargeFont()),
settings.getFontSizeMax(settings.getLargeFont()),
1,
TypedValue.COMPLEX_UNIT_DIP);
int backgroundHeaderColor; int backgroundHeaderColor;
if (loyaltyCard.headerColor != null) { if (loyaltyCard.headerColor != null) {
@@ -598,29 +767,72 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
backgroundHeaderColor = LetterBitmap.getDefaultColor(this, loyaltyCard.store); backgroundHeaderColor = LetterBitmap.getDefaultColor(this, loyaltyCard.store);
} }
int textColor;
if (Utils.needsDarkForeground(backgroundHeaderColor)) {
textColor = Color.BLACK;
} else {
textColor = Color.WHITE;
}
storeName.setTextColor(textColor);
landscapeToolbar.setTitleTextColor(textColor);
// Also apply colours to UI elements // Also apply colours to UI elements
int darkenedColor = ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.1f); int darkenedColor = ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.1f);
binding.barcodeScaler.setProgressTintList(ColorStateList.valueOf(darkenedColor)); barcodeScaler.setProgressTintList(ColorStateList.valueOf(darkenedColor));
binding.barcodeScaler.setThumbTintList(ColorStateList.valueOf(darkenedColor)); barcodeScaler.setThumbTintList(ColorStateList.valueOf(darkenedColor));
binding.bottomAppBar.setBackgroundColor(darkenedColor); maximizeButton.setBackgroundColor(darkenedColor);
minimizeButton.setBackgroundColor(darkenedColor);
bottomAppBar.setBackgroundColor(darkenedColor);
maximizeButton.setColorFilter(textColor);
minimizeButton.setColorFilter(textColor);
int complementaryColor = Utils.getComplementaryColor(darkenedColor); int complementaryColor = Utils.getComplementaryColor(darkenedColor);
binding.fabEdit.setBackgroundTintList(ColorStateList.valueOf(complementaryColor)); editButton.setBackgroundTintList(ColorStateList.valueOf(complementaryColor));
Drawable editButtonIcon = binding.fabEdit.getDrawable(); Drawable editButtonIcon = editButton.getDrawable();
editButtonIcon.mutate(); editButtonIcon.mutate();
editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE); editButtonIcon.setTint(Utils.needsDarkForeground(complementaryColor) ? Color.BLACK : Color.WHITE);
binding.fabEdit.setImageDrawable(editButtonIcon); editButton.setImageDrawable(editButtonIcon);
Utils.setIconOrTextWithBackground(this, loyaltyCard, binding.iconImage, binding.iconText); Bitmap icon = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon);
if (icon != null) {
int backgroundAlphaColor = Utils.needsDarkForeground(backgroundHeaderColor) ? Color.WHITE : Color.BLACK;
Log.d("onResume", "setting icon image");
iconImage.setImageBitmap(icon);
int backgroundWithAlpha = Color.argb(HEADER_FILTER_ALPHA, Color.red(backgroundAlphaColor), Color.green(backgroundAlphaColor), Color.blue(backgroundAlphaColor));
// for images that has alpha
appBarLayout.setBackgroundColor(backgroundWithAlpha);
} else {
Bitmap plain = Bitmap.createBitmap(new int[]{backgroundHeaderColor}, 1, 1, Bitmap.Config.ARGB_8888);
iconImage.setImageBitmap(plain);
appBarLayout.setBackgroundColor(Color.TRANSPARENT);
}
// If the background is very bright, we should use dark icons // If the background is very bright, we should use dark icons
backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor); backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeAsUpIndicator(getIcon(R.drawable.home_arrow_back_white, backgroundNeedsDarkIcons));
}
fixBottomAppBarImageButtonColor(binding.bottomAppBarInfoButton); fixImageButtonColor(bottomAppBarInfoButton);
fixBottomAppBarImageButtonColor(binding.bottomAppBarPreviousButton); fixImageButtonColor(bottomAppBarPreviousButton);
fixBottomAppBarImageButtonColor(binding.bottomAppBarNextButton); fixImageButtonColor(bottomAppBarNextButton);
fixBottomAppBarImageButtonColor(binding.bottomAppBarUpdateBalanceButton); fixImageButtonColor(bottomAppBarUpdateBalanceButton);
setBottomAppBarButtonState(); setBottomAppBarButtonState();
// Make notification area light if dark icons are needed
if (Build.VERSION.SDK_INT >= 23) {
View decorView = getWindow().getDecorView();
WindowInsetsControllerCompat wic = new WindowInsetsControllerCompat(getWindow(), decorView);
wic.setAppearanceLightStatusBars(backgroundNeedsDarkIcons);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
// Darken statusbar if icons won't be visible otherwise
window.setStatusBarColor(backgroundNeedsDarkIcons ? ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.15f) : Color.TRANSPARENT);
}
// Set shadow colour of store text so even same color on same color would be readable
storeName.setShadowLayer(1, 1, 1, backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE);
if (format != null && !format.isSupported()) { if (format != null && !format.isSupported()) {
isBarcodeSupported = false; isBarcodeSupported = false;
@@ -645,29 +857,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
imageTypes.add(ImageType.IMAGE_BACK); imageTypes.add(ImageType.IMAGE_BACK);
} }
setStateBasedOnImageTypes(); setDotIndicator(Utils.isDarkModeEnabled(this));
setFullscreen(isFullscreen); setFullscreen(isFullscreen);
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id); DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
invalidateOptionsMenu();
}
private void setStateBasedOnImageTypes() {
// Decrease the card holder size to only fit the value if there is no barcode
// This looks much cleaner
ViewGroup.LayoutParams cardHolderLayoutParams = binding.cardHolder.getLayoutParams();
if (imageTypes.isEmpty()) {
cardHolderLayoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
} else {
cardHolderLayoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
}
binding.cardHolder.setLayoutParams(cardHolderLayoutParams);
// Ensure buttons and accessibility are correct
setMainImagePreviousNextButtons();
setMainImageAccessibility();
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@@ -676,7 +870,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
} }
private void fixBottomAppBarImageButtonColor(ImageButton imageButton) { private void fixImageButtonColor(ImageButton imageButton) {
imageButton.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE, BlendModeCompat.SRC_ATOP)); imageButton.setColorFilter(BlendModeColorFilterCompat.createBlendModeColorFilterCompat(backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE, BlendModeCompat.SRC_ATOP));
} }
@@ -693,6 +887,18 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.card_view_menu, menu); getMenuInflater().inflate(R.menu.card_view_menu, menu);
starred = loyaltyCard.starStatus != 0;
if (loyaltyCard.archiveStatus != 0) {
menu.findItem(R.id.action_unarchive).setVisible(true);
menu.findItem(R.id.action_archive).setVisible(false);
} else {
menu.findItem(R.id.action_unarchive).setVisible(false);
menu.findItem(R.id.action_archive).setVisible(true);
}
menu.findItem(R.id.action_overflow).setIcon(getIcon(R.drawable.ic_overflow_menu, backgroundNeedsDarkIcons));
menu.findItem(R.id.action_share).setIcon(getIcon(R.drawable.ic_share_white, backgroundNeedsDarkIcons));
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@@ -701,27 +907,13 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
@Override @Override
public boolean onPrepareOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu); super.onPrepareOptionsMenu(menu);
if (starred) {
if (loyaltyCard != null) { menu.findItem(R.id.action_star_unstar).setIcon(getIcon(R.drawable.ic_starred_white, backgroundNeedsDarkIcons));
// Update star status
if (loyaltyCard.starStatus == 1) {
menu.findItem(R.id.action_star_unstar).setIcon(R.drawable.ic_starred);
menu.findItem(R.id.action_star_unstar).setTitle(R.string.unstar); menu.findItem(R.id.action_star_unstar).setTitle(R.string.unstar);
} else { } else {
menu.findItem(R.id.action_star_unstar).setIcon(R.drawable.ic_unstarred); menu.findItem(R.id.action_star_unstar).setIcon(getIcon(R.drawable.ic_unstarred_white, backgroundNeedsDarkIcons));
menu.findItem(R.id.action_star_unstar).setTitle(R.string.star); menu.findItem(R.id.action_star_unstar).setTitle(R.string.star);
} }
// Update archive/unarchive button
if (loyaltyCard.archiveStatus != 0) {
menu.findItem(R.id.action_unarchive).setVisible(true);
menu.findItem(R.id.action_archive).setVisible(false);
} else {
menu.findItem(R.id.action_unarchive).setVisible(false);
menu.findItem(R.id.action_archive).setVisible(true);
}
}
return true; return true;
} }
@@ -750,11 +942,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
return true; return true;
} else if (id == R.id.action_star_unstar) { } else if (id == R.id.action_star_unstar) {
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, loyaltyCard.starStatus == 0 ? 1 : 0); starred = !starred;
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0);
// Re-init loyaltyCard with new data from DB // Re-init loyaltyCard with new data from DB
onResume(); onResume();
invalidateOptionsMenu();
return true; return true;
} else if (id == R.id.action_archive) { } else if (id == R.id.action_archive) {
@@ -763,7 +955,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// Re-init loyaltyCard with new data from DB // Re-init loyaltyCard with new data from DB
onResume(); onResume();
invalidateOptionsMenu();
return true; return true;
} else if (id == R.id.action_unarchive) { } else if (id == R.id.action_unarchive) {
@@ -772,7 +963,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
// Re-init loyaltyCard with new data from DB // Re-init loyaltyCard with new data from DB
onResume(); onResume();
invalidateOptionsMenu();
return true; return true;
} else if (id == R.id.action_delete) { } else if (id == R.id.action_delete) {
@@ -803,10 +993,23 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
int orientation = getResources().getConfiguration().orientation; int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) { if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.d(TAG, "Detected landscape mode"); Log.d(TAG, "Detected landscape mode");
binding.iconContainer.setVisibility(View.GONE); setTitle(loyaltyCard.store);
collapsingToolbarLayout.setVisibility(View.GONE);
portraitToolbar.setVisibility(View.GONE);
landscapeToolbar.setVisibility(View.VISIBLE);
setSupportActionBar(landscapeToolbar);
} else { } else {
Log.d(TAG, "Detected portrait mode"); Log.d(TAG, "Detected portrait mode");
binding.iconContainer.setVisibility(View.VISIBLE);
setTitle("");
collapsingToolbarLayout.setVisibility(View.VISIBLE);
portraitToolbar.setVisibility(View.VISIBLE);
landscapeToolbar.setVisibility(View.GONE);
setSupportActionBar(portraitToolbar);
} }
enableToolbarBackButton(); enableToolbarBackButton();
@@ -814,16 +1017,15 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void drawBarcode(boolean addPadding) { private void drawBarcode(boolean addPadding) {
mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false); mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false);
if (format != null) { if (format != null) {
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask( BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(
getApplicationContext(), getApplicationContext(),
barcodeRenderTarget, mainImage,
barcodeIdString != null ? barcodeIdString : cardIdString, barcodeIdString != null ? barcodeIdString : cardIdString,
format, format,
null, null,
false, false,
this, barcodeImageGenerationFinishedCallback,
addPadding); addPadding);
mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
} }
@@ -831,11 +1033,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void redrawBarcodeAfterResize(boolean addPadding) { private void redrawBarcodeAfterResize(boolean addPadding) {
if (format != null) { if (format != null) {
barcodeRenderTarget.getViewTreeObserver().addOnGlobalLayoutListener( mainImage.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() { new ViewTreeObserver.OnGlobalLayoutListener() {
@Override @Override
public void onGlobalLayout() { public void onGlobalLayout() {
barcodeRenderTarget.getViewTreeObserver().removeOnGlobalLayoutListener(this); mainImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known"); Log.d(TAG, "ImageView size now known");
drawBarcode(addPadding); drawBarcode(addPadding);
@@ -846,18 +1048,25 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void drawMainImage(int index, boolean waitForResize, boolean isFullscreen) { private void drawMainImage(int index, boolean waitForResize, boolean isFullscreen) {
if (imageTypes.isEmpty()) { if (imageTypes.isEmpty()) {
barcodeRenderTarget.setVisibility(View.GONE); mainImage.setVisibility(View.GONE);
return; return;
} }
if (dots != null) {
boolean darkMode = Utils.isDarkModeEnabled(getApplicationContext());
for (int i = 0; i < dots.length; i++) {
dots[i].setImageDrawable(getDotIcon(i == index, darkMode));
}
}
ImageType wantedImageType = imageTypes.get(index); ImageType wantedImageType = imageTypes.get(index);
if (wantedImageType == ImageType.BARCODE) { if (wantedImageType == ImageType.BARCODE) {
// Use border in non-fullscreen mode // Use border in non-fullscreen mode
if (!isFullscreen) { if (!isFullscreen) {
barcodeRenderTarget.setBackground(AppCompatResources.getDrawable(this, R.drawable.round_outline)); mainImage.setBackground(AppCompatResources.getDrawable(this, R.drawable.round_outline));
} else { } else {
barcodeRenderTarget.setBackgroundColor(Color.WHITE); mainImage.setBackgroundColor(Color.WHITE);
} }
if (waitForResize) { if (waitForResize) {
@@ -866,20 +1075,20 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
drawBarcode(!isFullscreen); drawBarcode(!isFullscreen);
} }
barcodeRenderTarget.setContentDescription(getString(R.string.barcodeImageDescriptionWithType, format.prettyName())); mainImage.setContentDescription(getString(R.string.barcodeImageDescriptionWithType, format.prettyName()));
} else if (wantedImageType == ImageType.IMAGE_FRONT) { } else if (wantedImageType == ImageType.IMAGE_FRONT) {
barcodeRenderTarget.setImageBitmap(frontImageBitmap); mainImage.setImageBitmap(frontImageBitmap);
barcodeRenderTarget.setBackgroundColor(Color.TRANSPARENT); mainImage.setBackgroundColor(Color.TRANSPARENT);
barcodeRenderTarget.setContentDescription(getString(R.string.frontImageDescription)); mainImage.setContentDescription(getString(R.string.frontImageDescription));
} else if (wantedImageType == ImageType.IMAGE_BACK) { } else if (wantedImageType == ImageType.IMAGE_BACK) {
barcodeRenderTarget.setImageBitmap(backImageBitmap); mainImage.setImageBitmap(backImageBitmap);
barcodeRenderTarget.setBackgroundColor(Color.TRANSPARENT); mainImage.setBackgroundColor(Color.TRANSPARENT);
barcodeRenderTarget.setContentDescription(getString(R.string.backImageDescription)); mainImage.setContentDescription(getString(R.string.backImageDescription));
} else { } else {
throw new IllegalArgumentException("Unknown image type: " + wantedImageType); throw new IllegalArgumentException("Unknown image type: " + wantedImageType);
} }
barcodeRenderTarget.setVisibility(View.VISIBLE); mainImage.setVisibility(View.VISIBLE);
} }
private void setMainImage(boolean next, boolean overflow) { private void setMainImage(boolean next, boolean overflow) {
@@ -896,85 +1105,24 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
mainImageIndex = newIndex; mainImageIndex = newIndex;
drawMainImage(newIndex, false, isFullscreen); drawMainImage(newIndex, false, isFullscreen);
setMainImagePreviousNextButtons();
setMainImageAccessibility();
} }
private void setMainImageAccessibility() { private void setDotIndicator(boolean darkMode) {
// Single-click actions dotIndicator.removeAllViews();
if (mainImageIndex == 0) { if (imageTypes.size() >= 2) {
ViewCompat.replaceAccessibilityAction( dots = new ImageView[imageTypes.size()];
binding.mainImage,
AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK, for (int i = 0; i < imageTypes.size(); i++) {
getString(R.string.moveBarcodeToTopOfScreen), dots[i] = new ImageView(this);
null dots[i].setImageDrawable(getDotIcon(false, darkMode));
);
} else { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
int accessibilityClickAction; params.setMargins(8, 0, 8, 0);
if (mainImageIndex == 1) {
accessibilityClickAction = R.string.openFrontImageInGalleryApp; dotIndicator.addView(dots[i], params);
} else if (mainImageIndex == 2) {
accessibilityClickAction = R.string.openBackImageInGalleryApp;
} else {
throw new IndexOutOfBoundsException("setMainImageAccessibility was out of range (action_click)");
} }
ViewCompat.replaceAccessibilityAction( dotIndicator.setVisibility(View.VISIBLE);
binding.mainImage,
AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
getString(accessibilityClickAction),
null
);
}
// Long-press actions
int accessibilityLongPressAction;
if (mainImageIndex == 0) {
accessibilityLongPressAction = R.string.switchToFrontImage;
} else if (mainImageIndex == 1) {
accessibilityLongPressAction = R.string.switchToBackImage;
} else if (mainImageIndex == 2) {
accessibilityLongPressAction = R.string.switchToBarcode;
} else {
throw new IndexOutOfBoundsException("setMainImageAccessibility was out of range (action_long_click)");
}
ViewCompat.replaceAccessibilityAction(
binding.mainImage,
AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_LONG_CLICK,
getString(accessibilityLongPressAction),
null
);
}
private void setMainImagePreviousNextButtons() {
if (imageTypes.size() < 2) {
binding.mainLeftButton.setVisibility(View.INVISIBLE);
binding.mainRightButton.setVisibility(View.INVISIBLE);
binding.mainLeftButton.setOnClickListener(null);
binding.mainRightButton.setOnClickListener(null);
return;
}
// Enable left button if we can go further left
if (mainImageIndex > 0) {
binding.mainLeftButton.setVisibility(View.VISIBLE);
binding.mainLeftButton.setOnClickListener(view -> setMainImage(false, false));
} else {
binding.mainLeftButton.setVisibility(View.INVISIBLE);
binding.mainLeftButton.setOnClickListener(null);
}
// Enable right button if we can go further right
if (mainImageIndex < (imageTypes.size() - 1)) {
binding.mainRightButton.setVisibility(View.VISIBLE);
binding.mainRightButton.setOnClickListener(view -> setMainImage(true, false));
} else {
binding.mainRightButton.setVisibility(View.INVISIBLE);
binding.mainRightButton.setOnClickListener(null);
} }
} }
@@ -985,31 +1133,37 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
* by machines which offer no space to insert the complete device. * by machines which offer no space to insert the complete device.
*/ */
private void setFullscreen(boolean enabled) { private void setFullscreen(boolean enabled) {
ActionBar actionBar = getSupportActionBar();
isFullscreen = enabled; isFullscreen = enabled;
ActionBar actionBar = getSupportActionBar();
if (enabled && !imageTypes.isEmpty()) { if (enabled && !imageTypes.isEmpty()) {
Log.d(TAG, "Move into fullscreen"); Log.d(TAG, "Move into fullscreen");
barcodeRenderTarget = binding.fullscreenImage;
// Show only fullscreen view
binding.container.setVisibility(View.GONE);
binding.fullscreenLayout.setVisibility(View.VISIBLE);
drawMainImage(mainImageIndex, true, isFullscreen); drawMainImage(mainImageIndex, true, isFullscreen);
binding.barcodeScaler.setProgress(loyaltyCard.zoomLevel); barcodeScaler.setProgress(loyaltyCard.zoomLevel);
setScalerGuideline(loyaltyCard.zoomLevel); setCenterGuideline(loyaltyCard.zoomLevel);
// Hide maximize and show minimize button and scaler
maximizeButton.setVisibility(View.GONE);
minimizeButton.setVisibility(View.VISIBLE);
barcodeScaler.setVisibility(View.VISIBLE);
// Hide actionbar // Hide actionbar
if (actionBar != null) { if (actionBar != null) {
actionBar.hide(); actionBar.hide();
} }
// Hide toolbars
appBarLayout.setVisibility(View.INVISIBLE);
iconImage.setVisibility(View.INVISIBLE);
collapsingToolbarLayout.setVisibility(View.GONE);
landscapeToolbar.setVisibility(View.GONE);
// Hide other UI elements // Hide other UI elements
binding.bottomAppBar.setVisibility(View.GONE); cardIdFieldView.setVisibility(View.GONE);
binding.fabEdit.setVisibility(View.GONE); bottomAppBar.setVisibility(View.GONE);
editButton.setVisibility(View.GONE);
// Set Android to fullscreen mode // Set Android to fullscreen mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -1024,22 +1178,31 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} else { } else {
Log.d(TAG, "Move out of fullscreen"); Log.d(TAG, "Move out of fullscreen");
barcodeRenderTarget = binding.mainImage; // Reset center guideline
setCenterGuideline(100);
// Show only regular view
binding.container.setVisibility(View.VISIBLE);
binding.fullscreenLayout.setVisibility(View.GONE);
drawMainImage(mainImageIndex, true, isFullscreen); drawMainImage(mainImageIndex, true, isFullscreen);
// Show maximize and hide minimize button and scaler
maximizeButton.setVisibility(imageTypes.isEmpty() ? View.GONE : View.VISIBLE);
minimizeButton.setVisibility(View.GONE);
barcodeScaler.setVisibility(View.GONE);
// Show actionbar // Show actionbar
if (actionBar != null) { if (actionBar != null) {
actionBar.show(); actionBar.show();
} }
// Show appropriate toolbar
appBarLayout.setVisibility(View.VISIBLE);
setupOrientation();
iconImage.setVisibility(View.VISIBLE);
// Show other UI elements // Show other UI elements
binding.bottomAppBar.setVisibility(View.VISIBLE); cardIdFieldView.setVisibility(View.VISIBLE);
binding.fabEdit.setVisibility(View.VISIBLE); editButton.setVisibility(View.VISIBLE);
bottomAppBar.setVisibility(View.VISIBLE);
// Unset fullscreen mode // Unset fullscreen mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -1053,7 +1216,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} }
} }
Log.d("setFullScreen", "Is full screen enabled? " + enabled + " Zoom Level = " + binding.barcodeScaler.getProgress()); Log.d("setFullScreen", "Is full screen enabled? " + enabled + " Zoom Level = " + barcodeScaler.getProgress());
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")

View File

@@ -50,7 +50,7 @@ import protect.card_locker.databinding.MainActivityBinding;
import protect.card_locker.databinding.SortingOptionBinding; import protect.card_locker.databinding.SortingOptionBinding;
import protect.card_locker.preferences.SettingsActivity; import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener { public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener {
private MainActivityBinding binding; private MainActivityBinding binding;
private ArchiveActivityBinding archiveActivityBinding; private ArchiveActivityBinding archiveActivityBinding;
private ContentMainBinding contentMainBinding; private ContentMainBinding contentMainBinding;
@@ -63,6 +63,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
private LoyaltyCardCursorAdapter mAdapter; private LoyaltyCardCursorAdapter mAdapter;
private ActionMode mCurrentActionMode; private ActionMode mCurrentActionMode;
private SearchView mSearchView; private SearchView mSearchView;
private GestureDetector mGestureDetector;
private int mLoyaltyCardCount = 0; private int mLoyaltyCardCount = 0;
protected String mFilter = ""; protected String mFilter = "";
protected Object mGroup = null; protected Object mGroup = null;
@@ -281,11 +282,19 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
} }
}); });
mGestureDetector = new GestureDetector(this, this);
View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event);
mHelpSection = contentMainBinding.helpSection; mHelpSection = contentMainBinding.helpSection;
mNoMatchingCardsText = contentMainBinding.noMatchingCardsText; mNoMatchingCardsText = contentMainBinding.noMatchingCardsText;
mNoGroupCardsText = contentMainBinding.noGroupCardsText; mNoGroupCardsText = contentMainBinding.noGroupCardsText;
mCardList = contentMainBinding.list; mCardList = contentMainBinding.list;
mNoMatchingCardsText.setOnTouchListener(gestureTouchListener);
mCardList.setOnTouchListener(gestureTouchListener);
mNoGroupCardsText.setOnTouchListener(gestureTouchListener);
mAdapter = new LoyaltyCardCursorAdapter(this, null, this); mAdapter = new LoyaltyCardCursorAdapter(this, null, this);
mCardList.setAdapter(mAdapter); mCardList.setAdapter(mAdapter);
registerForContextMenu(mCardList); registerForContextMenu(mCardList);
@@ -759,6 +768,83 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
updateLoyaltyCardList(false); updateLoyaltyCardList(false);
} }
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d(TAG, "On fling");
// Don't swipe if we have too much vertical movement
if (Math.abs(velocityY) > (0.75 * Math.abs(velocityX))) {
return false;
}
if (groupsTabLayout.getTabCount() < 2) {
return false;
}
Integer currentTab = groupsTabLayout.getSelectedTabPosition();
Log.d("onFling", "Current Tab " + currentTab);
// Swipe right
if (velocityX < -150) {
Log.d("onFling", "Right Swipe detected " + velocityX);
Integer nextTab = currentTab + 1;
if (nextTab == groupsTabLayout.getTabCount()) {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(0));
} else {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(nextTab));
}
return true;
}
// Swipe left
if (velocityX > 150) {
Log.d("onFling", "Left Swipe detected " + velocityX);
Integer nextTab = currentTab - 1;
if (nextTab < 0) {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(groupsTabLayout.getTabCount() - 1));
} else {
groupsTabLayout.selectTab(groupsTabLayout.getTabAt(nextTab));
}
return true;
}
return false;
}
@Override @Override
public void onRowLongClicked(int inputPosition) { public void onRowLongClicked(int inputPosition) {
enableActionMode(inputPosition); enableActionMode(inputPosition);

View File

@@ -18,9 +18,6 @@ import android.provider.MediaStore;
import android.util.Log; import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.RawRes; import androidx.annotation.RawRes;
@@ -602,39 +599,4 @@ public class Utils {
return result.toString(); return result.toString();
} }
public static void setIconOrTextWithBackground(Context context, LoyaltyCard loyaltyCard, ImageView backgroundOrIcon, TextView textWhenNoImage) {
Bitmap icon = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon);
if (icon != null) {
Log.d("onResume", "setting icon image");
textWhenNoImage.setVisibility(View.GONE);
backgroundOrIcon.setImageBitmap(icon);
backgroundOrIcon.setBackgroundColor(Color.TRANSPARENT);
} else {
textWhenNoImage.setVisibility(View.VISIBLE);
int headerColor = loyaltyCard.headerColor != null ? loyaltyCard.headerColor : LetterBitmap.getDefaultColor(context, loyaltyCard.store);
backgroundOrIcon.setImageBitmap(null);
backgroundOrIcon.setBackgroundColor(headerColor);
textWhenNoImage.setText(loyaltyCard.store);
textWhenNoImage.setTextColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
}
}
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;
}
}
} }

View File

@@ -17,6 +17,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.StringReader; import java.io.StringReader;
import java.io.UncheckedIOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
@@ -100,7 +101,7 @@ public class CatimaImporter implements Importer {
} }
parser.close(); parser.close();
} catch (IllegalArgumentException | IllegalStateException e) { } catch (UncheckedIOException e) {
throw new FormatException("Issue parsing CSV data", e); throw new FormatException("Issue parsing CSV data", e);
} }
} }
@@ -182,7 +183,7 @@ public class CatimaImporter implements Importer {
throw new InterruptedException(); throw new InterruptedException();
} }
} }
} catch (IllegalArgumentException | IllegalStateException e) { } catch (UncheckedIOException e) {
throw new FormatException("Issue parsing CSV data", e); throw new FormatException("Issue parsing CSV data", e);
} finally { } finally {
groupParser.close(); groupParser.close();
@@ -207,7 +208,7 @@ public class CatimaImporter implements Importer {
throw new InterruptedException(); throw new InterruptedException();
} }
} }
} catch (IllegalArgumentException | IllegalStateException e) { } catch (UncheckedIOException e) {
throw new FormatException("Issue parsing CSV data", e); throw new FormatException("Issue parsing CSV data", e);
} finally { } finally {
cardParser.close(); cardParser.close();
@@ -232,7 +233,7 @@ public class CatimaImporter implements Importer {
throw new InterruptedException(); throw new InterruptedException();
} }
} }
} catch (IllegalArgumentException | IllegalStateException e) { } catch (UncheckedIOException e) {
throw new FormatException("Issue parsing CSV data", e); throw new FormatException("Issue parsing CSV data", e);
} finally { } finally {
cardGroupParser.close(); cardGroupParser.close();

View File

@@ -63,6 +63,30 @@ public class Settings {
return AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM; return AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
} }
public double getFontSizeScale() {
return getInt(R.string.settings_key_max_font_size_scale, R.integer.settings_max_font_size_scale_pct) / 100.0;
}
public int getSmallFont() {
return 14;
}
public int getMediumFont() {
return 28;
}
public int getLargeFont() {
return 40;
}
public int getFontSizeMin(int fontSize) {
return (int) (Math.round(fontSize / 2.0) - 1);
}
public int getFontSizeMax(int fontSize) {
return (int) Math.round(fontSize * getFontSizeScale());
}
public boolean useMaxBrightnessDisplayingBarcode() { public boolean useMaxBrightnessDisplayingBarcode() {
return getBoolean(R.string.settings_key_display_barcode_max_brightness, true); return getBoolean(R.string.settings_key_display_barcode_max_brightness, true);
} }

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" android:useLevel="true"
android:dither="true">
<size android:height="12dip" android:width="12dip"/>
<solid android:color="@android:color/white"/>
</shape>

View File

@@ -1,24 +0,0 @@
<layer-list xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="?attr/colorSurface" />
<corners
android:bottomLeftRadius="28dp"
android:bottomRightRadius="28dp"
android:topLeftRadius="28dp"
android:topRightRadius="28dp" />
</shape>
</item>
<item>
<shape>
<solid android:color="@color/m3_popupmenu_overlay_color"
tools:ignore="PrivateResource" />
<corners
android:bottomLeftRadius="28dp"
android:bottomRightRadius="28dp"
android:topLeftRadius="28dp"
android:topRightRadius="28dp" />
</shape>
</item>
</layer-list>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal" <vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24" android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/> <path android:fillColor="@android:color/white" android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/>

View File

@@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal" <vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24" android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/> <path android:fillColor="@android:color/white" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z"/>
</vector>

View File

@@ -1,5 +0,0 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
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

@@ -1,5 +0,0 @@
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
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,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" android:useLevel="true"
android:dither="true">
<size android:height="8dip" android:width="8dip"/>
<solid android:color="@android:color/white"/>
</shape>

View File

@@ -271,36 +271,6 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/donate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:id="@+id/donate_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:padding="2dp"
android:text="@string/donate"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="sans-serif-medium"
android:text="@string/arrow"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/rate" android:id="@+id/rate"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -9,7 +9,8 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:layout_marginBottom="4dp">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/icon_layout" android:id="@+id/icon_layout"
@@ -18,11 +19,12 @@
android:outlineProvider="none" android:outlineProvider="none"
app:cardCornerRadius="8dp" app:cardCornerRadius="8dp"
app:strokeWidth="0dp" app:strokeWidth="0dp"
app:layout_constraintBottom_toTopOf="@+id/note" app:layout_constraintBottom_toTopOf="@+id/store"
app:layout_constraintDimensionRatio="85.6f:53.98f" app:layout_constraintDimensionRatio="85.6f:53.98f"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<ImageView <ImageView
android:importantForAccessibility="no"
android:id="@+id/thumbnail" android:id="@+id/thumbnail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@@ -34,20 +36,6 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/thumbnail_text"
android:importantForAccessibility="no"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textStyle="bold"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="12sp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeStepGranularity="2sp"
android:gravity="center"
android:maxLines="1"
android:layout_margin="20dp" />
<ImageView <ImageView
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:id="@+id/selected_thumbnail" android:id="@+id/selected_thumbnail"
@@ -129,6 +117,20 @@
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
<TextView
android:id="@+id/store"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
android:textAppearance="?attr/textAppearanceHeadline1"
app:layout_constraintTop_toBottomOf="@+id/icon_layout"
app:layout_constraintBottom_toTopOf="@+id/note"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="Example store"/>
<TextView <TextView
android:id="@+id/note" android:id="@+id/note"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -140,7 +142,7 @@
android:textColor="?android:attr/textColorSecondary" android:textColor="?android:attr/textColorSecondary"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" tools:visibility="visible"
app:layout_constraintTop_toBottomOf="@+id/icon_layout" app:layout_constraintTop_toBottomOf="@+id/store"
app:layout_constraintBottom_toTopOf="@+id/info_divider" app:layout_constraintBottom_toTopOf="@+id/info_divider"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View File

@@ -6,197 +6,216 @@
android:id="@+id/coordinator_layout" android:id="@+id/coordinator_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:fitsSystemWindows="false"> android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:id="@+id/app_bar_layout"
android:layout_height="wrap_content"> android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:clipChildren="false"
android:clipToPadding="false"
android:fitsSystemWindows="true"
android:weightSum="1.0">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar" android:id="@+id/toolbar_landscape"
android:layout_width="fill_parent"
android:layout_height="?actionBarSize"
android:background="@android:color/transparent"
android:fitsSystemWindows="false"
android:paddingTop="0dp"
android:visibility="gone"
app:contentInsetStart="72.0dip"
app:layout_collapseMode="pin" />
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
android:minHeight="56.0dip"
app:contentScrim="?colorPrimary"
app:expandedTitleGravity="top"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/storeName"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content"
style="?attr/toolbarStyle" /> android:layout_gravity="center"
android:layout_marginTop="?actionBarSize"
android:layout_marginBottom="?actionBarSize"
android:ellipsize="end"
android:maxLines="1"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="40sp"
app:layout_collapseMode="parallax" />
<androidx.appcompat.widget.Toolbar
android:id="@id/toolbar"
android:layout_width="fill_parent"
android:layout_height="?actionBarSize"
android:background="@android:color/transparent"
app:contentInsetStart="72.0dip"
app:layout_collapseMode="pin" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:layout_marginBottom="100dp"
android:orientation="vertical"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp">
<LinearLayout
android:id="@+id/icon_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp">
<Space
android:layout_width="50dp"
android:layout_height="0dp"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<com.google.android.material.card.MaterialCardView
android:id="@+id/icon_holder"
android:layout_width="match_parent"
android:layout_height="0dp"
app:cardCornerRadius="8dp"
android:layout_margin="10dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="85.6f:53.98f">
<ImageView <ImageView
android:id="@+id/icon_image" android:id="@+id/icon_image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="0dp"
android:layout_alignParentTop="true"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
app:srcCompat="@drawable/ic_launcher_foreground"
tools:ignore="ContentDescription" />
<TextView <FrameLayout
android:id="@+id/icon_text" android:clipChildren="false"
android:layout_width="match_parent" android:clipToPadding="false"
android:layout_height="match_parent" android:layout_width="fill_parent"
android:textStyle="bold" android:layout_height="fill_parent"
app:autoSizeTextType="uniform" app:layout_behavior="@string/appbar_scrolling_view_behavior">
app:autoSizeMinTextSize="12sp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeStepGranularity="2sp"
android:gravity="center"
android:maxLines="1"
android:layout_margin="20dp" />
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<Space
android:layout_width="50dp"
android:layout_height="0dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp">
<!-- We don't use these buttons for Talkback -->
<ImageButton
android:importantForAccessibility="no"
android:id="@+id/main_left_button"
android:layout_width="50dp"
android:layout_height="match_parent"
app:srcCompat="@drawable/ic_baseline_chevron_left_24"
android:background="@android:color/transparent"/>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/card_holder" android:id="@+id/mainLayout"
android:layout_width="0dp" android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardCornerRadius="8dp"
android:layout_margin="10dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="4dp"
android:orientation="vertical">
<ImageView
android:id="@+id/main_image"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<TextView
android:id="@+id/card_id_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/text_size_large"
android:gravity="center"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- We don't use these buttons for Talkback -->
<ImageButton
android:importantForAccessibility="no"
android:id="@+id/main_right_button"
android:layout_width="50dp"
android:layout_height="match_parent"
app:srcCompat="@drawable/ic_baseline_chevron_right_24"
android:background="@android:color/transparent"/>
</LinearLayout>
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/fullscreen_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<ImageView
android:importantForAccessibility="no"
android:id="@+id/fullscreen_image"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/scaler_guideline"/>
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/scaler_guideline" android:id="@+id/centerGuideline"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/> app:layout_constraintGuide_percent="0.5"/>
<LinearLayout <androidx.constraintlayout.widget.Guideline
android:layout_width="match_parent" android:id="@+id/scalerGuideline"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/fullscreen_button_minimize"
android:layout_marginBottom="50dp"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip">
<TextView
android:importantForAccessibility="no"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:orientation="horizontal"
android:text="@string/height"/> app:layout_constraintGuide_percent="0.75"/>
<SeekBar
android:id="@+id/barcode_scaler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:contentDescription="@string/setBarcodeHeight"
android:max="100" />
</LinearLayout>
<ImageButton <ImageButton
android:id="@+id/fullscreen_button_minimize" android:id="@+id/maximizeButton"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:background="?attr/colorPrimary"
android:contentDescription="@string/moveBarcodeToTopOfScreen"
android:padding="0dp"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/mainImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_arrow_drop_up_24"
app:tint="?attr/colorOnPrimary"
tools:visibility="visible" />
<ImageView
android:id="@+id/mainImage"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
app:layout_constraintBottom_toTopOf="@+id/centerGuideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/maximizeButton"/>
<ImageButton
android:id="@+id/minimizeButton"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:background="?attr/colorPrimary"
android:contentDescription="@string/moveBarcodeToCenterOfScreen"
android:padding="0dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mainImage"
app:srcCompat="@drawable/ic_baseline_arrow_drop_down_24"
app:tint="?attr/colorOnPrimary"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/dotIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15.0dip"
android:layout_marginTop="10dp"
android:layout_marginEnd="15.0dip"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/minimizeButton"
tools:visibility="visible" />
<SeekBar
android:id="@+id/barcodeScaler"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/ic_baseline_expand_more_24" android:layout_margin="@dimen/inputPadding"
android:tooltipText="@string/moveDown" android:layout_marginStart="15.0dip"
android:layout_marginEnd="15.0dip"
android:contentDescription="@string/set_scale"
android:max="100"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="50dp" app:layout_constraintEnd_toEndOf="parent"
android:background="@android:color/transparent"/> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/scalerGuideline" />
<TextView
android:id="@+id/cardIdView"
android:enabled="true"
android:textIsSelectable="true"
android:focusable="true"
android:longClickable="true"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="10.0dip"
android:layout_marginRight="10.0dip"
android:paddingBottom="80dp"
app:layout_constraintTop_toBottomOf="@+id/dotIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textAlignment="center"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="@dimen/singleCardCardIdTextSizeMin"
app:autoSizeMaxTextSize="@dimen/singleCardCardIdTextSizeMax"
android:ellipsize="end"/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/drop_shadow_actionbar"
android:layout_width="fill_parent"
android:layout_height="5.0dip"
android:layout_gravity="top"/>
</FrameLayout>
<com.google.android.material.bottomappbar.BottomAppBar <com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottom_app_bar" android:id="@+id/bottom_app_bar"
style="@style/Widget.MaterialComponents.BottomAppBar" style="@style/Widget.MaterialComponents.BottomAppBar"
@@ -211,7 +230,7 @@
app:fabAlignmentMode="center"> app:fabAlignmentMode="center">
<ImageButton <ImageButton
android:id="@+id/bottom_app_bar_previous_button" android:id="@+id/button_previous"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="left" android:layout_gravity="left"
@@ -223,7 +242,7 @@
android:visibility="gone" /> android:visibility="gone" />
<ImageButton <ImageButton
android:id="@+id/bottom_app_bar_info_button" android:id="@+id/button_show_info"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
@@ -235,7 +254,7 @@
android:visibility="gone" /> android:visibility="gone" />
<ImageButton <ImageButton
android:id="@+id/bottom_app_bar_next_button" android:id="@+id/button_next"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="right" android:layout_gravity="right"
@@ -247,7 +266,7 @@
android:visibility="gone" /> android:visibility="gone" />
<ImageButton <ImageButton
android:id="@+id/bottom_app_bar_update_balance_button" android:id="@+id/button_update_balance"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="end" android:layout_gravity="end"

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.materialswitch.MaterialSwitch xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/switchWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:focusable="false" />

View File

@@ -4,13 +4,13 @@
<item <item
android:id="@+id/action_share" android:id="@+id/action_share"
android:icon="@drawable/ic_share" android:icon="@drawable/ic_share_white"
android:title="@string/share" android:title="@string/share"
app:showAsAction="always"/> app:showAsAction="always"/>
<item <item
android:id="@+id/action_star_unstar" android:id="@+id/action_star_unstar"
android:icon="@drawable/ic_unstarred" android:icon="@drawable/ic_unstarred_white"
android:title="@string/star" android:title="@string/star"
app:showAsAction="always" /> app:showAsAction="always" />

View File

@@ -32,7 +32,6 @@ Alexander Ivanov
arshbeerSingh arshbeerSingh
Denis Shilin Denis Shilin
Freddo espresso Freddo espresso
Projjal Moitra
Silvério Santos Silvério Santos
Miha Frangež Miha Frangež
Arnis Jaundžeikars Arnis Jaundžeikars
@@ -44,13 +43,13 @@ Katarzyna
echo r"0xX4H" | rev echo r"0xX4H" | rev
Magnitudee Magnitudee
Olivia (Zoe) Olivia (Zoe)
Projjal Moitra
betsythefc betsythefc
waffshappen waffshappen
(Cliff Heraldo)
Robin Robin
Eric Eric
ati3 ati3
Balázs Meskó (Cliff Heraldo)
Evgeniy Khramov Evgeniy Khramov
Jane Kong Jane Kong
Jiri Grönroos Jiri Grönroos
@@ -81,7 +80,7 @@ francescbassas
Jean-Luc Tibaux Jean-Luc Tibaux
Jesse Davids Jesse Davids
Lukas Grassauer Lukas Grassauer
Luna Jernberg bittin
Marnick L'Eau Marnick L'Eau
Michalis Michalis
Michał Michał
@@ -104,12 +103,10 @@ ce i moa
inesre inesre
lgasp lgasp
phlostically phlostically
pokeghost
sal0max sal0max
Ágata Leuck Ágata Leuck
BmBKun BmBKun
Aditya Das Aditya Das
asier123123131
Kevin Sicong Jiang Kevin Sicong Jiang
Tomer Ben-Rachel Tomer Ben-Rachel
Tom Sawyer Tom Sawyer
@@ -121,13 +118,13 @@ sNiXx
Angela Enogieru Angela Enogieru
AnimeshChatterjee1 AnimeshChatterjee1
Ashish Yadav Ashish Yadav
Asier
Aya Elsaadany Aya Elsaadany
Biren Biren
Booc Sylvan Booc Sylvan
Brage Nesteby Reitan Brage Nesteby Reitan
Cap Amr Karam
Carlo Maria Cuoghi Barbagli
CherryMonster222 CherryMonster222
Colgrave
Csaba Csaba
Mylou53 Mylou53
danieluhrinyi danieluhrinyi
@@ -135,7 +132,6 @@ Kasina Dheeraj
Donno Donno
Flav Flav
Franciszek Stefan Franciszek Stefan
Gael Caraballo
Grzegorz Grzegorz
gneiss15 gneiss15
Hamustra Scans Hamustra Scans
@@ -143,6 +139,7 @@ HowITsDone
Izzy Izzy
Jacek Jacek
Jacopo Gennaro Esposito Jacopo Gennaro Esposito
Jasielprogramador
Jean Mareilles Jean Mareilles
Jean-Baptiste Jean-Baptiste
Kung-chih Kung-chih
@@ -179,7 +176,6 @@ Samarth Asthan
Shailendra Maurya Shailendra Maurya
Simone Dotto Simone Dotto
Subhashish Anand Subhashish Anand
Subhradeep Bera
SziaTomi SziaTomi
Mehedi Hasan Mehedi Hasan
Titas Pažereckas Titas Pažereckas
@@ -195,7 +191,6 @@ diksha-2911
gbonaspetti gbonaspetti
gittyboy-cell gittyboy-cell
huang ivan huang ivan
liva
lucafont2 lucafont2
mtrmirez mtrmirez
opsik opsik

View File

@@ -292,9 +292,4 @@
<string name="updateBalanceHint">أدخل المبلغ</string> <string name="updateBalanceHint">أدخل المبلغ</string>
<string name="storageReadPermissionRequired">الصلاحيه للوصل للتخزين مطلوبة لهذا الاجراء</string> <string name="storageReadPermissionRequired">الصلاحيه للوصل للتخزين مطلوبة لهذا الاجراء</string>
<string name="validFromDate">عربيه</string> <string name="validFromDate">عربيه</string>
<string name="cameraPermissionRequired">إذن للوصول إلى الكاميرا اللازمة لهذا الإجراء…</string>
<string name="anyDate">أي تاريخ</string>
<string name="chooseValidFromDate">اختر صالح من التاريخ</string>
<string name="validFromSentence">صالح من:<xliff:g>%s</xliff:g></string>
<string name="height">الطول:</string>
</resources> </resources>

View File

@@ -268,13 +268,4 @@
<string name="anyDate">Без значение от датата</string> <string name="anyDate">Без значение от датата</string>
<string name="validFromSentence">Валидна от: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Валидна от: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">Определена дата</string> <string name="chooseValidFromDate">Определена дата</string>
<string name="height">Височина:</string>
<string name="switchToFrontImage">Показване на предната страна</string>
<string name="switchToBackImage">Показване на задната страна</string>
<string name="switchToBarcode">Показване на щрихкода</string>
<string name="openImageInGallery">Отваряне на изображението в приложението галерия</string>
<string name="openFrontImageInGalleryApp">Отваряне на изображението на предната страна в приложението галерия</string>
<string name="openBackImageInGalleryApp">Отваряне на изображението на задната страна в приложението галерия</string>
<string name="setBarcodeHeight">Задаване на височина на щрихкода</string>
<string name="donate">Даряване</string>
</resources> </resources>

View File

@@ -197,75 +197,4 @@
<string name="app_loyalty_card_keychain">আনুগত্য কার্ড কীচেন</string> <string name="app_loyalty_card_keychain">আনুগত্য কার্ড কীচেন</string>
<string name="privacy_policy">ব্যক্তিগত তথ্যের গোপনীয়তা নীতি</string> <string name="privacy_policy">ব্যক্তিগত তথ্যের গোপনীয়তা নীতি</string>
<string name="accept">গ্রহণ</string> <string name="accept">গ্রহণ</string>
<string name="failedToRetrieveImageFile">ছবি ফাইল পুনরুদ্ধার করতে ব্যর্থ হয়েছে</string>
<string name="on_github">GitHub -এ</string>
<string name="importLoyaltyCardKeychainMessage">আমদানি করতে লয়্যালটি কার্ড কীচেন থেকে আপনার <i>LoyaltyCardKeychain.csv</i> এক্সপোর্ট নির্বাচন করুন।
\nলয়্যালটি কার্ড কীচেনের আমদানি/রপ্তানি মেনু থেকে প্রথমে সেখানে রপ্তানি টিপে এটি তৈরি করুন।</string>
<string name="selectColor">রঙ নির্বাচন করুন</string>
<string name="unarchived">কার্ড সংরক্ষণাগারমুক্ত করা হয়েছে</string>
<string name="archiveList">সংরক্ষণাগার</string>
<string name="report_error">ভুল প্রতিবেদন</string>
<string name="failedLaunchingPhotoPicker">একটি সমর্থিত গ্যালারি অ্যাপ খুঁজে পাওয়া যায়নি</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> card (<xliff:g id="archivedCount">%2$d</xliff:g> archived)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> cards (<xliff:g id="archivedCount">%2$d</xliff:g> archived)</item>
</plurals>
<string name="nextCard">পরবর্তী</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">সংরক্ষণাগার দেখুন (<xliff:g>%1$d</xliff:g> কার্ড)</item>
<item quantity="other">সংরক্ষণাগার দেখুন (<xliff:g>%1$d</xliff:g> কার্ডগুলি)</item>
</plurals>
<string name="failedToOpenUrl">প্রথমে একটি ওয়েব ব্রাউজার ইন্সটল করুন</string>
<string name="newBalanceSentence">নতুন ব্যালেন্স: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">তারিখ থেকে বৈধ নির্বাচন করুন</string>
<string name="validFromSentence">এর থেকে বৈধ: <xliff:g>%s</xliff:g></string>
<string name="version_history">সংস্করণ ইতিহাস</string>
<string name="credits">ক্রেডিট</string>
<string name="help_translate_this_app">এই অ্যাপটি অনুবাদ করতে সাহায্য করুন</string>
<string name="showMoreInfo">তথ্য দেখান</string>
<string name="app_contributors">এর দ্বারা সম্ভব হয়েছে: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="hideMoreInfo">তথ্য লুকান</string>
<string name="importCards">কার্ড আমদানি করুন</string>
<string name="sort_by_balance">ব্যালান্স</string>
<string name="importFidmeMessage">FidMe থেকে আমদানি করতে আপনার <i>fidme-export-request-xxxxxx.zip</i> রপ্তানি নির্বাচন করুন এবং পরে বারকোডের ধরন ম্যানুয়ালি নির্বাচন করুন।
\nআপনার FidMe প্রোফাইল থেকে ডেটা সুরক্ষা নির্বাচন করে এবং তারপর প্রথমে আমার ডেটা বের করুন টিপে এটি তৈরি করুন।</string>
<string name="importCatimaMessage">ক্যাটিমা থেকে আমদানি করতে আপনার <i>catima.zip</i> রপ্তানি নির্বাচন করুন।
\nঅন্য Catima অ্যাপের আমদানি/রপ্তানি মেনু থেকে প্রথমে সেখানে রপ্তানি টিপে এটি তৈরি করুন।</string>
<string name="importStocardMessage">আমদানি করতে Stocard থেকে আপনার <i>***.zip</i> এক্সপোর্ট নির্বাচন করুন।
\nআপনার ডেটা রপ্তানির জন্য জিজ্ঞাসা করে support@stocardapp.com ই-মেইল করে এটি পান।</string>
<string name="importVoucherVaultMessage">আমদানি করতে ভাউচার ভল্ট থেকে আপনার <i>vouchervault.json</i> এক্সপোর্ট নির্বাচন করুন।
\nপ্রথমে ভাউচার ভল্টে এক্সপোর্ট টিপে এটি তৈরি করুন।</string>
<string name="settings_oled_dark">অন্ধকার থিমের জন্য খাঁটি কালো পটভূমি</string>
<string name="setIcon">আইকন সেট করুন</string>
<string name="settings_grey_theme">ধূসর</string>
<string name="updateBalance">ব্যালেন্স আপডেট করুন</string>
<string name="barcodeLongPressMessage">গ্যালারি অ্যাপে শুধুমাত্র ছবি খোলা যাবে</string>
<string name="translate_platform">Weblate-এ</string>
<string name="on_google_play">Google Play-তে</string>
<string name="action_show_details">বিস্তারিত দেখাও</string>
<string name="action_hide_details">আড়াল বিস্তারিত</string>
<string name="shortcutSelectCard">একটি কার্ড নির্বাচন করুন</string>
<string name="options">অপশন</string>
<string name="starred">তারকাচিহ্নিত</string>
<string name="set_scale">স্কেল সেট করুন</string>
<string name="duplicateCard">নকল</string>
<string name="include_if_asking_support">আপনি যদি সমর্থনের জন্য অনুরোধ করতে চান তবে নিম্নলিখিত তথ্যগুলি অন্তর্ভুক্ত করুন:</string>
<string name="importFidme">FidMe থেকে আমদানি করুন</string>
<string name="validFromDate">বৈধ হবে</string>
<string name="anyDate">যেকোনো তারিখ</string>
<string name="previousCard">আগে</string>
<string name="exportPassword">আপনার রপ্তানি রক্ষা করার জন্য একটি পাসওয়ার্ড সেট করুন (ঐচ্ছিক)</string>
<string name="exportPasswordHint">পাসওয়ার্ড লিখুন</string>
<string name="license">লাইসেন্স</string>
<string name="source_repository">Source Repository</string>
<string name="and_data_usage">এবং ডেটা ব্যবহার</string>
<string name="rate_this_app">এই অ্যাপ্লিকেশন রেট করুন</string>
<string name="archive">সংরক্ষণ করুন</string>
<string name="unarchive">সংরক্ষণাগারমুক্ত করুন</string>
<string name="archived">কার্ড সংরক্ষণাগারভুক্ত</string>
<string name="noUnarchivedCardsMessage">আর্কাইভ করা কোনো কার্ড নেই</string>
<string name="welcome">Catima-তে স্বাগতম</string>
<string name="updateBalanceTitle">আপনি কত খরচ করেছেন\?</string>
<string name="updateBalanceHint">পরিমান লিখুন</string>
<string name="currentBalanceSentence">বর্তমান ব্যালেন্স: <xliff:g>%s</xliff:g></string>
</resources> </resources>

View File

@@ -13,5 +13,4 @@
<string name="deleteTitle">Elimina la targeta</string> <string name="deleteTitle">Elimina la targeta</string>
<string name="welcome">Benvingut a Catima</string> <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="noGiftCards">Cliqueu el botó + més per afegir una targeta, o importeu-ne des del ⋮ menú.</string>
<string name="photos">Fotos</string>
</resources> </resources>

View File

@@ -275,13 +275,4 @@
<string name="anyDate">Jakékoliv datum</string> <string name="anyDate">Jakékoliv datum</string>
<string name="chooseValidFromDate">Vyberte datum počátku platnosti</string> <string name="chooseValidFromDate">Vyberte datum počátku platnosti</string>
<string name="validFromSentence">Platnost od: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Platnost od: <xliff:g>%s</xliff:g></string>
<string name="height">Výška:</string>
<string name="switchToFrontImage">Přepnout na přední obrázek</string>
<string name="switchToBackImage">Přepnout na zadní obrázek</string>
<string name="switchToBarcode">Přepnout na čárový kód</string>
<string name="openFrontImageInGalleryApp">Otevřít přední obrázek v galerii</string>
<string name="openImageInGallery">Otevřít obrázek v galerii</string>
<string name="openBackImageInGalleryApp">Otevřít zadní obrázek v galerii</string>
<string name="setBarcodeHeight">Nastavit výšku čárového kódu</string>
<string name="donate">Přispět</string>
</resources> </resources>

View File

@@ -275,13 +275,4 @@
<string name="validFromDate">Válido desde</string> <string name="validFromDate">Válido desde</string>
<string name="chooseValidFromDate">Elija una fecha válida desde</string> <string name="chooseValidFromDate">Elija una fecha válida desde</string>
<string name="validFromSentence">Válido desde: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Válido desde: <xliff:g>%s</xliff:g></string>
<string name="height">Altura:</string>
<string name="switchToFrontImage">Cambiar a imagen frontal</string>
<string name="openFrontImageInGalleryApp">Abrir imagen frontal en la aplicación de la galería</string>
<string name="openBackImageInGalleryApp">Abrir imagen trasera en la aplicación de la galería</string>
<string name="setBarcodeHeight">Ajustar la altura del código de barras</string>
<string name="donate">Donar</string>
<string name="switchToBarcode">Cambiar a código de barras</string>
<string name="openImageInGallery">Abrir imagen en la aplicación de la galería</string>
<string name="switchToBackImage">Cambiar a imagen trasera</string>
</resources> </resources>

View File

@@ -275,13 +275,4 @@
<string name="validFromSentence">Valide à partir de : <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Valide à partir de : <xliff:g>%s</xliff:g></string>
<string name="anyDate">Nimporte quelle date</string> <string name="anyDate">Nimporte quelle date</string>
<string name="chooseValidFromDate">Choisissez la date de début de validité</string> <string name="chooseValidFromDate">Choisissez la date de début de validité</string>
<string name="height">Hauteur :</string>
<string name="switchToFrontImage">Passer à l\'image avant</string>
<string name="switchToBackImage">Passer à l\'image arrière</string>
<string name="switchToBarcode">Passer au code barre</string>
<string name="openImageInGallery">Ouvrir l\'image dans l\'application galerie</string>
<string name="openFrontImageInGalleryApp">Ouvrir l\'image avant dans l\'application galerie</string>
<string name="openBackImageInGalleryApp">Ouvrir l\'image arrière dans l\'application galerie</string>
<string name="setBarcodeHeight">Définir la hauteur du code-barres</string>
<string name="donate">Faire un don</string>
</resources> </resources>

View File

@@ -1,287 +1,83 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools"> <resources>
<string name="unstar">Ukloni iz favorita</string> <string name="unstar">Ukloni iz favorita</string>
<string name="action_search">Pretraži</string> <string name="action_search">Pretraživanje</string>
<string name="save">Spremi</string> <string name="save">Spremi</string>
<string name="edit">Uredi</string> <string name="edit">Uredi</string>
<string name="delete">Ukloni</string> <string name="delete">Ukloni</string>
<string name="confirm">Potvrdi</string> <string name="confirm">Potvrdi</string>
<string name="deleteTitle">Izbriši karticu</string> <string name="deleteTitle">Ukloni kartu</string>
<string name="deleteConfirmation">Izbrisati ovu karticu zauvijek\?</string> <string name="deleteConfirmation">Izbrisati ovu karticu zauvijek\?</string>
<string name="copy_to_clipboard">Kopiraj ID u međuspremnik</string> <string name="copy_to_clipboard">Kopiraj ID u međuspremnik</string>
<string name="share">Dijeli</string> <string name="share">Podijeli</string>
<string name="sendLabel">Pošalji </string> <string name="sendLabel">Pošalji…</string>
<string name="editCardTitle">Uredi karticu</string> <string name="editCardTitle">Uredi karticu</string>
<string name="addCardTitle">Dodaj karticu</string> <string name="addCardTitle">Dodaj Kartu</string>
<string name="scanCardBarcode">Snimi crtični kod kartice</string> <string name="scanCardBarcode">Skeniranje crtičnog koda kartice</string>
<string name="cardShortcut">Prečac kartice</string> <string name="cardShortcut">Oznaka karte</string>
<string name="noCardsMessage">Najprije dodaj karticu</string> <string name="noCardsMessage">Najprije dodajte karticu</string>
<string name="card_ids_copied">ID oznake su kopirane</string> <string name="card_ids_copied">Kopirani ID kartice</string>
<string name="noBarcode">Nema crtičnog koda</string> <string name="noBarcode">Nema crtičnog koda</string>
<string name="star">Dodaj u favorite</string> <string name="star">Dodaj u favorite</string>
<string name="action_add">Dodaj</string> <string name="action_add">Dodaj</string>
<string name="storeName">Ime</string> <string name="storeName">Ime</string>
<string name="note">Napomena</string> <string name="note">Napomena</string>
<string name="noMatchingGiftCards">Nema rezultata. Pokušaj promijeniti pretragu.</string> <string name="noMatchingGiftCards">Nema rezultata. Pokušajte promijeniti pretraživanje.</string>
<string name="cardId">ID kartice</string> <string name="cardId">ID kartice</string>
<string name="barcodeType">Vrsta crtičnog koda</string> <string name="barcodeType">Vrsta crtičnog koda</string>
<string name="barcodeNoBarcode">Ne postoji crtični kod</string> <string name="barcodeNoBarcode">Na ovoj kartici nema crtičnog koda</string>
<string name="cancel">Odustani</string> <string name="cancel">Poništi</string>
<string name="noGiftCards">Pritisni gumb + plus za dodavanje kartice ili uvezi putem izbornika ⋮.</string> <string name="noGiftCards">Pritisnite gumb + plus da biste dodali karticu ili ga najprije uvezite iz izbornika ⋮.</string>
<string name="noStoreError">Ime nije zadano</string> <string name="noStoreError">Ime nije uneseno</string>
<string name="noCardExistsError">Nije bilo moguće pronaći tu karticu</string> <string name="noCardExistsError">Nije moguće pronaći karticu</string>
<string name="failedParsingImportUriError">Nije bilo moguće obraditi URI uvoza</string> <string name="failedParsingImportUriError">Nije moguće analizirati uvoz URI</string>
<string name="importExport">Uvoz/Izvoz</string> <string name="importExport">Uvoz / Izvoz</string>
<string name="exportName">Izvoz</string> <string name="exportName">Izvoz</string>
<string name="importExportHelp">Spremanje sigurnosnih kopija tvojih podataka omogućuje premještanje podataka na jedan drugi uređaj.</string> <string name="importExportHelp">Sigurnosno kopiranje kartica omogućuje vam da ih premjestite na drugi uređaj.</string>
<string name="importSuccessfulTitle">Uvezeno</string> <string name="importSuccessfulTitle">Uvezeno</string>
<string name="importFailedTitle">Neuspio uvoz</string> <string name="importFailedTitle">Nije moguće uvesti</string>
<string name="importFailed">Nije bilo moguće izvršiti uvoz</string> <string name="importFailed">Nije moguće uvesti karte</string>
<string name="exportSuccessfulTitle">Izvezeno</string> <string name="exportSuccessfulTitle">Izvezeno</string>
<string name="about">Informacije</string> <string name="about">Oh</string>
<string name="importOptionApplicationButton">Koristi jednu drugu aplikaciju</string> <string name="importOptionApplicationButton">Koristite drugu aplikaciju</string>
<string name="barcode">Crtični kod</string> <string name="barcode">Barkod</string>
<string name="exportOptionExplanation">Podaci će se zapisati u željeno mjesto.</string> <string name="exportOptionExplanation">Podaci će biti zabilježeni na odabranom mjestu.</string>
<string name="exportFailedTitle">Neuspio izvoz</string> <string name="exportFailedTitle">Izvoz nije uspio</string>
<string name="exporting">Izvoz </string> <string name="exporting">Opskrba</string>
<string name="importOptionFilesystemExplanation">Odaberi određenu datoteku iz datotečnog sustava.</string> <string name="importOptionFilesystemExplanation">Odaberite određenu datoteku iz datotečnog sustava.</string>
<string name="importOptionApplicationTitle">Koristi jednu drugu aplikaciju</string> <string name="importOptionApplicationTitle">Koristite drugu aplikaciju</string>
<string name="settings">Postavke</string> <string name="settings">Postavke</string>
<string name="settings_dark_theme">Tamna</string> <string name="settings_dark_theme">Tamno</string>
<string name="exportFailed">Nije bilo moguće izvršiti izvoz</string> <string name="exportFailed">Nije moguće izvesti karte</string>
<string name="importing">Uvoz </string> <string name="importing">Uvoz…</string>
<string name="importOptionFilesystemTitle">Uvoz iz datotečnog sustava</string> <string name="importOptionFilesystemTitle">Uvoz iz datotečnog sustava</string>
<string name="importOptionFilesystemButton">Iz datotečnog sustava</string> <string name="importOptionFilesystemButton">Iz datotečnog sustava</string>
<string name="importOptionApplicationExplanation">Za otvaranje datoteke koristi bilo koju aplikaciju ili tvoj omiljeni upravljač datoteka.</string> <string name="importOptionApplicationExplanation">Koristite bilo koju aplikaciju ili omiljeni upravitelj datoteka za otvaranje datoteke.</string>
<string name="settings_theme">Tema</string> <string name="settings_theme">Tema</string>
<string name="settings_system_theme">Sustav</string> <string name="settings_system_theme">Sustav</string>
<string name="settings_light_theme">Svijetla</string> <string name="settings_light_theme">Svjetlo</string>
<string name="settings_max_font_size_scale">Maksimalna veličina fonta</string> <string name="settings_max_font_size_scale">Maksimalna veličina fonta</string>
<string name="settings_display_barcode_max_brightness">Osvijetli prikaz crtičnog koda</string> <string name="settings_display_barcode_max_brightness">Osvijetlite izgled crtičnog koda</string>
<string name="moveDown">Pomakni prema dolje</string> <string name="moveDown">Pomicanje prema dolje</string>
<string name="addManually">Ručno upiši ID</string> <string name="addManually">Ručno unesite ID kartice</string>
<string name="thumbnailDescription">Sličica</string> <string name="thumbnailDescription">Sličica za karticu</string>
<string name="starImage">Omiljena zvijezda</string> <string name="starImage">Omiljena zvijezda</string>
<string name="settings_category_title_ui">Korisničko sučelje</string> <string name="settings_category_title_ui">Korisničko sučelje</string>
<string name="exportSuccessful">Podaci su izvezeni</string> <string name="exportSuccessful">Izvezeni podaci o karti</string>
<string name="settings_keep_screen_on">Ostavi ekran uključen</string> <string name="settings_keep_screen_on">Držite zaslon uključen</string>
<string name="settings_disable_lockscreen_while_viewing_card">Spriječi zaključavanje ekrana</string> <string name="settings_disable_lockscreen_while_viewing_card">Spriječiti zaključavanje zaslona</string>
<string name="intent_import_card_from_url_share_text">Želim dijeliti karticu s tobom</string> <string name="intent_import_card_from_url_share_text">Želim podijeliti razglednicu s vama</string>
<string name="importSuccessful">Podaci su uvezeni</string> <string name="importSuccessful">Uvezeni podaci o karti</string>
<string name="enter_group_name">Upiši ime grupe</string> <string name="enter_group_name">Unesite naziv grupe</string>
<string name="groups">Grupe</string> <string name="groups">Grupe</string>
<string name="noGroups">Pritisni gumb + plus za dodavanje grupe za kategoriziranje.</string> <string name="noGroups">Pritisnite gumb + plus da biste najprije dodali grupe za klasifikaciju.</string>
<string name="noGroupCards">Ova je grupa prazna</string> <string name="noGroupCards">Ova grupa ne sadrži nikakve kartice</string>
<string name="addFromImage">Odaberi sliku iz galerije</string> <string name="addFromImage">Odaberite sliku iz galerije</string>
<string name="deleteConfirmationGroup">Izbrisati grupu\?</string> <string name="deleteConfirmationGroup">Izbriši grupu\?</string>
<string name="failedOpeningFileManager">Najprije instaliraj upravlj datoteka.</string> <string name="failedOpeningFileManager">Najprije instalirajte upravitelj datoteka.</string>
<string name="moveUp">Pomakni prema gore</string> <string name="moveUp">Pomicanje gore</string>
<string name="leaveWithoutSaveTitle">Zatvori aplikaciju</string> <string name="leaveWithoutSaveTitle">Izlaz</string>
<string name="card">Kartica</string> <string name="card">Karta</string>
<string name="leaveWithoutSaveConfirmation">Zatvoriti aplikaciju bez spremanja\?</string> <string name="leaveWithoutSaveConfirmation">Otići bez očuvanja\?</string>
<string name="noGiftCardsGroup">Stvori neke kartice, a zatim ih ovdje dodijeli grupi.</string> <string name="noGiftCardsGroup">Izradite neke kartice, a zatim ih dodijelite grupi ovdje.</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kartica</item>
<item quantity="few"><xliff:g>%d</xliff:g> kartice</item>
<item quantity="other"><xliff:g>%d</xliff:g> kartica</item>
</plurals>
<string name="importStocardMessage">Odaberi tvoju iz Stocard izvezenu <i>***.zip</i> datoteku koju želiš uvesti.
\nPošalji e-mail na support@stocardapp.com s molbom za izvoz tvojih podataka.</string>
<string name="translate_platform">na platformi Weblate</string>
<string name="editGroup">Uređivanje grupe: <xliff:g>%s</xliff:g></string>
<string name="editBarcode">Uredi crtični kod</string>
<string name="expiryDate">Datum isteka</string>
<string name="never">Nikada</string>
<string name="accept">Prihvati</string>
<string name="importCatima">Uvezi iz Catima</string>
<string name="importFidme">Uvezi iz FidMe</string>
<string name="importStocard">Uvezi iz Stocard</string>
<string name="importLoyaltyCardKeychainMessage">Odaberi tvoju iz LoyaltyCardKeychain izvezenu <i>LoyaltyCardKeychain.csv</i> datoteku koju želiš uvesti.
\nStvori je putem izbornika „Uvoz/Izvoz” u aplikaciji LoyaltyCardKeychain i tamo najprije pritisni „Izvoz”.</string>
<string name="updateBarcodeQuestionText">Promijenio/la si ID. Želiš li također aktualizirati crtični kod da koristi istu vrijednost\?</string>
<string name="action_hide_details">Sakrij detalje</string>
<string name="importCards">Uvezi kartice</string>
<string name="selectColor">Odaberi boju</string>
<string name="setIcon">Postavi ikonu</string>
<string name="settings_catima_theme">Catima</string>
<string name="settings_green_theme">Zelena</string>
<string name="settings_grey_theme">Siva</string>
<string name="sort_by_expiry">Istek</string>
<string name="barcodeImageDescriptionWithType">Slika vrste crtičnog koda <xliff:g>%s</xliff:g></string>
<string name="noCardIdError">ID nije zadan</string>
<string name="importLoyaltyCardKeychain">Uvezi iz Loyalty Card Keychain</string>
<string name="frontImageDescription">Prednja slika</string>
<string name="exportPasswordHint">Upiši lozinku</string>
<string name="turn_flashlight_on">Uključi svjetiljku</string>
<string name="failedGeneratingShareURL">Nije bilo moguće generirati URL za dijeljenje. Prijavi ovaj problem.</string>
<string name="turn_flashlight_off">Isključi svjetiljku</string>
<string name="settings_locale">Jezik</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_violet_theme">Ljubičasta</string>
<string name="settings_sky_blue_theme">Nebesko plava</string>
<string name="sort">Razvrstaj</string>
<string name="hideMoreInfo">Sakrij informacije</string>
<string name="updateBalance">Aktualiziraj saldo</string>
<string name="swipeToSwitchImages">Klizni prstom za mijenjanje slika, pritisni dugo za otvaranje slike u aplikaciji galerije</string>
<string name="sort_by_balance">Saldo</string>
<string name="sort_by">Redoslijed</string>
<string name="version_history">Kronologija verzija</string>
<string name="credits">Zasluge</string>
<string name="and_data_usage">i korištenje podataka</string>
<string name="rate_this_app">Ocijeni ovu aplikaciju</string>
<string name="report_error">Prijavi greške</string>
<string name="include_if_asking_support">Ako želiš zatražiti podršku, uključi sljedeće informacije:</string>
<string name="options">Opcije</string>
<string name="starred">Označeno</string>
<string name="set_scale">Postavi veličinu</string>
<string name="duplicateCard">Dupliciraj</string>
<string name="archive">Arhiviraj</string>
<string name="archived">Kartica je arhivirana</string>
<string name="unarchived">Kartica je dearhivirana</string>
<string name="failedLaunchingPhotoPicker">Nije bilo moguće pronaći aplikaciju za galeriju</string>
<string name="archiveList">Arhiva</string>
<string name="cameraPermissionDeniedTitle">Nije bilo moguće pristupiti kameri</string>
<string name="noCameraPermissionDirectToSystemSetting">Za snimanje crtičnih kodova Catima treba pristup tvojoj kameri. Dodirni ovdje za mijenjanje postavki dozvola.</string>
<string name="app_libraries">Libre biblioteke trećih strana: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Biranje crtičnog koda</string>
<string name="copy_to_clipboard_toast">ID je kopiran u međuspremnik</string>
<string name="enterBarcodeInstructions">Upiši ID i dolje odaberi vrstu crtičnog koda ili „Ne postoji crtični kod”.</string>
<string name="settings_portrait_orientation">Okomito</string>
<string name="settings_lock_on_opening_orientation">Zaključaj na položaj koji se koristi prilikom otvaranja kartice</string>
<string name="group_edit">Uredi grupu</string>
<string name="group_name_already_in_use">Ime grupe se već koristi</string>
<string name="noBarcodeFound">Nijedan crtični kod nije pronađen</string>
<string name="balance">Saldo</string>
<string name="chooseImportType">Uvezi podatke iz</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="parsingBalanceFailed">Čini se da <xliff:g>%s</xliff:g> nije ispravni saldo.</string>
<string name="privacy_policy_popup_text">Obavijest o politici privatnosti (obavezna za neke trgovine aplikacija):
\n
\nPODACI SE UOPĆE NE PRIKUPLJAJU, što svatko može potvrditi budući da je naša aplikacija libre softver.</string>
<string name="importCatimaMessage">Odaberi tvoju iz Catima izvezenu <i>catima.zip</i> datoteku koju želiš uvesti.
\nStvori je putem izbornika „Uvoz/Izvoz” jedne druge Catima aplikacije i tamo najprije pritisni „Izvoz”.</string>
<string name="height">Visina:</string>
<string name="switchToFrontImage">Prebaci na prednju sliku</string>
<string name="switchToBackImage">Prebaci na stražnju sliku</string>
<string name="switchToBarcode">Prebaci na crtični kod</string>
<string name="openImageInGallery">Otvori sliku u aplikaciji galerije</string>
<string name="openFrontImageInGalleryApp">Otvori prednju sliku u aplikaciji galerije</string>
<string name="openBackImageInGalleryApp">Otvori stražnju sliku u aplikaciji galerije</string>
<string name="setBarcodeHeight">Postavi visinu crtičnog koda</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> odabrana</item>
<item quantity="few"><xliff:g>%d</xliff:g> odabrane</item>
<item quantity="other"><xliff:g>%d</xliff:g> odabrano</item>
</plurals>
<string name="validFromDate">Vrijedi od</string>
<string name="chooseValidFromDate">Odaberi datum od kada kartica vrijedi</string>
<string name="anyDate">Bilo koji datum</string>
<string name="validFromSentence">Vrijedi od: <xliff:g>%s</xliff:g></string>
<string name="photos">Slike</string>
<string name="ok">U redu</string>
<string name="app_copyright_old">Zasnovano na Loyalty Card Keychain
\nautorsko pravo © 2016. 2020. Branden Archer</string>
<string name="settings_system_locale">Sustav</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> bod</item>
<item quantity="few"><xliff:g>%s</xliff:g> boda</item>
<item quantity="other"><xliff:g>%s</xliff:g> bodova</item>
</plurals>
<string name="donate">Doniraj</string>
<string name="storageReadPermissionRequired">Za ovu radnju je potrebna dozvola za čitanje spremljenih podataka …</string>
<string name="cameraPermissionRequired">Za ovu radnju je potrebna dozvola za pristup kameri …</string>
<string name="app_license">Copylefted libre softver, GPLv3+ licenca</string>
<string name="settings_card_orientation">Položaj crtičnog koda</string>
<string name="settings_follow_system_orientation">Slijedi sustav</string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="importFidmeMessage">Odaberi tvoju iz FidMe izvezenu <i>idme-export-request-xxxxxx.zip</i> datoteku koju želiš uvesti i ručno odaberi vste crtičnog koda nakon toga.
\nStvori je putem tvog FidMe profila i tamo najprije odaberi „Zaštita podataka” a zatim pritisni „Dekomprimiraj moje podatke”.</string>
<string name="importVoucherVaultMessage">Odaberi tvoju iz Voucher Vault izvezenu <i>vouchervault.json</i> datoteku koju želiš uvesti.
\nStvori je u aplikaciji Voucher Vault i tamo najprije pritisni „Izvoz”.</string>
<string name="settings_pink_theme">Ružičasta</string>
<string name="settings_blue_theme">Plava</string>
<string name="failedToRetrieveImageFile">Neuspjelo dohvaćanje slikovne datoteke</string>
<string name="license">Licenca</string>
<string name="barcodeLongPressMessage">U aplikaciji galerije se mogu otvoriiti samo slike</string>
<string name="source_repository">Izvorni repozitorij</string>
<string name="on_github">na GitHubu</string>
<string name="on_google_play">na stranici Google Play</string>
<string name="unarchive">Dearhiviraj</string>
<plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirana)</item>
<item quantity="few"><xliff:g>%1$d</xliff:g> kartice (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirane)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirano)</item>
</plurals>
<string name="help_translate_this_app">Pomogni prevoditi ovu aplikaciju</string>
<string name="welcome">Pozdrav u Catima</string>
<string name="currentBalanceSentence">Aktualni saldo: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Novi saldo: <xliff:g>%s</xliff:g></string>
<plurals name="deleteCardsTitle">
<item quantity="one">Izbriši <xliff:g>%d</xliff:g> karticu</item>
<item quantity="few">Izbriši <xliff:g>%d</xliff:g> kartice</item>
<item quantity="other">Izbriši <xliff:g>%d</xliff:g> kartica</item>
</plurals>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Izbrisati ovu <xliff:g>%d</xliff:g> karticu zauvijek\?</item>
<item quantity="few">Izbrisati ove <xliff:g>%d</xliff:g> kartice zauvijek\?</item>
<item quantity="other">Izbrisati ovih <xliff:g>%d</xliff:g> kartica zauvijek\?</item>
</plurals>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019. <xliff:g>%d.</xliff:g> Sylvia van Os</string>
<string name="debug_version_fmt">Verzija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informacije revizije: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_resources">Libre resursi trećih strana: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="settings_landscape_orientation">Vodoravno</string>
<string name="group_name_is_empty">Ime grupe ne smije biti prazno</string>
<string name="group_updated">Grupa je aktualizirana</string>
<string name="all">Sve</string>
<string name="groupsList">Grupe: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Isteče: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Isteklo: <xliff:g>%s</xliff:g></string>
<string name="chooseExpiryDate">Odaberi datum isteka</string>
<string name="moveBarcodeToTopOfScreen">Premjesti crtični kod na vrh ekrana</string>
<string name="moveBarcodeToCenterOfScreen">Centriraj crtični kod na ekranu</string>
<string name="errorReadingImage">Nije bilo moguće učitati sliku</string>
<string name="currency">Valuta</string>
<string name="points">Bodovi</string>
<string name="privacy_policy">Politika privatnosti</string>
<string name="importVoucherVault">Uvezi iz Voucher Vault</string>
<string name="barcodeId">Vrijednost crtičnog koda</string>
<string name="sameAsCardId">Ista kao ID</string>
<string name="setBarcodeId">Postavi vrijednost crtičnog koda</string>
<string name="unsupportedBarcodeType">Ova se vrsta crtičnog koda još ne može prikazati. Možda će se podržati u novijoj verziji aplikacije.</string>
<string name="wrongValueForBarcodeType">Vrijednost nije valjana za odabranu vrstu crtičnog koda</string>
<string name="copy_to_clipboard_multiple_toast">ID oznke su kopirane u međuspremnik</string>
<string name="intent_import_card_from_url_share_multiple_text">Želim dijeliti neke kartice s tobom</string>
<string name="backImageDescription">Stražnja slika</string>
<string name="setFrontImage">Postavi prednju sliku</string>
<string name="setBackImage">Postavi stražnju sliku</string>
<string name="removeImage">Ukloni sliku</string>
<string name="takePhoto">Uslikaj fotografiju</string>
<string name="updateBarcodeQuestionTitle">Aktualizirati vrijednost crtičnog koda\?</string>
<string name="yes">Da</string>
<string name="no">Ne</string>
<string name="passwordRequired">Upiši lozinku</string>
<string name="exportPassword">Postavi lozinku za zaštitu tvog izvoza (opcionalno)</string>
<string name="settings_oled_dark">Potpuno crna pozadina za tamnu temu</string>
<string name="settings_theme_color">Boja teme</string>
<string name="settings_brown_theme">Smeđa</string>
<string name="app_contributors">Omogućuje: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="showMoreInfo">Prikaži informacije</string>
<string name="sort_by_name">Ime</string>
<string name="sort_by_most_recently_used">Nedavno korišteno</string>
<string name="reverse">… u obrnutom redoslijedu</string>
<string name="action_show_details">Prikaži detalje</string>
<string name="shortcutSelectCard">Odaberi karticu</string>
<string name="noUnarchivedCardsMessage">Ne postoje nearhivirane kartice</string>
<string name="previousCard">Prethodna</string>
<string name="nextCard">Sljedeća</string>
<string name="updateBalanceTitle">Koliko si potrošio/la\?</string>
<string name="updateBalanceHint">Upiši iznos</string>
<string name="about_title_fmt">Informaije o <xliff:g id="app_name">%s</xliff:g></string>
<string name="failedToOpenUrl">Najprije instaliraj web preglednik</string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="one">Pogledaj arhivu (<xliff:g>%1$d</xliff:g> kartica)</item>
<item quantity="few">Pogledaj arhivu (<xliff:g>%1$d</xliff:g> kartice)</item>
<item quantity="other">Pogledaj arhivu (<xliff:g>%1$d</xliff:g> kartica)</item>
</plurals>
</resources> </resources>

View File

@@ -4,96 +4,96 @@
<string name="action_add">Hozzáadás</string> <string name="action_add">Hozzáadás</string>
<string name="action_search">Keresés</string> <string name="action_search">Keresés</string>
<plurals name="selectedCardCount"> <plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kiválasztva</item> <item quantity="one"><xliff:g>%d</xliff:g> kiválasztott</item>
<item quantity="other"><xliff:g>%d</xliff:g> kiválasztva</item> <item quantity="other"><xliff:g>%d</xliff:g> kiválasztottak</item>
</plurals> </plurals>
<string name="noCardsMessage">Először adjon hozzá egy kártyát</string> <string name="noCardsMessage">Először adjon hozzá egy kártyát</string>
<string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string> <string name="noGiftCardsGroup">Hozzon létre kártyákat, és rendelje hozzá a megfelelő csoporthoz.</string>
<string name="noMatchingGiftCards">Nincs találaat. Próbálja módosítani a keresést.</string> <string name="noMatchingGiftCards">Nincs eredmény. Próbálja módosítani a keresést.</string>
<string name="storeName">Név</string> <string name="storeName">Név</string>
<string name="note">Feljegyzés</string> <string name="note">Feljegyzés</string>
<string name="cardId">Kártyaazonosító</string> <string name="cardId">Kártya azonosító</string>
<string name="barcodeType">Vonalkód típusa</string> <string name="barcodeType">Vonalkód típus</string>
<string name="barcodeNoBarcode">Nincs vonalkód</string> <string name="barcodeNoBarcode">Nincs vonalkód</string>
<string name="noBarcode">Nincs vonalkód</string> <string name="noBarcode">Nincs vonalkód</string>
<string name="star">Hozzáadás a kedvencekhez</string> <string name="star">Kedvencekhez adás</string>
<string name="unstar">Eltávolítás a kedvencekl</string> <string name="unstar">Kivétel a kedvencek közül</string>
<string name="cancel">Mégse</string> <string name="cancel">Mégse</string>
<string name="save">Mentés</string> <string name="save">Mentés</string>
<string name="edit">Szerkesztés</string> <string name="edit">Szerkesztés</string>
<string name="delete">Törlés</string> <string name="delete">Törlés</string>
<string name="confirm">Jóváhagyás</string> <string name="confirm">Jóváhagy</string>
<plurals name="deleteCardsTitle"> <plurals name="deleteCardsTitle">
<item quantity="one"><xliff:g>%d</xliff:g> kártya törlése</item> <item quantity="one">Törölje az <xliff:g>%d</xliff:g> kártyát</item>
<item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item> <item quantity="other">Törölje az <xliff:g>%d</xliff:g> kártyákat</item>
</plurals> </plurals>
<string name="deleteConfirmation">Véglegesen törli a kártyát\?</string> <string name="deleteConfirmation">Véglegesen törli a kártyát\?</string>
<string name="ok">Rendben</string> <string name="ok">Rendben</string>
<string name="copy_to_clipboard">Azonosító vágólapra másolása</string> <string name="copy_to_clipboard">Azonosító másolása a vágólapra</string>
<string name="share">Megosztás</string> <string name="share">Megosztás</string>
<string name="sendLabel">Küldés…</string> <string name="sendLabel">Küldés…</string>
<string name="editCardTitle">Kártya szerkesztése</string> <string name="editCardTitle">Kártya szerkesztése</string>
<string name="addCardTitle">Kártya hozzáadása</string> <string name="addCardTitle">Kártya hozzáadása</string>
<string name="scanCardBarcode">Vonalkód leolvasása</string> <string name="scanCardBarcode">Vonalkód szkennelése</string>
<string name="cardShortcut">Kártya parancsikon</string> <string name="cardShortcut">Kártya parancsikon</string>
<string name="noStoreError">Nincs név megadva</string> <string name="noStoreError">Nincs név megadva</string>
<string name="failedParsingImportUriError">Az importálási URI nem értelmezhető</string> <string name="failedParsingImportUriError">Nem elemezhető az importált URI</string>
<string name="importExport">Importálás/exportálás</string> <string name="importExport">Import/Export</string>
<string name="exportName">Exportálás</string> <string name="exportName">Export</string>
<string name="importExportHelp">Az adatok mentése lehetővé teszi, hogy egy másik eszközre helyezze át.</string> <string name="importExportHelp">Az adataid mentése lehetővé teszi, hogy egy másik eszközre feltöltsd.</string>
<string name="importSuccessfulTitle">Importálva</string> <string name="importSuccessfulTitle">Importálva</string>
<string name="importFailedTitle">Az importálás sikertelen</string> <string name="importFailedTitle">Importálás meghiúsult</string>
<string name="importFailed">Nem sikerült az importálás végrehajtása</string> <string name="importFailed">Importálás nem hajtható végre</string>
<string name="exportSuccessfulTitle">Exportálva</string> <string name="exportSuccessfulTitle">Exportálva</string>
<string name="exportFailedTitle">Az exportálás sikertelen</string> <string name="exportFailedTitle">Exportálás meghiúsult</string>
<plurals name="deleteCardsConfirmation"> <plurals name="deleteCardsConfirmation">
<item quantity="one">Véglegesen töröl <xliff:g>%d</xliff:g> kártyát\?</item> <item quantity="one">Véglegesen törli a <xliff:g>%d</xliff:g> kártyát\?</item>
<item quantity="other">Véglegesen töröl <xliff:g>%d</xliff:g> kártyát\?</item> <item quantity="other">Véglegesen törli a <xliff:g>%d</xliff:g> kártyákat\?</item>
</plurals> </plurals>
<string name="deleteTitle">Kártya törlése</string> <string name="deleteTitle">Kártya törlése</string>
<string name="card_ids_copied">Azonosító(k) másolva</string> <string name="card_ids_copied">Azonosító(k) másolása</string>
<string name="barcodeImageDescriptionWithType">A(z) <xliff:g>%s</xliff:g> vonalkód képe</string> <string name="barcodeImageDescriptionWithType"><xliff:g>%s</xliff:g> vonalkód képe</string>
<string name="noCardIdError">Nincs azonosító megadva</string> <string name="noCardIdError">Nincs azonosító megadva</string>
<string name="noCardExistsError">A kártya nem található</string> <string name="noCardExistsError">Kártya nem található</string>
<string name="importStocardMessage">Válassza ki az importálandó <i>***.zip</i> Stocard export fájlt. <string name="importStocardMessage">Válassza ki a <i>***.zip</i> Stocard exportot.
\nAz adatainak exportálását a support@stocardapp.com címre írt levélben kérheti.</string> \nAdatinak exportját kérheti e-mailben a support@stocardapp.com címre írva.</string>
<string name="importVoucherVault">Importálás a Voucher Vaultból</string> <string name="importVoucherVault">Importálás Voucher Vault-ból</string>
<string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a kiválasztott vonalkódtípushoz</string> <string name="wrongValueForBarcodeType">Ez az érték meg megfelelő a vonalkód típushoz</string>
<string name="settings_green_theme">Zöld</string> <string name="settings_green_theme">Zöld</string>
<string name="setBackImage">Hátlapi kép beállítása</string> <string name="setBackImage">Hátlapi kép beállítása</string>
<string name="no">Nem</string> <string name="no">Nem</string>
<string name="passwordRequired">Adja meg a jelszót</string> <string name="passwordRequired">Kérem írja be a kódot</string>
<string name="settings_catima_theme">Catima</string> <string name="settings_catima_theme">Catima</string>
<string name="exportPasswordHint">Kód beírása</string> <string name="exportPasswordHint">Kód beírása</string>
<string name="failedGeneratingShareURL">Nem lehetett megosztható webcímet előállítani. Kérjük, ezt jelentse.</string> <string name="failedGeneratingShareURL">Nem lehetett megosztható címet generálni. Kérem jelentse ezt.</string>
<string name="settings_theme_color">Téma színe</string> <string name="settings_theme_color">Téma színe</string>
<string name="settings_grey_theme">Szürke</string> <string name="settings_grey_theme">Szürke</string>
<string name="sort">Rendezés</string> <string name="sort">Rendez</string>
<string name="on_google_play">a Google Playen</string> <string name="on_google_play">Google Play-en</string>
<string name="action_show_details">Részletek megjelenítése</string> <string name="action_show_details">Részletek mutatása</string>
<string name="action_hide_details">Részletek elrejtése</string> <string name="action_hide_details">Részletek elrejtése</string>
<string name="and_data_usage">és adathasználat</string> <string name="and_data_usage">és adat használat</string>
<string name="translate_platform">a Weblate-en</string> <string name="translate_platform">Weblate-en</string>
<string name="sort_by_name">Név</string> <string name="sort_by_name">Név</string>
<string name="sort_by_most_recently_used">Legutóbb használt</string> <string name="sort_by_most_recently_used">Legutóbb használt</string>
<string name="sort_by_expiry">Lejárat</string> <string name="sort_by_expiry">Lejárat</string>
<string name="rate_this_app">Értékelje az alkalmazást</string> <string name="rate_this_app">Értékelje az appot</string>
<string name="exportFailed">Nem sikerült az exportálás végrehajtása</string> <string name="exportFailed">Exportálás sikertelen</string>
<string name="importing">Importálás…</string> <string name="importing">Importálás…</string>
<string name="exporting">Exportálás…</string> <string name="exporting">Exportálás…</string>
<string name="exportOptionExplanation">Az adatok a kiválasztott helyre lesznek mentve.</string> <string name="exportOptionExplanation">Az adatokat a kiválasztott helyre fogjuk menteni.</string>
<string name="importOptionFilesystemTitle">Importálás fájlrendszerből</string> <string name="importOptionFilesystemTitle">Importálás fájlrendszerből</string>
<string name="importOptionFilesystemButton">A fájlrendszerből</string> <string name="importOptionFilesystemButton">A fájlrendszerből</string>
<string name="importOptionApplicationTitle">Másik alkalmazás használata</string> <string name="importOptionApplicationTitle">Másik app használata</string>
<string name="importOptionApplicationExplanation">A fájl megnyitásához használjon egy tetszőleges alkalmazást, vagy a kedvenc fájlkezelőjét.</string> <string name="importOptionApplicationExplanation">Használjon egy tetszőleges appot, vagy kedvenc fájl menedzserét a fájl megnyitásához.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string> <string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Szerzői Jog © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="app_license">Copyleft licencű szabad szoftver, GPLv3+ alatt közzétéve</string> <string name="app_license">Copyleft-elt gáttalan szoftver, GPLv3+ licenszelve</string>
<string name="about_title_fmt">A <xliff:g id="app_name">%s</xliff:g> névjegye</string> <string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g> névjegye</string>
<string name="debug_version_fmt">Verzió: <xliff:g id="version">%s</xliff:g></string> <string name="debug_version_fmt">Verzió: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revíziós információ: <xliff:g id="app_revision_url">%s</xliff:g></string> <string name="app_revision_fmt">Revíziós információ: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_resources">Szabad külső erőforrások: <xliff:g id="app_resources_list">%s</xliff:g></string> <string name="app_resources">Gáttalan külsős források: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Vonalkód kiválasztása</string> <string name="selectBarcodeTitle">Vonalkód kiválasztása</string>
<string name="enterBarcodeInstructions">Írja be az azonosítót, majd válasszon egy vonalkódot, vagy a Nincs vonalkód” lehetőséget.</string> <string name="enterBarcodeInstructions">Írja be az azonosítót, majd válasszon egy vonalkódot, vagy a \"Nincs vonalkód\" opciót.</string>
<string name="copy_to_clipboard_toast">Azonosító vágólapra másolva</string> <string name="copy_to_clipboard_toast">Azonosító vágólapra másolva</string>
<string name="starImage">Kedvencek csillag</string> <string name="starImage">Kedvencek csillag</string>
<string name="settings">Beállítások</string> <string name="settings">Beállítások</string>
@@ -101,26 +101,26 @@
<string name="settings_theme">Téma</string> <string name="settings_theme">Téma</string>
<string name="settings_system_theme">Rendszer</string> <string name="settings_system_theme">Rendszer</string>
<string name="settings_light_theme">Világos</string> <string name="settings_light_theme">Világos</string>
<string name="settings_max_font_size_scale">Legnagyobb betűméret</string> <string name="settings_max_font_size_scale">Max. betű méret</string>
<string name="settings_display_barcode_max_brightness">Vonalkód nézet világosítása</string> <string name="settings_display_barcode_max_brightness">Fényes vonalkód nézet</string>
<string name="settings_keep_screen_on">A képernyő bekapcsolva tartása</string> <string name="settings_keep_screen_on">Képernyő bekapcsolva marad</string>
<string name="settings_disable_lockscreen_while_viewing_card">Képernyőzárólás megakadályozása</string> <string name="settings_disable_lockscreen_while_viewing_card">Képernyő zárólás megakadályozása</string>
<string name="intent_import_card_from_url_share_text">Meg akarok veled osztani egy kártyát</string> <string name="intent_import_card_from_url_share_text">Meg akarok veled osztani egy kártyát</string>
<string name="importSuccessful">Adatok importálva</string> <string name="importSuccessful">Adat importálva</string>
<string name="exportSuccessful">Adatok exportálva</string> <string name="exportSuccessful">Adat exportálva</string>
<string name="enter_group_name">Adja meg a csoport nevét</string> <string name="enter_group_name">Adja meg a csoport nevét</string>
<string name="groups">Csoportok</string> <string name="groups">Csoportok</string>
<string name="group_edit">Csoport szerkesztése</string> <string name="group_edit">Csoport szerkesztése</string>
<string name="group_name_is_empty">A csoportnév nem lehet üres</string> <string name="group_name_is_empty">Csoport név nem lehet üres</string>
<string name="failedOpeningFileManager">Előbb telepítsen egy fájlkezelőt.</string> <string name="failedOpeningFileManager">Telepítsen egy fájl menedzsert.</string>
<string name="moveUp">Mozgatás felfelé</string> <string name="moveUp">Felfelé mozgatás</string>
<string name="moveDown">Mozgatás lefelé</string> <string name="moveDown">Lefelé mozgatás</string>
<string name="leaveWithoutSaveTitle">Kilépés</string> <string name="leaveWithoutSaveTitle">Kilépés</string>
<string name="leaveWithoutSaveConfirmation">Kilépés mentés nélkül\?</string> <string name="leaveWithoutSaveConfirmation">Kilépés mentés nélkül\?</string>
<string name="addManually">Azonosító kézi beírása</string> <string name="addManually">Azonosító manuális beírása</string>
<string name="addFromImage">Kép kiválasztása a galériából</string> <string name="addFromImage">Kép kiválasztása a galériából</string>
<string name="editGroup">Csoportok szerkesztése: <xliff:g>%s</xliff:g></string> <string name="editGroup">Csoportok szerkesztése: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Lejárat: <xliff:g>%s</xliff:g></string> <string name="expiryStateSentence">Érvényes: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">Egyenleg: <xliff:g>%s</xliff:g></string> <string name="balanceSentence">Egyenleg: <xliff:g>%s</xliff:g></string>
<string name="card">Kártya</string> <string name="card">Kártya</string>
<string name="barcode">Vonalkód</string> <string name="barcode">Vonalkód</string>
@@ -133,25 +133,25 @@
<string name="noBarcodeFound">Nem található vonalkód</string> <string name="noBarcodeFound">Nem található vonalkód</string>
<string name="errorReadingImage">Nem lehet olvasni a képet</string> <string name="errorReadingImage">Nem lehet olvasni a képet</string>
<string name="balance">Egyenleg</string> <string name="balance">Egyenleg</string>
<string name="currency">Pénznem</string> <string name="currency">Valuta</string>
<string name="points">Pontok</string> <string name="points">Pontok</string>
<string name="parsingBalanceFailed">A(z) <xliff:g>%s</xliff:g> nem tűnik valós egyenlegnek.</string> <string name="parsingBalanceFailed">A <xliff:g>%s</xliff:g> nem tűnik valós egyenlegnek.</string>
<string name="app_loyalty_card_keychain">Hűségkártya-kulcstartó</string> <string name="app_loyalty_card_keychain">Hűségkártya kulcstartó</string>
<string name="privacy_policy">Adatvédelmi irányelvek</string> <string name="privacy_policy">Adatvédelmi Szabályzat</string>
<string name="accept">Elfogadás</string> <string name="accept">Elfogad</string>
<string name="importCatima">Importálás a Catimából</string> <string name="importCatima">Importálás Catimából</string>
<string name="importFidme">Importálás a FidMeből</string> <string name="importFidme">Importálás FidMe-ből</string>
<string name="importLoyaltyCardKeychain">Importálás a Loyalty Card Keychainből</string> <string name="importLoyaltyCardKeychain">Importálás a Loyalty Card Keychain-ből</string>
<string name="importLoyaltyCardKeychainMessage">Válassza ki a Loyalty Card Keychainl importálandó <i>LoyaltyCardKeychain.csv</i> export fájlt. <string name="importLoyaltyCardKeychainMessage">Válassza ki a Loyalty Card Keychain-ból importálni kívánt <i>LoyaltyCardKeychain.csv</i> export fájlt.
\nEzt hozza létre a Loyalty Card Keychainben az Importálás/exportálás menüben, az Exportálás megnyomásával.</string> \nLétrehozhatja az Import/Export menüből ha a Loyalty Card Keychain-ben rányom az Exportra.</string>
<string name="importStocard">Importálás a Stocardból</string> <string name="importStocard">Importálás Stocard-ból</string>
<string name="importVoucherVaultMessage">Válassza ki az importálandó <i>vouchervault.json</i> Voucher Vault export fájlt. <string name="importVoucherVaultMessage">Válassza ki a <i>vouchervault.json</i> Voucher Vault exportt.
\nEzt hozza létre a Voucher Vaultban az Exportálás megnyomásával.</string> \nLétrehozhatja az Export-ra nyomva a Voucher Vault-ban.</string>
<string name="barcodeId">Vonalkód értéke</string> <string name="barcodeId">Vonalkód érték</string>
<string name="sameAsCardId">Ugyanaz, mint az azonosító</string> <string name="sameAsCardId">Ugyanaz, mint az azonosító</string>
<string name="setBarcodeId">Vonalkód értékének beállítása</string> <string name="setBarcodeId">Vonalkód érték beállítása</string>
<string name="unsupportedBarcodeType">Ez a vonalkódtípus még nem jeleníthető meg. Lehet, hogy támogatott lesz az alkalmazás egy későbbi verzióban.</string> <string name="unsupportedBarcodeType">Ez a vonalkód típus még nem megjeleníthető. Feltehetően támogatva lesz egy későbbi verzióban.</string>
<string name="copy_to_clipboard_multiple_toast">Az azonosítók a vágólapra másolva</string> <string name="copy_to_clipboard_multiple_toast">Azonosítók a vágólapra másolva</string>
<string name="intent_import_card_from_url_share_multiple_text">Meg akarok veled osztani pár kártyát</string> <string name="intent_import_card_from_url_share_multiple_text">Meg akarok veled osztani pár kártyát</string>
<string name="frontImageDescription">Előlapi kép</string> <string name="frontImageDescription">Előlapi kép</string>
<string name="backImageDescription">Hátlapi kép</string> <string name="backImageDescription">Hátlapi kép</string>
@@ -159,10 +159,10 @@
<string name="setFrontImage">Előlapi kép beállítása</string> <string name="setFrontImage">Előlapi kép beállítása</string>
<string name="removeImage">Kép eltávolítása</string> <string name="removeImage">Kép eltávolítása</string>
<string name="takePhoto">Fénykép készítése</string> <string name="takePhoto">Fénykép készítése</string>
<string name="updateBarcodeQuestionTitle">Vonalkódérték frissítése\?</string> <string name="updateBarcodeQuestionTitle">Vonalkód érték frissítése\?</string>
<string name="updateBarcodeQuestionText">Megváltoztatta az azonosítót. Ennek megfelelően megváltoztatja a vonalkód értéket is\?</string> <string name="updateBarcodeQuestionText">Megváltoztatta az azonosító. Meg akarja ennek megfelelően változtatni a vonalkód értéket is\?</string>
<string name="yes">Igen</string> <string name="yes">Igen</string>
<string name="exportPassword">Állítson be egy jelszót az export védelme érdekében (nem kötelező)</string> <string name="exportPassword">Írjon be egy jelszót az export védelme érdekében (opcionális)</string>
<string name="turn_flashlight_on">Zseblámpa bekapcsolása</string> <string name="turn_flashlight_on">Zseblámpa bekapcsolása</string>
<string name="turn_flashlight_off">Zseblámpa kikapcsolása</string> <string name="turn_flashlight_off">Zseblámpa kikapcsolása</string>
<string name="settings_locale">Nyelv</string> <string name="settings_locale">Nyelv</string>
@@ -170,111 +170,102 @@
<string name="selectColor">Szín kiválasztása</string> <string name="selectColor">Szín kiválasztása</string>
<string name="setIcon">Ikon beállítása</string> <string name="setIcon">Ikon beállítása</string>
<string name="settings_pink_theme">Rózsaszín</string> <string name="settings_pink_theme">Rózsaszín</string>
<string name="settings_magenta_theme">Bíbor</string> <string name="settings_magenta_theme">Magenta</string>
<string name="settings_violet_theme">Ibolya</string> <string name="settings_violet_theme">Ibolyaszínű</string>
<string name="settings_blue_theme">Kék</string> <string name="settings_blue_theme">Kék</string>
<string name="settings_sky_blue_theme">Égszínkék</string> <string name="settings_sky_blue_theme">Égszínkék</string>
<string name="settings_brown_theme">Barna</string> <string name="settings_brown_theme">Barna</string>
<string name="app_contributors">Lehetővé tették: <xliff:g id="app_contributors">%s</xliff:g></string> <string name="app_contributors">Lehetővé tette: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="showMoreInfo">Információk megjelenítése</string> <string name="showMoreInfo">Infó mutatása</string>
<string name="hideMoreInfo">Információk elrejtése</string> <string name="hideMoreInfo">Infó elrejtése</string>
<string name="swipeToSwitchImages">Legyintsen a képek váltásához, tartsa lenyomva a kép megnyitásához a galéria alkalmazásban</string> <string name="swipeToSwitchImages">Csúsztassa ujját a képek váltásához, tartsa lenyomva a kép megnyitásához a Galéria alkalmazásban</string>
<string name="sort_by_balance">Egyenleg</string> <string name="sort_by_balance">Egyenleg</string>
<string name="reverse">fordított sorrendben</string> <string name="reverse">...fordított sorrendben</string>
<string name="sort_by">Rendezés:</string> <string name="sort_by">Rendezés mint</string>
<string name="version_history">Verziótörténet</string> <string name="version_history">Verzió történet</string>
<string name="credits">Köszönet</string> <string name="credits">Köszönet</string>
<string name="help_translate_this_app">Segítsen lefordítani az alkalmazást</string> <string name="help_translate_this_app">Segítsen lefordítani az appot</string>
<string name="license">Licenc</string> <string name="license">Licensz</string>
<string name="source_repository">Forráskódtároló</string> <string name="source_repository">Forrás repó</string>
<string name="on_github">a GitHubon</string> <string name="on_github">GitBub-on</string>
<string name="report_error">Hiba jelentése</string> <string name="report_error">Hiba Jelentése</string>
<string name="shortcutSelectCard">Válasszon egy kártyát</string> <string name="shortcutSelectCard">Válasszon egy kártyát</string>
<string name="options">Beállítások</string> <string name="options">Beállítások</string>
<string name="starred">Csillagozva</string> <string name="starred">Csillagozva</string>
<string name="set_scale">Méret beállítása</string> <string name="set_scale">Méret választása</string>
<plurals name="groupCardCount"> <plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kártya</item> <item quantity="one"><xliff:g>%d</xliff:g> kártya</item>
<item quantity="other"><xliff:g>%d</xliff:g> kártya</item> <item quantity="other"><xliff:g>%d</xliff:g> kártyák</item>
</plurals> </plurals>
<plurals name="balancePoints"> <plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> pont</item> <item quantity="one"><xliff:g>%s</xliff:g> pont</item>
<item quantity="other"><xliff:g>%s</xliff:g> pontok</item> <item quantity="other"><xliff:g>%s</xliff:g> pontok</item>
</plurals> </plurals>
<string name="chooseImportType">Adatok importálása innen</string> <string name="chooseImportType">Adat importálása innen</string>
<string name="thumbnailDescription">Előkép</string> <string name="thumbnailDescription">Előkép</string>
<string name="importOptionFilesystemExplanation">Válassza ki a kívánt fájlt a fájlrendszerből.</string> <string name="importOptionFilesystemExplanation">Válassza ki a kívánt fájlt a fájlrendszerből.</string>
<string name="importOptionApplicationButton">Másik alkalmazás használata</string> <string name="importOptionApplicationButton">Másik app használata</string>
<string name="about">Névjegy</string> <string name="about">Névjegy</string>
<string name="app_copyright_old">Készült a Loyalty Card Keychain alapján <string name="app_copyright_old">Készült a Loyalty Card Keychain alapján
\nCopyright © 20162020 Branden Archer</string> \nszerzői jog © 20162020 Branden Archer</string>
<string name="app_libraries">Szabad külső programkönyvtárak: <xliff:g id="app_libraries_list">%s</xliff:g></string> <string name="app_libraries">Gáttalan külsős mappák: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="settings_dark_theme">Sötét</string> <string name="settings_dark_theme">Sötét</string>
<string name="deleteConfirmationGroup">Csoport törlése\?</string> <string name="deleteConfirmationGroup">Csoport törlése\?</string>
<string name="noGroups">Nyomja meg a + gombot a csoportok kategorizálásához.</string> <string name="noGroups">Nyomja meg a + gombot a csoportok kategorizálásához.</string>
<string name="group_name_already_in_use">A csoportnév már létezik</string> <string name="group_name_already_in_use">Csoport név már létezik</string>
<string name="all">Összes</string> <string name="all">Mind</string>
<string name="noGroupCards">Ez a csoport üres</string> <string name="noGroupCards">Ez a csoport üres</string>
<string name="group_updated">Csoport frissítve</string> <string name="group_updated">Csoport frissítve</string>
<string name="expiryStateSentenceExpired">Lejárt: <xliff:g>%s</xliff:g></string> <string name="expiryStateSentenceExpired">Lejárt: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Csoportok: <xliff:g>%s</xliff:g></string> <string name="groupsList">Csoportok: <xliff:g>%s</xliff:g></string>
<string name="importCatimaMessage">Válassza ki az exportált <i>catima.zip</i> fájlt az importáláshoz. <string name="importCatimaMessage">Válassza ki a <i>catima.zip</i>-jét az importáláshoz.
\nLétrehozhatja az Importálás/exportálás menüből az Exportálást megnyomva egy másik Catima alkalmazásban.</string> \nLétrehozhatja az Import/Export menüből az Exportálást megnyomva egy másik Catima appban.</string>
<string name="privacy_policy_popup_text">Adatvédelmi irányelvek nyilatkozata (némely alkalmazásbolt kéri): <string name="privacy_policy_popup_text">Adatvédelmi szabály értesítő (némely app bolt kéri):
\n \n
\nSEMMILYEN ADAT NEM KERÜL GYŰJTÉSRE, amit bárki ellenőrizhet, hiszen az alkalmazás szabad szoftver.</string> \nSEMMILYEN ADATGYŰJTÉS NINCS, amit bárki ellenőrizhet, lévén hogy az app gáttalan szoftver.</string>
<string name="importFidmeMessage">Válassza ki a FidMeből exportált <i>fidme-export-request-xxxxxx.zip</i> fájl majd importálja be, és utána válassza a kézi vonalkódbeírást. <string name="importFidmeMessage">Válassza ki a <i>fidme-export-request-xxxxxx.zip</i> nevű FidMe exportot, majd importálja be és válassza a manuális vonalkód opciót utána.
\nEzt hozza létre a FidMe-profiljában az Adatvédelem rész választásával, majd a Saját adatok kinyerése megnyomásával.</string> \nEzt a FidMe-ben megtalálja a profiljában az Adat Védelem résznél ha rányom az Adataim Kivonata linkre.</string>
<string name="settings_card_orientation">Vonalkód tájolása</string> <string name="settings_card_orientation">Vonalkód tájolás</string>
<plurals name="groupCardCountWithArchived"> <plurals name="groupCardCountWithArchived">
<item quantity="one"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item> <item quantity="one"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
<item quantity="other"><xliff:g>%1$d</xliff:g> kártya (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item> <item quantity="other"><xliff:g>%1$d</xliff:g> kártyák (<xliff:g id="archivedCount">%2$d</xliff:g> archiválva)</item>
</plurals> </plurals>
<string name="noUnarchivedCardsMessage">Nincs archiválatlan kártya</string> <string name="noUnarchivedCardsMessage">Nincs archiválatlan kártya</string>
<string name="failedToOpenUrl">Először telepítsen egy webböngészőt</string> <string name="failedToOpenUrl">Először telepíts egy webböngészőt</string>
<string name="failedLaunchingPhotoPicker">Nem található támogatott galéria alkalmazás</string> <string name="failedLaunchingPhotoPicker">Nem található támogatott képnézegető app</string>
<string name="previousCard">Előző</string> <string name="previousCard">Előző</string>
<string name="nextCard">Következő</string> <string name="nextCard">Következő</string>
<string name="settings_portrait_orientation">Álló</string> <string name="settings_portrait_orientation">Álló</string>
<string name="settings_follow_system_orientation">Rendszer követése</string> <string name="settings_follow_system_orientation">Rendszer követése</string>
<string name="settings_lock_on_opening_orientation">A használt tájolás zárolása a kártya megnyitásakor</string> <string name="settings_lock_on_opening_orientation">A használt tájolás zárolása kártya használatakor</string>
<string name="settings_landscape_orientation">Fekvő</string> <string name="settings_landscape_orientation">Fekvő</string>
<string name="settings_oled_dark">Teljesen fekete háttér a sötét témánál</string> <string name="settings_oled_dark">Tiszta fekete háttér sötét témánál</string>
<string name="include_if_asking_support">Ha támogatás akar kérni, ossza meg az alábbi információkat:</string> <string name="include_if_asking_support">Ha támogatást szeretnél igénybe venni, oszd meg az alábbi információkat:</string>
<string name="archive">Archiválás</string> <string name="archive">Archivál</string>
<string name="unarchive">Archiválás megszüntetése</string> <string name="unarchive">Archiválás megszüntetése</string>
<string name="archived">Kártya archiválva</string> <string name="archived">Kártya archiválása</string>
<string name="archiveList">Archívum</string> <string name="archiveList">Archivál</string>
<string name="duplicateCard">Klónozás</string> <string name="duplicateCard">Másolat</string>
<string name="currentBalanceSentence">Jelenlegi egyenleg: <xliff:g>%s</xliff:g></string> <string name="currentBalanceSentence">Jelenlegi egyenleg: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Adja meg az összeget</string> <string name="updateBalanceHint">Adja meg az összeget</string>
<string name="importCards">Kártyák importálása</string> <string name="importCards">Kártyák importálása</string>
<string name="updateBalanceTitle">Mennyit költött\?</string> <string name="updateBalanceTitle">Mennyit költöttél\?</string>
<string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string> <string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string> <string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string>
<string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string> <string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string>
<string name="barcodeLongPressMessage">Csak képek nyithatók meg a galéria alkalmazásban</string> <string name="barcodeLongPressMessage">Csak képek nyithatók meg a galéria alkalmazásban</string>
<string name="unarchived">Kártya archiválása megszüntetve</string> <string name="unarchived">Archiválatlan kártya</string>
<string name="welcome">Üdvözöljük a Catimában</string> <string name="welcome">Üdvözöljük Catimában</string>
<plurals name="viewArchivedCardsWithCount"> <plurals name="viewArchivedCardsWithCount">
<item quantity="one">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártya)</item> <item quantity="one">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártya)</item>
<item quantity="other">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártya)</item> <item quantity="other">Archívum megtekintése (<xliff:g>%1$d</xliff:g> kártyák)</item>
</plurals> </plurals>
<string name="updateBalance">Egyenleg frissítése</string> <string name="updateBalance">Egyenleg frissítése</string>
<string name="noCameraPermissionDirectToSystemSetting">A vonalkódok leolvasásához a Catimának hozzá kell férnie a kamerához. Koppintson ide az engedélybeállítások módosításához.</string> <string name="noCameraPermissionDirectToSystemSetting">A vonalkódok beolvasásához a Catimának hozzá kell férnie a kamerához. Koppintson ide az engedélybeállítások módosításához.</string>
<string name="validFromDate">Érvényesség kezdete</string> <string name="validFromDate">Érvényesség kezdete</string>
<string name="anyDate">Bármely dátum</string> <string name="anyDate">Bármely dátum</string>
<string name="chooseValidFromDate">Válassza ki az érvényesség kezdetét</string> <string name="chooseValidFromDate">Válassza ki az érvényesség kezdeti dátumot</string>
<string name="validFromSentence">Érvényesség kezdete: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Érvényesség kezdete: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">A művelethez tárolóolvasási engedély szükséges…</string> <string name="storageReadPermissionRequired">A művelethez tároló olvasási engedély szükséges…</string>
<string name="cameraPermissionRequired">A művelethez a kamera-hozzáférési engedély szükséges…</string> <string name="cameraPermissionRequired">A kamerához való hozzáférés engedélye szükséges ehhez a művelethez</string>
<string name="height">Magasság:</string>
<string name="switchToFrontImage">Elölnézeti képre váltás</string>
<string name="switchToBackImage">Hátulnézeti képre váltás</string>
<string name="switchToBarcode">Vonalkódra váltás</string>
<string name="donate">Adományozás</string>
<string name="openImageInGallery">Kép megnyitása a galéria alkalmazásban</string>
<string name="openBackImageInGalleryApp">Hátulnézeti kép megnyitása a galéria alkalmazásban</string>
<string name="openFrontImageInGalleryApp">Elölnézeti kép megnyitása a galéria alkalmazásban</string>
<string name="setBarcodeHeight">Vonalkód magasságának megadása</string>
</resources> </resources>

View File

@@ -263,13 +263,4 @@
\n<xliff:g>%s</xliff:g></string> \n<xliff:g>%s</xliff:g></string>
<string name="anyDate">Kapan pun</string> <string name="anyDate">Kapan pun</string>
<string name="chooseValidFromDate">Pilih valid dari tanggal</string> <string name="chooseValidFromDate">Pilih valid dari tanggal</string>
<string name="height">Tinggi:</string>
<string name="switchToFrontImage">Ubah ke depan gambar</string>
<string name="switchToBackImage">Ubah ke belakang gambar</string>
<string name="switchToBarcode">Ubah ke kode batang</string>
<string name="openImageInGallery">Buka gambar dari galeri app</string>
<string name="openFrontImageInGalleryApp">Buka gambar didepan di galeri app</string>
<string name="openBackImageInGalleryApp">Buka gambar dibelakang di galeri app</string>
<string name="setBarcodeHeight">Atur tinggi kode batang</string>
<string name="donate">Donasi</string>
</resources> </resources>

View File

@@ -275,13 +275,4 @@
<string name="chooseValidFromDate">Scegli la data di validità</string> <string name="chooseValidFromDate">Scegli la data di validità</string>
<string name="validFromSentence">Valido da: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Valido da: <xliff:g>%s</xliff:g></string>
<string name="anyDate">Qualsiasi data</string> <string name="anyDate">Qualsiasi data</string>
<string name="height">Altezza:</string>
<string name="switchToFrontImage">Passa all\'immagine frontale</string>
<string name="switchToBackImage">Passa all\'immagine dietro</string>
<string name="switchToBarcode">Passa al codice a barre</string>
<string name="openFrontImageInGalleryApp">Apri l\'immagine frontale nell\'app Galleria</string>
<string name="donate">Dona</string>
<string name="openImageInGallery">Apri l\'immagine nell\'app Galleria</string>
<string name="openBackImageInGalleryApp">Apri l\'immagine posteriore nell\'app Galleria</string>
<string name="setBarcodeHeight">Imposta l\'altezza del codice a barre</string>
</resources> </resources>

View File

@@ -271,17 +271,4 @@
<string name="importCards">Importuoti korteles</string> <string name="importCards">Importuoti korteles</string>
<string name="storageReadPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie saugyklos…</string> <string name="storageReadPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie saugyklos…</string>
<string name="cameraPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie kameros…</string> <string name="cameraPermissionRequired">Šio veiksmo atlikimui reikalinga prieiga prie kameros…</string>
<string name="openBackImageInGalleryApp">Atidarykite galinį vaizdą galerijos programėlėje</string>
<string name="setBarcodeHeight">Nustatyti brūkšninio kodo aukštį</string>
<string name="validFromDate">Galioja nuo</string>
<string name="anyDate">Bet kuri data</string>
<string name="chooseValidFromDate">Pasirinkite datą, galiojančią nuo</string>
<string name="validFromSentence">Galioja nuo: <xliff:g>%s</xliff:g></string>
<string name="switchToBackImage">Perjungti į galinį vaizdą</string>
<string name="switchToBarcode">Perjungti į brūkšninį kodą</string>
<string name="openImageInGallery">Atidarykite paveikslėlį galerijos programėlėje</string>
<string name="height">Aukštis:</string>
<string name="switchToFrontImage">Perjungti į priekinį vaizdą</string>
<string name="openFrontImageInGalleryApp">Atidarykite priekinį vaizdą galerijos programėlėje</string>
<string name="donate">Aukoti</string>
</resources> </resources>

View File

@@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_search">Meklēt</string> <string name="action_search">Meklēt</string>
<string name="action_add">Pievienot</string> <string name="action_add">Pievienot</string>
<string name="noGiftCards">Noklikšķiniet uz pogas + plus, lai pievienotu karti, vai vispirms importējiet no ⋮ izvēlnes.</string> <string name="noGiftCards">Noklikšķiniet uz pogas + plus, lai pievienotu karti, vai vispirms importējiet dažus no ⋮ izvēlnes.</string>
<string name="noMatchingGiftCards">Nav rezultātu. Mēģiniet mainīt meklējamo tekstu.</string> <string name="noMatchingGiftCards">Nav rezultātu. Mēģiniet mainīt meklējamo tekstu.</string>
<string name="storeName">Nosaukums</string> <string name="storeName">Nosaukums</string>
<string name="note">Piezīme</string> <string name="note">Piezīme</string>
@@ -256,14 +256,4 @@
</plurals> </plurals>
<string name="failedToOpenUrl">Vispirms nepieciešams uzstādīt interneta pārlūku</string> <string name="failedToOpenUrl">Vispirms nepieciešams uzstādīt interneta pārlūku</string>
<string name="welcome">Laipni lūgti Catima</string> <string name="welcome">Laipni lūgti Catima</string>
<string name="cameraPermissionRequired">Ir nepieciešama pieeja kamerai lai veiktu šo darbību</string>
<string name="noCameraPermissionDirectToSystemSetting">Lai skanētu svītrkods, Catima ir nepieciešama pieeja jūsu kamerai. Nospied šeit lai nomainītu atļaujas iestatījumus.</string>
<string name="cameraPermissionDeniedTitle">Nevar pievienieties kamerai</string>
<string name="updateBalance">Atjaunināta bilance</string>
<string name="updateBalanceTitle">Cik daudz Tu iztērēji\?</string>
<string name="updateBalanceHint">Ievadi summu</string>
<string name="currentBalanceSentence">Šābrīža bilance: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Jauna bilance: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">Atļauja lasīt noliktavu ir nepieciešama šai darbībai…</string>
<string name="importCards">Importēt kartes</string>
</resources> </resources>

View File

@@ -27,18 +27,10 @@
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item> <item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item> <item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
<item name="colorPrimaryInverse">@color/md_theme_dark_primaryInverse</item> <item name="colorPrimaryInverse">@color/md_theme_dark_primaryInverse</item>
<item name="materialAlertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="alertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="windowActionModeOverlay">true</item> <item name="windowActionModeOverlay">true</item>
</style> </style>
<style name="ThemeOverlay.App.MaterialAlertDialog.Monet" parent="ThemeOverlay.Material3.MaterialAlertDialog">
<item name="alertDialogStyle">@style/MaterialAlertDialog.Material3</item>
<item name="dialogCornerRadius">28dp</item>
<item name="android:background">@drawable/dialog_bg_monet</item>
</style>
<!-- note that this is not used directly, these are used to patch the active theme runtime with <!-- note that this is not used directly, these are used to patch the active theme runtime with
theme.applyStyle theme.applyStyle
--> -->

View File

@@ -268,13 +268,4 @@
<string name="validFromDate">Geldig vanaf</string> <string name="validFromDate">Geldig vanaf</string>
<string name="validFromSentence">Geldig vanaf: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Geldig vanaf: <xliff:g>%s</xliff:g></string>
<string name="chooseValidFromDate">Kies een geldige vanaf-datum</string> <string name="chooseValidFromDate">Kies een geldige vanaf-datum</string>
<string name="setBarcodeHeight">Barcodehoogte instellen</string>
<string name="height">Hoogte:</string>
<string name="switchToFrontImage">Voorzijde tonen</string>
<string name="switchToBackImage">Achterzijde tonen</string>
<string name="switchToBarcode">Barcode tonen</string>
<string name="openImageInGallery">Afbeelding openen in galerij-app</string>
<string name="openFrontImageInGalleryApp">Voorzijde openen in galerij-app</string>
<string name="openBackImageInGalleryApp">Achterzijde openen in galerij-app</string>
<string name="donate">Doneren</string>
</resources> </resources>

View File

@@ -51,7 +51,7 @@
<string name="settings">Paramètres</string> <string name="settings">Paramètres</string>
<string name="settings_category_title_ui">Interfàcia utilizaire</string> <string name="settings_category_title_ui">Interfàcia utilizaire</string>
<string name="settings_theme">Tèma</string> <string name="settings_theme">Tèma</string>
<string name="noGiftCards">Clicatz lo boton + per apondre una carta o nimportar una menú ⋮</string> <string name="noGiftCards">Clicatz lo boton + per apondre una carta o utilizatz lo menú ⋮ per nimportar una.</string>
<string name="noMatchingGiftCards">Cap de resultat. Ensajatz de modificar vòstra recèrca.</string> <string name="noMatchingGiftCards">Cap de resultat. Ensajatz de modificar vòstra recèrca.</string>
<string name="settings_light_theme">Clar</string> <string name="settings_light_theme">Clar</string>
<string name="settings_dark_theme">Escur</string> <string name="settings_dark_theme">Escur</string>
@@ -66,5 +66,4 @@
<string name="settings_max_font_size_scale">Talha max. de la poliça</string> <string name="settings_max_font_size_scale">Talha max. de la poliça</string>
<string name="settings_theme_color">Color del tèma</string> <string name="settings_theme_color">Color del tèma</string>
<string name="settings_locale">Lenga</string> <string name="settings_locale">Lenga</string>
<string name="noGiftCardsGroup">Creatz de cartas puèi ligatz-las al grop aicí.</string>
</resources> </resources>

View File

@@ -282,13 +282,4 @@
<string name="anyDate">Любая дата</string> <string name="anyDate">Любая дата</string>
<string name="chooseValidFromDate">Выбор даты действия</string> <string name="chooseValidFromDate">Выбор даты действия</string>
<string name="validFromSentence">Действует с: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Действует с: <xliff:g>%s</xliff:g></string>
<string name="setBarcodeHeight">Указать высоту штрих-кода</string>
<string name="height">Высота:</string>
<string name="switchToBarcode">Переключить на штрих-код</string>
<string name="switchToFrontImage">Переключить на лицевую сторону</string>
<string name="switchToBackImage">Переключить на заднюю сторону</string>
<string name="openImageInGallery">Открыть изображение в приложении галереи</string>
<string name="openFrontImageInGalleryApp">Открыть лицевое изображение в приложении галереи</string>
<string name="openBackImageInGalleryApp">Открыть заднее изображение в приложении галереи</string>
<string name="donate">Пожертвовать</string>
</resources> </resources>

View File

@@ -268,13 +268,4 @@
<string name="anyDate">Herhangi bir tarih</string> <string name="anyDate">Herhangi bir tarih</string>
<string name="validFromDate">Geçerlilik başlangıcı</string> <string name="validFromDate">Geçerlilik başlangıcı</string>
<string name="validFromSentence"><xliff:g>%s</xliff:g> tarihinden itibaren geçerlidir</string> <string name="validFromSentence"><xliff:g>%s</xliff:g> tarihinden itibaren geçerlidir</string>
<string name="height">Yükseklik:</string>
<string name="switchToBackImage">Arka resme geç</string>
<string name="switchToBarcode">Barkoda geç</string>
<string name="openImageInGallery">Resmi galeri uygulamasında aç</string>
<string name="donate">Bağış yap</string>
<string name="switchToFrontImage">Ön resme geç</string>
<string name="setBarcodeHeight">Barkod yüksekliğini ayarla</string>
<string name="openFrontImageInGalleryApp">Ön resmi galeri uygulamasında aç</string>
<string name="openBackImageInGalleryApp">Arka resmi galeri uygulamasında aç</string>
</resources> </resources>

View File

@@ -261,13 +261,4 @@
<string name="chooseValidFromDate">选择有效日期</string> <string name="chooseValidFromDate">选择有效日期</string>
<string name="validFromSentence">有效期自: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">有效期自: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionRequired">此操作所需的访问相机的权限…</string> <string name="cameraPermissionRequired">此操作所需的访问相机的权限…</string>
<string name="height">高度:</string>
<string name="switchToFrontImage">选择正面图像</string>
<string name="switchToBackImage">选择背面图像</string>
<string name="switchToBarcode">选择条形码</string>
<string name="openImageInGallery">使用图库软件打开图像</string>
<string name="openFrontImageInGalleryApp">使用图库软件打开正面图像</string>
<string name="openBackImageInGalleryApp">使用图库软件打开背面图像</string>
<string name="setBarcodeHeight">设置条形码高度</string>
<string name="donate">捐赠</string>
</resources> </resources>

View File

@@ -313,13 +313,4 @@
<string name="anyDate">Any date</string> <string name="anyDate">Any date</string>
<string name="chooseValidFromDate">Choose valid from date</string> <string name="chooseValidFromDate">Choose valid from date</string>
<string name="validFromSentence">Valid from: <xliff:g>%s</xliff:g></string> <string name="validFromSentence">Valid from: <xliff:g>%s</xliff:g></string>
<string name="height">Height:</string>
<string name="switchToFrontImage">Switch to front image</string>
<string name="switchToBackImage">Switch to back image</string>
<string name="switchToBarcode">Switch to barcode</string>
<string name="openImageInGallery">Open image in gallery app</string>
<string name="openFrontImageInGalleryApp">Open front image in gallery app</string>
<string name="openBackImageInGalleryApp">Open back image in gallery app</string>
<string name="setBarcodeHeight">Set barcode height</string>
<string name="donate">Donate</string>
</resources> </resources>

View File

@@ -27,17 +27,8 @@
<item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface</item> <item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface</item> <item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface</item>
<item name="colorPrimaryInverse">@color/md_theme_light_primaryInverse</item> <item name="colorPrimaryInverse">@color/md_theme_light_primaryInverse</item>
<item name="materialAlertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="alertDialogTheme">@style/ThemeOverlay.App.MaterialAlertDialog.Monet</item>
<item name="windowActionModeOverlay">true</item> <item name="windowActionModeOverlay">true</item>
</style>
<style name="ThemeOverlay.App.MaterialAlertDialog.Monet" parent="ThemeOverlay.Material3.MaterialAlertDialog">
<item name="alertDialogStyle">@style/MaterialAlertDialog.Material3</item>
<item name="dialogCornerRadius">28dp</item>
<item name="android:background">@drawable/dialog_bg_monet</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="AppTheme"> <style name="AppTheme.NoActionBar" parent="AppTheme">

View File

@@ -25,7 +25,6 @@
app:singleLineTitle="false" /> app:singleLineTitle="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="false" android:defaultValue="false"
android:key="@string/settings_key_oled_dark" android:key="@string/settings_key_oled_dark"
android:title="@string/settings_oled_dark" android:title="@string/settings_oled_dark"
@@ -53,7 +52,6 @@
app:singleLineTitle="false" /> app:singleLineTitle="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_key_display_barcode_max_brightness" android:key="@string/settings_key_display_barcode_max_brightness"
android:title="@string/settings_display_barcode_max_brightness" android:title="@string/settings_display_barcode_max_brightness"
@@ -70,7 +68,6 @@
app:singleLineTitle="false" /> app:singleLineTitle="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_key_keep_screen_on" android:key="@string/settings_key_keep_screen_on"
android:title="@string/settings_keep_screen_on" android:title="@string/settings_keep_screen_on"
@@ -78,14 +75,11 @@
app:singleLineTitle="false" /> app:singleLineTitle="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preference_material_switch"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_key_disable_lockscreen_while_viewing_card" android:key="@string/settings_key_disable_lockscreen_while_viewing_card"
android:title="@string/settings_disable_lockscreen_while_viewing_card" android:title="@string/settings_disable_lockscreen_while_viewing_card"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:singleLineTitle="false" /> app:singleLineTitle="false" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -60,13 +60,25 @@ public class LoyaltyCardCursorAdapterTest {
return viewHolder.itemView; return viewHolder.itemView;
} }
private void checkView(final View view, final String store, final String note, final String validFrom, final String expiry, final String balance) { private void checkView(final View view, final String store, final String note, final String validFrom, final String expiry, final String balance, boolean checkFontSizes) {
final TextView storeField = view.findViewById(R.id.thumbnail_text); final TextView storeField = view.findViewById(R.id.store);
final TextView noteField = view.findViewById(R.id.note); final TextView noteField = view.findViewById(R.id.note);
final TextView validFromField = view.findViewById(R.id.validFrom); final TextView validFromField = view.findViewById(R.id.validFrom);
final TextView expiryField = view.findViewById(R.id.expiry); final TextView expiryField = view.findViewById(R.id.expiry);
final TextView balanceField = view.findViewById(R.id.balance); final TextView balanceField = view.findViewById(R.id.balance);
if (checkFontSizes) {
Settings preferences = new Settings(activity.getApplicationContext());
int mediumFontSize = preferences.getFontSizeMax(preferences.getMediumFont());
int smallFontSize = preferences.getFontSizeMax(preferences.getSmallFont());
assertEquals(mediumFontSize, (int) storeField.getTextSize());
assertEquals(smallFontSize, (int) noteField.getTextSize());
assertEquals(smallFontSize, (int) validFromField.getTextSize());
assertEquals(smallFontSize, (int) expiryField.getTextSize());
}
assertEquals(store, storeField.getText().toString());
if (!note.isEmpty()) { if (!note.isEmpty()) {
assertEquals(View.VISIBLE, noteField.getVisibility()); assertEquals(View.VISIBLE, noteField.getVisibility());
assertEquals(note, noteField.getText().toString()); assertEquals(note, noteField.getText().toString());
@@ -107,7 +119,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", ""); checkView(view, card.store, card.note, "", "", "", false);
cursor.close(); cursor.close();
} }
@@ -122,7 +134,30 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", ""); checkView(view, card.store, card.note, "", "", "", false);
cursor.close();
}
@Test
public void TestCursorAdapterFontSizes() {
Date date = new Date();
String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(date);
DBHelper.insertLoyaltyCard(mDatabase, "store", "note", date, date, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0);
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase);
cursor.moveToFirst();
setFontScale(50);
View view = createView(cursor);
checkView(view, card.store, card.note, dateString, dateString, "", true);
setFontScale(200);
view = createView(cursor);
checkView(view, card.store, card.note, dateString, dateString, "", true);
cursor.close(); cursor.close();
} }
@@ -188,7 +223,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", ""); checkView(view, card.store, card.note, "", "", "", false);
cursor.close(); cursor.close();
} }
@@ -203,7 +238,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", ""); checkView(view, card.store, card.note, "", "", "", false);
cursor.close(); cursor.close();
} }
@@ -218,7 +253,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", "100 points"); checkView(view, card.store, card.note, "", "", "100 points", false);
cursor.close(); cursor.close();
} }
@@ -233,7 +268,7 @@ public class LoyaltyCardCursorAdapterTest {
View view = createView(cursor); View view = createView(cursor);
checkView(view, card.store, card.note, "", "", "$10.00"); checkView(view, card.store, card.note, "", "", "$10.00", false);
cursor.close(); cursor.close();
} }

View File

@@ -59,7 +59,6 @@ import java.util.Currency;
import java.util.Date; import java.util.Date;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.widget.TextViewCompat; import androidx.core.widget.TextViewCompat;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
@@ -310,7 +309,7 @@ public class LoyaltyCardViewActivityTest {
final String barcodeId, final String barcodeType, final String barcodeId, final String barcodeType,
final Bitmap frontImage, final Bitmap backImage) { final Bitmap frontImage, final Bitmap backImage) {
if (mode == ViewMode.VIEW_CARD) { if (mode == ViewMode.VIEW_CARD) {
checkFieldProperties(activity, R.id.card_id_view, View.VISIBLE, cardId, FieldTypeView.TextView); checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId, FieldTypeView.TextView);
} else { } else {
int editVisibility = View.VISIBLE; int editVisibility = View.VISIBLE;
@@ -622,7 +621,7 @@ public class LoyaltyCardViewActivityTest {
} }
@Test @Test
public void startWithLoyaltyCardViewModeCheckDisplay() { public void startWithLoyaltyCardViewModeCheckDisplay() throws IOException {
ActivityController activityController = createActivityWithLoyaltyCard(false); ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get(); Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext(); final Context context = activity.getApplicationContext();
@@ -1132,6 +1131,40 @@ public class LoyaltyCardViewActivityTest {
database.close(); database.close();
} }
@Test
public void startCheckFontSizes() {
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity) activityController.get();
SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase();
DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0);
final int LARGE_FONT_SIZE = 40;
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity);
settings.edit()
.putInt(activity.getResources().getString(R.string.settings_key_max_font_size_scale), 100)
.apply();
activityController.start();
activityController.visible();
activityController.resume();
assertEquals(false, activity.isFinishing());
TextView storeName = activity.findViewById(R.id.storeName);
TextView cardIdFieldView = activity.findViewById(R.id.cardIdView);
TextViewCompat.getAutoSizeMaxTextSize(storeName);
TextViewCompat.getAutoSizeMaxTextSize(storeName);
assertEquals(LARGE_FONT_SIZE, TextViewCompat.getAutoSizeMaxTextSize(cardIdFieldView));
shadowOf(activity).clickMenuItem(android.R.id.home);
assertEquals(true, activity.isFinishing());
database.close();
}
@Test @Test
public void checkPushStarIcon() { public void checkPushStarIcon() {
ActivityController activityController = createActivityWithLoyaltyCard(false); ActivityController activityController = createActivityWithLoyaltyCard(false);
@@ -1180,12 +1213,13 @@ public class LoyaltyCardViewActivityTest {
assertFalse(activity.isFinishing()); assertFalse(activity.isFinishing());
View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout);
BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar); BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar);
ImageView mainImage = activity.findViewById(R.id.main_image); ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton);
LinearLayout container = activity.findViewById(R.id.container); ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton);
ConstraintLayout fullScreenLayout = activity.findViewById(R.id.fullscreen_layout); LinearLayout dotIndicator = activity.findViewById(R.id.dotIndicator);
ImageButton minimizeButton = activity.findViewById(R.id.fullscreen_button_minimize);
FloatingActionButton editButton = activity.findViewById(R.id.fabEdit); FloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler);
// Android should not be in fullscreen mode // Android should not be in fullscreen mode
assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars())); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
@@ -1193,13 +1227,16 @@ public class LoyaltyCardViewActivityTest {
assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
// Elements should be visible (except minimize button and scaler) // Elements should be visible (except minimize button and scaler)
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, container.getVisibility()); assertEquals(View.VISIBLE, maximizeButton.getVisibility());
assertEquals(View.GONE, fullScreenLayout.getVisibility()); assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Click maximize button to activate fullscreen // Click maximize button to activate fullscreen
mainImage.performClick(); maximizeButton.performClick();
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
// Android should be in fullscreen mode // Android should be in fullscreen mode
@@ -1208,10 +1245,13 @@ public class LoyaltyCardViewActivityTest {
assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior());
// Elements should not be visible (except minimize button and scaler) // Elements should not be visible (except minimize button and scaler)
assertEquals(View.GONE, collapsingToolbarLayout.getVisibility());
assertEquals(View.GONE, bottomAppBar.getVisibility()); assertEquals(View.GONE, bottomAppBar.getVisibility());
assertEquals(View.GONE, container.getVisibility()); assertEquals(View.GONE, maximizeButton.getVisibility());
assertEquals(View.VISIBLE, fullScreenLayout.getVisibility()); assertEquals(View.VISIBLE, minimizeButton.getVisibility());
assertEquals(View.GONE, editButton.getVisibility()); assertEquals(View.GONE, editButton.getVisibility());
assertEquals(View.VISIBLE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Clicking minimize button should deactivate fullscreen mode // Clicking minimize button should deactivate fullscreen mode
minimizeButton.performClick(); minimizeButton.performClick();
@@ -1221,23 +1261,29 @@ public class LoyaltyCardViewActivityTest {
assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars())); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, container.getVisibility()); assertEquals(View.VISIBLE, maximizeButton.getVisibility());
assertEquals(View.GONE, fullScreenLayout.getVisibility()); assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Another click back to fullscreen // Another click back to fullscreen
mainImage.performClick(); maximizeButton.performClick();
shadowOf(getMainLooper()).idle(); shadowOf(getMainLooper()).idle();
assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars())); assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.statusBars()));
assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars())); assertFalse(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.GONE, collapsingToolbarLayout.getVisibility());
assertEquals(View.GONE, bottomAppBar.getVisibility()); assertEquals(View.GONE, bottomAppBar.getVisibility());
assertEquals(View.GONE, container.getVisibility()); assertEquals(View.GONE, maximizeButton.getVisibility());
assertEquals(View.VISIBLE, fullScreenLayout.getVisibility()); assertEquals(View.VISIBLE, minimizeButton.getVisibility());
assertEquals(View.GONE, editButton.getVisibility()); assertEquals(View.GONE, editButton.getVisibility());
assertEquals(View.VISIBLE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// In full screen mode, back button should disable fullscreen // In full screen mode, back button should disable fullscreen
activity.onBackPressed(); activity.onBackPressed();
@@ -1247,10 +1293,13 @@ public class LoyaltyCardViewActivityTest {
assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars())); assertTrue(activity.getWindow().getDecorView().getRootWindowInsets().isVisible(WindowInsets.Type.navigationBars()));
assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior()); assertEquals(WindowInsetsController.BEHAVIOR_DEFAULT, activity.getWindow().getInsetsController().getSystemBarsBehavior());
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.VISIBLE, container.getVisibility()); assertEquals(View.VISIBLE, maximizeButton.getVisibility());
assertEquals(View.GONE, fullScreenLayout.getVisibility()); assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
assertEquals(View.GONE, dotIndicator.getVisibility()); // We have no images, only a barcode
// Pressing back when not in full screen should finish activity // Pressing back when not in full screen should finish activity
activity.onBackPressed(); activity.onBackPressed();
@@ -1274,10 +1323,12 @@ public class LoyaltyCardViewActivityTest {
assertEquals(false, activity.isFinishing()); assertEquals(false, activity.isFinishing());
View collapsingToolbarLayout = activity.findViewById(R.id.collapsingToolbarLayout);
BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar); BottomAppBar bottomAppBar = activity.findViewById(R.id.bottom_app_bar);
ImageView mainImage = activity.findViewById(R.id.main_image); ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton);
ConstraintLayout fullScreenLayout = activity.findViewById(R.id.fullscreen_layout); ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton);
FloatingActionButton editButton = activity.findViewById(R.id.fabEdit); FloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler);
// Android should not be in fullscreen mode // Android should not be in fullscreen mode
int uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility(); int uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();
@@ -1285,10 +1336,12 @@ public class LoyaltyCardViewActivityTest {
assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions); assertNotEquals(uiOptions | View.SYSTEM_UI_FLAG_FULLSCREEN, uiOptions);
// Elements should be visible (except minimize/maximize buttons and barcode and scaler) // Elements should be visible (except minimize/maximize buttons and barcode and scaler)
assertEquals(View.VISIBLE, collapsingToolbarLayout.getVisibility());
assertEquals(View.VISIBLE, bottomAppBar.getVisibility()); assertEquals(View.VISIBLE, bottomAppBar.getVisibility());
assertEquals(View.GONE, mainImage.getVisibility()); assertEquals(View.GONE, maximizeButton.getVisibility());
assertEquals(View.GONE, fullScreenLayout.getVisibility()); assertEquals(View.GONE, minimizeButton.getVisibility());
assertEquals(View.VISIBLE, editButton.getVisibility()); assertEquals(View.VISIBLE, editButton.getVisibility());
assertEquals(View.GONE, barcodeScaler.getVisibility());
// Pressing back when not in full screen should finish activity // Pressing back when not in full screen should finish activity
activity.onBackPressed(); activity.onBackPressed();

View File

@@ -153,10 +153,10 @@ public class MainActivityTest {
list.measure(0, 0); list.measure(0, 0);
list.layout(0, 0, 100, 1000); list.layout(0, 0, 100, 1000);
assertEquals("storeC", ((TextView) list.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.thumbnail_text)).getText()); assertEquals("storeC", ((TextView) list.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.store)).getText());
assertEquals("storeD", ((TextView) list.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.thumbnail_text)).getText()); assertEquals("storeD", ((TextView) list.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.store)).getText());
assertEquals("storeA", ((TextView) list.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.thumbnail_text)).getText()); assertEquals("storeA", ((TextView) list.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.store)).getText());
assertEquals("storeB", ((TextView) list.findViewHolderForAdapterPosition(3).itemView.findViewById(R.id.thumbnail_text)).getText()); assertEquals("storeB", ((TextView) list.findViewHolderForAdapterPosition(3).itemView.findViewById(R.id.store)).getText());
database.close(); database.close();
} }

View File

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

View File

@@ -1,11 +0,0 @@
**This documentation is for maintainers. If you're an user, please ignore it.**
# When releasing, do the following:
1. Press "Commit" and "Push" on Weblate to ensure all translations are up to date
2. Merge Weblate pull request
3. Update `CHANGELOG.md` with the new version name
4. Update `app/build.gradle` with the new `versionCode` and `versionName`
5. Build a new .apk: `KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh`
6. Upload the APK to Google Play Open Testing
7. Push the version update: `git add CHANGELOG.md app/build.gradle && git commit -m "Release Catima <VERSION>" && git push`
8. Create a new release on GitHub and attach the `app-release.apk` and `SHA256SUMS` files

View File

@@ -1,3 +0,0 @@
- Kompletní přepracování hlavní obrazovky a obrazovek věrnostních karet
- Motiv Material You pro obrazovku Nastavení
- Oprava havárie při použití „Pořídit fotografii“ při zakázaném fotoaparátu

View File

@@ -1,3 +0,0 @@
- Complete redesign of main and loyalty card view screens
- Material You design for the settings screen
- Fix crash when using "Take a photo" with disabled camera app

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 103 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 74 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 101 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 75 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View File

@@ -1 +0,0 @@
- Utiliser les couleurs de Material You sur un plus grand nombre d'appareils (mise à jour de la bibliothèque de Google)

View File

@@ -1,3 +0,0 @@
- Refonte complète des écrans de visualisation de la carte principale et de la carte de fidélité
- Design Material You pour l'écran des paramètres
- Correction du crash lors de l'utilisation de "Prendre une photo" avec l'application de caméra désactivée

View File

@@ -1,2 +1,2 @@
- Un clic long sur une carte affiche l'option de copier l'ID de la carte dans le presse-papiers. (pull #49 (https://github.com/brarcher/loyalty-card-locker/issues/49)) - Un clic long sur une carte affiche l'option de copier l'ID de la carte dans le presse-papiers. (pull #49 (https://github.com/brarcher/loyalty-card-locker/issues/49))
- Le bouton Retour de la vue Import/Export fonctionne désormais, déplaçant alors l'utilisateur vers la vue principale - Le bouton Retour de la vue Entrée/Exportation fonctionne désormais, déplaçant alors l'utilisateur vers la vue principale

View File

@@ -1,22 +0,0 @@
Prestani tražiti plastične kartice tijekom plaćanju u trgovini ili webshopu.
<b>Snimi crtični kod na svoj uređaj pomoću kamere, zaboravi kartice.</b>
Zaboravi novčanik ili ga koristi samo za dragocjenosti.
S ovim osnovnim alatom za svakodnevne potrebe (EDC) možeš zamijeniti beskorisnu plastiku s gotovinom.
- Izbjegni špijuniranja s vrlo malim brojem dozvola. Bez pristupa internetu i bez oglasa.
- Dodaj kartice ili kodove s imenima i prilagodljivim bojama.
- Ručni unos koda ako ne postoji crtični kod za spremanje ili ako se ne može koristiti.
- Uvoz kartica i kodova iz datoteka, Catima, FidMe, Loyalty Card Keychain, Stocard i Vaucher Vault.
- Spremi sigurnosnu kopiju svih tvojih kartica i prenesi ih na novi uređaj ako želiš.
- Dijeli kupone, ekskluzivne ponude, promotivne kodove ili kartice i kodove pomoću bilo koje aplikacije.
- Tamna tema i opcije pristupačnosti za slabovidne korisnike.
- Stvoreno za svakoga od zajednice libre softvera.
- Prevedeno na više od 20 jezika.
- Besplatna aplikacija, podržana doprinosima zajednice.
- Koristi, proučavaj, mijenjaj i dijeli kako želiš; <i>sa svima</i>.
- Ne samo slobodan softver/softver otvorenog koda. <i>Copylefted</i> libre softver (GPLv3+) za upravljanje karticama.
Olakšaj si život i kupovinu te više nikada nemoj izgubiti papirnati račun, darovnu karticu za plaćanje u trgovini ili avionsku kartu.
Ponesi sve svoje nagrade i bonuse sa sobom i uštedi.

View File

@@ -1 +0,0 @@
Za tvoje crtične kodove, članstva, kartice vjernosti, kupone i ulaznice.

View File

@@ -1 +0,0 @@
Catima Kartice vjernosti

View File

@@ -1,3 +1,3 @@
- Az alapértelmezett importálási/exportálási fájlnév megváltoztatása (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84)) - Az alapértelmezett import/export fájlnév megváltoztatása (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84))
- Megfelelő szöveg az importálás/exportálás oldalon. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87)) - Megfelelő sor az import/export oldalon. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87))
- A kártyás elrendezést használó nézet továbbfejlesztése. A szöveg könnyebben olvasható, és hosszú lenyomással kiválasztható. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91)) - Javítsa fel a kártya elrendezés nézetet. A szöveg könnyebben olvasható, és kiválasztható egy hosszú lenyomással. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91))

View File

@@ -1,2 +1,2 @@
- A keresés, a kibontás és a rendezés ikonjainak elrejtése, amíg nincs legalább egy kártya - Keresés elrejtése, az ikonok kihúzása és rendezése amíg nincs legalább egy kártya
- Különböző témajavítások - Többféle téma fixálás

View File

@@ -1,3 +0,0 @@
- Javítás, hogy a vágó a téma színeit használja
- Apró témázási problémák javítása
- Teljesen fekete sötét téma az OLED képernyők számára

View File

@@ -1,2 +0,0 @@
- Különböző apró javítása
- A norvég fordítás használata esetén történő összeomlás javítása

View File

@@ -1,2 +0,0 @@
- Javítás, hogy a kézileg kiválasztott nyelv mindenhol alkalmazva legyen
- A régiót nem tartalmazó területi beállítása esetén a szerkesztő nézetben történő összeomlás javítása

View File

@@ -1,2 +0,0 @@
- Kártya részleteinek kibontási állapotának mentése
- Apró felületi javítások

View File

@@ -1,2 +0,0 @@
- Az érvénytelen vonalkódok esetén megjelenő szürke blokkok megjelenésének javítása
- Stocard importálási javítások

View File

@@ -1 +0,0 @@
- Javítás, hogy egyes karaktersorozatok ne egy karakterként jelenjenek meg

View File

@@ -1 +0,0 @@
- Stocard importálási javítások

View File

@@ -1,5 +0,0 @@
- Kártyaklónozási funkció hozzáadása
- Az 1970 előtti lejárat kiválasztásának letiltása (egyébként sem működött)
- Kártyák archiválásának támogatása
- Törlés áthelyezése a szerkesztéstől a megtekintéshez
- Forgatási zárolási ikon eltávolítása, felváltja az új forgatási zárolási beállítás

View File

@@ -1 +0,0 @@
- A helytelen szövegszín javítása a „Nincs vonalkód” gombon

View File

@@ -1,5 +1,5 @@
- A meglévő azonosító kitöltése a kártya szerkesztésnél. (pull #94) - Rubrikák kitöltése a szerkesztésnél. (pull #94)
- Az előállított vonalkód hosszának korlátozása a memóriahibák elkerülése érdekében. (pull #103) - Generált vonalkód hosszának korlátozása a memória hibák elkerülésére. (pull #103)
- Ha egy kártya már létezik, akkor a Kártya megadása” helyett Kártya szerkesztése” lesz a gombfelirat. (pull #104) - Ha egy kártya már létezik akkor a "Kártyába lépés" helyett "Kártya szerkesztése" gomb jelenik meg. (pull #104)
- A színséma lágyabb az ikonnak megfelelően, és kártyanézet tisztábban jelenik meg. (pull #107) - A színséma lágyabb az ikonnak megfelelően, és kártya nézet tisztítása. (pull #107)
- Varázsló megjelenítése az első indításnál. (pull #108) - Varázsló megjelenítése az első indításnál. (pull #108)

View File

@@ -1,7 +0,0 @@
- Arab nyelvi támogatás
- Archivált kártyák számának megjelenítése a csoportáttekintőben
- Egyenlegértelmezési hibák javítása (Az arab, vagy a más nyelvű, nem nyugati számokat használó kártyák nem voltak menthetők)
- A főképernyőn nem helyesen voltak alkalmazva az egyéni témák
- A kiválasztott kártyák megjelenésének finomítása
- A jobbról balra írt kártyák esetén történő összeomlás javítása
- A jobbról balra irányú elrendezés esetén hibás irányba mutató vissza nyíl javítása

View File

@@ -1 +0,0 @@
- Az egyéni fejléc beállítási lehetőségének láthatóbbá tétele

View File

@@ -1,3 +0,0 @@
- Előző és következő gombok hozzáadása a hűségkártya nézethez
- Előtérszín javítása a szerkesztés gombon
- A floppy lemezt használó mentés ikon lecserélése egy pipára

View File

@@ -1,3 +0,0 @@
- Monokróm ikon hozzáadása az Android 13-hoz
- Az első indítási képernyő fejlesztése
- Fidme importálási javítások

View File

@@ -1,4 +0,0 @@
- Kép megnyitása a galériában hosszú lenyomásra
- Material stílus alkalmazása az a párbeszédablakokra
- Kártyák létrehozásának támogatása a kép a Catimával történő megosztásával
- Gyors költés gomb hozzáadása a kártya kéőernyőhöz

View File

@@ -1,2 +0,0 @@
- A gyors költési párbeszédablak nem támogatta a , elválasztót
- A fájlkezelőből történő képbetöltés támogatása

View File

@@ -1,2 +0,0 @@
- Felesleges engedélyek eltávolítása
- Android 13 célzása

View File

@@ -1,2 +0,0 @@
- A kártya érvényességének beállításának támogatása
- A Stocard importálás javítása (a Stocard exportálási formátuma megváltozott)

View File

@@ -1 +0,0 @@
- Material You színek használata több eszközön (Google programkönyvtár-frissítés)

View File

@@ -1,3 +0,0 @@
- A fő képernyő és a hűségkártya nézet teljes újratervezése
- Material You dizájn a beállítási képernyőn
- A tiltott kamera alkalmazás esetén, a „Fénykép készítése” lehetőségnél fellépő összeomlás javítása

View File

@@ -1,2 +1,2 @@
- A v0.11-ben lecsökkent a vonalkódrajzolás memóriahasználata, de ez érintette a vonalkód méretét. Most már megtartja a méretet, miközben csökkenti a memóriahasználatot. (pull #126 (https://github.com/brarcher/loyalty-card-locker/pull/126)) - 0.11-ben lecsökkentve a memória használat, cserébe csökkent a megjelenített karaktere száma is. (pull #126)
- A francia és német fordítások frissítése. (pull #122 (https://github.com/brarcher/loyalty-card-locker/pull/122), pull #124 (https://github.com/brarcher/loyalty-card-locker/pull/124), pull #125 (https://github.com/brarcher/loyalty-card-locker/pull/125)) - Francia és német fordítások frissítése. (pull #122, pull #124, pull #125)

View File

@@ -1,3 +1,3 @@
- Képernyőforgatás zárolása menüelem a kártya megjelenítésénél. Zárolás esetén a „természetes” tájolásában fog megjelenni. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128)) - Képernyő forgatás zárolása opció kártya megjelenítésénél. Zárás esetén az alap orientációban fog megjelenni, és nem lesz további forgatás. (pull #128)
- Ha egy kiválasztott kártya nem tölthető be, akkor az alkalmazás hibaüzenetet jelenít meg. (pull #132 (https://github.com/brarcher/loyalty-card-locker/pull/132)) - Ha egy kártya kiválasztásra kerül, de nem betölthető, akkor egy hibaüzenet jelenik meg. (pull #132)
- A varázslóban fellépő, hiányzó elrendezésazonosító hibájának javítása. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128)) - Fixálva a varázslónál fellépő elrendezés azonosító hiba. (pull #128)

View File

@@ -1,2 +0,0 @@
- Alkalmazásindítók támogatása (Android 7.1+), ahol a legutóbb használt kártyák jelennek meg indítóként. (pull #145 (https://github.com/brarcher/loyalty-card-locker/pull/145))
- Modul hozzáadása, amely úgy működik mint egy rögzített indító, hogy támogassa az Android 7.1-nél régebbi verziót futtató eszközöket. (pull #142 (https://github.com/brarcher/loyalty-card-locker/pull/142))

View File

@@ -1,3 +0,0 @@
- Olasz fordítás
- Az összes 1D vonalkódtípus támogatása (Eredetileg csak a termékek 1D-s vonalkódja volt támogatott)
- A szükséges kamera engedély hozzáadása, amely eredetileg hiányzott.

View File

@@ -1,22 +1,22 @@
Ne kotorásszon többé hűségkártyáiért a pénztárnál vagy egy webshopnál történő fizetésnél. Ne kotorásszon többé hűségkártyáiért a pénztárnál vagy a webshop fizetésnél.
<b>Szkennelje be a vonalkódokat a telefonja kamerájával, és felejtse el a kártyákat.</b> <b>Szkennelje be a vonalkódokat a telefonja kamerájával, és felejtse el a kártyákat.</b>
Felejtse el teljesen a pénztárcáját, vagy innentől csak a legfontosabb értékeket tartsa benne. Felejtse el teljesen a pénztárcáját, vagy csak a legfontosabb értékeket tartsa benne innentől.
Ezzel a mindennapi kellékkel felszabadul a pénztárcájában a plasztikkártyák helye. Ezzel a mindennapi kellékkel felszabadul a pénztárcájában a plasztik kártyák helye.
- A minimális engedélyeknek köszönhetően csökkentheti a kémkedés esélyét. Nem igényel internetet, és nincsenek reklámok. - A minimális engedélyeknek köszönhetően csökkentheti a kémkedés esélyét. Nem igényel internetet, és nincsenek reklámok.
- Adjon hozzá kártyákat, vagy sima kódokat, majd szabja személyre színezéssel. - Adjon hozzá kártyákat, vagy sima kódokat, majd szabja személyre színezéssel.
- Kézileg is hozzáadhat kódot, ha nincs a kártyán vonalkód, vagy valamiért nem olvasható be. - Manuálisan is hozzáadhat kódot ha nincs a kártyán vonalkód, vagy nem olvasható be valamiért.
- Importáljon kártyákat más appokból: Catima, FidMe, Loyalty Card Keychain, Stocard és Voucher Vault. - Importáljon kártyákat appokból: Catima, FidMe, Loyalty Card Keychain, Stocard és Voucher Vault.
- Készítsen biztonsági mentést kártyáiról, vagy hordozza át másik eszközre. - Készítsen biztonsági mentést kártyáiról, vagy hordozza át másik eszközre.
- Osszon meg kuponokat, exkluzív ajánlatokat, promóciós kódokat, vagy kártyákat és kódokat bármely appal. - Osszon meg kuponokat, exkluzív ajánlatokat, promóciós kódokat, vagy kártyákat és kódokat bármely appal.
- Sötét téma és akadálymentesítés a gyengén látó felhasználóinknak. - Sötét téma és kisegítő lehetőségek gyengén látó felhasználóinknak.
- Mindenki számára elérhető a szabad szoftveres közösség jóvoltából. - Mindenki számára elérhető a gáttalan szoftver közösség jóvoltából.
- Több mint 20 nyelven honosított. - Több mint 20 kézzel fordított nyelven elérhető.
- Ingyenes, a közösség tagjai járulnak hozzá a fejlesztéshez. - Grátisz, a közösség tagjai járulnak hozzá a fejlesztéshez.
- Használja, tanulmányozza, változtassa és ossza meg; <i>mindenkivel</i>. - Használja, tanulmányozza, változtassa és ossza meg; <i>mindenkivel</i>.
- Nem csak szabad és nyílt forráskódú. <i>Copyleft</i> licencű, szabad (GPLv3+) kártyakezelő szoftver. - Nem csak Ingyenes Szoftver / Nyílt Forráskódú. <i>Copyleft-elt</i> gáttalan szoftver (GPLv3+) kártya menedzser.
Egyszerűsítse le az életét és a vásárlást, ne hagyjon el több blokkot, hűségkártyát vagy repjegyet. Egyszerűsítse le az életét és a vásárlást, ne hagyjon el több hűségkártyát vagy repjegyet.
Vigye magával a hűségpontjait és bónuszait, és mentse el azokat útközben. Vigye magával a hűségpontjait és bónuszait, és mentse el az útra.

View File

@@ -1 +1 @@
A vonalkódokhoz, tagkártyákhoz, hűségprogramokhoz, kuponokhoz és jegyekhez. A vonalkódokhoz, tagkártyákhoz, hűség programokhoz, kuponokhoz és jegyekhez.

View File

@@ -1 +1 @@
Catima Hűségkártyatárca Catima Hűségkártya Pénztárca

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