Compare commits

..

45 Commits
v2.0 ... v2.0.3

Author SHA1 Message Date
Sylvia van Os
c4f0d1bef6 Release Catima 2.0.3 2021-07-25 22:32:40 +02:00
Sylvia van Os
5201788818 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-07-25 21:52:10 +02:00
Sylvia van Os
8472bc9755 Make SpotBugs happy 2021-07-25 21:51:46 +02:00
Sylvia van Os
ce0f531831 Merge pull request #289 from weblate/weblate-catima-catima
Translations update from Weblate
2021-07-25 21:41:26 +02:00
Quentin PAGÈS
18e9c3ccb5 Translated using Weblate (Occitan)
Currently translated at 32.3% (55 of 170 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/oc/
2021-07-25 21:40:25 +02:00
Sylvia van Os
19afe8e69c Simplify edit activity and fix some status bugs 2021-07-25 21:40:15 +02:00
Sylvia van Os
8e5bace7cc Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-07-23 23:52:58 +02:00
Sylvia van Os
1ca85e9d7b Create unit test for broken onResume behaviour 2021-07-23 23:52:45 +02:00
Sylvia van Os
eb24af8266 Add Zip4j to used libraries list 2021-07-22 12:14:39 +02:00
Sylvia van Os
12ba01eb87 Merge pull request #287 from weblate/weblate-catima-catima
Translations update from Weblate
2021-07-21 23:32:51 +02:00
Quentin PAGÈS
a0e30bdccc Added translation using Weblate (Occitan) 2021-07-21 23:26:38 +02:00
Sylvia van Os
4663e22128 Rename Spanish metadata to something fastlane supply can push to Google Play 2021-07-21 18:42:27 +02:00
Sylvia van Os
7bd1d16d24 Merge pull request #286 from weblate/weblate-catima-catima
Translations update from Weblate
2021-07-21 18:37:32 +02:00
Diego
fd838cfd43 Translated using Weblate (Spanish)
Currently translated at 100.0% (3 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/es/
2021-07-21 18:32:48 +02:00
Diego
1eca79b4cb Translated using Weblate (Spanish)
Currently translated at 100.0% (170 of 170 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/es/
2021-07-21 18:32:48 +02:00
Sylvia van Os
1d694f5f2c Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-07-21 18:23:05 +02:00
Sylvia van Os
96a046b165 Fix share/import URL crash on Android 6 2021-07-21 18:22:50 +02:00
Sylvia van Os
5ff9c9c469 Merge pull request #282 from weblate/weblate-catima-catima
Translations update from Weblate
2021-07-19 07:02:06 +02:00
Nyatsuki
836cdd87bc Translated using Weblate (Japanese)
Currently translated at 99.4% (169 of 170 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-07-19 06:33:37 +02:00
109247019824
0af6dd4d44 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (170 of 170 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-07-17 23:32:59 +02:00
IllusiveMan196
034d62a643 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (3 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/uk/
2021-07-17 23:32:59 +02:00
IllusiveMan196
417224602e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (170 of 170 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/uk/
2021-07-17 23:32:58 +02:00
Sylvia van Os
c711aeae7f Fix build 2021-07-16 20:44:51 +02:00
109247019824
1f12543e3e Translated using Weblate (Bulgarian)
Currently translated at 94.7% (162 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-07-16 20:34:00 +02:00
Nyatsuki
dc31175b5d Translated using Weblate (Japanese)
Currently translated at 100.0% (3 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ja/
2021-07-16 20:34:00 +02:00
Nyatsuki
719b8112eb Translated using Weblate (Japanese)
Currently translated at 100.0% (171 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ja/
2021-07-16 20:34:00 +02:00
solokot
f19a3c507b Translated using Weblate (Russian)
Currently translated at 100.0% (3 of 3 strings)

Translation: Catima/Fastlane
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/ru/
2021-07-16 20:34:00 +02:00
solokot
2416ec396a Translated using Weblate (Russian)
Currently translated at 100.0% (171 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2021-07-16 20:34:00 +02:00
Heimen Stoffels
d1fe92e967 Translated using Weblate (Dutch)
Currently translated at 100.0% (171 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2021-07-16 20:34:00 +02:00
Gediminas Murauskas
ff5fd49b89 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (171 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/lt/
2021-07-16 20:34:00 +02:00
J. Lavoie
1015e0d94e Translated using Weblate (Italian)
Currently translated at 100.0% (171 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2021-07-16 20:34:00 +02:00
J. Lavoie
d872828e7d Translated using Weblate (French)
Currently translated at 100.0% (171 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2021-07-16 20:34:00 +02:00
J. Lavoie
8f6ad6d1bd Translated using Weblate (German)
Currently translated at 100.0% (171 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2021-07-16 20:34:00 +02:00
Sylvia van Os
05fd629ad4 Fix bad strings 2021-07-16 20:33:46 +02:00
Sylvia van Os
efdb0dd6bb Consolidate 2 very similar strings 2021-07-16 20:28:25 +02:00
Sylvia van Os
2e0482beef Always move import/export to overflow menu 2021-07-15 23:03:28 +02:00
Sylvia van Os
0f25743da4 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-07-15 22:45:32 +02:00
Sylvia van Os
e970bf185a Lowercase .zip filename 2021-07-15 22:45:12 +02:00
Sylvia van Os
60f3547b01 Merge pull request #275 from weblate/weblate-catima-catima
Translations update from Weblate
2021-07-15 22:18:09 +02:00
109247019824
ae09db428b Translated using Weblate (Bulgarian)
Currently translated at 21.0% (36 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-07-15 22:09:55 +02:00
Sylvia van Os
ebca7ca150 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2021-07-15 22:09:44 +02:00
Sylvia van Os
b6ef6806a0 Make selected in main screen selectable 2021-07-15 22:09:31 +02:00
Sylvia van Os
20a9cb30c4 Merge pull request #273 from weblate/weblate-catima-catima
Translations update from Weblate
2021-07-15 21:37:14 +02:00
109247019824
a43112f469 Translated using Weblate (Bulgarian)
Currently translated at 11.1% (19 of 171 strings)

Translation: Catima/Catima
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2021-07-15 21:33:48 +02:00
109247019824
2a95b2f530 Added translation using Weblate (Bulgarian) 2021-07-15 21:30:47 +02:00
37 changed files with 1043 additions and 373 deletions

View File

@@ -1,5 +1,24 @@
# Changelog
## v2.0.3 (2021-07-25)
Changes:
- Fix loading photos when editing existing card
## v2.0.2 (2021-07-25)
Changes:
- Fix inability to configure photos in new loyalty card
## v2.0.1 (2021-07-21)
Changes:
- Several minor translation and UI fixes
- Fix crash in import/sharing loyalty card on Android 6
## v2.0 (2021-07-14)
Breaking changes:

View File

@@ -18,8 +18,8 @@ android {
applicationId "me.hackerchick.catima"
minSdkVersion 19
targetSdkVersion 30
versionCode 70
versionName "2.0"
versionCode 73
versionName "2.0.3"
vectorDrawables.useSupportLibrary true
}

View File

@@ -35,12 +35,13 @@ public class AboutActivity extends AppCompatActivity
}
final List<ThirdPartyInfo> USED_LIBRARIES = new ArrayList<>();
USED_LIBRARIES.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Commons CSV", "https://commons.apache.org/proper/commons-csv/", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Guava", "https://github.com/google/guava", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Zip4j", "https://github.com/srikanth-lingala/zip4j", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("ZXing", "https://github.com/zxing/zxing", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("Color Picker", "https://github.com/jaredrummler/ColorPicker", "Apache 2.0"));
USED_LIBRARIES.add(new ThirdPartyInfo("NumberPickerPreference", "https://github.com/invissvenska/NumberPickerPreference", "GNU LGPL 3.0"));
final List<ThirdPartyInfo> USED_ASSETS = new ArrayList<>();
USED_ASSETS.add(new ThirdPartyInfo("Android icons", "https://fonts.google.com/icons?selected=Material+Icons", "Apache 2.0"));
@@ -104,4 +105,4 @@ public class AboutActivity extends AppCompatActivity
return super.onOptionsItemSelected(item);
}
}
}

View File

@@ -79,7 +79,7 @@ public class ImportExportActivity extends AppCompatActivity
final Intent intentCreateDocumentAction = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intentCreateDocumentAction.addCategory(Intent.CATEGORY_OPENABLE);
intentCreateDocumentAction.setType("application/zip");
intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "Catima.zip");
intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "catima.zip");
Button exportButton = findViewById(R.id.exportButton);
exportButton.setOnClickListener(new View.OnClickListener()

View File

@@ -12,6 +12,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
@@ -76,7 +77,7 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
try
{
OutputStreamWriter writer = new OutputStreamWriter(stream, Charset.forName("UTF-8"));
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
result = MultiFormatExporter.exportData(context, db, stream, format);
writer.close();
}

View File

@@ -83,7 +83,7 @@ public class ImportURIHelper {
if (fragment != null) {
for (String fragmentPart : fragment.split("&")) {
String[] fragmentData = fragmentPart.split("=", 2);
kv.put(fragmentData[0], URLDecoder.decode(fragmentData[1], StandardCharsets.UTF_8.toString()));
kv.put(fragmentData[0], URLDecoder.decode(fragmentData[1], StandardCharsets.UTF_8.name()));
}
}
@@ -134,7 +134,7 @@ public class ImportURIHelper {
}
// Double-encode the value to make sure it can't accidentally contain symbols that'll break the parser
fragment.append(key).append("=").append(URLEncoder.encode(value, StandardCharsets.UTF_8.toString()));
fragment.append(key).append("=").append(URLEncoder.encode(value, StandardCharsets.UTF_8.name()));
return fragment;
}

View File

@@ -7,11 +7,12 @@ import com.google.zxing.BarcodeFormat;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import androidx.annotation.Nullable;
public class LoyaltyCard
{
public class LoyaltyCard {
public final int id;
public final String store;
public final String note;

View File

@@ -4,6 +4,7 @@ import android.Manifest;
import android.annotation.SuppressLint;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -49,6 +50,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InvalidObjectException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
@@ -61,6 +63,7 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.concurrent.Callable;
@@ -121,6 +124,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
boolean hasChanged = false;
String tempStoredOldBarcodeValue = null;
boolean initDone = false;
boolean onResuming = false;
AlertDialog confirmExitDialog = null;
boolean validBalance = true;
@@ -130,6 +134,43 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
String tempCameraPicturePath;
LoyaltyCard tempLoyaltyCard;
private static LoyaltyCard updateTempState(LoyaltyCard loyaltyCard, LoyaltyCardField fieldName, Object value) {
Map<LoyaltyCardField, Object> cardData = new HashMap<>();
for (LoyaltyCardField existingFieldName : LoyaltyCardField.values()) {
try {
Field field = LoyaltyCard.class.getField(existingFieldName.name());
cardData.put(existingFieldName, field.get(loyaltyCard));
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
cardData.put(fieldName, value);
return new LoyaltyCard(
(int) cardData.get(LoyaltyCardField.id),
(String) cardData.get(LoyaltyCardField.store),
(String) cardData.get(LoyaltyCardField.note),
(Date) cardData.get(LoyaltyCardField.expiry),
(BigDecimal) cardData.get(LoyaltyCardField.balance),
(Currency) cardData.get(LoyaltyCardField.balanceType),
(String) cardData.get(LoyaltyCardField.cardId),
(String) cardData.get(LoyaltyCardField.barcodeId),
(BarcodeFormat) cardData.get(LoyaltyCardField.barcodeType),
(Integer) cardData.get(LoyaltyCardField.headerColor),
(int) cardData.get(LoyaltyCardField.starStatus)
);
}
private void updateTempState(LoyaltyCardField fieldName, Object value) {
tempLoyaltyCard = updateTempState(tempLoyaltyCard, fieldName, value);
hasChanged = true;
}
private void extractIntentFields(Intent intent)
{
final Bundle b = intent.getExtras();
@@ -161,8 +202,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loyalty_card_edit_activity);
@@ -218,8 +258,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
updateTempState(LoyaltyCardField.store, s.toString());
generateIcon(s.toString());
}
@@ -227,6 +266,19 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
public void afterTextChanged(Editable s) { }
});
noteFieldEdit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
updateTempState(LoyaltyCardField.note, s.toString());
}
@Override
public void afterTextChanged(Editable s) { }
});
expiryField.addTextChangedListener(new TextWatcher() {
CharSequence lastValue;
@@ -237,17 +289,17 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
if (s.toString().equals(getString(R.string.never))) {
expiryField.setTag(null);
} else if (s.toString().equals(getString(R.string.chooseExpiryDate))) {
if (!lastValue.toString().equals(getString(R.string.chooseExpiryDate))) {
expiryField.setText(lastValue);
};
DialogFragment datePickerFragment = new DatePickerFragment(expiryField);
}
DialogFragment datePickerFragment = new DatePickerFragment(LoyaltyCardEditActivity.this, expiryField);
datePickerFragment.show(getSupportFragmentManager(), "datePicker");
}
updateTempState(LoyaltyCardField.expiry, expiryField.getTag());
}
@Override
@@ -262,7 +314,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
balanceField.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
balanceField.setText(Utils.formatBalanceWithoutCurrencySymbol((BigDecimal) balanceField.getTag(), (Currency) balanceCurrencyField.getTag()));
balanceField.setText(Utils.formatBalanceWithoutCurrencySymbol(tempLoyaltyCard.balance, tempLoyaltyCard.balanceType));
}
});
@@ -272,13 +324,11 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
try {
BigDecimal balance = Utils.parseCurrency(s.toString(), Utils.currencyHasDecimals((Currency) balanceCurrencyField.getTag()));
BigDecimal balance = Utils.parseCurrency(s.toString(), Utils.currencyHasDecimals(tempLoyaltyCard.balanceType));
updateTempState(LoyaltyCardField.balance, balance);
validBalance = true;
balanceField.setTag(balance);
} catch (NumberFormatException e) {
validBalance = false;
e.printStackTrace();
@@ -295,8 +345,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
Currency currency;
if (s.toString().equals(getString(R.string.points))) {
@@ -305,12 +353,10 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
currency = currencies.get(s.toString());
}
balanceCurrencyField.setTag(currency);
updateTempState(LoyaltyCardField.balanceType, currency);
BigDecimal balance = (BigDecimal) balanceField.getTag();
if (balance != null) {
balanceField.setText(Utils.formatBalanceWithoutCurrencySymbol(balance, currency));
if (tempLoyaltyCard.balance != null) {
balanceField.setText(Utils.formatBalanceWithoutCurrencySymbol(tempLoyaltyCard.balance, currency));
}
}
@@ -355,29 +401,22 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
cardIdFieldView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (initDone) {
if (initDone && !onResuming) {
if (tempStoredOldBarcodeValue == null) {
// We changed the card ID, save the current barcode ID in a temp
// variable and make sure to ask the user later if they also want to
// update the barcode ID
if (barcodeIdField.getTag() == null) {
// If it is set to "same as Card ID", temp-save the value before the
// Card ID change
tempStoredOldBarcodeValue = s.toString();
} else {
// Otherwise, set the temp value to the current field value
if (tempLoyaltyCard.barcodeId != null) {
// If it is not set to "same as Card ID", save as tempStoredOldBarcodeValue
tempStoredOldBarcodeValue = barcodeIdField.getText().toString();
}
barcodeIdField.setText(tempStoredOldBarcodeValue);
barcodeIdField.setTag(tempStoredOldBarcodeValue);
}
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
updateTempState(LoyaltyCardField.cardId, s.toString());
}
@Override
@@ -394,14 +433,12 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
if (s.toString().equals(getString(R.string.sameAsCardId))) {
// If the user manually changes the barcode again make sure we disable the
// request to update it to match the card id (if changed)
tempStoredOldBarcodeValue = null;
barcodeIdField.setTag(null);
updateTempState(LoyaltyCardField.barcodeId, null);
} else if (s.toString().equals(getString(R.string.setBarcodeId))) {
if (!lastValue.toString().equals(getString(R.string.setBarcodeId))) {
barcodeIdField.setText(lastValue);
@@ -411,8 +448,8 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
builder.setTitle(R.string.setBarcodeId);
final EditText input = new EditText(LoyaltyCardEditActivity.this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
if (barcodeIdField.getTag() != null) {
input.setText((String) barcodeIdField.getTag());
if (tempLoyaltyCard.barcodeId != null) {
input.setText(tempLoyaltyCard.barcodeId);
}
builder.setView(input);
@@ -421,7 +458,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
// request to update it to match the card id (if changed)
tempStoredOldBarcodeValue = null;
barcodeIdField.setTag(input.getText().toString());
barcodeIdField.setText(input.getText());
});
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
@@ -429,6 +465,8 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
dialog.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
input.requestFocus();
} else {
updateTempState(LoyaltyCardField.barcodeId, s.toString());
}
generateOrHideBarcode();
@@ -450,16 +488,14 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
hasChanged = true;
if (!s.toString().isEmpty()) {
if (s.toString().equals(getString(R.string.noBarcode))) {
barcodeTypeField.setTag(null);
updateTempState(LoyaltyCardField.barcodeType, null);
} else {
try {
BarcodeFormat barcodeFormat = BarcodeFormat.valueOf(s.toString());
barcodeTypeField.setTag(barcodeFormat);
updateTempState(LoyaltyCardField.barcodeType, barcodeFormat);
if (!BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES.contains(barcodeFormat.name())) {
Toast.makeText(LoyaltyCardEditActivity.this, getString(R.string.unsupportedBarcodeType), Toast.LENGTH_LONG).show();
@@ -509,22 +545,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
Log.i(TAG, "Received new intent");
extractIntentFields(intent);
// Reset these fields, so they are re-populated in onResume().
storeFieldEdit.setText("");
noteFieldEdit.setText("");
expiryField.setTag(null);
expiryField.setText("");
balanceCurrencyField.setTag(null);
balanceCurrencyField.setText("");
balanceField.setTag(null);
balanceField.setText("");
cardIdFieldView.setText("");
barcodeIdField.setTag(null);
barcodeIdField.setText("");
barcodeTypeField.setText("");
cardImageFront.setTag(null);
cardImageBack.setTag(null);
}
@SuppressLint("DefaultLocale")
@@ -535,121 +555,43 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
Log.i(TAG, "To view card: " + loyaltyCardId);
if(updateLoyaltyCard)
{
final LoyaltyCard loyaltyCard = db.getLoyaltyCard(loyaltyCardId);
if(loyaltyCard == null)
{
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
finish();
return;
}
onResuming = true;
if(storeFieldEdit.getText().length() == 0)
{
storeFieldEdit.setText(loyaltyCard.store);
}
if(noteFieldEdit.getText().length() == 0)
{
noteFieldEdit.setText(loyaltyCard.note);
}
if(expiryField.getText().length() == 0)
{
expiryField.setTag(loyaltyCard.expiry);
formatExpiryField(loyaltyCard.expiry);
}
if(balanceCurrencyField.getText().length() == 0)
{
balanceCurrencyField.setTag(loyaltyCard.balanceType);
formatBalanceCurrencyField(loyaltyCard.balanceType);
}
if(balanceField.getText().length() == 0)
{
balanceField.setTag(loyaltyCard.balance);
balanceField.setText(Utils.formatBalanceWithoutCurrencySymbol(loyaltyCard.balance, loyaltyCard.balanceType));
}
if(cardIdFieldView.getText().length() == 0)
{
cardIdFieldView.setText(loyaltyCard.cardId);
}
if(barcodeIdField.getText().length() == 0)
{
barcodeIdField.setTag(loyaltyCard.barcodeId);
barcodeIdField.setText(loyaltyCard.barcodeId != null ? loyaltyCard.barcodeId : getString(R.string.sameAsCardId));
}
if(barcodeTypeField.getText().length() == 0)
{
barcodeTypeField.setText(loyaltyCard.barcodeType != null ? loyaltyCard.barcodeType.toString() : getString(R.string.noBarcode));
}
if(headingColorValue == null)
{
headingColorValue = loyaltyCard.headerColor;
if(headingColorValue == null)
{
headingColorValue = LetterBitmap.getDefaultColor(this, loyaltyCard.store);
if(tempLoyaltyCard == null) {
if (updateLoyaltyCard) {
tempLoyaltyCard = db.getLoyaltyCard(loyaltyCardId);
if (tempLoyaltyCard == null) {
Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId);
Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show();
finish();
return;
}
setTitle(R.string.editCardTitle);
setCardImage(cardImageFront, Utils.retrieveCardImage(this, tempLoyaltyCard.id, true));
setCardImage(cardImageBack, Utils.retrieveCardImage(this, tempLoyaltyCard.id, false));
} else if (importLoyaltyCardUri != null) {
try {
tempLoyaltyCard = importUriHelper.parse(importLoyaltyCardUri);
} catch (InvalidObjectException ex) {
Toast.makeText(this, R.string.failedParsingImportUriError, Toast.LENGTH_LONG).show();
finish();
return;
}
setTitle(R.string.addCardTitle);
} else {
// New card, use default values
tempLoyaltyCard = new LoyaltyCard(-1, "", "", null, new BigDecimal("0"), null, "", null, null, null, 0);
setTitle(R.string.addCardTitle);
}
if(cardImageFront.getTag() == null)
{
setCardImage(cardImageFront, Utils.retrieveCardImage(this, loyaltyCard.id, true));
}
if(cardImageBack.getTag() == null)
{
setCardImage(cardImageBack, Utils.retrieveCardImage(this, loyaltyCard.id, false));
}
setTitle(R.string.editCardTitle);
}
else if(importLoyaltyCardUri != null)
{
// Try to parse
LoyaltyCard importCard;
try {
importCard = importUriHelper.parse(importLoyaltyCardUri);
} catch (InvalidObjectException ex) {
Toast.makeText(this, R.string.failedParsingImportUriError, Toast.LENGTH_LONG).show();
finish();
return;
}
storeFieldEdit.setText(importCard.store);
noteFieldEdit.setText(importCard.note);
expiryField.setTag(importCard.expiry);
formatExpiryField(importCard.expiry);
balanceField.setTag(importCard.balance);
balanceCurrencyField.setTag(importCard.balanceType);
formatBalanceCurrencyField(importCard.balanceType);
cardIdFieldView.setText(importCard.cardId);
barcodeIdField.setTag(importCard.barcodeId);
barcodeIdField.setText(importCard.barcodeId != null ? importCard.barcodeId : getString(R.string.sameAsCardId));
barcodeTypeField.setText(importCard.barcodeType != null ? importCard.barcodeType.toString() : getString(R.string.noBarcode));
headingColorValue = importCard.headerColor;
}
else
{
setTitle(R.string.addCardTitle);
expiryField.setTag(null);
expiryField.setText(getString(R.string.never));
barcodeIdField.setTag(null);
barcodeIdField.setText(getString(R.string.sameAsCardId));
balanceField.setTag(new BigDecimal("0"));
balanceCurrencyField.setTag(null);
formatBalanceCurrencyField(null);
hideBarcode();
setCardImage(cardImageFront, null);
setCardImage(cardImageBack, null);
}
storeFieldEdit.setText(tempLoyaltyCard.store);
noteFieldEdit.setText(tempLoyaltyCard.note);
formatExpiryField(this, expiryField, tempLoyaltyCard.expiry);
formatBalanceCurrencyField(tempLoyaltyCard.balanceType);
cardIdFieldView.setText(tempLoyaltyCard.cardId);
barcodeIdField.setText(tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : getString(R.string.sameAsCardId));
barcodeTypeField.setText(tempLoyaltyCard.barcodeType != null ? tempLoyaltyCard.barcodeType.name() : getString(R.string.noBarcode));
if(groupsChips.getChildCount() == 0)
{
@@ -685,16 +627,21 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
}
if(headingColorValue == null)
// Generate random header color
if(tempLoyaltyCard.headerColor == null)
{
// Select a random color to start out with.
TypedArray colors = getResources().obtainTypedArray(R.array.letter_tile_colors);
final int color = (int)(Math.random() * colors.length());
headingColorValue = colors.getColor(color, Color.BLACK);
updateTempState(LoyaltyCardField.headerColor, colors.getColor(color, Color.BLACK));
colors.recycle();
}
thumbnail.setOnClickListener(new ColorSelectListener(headingColorValue));
// It can't be null because we set it in updateTempState but SpotBugs insists it can be
// NP_NULL_ON_SOME_PATH: Possible null pointer dereference
if(tempLoyaltyCard.headerColor != null) {
thumbnail.setOnClickListener(new ColorSelectListener(tempLoyaltyCard.headerColor));
}
// Update from intent
if (barcodeType != null) {
@@ -717,6 +664,12 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
}
// Empty intent values
barcodeType = null;
cardId = null;
barcodeId = null;
// Initialization has finished
if (!initDone) {
hasChanged = false;
initDone = true;
@@ -735,9 +688,11 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
saveButton.bringToFront();
generateIcon(storeFieldEdit.getText().toString());
onResuming = false;
}
private void setCardImage(ImageView imageView, Bitmap bitmap) {
protected static void setCardImage(ImageView imageView, Bitmap bitmap) {
imageView.setTag(bitmap);
if (bitmap != null) {
@@ -747,9 +702,11 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
}
private void formatExpiryField(Date expiry) {
protected static void formatExpiryField(Context context, EditText expiryField, Date expiry) {
expiryField.setTag(expiry);
if (expiry == null) {
expiryField.setText(getString(R.string.never));
expiryField.setText(context.getString(R.string.never));
} else {
expiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(expiry));
}
@@ -803,23 +760,17 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
.setMessage(R.string.updateBarcodeQuestionText)
.setPositiveButton(R.string.yes, (dialog, which) -> {
barcodeIdField.setText(R.string.sameAsCardId);
tempStoredOldBarcodeValue = null;
if (callback != null) {
callback.run();
}
dialog.dismiss();
})
.setNegativeButton(R.string.no, (dialog, which) -> {
barcodeIdField.setText(tempStoredOldBarcodeValue);
tempStoredOldBarcodeValue = null;
if (callback != null) {
callback.run();
}
dialog.dismiss();
})
.setOnDismissListener(dialogInterface -> {
barcodeIdField.setText(tempStoredOldBarcodeValue);
tempStoredOldBarcodeValue = null;
if (tempStoredOldBarcodeValue != null) {
barcodeIdField.setText(tempStoredOldBarcodeValue);
tempStoredOldBarcodeValue = null;
}
if (callback != null) {
callback.run();
@@ -916,7 +867,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
return null;
});
cardOptions.put(getString(R.string.chooseImageFromGallery), () -> {
cardOptions.put(getString(R.string.addFromImage), () -> {
Intent i = new Intent(Intent.ACTION_PICK);
i.setType("image/*");
startActivityForResult(i, v.getId() == ID_IMAGE_FRONT ? Utils.CARD_IMAGE_FROM_FILE_FRONT : Utils.CARD_IMAGE_FROM_FILE_BACK);
@@ -981,9 +932,11 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
public static class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
final Context context;
final EditText expiryFieldEdit;
DatePickerFragment(EditText expiryFieldEdit) {
DatePickerFragment(Context context, EditText expiryFieldEdit) {
this.context = context;
this.expiryFieldEdit = expiryFieldEdit;
}
@@ -1019,8 +972,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
Date date = new Date(unixTime);
expiryFieldEdit.setTag(date);
expiryFieldEdit.setText(DateFormat.getDateInstance(DateFormat.LONG).format(date));
formatExpiryField(context, expiryFieldEdit, date);
}
}
@@ -1030,22 +982,13 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
return;
}
String store = storeFieldEdit.getText().toString();
String note = noteFieldEdit.getText().toString();
Date expiry = (Date) expiryField.getTag();
BigDecimal balance = (BigDecimal) balanceField.getTag();
Currency balanceType = balanceCurrencyField.getTag() != null ? ((Currency) balanceCurrencyField.getTag()) : null;
String cardId = cardIdFieldView.getText().toString();
String barcodeId = (String) barcodeIdField.getTag();
BarcodeFormat barcodeType = (BarcodeFormat) barcodeTypeField.getTag();
if(store.isEmpty())
if(tempLoyaltyCard.store.isEmpty())
{
Snackbar.make(storeFieldEdit, R.string.noStoreError, Snackbar.LENGTH_LONG).show();
return;
}
if(cardId.isEmpty())
if(tempLoyaltyCard.cardId.isEmpty())
{
Snackbar.make(cardIdFieldView, R.string.noCardIdError, Snackbar.LENGTH_LONG).show();
return;
@@ -1066,7 +1009,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
if(updateLoyaltyCard)
{ //update of "starStatus" not necessary, since it cannot be changed in this activity (only in ViewActivity)
db.updateLoyaltyCard(loyaltyCardId, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headingColorValue);
db.updateLoyaltyCard(loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor);
try {
Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, true);
Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, false);
@@ -1077,7 +1020,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
else
{
loyaltyCardId = (int)db.insertLoyaltyCard(store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headingColorValue, 0);
loyaltyCardId = (int)db.insertLoyaltyCard(tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0);
try {
Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, true);
Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, false);
@@ -1159,8 +1102,8 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
{
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == Utils.CARD_IMAGE_FROM_CAMERA_FRONT || requestCode == Utils.CARD_IMAGE_FROM_CAMERA_BACK) {
if (resultCode == RESULT_OK) {
if (resultCode == RESULT_OK) {
if (requestCode == Utils.CARD_IMAGE_FROM_CAMERA_FRONT || requestCode == Utils.CARD_IMAGE_FROM_CAMERA_BACK) {
Bitmap bitmap = BitmapFactory.decodeFile(tempCameraPicturePath);
if (bitmap != null) {
@@ -1179,9 +1122,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
hasChanged = true;
}
}
} else if (requestCode == Utils.CARD_IMAGE_FROM_FILE_FRONT || requestCode == Utils.CARD_IMAGE_FROM_FILE_BACK) {
if (resultCode == RESULT_OK) {
} else if (requestCode == Utils.CARD_IMAGE_FROM_FILE_FRONT || requestCode == Utils.CARD_IMAGE_FROM_FILE_BACK) {
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), intent.getData());
@@ -1201,11 +1142,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
hasChanged = true;
}
}
} else {
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
} else {
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
if (resultCode == RESULT_OK) {
cardId = barcodeValues.content();
barcodeType = barcodeValues.format();
barcodeId = "";
@@ -1224,8 +1163,8 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
private void generateOrHideBarcode() {
String cardIdString = barcodeIdField.getTag() != null ? barcodeIdField.getTag().toString() : cardIdFieldView.getText().toString();
BarcodeFormat barcodeFormat = (BarcodeFormat) barcodeTypeField.getTag();
String cardIdString = tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : tempLoyaltyCard.cardId;
BarcodeFormat barcodeFormat = tempLoyaltyCard.barcodeType;
if (barcodeFormat == null || cardIdString.isEmpty() || !BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES.contains(barcodeFormat.name())) {
hideBarcode();
@@ -1258,13 +1197,13 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
private void generateIcon(String store) {
if (headingColorValue == null) {
if (tempLoyaltyCard.headerColor == null) {
return;
}
thumbnail.setBackgroundColor(headingColorValue);
thumbnail.setBackgroundColor(tempLoyaltyCard.headerColor);
LetterBitmap letterBitmap = Utils.generateIcon(this, store, headingColorValue);
LetterBitmap letterBitmap = Utils.generateIcon(this, store, tempLoyaltyCard.headerColor);
if (letterBitmap != null) {
thumbnail.setImageBitmap(letterBitmap.getLetterTile());

View File

@@ -0,0 +1,15 @@
package protect.card_locker;
public enum LoyaltyCardField {
id,
store,
note,
expiry,
balance,
balanceType,
cardId,
barcodeId,
barcodeType,
headerColor,
starStatus
}

View File

@@ -439,14 +439,9 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(false);
searchView.setOnCloseListener(new SearchView.OnCloseListener()
{
@Override
public boolean onClose()
{
invalidateOptionsMenu();
return false;
}
searchView.setOnCloseListener(() -> {
invalidateOptionsMenu();
return false;
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
@@ -619,7 +614,7 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor
if (count == 0) {
mCurrentActionMode.finish();
} else {
mCurrentActionMode.setTitle("Selected: " + count + " Cards");
mCurrentActionMode.setTitle(getResources().getQuantityString(R.plurals.selectedCardCount, count, count));
MenuItem editItem = mCurrentActionMode.getMenu().findItem(R.id.action_edit);
if (count == 1) {

View File

@@ -18,7 +18,7 @@ import java.nio.charset.StandardCharsets;
public class ZipUtils {
static public String read(ZipInputStream zipInputStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
Reader reader = new BufferedReader(new InputStreamReader(zipInputStream, Charset.forName(StandardCharsets.UTF_8.name())));
Reader reader = new BufferedReader(new InputStreamReader(zipInputStream, StandardCharsets.UTF_8));
int c;
while ((c = reader.read()) != -1) {
stringBuilder.append((char) c);

View File

@@ -17,7 +17,7 @@
android:id="@+id/action_import_export"
android:icon="@drawable/ic_import_export_white_24dp"
android:title="@string/importExport"
app:showAsAction="ifRoom"/>
app:showAsAction="never"/>
<item
android:id="@+id/action_settings"
android:title="@string/settings"

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Добавяне</string>
<string name="action_search">Търсене</string>
<string name="leaveWithoutSaveTitle">Изход</string>
<string name="confirm">Потвърждаване</string>
<string name="delete">Премахване</string>
<string name="edit">Редактиране</string>
<string name="save">Запазване</string>
<string name="cancel">Отказ</string>
<string name="unstar">Премахва от любими</string>
<string name="star">Добавя към любими</string>
<string name="noBarcode">Без щрихкод</string>
<string name="barcodeNoBarcode">Картата няма щрихкод</string>
<string name="barcodeType">Вид на щрихкод</string>
<string name="cardId">Идентификатор на карта</string>
<string name="note">Бележка</string>
<string name="storeName">Наименование</string>
<string name="noMatchingGiftCards">Няма резултати. Променете критериите за търсене.</string>
<string name="noGiftCards">Докоснете бутона +, за да добавите карта или внесете от менюто ⋮.</string>
<string name="all">Всички</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> карта</item>
<item quantity="other"><xliff:g>%d</xliff:g> карти</item>
</plurals>
<string name="failedOpeningFileManager">Инсталирайте приложение за управление на файлове.</string>
<string name="app_license">Свободен софтуер с авторски права, лицензиран под GPLv3+.</string>
<string name="frontImageDescription">Снимка на предната страна на карта</string>
<string name="backImageDescription">Снимка на задната страна на карта</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> не изглежда истинска наличност.</string>
<string name="barcodeImageDescription">Изображение на щрихкода на картата</string>
<string name="no">Не</string>
<string name="yes">Да</string>
<string name="setBackImage">Снимка на задната страна</string>
<string name="setFrontImage">Снимка на предната страна</string>
<string name="photos">Снимки</string>
<string name="importOptionApplicationExplanation">Изберете файл чрез друго приложение.</string>
<string name="noExternalStoragePermissionError">Дайте разрешение за достъп до хранилището, за да работи внасянето и изнасянето</string>
<string name="noCardExistsError">Картата не е намерена</string>
<string name="updateBarcodeQuestionText">Идентификаторът е променен. Желаете ли с неговата стойност да бъде променен и щрихкода\?</string>
<string name="updateBarcodeQuestionTitle">Обновяване на щрихкода\?</string>
<string name="noCardIdError">Не е въведен идентификатор</string>
<string name="noCardsMessage">Добавете карта</string>
<string name="cardShortcut">Пряк път до карта</string>
<string name="addCardTitle">Добавяне на карта</string>
<string name="removeImage">Премахване на изображение</string>
<string name="takePhoto">Снимане</string>
<string name="copy_to_clipboard_multiple_toast">Идентификаторите са копирани в междинната памет</string>
<string name="intent_import_card_from_url_share_multiple_text">Искам да споделя тези карти с вас</string>
<string name="wrongValueForBarcodeType">Стойността е невалидна за избрания вид щрихкод</string>
<string name="setBarcodeId">Задаване на стойност</string>
<string name="sameAsCardId">Същата като идентификатора</string>
<string name="barcodeId">Стойност на щрихкода</string>
<string name="importLoyaltyCardKeychain">Внасяне от Loyalty Card Keychain</string>
<string name="importFidmeMessage">Изберете файла <i>fidme-export-request-xxxxxx.zip</i>, предварително изнесен от FidMe и ръчно изберете вида на щрихкодовете.
\nИли създайте такъв файл от Data Protection в менюто на профила във FidMe и изберете „Extract my data“.</string>
<string name="importFidme">Внасяне от FidMe</string>
<string name="exportOptionExplanation">Данните ще бъдат запазени на място по ваш избор.</string>
<string name="accept">Приемане</string>
<string name="privacy_policy_popup_text">Политика за личните данни (необходима от някои магазини за приложения):
\n
\nНЕ СЕ СЪБИРАТ ИЗОБЩО НИКАКВИ ДАННИ, което може да бъде потвърдено, защото приложението е със свободен код.</string>
<string name="privacy_policy">Политика за личните данни</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="turn_flashlight_off">Изключва светкавицата</string>
<string name="turn_flashlight_on">Включва светкавицата</string>
<string name="passwordRequired">Въведете паролата</string>
<string name="points">Точки</string>
<string name="currency">Валута</string>
<string name="balance">Наличност</string>
<string name="errorReadingImage">Изображението е нечетимо</string>
<string name="noBarcodeFound">Не е намерен щрихкод</string>
<string name="moveBarcodeToCenterOfScreen">Премества щрихкода в центъра на екрана</string>
<string name="moveBarcodeToTopOfScreen">Премества щрихкода най-горе на екрана</string>
<string name="never">Не изтича</string>
<string name="chooseExpiryDate">Дата на изтичане</string>
<string name="expiryDate">Валидност</string>
<string name="editBarcode">Редактиране на щрихкод</string>
<string name="barcode">Щрихкод</string>
<string name="card">Карта</string>
<string name="groupsList">Списъци: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Валидност: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Изтекла: <xliff:g>%s</xliff:g></string>
<string name="balancePoints"><xliff:g>%s</xliff:g> точки</string>
<string name="balanceSentence">Наличност: <xliff:g>%s</xliff:g></string>
<string name="noGroups">Докоснете бутона +, за да добавите списък.</string>
<string name="noStoreError">Не е въведено наименование</string>
<string name="groups">Списъци</string>
<string name="enter_group_name">Въведете име на списък</string>
<string name="intent_import_card_from_url_share_text">Искам да споделя тази карта с вас</string>
<string name="settings_display_barcode_max_brightness">Увеличаване на яркостта при видим щрихкод</string>
<string name="settings_lock_barcode_orientation">Спиране на завъртането на щрихкода</string>
<string name="settings_keep_screen_on">Поддържане на екрана включен</string>
<string name="settings_disable_lockscreen_while_viewing_card">Предотвратяване на заключване на екрана</string>
<string name="settings_max_font_size_scale">Максимален размер на шрифта</string>
<string name="settings_dark_theme">Тъмна</string>
<string name="settings_light_theme">Светла</string>
<string name="settings_system_theme">Системна</string>
<string name="settings_theme">Тема</string>
<string name="settings_category_title_ui">Потребителски интерфейс</string>
<string name="settings">Настройки</string>
<string name="starImage">Звезда за любимо</string>
<string name="thumbnailDescription">Миниатюра на картата</string>
<string name="copy_to_clipboard_toast">Идентификаторът на картата е копиран в междинната памет</string>
<string name="enterBarcodeInstructions">Въведете идентификатор на картата или като изберете вида на щрихкода или докоснете бутона „Картата няма щрихкод“.</string>
<string name="selectBarcodeTitle">Избиране на щрихкод</string>
<string name="importOptionApplicationButton">Избиране чрез приложение</string>
<string name="importing">Внасяне…</string>
<string name="exporting">Изнасяне…</string>
<string name="exportFailed">Картите не могат да бъдат изнесени</string>
<string name="exportFailedTitle">Грешка при изнасяне</string>
<string name="importFailed">Картите не могат да бъдат внесени</string>
<string name="importFailedTitle">Грешка при внасяне</string>
<string name="exportSuccessfulTitle">Резултат от изнасяне</string>
<string name="importSuccessfulTitle">Резултат от внасяне</string>
<string name="importExportHelp">Резервните копия на картите ви дават възможност да ги преместите на друго устройство.</string>
<string name="exportName">Изнасяне</string>
<string name="importExport">Внасяне/изнасяне</string>
<string name="sendLabel">Изпращане…</string>
<string name="scanCardBarcode">Сканиране на щрихкод от карта</string>
<string name="editCardTitle">Редактиране на карта</string>
<string name="share">Споделя</string>
<string name="copy_to_clipboard">Копира идентификатора в междинната памет</string>
<string name="ok">Добре</string>
<string name="deleteConfirmation">Потвърдете премахване на карта</string>
<string name="deleteTitle">Премахване на карта</string>
<string name="importSuccessful">Картите са внесени успешно</string>
<string name="chooseImportType">От къде ще внесете\?</string>
<string name="importCatimaMessage">Изберете файла <i>catima.zip</i>, предварително изнесен от Catima.
\nИли създайте такъв файл от меню Внасяне/изнасяне от друго устройство със Catima като изберете Изнасяне.</string>
<string name="importOptionApplicationTitle">От друго приложение</string>
<string name="importOptionFilesystemButton">Избиране от файлова система</string>
<string name="importOptionFilesystemExplanation">Изберете определен файл от файловата система.</string>
<string name="app_resources">Свободни ресурси: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Свободни библиотеки: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_revision_fmt">Компилация: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="debug_version_fmt">Издание: <xliff:g id="version">%s</xliff:g></string>
<string name="about_title_fmt">Относно <xliff:g id="app_name">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Всички права запазени © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="app_copyright_old">На основата на Loyalty Card Keychain
\nвсички права запазени © 20162020 Branden Archer.</string>
<string name="about">Относно</string>
<string name="importOptionFilesystemTitle">Внасяне от файловата система</string>
<string name="importCatima">Внасяне от Catima</string>
<string name="exportSuccessful">Картите са изнесени успешно</string>
<string name="unlockScreen">Разрешава автоматичното завъртане</string>
<string name="lockScreen">Спира автоматичното завъртане</string>
<plurals name="selectedCardCount">
<item quantity="one">Избрана <xliff:g>%d</xliff:g> карта</item>
<item quantity="other">Избрани <xliff:g>%d</xliff:g> карти</item>
</plurals>
<string name="deleteConfirmationGroup">Изтриване на група\?</string>
<string name="moveDown">Преместване надолу</string>
<string name="moveUp">Преместване нагоре</string>
<string name="addFromImage">Избор от галерията</string>
<string name="addManually">Ръчно въвеждане</string>
<string name="leaveWithoutSaveConfirmation">Оставяте промените незапазени\?</string>
<string name="unsupportedBarcodeType">Щрихкод от този вид не може да бъде показан. Може да бъде поддържан в следващо издание.</string>
<string name="importStocard">Внасяне от Stocard</string>
<string name="importVoucherVault">Внасяне от Voucher Vault</string>
<string name="importVoucherVaultMessage">Изберете файла <i>vouchervault.json</i>, предварително изнесен от Voucher Vault.
\nИли създайте такъв файл от меню Изнасяне от Voucher Vault.</string>
<string name="importStocardMessage">Изберете файла <i>***-sync.zip</i>, предварително изнесен от Stocard и ръчно изберете вида на щрихкодовете.
\nИли получете такъв файл като пишете до support@stocardapp.com с молба за копие от вашата информация.</string>
<string name="importLoyaltyCardKeychainMessage">Изберете файла <i>LoyaltyCardKeychain.csv</i>, предварително изнесен от Loyalty Card Keychain.
\nИли създайте такъв файл от меню Внасяне/изнасяне от друго устройство със Loyalty Card Keychain като изберете Изнасяне.</string>
<string name="failedParsingImportUriError">Препратката не може да бъде анализирана за внасяне</string>
<string name="card_ids_copied">[не превеждай този низ, https://github.com/TheLastProject/Catima/issues/278]</string>
<string name="failedGeneratingShareURL">Неуспешно генериране на адрес за споделяне. Докладвайте за тази грешка!</string>
</resources>

View File

@@ -118,17 +118,17 @@
\nKEINE DATEN WERDEN GESAMMELT, was jeder bestätigen kann, da unsere Anwendung eine freie Software ist.</string>
<string name="accept">Annehmen</string>
<string name="privacy_policy">Datenschutzrichtlinie</string>
<string name="importVoucherVaultMessage">Suchen Sie eine Datei, die wahrscheinlich <i>vouchervault.json</i> heißt, um sie zu importieren.
\nOder erstellen Sie sie, indem Sie zuerst in Voucher Vault auf Export drücken.</string>
<string name="importVoucherVaultMessage">Wählen Sie Ihren <i>vouchervault.json</i>-Export aus Voucher Vault zum Importieren aus.
\nOder erstellen Sie ihn, indem Sie zuerst auf Export in Voucher Vault drücken.</string>
<string name="importVoucherVault">Aus Voucher Vault importieren</string>
<string name="importLoyaltyCardKeychainMessage">Suchen Sie eine Datei, die höchstwahrscheinlich <i>LoyaltyCardKeychain.csv</i> heißt, um sie zu importieren.
\nOder erstellen Sie sie über das Menü Import/Export in Loyalty Card Keychain, indem Sie zuerst auf Export drücken.</string>
<string name="importLoyaltyCardKeychainMessage">Wählen Sie Ihren <i>LoyaltyCardKeychain.csv</i>-Export aus Loyalty Card Keychain zum Importieren aus.
\nOder erstellen Sie ihn über das Menü Import/Export in Loyalty Card Keychain, indem Sie dort zuerst auf Export drücken.</string>
<string name="importLoyaltyCardKeychain">Aus Loyalty Card Keychain importieren</string>
<string name="importFidmeMessage">Suchen Sie eine Datei, die wahrscheinlich <i>fidme-export-request-xxxxxx.zip</i> heißt, um sie zu importieren, und wählen Sie anschließend die Strichcodetypen manuell aus.
\nOder erstellen Sie sie aus Ihrem FidMe-Profil, indem Sie Datenschutz wählen und dann zuerst auf Extrahiere meine Daten drücken.</string>
<string name="importFidmeMessage">Wählen Sie Ihren <i>fidme-export-request-xxxxxx.zip</i>-Export aus FidMe zum Importieren aus und wählen Sie anschließend die Strichcodetypen manuell aus.
\nOder erstellen Sie ihn aus Ihrem FidMe-Profil, indem Sie Datenschutz wählen und dann zuerst auf Meine Daten extrahieren drücken.</string>
<string name="importFidme">Aus FidMe importieren</string>
<string name="importCatimaMessage">Suchen Sie eine Datei, die wahrscheinlich <i>Catima.csv</i> heißt, um sie zu importieren.
\nOder erstellen Sie sie aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken.</string>
<string name="importCatimaMessage">Wählen Sie Ihren <i>catima.zip</i>-Export aus Catima zum Importieren aus.
\nOder erstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken.</string>
<string name="importCatima">Aus Catima importieren</string>
<string name="setBarcodeId">Strichcodewert setzen</string>
<string name="sameAsCardId">Gleich wie Karten-ID</string>
@@ -145,12 +145,10 @@
<string name="intent_import_card_from_url_share_multiple_text">Ich möchte Karten mit dir teilen</string>
<string name="copy_to_clipboard_multiple_toast">Kartennummern in die Zwischenablage kopiert</string>
<string name="card_ids_copied">Kartennummer(n) kopiert</string>
<string name="card_selected">"Ausgewählt: "</string>
<string name="no">Nein</string>
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionText">Sie haben die Karten-ID geändert. Möchten Sie auch den Strichcode aktualisieren, um denselben Wert zu verwenden\?</string>
<string name="updateBarcodeQuestionTitle">Strichcodewert aktualisieren\?</string>
<string name="chooseImageFromGallery">Bild aus der Galerie auswählen</string>
<string name="takePhoto">Foto aufnehmen</string>
<string name="removeImage">Bild entfernen</string>
<string name="setBackImage">Rückseitenbild einstellen</string>
@@ -159,10 +157,14 @@
<string name="frontImageDescription">Bild der Kartenvorderseite</string>
<string name="backImageDescription">Bild der Kartenrückseite</string>
<string name="passwordRequired">Bitte geben Sie das Passwort ein</string>
<string name="importStocardMessage">Suchen Sie Ihre Stocard-.zip-Datei zum Importieren, und wählen Sie anschließend die Strichcodetypen manuell aus.
\nOder Sie erhalten sie, indem Sie eine E-Mail an support@stocardapp.com senden und zuerst um einen Export Ihrer Daten bitten.</string>
<string name="importStocardMessage">Wählen Sie Ihren <i>***-sync.zip</i>-Export aus Stocard zum Importieren aus, und wählen Sie anschließend die Strichcodetypen manuell aus.
\nOder Sie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten.</string>
<string name="importStocard">Von Stocard importieren</string>
<string name="turn_flashlight_off">Taschenlampe ausschalten</string>
<string name="turn_flashlight_on">Taschenlampe einschalten</string>
<string name="failedGeneratingShareURL">Fehler beim Generieren der Freigabe-URL. Bitte melden Sie diesen Fehler!</string>
<plurals name="selectedCardCount">
<item quantity="one">Ausgewählt: <xliff:g>%d</xliff:g> Karte</item>
<item quantity="other">Ausgewählt: <xliff:g>%d</xliff:g> Karten</item>
</plurals>
</resources>

View File

@@ -50,7 +50,6 @@
<string name="edit">Redakti</string>
<string name="save">Konservi</string>
<string name="cancel">Nuligi</string>
<string name="card_selected">"Elektita: "</string>
<string name="action_add">Aldoni</string>
<string name="action_search">Serĉi</string>
</resources>

View File

@@ -28,7 +28,7 @@
<string name="noCardExistsError">No se ha podido encontrar la tarjeta</string>
<string name="importExport">Importar/exportar</string>
<string name="exportName">Exportar</string>
<string name="importExportHelp">La copia de respaldo le permite transferir sus tarjetas a otro dispositivo.</string>
<string name="importExportHelp">El respaldo le permite transferir sus tarjetas a otro dispositivo.</string>
<string name="importSuccessfulTitle">Importado</string>
<string name="importFailedTitle">Falló la importación</string>
<string name="importFailed">No se han podido importar tarjetas</string>
@@ -48,18 +48,18 @@
<string name="app_license">Programa libre con «copyleft», disponible en virtud de la licencia GPLv3+.</string>
<string name="about_title_fmt">Acerca de <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versión: <xliff:g id="version">%s</xliff:g></string>
<string name="settings">Configuración</string>
<string name="settings">Ajustes</string>
<string name="settings_category_title_ui">Interfaz de usuario</string>
<string name="settings_display_barcode_max_brightness">Iluminar vista del código de barras</string>
<string name="exportSuccessful">Datos de las tarjetas exportados</string>
<string name="importSuccessful">Datos de las tarjetas importados</string>
<string name="intent_import_card_from_url_share_text">Quiero compartirle una tarjeta</string>
<string name="settings_lock_barcode_orientation">Bloquear orientación del código de barras</string>
<string name="intent_import_card_from_url_share_text">Quiero compartirte una tarjeta</string>
<string name="settings_lock_barcode_orientation">Bloquear giro en el código de barras</string>
<string name="settings_dark_theme">Oscuro</string>
<string name="settings_light_theme">Claro</string>
<string name="settings_system_theme">Sistema</string>
<string name="settings_theme">Tema</string>
<string name="enterBarcodeInstructions">Introduzca el identificador de tarjeta y seleccione la imagen que represente el código de barras que se utilizará, o bien, elija «Esta tarjeta no tiene código de barras» para no utilizar ninguno.</string>
<string name="enterBarcodeInstructions">Introduzca el identificador de tarjeta y seleccione el código de barras que se utilizará, o de lo contrario, elija «Esta tarjeta no tiene código de barras».</string>
<string name="app_copyright_old">Basado en Loyalty Card Keychain
\nderechos de autor © 2016-2020 de Branden Archer.</string>
<string name="exportOptionExplanation">Los datos se guardarán en la ubicación que elija.</string>
@@ -73,7 +73,7 @@
<string name="noGroups">Primero pulse en el botón «+» para añadir grupos de categorización.</string>
<string name="starImage">Favorito</string>
<string name="thumbnailDescription">Miniatura de la tarjeta</string>
<string name="copy_to_clipboard_toast">Se copió el identificador de tarjeta en el portapapeles</string>
<string name="copy_to_clipboard_toast">Se copió la id. de tarjeta en el portapapeles</string>
<string name="selectBarcodeTitle">Seleccionar el código de barras</string>
<string name="unstar">Eliminar de favoritos</string>
<string name="noBarcode">Sin código de barras</string>
@@ -94,8 +94,8 @@
<item quantity="other"><xliff:g>%d</xliff:g> tarjetas</item>
</plurals>
<string name="points">Puntos</string>
<string name="moveBarcodeToCenterOfScreen">Centrar el código de barras en la pantalla</string>
<string name="moveBarcodeToTopOfScreen">Mover el código de barras a la zona superior de la pantalla</string>
<string name="moveBarcodeToCenterOfScreen">Centre el código de barras en la pantalla</string>
<string name="moveBarcodeToTopOfScreen">Mueva el código de barras a la zona superior de la pantalla</string>
<string name="chooseExpiryDate">Elegir fecha de caducidad</string>
<string name="never">Nunca</string>
<string name="expiryDate">Fecha de caducidad</string>
@@ -108,4 +108,63 @@
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Derechos de autor © 2019-<xliff:g>%d</xliff:g> de Sylvia van Os.</string>
<string name="app_resources">Recursos de terceros libres: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Bibliotecas de terceros libres: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="settings_max_font_size_scale">Tam. de fuente máximo</string>
<string name="importCatimaMessage">Seleccione su <i>catima.zip</i> exportado desde Catima para importarlo.
\nO créalo primero desde el menú Importar/Exportar de otra app de Catima al presionar Exportar desde allí.</string>
<string name="importFidmeMessage">Seleccione su <i>fidme-export-request-xxxxxx.zip</i> exportado desde FidMe para importar, y luego escoja los tipos de códigos de barras manualmente.
\nO créalo primero desde tu perfil de FidMe eligiendo Protección de datos y pulsa Extraer mis datos.</string>
<string name="importLoyaltyCardKeychainMessage">Seleccione su <i>LoyaltyCardKeychain.csv</i> exportado desde Loyalty Card Keychain para importarlo.
\nO créalo primero desde el menú Importar/Exportar en Loyalty Card Keychain pulsando Exportar desde allí.</string>
<string name="importStocardMessage">Seleccione su <i>*-sync.zip</i> exportado de Stocard para importarla, y selecciona los tipos de códigos de barras manualmente después.
\nO consígalo enviando un correo electrónico a support@stocardapp.com solicitando una exportación de sus datos.</string>
<string name="importVoucherVaultMessage">Seleccione su <i>vouchervault.json</i> exportado desde Voucher Vault para importarlo.
\nO créalo pulsando primero Exportar en Voucher Vault.</string>
<string name="failedGeneratingShareURL">Error al generar la URL compartida. Por favor, ¡reporte este error!</string>
<string name="passwordRequired">Por favor, introduzca la contraseña</string>
<string name="updateBarcodeQuestionText">Ha cambiado la Id. de la tarjeta. ¿Desea actualizar también el código de barras para usar el mismo valor\?</string>
<string name="intent_import_card_from_url_share_multiple_text">Quiero compartirte algunas tarjetas</string>
<string name="setBackImage">Establecer imagen anversa</string>
<string name="card_ids_copied">Id. de tarjetas copiadas</string>
<string name="turn_flashlight_off">Apagar linterna</string>
<string name="turn_flashlight_on">Encender linterna</string>
<string name="no">No</string>
<string name="yes"></string>
<string name="updateBarcodeQuestionTitle">¿Actualizar valor de código de barras\?</string>
<string name="takePhoto">Tomar una foto</string>
<string name="removeImage">Quitar imagen</string>
<string name="setFrontImage">Establecer imagen frontal</string>
<string name="photos">Fotos</string>
<string name="backImageDescription">Imagen del reverso de la tarjeta</string>
<string name="frontImageDescription">Imagen frontal de la tarjeta</string>
<string name="copy_to_clipboard_multiple_toast">ID de tarjetas copiadas al portapapeles</string>
<string name="wrongValueForBarcodeType">El valor no es válido para el tipo de código de barras seleccionado</string>
<string name="unsupportedBarcodeType">Este tipo de código de barras todavía no se puede visualizar. Es posible que se admita en una futura versión de la aplicación.</string>
<string name="setBarcodeId">Establecer valor de código de barra</string>
<string name="sameAsCardId">Igual que la ID de tarjeta</string>
<string name="barcodeId">Valor de código de barra</string>
<string name="importVoucherVault">Importar desde Voucher Vault</string>
<string name="importStocard">Importar desde Stocard</string>
<string name="importLoyaltyCardKeychain">Importar desde Loyalty Card Keychain</string>
<string name="importFidme">Importar desde FidMe</string>
<string name="importCatima">Importar desde Catima</string>
<string name="accept">Aceptar</string>
<string name="privacy_policy_popup_text">Aviso de política de privacidad (requerido por algunas tiendas de apps):
\n
\nNINGÚN DATO SE RECOPILA, cualquiera puede confirmar ya que nuestra aplicación es software libre.</string>
<string name="privacy_policy">Política de privacidad</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="chooseImportType">¿De dónde importar datos\?</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> no tendría un saldo válido.</string>
<string name="currency">Moneda</string>
<string name="balance">Saldo</string>
<string name="errorReadingImage">No se pudo leer la imagen</string>
<string name="noBarcodeFound">No se encontró código de barras</string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">Selecciona imagen desde galería</string>
<string name="settings_disable_lockscreen_while_viewing_card">Evitar bloqueo de pantalla</string>
<string name="settings_keep_screen_on">Mantener pantalla encendida</string>
<plurals name="selectedCardCount">
<item quantity="one">Seleccionadas: <xliff:g>%d</xliff:g> tarjeta</item>
<item quantity="other">Seleccionadas: <xliff:g>%d</xliff:g> tarjetas</item>
</plurals>
</resources>

View File

@@ -147,11 +147,9 @@
<string name="storeName">Nimi</string>
<string name="noMatchingGiftCards">Ei hakutuloksia, kokeile toisella hakutermillä.</string>
<string name="noGiftCards">Lisää ensin kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta.</string>
<string name="card_selected">"Valittu: "</string>
<string name="action_add">Lisää</string>
<string name="action_search">Hae</string>
<string name="takePhoto">Ota valokuva</string>
<string name="chooseImageFromGallery">Valitse kuva galleriasta</string>
<string name="removeImage">Poista kuva</string>
<string name="setBackImage">Aseta takakuva</string>
<string name="setFrontImage">Aseta etukuva</string>

View File

@@ -100,7 +100,7 @@
<string name="privacy_policy">Politique de confidentialité</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="chooseImportType">Importer les données depuis \?</string>
<string name="parsingBalanceFailed">&lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"&gt;%s&lt;/xliff:g&gt; ne semble pas être un solde valide.</string>
<string name="parsingBalanceFailed"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g> ne semble pas être un solde valide.</string>
<string name="points">Points</string>
<string name="currency">Monnaie</string>
<string name="balance">Solde</string>
@@ -112,10 +112,10 @@
<string name="editBarcode">Modifier le code-barres</string>
<string name="barcode">Code-barres</string>
<string name="card">Carte</string>
<string name="balancePoints">&lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"&gt;%s&lt;/xliff:g&gt; points</string>
<string name="balanceSentence">Solde : &lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"&gt;%s&lt;/xliff:g&gt;</string>
<string name="expiryStateSentenceExpired">Expiré : &lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"&gt;%s&lt;/xliff:g&gt;</string>
<string name="expiryStateSentence">Expire : &lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"&gt;%s&lt;/xliff:g&gt;</string>
<string name="balancePoints"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g> points</string>
<string name="balanceSentence">Solde : <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Expiré : <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g></string>
<string name="expiryStateSentence">Expire : <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g></string>
<string name="settings_disable_lockscreen_while_viewing_card">Empêcher le verrouillage de lécran</string>
<string name="settings_keep_screen_on">Garder lécran allumé</string>
<string name="importVoucherVaultMessage">Sélectionnez votre exportation <i>vouchervault.json</i> de Voucher Vault à importer.
@@ -145,12 +145,10 @@
<string name="intent_import_card_from_url_share_multiple_text">Je veux partager des cartes avec vous</string>
<string name="copy_to_clipboard_multiple_toast">Identifiants des cartes copiés dans le presse-papiers</string>
<string name="card_ids_copied">Num. de la carte copié(s)</string>
<string name="card_selected">"Sélectionnée : "</string>
<string name="updateBarcodeQuestionText">Vous avez changé l\'identifiant de la carte. Voulez-vous également mettre à jour le code-barres pour utiliser la même valeur \?</string>
<string name="no">Non</string>
<string name="yes">Oui</string>
<string name="updateBarcodeQuestionTitle">Mettre à jour la valeur du code-barres \?</string>
<string name="chooseImageFromGallery">Choisir une image dans la galerie</string>
<string name="takePhoto">Prendre une photo</string>
<string name="removeImage">Retirer limage</string>
<string name="setBackImage">Définir limage verso</string>
@@ -165,4 +163,8 @@
<string name="turn_flashlight_off">Éteindre la lampe de poche</string>
<string name="turn_flashlight_on">Allumer la lampe de poche</string>
<string name="failedGeneratingShareURL">Échec de la génération de lURL de partage. Veuillez signaler ce problème !</string>
<plurals name="selectedCardCount">
<item quantity="one">Sélectionnée : <xliff:g>%d</xliff:g> carte</item>
<item quantity="other">Sélectionnées : <xliff:g>%d</xliff:g> cartes</item>
</plurals>
</resources>

View File

@@ -93,7 +93,7 @@
<item quantity="one"><xliff:g>%d</xliff:g> carta</item>
<item quantity="other"><xliff:g>%d</xliff:g> carte</item>
</plurals>
<string name="parsingBalanceFailed">&lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"&gt;%s&lt;/xliff:g&gt; non sembra un saldo corretto.</string>
<string name="parsingBalanceFailed"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g> non sembra un saldo corretto.</string>
<string name="points">Punti</string>
<string name="currency">Valuta</string>
<string name="balance">Saldo</string>
@@ -118,17 +118,17 @@
\n
\nNESSUN DATO VIENE RACCOLTO, cosa che chiunque può confermare dato che la nostra applicazione è un software libero.</string>
<string name="privacy_policy">Informativa sulla riservatezza</string>
<string name="importVoucherVaultMessage">Trova un file probabilmente chiamato <i>vouchervault.json</i> da importare.
<string name="importVoucherVaultMessage">Seleziona la tua esportazione <i>vouchervault.json</i> da Voucher Vault da importare.
\nOppure crealo premendo prima Esporta in Voucher Vault.</string>
<string name="importVoucherVault">Importa da Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Trova un file probabilmente chiamato <i>LoyaltyCardKeychain.csv</i> da importare.
\nOppure crealo dal menù Importa/Esporta nel Loyalty Card Keychain premendo prima Esporta.</string>
<string name="importLoyaltyCardKeychainMessage">Seleziona la tua esportazione <i>LoyaltyCardKeychain.csv</i> da Loyalty Card Keychain per importarla.
\nOppure createlo dal menù Importazione/Esportazione in Loyalty Card Keychain premendo prima su Esporta.</string>
<string name="importLoyaltyCardKeychain">Importa da Loyalty Card Keychain</string>
<string name="importFidmeMessage">Trova un file probabilmente chiamato <i>fidme-export-request-xxxxxx.zip</i> da importare, e poi seleziona i tipi di codice a barre manualmente in seguito.
\nOppure crearlo dal tuo profilo FidMe scegliendo Protezione dati e poi premendo Estrai i miei dati prima.</string>
<string name="importFidmeMessage">Seleziona la tua esportazione <i>fidme-export-request-xxxxxx.zip</i> da FidMe per importare, e seleziona i tipi di codice a barre manualmente dopo.
\nOppure crearlo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima.</string>
<string name="importFidme">Importa da FidMe</string>
<string name="importCatimaMessage">Trova un file probabilmente chiamato <i>Catima.csv</i> da importare.
\nOppure crealo dal menù Importa/Esporta di unaltra applicazione Catima premendo prima Esporta.</string>
<string name="importCatimaMessage">Seleziona la tua esportazione <i>catima.zip</i> da Catima per importarla.
\nOppure crealo dal menù Importazione/Esportazione di un\'altra applicazione Catima premendo prima Esporta.</string>
<string name="importCatima">Importa da Catima</string>
<string name="setBarcodeId">Imposta il valore del codice a barre</string>
<string name="sameAsCardId">Uguale all\'ID della carta</string>
@@ -145,13 +145,11 @@
<string name="intent_import_card_from_url_share_multiple_text">Voglio condividere alcune carte con te</string>
<string name="copy_to_clipboard_multiple_toast">Numeri delle carte copiati negli appunti</string>
<string name="card_ids_copied">Numero/i della carta copiato/i</string>
<string name="card_selected">"Selezionata: "</string>
<string name="no">No</string>
<string name="yes"></string>
<string name="updateBarcodeQuestionText">Hai cambiato l\'ID della carta. Vuoi anche aggiornare il codice a barre per usare lo stesso valore\?</string>
<string name="updateBarcodeQuestionTitle">Aggiornare il valore del codice a barre\?</string>
<string name="takePhoto">Scatta una foto</string>
<string name="chooseImageFromGallery">Scegli unimmagine dalla galleria</string>
<string name="removeImage">Rimuovi limmagine</string>
<string name="setBackImage">Imposta immagine posteriore</string>
<string name="setFrontImage">Imposta immagine frontale</string>
@@ -159,10 +157,14 @@
<string name="backImageDescription">Immagine posteriore della carta</string>
<string name="frontImageDescription">Immagine frontale della carta</string>
<string name="passwordRequired">Si prega di inserire la password</string>
<string name="importStocardMessage">Trova il tuo file .zip Stocard da importare e poi seleziona manualmente i tipi di codici a barre in seguito.
\nO ottenerlo inviando un messaggio a support@stocardapp.com e chiedendo prima un\'esportazione dei tuoi dati.</string>
<string name="importStocardMessage">Seleziona la tua esportazione <i>***-sync.zip</i> da Stocard per importare, e seleziona i tipi di codice a barre manualmente dopo.
\nOppure ottenerlo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati.</string>
<string name="importStocard">Importa da Stocard</string>
<string name="turn_flashlight_off">Spegni la torcia</string>
<string name="turn_flashlight_on">Accendi la torcia</string>
<string name="failedGeneratingShareURL">Impossibile generare l\'URL di condivisione. Si prega di segnalare questo errore!</string>
<plurals name="selectedCardCount">
<item quantity="one">Selezionata: <xliff:g>%d</xliff:g> carta</item>
<item quantity="other">Selezionate: <xliff:g>%d</xliff:g> carte</item>
</plurals>
</resources>

View File

@@ -3,15 +3,15 @@
<string name="wrongValueForBarcodeType">選択したバーコード形式ではこの番号は使用できません</string>
<string name="unsupportedBarcodeType">このバーコード形式は表示できません。将来のアップデートにより対応するかもしれません。</string>
<string name="setBarcodeId">バーコード番号を設定</string>
<string name="importLoyaltyCardKeychainMessage">インポートするには <i>LoyaltyCardKeychain.csv</i> のような名前のファイルを選択してください。
\nまたは、あらかじめ Loyalty Card Keychainアプリからファイルをエクスポートしてください。</string>
<string name="importLoyaltyCardKeychain">Loyalty Card Keychain からインポート</string>
<string name="importFidmeMessage">インポートするには <i>fidme-export-request-xxxxxx.zip</i> のような名前のファイルを選択してください。そのあと手動でバーコード形式を選択してください。
\nまたは 、あらかじめFidMeからファイルを作成してください。</string>
<string name="importFidme">FidMe からインポート</string>
<string name="importCatimaMessage">インポートするには <i>Catima.csv</i> のような名前のファイルを選択してください。
\nまたは、あらかじめ他のCatima アプリからファイルをエクスポートしてください。</string>
<string name="importCatima">Catima からインポート</string>
<string name="importLoyaltyCardKeychainMessage">インポートするにはLoyalty Card Keychainでエクスポートした <i>LoyaltyCardKeychain.csv</i>ファイルを選択してください。
\nファイルがない場合、 Loyalty Card Keychainアプリからファイルをエクスポートしてください。</string>
<string name="importLoyaltyCardKeychain">Loyalty Card Keychainからインポート</string>
<string name="importFidmeMessage">インポートするにはFindMeでエクスポートした <i>fidme-export-request-xxxxxx.zip</i>ファイルを選択してください。そのあと手動でバーコード形式を選択してください。
\nファイルがない場合、FidMeファイルを作成してください。</string>
<string name="importFidme">FidMeからインポート</string>
<string name="importCatimaMessage">インポートするにはCatimaでエクスポートした<i>Catima.zip</i>ファイルを選択してください。
\nファイルがない場合、他のCatimaアプリファイルをエクスポートしてください。</string>
<string name="importCatima">Catimaからインポート</string>
<string name="accept">承認</string>
<string name="privacy_policy_popup_text">プライバシーポリシーの案内:
\n
@@ -35,7 +35,7 @@
<string name="card">カード</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> ポイント</string>
<string name="balanceSentence">残高: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">期限: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">期限切れ: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">期限: <xliff:g>%s</xliff:g></string>
<string name="groupsList">グループ: <xliff:g>%s</xliff:g></string>
<string name="addFromImage">ギャラリーから画像を選択</string>
@@ -55,7 +55,7 @@
<string name="enter_group_name">グループ名を入力</string>
<string name="exportSuccessful">カードのデータがエクスポートされました</string>
<string name="importSuccessful">カードのデータがインポートされました</string>
<string name="intent_import_card_from_url_share_text">あなたとカード共有したいです</string>
<string name="intent_import_card_from_url_share_text">カード共有をしましょう</string>
<string name="settings_disable_lockscreen_while_viewing_card">バーコード表示中は画面をロックしない</string>
<string name="settings_keep_screen_on">バーコード表示中は画面を消灯しない</string>
<string name="settings_lock_barcode_orientation">バーコード表示画面を自動回転しない</string>
@@ -65,14 +65,14 @@
<string name="settings_light_theme">ライト</string>
<string name="settings_system_theme">システムに従う</string>
<string name="settings_theme">テーマ</string>
<string name="settings_category_title_ui">ユーザーインターフェイス</string>
<string name="settings_category_title_ui">外観</string>
<string name="settings">設定</string>
<string name="starImage">お気に入りのスター</string>
<string name="thumbnailDescription">カードのサムネイル</string>
<string name="copy_to_clipboard_toast">カード番号をクリップボードにコピーしました</string>
<string name="enterBarcodeInstructions">カード番号を入力し、バーコード形式を選択してください。</string>
<string name="selectBarcodeTitle">バーコード選択</string>
<string name="app_libraries">Third-party libre libraries: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_libraries">Libre third-party libraries: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_revision_fmt">Revision Info: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="about_title_fmt">About <xliff:g id="app_name">%s</xliff:g></string>
@@ -80,7 +80,7 @@
<string name="app_copyright_old">Based on Loyalty Card Keychain
\ncopyright © 20162020 Branden Archer.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="app_resources">Third-party libre resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_resources">Libre third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="about">Catimaについて</string>
<string name="importOptionApplicationButton">外部のアプリを使う</string>
<string name="importOptionApplicationExplanation">任意のアプリやお気に入りのファイルマネージャーからファイルを開く。</string>
@@ -93,17 +93,17 @@
<string name="exporting">エクスポート中…</string>
<string name="importing">インポート中…</string>
<string name="exportFailed">カードをエクスポートできませんでした</string>
<string name="exportFailedTitle">エクスポート失敗</string>
<string name="exportFailedTitle">エクスポート失敗しました</string>
<string name="exportSuccessfulTitle">エクスポートしました</string>
<string name="sameAsCardId">カードの表記と同一</string>
<string name="barcodeId">バーコード番号</string>
<string name="importVoucherVaultMessage">インポートするには <i>vouchervault.json</i> のような名前のファイルを選択してください。
\nまたは、あらかじめVoucher Vault でファイルを作成してください。</string>
<string name="importVoucherVault">Voucher Vault からインポート</string>
<string name="importVoucherVaultMessage">Voucher Vaultでエクスポートした <i>vouchervault.json</i>ファイルを選択してください。
\nファイルがない場合、Voucher Vaultでファイルをエクスポートしてください。</string>
<string name="importVoucherVault">Voucher Vaultからインポート</string>
<string name="importFailed">カードをインポートできません</string>
<string name="importFailedTitle">インポート失敗</string>
<string name="importFailedTitle">インポート失敗しました</string>
<string name="importSuccessfulTitle">インポートしました</string>
<string name="importExportHelp">カードをバックアップすると、カードを他のデバイスに移すことができます。</string>
<string name="importExportHelp">カードをバックアップすると、他のデバイスにカードを移すことができます。</string>
<string name="exportName">エクスポート</string>
<string name="importExport">インポート/エクスポート</string>
<string name="failedParsingImportUriError">インポートURIを解析できません</string>
@@ -118,10 +118,10 @@
<string name="editCardTitle">カードの編集</string>
<string name="sendLabel">送信先を選択…</string>
<string name="share">共有</string>
<string name="copy_to_clipboard">カード番号をクリップボードにコピー</string>
<string name="ok">はい</string>
<string name="deleteConfirmation">選択したカードを削除しますか?</string>
<string name="deleteTitle">カード削除</string>
<string name="copy_to_clipboard">カード番号をクリップボードにコピーする</string>
<string name="ok">確定</string>
<string name="deleteConfirmation">このカードを削除しますか?</string>
<string name="deleteTitle">カード削除</string>
<string name="unlockScreen">自動回転を無効にしない</string>
<string name="lockScreen">自動回転を無効にする</string>
<string name="confirm">確認</string>
@@ -133,7 +133,7 @@
<string name="star">お気に入りに追加</string>
<string name="noBarcode">バーコードなし</string>
<string name="barcodeNoBarcode">バーコード指定なし</string>
<string name="barcodeType">形式</string>
<string name="barcodeType">バーコード形式</string>
<string name="cardId">カード番号</string>
<string name="note">メモ</string>
<string name="storeName">名前</string>
@@ -141,8 +141,28 @@
<string name="noGiftCards">まず初めに+ボタンを押してカードを追加するか、メニューから以前のカードをインポートしてください。</string>
<string name="action_add">追加</string>
<string name="action_search">検索</string>
<string name="intent_import_card_from_url_share_multiple_text">あなたとカードを共有したいです</string>
<string name="intent_import_card_from_url_share_multiple_text">カードを共有しましょう</string>
<string name="copy_to_clipboard_multiple_toast">カード番号をクリップボードにコピーしました</string>
<string name="card_ids_copied">コピーしたカード</string>
<string name="card_selected">"選択: "</string>
<string name="turn_flashlight_off">ライトをオフにする</string>
<string name="turn_flashlight_on">ライトをオンにする</string>
<string name="failedGeneratingShareURL">共有URLの生成に失敗しました。バグを報告してください。</string>
<string name="passwordRequired">パスワードを入力してください</string>
<string name="no">いいえ</string>
<string name="yes">はい</string>
<string name="updateBarcodeQuestionText">カード番号を変更しました。バーコード番号も同じ値に変更しますか?</string>
<string name="updateBarcodeQuestionTitle">バーコードの番号を変更しますか?</string>
<string name="takePhoto">写真を撮影する</string>
<string name="removeImage">画像を削除</string>
<string name="setBackImage">裏面の画像を設定</string>
<string name="setFrontImage">表面の画像を設定</string>
<string name="photos">フォト</string>
<string name="backImageDescription">裏面</string>
<string name="frontImageDescription">表面</string>
<string name="importStocardMessage">Stocardでエクスポートした<i>***-sync.zip</i>ファイルを選択し、手動でバーコード形式を選択してください。
\nファイルがない場合、e-mailing support@stocardapp.comにデータのエクスポートを要求してください。</string>
<string name="importStocard">Stocardからインポート</string>
<plurals name="selectedCardCount">
<item quantity="other">選択済み: <xliff:g>%d</xliff:g></item>
</plurals>
</resources>

View File

@@ -15,7 +15,7 @@
<string name="settings_category_title_ui">사용자 인터페이스</string>
<string name="settings">설정</string>
<string name="enterBarcodeInstructions">카드 ID를 입력하고 카드에서 사용하는 바코드 이미지를 선택하세요. 바코드를 사용하지 않는 경우 “이 카드는 바코드가 없음”을 선택하세요.</string>
<string name="app_revision_fmt">리비전 정보: &lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"app_revision_url\"&gt;%s&lt;/xliff:g&gt;</string>
<string name="app_revision_fmt">리비전 정보: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">바코드 선택</string>
<string name="about">정보</string>
<string name="exporting">내보내는 중…</string>
@@ -78,4 +78,4 @@
<string name="starImage">즐겨찾기 별</string>
<string name="settings_display_barcode_max_brightness">바코드를 표시할 때 화면 밝기 높이기</string>
<string name="barcode">바코드</string>
</resources>
</resources>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
<string name="action_add">Pridėti</string>
<string name="noGiftCards">Norėdami pridėti kortelę, spustelėkite mygtuką + plius arba pirmiausia importuokite kortelę iš ⋮ meniu.</string>
<string name="storeName">Pavadinimas</string>
@@ -17,21 +17,21 @@
<string name="editCardTitle">Redaguoti lojalumo kortelę</string>
<string name="addCardTitle">Pridėti lojalumo kortelę</string>
<string name="scanCardBarcode">Skenuoti kortelės brūkšninį kodą</string>
<string name="barcodeImageDescription">Kortelės brūkšninio kodo paveikslėlis</string>
<string name="noStoreError">Parduotuvė neįvesta</string>
<string name="barcodeImageDescription">Kortelės brūkšninio kodo vaizdas</string>
<string name="noStoreError">Neįvestas pavadinimas</string>
<string name="noCardIdError">Neįvestas kortelės ID</string>
<string name="importExport">Importuoti/Exportuoti</string>
<string name="exportName">Exportuoti</string>
<string name="importFailed">Nepavyko importuoti</string>
<string name="exportFailed">Nepavyko eksportuoti</string>
<string name="importFailed">Nepavyko importuoti kortelių</string>
<string name="exportFailed">Nepavyko eksportuoti kortelių</string>
<string name="importing">Importuoja…</string>
<string name="exporting">Eksportuoja…</string>
<string name="noExternalStoragePermissionError">Negalima importuoti/eksportuoti kortelių be išorinės atminties leidimo</string>
<string name="noExternalStoragePermissionError">Pirmiausia suteikite išorinės saugyklos leidimą, kad galėtumėte importuoti arba eksportuoti korteles</string>
<string name="about">Apie</string>
<string name="app_license">Licenzijuota pagal GPLv3.</string>
<string name="app_license">Copylefted libre programinė įranga, licencijuota GPLv3+.</string>
<string name="about_title_fmt">Apie <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revizijos informacija: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_revision_fmt">Revizijos info: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Pasirinkite brūkšninį kodą</string>
<string name="copy_to_clipboard_toast">Kortelės ID nukopijuota į iškarpinę</string>
<string name="card_ids_copied">Nukopijuotos kortelės ID</string>
@@ -45,6 +45,128 @@
<string name="barcodeNoBarcode">Ši kortelė neturi brūkšninio kodo</string>
<string name="barcodeType">Brūkšninio kodo tipas</string>
<string name="noMatchingGiftCards">Nieko nerasta. Pabandykite pakeisti paiešką.</string>
<string name="card_selected">"Pasirinkta: "</string>
<string name="action_search">Ieškoti</string>
<string name="cardShortcut">Kortelės sparčioji nuoroda</string>
<string name="importVoucherVaultMessage">Pasirinkite savo <i>vouchervault.json</i> eksportą iš Voucher Vault, kurį norite importuoti.
\nArba sukurkite jį pirmiausia paspausdami Eksportuoti Voucher Vault.</string>
<string name="importVoucherVault">Importuoti iš Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Pasirinkite savo <i> LoyaltyCardKeychain.csv</i> eksportą iš Loyalty Card Keychain, kurį norite importuoti.
\nArba sukurkite jį iš Loyalty Card Keychain meniu Importas/Eksportas, pirmiausia paspausdami Eksportuoti.</string>
<string name="importLoyaltyCardKeychain">Importuoti iš Loyalty Card Keychain</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="parsingBalanceFailed">Panašu, kad <xliff:g> %s </xliff:g> reikšmė nėra tinkama.</string>
<string name="moveBarcodeToCenterOfScreen">Centruoti brūkšninį kodą ekrane</string>
<string name="moveBarcodeToTopOfScreen">Perkelti brūkšninį kodą į ekrano viršų</string>
<string name="settings_display_barcode_max_brightness">Šviesinti brūkšninio kodo rodinį</string>
<string name="failedParsingImportUriError">Nepavyko iššifruoti importo URI</string>
<string name="turn_flashlight_off">Išjunkti žibintuvėlį</string>
<string name="turn_flashlight_on">Įjunkti žibintuvėlį</string>
<string name="failedGeneratingShareURL">Nepavyko sugeneruoti bendrinamo URL. Praneškite apie šią klaidą!</string>
<string name="passwordRequired">Įveskite slaptažodį</string>
<string name="no">Ne</string>
<string name="yes">Taip</string>
<string name="updateBarcodeQuestionText">Pakeitėte kortelės ID. Ar norite atnaujinti ir brūkšninį kodą, kad būtų naudojama ta pati reikšmė\?</string>
<string name="updateBarcodeQuestionTitle">Atnaujinti brūkšninio kodo reikšmę\?</string>
<string name="takePhoto">Nufotografuoti</string>
<string name="removeImage">Pašalinti vaizdą</string>
<string name="setBackImage">Nustatyti galinį vaizdą</string>
<string name="setFrontImage">Nustatyti priekinį vaizdą</string>
<string name="photos">Nuotraukos</string>
<string name="backImageDescription">Kortelės galinis vaizdas</string>
<string name="frontImageDescription">Kortelės priekinis vaizdas</string>
<string name="intent_import_card_from_url_share_multiple_text">Noriu su jumis pasidalyti keliomis kortelėmis</string>
<string name="copy_to_clipboard_multiple_toast">Kortelės ID nukopijuotas į iškarpinę</string>
<string name="wrongValueForBarcodeType">Vertė netinkama pasirinktam brūkšninio kodo tipui</string>
<string name="unsupportedBarcodeType">Šio brūkšninio kodo tipo dar negalima rodyti. Galbūt jis bus palaikomas vėlesnėje programėlės versijoje.</string>
<string name="setBarcodeId">Nustatyti brūkšninio kodo reikšmę</string>
<string name="sameAsCardId">Tokia pat kaip kortelės ID</string>
<string name="barcodeId">Brūkšninio kodo reikšmė</string>
<string name="importStocardMessage">Pasirinkite <i>***-sync.zip</i> eksportą iš Stocard, kad galėtumėte importuoti, o vėliau brūkšninių kodų tipus pasirinkite rankiniu būdu.
\nArba gaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis.</string>
<string name="importStocard">Importuoti iš Stocard</string>
<string name="importFidmeMessage">Pasirinkite <i>fidme-export-request-xxxxxx.zip</i> eksportą iš FidMe, kurį norite importuoti, ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu.
\nArba sukurkite jį iš savo FidMe profilio, pasirinkę Duomenų apsauga ir pirmiausia paspaudę Išgauti mano duomenis.</string>
<string name="importFidme">Importuoti iš FidMe</string>
<string name="importCatimaMessage">Norėdami importuoti, pasirinkite savo <i> catima.zip </i> eksportą iš Catima.
\nArba sukurkite ją iš kitos Catima programos importavimo / eksportavimo meniu, pirmiausia paspausdami Eksportuoti ten.</string>
<string name="importCatima">Importuoti iš Catima</string>
<string name="accept">Priimti</string>
<string name="privacy_policy_popup_text">Privatumo politikos pranešimas (kurio reikalaujama kai kuriose programėlių parduotuvėse):
\n
\nJOKIE DUOMENYS NĖRA RENKAMI, o tai gali patvirtinti bet kas, nes mūsų programėlė yra libre programinė įranga.</string>
<string name="privacy_policy">Privatumo politika</string>
<string name="chooseImportType">Importuoti duomenis iš\?</string>
<string name="points">Taškai</string>
<string name="currency">Valiuta</string>
<string name="balance">Balansas</string>
<string name="errorReadingImage">Nepavyko nuskaityti paveikslėlio</string>
<string name="noBarcodeFound">Nerastas joks brūkšninis kodas</string>
<string name="chooseExpiryDate">Pasirinkite galiojimo datą</string>
<string name="never">Niekada</string>
<string name="expiryDate">Galiojimo data</string>
<string name="editBarcode">Redaguoti brūkšninį kodą</string>
<string name="barcode">Brūkšninis kodas</string>
<string name="card">Kortelė</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> taškai</string>
<string name="balanceSentence">Balansas: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Galiojimas baigėsi: <xliff:g>%s</xliff:g></string>
<string name="expiryStateSentence">Nustoja galioti: <xliff:g>%s</xliff:g></string>
<string name="groupsList">Grupės: <xliff:g> %s </xliff:g></string>
<string name="addFromImage">Pasirinkti vaizdą iš galerijos</string>
<string name="addManually">Rankiniu būdu įvesti kortelės ID</string>
<string name="leaveWithoutSaveConfirmation">Išeiti neišsaugojus\?</string>
<string name="leaveWithoutSaveTitle">Išeiti</string>
<string name="moveDown">Judėti žemyn</string>
<string name="moveUp">Judėti aukštyn</string>
<string name="failedOpeningFileManager">Pirmiausia įdiekite failų tvarkyklę.</string>
<string name="deleteConfirmationGroup">Ištrinti grupę\?</string>
<string name="all">Visos</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kortelę</item>
<item quantity="few"><xliff:g>%d</xliff:g> kortelės</item>
<item quantity="other"><xliff:g>%d</xliff:g> kortelių</item>
</plurals>
<string name="noGroups">Spustelėkite + pliuso mygtuką, kad pirmiausia pridėtumėte grupes kategorizavimui.</string>
<string name="groups">Grupės</string>
<string name="enter_group_name">Įvesti grupės pavadinimą</string>
<string name="exportSuccessful">Kortelės duomenys eksportuoti</string>
<string name="importSuccessful">Kortelės duomenys importuoti</string>
<string name="intent_import_card_from_url_share_text">Noriu pasidalyti su jumis kortele</string>
<string name="settings_disable_lockscreen_while_viewing_card">Neleisti užrakinti ekrano</string>
<string name="settings_keep_screen_on">Laikyti ekraną įjungtą</string>
<string name="settings_lock_barcode_orientation">Užrakinti brūkšninio kodo orientaciją</string>
<string name="settings_max_font_size_scale">Didžiausias šrifto dydis</string>
<string name="settings_dark_theme">Tamsi</string>
<string name="settings_light_theme">Šviesi</string>
<string name="settings_system_theme">Sistema</string>
<string name="settings_theme">Tema</string>
<string name="settings_category_title_ui">Vartotojo sąsaja</string>
<string name="settings">Nustatymai</string>
<string name="starImage">Mėgstamiausia žvaigždė</string>
<string name="thumbnailDescription">Kortelės miniatiūra</string>
<string name="enterBarcodeInstructions">Įveskite kortelės ID ir toliau pasirinkite jos brūkšninio kodo tipą arba \"Ši kortelė neturi brūkšninio kodo\".</string>
<string name="app_resources">Libre trečiųjų šalių ištekliai: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Libre trečiųjų šalių bibliotekos: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_old">Paremta Loyalty Card Keychain
\nautorinės teisės © 20162020 Branden Archer.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autorinės teisės © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="importOptionApplicationButton">Naudoti kitą programą</string>
<string name="importOptionApplicationExplanation">Norėdami atidaryti failą, naudokite bet kurią programą arba mėgstamą failų tvarkyklę.</string>
<string name="importOptionApplicationTitle">Naudoti kitą programą</string>
<string name="importOptionFilesystemButton">Iš failų sistemos</string>
<string name="importOptionFilesystemExplanation">Pasirinkite konkretų failą iš failų sistemos.</string>
<string name="importOptionFilesystemTitle">Importuoti iš failų sistemos</string>
<string name="exportOptionExplanation">Duomenys bus įrašyti į jūsų pasirinktą vietą.</string>
<string name="exportFailedTitle">Eksportuoti nepavyko</string>
<string name="exportSuccessfulTitle">Eksportuota</string>
<string name="importFailedTitle">Importuoti nepavyko</string>
<string name="importSuccessfulTitle">Importuota</string>
<string name="importExportHelp">Atsarginių kopijų darymas leidžia perkelti korteles į kitą įrenginį.</string>
<string name="noCardExistsError">Nepavyko rasti kortelės</string>
<string name="share">Dalintis</string>
<plurals name="selectedCardCount">
<item quantity="one">Pasirinkta: <xliff:g>%d</xliff:g> kortelė</item>
<item quantity="few">Pasirinktos: <xliff:g>%d</xliff:g> kortelės</item>
<item quantity="other">Pasirinkta: <xliff:g>%d</xliff:g> kortelių</item>
</plurals>
</resources>

View File

@@ -143,7 +143,6 @@
<string name="copy_to_clipboard_multiple_toast">Kopierte kort-ID-er til utklippstavle</string>
<string name="app_resources">Frie tredjepartsressurser: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Frie tredjepartsbibliotek: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="card_selected">"Valgt: "</string>
<string name="card_ids_copied">Kopierte kort-ID(er)</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Opphavsrett © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="updateBarcodeQuestionText">Du har endret kortets ID. Ønsker du å også oppdatere strekkoden til samme verdi\?</string>
@@ -151,7 +150,6 @@
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionTitle">Oppdater strekkodeverdi\?</string>
<string name="takePhoto">Ta et bilde</string>
<string name="chooseImageFromGallery">Velg bilde fra galleriet</string>
<string name="removeImage">Fjern bilde</string>
<string name="setBackImage">Sett bakside</string>
<string name="setFrontImage">Sett forside</string>

View File

@@ -145,13 +145,11 @@
<string name="intent_import_card_from_url_share_multiple_text">Ik wil kaarten met je delen</string>
<string name="copy_to_clipboard_multiple_toast">De kaart-id\'s zijn gekopieerd naar het klembord</string>
<string name="card_ids_copied">De kaart-ids zijn gekopieerd</string>
<string name="card_selected">"Geselecteerd: "</string>
<string name="no">Nee</string>
<string name="yes">Ja</string>
<string name="updateBarcodeQuestionText">Je hebt de kaart-id aangepast. Wil je dezelfde waarde toekennen aan de barcode\?</string>
<string name="updateBarcodeQuestionTitle">Barcodewaarde bijwerken\?</string>
<string name="takePhoto">Foto maken</string>
<string name="chooseImageFromGallery">Kiezen uit galerij</string>
<string name="removeImage">Afbeelding verwijderen</string>
<string name="setFrontImage">Voorzijde kiezen</string>
<string name="setBackImage">Achterzijde kiezen</string>
@@ -165,4 +163,8 @@
<string name="failedGeneratingShareURL">De te delen link kan niet worden gegenereerd. Meld deze bug!</string>
<string name="turn_flashlight_off">Zaklamp uitzetten</string>
<string name="turn_flashlight_on">Zaklamp aanzetten</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> kaart geselecteerd</item>
<item quantity="other"><xliff:g>%d</xliff:g> kaarten geselecteerd</item>
</plurals>
</resources>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="exporting">Exportacion…</string>
<string name="importing">Importacion…</string>
<string name="exportFailed">Exportacion pas possibla</string>
<string name="exportSuccessfulTitle">Exportat</string>
<string name="importFailed">Importacion de vòstras cartas impossibla</string>
<string name="importFailedTitle">Fracàs de limportacion</string>
<string name="importSuccessfulTitle">Importat</string>
<string name="importExportHelp">Exportar vòstras cartas vos permet de las recuperar sus un autre aparelh.</string>
<string name="exportName">Exportar</string>
<string name="importExport">Importar/Exportar</string>
<string name="failedParsingImportUriError">Analisi impossibla lURI dimportacion</string>
<string name="noCardExistsError">Cap de carta pas trobada</string>
<string name="noCardIdError">Cap de numèro de carta pas picat</string>
<string name="noStoreError">Cap de nom pas picat</string>
<string name="barcodeImageDescription">Imatge del còdi de barras</string>
<string name="card_ids_copied">Num. de la carta copiada</string>
<string name="noCardsMessage">Apondètz den primièr una carta</string>
<string name="cardShortcut">Acorchi de carta</string>
<string name="scanCardBarcode">Numerizar lo còdi de barras</string>
<string name="addCardTitle">Apondre una carta</string>
<string name="editCardTitle">Modificar la carta</string>
<string name="sendLabel">Enviar…</string>
<string name="share">Partejar</string>
<string name="unlockScreen">Activar la rotacion</string>
<string name="lockScreen">Desactivar la rotacion</string>
<string name="confirm">Confirmar</string>
<string name="delete">Suprimir</string>
<string name="edit">Modificar</string>
<string name="save">Enregistrar</string>
<string name="cancel">Anullar</string>
<string name="unstar">Tirar dels favorits</string>
<string name="star">Apondre als favorits</string>
<string name="barcodeType">Tipe còdi de barras</string>
<string name="cardId">Numèro</string>
<string name="note">Nòta</string>
<string name="storeName">Nom</string>
<string name="action_add">Apondre</string>
<string name="action_search">Recercar</string>
</resources>

View File

@@ -147,7 +147,6 @@
<string name="intent_import_card_from_url_share_multiple_text">Поделиться картами</string>
<string name="card_ids_copied">Скопированные номера карт</string>
<string name="copy_to_clipboard_multiple_toast">Номера карт скопированы в буфер обмена</string>
<string name="card_selected">"Выбрано: "</string>
<string name="updateBarcodeQuestionText">Вы изменили номер карты. Обновить также значение штрих-кода, чтобы использовалось одинаковое значение\?</string>
<string name="no">Нет</string>
<string name="yes">Да</string>
@@ -155,7 +154,6 @@
<string name="setBackImage">Изображение задней стороны</string>
<string name="setFrontImage">Изображение лицевой стороны</string>
<string name="takePhoto">Сфотографировать</string>
<string name="chooseImageFromGallery">Выбрать изображение из галереи</string>
<string name="removeImage">Удалить изображение</string>
<string name="backImageDescription">Задняя сторона карты</string>
<string name="frontImageDescription">Лицевая сторона карты</string>
@@ -167,4 +165,10 @@
<string name="failedGeneratingShareURL">Невозможно создать URL для обмена. Пожалуйста, сообщите об ошибке!</string>
<string name="turn_flashlight_off">Отключить вспышку</string>
<string name="turn_flashlight_on">Включить вспышку</string>
<plurals name="selectedCardCount">
<item quantity="one">Выбрано: <xliff:g>%d</xliff:g> карта</item>
<item quantity="few">Выбрано: <xliff:g>%d</xliff:g> карты</item>
<item quantity="many">Выбрано: <xliff:g>%d</xliff:g> карт</item>
<item quantity="other">Выбрано: <xliff:g>%d</xliff:g> карт</item>
</plurals>
</resources>

View File

@@ -23,20 +23,20 @@
<string name="updateBarcodeQuestionText">Ви змінили ID картки. Чи ви бажаєте оновити штрих-код для використання цього ж значення\?</string>
<string name="updateBarcodeQuestionTitle">Оновити значення штрих-коду\?</string>
<string name="wrongValueForBarcodeType">Значення не дійсне для обраного типу штрих-коду</string>
<string name="unsupportedBarcodeType">Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в новішій версії програми.</string>
<string name="unsupportedBarcodeType">Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в подальших версіях програми.</string>
<string name="setBarcodeId">Встановіть значення штрих-коду</string>
<string name="sameAsCardId">Таке ж як ID картки</string>
<string name="barcodeId">Значення штрих-коду</string>
<string name="importVoucherVaultMessage">Знайдіть файл, скоріше за все названий <i>vouchervault.json</i> для імпорту.
\nЧи створіть його натиснувши Експорт у Voucher Vault.</string>
<string name="importVoucherVaultMessage">Оберіть Voucher Vault експорт-файл названий <i>vouchervault.json</i> для імпортування.
\nЧи створіть його натиснувши \"Експорт\" у Voucher Vault.</string>
<string name="importVoucherVault">Імпорт з Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Знайдіть файл, скоріше за все названий <i>LoyaltyCardKeychain.csv</i> для імпорту.
\nЧи створіть його у меню імпорту/експорту Loyalty Card Keychain натиснувши Експорт.</string>
<string name="importCatimaMessage">Знайдіть файл, скоріше за все названий <i>Catima.csv</i> для імпорту.
\nЧи створіть його у меню імпорту/експорту у іншій Catima натиснувши Експорт.</string>
<string name="importLoyaltyCardKeychainMessage">Знайдіть файл названий <i>LoyaltyCardKeychain.csv</i> для імпортування.
\nЧи створіть його у меню імпорту/експорту Loyalty Card Keychain натиснувши \"Експорт\".</string>
<string name="importCatimaMessage">Оберіть експорт-файл названий <i>catima.zip</i> для імпортування.
\nЧи створіть його з меню імпорту/експорту у іншій Catima, натиснувши \"Експорт\".</string>
<string name="importLoyaltyCardKeychain">Імпорт з Loyalty Card Keychain</string>
<string name="importFidmeMessage">Знайдіть файл, скоріше за все названий <i>fidme-export-request-xxxxxx.zip</i> для імпорту і потім виставіть типи штрих-кодів вручну.
\nЧи створіть його у вашому FidMe профілі обравши Захист даних -&gt; Витяг даних.</string>
<string name="importFidmeMessage">Оберіть FidMe експорт-файл названий <i>fidme-export-request-xxxxxx.zip</i> для імпортування і оберіть типи штрих-кодів вручну пізніше.
\nЧи створіть його у вашому FidMe профілі обравши \"Захист даних -&gt; Витяг даних\".</string>
<string name="importFidme">Імпорт з FidMe</string>
<string name="importCatima">Імпорт з Catima</string>
<string name="accept">Прийняти</string>
@@ -149,7 +149,26 @@
<string name="note">Замітка</string>
<string name="storeName">Ім\'я</string>
<string name="noMatchingGiftCards">Збігів не знайдено. Спробуйте змінити параметри пошуку.</string>
<string name="card_selected">"Обрано: "</string>
<string name="action_add">Додати</string>
<string name="action_search">Пошук</string>
<string name="turn_flashlight_off">Вимкнути спалах</string>
<string name="turn_flashlight_on">Увімкнути спалах</string>
<string name="failedGeneratingShareURL">Збій створення URL обміну. Будь ласка повідомте про цю помилку!</string>
<string name="passwordRequired">Будь ласка введіть пароль</string>
<string name="takePhoto">Зробити фото</string>
<string name="removeImage">Видалити зображення</string>
<string name="setBackImage">Встановити зображення тильної сторони</string>
<string name="setFrontImage">Встановити зображення лицьової сторони</string>
<string name="photos">Фотографії</string>
<string name="backImageDescription">Тильна сторона карти</string>
<string name="frontImageDescription">Лицьова сторона карти</string>
<string name="importStocardMessage">Оберіть Stocard експорт-файл, названий <i>***-sync.zip</i> для імпортування і оберіть типи штрих-кодів вручну пізніше.
\nЧи отримайте його надіславши електронного листа із запитом на експортування ваших даних до support@stocardapp.com.</string>
<string name="importStocard">Імпорт із Stocard</string>
<plurals name="selectedCardCount">
<item quantity="one">Обрано: <xliff:g>%d</xliff:g> карта</item>
<item quantity="few">Обрано: <xliff:g>%d</xliff:g> карти</item>
<item quantity="many">Обрано: <xliff:g>%d</xliff:g> карт</item>
<item quantity="other">Обрано: <xliff:g>%d</xliff:g> карт</item>
</plurals>
</resources>

View File

@@ -141,7 +141,6 @@
<string name="storeName">名称</string>
<string name="noMatchingGiftCards">没有找到任何东西。尝试改变你的搜索。</string>
<string name="noGiftCards">点击 \"+\"加号按钮来添加卡片,或者先从⋮菜单中导入一些。</string>
<string name="card_selected">"选中: "</string>
<string name="action_add">添加</string>
<string name="action_search">搜索</string>
</resources>

View File

@@ -4,7 +4,10 @@
<string name="action_search">Search</string>
<string name="action_add">Add</string>
<string name="card_selected">Selected:\u0020</string>
<plurals name="selectedCardCount">
<item quantity="one">Selected: <xliff:g>%d</xliff:g> card</item>
<item quantity="other">Selected: <xliff:g>%d</xliff:g> cards</item>
</plurals>
<string name="noGiftCards">Click the + plus button to add a card, or import some from the ⋮ menu first.</string>
<string name="noMatchingGiftCards">Didn\'t find anything. Try changing your search.</string>
@@ -187,7 +190,6 @@
<string name="setFrontImage">Set front image</string>
<string name="setBackImage">Set back image</string>
<string name="removeImage">Remove image</string>
<string name="chooseImageFromGallery">Choose image from gallery</string>
<string name="takePhoto">Take a photo</string>
<string name="updateBarcodeQuestionTitle">Update barcode value?</string>
<string name="updateBarcodeQuestionText">You changed the card ID. Do you want to also update the barcode to use the same value?</string>

View File

@@ -1,6 +1,7 @@
package protect.card_locker;
import android.app.Activity;
import androidx.appcompat.app.AlertDialog;
import android.app.DatePickerDialog;
import android.content.Context;
import android.content.Intent;
@@ -9,7 +10,10 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
@@ -24,6 +28,7 @@ import android.widget.SeekBar;
import android.widget.TextView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.textfield.MaterialAutoCompleteTextView;
import com.google.android.material.textfield.TextInputLayout;
import com.google.zxing.BarcodeFormat;
@@ -38,6 +43,7 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowActivity;
import org.robolectric.shadows.ShadowAlertDialog;
import org.robolectric.shadows.ShadowDialog;
import org.robolectric.shadows.ShadowLog;
@@ -55,6 +61,7 @@ import static android.os.Looper.getMainLooper;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.robolectric.Shadows.shadowOf;
@@ -298,7 +305,11 @@ public class LoyaltyCardViewActivityTest
assertEquals(contents, textView.getEditText().getText().toString());
} else if (fieldType == FieldTypeView.ImageView) {
ImageView imageView = (ImageView) view;
// TODO: implement
Bitmap image = null;
if (imageView.getTag() != null) {
image = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
}
assertEquals(contents, image);
} else {
throw new UnsupportedOperationException();
}
@@ -308,7 +319,8 @@ public class LoyaltyCardViewActivityTest
final String store, final String note, final String expiryString,
final String balanceString, final String balanceTypeString,
final String cardId, final String barcodeId,
final String barcodeType)
final String barcodeType, final Bitmap frontImage,
final Bitmap backImage)
{
if(mode == ViewMode.VIEW_CARD)
{
@@ -326,9 +338,90 @@ public class LoyaltyCardViewActivityTest
checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId, FieldTypeView.TextView);
checkFieldProperties(activity, R.id.barcodeIdField, View.VISIBLE, barcodeId, FieldTypeView.TextView);
checkFieldProperties(activity, R.id.barcodeTypeField, View.VISIBLE, barcodeType, FieldTypeView.TextView);
checkFieldProperties(activity, R.id.barcode, View.VISIBLE, null, FieldTypeView.ImageView);
checkFieldProperties(activity, R.id.frontImage, View.VISIBLE, null, FieldTypeView.ImageView);
checkFieldProperties(activity, R.id.backImage, View.VISIBLE, null, FieldTypeView.ImageView);
//checkFieldProperties(activity, R.id.barcode, View.VISIBLE, null, FieldTypeView.ImageView);
checkFieldProperties(activity, R.id.frontImage, View.VISIBLE, frontImage, FieldTypeView.ImageView);
checkFieldProperties(activity, R.id.backImage, View.VISIBLE, backImage, FieldTypeView.ImageView);
}
}
@Test
public void noDataLossOnResume()
{
registerMediaStoreIntentHandler();
for(boolean newCard : new boolean[] {false, true}) {
System.out.println();
System.out.println("=====");
System.out.println("New card? " + newCard);
System.out.println("=====");
System.out.println();
ActivityController activityController;
if (!newCard) {
activityController = createActivityWithLoyaltyCard(true);
} else {
activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
}
Activity activity = (Activity) activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
if (!newCard) {
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0);
}
activityController.start();
activityController.visible();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check default settings
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.name(), null, null);
// Change everything
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final EditText expiryField = activity.findViewById(R.id.expiryField);
final EditText balanceField = activity.findViewById(R.id.balanceField);
final EditText balanceTypeField = activity.findViewById(R.id.balanceCurrencyField);
final EditText cardIdField = activity.findViewById(R.id.cardIdView);
final EditText barcodeField = activity.findViewById(R.id.barcodeIdField);
final EditText barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final ImageView frontImageView = activity.findViewById(R.id.frontImage);
final ImageView backImageView = activity.findViewById(R.id.backImage);
Currency currency = Currency.getInstance("EUR");
Date expiryDate = new Date();
Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle);
Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.save_24dp);
storeField.setText("correct store");
noteField.setText("correct note");
LoyaltyCardEditActivity.formatExpiryField(context, expiryField, expiryDate);
balanceField.setText("100");
balanceTypeField.setText(currency.getSymbol());
cardIdField.setText("12345678");
barcodeField.setText("87654321");
barcodeTypeField.setText(BarcodeFormat.QR_CODE.name());
LoyaltyCardEditActivity.setCardImage(frontImageView, frontBitmap);
LoyaltyCardEditActivity.setCardImage(backImageView, backBitmap);
shadowOf(getMainLooper()).idle();
// Check if changed
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.name(), frontBitmap, backBitmap);
// Resume
activityController.pause();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.name(), frontBitmap, backBitmap);
}
}
@@ -343,7 +436,7 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never) , "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),"");
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never) , "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),context.getString(R.string.noBarcode), null, null);
}
@Test
@@ -403,12 +496,12 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),"");
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),context.getString(R.string.noBarcode), null, null);
// Complete barcode capture successfully
captureBarcodeWithResult(activity, true);
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
shadowOf(getMainLooper()).idle();
@@ -427,12 +520,14 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), "");
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
// Complete barcode capture in failure
captureBarcodeWithResult(activity, false);
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),"");
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),context.getString(R.string.noBarcode), null, null);
}
@Test
@@ -446,12 +541,12 @@ public class LoyaltyCardViewActivityTest
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),"");
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),context.getString(R.string.noBarcode), null, null);
// Complete barcode capture successfully
captureBarcodeWithResult(activity, true);
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
// Cancel the loyalty card creation
assertEquals(false, activity.isFinishing());
@@ -507,7 +602,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
db.close();
}
@@ -526,7 +621,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", null, "0", context.getString(R.string.points), BARCODE_DATA, null, BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", null, "0", context.getString(R.string.points), BARCODE_DATA, null, BARCODE_TYPE.toString(), null, null);
db.close();
}
@@ -545,12 +640,12 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
// Complete barcode capture successfully
captureBarcodeWithResult(activity, true);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
db.close();
}
@@ -569,12 +664,12 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
// Complete barcode capture successfully
captureBarcodeWithResult(activity, true);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
// Cancel the loyalty card creation
assertEquals(false, activity.isFinishing());
@@ -607,7 +702,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
// Set date to today
MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField);
@@ -621,7 +716,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
db.close();
}
@@ -640,13 +735,13 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
// Set date to never
MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField);
expiryField.setText(expiryField.getAdapter().getItem(0).toString(), false);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
db.close();
}
@@ -665,7 +760,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
// Set balance to 10 points
EditText balanceField = activity.findViewById(R.id.balanceField);
@@ -694,7 +789,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "10.00", "", EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "10.00", "", EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE.toString(), null, null);
db.close();
}
@@ -716,7 +811,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "10.00", "$", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "10.00", "$", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
shadowOf(getMainLooper()).idle();
@@ -738,7 +833,147 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", "", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", "", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
db.close();
}
@Test
public void startWithLoyaltyCardSameAsCardIDUpdateBarcodeID()
{
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0);
activityController.start();
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
// Change barcode ID
EditText barcodeField = activity.findViewById(R.id.barcodeIdField);
barcodeField.setText("123456");
// Switch away from card ID and ensure no dialog appears
TabLayout tabs = activity.findViewById(R.id.tabs);
tabs.getTabAt(2).select();
shadowOf(getMainLooper()).idle();
AlertDialog updateBarcodeIdDialog = (AlertDialog) (ShadowDialog.getLatestDialog());
assertNull(updateBarcodeIdDialog);
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.toString(), null, null);
db.close();
}
@Test
public void startWithLoyaltyCardSameAsCardIDUpdateCardID()
{
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0);
activityController.start();
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
// Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView);
cardIdField.setText("123456");
// Switch away from card ID and ensure no dialog appears
TabLayout tabs = activity.findViewById(R.id.tabs);
tabs.getTabAt(2).select();
shadowOf(getMainLooper()).idle();
AlertDialog updateBarcodeIdDialog = (AlertDialog) (ShadowDialog.getLatestDialog());
assertNull(updateBarcodeIdDialog);
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
db.close();
}
@Test
public void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDUpdate()
{
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0);
activityController.start();
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.toString(), null, null);
// Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView);
cardIdField.setText("654321");
shadowOf(getMainLooper()).idle();
// Switch away from card ID and ensure the dialog appears
TabLayout tabs = activity.findViewById(R.id.tabs);
tabs.getTabAt(2).select();
shadowOf(getMainLooper()).idle();
AlertDialog updateBarcodeIdDialog = (AlertDialog) ShadowDialog.getLatestDialog();
assertNotNull(updateBarcodeIdDialog);
updateBarcodeIdDialog.getButton(DatePickerDialog.BUTTON_POSITIVE).performClick();
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.toString(), null, null);
db.close();
}
@Test
public void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDDoNotUpdate()
{
ActivityController activityController = createActivityWithLoyaltyCard(true);
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
DBHelper db = TestHelpers.getEmptyDb(activity);
db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0);
activityController.start();
activityController.visible();
activityController.resume();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.toString(), null, null);
// Change card ID
EditText cardIdField = activity.findViewById(R.id.cardIdView);
cardIdField.setText("654321");
shadowOf(getMainLooper()).idle();
// Switch away from card ID and ensure the dialog appears
TabLayout tabs = activity.findViewById(R.id.tabs);
tabs.getTabAt(2).select();
shadowOf(getMainLooper()).idle();
AlertDialog updateBarcodeIdDialog = (AlertDialog) (ShadowDialog.getLatestDialog());
assertNotNull(updateBarcodeIdDialog);
updateBarcodeIdDialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).performClick();
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.toString(), null, null);
db.close();
}
@@ -881,13 +1116,13 @@ public class LoyaltyCardViewActivityTest
activityController.resume();
// First check if the card is as expected
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString());
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.toString(), null, null);
// Complete empty barcode selection successfully
selectBarcodeWithResult(activity, BARCODE_DATA, "", true);
// Check if the barcode type is NO_BARCODE as expected
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode));
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
assertEquals(View.GONE, activity.findViewById(R.id.barcodeLayout).getVisibility());
// Check if the special NO_BARCODE string doesn't get saved
@@ -1127,7 +1362,7 @@ public class LoyaltyCardViewActivityTest
shadowOf(getMainLooper()).idle();
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", DateFormat.getDateInstance(DateFormat.LONG).format(date), "10.00", "$", "123456", context.getString(R.string.sameAsCardId), "AZTEC");
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", DateFormat.getDateInstance(DateFormat.LONG).format(date), "10.00", "$", "123456", context.getString(R.string.sameAsCardId), "AZTEC", null, null);
assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor());
}
@@ -1148,7 +1383,7 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
final Context context = activity.getApplicationContext();
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), "AZTEC");
checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), "AZTEC", null, null);
assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor());
}
}

View File

@@ -0,0 +1,23 @@
Deja de buscar tarjetas de recompensa de plástico durante la compra en la tienda o en la web.
<b>Escanea los códigos de barras en tu dispositivo usando su cámara, olvídate de las tarjetas.</b>
😺
Olvídate de la cartera, o téngala ultraligera para los objetos de valor.
😺
Con esta herramienta esencial para llevar a diario (EDC) puedes sustituir el plástico inútil por el dinero en efectivo.
😺
- Evita el espionaje con muy pocos permisos. Sin acceso a Internet y sin anuncios.
- Añade tarjetas o códigos con nombres y colores personalizables.
- Introduce manual de códigos si no hay código de barras que almacenar, o no se puede utilizar.
- Importe tarjetas y códigos desde archivos, Catima, FidMe, Llavero de tarjetas de fidelidad, Stocard y Voucher Vault.
- Haz respaldos de todas tus tarjetas y mígralas a un nuevo dispositivo si lo necesita.
- Comparte cupones, ofertas exclusivas, códigos promocionales o tarjetas y códigos utilizando cualquier aplicación.
- Tema oscuro y opciones de accesibilidad para usuarios con problemas de visión.
- Hecho para todos por la comunidad del software libre.
- Traducciones localizadas a mano para más de 20 idiomas.
- Gratis, apoyado por las contribuciones de la comunidad.
- Utiliza, estudia, cambia y comparte como quieras; <i>con quien quieras</i>.
- No sólo Software Libre / Open Source. Es un software de gestión de tarjetas libre y <i>copyleft</i> (GPLv3+).
😺
Simplifica tu vida y tus compras, y no vuelvas a perder un recibo de papel, una tarjeta regalo de pago en tienda o un billete de avión.
Lleva contigo todas tus recompensas y bonos, y ahorra sobre la marcha.
😺

View File

@@ -0,0 +1 @@
Para códigos de barras, membresías, sistema de fidelidad, cupones y tickets.

View File

@@ -0,0 +1 @@
Catima — La Billetera Libre para Tarjetas

View File

@@ -13,5 +13,4 @@
- 自由ソフトウェアコミュニティによって全ての人のために作られています。
- 20以上の言語に対応
- 有志の貢献によって支えられている無料のアプリ
Not only Free Software / Open Source. <i>Copylefted</i> libre software (GPLv3+) card management.
- Not only Free Software / Open Source. <i>Copylefted</i> libre software (GPLv3+) card management.

View File

@@ -8,7 +8,7 @@
- Нет отслеживания, минимальное количество разрешений. Нет требуется доступ в интернет и нет рекламы.
- Добавление карт или штрих-кодов с настраиваемыми именами и цветами.
- Возможен ручной ввод данных, если штрих-код отсутствует или не распознаётся.
- Импорт карт и кодов из файлов приложений Catima, Loyalty Card Keychain, Voucher Vault и FidMe.
- Импорт карт и кодов из файлов приложений Catima, FidMe, Loyalty Card Keychain, Stocard и Voucher Vault.
- Создание резервной копии всех ваших карт и перенос их на новое устройство при необходимости.
- Возможность поделиться купонами, эксклюзивными предложениями, промо-кодами или картами и кодами, используя любое приложение.
- Тёмная тема и специальные возможности для слабовидящих пользователей.

View File

@@ -8,7 +8,7 @@
- Уникнення шпигунства за допомогою дуже малої кількості дозволів. Немає доступу до Інтернету та реклами.
- Додавання карток або кодів з іменами та настроюваними кольорами.
- Введення коду вручну, якщо немає штрих-коду для зберігання або він не може бути використаний.
- Імпортуйте картки та коди з файлів, Catima, Loyalty Card Keychain, Voucher Vault та FidMe.
- Імпортуйте картки та коди з файлів, Catima, FidMe, Loyalty Card Keychain, Stocard and Voucher Vault.
- Зробіть резервну копію всіх своїх карток і перенесіть їх на новий пристрій, якщо хочете.
- Діліться купонами, ексклюзивними пропозиціями, промо-кодами або картками та кодами за допомогою будь-якої програми.
- Темна тема та параметри доступності для користувачів із вадами зору.

View File

@@ -1,5 +1,6 @@
#Sun Jul 25 20:59:51 CEST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME