From b5d41b0ab2f09c4a3f8389e1615b468b70f87cca Mon Sep 17 00:00:00 2001
From: Sergio
Date: Fri, 27 Dec 2019 01:56:40 +0100
Subject: [PATCH 01/32] #308 Display barcode format on display loyalty card
view
---
.../card_locker/LoyaltyCardViewActivity.java | 7 ++++
.../res/layout/loyalty_card_view_layout.xml | 34 ++++++++++++++++++-
app/src/main/res/values/strings.xml | 1 +
3 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
index f91014d68..28b4057a5 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
@@ -42,6 +42,8 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
TextView cardIdFieldView;
TextView noteView;
View noteViewDivider;
+ TextView barcodeFormatView;
+ View barcodeFormatViewDivider;
TextView storeName;
ImageView barcodeImage;
View collapsingToolbarLayout;
@@ -107,6 +109,8 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
cardIdFieldView = findViewById(R.id.cardIdView);
noteView = findViewById(R.id.noteView);
noteViewDivider = findViewById(R.id.noteViewDivider);
+ barcodeFormatView = findViewById(R.id.barcodeFormatView);
+ barcodeFormatViewDivider = findViewById(R.id.barcodeFormatViewDivider);
storeName = findViewById(R.id.storeName);
barcodeImage = findViewById(R.id.barcode);
collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout);
@@ -269,10 +273,13 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
Log.d(TAG, "ImageView size known known, creating barcode");
new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
}
+ barcodeFormatView.setText(getString(R.string.barcodeTypePlaceholder, format));
}
else
{
findViewById(R.id.barcode).setVisibility(View.GONE);
+ barcodeFormatView.setVisibility(View.GONE);
+ barcodeFormatViewDivider.setVisibility(View.GONE);
}
}
diff --git a/app/src/main/res/layout/loyalty_card_view_layout.xml b/app/src/main/res/layout/loyalty_card_view_layout.xml
index e224353cf..ebb300cab 100644
--- a/app/src/main/res/layout/loyalty_card_view_layout.xml
+++ b/app/src/main/res/layout/loyalty_card_view_layout.xml
@@ -27,6 +27,13 @@
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>
+
+
+
+
+
+
+
Note
Card ID
Barcode Type
+ Barcode Type: %1$s
This card has no barcode
Cancel
From 0d67680e7f00502f1a34151d59aecb01d04d5353 Mon Sep 17 00:00:00 2001
From: Sergio
Date: Mon, 6 Jan 2020 18:06:30 +0100
Subject: [PATCH 02/32] #308 Display barcode format on select barcode view
---
.../card_locker/BarcodeImageWriterTask.java | 13 +-
.../card_locker/BarcodeSelectorActivity.java | 39 ++---
.../card_locker/LoyaltyCardEditActivity.java | 4 +-
.../card_locker/LoyaltyCardViewActivity.java | 4 +-
.../res/layout/barcode_selector_activity.xml | 143 +++++++++++++++---
5 files changed, 158 insertions(+), 45 deletions(-)
diff --git a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
index 9ef6b7115..6aae3f5ca 100644
--- a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
+++ b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
@@ -5,6 +5,7 @@ import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
+import android.widget.TextView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
@@ -28,16 +29,18 @@ class BarcodeImageWriterTask extends AsyncTask
private static final int MAX_WIDTH_2D = 500;
private final WeakReference imageViewReference;
+ private final WeakReference textViewReference;
private final String cardId;
private final BarcodeFormat format;
private final int imageHeight;
private final int imageWidth;
BarcodeImageWriterTask(ImageView imageView, String cardIdString,
- BarcodeFormat barcodeFormat)
+ BarcodeFormat barcodeFormat, TextView textView)
{
// Use a WeakReference to ensure the ImageView can be garbage collected
imageViewReference = new WeakReference<>(imageView);
+ textViewReference = new WeakReference<>(textView);
cardId = cardIdString;
format = barcodeFormat;
@@ -175,16 +178,24 @@ class BarcodeImageWriterTask extends AsyncTask
}
imageView.setImageBitmap(result);
+ TextView textView = textViewReference.get();
if(result != null)
{
Log.i(TAG, "Displaying barcode");
imageView.setVisibility(View.VISIBLE);
+
+ if (textView != null) {
+ textView.setVisibility(View.VISIBLE);
+ textView.setText(format.name());
+ }
}
else
{
Log.i(TAG, "Barcode generation failed, removing image from display");
imageView.setVisibility(View.GONE);
+ if (textView != null)
+ textView.setVisibility(View.GONE);
}
}
}
diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java
index 18becdcc6..0c00615b7 100644
--- a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java
+++ b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java
@@ -11,11 +11,13 @@ import androidx.appcompat.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
+import android.util.Pair;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.EditText;
import android.widget.ImageView;
+import android.widget.TextView;
import com.google.common.collect.ImmutableMap;
import com.google.zxing.BarcodeFormat;
@@ -58,7 +60,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity
BarcodeFormat.UPC_A.name()
));
- private Map barcodeViewMap;
+ private Map> barcodeViewMap;
private LinkedList barcodeGeneratorTasks = new LinkedList<>();
@Override
@@ -75,18 +77,18 @@ public class BarcodeSelectorActivity extends AppCompatActivity
actionBar.setDisplayHomeAsUpEnabled(true);
}
- barcodeViewMap = ImmutableMap.builder()
- .put(BarcodeFormat.AZTEC.name(), R.id.aztecBarcode)
- .put(BarcodeFormat.CODE_39.name(), R.id.code39Barcode)
- .put(BarcodeFormat.CODE_128.name(), R.id.code128Barcode)
- .put(BarcodeFormat.CODABAR.name(), R.id.codabarBarcode)
- .put(BarcodeFormat.DATA_MATRIX.name(), R.id.datamatrixBarcode)
- .put(BarcodeFormat.EAN_8.name(), R.id.ean8Barcode)
- .put(BarcodeFormat.EAN_13.name(), R.id.ean13Barcode)
- .put(BarcodeFormat.ITF.name(), R.id.itfBarcode)
- .put(BarcodeFormat.PDF_417.name(), R.id.pdf417Barcode)
- .put(BarcodeFormat.QR_CODE.name(), R.id.qrcodeBarcode)
- .put(BarcodeFormat.UPC_A.name(), R.id.upcaBarcode)
+ barcodeViewMap = ImmutableMap.>builder()
+ .put(BarcodeFormat.AZTEC.name(), new Pair<>(R.id.aztecBarcode, R.id.aztecBarcodeText))
+ .put(BarcodeFormat.CODE_39.name(), new Pair<>(R.id.code39Barcode, R.id.code39BarcodeText))
+ .put(BarcodeFormat.CODE_128.name(), new Pair<>(R.id.code128Barcode, R.id.code128BarcodeText))
+ .put(BarcodeFormat.CODABAR.name(), new Pair<>(R.id.codabarBarcode, R.id.codabarBarcodeText))
+ .put(BarcodeFormat.DATA_MATRIX.name(), new Pair<>(R.id.datamatrixBarcode, R.id.datamatrixBarcodeText))
+ .put(BarcodeFormat.EAN_8.name(), new Pair<>(R.id.ean8Barcode, R.id.ean8BarcodeText))
+ .put(BarcodeFormat.EAN_13.name(), new Pair<>(R.id.ean13Barcode, R.id.ean13BarcodeText))
+ .put(BarcodeFormat.ITF.name(), new Pair<>(R.id.itfBarcode, R.id.itfBarcodeText))
+ .put(BarcodeFormat.PDF_417.name(), new Pair<>(R.id.pdf417Barcode, R.id.pdf417BarcodeText))
+ .put(BarcodeFormat.QR_CODE.name(), new Pair<>(R.id.qrcodeBarcode, R.id.qrcodeBarcodeText))
+ .put(BarcodeFormat.UPC_A.name(), new Pair<>(R.id.upcaBarcode, R.id.upcaBarcodeText))
.build();
EditText cardId = findViewById(R.id.cardId);
@@ -113,8 +115,9 @@ public class BarcodeSelectorActivity extends AppCompatActivity
// Update barcodes
for(String key : barcodeViewMap.keySet())
{
- ImageView image = findViewById(barcodeViewMap.get(key));
- createBarcodeOption(image, key, s.toString());
+ ImageView image = findViewById(barcodeViewMap.get(key).first);
+ TextView text = findViewById(barcodeViewMap.get(key).second);
+ createBarcodeOption(image, key, s.toString(), text);
}
View noBarcodeButtonView = findViewById(R.id.noBarcode);
@@ -153,7 +156,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity
});
}
- private void createBarcodeOption(final ImageView image, final String formatType, final String cardId)
+ private void createBarcodeOption(final ImageView image, final String formatType, final String cardId, final TextView text)
{
final BarcodeFormat format = BarcodeFormat.valueOf(formatType);
if(format == null)
@@ -198,7 +201,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity
}
Log.d(TAG, "Generating barcode for type " + formatType);
- BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format);
+ BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text);
barcodeGeneratorTasks.add(task);
task.execute();
}
@@ -207,7 +210,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity
else
{
Log.d(TAG, "Generating barcode for type " + formatType);
- BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format);
+ BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text);
barcodeGeneratorTasks.add(task);
task.execute();
}
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
index 3a45918c4..b8edf392f 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
@@ -261,14 +261,14 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
Log.d(TAG, "ImageView size now known");
- new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
+ new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
}
});
}
else
{
Log.d(TAG, "ImageView size known known, creating barcode");
- new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
+ new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
}
barcodeImageLayout.setVisibility(View.VISIBLE);
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
index 28b4057a5..9ef3c191b 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
@@ -264,14 +264,14 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known");
- new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
+ new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
}
});
}
else
{
Log.d(TAG, "ImageView size known known, creating barcode");
- new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
+ new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
}
barcodeFormatView.setText(getString(R.string.barcodeTypePlaceholder, format));
}
diff --git a/app/src/main/res/layout/barcode_selector_activity.xml b/app/src/main/res/layout/barcode_selector_activity.xml
index 8edd3374f..4e164d389 100644
--- a/app/src/main/res/layout/barcode_selector_activity.xml
+++ b/app/src/main/res/layout/barcode_selector_activity.xml
@@ -70,137 +70,236 @@
android:layout_height="wrap_content"
android:text="@string/barcodeNoBarcode"
android:enabled="false" />
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
From fb9cf7a393d007c24bf9773c83c0477ba6ff836b Mon Sep 17 00:00:00 2001
From: Sergio
Date: Mon, 6 Jan 2020 21:19:52 +0100
Subject: [PATCH 03/32] #308 Display barcode format on edit loyalty card view
---
.../card_locker/LoyaltyCardEditActivity.java | 21 +++++--
.../res/layout/loyalty_card_edit_activity.xml | 59 +++++++++++++++++--
.../LoyaltyCardViewActivityTest.java | 46 ++++++++-------
3 files changed, 94 insertions(+), 32 deletions(-)
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
index b8edf392f..6fad80c20 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
@@ -104,7 +104,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
cardIdFieldView = findViewById(R.id.cardIdView);
cardIdDivider = findViewById(R.id.cardIdDivider);
cardIdTableRow = findViewById(R.id.cardIdTableRow);
- barcodeTypeField = findViewById(R.id.barcodeType);
+ barcodeTypeField = findViewById(R.id.barcodeTypeView);
barcodeImage = findViewById(R.id.barcode);
barcodeImageLayout = findViewById(R.id.barcodeLayout);
barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout);
@@ -163,7 +163,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
if(barcodeTypeField.getText().length() == 0)
{
- barcodeTypeField.setText(loyaltyCard.barcodeType);
+ barcodeTypeField.setText(loyaltyCard.barcodeType.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : loyaltyCard.barcodeType);
}
if(headingColorValue == null)
@@ -232,7 +232,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
{
if(barcodeTypeField.getText().equals(NO_BARCODE))
{
- barcodeImageLayout.setVisibility(View.GONE);
+ hideBarcode();
}
else
{
@@ -271,7 +271,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
}
- barcodeImageLayout.setVisibility(View.VISIBLE);
+ showBarcode();
}
}
@@ -507,10 +507,21 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
TextView cardIdView = findViewById(R.id.cardIdView);
cardIdView.setText(contents);
- final TextView barcodeTypeField = findViewById(R.id.barcodeType);
// Set special NO_BARCODE value to prevent onResume from overwriting it
barcodeTypeField.setText(format.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : format);
onResume();
}
}
+
+ private void showBarcode() {
+ barcodeImageLayout.setVisibility(View.VISIBLE);
+ findViewById(R.id.barcodeTypeDivider).setVisibility(View.VISIBLE);
+ findViewById(R.id.barcodeTypeTableRow).setVisibility(View.VISIBLE);
+ }
+
+ private void hideBarcode() {
+ barcodeImageLayout.setVisibility(View.GONE);
+ findViewById(R.id.barcodeTypeDivider).setVisibility(View.GONE);
+ findViewById(R.id.barcodeTypeTableRow).setVisibility(View.GONE);
+ }
}
diff --git a/app/src/main/res/layout/loyalty_card_edit_activity.xml b/app/src/main/res/layout/loyalty_card_edit_activity.xml
index 198a867b0..ab52249bb 100644
--- a/app/src/main/res/layout/loyalty_card_edit_activity.xml
+++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml
@@ -335,16 +335,65 @@
android:background="@color/inputBorder" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
Date: Mon, 6 Jan 2020 21:30:10 +0100
Subject: [PATCH 04/32] Revert "#308 Display barcode format on display loyalty
card view"
This reverts commit c194a9dd
---
.../card_locker/LoyaltyCardViewActivity.java | 7 ----
.../res/layout/loyalty_card_view_layout.xml | 34 +------------------
app/src/main/res/values/strings.xml | 1 -
3 files changed, 1 insertion(+), 41 deletions(-)
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
index 9ef3c191b..78affe0fe 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
@@ -42,8 +42,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
TextView cardIdFieldView;
TextView noteView;
View noteViewDivider;
- TextView barcodeFormatView;
- View barcodeFormatViewDivider;
TextView storeName;
ImageView barcodeImage;
View collapsingToolbarLayout;
@@ -109,8 +107,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
cardIdFieldView = findViewById(R.id.cardIdView);
noteView = findViewById(R.id.noteView);
noteViewDivider = findViewById(R.id.noteViewDivider);
- barcodeFormatView = findViewById(R.id.barcodeFormatView);
- barcodeFormatViewDivider = findViewById(R.id.barcodeFormatViewDivider);
storeName = findViewById(R.id.storeName);
barcodeImage = findViewById(R.id.barcode);
collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout);
@@ -273,13 +269,10 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
Log.d(TAG, "ImageView size known known, creating barcode");
new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
}
- barcodeFormatView.setText(getString(R.string.barcodeTypePlaceholder, format));
}
else
{
findViewById(R.id.barcode).setVisibility(View.GONE);
- barcodeFormatView.setVisibility(View.GONE);
- barcodeFormatViewDivider.setVisibility(View.GONE);
}
}
diff --git a/app/src/main/res/layout/loyalty_card_view_layout.xml b/app/src/main/res/layout/loyalty_card_view_layout.xml
index ebb300cab..e224353cf 100644
--- a/app/src/main/res/layout/loyalty_card_view_layout.xml
+++ b/app/src/main/res/layout/loyalty_card_view_layout.xml
@@ -27,13 +27,6 @@
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>
-
-
-
-
-
-
-
Note
Card ID
Barcode Type
- Barcode Type: %1$s
This card has no barcode
Cancel
From 24061dae974311f95c666eb8921d3a08debbe8e7 Mon Sep 17 00:00:00 2001
From: Sergio
Date: Mon, 6 Jan 2020 21:40:24 +0100
Subject: [PATCH 05/32] #308 Hide barcode format on add loyalty card view
---
.../main/java/protect/card_locker/LoyaltyCardEditActivity.java | 1 +
.../java/protect/card_locker/LoyaltyCardViewActivityTest.java | 1 +
2 files changed, 2 insertions(+)
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
index 6fad80c20..da3f55fc6 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
@@ -208,6 +208,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
else
{
setTitle(R.string.addCardTitle);
+ hideBarcode();
}
if(headingColorValue == null)
diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
index acef9d165..8522ce79a 100644
--- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
+++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
@@ -257,6 +257,7 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
checkAllFields(activity, ViewMode.ADD_CARD, "", "", "");
+ assertEquals(View.GONE, activity.findViewById(R.id.barcodeTypeTableRow).getVisibility());
}
@Test
From 72c1a5795304631be0ba327068a014dbd929b550 Mon Sep 17 00:00:00 2001
From: Sergio
Date: Sun, 26 Jan 2020 01:20:46 +0100
Subject: [PATCH 06/32] #308 Add new constructor for BarcodeImageWriterTask
without associated TextView. Make barcode format selectable
---
.../java/protect/card_locker/BarcodeImageWriterTask.java | 8 +++++++-
.../java/protect/card_locker/LoyaltyCardEditActivity.java | 4 ++--
.../java/protect/card_locker/LoyaltyCardViewActivity.java | 4 ++--
app/src/main/res/layout/loyalty_card_edit_activity.xml | 1 +
4 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
index 6aae3f5ca..60ac03c0d 100644
--- a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
+++ b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
@@ -61,6 +61,11 @@ class BarcodeImageWriterTask extends AsyncTask
}
}
+ BarcodeImageWriterTask(ImageView imageView, String cardIdString, BarcodeFormat barcodeFormat)
+ {
+ this(imageView, cardIdString, barcodeFormat, null);
+ }
+
private int getMaxWidth(BarcodeFormat format)
{
switch(format)
@@ -194,8 +199,9 @@ class BarcodeImageWriterTask extends AsyncTask
{
Log.i(TAG, "Barcode generation failed, removing image from display");
imageView.setVisibility(View.GONE);
- if (textView != null)
+ if (textView != null) {
textView.setVisibility(View.GONE);
+ }
}
}
}
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
index da3f55fc6..6df43a8cf 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
@@ -262,14 +262,14 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
}
Log.d(TAG, "ImageView size now known");
- new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
+ new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
}
});
}
else
{
Log.d(TAG, "ImageView size known known, creating barcode");
- new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
+ new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
}
showBarcode();
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
index 78affe0fe..f91014d68 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
@@ -260,14 +260,14 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.d(TAG, "ImageView size now known");
- new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
+ new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
}
});
}
else
{
Log.d(TAG, "ImageView size known known, creating barcode");
- new BarcodeImageWriterTask(barcodeImage, cardIdString, format, null).execute();
+ new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
}
}
else
diff --git a/app/src/main/res/layout/loyalty_card_edit_activity.xml b/app/src/main/res/layout/loyalty_card_edit_activity.xml
index ab52249bb..b98cc5ec2 100644
--- a/app/src/main/res/layout/loyalty_card_edit_activity.xml
+++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml
@@ -377,6 +377,7 @@
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
+ android:textIsSelectable="true"
android:layout_toEndOf="@id/barcodeTypeField"
android:layout_toRightOf="@id/barcodeTypeField"
/>
From e1f4ed65bb0c53d1a6c17de36daf67e870cc7245 Mon Sep 17 00:00:00 2001
From: Sergio
Date: Mon, 27 Jan 2020 00:26:05 +0100
Subject: [PATCH 07/32] #308 Add missing cast from CharSequence to String
---
.../main/java/protect/card_locker/LoyaltyCardEditActivity.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
index 6df43a8cf..b6ac2cc41 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
@@ -231,7 +231,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0)
{
- if(barcodeTypeField.getText().equals(NO_BARCODE))
+ if(barcodeTypeField.getText().toString().equals(NO_BARCODE))
{
hideBarcode();
}
From aa2ccac22bac6c3c5a1fd11ed0c951a124d1ea62 Mon Sep 17 00:00:00 2001
From: Sergio
Date: Mon, 27 Jan 2020 00:52:12 +0100
Subject: [PATCH 08/32] #308 Restore test check for barcode type
---
.../LoyaltyCardViewActivityTest.java | 36 +++++++++----------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
index 8522ce79a..a1d37319b 100644
--- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
+++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
@@ -224,7 +224,7 @@ public class LoyaltyCardViewActivityTest
}
private void checkAllFields(final Activity activity, ViewMode mode,
- final String store, final String note, final String cardId)
+ final String store, final String note, final String cardId, final String barcodeType)
{
if(mode == ViewMode.VIEW_CARD)
{
@@ -241,6 +241,7 @@ public class LoyaltyCardViewActivityTest
checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId);
checkFieldProperties(activity, R.id.cardIdDivider, cardId.isEmpty() ? View.GONE : View.VISIBLE, null);
checkFieldProperties(activity, R.id.cardIdTableRow, cardId.isEmpty() ? View.GONE : View.VISIBLE, null);
+ checkFieldProperties(activity, R.id.barcodeTypeView, View.VISIBLE, barcodeType);
checkFieldProperties(activity, R.id.captureButton, captureVisibility, null);
checkFieldProperties(activity, R.id.barcode, View.VISIBLE, null);
}
@@ -256,7 +257,7 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
- checkAllFields(activity, ViewMode.ADD_CARD, "", "", "");
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
assertEquals(View.GONE, activity.findViewById(R.id.barcodeTypeTableRow).getVisibility());
}
@@ -316,12 +317,12 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
- checkAllFields(activity, ViewMode.ADD_CARD, "", "", "");
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
// Complete barcode capture successfully
captureBarcodeWithResult(activity, R.id.captureButton, true);
- checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA);
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA, BARCODE_TYPE);
// Save and check the loyalty card
saveLoyaltyCardWithArguments(activity, "store", "note", BARCODE_DATA, BARCODE_TYPE, true);
@@ -337,12 +338,12 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
- checkAllFields(activity, ViewMode.ADD_CARD, "", "", "");
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
// Complete barcode capture in failure
captureBarcodeWithResult(activity, R.id.captureButton, false);
- checkAllFields(activity, ViewMode.ADD_CARD, "", "", "");
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
}
@Test
@@ -355,12 +356,12 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
- checkAllFields(activity, ViewMode.ADD_CARD, "", "", "");
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
// Complete barcode capture successfully
captureBarcodeWithResult(activity, R.id.captureButton, true);
- checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA);
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA, BARCODE_TYPE);
// Cancel the loyalty card creation
assertEquals(false, activity.isFinishing());
@@ -405,7 +406,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
- checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA);
+ checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
}
@Test
@@ -421,7 +422,7 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
- checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", BARCODE_DATA);
+ checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
}
@Test
@@ -437,12 +438,12 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
- checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", EAN_BARCODE_DATA);
+ checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE);
// Complete barcode capture successfully
captureBarcodeWithResult(activity, R.id.captureButton, true);
- checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA);
+ checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
}
@Test
@@ -458,12 +459,12 @@ public class LoyaltyCardViewActivityTest
activityController.visible();
activityController.resume();
- checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", EAN_BARCODE_DATA);
+ checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE);
// Complete barcode capture successfully
captureBarcodeWithResult(activity, R.id.captureButton, true);
- checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA);
+ checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
// Cancel the loyalty card creation
assertEquals(false, activity.isFinishing());
@@ -599,14 +600,13 @@ public class LoyaltyCardViewActivityTest
activityController.resume();
// First check if the card is as expected
- checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA);
- assertEquals(View.VISIBLE, activity.findViewById(R.id.barcodeTypeTableRow).getVisibility());
+ checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
// Complete empty barcode selection successfully
selectBarcodeWithResult(activity, R.id.enterButton, BARCODE_DATA, "", true);
// Check if the barcode type is NO_BARCODE as expected
- checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA);
+ checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, NO_BARCODE);
assertEquals(View.GONE, activity.findViewById(R.id.barcodeTypeTableRow).getVisibility());
// Check if the special NO_BARCODE string doesn't get saved
@@ -769,7 +769,7 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
- checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", "123456");
+ checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", "123456", "AZTEC");
assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.headingColorSample).getBackground()).getColor());
assertEquals(-1, ((ColorDrawable) activity.findViewById(R.id.headingStoreTextColorSample).getBackground()).getColor());
}
From 454052638f504221064d41284317d9bd0f8d8753 Mon Sep 17 00:00:00 2001
From: Sylvia van Os
Date: Tue, 28 Jan 2020 17:32:57 +0100
Subject: [PATCH 09/32] Fix barcode centering
---
.../java/protect/card_locker/LoyaltyCardViewActivity.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
index f91014d68..f52de980e 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
@@ -405,6 +405,9 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
// Move barcode to top
barcodeImage.setScaleType(ImageView.ScaleType.FIT_START);
+ // Prevent centering
+ barcodeImage.setAdjustViewBounds(false);
+
// Set current state
barcodeIsFullscreen = true;
}
@@ -429,6 +432,9 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
// Turn barcode back to normal
barcodeImage.setLayoutParams(barcodeImageState);
+ // Fix barcode centering
+ barcodeImage.setAdjustViewBounds(true);
+
// Set current state
barcodeIsFullscreen = false;
}
From c94c3cb47e13b0300afb89649be85f630a154a94 Mon Sep 17 00:00:00 2001
From: Sylvia van Os
Date: Tue, 28 Jan 2020 21:00:07 +0100
Subject: [PATCH 10/32] Choose export location
---
.../card_locker/ImportExportActivity.java | 112 ++++++++++--------
.../protect/card_locker/ImportExportTask.java | 21 ++--
.../res/layout/import_export_activity.xml | 31 -----
app/src/main/res/values/strings.xml | 5 +-
.../card_locker/ImportExportActivityTest.java | 16 ---
.../protect/card_locker/ImportExportTest.java | 6 +-
6 files changed, 74 insertions(+), 117 deletions(-)
diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java
index bbd4eba9a..c2f7c959d 100644
--- a/app/src/main/java/protect/card_locker/ImportExportActivity.java
+++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java
@@ -10,15 +10,14 @@ import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.Environment;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
-import androidx.core.content.FileProvider;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
+
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
@@ -28,7 +27,9 @@ import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.InputStream;
+import java.io.OutputStream;
import java.util.List;
public class ImportExportActivity extends AppCompatActivity
@@ -36,13 +37,11 @@ public class ImportExportActivity extends AppCompatActivity
private static final String TAG = "LoyaltyCardLocker";
private static final int PERMISSIONS_EXTERNAL_STORAGE = 1;
- private static final int CHOOSE_EXPORT_FILE = 2;
+ private static final int CHOOSE_EXPORT_LOCATION = 2;
+ private static final int CHOOSE_EXPORTED_FILE = 3;
private ImportExportTask importExporter;
- private final File sdcardDir = Environment.getExternalStorageDirectory();
- private final File exportFile = new File(sdcardDir, "LoyaltyCardKeychain.csv");
-
@Override
protected void onCreate(Bundle savedInstanceState)
{
@@ -70,6 +69,11 @@ public class ImportExportActivity extends AppCompatActivity
PERMISSIONS_EXTERNAL_STORAGE);
}
+ // Check that there is a file manager available
+ final Intent intentCreateDocumentAction = new Intent(Intent.ACTION_CREATE_DOCUMENT);
+ intentCreateDocumentAction.addCategory(Intent.CATEGORY_OPENABLE);
+ intentCreateDocumentAction.setType("text/csv");
+ intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "LoyaltyCardKeychain.csv");
Button exportButton = findViewById(R.id.exportButton);
exportButton.setOnClickListener(new View.OnClickListener()
@@ -77,7 +81,7 @@ public class ImportExportActivity extends AppCompatActivity
@Override
public void onClick(View v)
{
- startExport();
+ chooseFileWithIntent(intentCreateDocumentAction, CHOOSE_EXPORT_LOCATION);
}
});
@@ -86,14 +90,13 @@ public class ImportExportActivity extends AppCompatActivity
intentGetContentAction.addCategory(Intent.CATEGORY_OPENABLE);
intentGetContentAction.setType("*/*");
-
Button importFilesystem = findViewById(R.id.importOptionFilesystemButton);
importFilesystem.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
- chooseFileWithIntent(intentGetContentAction);
+ chooseFileWithIntent(intentGetContentAction, CHOOSE_EXPORTED_FILE);
}
});
@@ -114,7 +117,7 @@ public class ImportExportActivity extends AppCompatActivity
@Override
public void onClick(View v)
{
- chooseFileWithIntent(intentPickAction);
+ chooseFileWithIntent(intentPickAction, CHOOSE_EXPORTED_FILE);
}
});
@@ -125,28 +128,6 @@ public class ImportExportActivity extends AppCompatActivity
findViewById(R.id.importOptionApplicationExplanation).setVisibility(View.GONE);
importApplication.setVisibility(View.GONE);
}
-
- // This option, to import from the fixed location, should always be present
-
- Button importButton = findViewById(R.id.importOptionFixedButton);
- importButton.setOnClickListener(new View.OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- Uri uri = Uri.fromFile(exportFile);
- try
- {
- FileInputStream stream = new FileInputStream(exportFile);
- startImport(stream, uri);
- }
- catch(FileNotFoundException e)
- {
- Log.e(TAG, "Could not import file " + exportFile.getAbsolutePath(), e);
- onImportComplete(false, uri);
- }
- }
- });
}
private void startImport(final InputStream target, final Uri targetUri)
@@ -165,19 +146,19 @@ public class ImportExportActivity extends AppCompatActivity
importExporter.execute();
}
- private void startExport()
+ private void startExport(final OutputStream target, final Uri targetUri)
{
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener()
{
@Override
public void onTaskComplete(boolean success)
{
- onExportComplete(success, exportFile);
+ onExportComplete(success, targetUri);
}
};
importExporter = new ImportExportTask(ImportExportActivity.this,
- DataFormat.CSV, exportFile, listener);
+ DataFormat.CSV, target, listener);
importExporter.execute();
}
@@ -265,7 +246,7 @@ public class ImportExportActivity extends AppCompatActivity
builder.create().show();
}
- private void onExportComplete(boolean success, final File path)
+ private void onExportComplete(boolean success, final Uri path)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
@@ -281,7 +262,11 @@ public class ImportExportActivity extends AppCompatActivity
int messageId = success ? R.string.exportedTo : R.string.exportFailed;
final String template = getResources().getString(messageId);
- final String message = String.format(template, path.getAbsolutePath());
+
+ // Get the filename of the file being imported
+ String filename = path.toString();
+
+ final String message = String.format(template, filename);
builder.setMessage(message);
builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener()
{
@@ -301,9 +286,8 @@ public class ImportExportActivity extends AppCompatActivity
@Override
public void onClick(DialogInterface dialog, int which)
{
- Uri outputUri = FileProvider.getUriForFile(ImportExportActivity.this, BuildConfig.APPLICATION_ID, path);
Intent sendIntent = new Intent(Intent.ACTION_SEND);
- sendIntent.putExtra(Intent.EXTRA_STREAM, outputUri);
+ sendIntent.putExtra(Intent.EXTRA_STREAM, path);
sendIntent.setType("text/csv");
// set flag to give temporary permission to external app to use the FileProvider
@@ -345,11 +329,11 @@ public class ImportExportActivity extends AppCompatActivity
return false;
}
- private void chooseFileWithIntent(Intent intent)
+ private void chooseFileWithIntent(Intent intent, int requestCode)
{
try
{
- startActivityForResult(intent, CHOOSE_EXPORT_FILE);
+ startActivityForResult(intent, requestCode);
}
catch (ActivityNotFoundException e)
{
@@ -362,7 +346,7 @@ public class ImportExportActivity extends AppCompatActivity
{
super.onActivityResult(requestCode, resultCode, data);
- if (resultCode != RESULT_OK || requestCode != CHOOSE_EXPORT_FILE)
+ if (resultCode != RESULT_OK || (requestCode != CHOOSE_EXPORT_LOCATION && requestCode != CHOOSE_EXPORTED_FILE))
{
Log.w(TAG, "Failed onActivityResult(), result=" + resultCode);
return;
@@ -377,24 +361,48 @@ public class ImportExportActivity extends AppCompatActivity
try
{
- InputStream reader;
-
- if(uri.getScheme() != null)
+ if (requestCode == CHOOSE_EXPORT_LOCATION)
{
- reader = getContentResolver().openInputStream(uri);
+ OutputStream writer;
+ if (uri.getScheme() != null)
+ {
+ writer = getContentResolver().openOutputStream(uri);
+ }
+ else
+ {
+ writer = new FileOutputStream(new File(uri.toString()));
+ }
+
+ Log.e(TAG, "Starting file export with: " + uri.toString());
+ startExport(writer, uri);
}
else
{
- reader = new FileInputStream(new File(uri.toString()));
- }
+ InputStream reader;
+ if(uri.getScheme() != null)
+ {
+ reader = getContentResolver().openInputStream(uri);
+ }
+ else
+ {
+ reader = new FileInputStream(new File(uri.toString()));
+ }
- Log.e(TAG, "Starting file import with: " + uri.toString());
- startImport(reader, uri);
+ Log.e(TAG, "Starting file export with: " + uri.toString());
+ startImport(reader, uri);
+ }
}
catch(FileNotFoundException e)
{
- Log.e(TAG, "Failed to import file: " + uri.toString(), e);
- onImportComplete(false, uri);
+ Log.e(TAG, "Failed to import/export file: " + uri.toString(), e);
+ if (requestCode == CHOOSE_EXPORT_LOCATION)
+ {
+ onExportComplete(false, uri);
+ }
+ else
+ {
+ onImportComplete(false, uri);
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java
index 839e7c36d..ab54c9ef3 100644
--- a/app/src/main/java/protect/card_locker/ImportExportTask.java
+++ b/app/src/main/java/protect/card_locker/ImportExportTask.java
@@ -4,16 +4,12 @@ import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
-import android.os.Environment;
import android.util.Log;
-import android.widget.Toast;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
@@ -24,7 +20,7 @@ class ImportExportTask extends AsyncTask
private Activity activity;
private boolean doImport;
private DataFormat format;
- private File target;
+ private OutputStream outputStream;
private InputStream inputStream;
private TaskCompleteListener listener;
@@ -33,14 +29,14 @@ class ImportExportTask extends AsyncTask
/**
* Constructor which will setup a task for exporting to the given file
*/
- ImportExportTask(Activity activity, DataFormat format, File target,
+ ImportExportTask(Activity activity, DataFormat format, OutputStream output,
TaskCompleteListener listener)
{
super();
this.activity = activity;
this.doImport = false;
this.format = format;
- this.target = target;
+ this.outputStream = output;
this.listener = listener;
}
@@ -78,14 +74,13 @@ class ImportExportTask extends AsyncTask
return result;
}
- private boolean performExport(File exportFile, DBHelper db)
+ private boolean performExport(OutputStream stream, DBHelper db)
{
boolean result = false;
try
{
- FileOutputStream fileWriter = new FileOutputStream(exportFile);
- OutputStreamWriter writer = new OutputStreamWriter(fileWriter, Charset.forName("UTF-8"));
+ OutputStreamWriter writer = new OutputStreamWriter(stream, Charset.forName("UTF-8"));
result = MultiFormatExporter.exportData(db, writer, format);
writer.close();
}
@@ -94,7 +89,7 @@ class ImportExportTask extends AsyncTask
Log.e(TAG, "Unable to export file", e);
}
- Log.i(TAG, "Export of '" + exportFile.getAbsolutePath() + "' result: " + result);
+ Log.i(TAG, "Export result: " + result);
return result;
}
@@ -127,7 +122,7 @@ class ImportExportTask extends AsyncTask
}
else
{
- result = performExport(target, db);
+ result = performExport(outputStream, db);
}
return result;
diff --git a/app/src/main/res/layout/import_export_activity.xml b/app/src/main/res/layout/import_export_activity.xml
index 464b3657e..5d4d7fdf5 100644
--- a/app/src/main/res/layout/import_export_activity.xml
+++ b/app/src/main/res/layout/import_export_activity.xml
@@ -99,7 +99,6 @@
android:layout_marginTop="8dp"
android:text="@string/importOptionFilesystemButton" />
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7453d86e9..284f0d0dd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -65,16 +65,13 @@
Importing…
Exporting…
Unable to import or export cards without the external storage permission
- Data is written to the top directory in external storage.
+ Data will be written to a location of your choice.
Import from filesystem
Choose a specific file from the filesystem.
From filesystem
Use external application
Use an external application like Dropbox, Google Drive, or your favorite file manager to open a file.
Use external application
- Import from export location
- Import from the same location on the filesystem that is written to on export.
- Use export location
About
Copyright 2016-%d Branden Archer
diff --git a/app/src/test/java/protect/card_locker/ImportExportActivityTest.java b/app/src/test/java/protect/card_locker/ImportExportActivityTest.java
index 3da64ff7d..c6ceb034b 100644
--- a/app/src/test/java/protect/card_locker/ImportExportActivityTest.java
+++ b/app/src/test/java/protect/card_locker/ImportExportActivityTest.java
@@ -84,12 +84,6 @@ public class ImportExportActivityTest
checkVisibility(activity, View.GONE, R.id.dividerImportApplication,
R.id.importOptionApplicationTitle, R.id.importOptionApplicationExplanation,
R.id.importOptionApplicationButton);
-
- // Import from file system should always be present
-
- checkVisibility(activity, View.VISIBLE, R.id.dividerImportFixed,
- R.id.importOptionFixedTitle, R.id.importOptionFixedExplanation,
- R.id.importOptionFixedButton);
}
}
@@ -115,12 +109,6 @@ public class ImportExportActivityTest
checkVisibility(activity, View.GONE, R.id.dividerImportFilesystem,
R.id.importOptionFilesystemTitle, R.id.importOptionFilesystemExplanation,
R.id.importOptionFilesystemButton);
-
- // Import from file system should always be present
-
- checkVisibility(activity, View.VISIBLE, R.id.dividerImportFixed,
- R.id.importOptionFixedTitle, R.id.importOptionFixedExplanation,
- R.id.importOptionFixedButton);
}
}
@@ -139,9 +127,5 @@ public class ImportExportActivityTest
checkVisibility(activity, View.VISIBLE, R.id.dividerImportFilesystem,
R.id.importOptionFilesystemTitle, R.id.importOptionFilesystemExplanation,
R.id.importOptionFilesystemButton);
-
- checkVisibility(activity, View.VISIBLE, R.id.dividerImportFixed,
- R.id.importOptionFixedTitle, R.id.importOptionFixedExplanation,
- R.id.importOptionFixedButton);
}
}
diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java
index ef97751f0..071eddd3e 100644
--- a/app/src/test/java/protect/card_locker/ImportExportTest.java
+++ b/app/src/test/java/protect/card_locker/ImportExportTest.java
@@ -3,6 +3,7 @@ package protect.card_locker;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
import android.os.Environment;
import com.google.zxing.BarcodeFormat;
@@ -20,9 +21,11 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
+import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Calendar;
@@ -245,7 +248,8 @@ public class ImportExportTest
TestTaskCompleteListener listener = new TestTaskCompleteListener();
// Export to the file
- ImportExportTask task = new ImportExportTask(activity, format, exportFile, listener);
+ FileOutputStream fileOutputStream = new FileOutputStream(exportFile);
+ ImportExportTask task = new ImportExportTask(activity, format, fileOutputStream, listener);
task.execute();
// Actually run the task to completion
From 68778288537751f9b31bdf69481ea6ab8bd24856 Mon Sep 17 00:00:00 2001
From: Sylvia van Os
Date: Tue, 28 Jan 2020 21:10:21 +0100
Subject: [PATCH 11/32] Make linter happy
---
app/src/main/res/values-cs/strings.xml | 8 --------
app/src/main/res/values-de/strings.xml | 9 ---------
app/src/main/res/values-el-rGR/strings.xml | 9 ---------
app/src/main/res/values-es/strings.xml | 9 ---------
app/src/main/res/values-fr/strings.xml | 9 ---------
app/src/main/res/values-he-rIL/strings.xml | 1 -
app/src/main/res/values-it/strings.xml | 9 ---------
app/src/main/res/values-lt/strings.xml | 5 -----
app/src/main/res/values-nb-rNO/strings.xml | 11 -----------
app/src/main/res/values-nl/strings.xml | 9 ---------
app/src/main/res/values-pl/strings.xml | 9 ---------
app/src/main/res/values-ru/strings.xml | 9 ---------
app/src/main/res/values-sk/strings.xml | 9 ---------
app/src/main/res/values-sl/strings.xml | 9 ---------
app/src/main/res/values/strings.xml | 8 --------
15 files changed, 123 deletions(-)
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 9fca056bb..fd4c7fb67 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -8,7 +8,6 @@
Obchod
Poznámka
ID karty
- Typ čárového kódu
Zrušit
Uložit
Naskenovat kartu
@@ -23,20 +22,16 @@
Odeslat…
Editovat věrnostní kartu
Přidat věrnostní kartu
- Zobrazit věrnostní kartu
Oskenujte kód karty
Obrázek kódu karty
Nebyl zadán Obchod
Nebylo zadáno ID karty
- %1$s: %2$s
Import/Export
- Import
Export
Zálohování dat vám umožní přesunout vaše uložené karty na jiné zařízení.
Importováno z: %1$s
Exportováno do: %1$s
- Doubor chybí: %1$s
Import proběhl úspěšně
Import selhal
Import selhal: %1$s
@@ -53,9 +48,6 @@
Použít externí aplikaci
K otevření souboru použije externí aplikaci jako Dropbox, Google Drive, nebo vámi preferovaný prohlížeč souborů.
Použít externí aplikaci
- Import z umístění exportu
- Import ze stejné složky souborového systému do níž se zapisuje při exportu.
- Použít složku exportu
O aplikaci
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 9849360a0..09f44a363 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -11,7 +11,6 @@
Geschäft
Notiz
Kartennummer
- Barcodeart
Abbrechen
Speichern
Karte scannen
@@ -27,11 +26,9 @@
Ok
Kopiere die Nummer in die Zwischenablage
Senden…
- Zum Home Screen hinzugefügt
Kundenkarte bearbeiten
Neue Kundenkarte
- Kundenkarte anzeigen
Barcode scannen
Shortcut zu einer Karte
Es ist noch keine Karte vorhanden, bitte zuerst eine hinzufügen
@@ -41,14 +38,11 @@
Kein Geschäft angegeben
Keine Kartennummer angegeben
Karte konnte nicht gefunden werden
- %1$s: %2$s
Import/Export
- Import
Exportieren
Gesicherte Daten ermöglichen das Verschieben der Kundenkarten auf ein anderes Gerät.
Importiert von: %1$s
Exportiert nach: %1$s
- Datei fehlt: %1$s
Import erfolgreich
Import fehlgeschlagen
Import fehlgeschlagen: %1$s
@@ -65,9 +59,6 @@
Externe App verwenden
Wählen Sie eine Datei aus einer App wie Dropbox, Google Drive, oder Ihrem bevorzugten Dateisystem aus.
Nutze eine externe App
- Importiere aus Export-Pfad
- Nutze den Export-Pfad, um Karten zu importieren (dies stellt zuvor gesicherte Daten wieder her).
- Export-Pfad verwenden
Über
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml
index 267d4ba70..0ed23bbc2 100644
--- a/app/src/main/res/values-el-rGR/strings.xml
+++ b/app/src/main/res/values-el-rGR/strings.xml
@@ -8,7 +8,6 @@
Κατάστημα
Σημείωση
Κωδικός Κάρτας
- Τύπος Barcode
Άκυρο
Αποθήκευση
Φωτογράφιση Κάρτας
@@ -24,11 +23,9 @@
OK
Αντιγραφή κωδικού στο πρόχειρο
Αποστολή…
- Προστέθηκε στην Αρχική Οθόνη
Επεξεργασία Κάρτας
Προσθήκη Κάρτας
- Εμφάνιση Κάρτας
Σαρώστε τον κωδικό της κάρτας
Συντόμευση Κάρτας
Δεν υπάρχουν κάρτες. προσθέστε μία πρώτα
@@ -38,14 +35,11 @@
Δεν δώσατε κατάστημα
Δεν δώσατε κωδικό κάρτας
Δεν ήταν δυνατό να εντοπιστεί κάρτα
- %1$s: %2$s
Εισαγωγή/Εξαγωγή
- Εισαγωγή
Εξαγωγή
Τα εφεδρικά δεδομένα σας δίνουν την δυνατότητα να μεταφέρετε τις κάρτες σας σε μία άλλη συσκευή.
Εισαγωγή από: %1$s
Εξαγωγή σε: %1$s
- Το αρχείο λείπει: %1$s
Εισαγωγή επιτυχής
Εισαγωγή ανεπιτυχής
Δεν εισήχθει: %1$s
@@ -62,9 +56,6 @@
Χρήση εξωτερικής εφαρμογής
Κάντε χρήση μίας εξωτερικής εφαρμογής όπως είναι τα Dropbox, Google Drive ή ο αγαπημένος σας διαχειριστής αρχείων για να ανοίξετε ένα αρχείο.
Χρήση εξωτερικής εφαρμογής
- Εισαγωγή από τοποθεσία εξαγωγής
- Εισαγωγή από την ίδια τοποθεσία στο σύστημα αρχείων, στην οποία γίνεται αποθήκευση κατά την εξαγωγή.
- Χρήση τοποθεσίας εξαγωγής
Σχετικά
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 5c42bcb1c..437b17232 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -8,7 +8,6 @@
Tienda
Nota
ID de la Tarjeta
- Tipo de Código de Barras
Cancelar
Guardar
Escanear Tarjeta
@@ -24,11 +23,9 @@
OK
Copiar ID al portapapeles
Enviar…
- Añadido a la Pantalla de Inicio
Editar Tarjeta de Fidelización
Añadir Tarjeta de Fidelización
- Ver Tarjeta de Fidelización
Escanear el Código de Barras de la Tarjeta
Atajo de Tarjeta
No hay ninguna tarjeta, añade una primero
@@ -38,14 +35,11 @@
Establecimiento no especificado
ID de la Tarjeta no especificado
No se ha podido encontrar la tarjeta de fidelización
- %1$s: %2$s
Importar/Exportar
- Importar
Exportar
La copia de seguridad te permite transferir tus tarjetas a otro dispositivo.
Importar desde: %1$s
Exportar a: %1$s
- Archivo perdido: %1$s
Datos importados correctamente
Ha ocurrido un error al importar los datos
Error al importar: %1$s
@@ -62,9 +56,6 @@
Usar una applicación externa
Use una aplicación externa como Dropbox, Google Drive o tu gestor de archivos favoritos para abrir un archivo.
Usar aplicación externa
- Importar desde el lugar donde los datos son exportados
- Importar desde el mismo lugar en el sistema de archivos donde los datos son exportados.
- Utilizar el lugar donde los datos son exportados
Acerca de
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 2f459495b..749f00a6b 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -8,7 +8,6 @@
Nom
Note
Numéro
- Type de code-barres
Annuler
Enregistrer
Mode capture
@@ -24,11 +23,9 @@
OK
Copier le numéro dans le presse-papier
Envoyer…
- Ajouter à l\'écran d\'accueil
Modifier la carte de fidélité
Ajouter une carte de fidélité
- Voir la carte de fidélité
Flasher le code-barres de la carte
Raccourci de carte
Il n\'y a aucune carte. Ajoutez en une d\'abord.
@@ -38,14 +35,11 @@
Aucun nom n\'a été saisi
Aucun numéro n\'a été saisi
N\'a pas pu retrouver la carte de fidélité
- %1$s: %2$s
Importer/Exporter
- Importer
Exporter
Exporter vos données vous permet de récupérer vos cartes sur un autre appareil.
Importé depuis : %1$s
Exporté vers : %1$s
- Fichier manquant : %1$s
Importé avec succès
Échec de l\'import
Échec de l\'import : %1$s
@@ -62,9 +56,6 @@
Application externe
Utilisez une application externe comme Dropbox, Google Drive, ou votre gestionnaire de fichiers favori pour ouvrir un fichier.
Application externe
- Importer depuis le même emplacement que pour l\'export
- Importe les données depuis le même emplacement que celui défini pour l\'export.
- Utiliser l\'emplacement de l\'export
À propos
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-he-rIL/strings.xml b/app/src/main/res/values-he-rIL/strings.xml
index d4ab5bac9..afe0b38a0 100644
--- a/app/src/main/res/values-he-rIL/strings.xml
+++ b/app/src/main/res/values-he-rIL/strings.xml
@@ -4,7 +4,6 @@
הוספה
מזהה כרטיס
- סוג ברקוד
ביטול
שמור
צלם כרטיס
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index d25bc273e..a1426bb72 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -11,7 +11,6 @@
Negozio
Note
Codice
- Tipo codice a barre
Questa carta non ha un codice a barre
Annulla
@@ -30,11 +29,9 @@
Copia ID negli appunti
Condividi
Invia…
- Aggiunto al launcher
Modifica carta
Aggiungi carta
- Mostra carta
Scansiona codice carta
Scorciatoia per la carta
Non ci sono carte. Aggiungine prima una
@@ -46,14 +43,11 @@
Impossibile trovare la carta
Impossibile analizzare l\'URI
- %1$s: %2$s
Importa/Esporta
- Importa
Esporta
Fare il backup dei dati ti permette di spostare le tue carte da un dispositivo ad un altro.
Importato da: %1$s
Esportato in: %1$s
- File mancante: %1$s
Importazione avvenuta con successo
Importazione fallita
Impossibile importare: %1$s
@@ -70,9 +64,6 @@
Usa un\'applicazione esterna
Usa un\'applicazione esterna come Dropbox, Google Drive o il tuo file manager preferito per aprire il file.
Usa un\'applicazione esterna
- Importa da un altro posto
- Importa dallo stesso posto del file system dove si è esportato.
- Usa luogo dell\'esportazione
Informazioni
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 3b5d639b2..1c0ed6b25 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -8,7 +8,6 @@
Parduotuvė
Užrašas
Kortelės ID
- Brūkšninio kodo tipas
Atšaukti
Išsaugoti
Nufotografuoti kortelę
@@ -22,19 +21,15 @@
Nukopijuoti ID į iškarpinę
Redaguoti lojalumo kortelę
Pridėti lojalumo kortelę
- Paeržiūrėti lojalumo kortelę
Nuskanuokite kortelės brūkšninį kodą
Kortelės brūkšninio kodo paveikslėlis
Parduotuvė neįvesta
Neįvestas kortelės ID
- %1$s: %2$s
Importuoti/Exportuoti
- Importuoti
Exportuoti
Importuota iš: %1$s
Eksportuota į: %1$s
- Failas nerastas: %1$s
Nepavyko importuoti: %1$s
Nepavyko eksportuoti: %1$s
Importuoja…
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index 0e2bf7147..be9ef0098 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -9,7 +9,6 @@
Butikk
Merknad
Kort-ID
- Strekkodetype
Avbryt
Lagre
@@ -26,11 +25,9 @@
OK
Kopier ID til utklippstavle
Send…
- Lagt til på hjemmeskjerm
Rediger kundekort
Legg til kundekort
- Vis kundekort
Skann kortets strekkode
Kort-snarvei
Legg til et kort først
@@ -41,16 +38,11 @@
Ingen kort-ID innskrevet
Kunne ikke finne kundekort
- %1$s: %2$s
- %1$s - %2$s
-
Import/eksport
- Importer
Eksporter
Sikkerhetskopiering av data lar deg flytte kortene til en annen enhet.
Importert fra: %1$s
Exportert til: %1$s
- Fil mangler: %1$s
Importert
Kunne ikke importere
Klarte ikke å importere: %1$s
@@ -67,9 +59,6 @@
Brukt eksternt program
Bruk eksternt program som Nextcloud, eller din favorittfilbehandler til å åpne ei fil.
Bruk eksternt program
- Importer fra eksporteringsområde
- Importer fra området i filsystemet eksporter skrives til.
- Bruk eksporteringsplassering
About
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index b4c3d4930..9326e53bb 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -11,7 +11,6 @@
Winkel
Aantekening
Kaartnummer
- Soort barcode
Deze kaart heeft geen barcode
Annuleren
@@ -30,11 +29,9 @@
Kaartnummer kopiëren naar klembord
Delen
Versturen…
- Toegevoegd aan startscherm
Klantenkaart bewerken
Klantenkaart toevoegen
- Klantenkaart tonen
Scan de barcode van de kaart
Kaartsnelkoppeling
Je hebt nog geen kaarten toegevoegd.
@@ -46,14 +43,11 @@
De klantenkaart kan niet worden opgevraagd
Kan de import-uri niet verwerken
- %1$s: %2$s
Importeren/Exporteren
- Importeren
Exporteren
Door de gegevens te back-uppen kun je je kaarten overzetten naar een ander apparaat.
Geïmporteerd uit: %1$s
Geëxporteerd naar: %1$s
- Bestand ontbreekt: %1$s
Importeren voltooid
Importeren mislukt
Het importeren is mislukt: %1$s
@@ -70,9 +64,6 @@
Externe app gebruiken
Open een bestand middels een externe app, zoals Dropbox, Google Drive of je favoriete bestandsbeheerder.
Externe app gebruiken
- Importeren uit exportlocatie
- Importeer uit dezelfde locatie op het bestandssysteem waar tijdens het exporteren naar weggeschreven is.
- Exportlocatie gebruiken
Over
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index d13acbb91..7c7b4ad0e 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -11,7 +11,6 @@
Sklep
Notatka
Identyfikator karty
- Typ kodu kreskowego
Ta karta nie ma kodu kreskowego
Anuluj
@@ -30,11 +29,9 @@
Skopiuj identyfikator do schowka
Udostępnij
Wyślij…
- Dodano do ekranu głównego
Edytuj kartę lojalnościową
Dodaj kartę lojalnościową
- Pokaż kartę lojalnościową
Zeskanuj kod kreskowy karty lojalnościowej
Skrót karty
Nie ma kart, należy dodać pierwszą
@@ -46,14 +43,11 @@
Nie można wyszukać karty lojalnościowej
Nie można przeanalizować identyfikatora importu URI
- %1$s: %2$s
Importuj/Eksportuj
- Importuj
Eksportuj
Zarchiwizowane dane umożliwiają przeniesienie kart na inne urządzenie.
Zaimportowano z: %1$s
Wyeksportowano do: %1$s
- Brak pliku: %1$s
Zaimportowano pomyślnie
Import nie powiódł się
Nie udało się zaimportować: %1$s
@@ -70,9 +64,6 @@
Użyj zewnętrznej aplikacji
Użyj zewnętrznej aplikacji jak Dropbox, Google Drive, bądź ulubiony menedżer plików, aby otworzyć plik.
Użyj zewnętrznej aplikacji
- Importuj z lokalizacji eksportowania
- Importuj z tej samej lokalizacji w systemie plików, do którego zapisano przy eksporcie.
- Użyj lokalizacji eksportu
O aplikacji
© 2016 — %d Branden Archer.
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 2de672891..f01ecefcf 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -11,7 +11,6 @@
Магазин
Примечание
Номер карты
- Тип штрих-кода
Эта карта без штрихкода
Отменить
@@ -30,11 +29,9 @@
Скопировать номер карты в буфер обмена
Переслать
Отправить…
- Карта добавлена на главный экран.
Редактировать карту
Добавить карту
- Посмотреть карту
Отсканируйте штрих-код
Ярлык карты
Карт нет, добавьте одну для начала
@@ -46,14 +43,11 @@
Карта не найдена
Не удалось разобрать импортируемый URI
- %1$s: %2$s
Импорт/Экспорт
- Импорт
Экспорт
Сохранение карт позволяет перенести их на другое устройство.
Импортировано из: %1$s
Экспортировано в: %1$s
- Файл не найден: %1$s
Успешный импорт
Импорт не удался
Не удалось импортировать: %1$s
@@ -70,9 +64,6 @@
Использование другого приложения
Использовать другое приложение такое как Dropbox, Google Drive, или ваш любимый файловый менеджер чтобы открыть файл.
Использовать другое приложение
- Импорт из файла экспорта
- Импорт из того же файла, куда сохраняется экспорт.
- Использовать файл экспорта
О программе
Все права защищены 2016-%d Branden Archer
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 73cd286f3..708b08289 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -8,7 +8,6 @@
Obchod
Poznámka
ID karty
- Typ čiarového kódu
Zrušiť
Uložiť
Zosnímať kartu
@@ -24,11 +23,9 @@
Áno
Kopírovať ID do schránky
Odoslať…
- Pridané na domovskú obrazovku
Upraviť kartu
Pridať kartu
- Zobraziť kartu
Zosnímajte čiarový kód na karte
Skratka
Nie sú uložené žiadne karty, vložte prvú
@@ -38,14 +35,11 @@
Nebol zadaný obchod
Nebolo zadané ID karty
Nie je možné vyhľadať vernostnú kartu
- %1$s: %2$s
Import/Export
- Import
Export
Zálohovanie dát Vám umožní presunúť Vaše uložené karty na iné zariadenie.
Importované z: %1$s
Exportované do: %1$s
- Chýbajúci súbor: %1$s
Import bol úspešný
Import zlyhal
Zlyhal import: %1$s
@@ -62,9 +56,6 @@
Použite externú aplikáciu
Na otvorenie súboru použite externú aplikáciu, ako Dropbox, Disk Google, alebo Vášho obľúbeného správcu súborov.
Použiť externú aplikáciu
- Importujte z exportovacieho umiestnenia.
- Importujte z rovnakého umiestnenia v súborovom systéme, na ktorý je zapisovaný export.
- Použite exportovacie umiestnenie
O aplikácii
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index efeb06d23..7050bbb0b 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -8,7 +8,6 @@
Shrani
Zabeležka
Št. kartice
- Vrsta črne kode
Prekliči
Shrani
Slikaj kartico
@@ -24,11 +23,9 @@
Vredu
Kopirajte številko kartice
Pošlji#8230;
- Dodajte na domači zaslon
Uredi kartico zvestobe
Dodaj kartico zvestobe
- Prikaži kartico zvestobe
Skeniraj črtno kodo
Bližnjica do kartice
Trenutno ni na voljo nobene kartice. Najprej jih je potrebno dodati.
@@ -38,14 +35,11 @@
Ime trgovine ni bilo vnešeno
Številka kartice ni bila vnešena
Te kartice zvestobe ni bilo moč najti
- %1$s:%2$s
Uvozi/izvozi
- Uvozi
Izvozi
Varnostna kopija omogoča varen prenos kartic na druge telefonske naprave.
Uvoženo iz: %1$s
Izvoženo v:%1$s
- Manjkajoča datoteka: %1$s
Uvoz je bil uspešen
Uvoz ni uspel
Napaka pri uvozu: %1$s
@@ -62,9 +56,6 @@
Uporabi zunanjo aplikacijo
Uporabi zunanjo aplikacijo, kot npr. Dropbox, Google Drive ali ostale upravljalnike datotek, za odpiranje datoteko.
Uporabi zunanjo aplikacijo
- Uvozi iz zunanje aplikacije
- Uvozi iz iste lokacije, ki je namenjena izvozu
- Uporabi lokacijo izvoza
Več o aplikaciji
Copyright 2016-%d Branden Archer
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 284f0d0dd..0d1ee43b1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -11,7 +11,6 @@
Store
Note
Card ID
- Barcode Type
This card has no barcode
Cancel
@@ -30,11 +29,9 @@
Copy ID to clipboard
Share
Send…
- Added to Home Screen
Edit Loyalty Card
Add Loyalty Card
- View Loyalty Card
Scan Card\'s Barcode
Card Shortcut
There are no cards, add one first
@@ -46,16 +43,11 @@
Could not lookup loyalty card
Could not parse the import URI
- %1$s: %2$s
- %1$s - %2$s
-
Import/Export
- Import
Export
Backed up data can allow you to move your cards to another device.
Imported from: %1$s
Exported to: %1$s
- File missing: %1$s
Import successful
Import failed
Failed to import: %1$s
From 288531dff0b6af0575e9dc776ccfce6f9456554d Mon Sep 17 00:00:00 2001
From: Branden Archer
Date: Mon, 24 Feb 2020 23:07:56 -0800
Subject: [PATCH 12/32] Mention hiatus in README
---
docs/README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/README.md b/docs/README.md
index 3a0a96837..289e6050a 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -20,9 +20,6 @@ Stores all of your store loyalty cards on your phone, removing the need to carry
- QR_CODE
- UPC_A
-If there is any interest in improving this project, kindly submit a pull request with
-proposed changes.
-
# Screenshots
[ ](https://github.com/brarcher/loyalty-card-locker/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-01.png)
@@ -56,3 +53,6 @@ If you are interested in translating this application to another language, find
This application uses the following image:
- [Save](https://thenounproject.com/term/save/716011) by [Bernar Novalyi](https://thenounproject.com/bernar.novalyi)
+
+# Note from Developer
+The developer is currently on hiatus from the project. Questions and pull requests may not be looked at for some time. Apologies in advance.
From 694e9b88d79c079fbec5baeb8996e45b22ff382c Mon Sep 17 00:00:00 2001
From: Sylvia van Os
Date: Sun, 8 Mar 2020 20:52:38 +0100
Subject: [PATCH 13/32] Fix translation inconsistency breaking Travis build
---
app/src/main/res/values-nb-rNO/strings.xml | 3 ---
app/src/main/res/values/strings.xml | 5 +++--
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index 0bbbfc4bc..be0d95a69 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -54,9 +54,6 @@
Brukt eksternt program
Bruk eksternt program som Nextcloud, eller din favorittfilbehandler til å åpne ei fil.
Bruk eksternt program
- Importer fra eksporteringsområde
- Importer fra området i filsystemet eksporter skrives til.
- Bruk eksporteringsplassering
Om
Kopirett 2016-%d Branden Archer
Lisensiert GPLv3+.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0d1ee43b1..6c0bb4568 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -11,6 +11,7 @@
Store
Note
Card ID
+ Barcode type
This card has no barcode
Cancel
@@ -29,7 +30,7 @@
Copy ID to clipboard
Share
Send…
-
+ Added shortcut
Edit Loyalty Card
Add Loyalty Card
Scan Card\'s Barcode
@@ -42,7 +43,7 @@
No Card ID entered
Could not lookup loyalty card
Could not parse the import URI
-
+ %1$s: %2$s
Import/Export
Export
Backed up data can allow you to move your cards to another device.
From aad074e29eb5f9c294082e30b2c1ca5f3de73ad9 Mon Sep 17 00:00:00 2001
From: Branden Archer
Date: Sun, 8 Mar 2020 22:10:54 -0700
Subject: [PATCH 14/32] Create android.yml
This creates a GitHub Action for building and
testing the project, as an attempt to replace
Travis-CI.
---
.github/workflows/android.yml | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 .github/workflows/android.yml
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
new file mode 100644
index 000000000..ab9d4a2a1
--- /dev/null
+++ b/.github/workflows/android.yml
@@ -0,0 +1,27 @@
+name: Android CI
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: set up JDK 1.8
+ uses: actions/setup-java@v1
+ with:
+ java-version: 1.8
+ - name: Build
+ run: ./gradlew assembleRelease
+ - name: Check lint
+ run: ./gradlew lintRelease
+ - name: Run unit tests
+ run: ./gradlew testReleaseUnitTest
+ - name: FindBugs
+ run: ./gradlew findbugs
From e579168a0316963baf6cd84d585c2aad415ad955 Mon Sep 17 00:00:00 2001
From: Branden Archer
Date: Sun, 8 Mar 2020 22:17:19 -0700
Subject: [PATCH 15/32] Delete .travis.yml
---
.travis.yml | 16 ----------------
1 file changed, 16 deletions(-)
delete mode 100644 .travis.yml
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index ebb79ee47..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: android
-sudo: true
-
-install:
-- echo y | android update sdk -u -a -t tools
-- echo y | android update sdk -u -a -t platform-tools
-- echo y | android update sdk -u -a -t build-tools-26.0.2
-- yes | sdkmanager "platforms;android-27"
-- echo y | android update sdk -u -a -t extra-google-m2repository
-- echo y | android update sdk -u -a -t extra-android-m2repository
-
-script: ./gradlew assembleRelease testReleaseUnitTest lintRelease findbugs
-
-after_failure:
-- cat app/build/reports/findbugs/findbugs.html
-- cat app/build/reports/tests/debug/index.html
From 1fccfff338d35b244679287e191fd61b573e48c6 Mon Sep 17 00:00:00 2001
From: Branden Archer
Date: Mon, 9 Mar 2020 22:16:54 -0700
Subject: [PATCH 16/32] Update translations from Transifex
---
app/src/main/res/values-cs/strings.xml | 2 +-
app/src/main/res/values-de/strings.xml | 3 +--
app/src/main/res/values-el-rGR/strings.xml | 3 +--
app/src/main/res/values-es/strings.xml | 3 +--
app/src/main/res/values-fr/strings.xml | 3 +--
app/src/main/res/values-it/strings.xml | 4 +---
app/src/main/res/values-lt/strings.xml | 1 +
app/src/main/res/values-nl/strings.xml | 7 ++++---
app/src/main/res/values-pl/strings.xml | 8 +++-----
app/src/main/res/values-ru/strings.xml | 7 ++++---
app/src/main/res/values-sk/strings.xml | 3 +--
app/src/main/res/values-sl/strings.xml | 3 +--
12 files changed, 20 insertions(+), 27 deletions(-)
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index fd4c7fb67..4b6cd65dd 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -27,6 +27,7 @@
Nebyl zadán Obchod
Nebylo zadáno ID karty
+ %1$s: %2$s
Import/Export
Export
Zálohování dat vám umožní přesunout vaše uložené karty na jiné zařízení.
@@ -41,7 +42,6 @@
Importuji…
Exportuji…
Nelze importovat nebo exportovat karty bez přístupu k externímu uložišti
- Data jsou zapsána do kořenové složky externího uložiště.
Import ze souborového systému
Vyberte konkrétní soubor v uložišti.
Ze souborového systému
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 09f44a363..655770ff1 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -26,7 +26,6 @@
Ok
Kopiere die Nummer in die Zwischenablage
Senden…
-
Kundenkarte bearbeiten
Neue Kundenkarte
Barcode scannen
@@ -38,6 +37,7 @@
Kein Geschäft angegeben
Keine Kartennummer angegeben
Karte konnte nicht gefunden werden
+ %1$s: %2$s
Import/Export
Exportieren
Gesicherte Daten ermöglichen das Verschieben der Kundenkarten auf ein anderes Gerät.
@@ -52,7 +52,6 @@
Importiere…
Exportiere…
Ohne die Berechtigung für den externen Speicher kann kein Import oder Export erfolgen.
- Die Datei wird ins Rootverzeichnis des externen Speichers geschrieben.
Importiere aus Dateisystem
Wähle eine Datei aus dem Speicher aus.
Aus Dateisystem
diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml
index 0ed23bbc2..f3600ef76 100644
--- a/app/src/main/res/values-el-rGR/strings.xml
+++ b/app/src/main/res/values-el-rGR/strings.xml
@@ -23,7 +23,6 @@
OK
Αντιγραφή κωδικού στο πρόχειρο
Αποστολή…
-
Επεξεργασία Κάρτας
Προσθήκη Κάρτας
Σαρώστε τον κωδικό της κάρτας
@@ -35,6 +34,7 @@
Δεν δώσατε κατάστημα
Δεν δώσατε κωδικό κάρτας
Δεν ήταν δυνατό να εντοπιστεί κάρτα
+ %1$s: %2$s
Εισαγωγή/Εξαγωγή
Εξαγωγή
Τα εφεδρικά δεδομένα σας δίνουν την δυνατότητα να μεταφέρετε τις κάρτες σας σε μία άλλη συσκευή.
@@ -49,7 +49,6 @@
Γίνεται εισαγωγή του…
Γίνεται εξαγωγή του…
Δεν είναι δυνατή η εισαγωγή ή εξαγωγή καρτών χωρίς την άδεια πρόσβασης στον εξωτερικό χώρο αποθήκευσης
- Τα δεδομένα αποθηκεύονται στον αρχικό φάκελο του εξωτερικού χώρου αποθήκευσης.
Εισαγωγή από το σύστημα αρχείων
Επιλέξτε ένα συγκεκριμένο αρχείο από το σύστημα αρχείων.
Από το σύστημα αρχείων
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 437b17232..3452cf266 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -23,7 +23,6 @@
OK
Copiar ID al portapapeles
Enviar…
-
Editar Tarjeta de Fidelización
Añadir Tarjeta de Fidelización
Escanear el Código de Barras de la Tarjeta
@@ -35,6 +34,7 @@
Establecimiento no especificado
ID de la Tarjeta no especificado
No se ha podido encontrar la tarjeta de fidelización
+ %1$s: %2$s
Importar/Exportar
Exportar
La copia de seguridad te permite transferir tus tarjetas a otro dispositivo.
@@ -49,7 +49,6 @@
Importando…
Exportando…
No se pueden importar o exportar tarjetas sin el permiso de almacenamiento
- Los datos son guardados en la carpeta base del almacenamiento externo.
Importar desde el sistema de archivos
Seleccionar un archivo del sistema de archivos
Desde el sistema de archivos
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 749f00a6b..d6e1e4cd9 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -23,7 +23,6 @@
OK
Copier le numéro dans le presse-papier
Envoyer…
-
Modifier la carte de fidélité
Ajouter une carte de fidélité
Flasher le code-barres de la carte
@@ -35,6 +34,7 @@
Aucun nom n\'a été saisi
Aucun numéro n\'a été saisi
N\'a pas pu retrouver la carte de fidélité
+ %1$s: %2$s
Importer/Exporter
Exporter
Exporter vos données vous permet de récupérer vos cartes sur un autre appareil.
@@ -49,7 +49,6 @@
Import …
Export …
Impossible d\'importer ou d\'exporter les données sans l\'autorisation d\'accès au stockage externe
- Les données sont sauvegardées à la racine du stockage externe.
Importer depuis le système de fichiers.
Choisissez le fichier à importer.
Système de fichiers
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index a1426bb72..5a17aa0f1 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -29,7 +29,6 @@
Copia ID negli appunti
Condividi
Invia…
-
Modifica carta
Aggiungi carta
Scansiona codice carta
@@ -42,7 +41,7 @@
Nessun codice carta inserito
Impossibile trovare la carta
Impossibile analizzare l\'URI
-
+ %1$s: %2$s
Importa/Esporta
Esporta
Fare il backup dei dati ti permette di spostare le tue carte da un dispositivo ad un altro.
@@ -57,7 +56,6 @@
Importazione in corso…
Esportazione in corso…
Impossibile importare o esportare i dati senza il permesso per l\'uso della memoria esterna.
- I dati sono stati scritti nella cartella principale della memoria esterna.
Importa dal file system
Scegli un file dal file system.
Dal file system
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 1c0ed6b25..d292d9bc6 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -26,6 +26,7 @@
Parduotuvė neįvesta
Neįvestas kortelės ID
+ %1$s: %2$s
Importuoti/Exportuoti
Exportuoti
Importuota iš: %1$s
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 9326e53bb..e0b09285d 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -11,6 +11,7 @@
Winkel
Aantekening
Kaartnummer
+ Soort barcode
Deze kaart heeft geen barcode
Annuleren
@@ -29,7 +30,7 @@
Kaartnummer kopiëren naar klembord
Delen
Versturen…
-
+ Snelkoppeling is toegevoegd
Klantenkaart bewerken
Klantenkaart toevoegen
Scan de barcode van de kaart
@@ -42,7 +43,7 @@
Geen kaartnummer ingevoerd
De klantenkaart kan niet worden opgevraagd
Kan de import-uri niet verwerken
-
+ %1$s: %2$s
Importeren/Exporteren
Exporteren
Door de gegevens te back-uppen kun je je kaarten overzetten naar een ander apparaat.
@@ -57,7 +58,7 @@
Bezig met importeren…...
Bezig met exporteren…...
Het importeren of exporteren van kaarten is niet mogelijk zonder de machtiging \'externe opslag\'.
- De gegevens worden weggeschreven naar de hoogste map op de externe opslag.
+ De gegevens worden weggeschreven op een locatie naar keuze.
Importeren uit bestandssysteem
Kies een specifiek bestand uit het bestandssysteem.
Uit bestandssysteem
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 7c7b4ad0e..de66653d4 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -29,7 +29,6 @@
Skopiuj identyfikator do schowka
Udostępnij
Wyślij…
-
Edytuj kartę lojalnościową
Dodaj kartę lojalnościową
Zeskanuj kod kreskowy karty lojalnościowej
@@ -42,7 +41,7 @@
Nie wprowadzono identyfikatora karty
Nie można wyszukać karty lojalnościowej
Nie można przeanalizować identyfikatora importu URI
-
+ %1$s: %2$s
Importuj/Eksportuj
Eksportuj
Zarchiwizowane dane umożliwiają przeniesienie kart na inne urządzenie.
@@ -57,7 +56,6 @@
Importowanie…
Eksportowanie…
Nie można importować ani eksportować kart bez uprawnień do pamięci zewnętrznej
- Dane zapisywane są w głównym katalogu pamięci zewnętrznej.
Importuj z systemu plików
Wybierz określony plik z systemu plików.
Z systemu plików
@@ -83,7 +81,7 @@
Pokaż ekran powitalny
Witaj w Loyalty Card Keychain\n
- Zarządzaj kartami sklepowymi/lojalnościowymi opartymi na kodzie kreskowym na swoim telefonie!\n\n
+ Zarządzaj swoimi kartami lojalnościowymi z poziomu telefonu!\n\n
Dodawanie kart\n
Dodaj nową kartę, dotykając znaku plus z listy kart. \n\n
Dodawanie kart\n
@@ -91,7 +89,7 @@
Pokaż kartę\n
Aby wyświetlić kartę, na głównym ekranie kliknij nazwę sklepu \n\n
Kopia zapasowa\n
- Karty można zarchiwizować. Aby wyeksportować lub zaimportować dane karty, dotknij opcji Importuj/eksportuj w menu na stronie głównej. \n\n
+ Karty mogą zostać zarchiwizowane. Aby wyeksportować lub zaimportować dane kart, skorzystaj z opcji Importuj/Eksportuj w menu na stronie głównej.\n\n
Informacje zwrotne\n
Ta aplikacja jest darmowa, bez reklam i z otwartym kodem źródłowym. Zobacz szczegóły, klikając Informacje w menu na stronie głównej. \n\n Proszę zostawić opinię o programie w sklepie z aplikacjami! (:
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index f01ecefcf..4b1e76d93 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -11,6 +11,7 @@
Магазин
Примечание
Номер карты
+ Тип штрихкода
Эта карта без штрихкода
Отменить
@@ -29,7 +30,7 @@
Скопировать номер карты в буфер обмена
Переслать
Отправить…
-
+ Добавленный ярлык
Редактировать карту
Добавить карту
Отсканируйте штрих-код
@@ -42,7 +43,7 @@
Номер карты не указан
Карта не найдена
Не удалось разобрать импортируемый URI
-
+ %1$s: %2$s
Импорт/Экспорт
Экспорт
Сохранение карт позволяет перенести их на другое устройство.
@@ -57,7 +58,7 @@
Импорт…
Экспорт…
Импорт или экспорт невозможен без разрешения на доступ к хранилищу
- Данные сохраняются в корневой каталог хранилища.
+ Данные будут записаны в выбранное место.
Импорт из файловой системы
Выберете файл на файловой системе.
Выбрать файл
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 708b08289..97a91a767 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -23,7 +23,6 @@
Áno
Kopírovať ID do schránky
Odoslať…
-
Upraviť kartu
Pridať kartu
Zosnímajte čiarový kód na karte
@@ -35,6 +34,7 @@
Nebol zadaný obchod
Nebolo zadané ID karty
Nie je možné vyhľadať vernostnú kartu
+ %1$s: %2$s
Import/Export
Export
Zálohovanie dát Vám umožní presunúť Vaše uložené karty na iné zariadenie.
@@ -49,7 +49,6 @@
Importujem…
Exportujem…
Nie je možné importovať a exportovať karty bez prístupu k externému úložisku
- Dáta sú zapísané do koreňového adresára na externom úložisku.
Import zo súborového systému.
Vyberte súbor zo súborového systému.
Zo súborového systému
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 7050bbb0b..55b33a286 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -23,7 +23,6 @@
Vredu
Kopirajte številko kartice
Pošlji#8230;
-
Uredi kartico zvestobe
Dodaj kartico zvestobe
Skeniraj črtno kodo
@@ -35,6 +34,7 @@
Ime trgovine ni bilo vnešeno
Številka kartice ni bila vnešena
Te kartice zvestobe ni bilo moč najti
+ %1$s:%2$s
Uvozi/izvozi
Izvozi
Varnostna kopija omogoča varen prenos kartic na druge telefonske naprave.
@@ -49,7 +49,6 @@
Uvažanje…
Izvažanje…
Izvažanje in uvažanje je nemogoče brez omogočenega dostopa do zunanje shrambe
- Podati so bili zapisani v prvo mapo v zunanji shrambi
Uvozi iz datotečnega sistema
Izberite specifično datoteko iz datotečnega sistema
Iz datotečnega sistema
From 290abd9c56ede026ec01a1a2963e8070119e16dd Mon Sep 17 00:00:00 2001
From: Branden Archer
Date: Mon, 9 Mar 2020 22:22:07 -0700
Subject: [PATCH 17/32] Update for v0.28
---
app/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 1037c32dd..89ec24f80 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -13,8 +13,8 @@ android {
applicationId "protect.card_locker"
minSdkVersion 16
targetSdkVersion 29
- versionCode 38
- versionName "0.27"
+ versionCode 39
+ versionName "0.28"
}
buildTypes {
release {
From 9f1d5ad1b3094c4efb690691dded78dd7e94d74d Mon Sep 17 00:00:00 2001
From: Branden Archer
Date: Mon, 9 Mar 2020 22:26:19 -0700
Subject: [PATCH 18/32] Update CHANGELOG for v0.28
---
CHANGELOG.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b6e361651..adffa64ee 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## v0.28 (2020-03-09)
+
+Changes:
+- Fix barcode centering when exiting full screen ([#351](https://github.com/brarcher/loyalty-card-locker/pull/351))
+- Allow backup export location to be selected ([#352](https://github.com/brarcher/loyalty-card-locker/pull/352))
+- Update translations ([#357](https://github.com/brarcher/loyalty-card-locker/pull/357)) & ([#362](https://github.com/brarcher/loyalty-card-locker/pull/362))
+
## v0.27 (2020-01-26)
Changes:
From d8776da8b6ef61b8b336332e400bafe8c6ce1e87 Mon Sep 17 00:00:00 2001
From: Sylvia van Os
Date: Tue, 16 Jun 2020 21:45:27 +0200
Subject: [PATCH 19/32] Improve export/import dialog messages
---
.../card_locker/ImportExportActivity.java | 17 ++++-------------
app/src/main/res/values-cs/strings.xml | 6 ++----
app/src/main/res/values-de/strings.xml | 6 ++----
app/src/main/res/values-el-rGR/strings.xml | 6 ++----
app/src/main/res/values-es/strings.xml | 6 ++----
app/src/main/res/values-fr/strings.xml | 6 ++----
app/src/main/res/values-it/strings.xml | 6 ++----
app/src/main/res/values-lt/strings.xml | 6 ++----
app/src/main/res/values-nb-rNO/strings.xml | 6 ++----
app/src/main/res/values-nl/strings.xml | 6 ++----
app/src/main/res/values-pl/strings.xml | 6 ++----
app/src/main/res/values-ru/strings.xml | 6 ++----
app/src/main/res/values-sk/strings.xml | 6 ++----
app/src/main/res/values-sl/strings.xml | 6 ++----
app/src/main/res/values/strings.xml | 8 ++++----
15 files changed, 34 insertions(+), 69 deletions(-)
diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java
index c2f7c959d..e2f96f31d 100644
--- a/app/src/main/java/protect/card_locker/ImportExportActivity.java
+++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java
@@ -226,13 +226,9 @@ public class ImportExportActivity extends AppCompatActivity
builder.setTitle(R.string.importFailedTitle);
}
- int messageId = success ? R.string.importedFrom : R.string.importFailed;
- final String template = getResources().getString(messageId);
+ int messageId = success ? R.string.importSuccessful : R.string.importFailed;
+ final String message = getResources().getString(messageId);
- // Get the filename of the file being imported
- String filename = path.toString();
-
- final String message = String.format(template, filename);
builder.setMessage(message);
builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener()
{
@@ -259,14 +255,9 @@ public class ImportExportActivity extends AppCompatActivity
builder.setTitle(R.string.exportFailedTitle);
}
- int messageId = success ? R.string.exportedTo : R.string.exportFailed;
+ int messageId = success ? R.string.exportSuccessful : R.string.exportFailed;
+ final String message = getResources().getString(messageId);
- final String template = getResources().getString(messageId);
-
- // Get the filename of the file being imported
- String filename = path.toString();
-
- final String message = String.format(template, filename);
builder.setMessage(message);
builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener()
{
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 4b6cd65dd..1b9055017 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -31,14 +31,12 @@
Import/Export
Export
Zálohování dat vám umožní přesunout vaše uložené karty na jiné zařízení.
- Importováno z: %1$s
- Exportováno do: %1$s
Import proběhl úspěšně
Import selhal
- Import selhal: %1$s
+ Import selhal
Export proběhl úspěšně
Export selhal
- Export selhal: %1$s
+ Export selhal
Importuji…
Exportuji…
Nelze importovat nebo exportovat karty bez přístupu k externímu uložišti
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 655770ff1..f6445e6e7 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -41,14 +41,12 @@
Import/Export
Exportieren
Gesicherte Daten ermöglichen das Verschieben der Kundenkarten auf ein anderes Gerät.
- Importiert von: %1$s
- Exportiert nach: %1$s
Import erfolgreich
Import fehlgeschlagen
- Import fehlgeschlagen: %1$s
+ Import fehlgeschlagen
Export erfolgreich
Export fehlgeschlagen
- Export fehlgeschlagen: %1$s
+ Export fehlgeschlagen
Importiere…
Exportiere…
Ohne die Berechtigung für den externen Speicher kann kein Import oder Export erfolgen.
diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml
index f3600ef76..e35d883e4 100644
--- a/app/src/main/res/values-el-rGR/strings.xml
+++ b/app/src/main/res/values-el-rGR/strings.xml
@@ -38,14 +38,12 @@
Εισαγωγή/Εξαγωγή
Εξαγωγή
Τα εφεδρικά δεδομένα σας δίνουν την δυνατότητα να μεταφέρετε τις κάρτες σας σε μία άλλη συσκευή.
- Εισαγωγή από: %1$s
- Εξαγωγή σε: %1$s
Εισαγωγή επιτυχής
Εισαγωγή ανεπιτυχής
- Δεν εισήχθει: %1$s
+ Δεν εισήχθει
Εξαγωγή επιτυχής
Εξαγωγή ανεπιτυχής
- Δεν εξήχθη: %1$s
+ Δεν εξήχθη
Γίνεται εισαγωγή του…
Γίνεται εξαγωγή του…
Δεν είναι δυνατή η εισαγωγή ή εξαγωγή καρτών χωρίς την άδεια πρόσβασης στον εξωτερικό χώρο αποθήκευσης
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 3452cf266..a512e8a19 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -38,14 +38,12 @@
Importar/Exportar
Exportar
La copia de seguridad te permite transferir tus tarjetas a otro dispositivo.
- Importar desde: %1$s
- Exportar a: %1$s
Datos importados correctamente
Ha ocurrido un error al importar los datos
- Error al importar: %1$s
+ Error al importar
Datos exportados correctamente
Ha ocurrido un error al exportar los datos
- Error al exportar: %1$s
+ Error al exportar
Importando…
Exportando…
No se pueden importar o exportar tarjetas sin el permiso de almacenamiento
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index d6e1e4cd9..8f5194840 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -38,14 +38,12 @@
Importer/Exporter
Exporter
Exporter vos données vous permet de récupérer vos cartes sur un autre appareil.
- Importé depuis : %1$s
- Exporté vers : %1$s
Importé avec succès
Échec de l\'import
- Échec de l\'import : %1$s
+ Échec de l\'import
Exporté avec succès
Échec de l\'export
- Échec de l\'export : %1$s
+ Échec de l\'export
Import …
Export …
Impossible d\'importer ou d\'exporter les données sans l\'autorisation d\'accès au stockage externe
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 5a17aa0f1..5f89dbe0b 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -45,14 +45,12 @@
Importa/Esporta
Esporta
Fare il backup dei dati ti permette di spostare le tue carte da un dispositivo ad un altro.
- Importato da: %1$s
- Esportato in: %1$s
Importazione avvenuta con successo
Importazione fallita
- Impossibile importare: %1$s
+ Impossibile importare
Esportazione avvenuta con successo
Esportazione fallita
- Impossibile esportare: %1$s
+ Impossibile esportare
Importazione in corso…
Esportazione in corso…
Impossibile importare o esportare i dati senza il permesso per l\'uso della memoria esterna.
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index d292d9bc6..f7fab0fc2 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -29,10 +29,8 @@
%1$s: %2$s
Importuoti/Exportuoti
Exportuoti
- Importuota iš: %1$s
- Eksportuota į: %1$s
- Nepavyko importuoti: %1$s
- Nepavyko eksportuoti: %1$s
+ Nepavyko importuoti
+ Nepavyko eksportuoti
Importuoja…
Eksportuoja…
Negalima importuoti/eksportuoti kortelių be išorinės atminties leidimo
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index be0d95a69..7fe31e5d9 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -36,14 +36,12 @@
Import/eksport
Eksporter
Sikkerhetskopiering av data lar deg flytte kortene til en annen enhet.
- Importert fra: %1$s
- Exportert til: %1$s
Importert
Kunne ikke importere
- Klarte ikke å importere: %1$s
+ Klarte ikke å importere
Eksportert
Kunne ikke eksportere
- Klarte ikke å eksportere: %1$s
+ Klarte ikke å eksportere
Importerer…
Exporterer…
Kan ikke importere eller eksportere kort uten tilgang til ekstern lagring
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index e0b09285d..ba0c1e436 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -47,14 +47,12 @@
Importeren/Exporteren
Exporteren
Door de gegevens te back-uppen kun je je kaarten overzetten naar een ander apparaat.
- Geïmporteerd uit: %1$s
- Geëxporteerd naar: %1$s
Importeren voltooid
Importeren mislukt
- Het importeren is mislukt: %1$s
+ Het importeren is mislukt
Exporteren voltooid
Exporteren mislukt
- Het exporteren is mislukt: %1$s
+ Het exporteren is mislukt
Bezig met importeren…...
Bezig met exporteren…...
Het importeren of exporteren van kaarten is niet mogelijk zonder de machtiging \'externe opslag\'.
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index de66653d4..371633ce2 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -45,14 +45,12 @@
Importuj/Eksportuj
Eksportuj
Zarchiwizowane dane umożliwiają przeniesienie kart na inne urządzenie.
- Zaimportowano z: %1$s
- Wyeksportowano do: %1$s
Zaimportowano pomyślnie
Import nie powiódł się
- Nie udało się zaimportować: %1$s
+ Nie udało się zaimportować
Wyeksportowano pomyślnie
Eksport nie powiódł się
- Nie udało się wyeksportować: %1$s
+ Nie udało się wyeksportować
Importowanie…
Eksportowanie…
Nie można importować ani eksportować kart bez uprawnień do pamięci zewnętrznej
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 4b1e76d93..748fe2b63 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -47,14 +47,12 @@
Импорт/Экспорт
Экспорт
Сохранение карт позволяет перенести их на другое устройство.
- Импортировано из: %1$s
- Экспортировано в: %1$s
Успешный импорт
Импорт не удался
- Не удалось импортировать: %1$s
+ Не удалось импортировать
Успешный экспорт
Экспорт не удался
- Не удалось экспортировать: %1$s
+ Не удалось экспортировать
Импорт…
Экспорт…
Импорт или экспорт невозможен без разрешения на доступ к хранилищу
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 97a91a767..76b43f11d 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -38,14 +38,12 @@
Import/Export
Export
Zálohovanie dát Vám umožní presunúť Vaše uložené karty na iné zariadenie.
- Importované z: %1$s
- Exportované do: %1$s
Import bol úspešný
Import zlyhal
- Zlyhal import: %1$s
+ Zlyhal import
Export bol úspešný
Export zlyhal
- Zlyhal export: %1$s
+ Zlyhal export
Importujem…
Exportujem…
Nie je možné importovať a exportovať karty bez prístupu k externému úložisku
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 55b33a286..d322cfdb7 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -38,14 +38,12 @@
Uvozi/izvozi
Izvozi
Varnostna kopija omogoča varen prenos kartic na druge telefonske naprave.
- Uvoženo iz: %1$s
- Izvoženo v:%1$s
Uvoz je bil uspešen
Uvoz ni uspel
- Napaka pri uvozu: %1$s
+ Napaka pri uvozu
Izvoz je uspel
Izvoz ni uspel
- Napaka pri izvozu: %1$s
+ Napaka pri izvozu
Uvažanje…
Izvažanje…
Izvažanje in uvažanje je nemogoče brez omogočenega dostopa do zunanje shrambe
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6c0bb4568..b01f26dc2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -47,14 +47,12 @@
Import/Export
Export
Backed up data can allow you to move your cards to another device.
- Imported from: %1$s
- Exported to: %1$s
Import successful
Import failed
- Failed to import: %1$s
+ Failed to import
Export successful
Export failed
- Failed to export: %1$s
+ Failed to export
Importing…
Exporting…
Unable to import or export cards without the external storage permission
@@ -131,4 +129,6 @@
I want to share a loyalty card with you
brarcher.github.io
/loyalty-card-locker/share
+ Successfully imported loyalty card data
+ Successfully exported loyalty card data
From c471c35b82d2c09a4675f0697031d59eec400662 Mon Sep 17 00:00:00 2001
From: Sylvia van Os
Date: Wed, 21 Oct 2020 20:50:23 +0200
Subject: [PATCH 20/32] Set theme jekyll-theme-cayman
---
docs/_config.yml | 1 +
1 file changed, 1 insertion(+)
create mode 100644 docs/_config.yml
diff --git a/docs/_config.yml b/docs/_config.yml
new file mode 100644
index 000000000..c4192631f
--- /dev/null
+++ b/docs/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-cayman
\ No newline at end of file
From 9d4529b06b159c54fe6d7f7cc24e0ceb6d20d9be Mon Sep 17 00:00:00 2001
From: Sylvia van Os
Date: Thu, 22 Oct 2020 18:15:07 +0200
Subject: [PATCH 21/32] Initial rebrand
---
app/build.gradle | 2 +-
.../card_locker/BarcodeImageWriterTask.java | 2 +-
.../card_locker/BarcodeSelectorActivity.java | 2 +-
.../card_locker/CardShortcutConfigure.java | 2 +-
.../java/protect/card_locker/DBHelper.java | 2 +-
.../card_locker/ImportExportActivity.java | 4 +--
.../protect/card_locker/ImportExportTask.java | 2 +-
.../card_locker/LoyaltyCardEditActivity.java | 2 +-
.../card_locker/LoyaltyCardViewActivity.java | 2 +-
.../protect/card_locker/MainActivity.java | 4 ++-
.../card_locker/MultiFormatExporter.java | 2 +-
.../card_locker/MultiFormatImporter.java | 2 +-
app/src/main/res/values-cs/strings.xml | 1 -
app/src/main/res/values-de/strings.xml | 1 -
app/src/main/res/values-el-rGR/strings.xml | 1 -
app/src/main/res/values-es/strings.xml | 1 -
app/src/main/res/values-fr/strings.xml | 1 -
app/src/main/res/values-it/strings.xml | 1 -
app/src/main/res/values-lt/strings.xml | 1 -
app/src/main/res/values-nb-rNO/strings.xml | 1 -
app/src/main/res/values-night/colors.xml | 6 ++---
app/src/main/res/values-nl/strings.xml | 1 -
app/src/main/res/values-pl/strings.xml | 1 -
app/src/main/res/values-ru/strings.xml | 1 -
app/src/main/res/values-sk/strings.xml | 1 -
app/src/main/res/values-sl/strings.xml | 1 -
app/src/main/res/values/colors.xml | 6 ++---
app/src/main/res/values/constants.xml | 4 +--
app/src/main/res/values/strings.xml | 25 +++++++++---------
docs/README.md | 26 +++++++++----------
privacy-policy.md => docs/privacy-policy.md | 8 +++---
docs/share.md | 12 ++++-----
32 files changed, 59 insertions(+), 69 deletions(-)
rename privacy-policy.md => docs/privacy-policy.md (92%)
diff --git a/app/build.gradle b/app/build.gradle
index 89ec24f80..d769ce2a9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,7 +10,7 @@ android {
compileSdkVersion 29
defaultConfig {
- applicationId "protect.card_locker"
+ applicationId "me.hackerchick.catima"
minSdkVersion 16
targetSdkVersion 29
versionCode 39
diff --git a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
index 60ac03c0d..58231c9a7 100644
--- a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
+++ b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java
@@ -21,7 +21,7 @@ import java.lang.ref.WeakReference;
*/
class BarcodeImageWriterTask extends AsyncTask
{
- private static final String TAG = "LoyaltyCardLocker";
+ private static final String TAG = "Catima";
// When drawn in a smaller window 1D barcodes for some reason end up
// squished, whereas 2D barcodes look fine.
diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java
index 0c00615b7..9e1c29830 100644
--- a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java
+++ b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java
@@ -36,7 +36,7 @@ import java.util.Map;
*/
public class BarcodeSelectorActivity extends AppCompatActivity
{
- private static final String TAG = "LoyaltyCardLocker";
+ private static final String TAG = "Catima";
// Result this activity will return
public static final String BARCODE_CONTENTS = "contents";
diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java
index 2917d703d..212f435a7 100644
--- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java
+++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java
@@ -17,7 +17,7 @@ import android.widget.Toast;
*/
public class CardShortcutConfigure extends AppCompatActivity
{
- static final String TAG = "LoyaltyCardLocker";
+ static final String TAG = "Catima";
@Override
public void onCreate(Bundle bundle)
diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java
index 6952accae..3eb49cbda 100644
--- a/app/src/main/java/protect/card_locker/DBHelper.java
+++ b/app/src/main/java/protect/card_locker/DBHelper.java
@@ -9,7 +9,7 @@ import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper
{
- public static final String DATABASE_NAME = "LoyaltyCards.db";
+ public static final String DATABASE_NAME = "Catima.db";
public static final int ORIGINAL_DATABASE_VERSION = 1;
public static final int DATABASE_VERSION = 3;
diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java
index e2f96f31d..73ea4d19e 100644
--- a/app/src/main/java/protect/card_locker/ImportExportActivity.java
+++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java
@@ -34,7 +34,7 @@ import java.util.List;
public class ImportExportActivity extends AppCompatActivity
{
- private static final String TAG = "LoyaltyCardLocker";
+ private static final String TAG = "Catima";
private static final int PERMISSIONS_EXTERNAL_STORAGE = 1;
private static final int CHOOSE_EXPORT_LOCATION = 2;
@@ -73,7 +73,7 @@ public class ImportExportActivity extends AppCompatActivity
final Intent intentCreateDocumentAction = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intentCreateDocumentAction.addCategory(Intent.CATEGORY_OPENABLE);
intentCreateDocumentAction.setType("text/csv");
- intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "LoyaltyCardKeychain.csv");
+ intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "Catima.csv");
Button exportButton = findViewById(R.id.exportButton);
exportButton.setOnClickListener(new View.OnClickListener()
diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java
index ab54c9ef3..8537fbe99 100644
--- a/app/src/main/java/protect/card_locker/ImportExportTask.java
+++ b/app/src/main/java/protect/card_locker/ImportExportTask.java
@@ -15,7 +15,7 @@ import java.nio.charset.Charset;
class ImportExportTask extends AsyncTask
{
- private static final String TAG = "LoyaltyCardLocker";
+ private static final String TAG = "Catima";
private Activity activity;
private boolean doImport;
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
index b6ac2cc41..54f9079a3 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
@@ -34,7 +34,7 @@ import java.io.InvalidObjectException;
public class LoyaltyCardEditActivity extends AppCompatActivity
{
- private static final String TAG = "CardLocker";
+ private static final String TAG = "Catima";
protected static final String NO_BARCODE = "_NO_BARCODE_";
protected static final int SELECT_BARCODE_REQUEST = 1;
diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
index f52de980e..7a704ad91 100644
--- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
+++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java
@@ -36,7 +36,7 @@ import protect.card_locker.preferences.Settings;
public class LoyaltyCardViewActivity extends AppCompatActivity
{
- private static final String TAG = "CardLocker";
+ private static final String TAG = "Catima";
private static final double LUMINANCE_MIDPOINT = 0.5;
TextView cardIdFieldView;
diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java
index 6488d84ee..024ca6aeb 100644
--- a/app/src/main/java/protect/card_locker/MainActivity.java
+++ b/app/src/main/java/protect/card_locker/MainActivity.java
@@ -39,7 +39,7 @@ import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends AppCompatActivity
{
- private static final String TAG = "LoyaltyCardLocker";
+ private static final String TAG = "Catima";
private static final int MAIN_REQUEST_CODE = 1;
private Menu menu;
@@ -371,6 +371,8 @@ public class MainActivity extends AppCompatActivity
"") +
"
" +
String.format(getString(R.string.app_copyright_fmt), year) +
+ "
" +
+ getString(R.string.app_copyright_old) +
"
" +
getString(R.string.app_license) +
"
" +
diff --git a/app/src/main/java/protect/card_locker/MultiFormatExporter.java b/app/src/main/java/protect/card_locker/MultiFormatExporter.java
index 68b01e761..5298e2ad7 100644
--- a/app/src/main/java/protect/card_locker/MultiFormatExporter.java
+++ b/app/src/main/java/protect/card_locker/MultiFormatExporter.java
@@ -7,7 +7,7 @@ import java.io.OutputStreamWriter;
public class MultiFormatExporter
{
- private static final String TAG = "LoyaltyCardLocker";
+ private static final String TAG = "Catima";
/**
* Attempts to export data to the output stream in the
diff --git a/app/src/main/java/protect/card_locker/MultiFormatImporter.java b/app/src/main/java/protect/card_locker/MultiFormatImporter.java
index 3d5593868..a4ab4c83c 100644
--- a/app/src/main/java/protect/card_locker/MultiFormatImporter.java
+++ b/app/src/main/java/protect/card_locker/MultiFormatImporter.java
@@ -7,7 +7,7 @@ import java.io.InputStreamReader;
public class MultiFormatImporter
{
- private static final String TAG = "LoyaltyCardLocker";
+ private static final String TAG = "Catima";
/**
* Attempts to import data from the input stream of the
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 1b9055017..0fa9de666 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -1,7 +1,6 @@
- Loyalty Card Keychain
Přidat
ZAtím némáte žádné věrnostní karty. Klikněte na tlačítko "+" (plus) nahoře a začněte.\n\nLoyalty Card Locker umožňuje nosit své věrnostní karty v telefonu, takže jsou vždy na dosah.
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index f6445e6e7..ea6fc810c 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -1,7 +1,6 @@
- Loyalty Card Keychain
Suche
Neu
diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml
index e35d883e4..06a1d3c7e 100644
--- a/app/src/main/res/values-el-rGR/strings.xml
+++ b/app/src/main/res/values-el-rGR/strings.xml
@@ -1,7 +1,6 @@
- Loyalty Card Keychain
Προσθήκη
Δεν έχετε κάρτες προς το παρόν. Πατήστε το κουμπί \"+\" (συν) στο πάνω μέρος για να ξεκινήσετε.\n\nΤο Loyalty Card Keychain σας δίνει τη δυνατότητα να έχετε τις κάρτες σας στο τηλέφωνο σας, έτσι ώστε να τις έχετε πάντα μαζί σας.
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index a512e8a19..8b729423b 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -1,7 +1,6 @@
- Cartera para Tarjetas de Fidelización.
Añadir
Actualmente no tienes ninguna tarjeta guardada. Presiona el botón \"+\" para comenzar.\n\nEsta cartera te permite llevar tus tarjetas de fidelización en tu teléfono para que estén siempre a tu alcance.
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 8f5194840..445fd99dc 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -1,7 +1,6 @@
- Loyalty Card Keychain
Ajouter
Aucune carte de fidélité enregistrée. Appuyez sur le bouton \"+\" (plus) pour commencer.\n\nLoyalty Card Locker vous permet d\'enregistrer vos cartes de fidélité sur votre téléphone pour toujours les avoir à portée de main.
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 5f89dbe0b..a7cba28d6 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -1,7 +1,6 @@
- Carte fedeltà
Cerca
Aggiungi
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index f7fab0fc2..02e1333d3 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -1,7 +1,6 @@
- Loyalty Card Keychain
Pridėti
Šiuo metu neturite nė vienos įvestos lojalumo kortelės. Paspauskite "+" (pliuso) pliuso mygtuką, kad pradėtumėte.\n\nLoyalty Card Locker leidžia Jums visada nešiotis lojalumo kortelių informaciją savo telefone ar planšetėje, taip jos visada pasiekiamos.
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index 7fe31e5d9..b70fe8926 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -1,6 +1,5 @@
- Kundekortknippe
Legg til
Du har ingen kundekort for øyeblikket. Klikk på \"+\" (pluss)-knappen øverst for å komme igang.\n\nDa har du dem alltid hendig.
Butikk
diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml
index 766606060..96cf9aace 100644
--- a/app/src/main/res/values-night/colors.xml
+++ b/app/src/main/res/values-night/colors.xml
@@ -2,9 +2,9 @@
- #3f51b5
- #757de8
- #002984
+ #B53F3F
+ #E87575
+ #840000
#ffc107
#fff350
#c79100
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index ba0c1e436..dd7af601e 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -1,7 +1,6 @@
- Klantenkaartkluis
Zoeken
Toevoegen
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 371633ce2..8971c1cd4 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -1,7 +1,6 @@
- Loyalty Card Keychain
Szukaj
Dodaj
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 748fe2b63..8dc56490e 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -1,7 +1,6 @@
- Карты лояльности
Поиск
Добавить карту
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 76b43f11d..d4150efef 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -1,7 +1,6 @@
- Vernostné karty
Pridať
Zatiaľ nemáte žiadne vernostné karty. Kliknite na tlačidlo \"+\" (plus) vyššie a začnite.\n\nAplikácia Vernostné karty umožňuje nosiť svoje vernostné karty v telefóne, kde sú vždy na dosah.
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index d322cfdb7..2dbb716b9 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -1,7 +1,6 @@
- Kartice zvestobe
Dodaj
Trenutno nimate shranjene nobene kartice zvestobe. Kliknite \"+\" (plus) na vrhu, da jih dodate.\n\n Aplikacija Kartice zvestobe Vam omogoča, da imate kartice zvestobe shranjene na Vašem telefonu in vedno v dosegu roke.
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 19c265c60..06b895547 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,9 +1,9 @@
- #3f51b5
- #757de8
- #002984
+ #B53F3F
+ #E87575
+ #840000
#ffc107
#fff350
#c79100
diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml
index 7ab3b26e4..45c05623b 100644
--- a/app/src/main/res/values/constants.xml
+++ b/app/src/main/res/values/constants.xml
@@ -1,5 +1,5 @@
- https://github.com/brarcher/loyalty-card-locker/releases
- https://github.com/brarcher/loyalty-card-locker
+ https://github.com/TheLastProject/Catima/releases
+ https://github.com/TheLastProject/Catima
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b01f26dc2..207178c93 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,12 +1,12 @@
- Loyalty Card Keychain
+ Catima
Search
Add
- You don\'t have any loyalty cards at the moment. Click the "+" (plus) button up top to get started.\n\nLoyalty Card Locker lets you carry your loyalty cards on your phone, so they are always within reach.
- No loyalty cards match the search filter. Please try some different terms.
+ You don\'t have any cards at the moment. Click the "+" (plus) button up top to get started.\n\nCatima lets you carry your loyalty cards on your phone, so they are always within reach.
+ No cards match the search filter. Please try some different terms.
Store
Note
@@ -24,15 +24,15 @@
Confirm
Block Rotation
Unblock Rotation
- Remove Loyalty Card
+ Remove Card
Please confirm that you want to delete this card.
OK
Copy ID to clipboard
Share
Send…
Added shortcut
- Edit Loyalty Card
- Add Loyalty Card
+ Edit Card
+ Add Card
Scan Card\'s Barcode
Card Shortcut
There are no cards, add one first
@@ -65,7 +65,8 @@
Use external application
About
- Copyright 2016-%d Branden Archer
+ Copyright 2019-%d Sylvia van Os.
+ Based on Loyalty Card Locker, copyright 2016-2020 Branden Archer.
Licensed under the GPLv3.
About %s
Version: %s
@@ -81,7 +82,7 @@
Thumbnail for card
Start Intro
- Welcome to Loyalty Card Keychain\n
+ Welcome to Catima\n
Manage your barcode-based store/loyalty cards on your phone!\n\n
Adding Cards\n
Add a new card by touching the plus from the card list.\n\n
@@ -125,10 +126,10 @@
Lock barcode orientation
pref_lock_barcode_orientation
- Import loyalty card
- I want to share a loyalty card with you
- brarcher.github.io
- /loyalty-card-locker/share
+ Import into Catima
+ I want to share a card with you
+ thelastproject.github.io
+ /Catima/share
Successfully imported loyalty card data
Successfully exported loyalty card data
diff --git a/docs/README.md b/docs/README.md
index 289e6050a..bc769d05c 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,9 +1,9 @@
-# Loyalty Card Keychain
-[](https://travis-ci.org/brarcher/loyalty-card-locker)
+# Catima
+[](https://travis-ci.org/TheLastProject/Catima)
-
-
-
+
+
+
Stores all of your store loyalty cards on your phone, removing the need to carry them around. Currently the following barcode types are supported:
@@ -22,13 +22,13 @@ Stores all of your store loyalty cards on your phone, removing the need to carry
# Screenshots
-[ ](https://github.com/brarcher/loyalty-card-locker/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-01.png)
-[ ](https://github.com/brarcher/loyalty-card-locker/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-03.png)
-[ ](https://github.com/brarcher/loyalty-card-locker/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-02.png)
+[ ](https://github.com/TheLastProject/Catima/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-01.png)
+[ ](https://github.com/TheLastProject/Catima/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-03.png)
+[ ](https://github.com/TheLastProject/Catima/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-02.png)
-[ ](https://github.com/brarcher/loyalty-card-locker/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-04.png)
-[ ](https://github.com/brarcher/loyalty-card-locker/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-05.png)
-[ ](https://github.com/brarcher/loyalty-card-locker/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-06.png)
+[ ](https://github.com/TheLastProject/Catima/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-04.png)
+[ ](https://github.com/TheLastProject/Catima/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-05.png)
+[ ](https://github.com/TheLastProject/Catima/raw/master/metadata/en-US/images/phoneScreenshots/screenshot-06.png)
# Building
@@ -47,7 +47,7 @@ Windows:
# Translating
-If you are interested in translating this application to another language, find the project listing on [Transifex](https://www.transifex.com/na-243/loyalty-card-locker).
+We are going to set up a translation platform soon, please check back later.
# Thanks
@@ -55,4 +55,4 @@ This application uses the following image:
- [Save](https://thenounproject.com/term/save/716011) by [Bernar Novalyi](https://thenounproject.com/bernar.novalyi)
# Note from Developer
-The developer is currently on hiatus from the project. Questions and pull requests may not be looked at for some time. Apologies in advance.
+This application is based on the great [Loyalty Card Locker](https://github.com/brarcher/loyalty-card-locker) by [Branden Archer](https://github.com/brarcher). This fork was created due to the original developer having stopped development of this app.
diff --git a/privacy-policy.md b/docs/privacy-policy.md
similarity index 92%
rename from privacy-policy.md
rename to docs/privacy-policy.md
index 2cb74dfee..a3e9a95a9 100644
--- a/privacy-policy.md
+++ b/docs/privacy-policy.md
@@ -1,6 +1,6 @@
# PRIVACY POLICY FOR LOYALTY CARD KEYCHAIN
-This privacy policy governs your use of the software application Loyalty Card Keychain (“Application”) for mobile devices
+This privacy policy governs your use of the software application Catima (“Application”) for mobile devices
that was created by Protect. The Application is designed to store and display barcodes.
# What information does the Application obtain and how is it used?
@@ -48,8 +48,8 @@ not delete such emails.
# Children
This Application is not used to knowingly solicit data from or market to children under the age of 13. If a parent or
-guardian becomes aware that his or her child has provided us with information without their consent, he or she should
-contact us at protect.github@gmail.com. We will delete such information from our files within a reasonable time.
+guardian becomes aware that his or her child has provided us with information without their consent, they should
+contact us at sylvia+googleplay@hackerchick.me. We will delete such information from our files within a reasonable time.
# Security
@@ -67,4 +67,4 @@ checking this history of this file in GitHub.
# Contact us
If you have any questions regarding privacy while using the Application, or have questions about our practices,
-please contact us via email at protect.github@gmail.com.
+please contact us via email at sylvia+googleplay@hackerchick.me.
diff --git a/docs/share.md b/docs/share.md
index c4d1ed8c6..2b9fe3267 100644
--- a/docs/share.md
+++ b/docs/share.md
@@ -1,10 +1,10 @@
-# Shared Loyalty Card
+# Shared Card
-Someone wants to share a loyalty card with you. To import this loyalty card, you will first need to install the Loyalty Card Locker app. It is free, Open Source and contains no ads.
+Someone wants to share a card with you. To import this card, you will first need to install the Catima app. It is free, Open Source and contains no ads.
-
-
-
+
+
+
-After installing the app, just click the link you were given again and choose "Import loyalty card".
+After installing the app, just click the link you were given again and choose "Import into Catima".
From 1cbf90a59693e81e01595f7a630a8e5eea09beb8 Mon Sep 17 00:00:00 2001
From: Sylvia van Os
Date: Thu, 22 Oct 2020 18:35:33 +0200
Subject: [PATCH 22/32] Remove intro
---
.../protect/card_locker/MainActivity.java | 19 -------
.../card_locker/intro/IntroActivity.java | 33 ------------
.../card_locker/intro/IntroSlide1.java | 19 -------
.../card_locker/intro/IntroSlide2.java | 20 -------
.../card_locker/intro/IntroSlide3.java | 19 -------
.../card_locker/intro/IntroSlide4.java | 19 -------
.../card_locker/intro/IntroSlide5.java | 19 -------
.../card_locker/intro/IntroSlide6.java | 19 -------
.../main/res/drawable-hdpi/app_icon_intro.png | Bin 19927 -> 0 bytes
.../main/res/drawable-hdpi/intro2_image.png | Bin 31376 -> 0 bytes
.../main/res/drawable-hdpi/intro3_image.png | Bin 10638 -> 0 bytes
.../main/res/drawable-hdpi/intro4_image.png | Bin 14830 -> 0 bytes
.../main/res/drawable-hdpi/intro5_image.png | Bin 30355 -> 0 bytes
.../main/res/drawable-mdpi/app_icon_intro.png | Bin 11893 -> 0 bytes
.../main/res/drawable-mdpi/intro2_image.png | Bin 20181 -> 0 bytes
.../main/res/drawable-mdpi/intro3_image.png | Bin 7159 -> 0 bytes
.../main/res/drawable-mdpi/intro4_image.png | Bin 9590 -> 0 bytes
.../main/res/drawable-mdpi/intro5_image.png | Bin 17444 -> 0 bytes
.../res/drawable-xhdpi/app_icon_intro.png | Bin 29148 -> 0 bytes
.../main/res/drawable-xhdpi/intro2_image.png | Bin 47300 -> 0 bytes
.../main/res/drawable-xhdpi/intro3_image.png | Bin 16925 -> 0 bytes
.../main/res/drawable-xhdpi/intro4_image.png | Bin 20257 -> 0 bytes
.../main/res/drawable-xhdpi/intro5_image.png | Bin 46936 -> 0 bytes
.../res/drawable-xxhdpi/app_icon_intro.png | Bin 51545 -> 0 bytes
.../main/res/drawable-xxhdpi/intro2_image.png | Bin 72292 -> 0 bytes
.../main/res/drawable-xxhdpi/intro3_image.png | Bin 22911 -> 0 bytes
.../main/res/drawable-xxhdpi/intro4_image.png | Bin 31883 -> 0 bytes
.../main/res/drawable-xxhdpi/intro5_image.png | Bin 76948 -> 0 bytes
.../res/drawable-xxxhdpi/app_icon_intro.png | Bin 73852 -> 0 bytes
.../res/drawable-xxxhdpi/intro2_image.png | Bin 106128 -> 0 bytes
.../res/drawable-xxxhdpi/intro3_image.png | Bin 36428 -> 0 bytes
.../res/drawable-xxxhdpi/intro4_image.png | Bin 46793 -> 0 bytes
.../res/drawable-xxxhdpi/intro5_image.png | Bin 113725 -> 0 bytes
app/src/main/res/layout/intro1_layout.xml | 51 ------------------
app/src/main/res/layout/intro2_layout.xml | 51 ------------------
app/src/main/res/layout/intro3_layout.xml | 51 ------------------
app/src/main/res/layout/intro4_layout.xml | 51 ------------------
app/src/main/res/layout/intro5_layout.xml | 51 ------------------
app/src/main/res/layout/intro6_layout.xml | 51 ------------------
app/src/main/res/menu/main_menu.xml | 4 --
40 files changed, 477 deletions(-)
delete mode 100644 app/src/main/java/protect/card_locker/intro/IntroActivity.java
delete mode 100644 app/src/main/java/protect/card_locker/intro/IntroSlide1.java
delete mode 100644 app/src/main/java/protect/card_locker/intro/IntroSlide2.java
delete mode 100644 app/src/main/java/protect/card_locker/intro/IntroSlide3.java
delete mode 100644 app/src/main/java/protect/card_locker/intro/IntroSlide4.java
delete mode 100644 app/src/main/java/protect/card_locker/intro/IntroSlide5.java
delete mode 100644 app/src/main/java/protect/card_locker/intro/IntroSlide6.java
delete mode 100755 app/src/main/res/drawable-hdpi/app_icon_intro.png
delete mode 100644 app/src/main/res/drawable-hdpi/intro2_image.png
delete mode 100644 app/src/main/res/drawable-hdpi/intro3_image.png
delete mode 100644 app/src/main/res/drawable-hdpi/intro4_image.png
delete mode 100644 app/src/main/res/drawable-hdpi/intro5_image.png
delete mode 100755 app/src/main/res/drawable-mdpi/app_icon_intro.png
delete mode 100644 app/src/main/res/drawable-mdpi/intro2_image.png
delete mode 100644 app/src/main/res/drawable-mdpi/intro3_image.png
delete mode 100644 app/src/main/res/drawable-mdpi/intro4_image.png
delete mode 100644 app/src/main/res/drawable-mdpi/intro5_image.png
delete mode 100755 app/src/main/res/drawable-xhdpi/app_icon_intro.png
delete mode 100644 app/src/main/res/drawable-xhdpi/intro2_image.png
delete mode 100644 app/src/main/res/drawable-xhdpi/intro3_image.png
delete mode 100644 app/src/main/res/drawable-xhdpi/intro4_image.png
delete mode 100644 app/src/main/res/drawable-xhdpi/intro5_image.png
delete mode 100755 app/src/main/res/drawable-xxhdpi/app_icon_intro.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/intro2_image.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/intro3_image.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/intro4_image.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/intro5_image.png
delete mode 100755 app/src/main/res/drawable-xxxhdpi/app_icon_intro.png
delete mode 100644 app/src/main/res/drawable-xxxhdpi/intro2_image.png
delete mode 100644 app/src/main/res/drawable-xxxhdpi/intro3_image.png
delete mode 100644 app/src/main/res/drawable-xxxhdpi/intro4_image.png
delete mode 100644 app/src/main/res/drawable-xxxhdpi/intro5_image.png
delete mode 100644 app/src/main/res/layout/intro1_layout.xml
delete mode 100644 app/src/main/res/layout/intro2_layout.xml
delete mode 100644 app/src/main/res/layout/intro3_layout.xml
delete mode 100644 app/src/main/res/layout/intro4_layout.xml
delete mode 100644 app/src/main/res/layout/intro5_layout.xml
delete mode 100644 app/src/main/res/layout/intro6_layout.xml
diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java
index 024ca6aeb..b24190996 100644
--- a/app/src/main/java/protect/card_locker/MainActivity.java
+++ b/app/src/main/java/protect/card_locker/MainActivity.java
@@ -34,7 +34,6 @@ import com.google.common.collect.ImmutableMap;
import java.util.Calendar;
import java.util.Map;
-import protect.card_locker.intro.IntroActivity;
import protect.card_locker.preferences.SettingsActivity;
public class MainActivity extends AppCompatActivity
@@ -54,12 +53,6 @@ public class MainActivity extends AppCompatActivity
setSupportActionBar(toolbar);
updateLoyaltyCardList("");
-
- SharedPreferences prefs = getSharedPreferences("protect.card_locker", MODE_PRIVATE);
- if (prefs.getBoolean("firstrun", true)) {
- startIntro();
- prefs.edit().putBoolean("firstrun", false).commit();
- }
}
@Override
@@ -280,12 +273,6 @@ public class MainActivity extends AppCompatActivity
return true;
}
- if(id == R.id.action_intro)
- {
- startIntro();
- return true;
- }
-
if(id == R.id.action_about)
{
displayAboutDialog();
@@ -393,10 +380,4 @@ public class MainActivity extends AppCompatActivity
})
.show();
}
-
- private void startIntro()
- {
- Intent intent = new Intent(this, IntroActivity.class);
- startActivityForResult(intent, MAIN_REQUEST_CODE);
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/protect/card_locker/intro/IntroActivity.java b/app/src/main/java/protect/card_locker/intro/IntroActivity.java
deleted file mode 100644
index 37a699ed8..000000000
--- a/app/src/main/java/protect/card_locker/intro/IntroActivity.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package protect.card_locker.intro;
-
-import android.os.Bundle;
-import androidx.fragment.app.Fragment;
-
-import com.github.paolorotolo.appintro.AppIntro;
-
-
-public class IntroActivity extends AppIntro
-{
- @Override
- public void init(Bundle savedInstanceState)
- {
- addSlide(new IntroSlide1());
- addSlide(new IntroSlide2());
- addSlide(new IntroSlide3());
- addSlide(new IntroSlide4());
- addSlide(new IntroSlide5());
- addSlide(new IntroSlide6());
- }
-
- @Override
- public void onSkipPressed(Fragment fragment) {
- finish();
- }
-
- @Override
- public void onDonePressed(Fragment fragment) {
- finish();
- }
-}
-
-
diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide1.java b/app/src/main/java/protect/card_locker/intro/IntroSlide1.java
deleted file mode 100644
index beecb43c3..000000000
--- a/app/src/main/java/protect/card_locker/intro/IntroSlide1.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package protect.card_locker.intro;
-
-import android.os.Bundle;
-import androidx.fragment.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import protect.card_locker.R;
-
-public class IntroSlide1 extends Fragment
-{
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
- {
- View v = inflater.inflate(R.layout.intro1_layout, container, false);
- return v;
- }
-}
diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide2.java b/app/src/main/java/protect/card_locker/intro/IntroSlide2.java
deleted file mode 100644
index a1e652c51..000000000
--- a/app/src/main/java/protect/card_locker/intro/IntroSlide2.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package protect.card_locker.intro;
-
-import android.os.Bundle;
-import androidx.fragment.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import protect.card_locker.R;
-
-public class IntroSlide2 extends Fragment
-{
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
- {
- View v = inflater.inflate(R.layout.intro2_layout, container, false);
- return v;
- }
-}
diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide3.java b/app/src/main/java/protect/card_locker/intro/IntroSlide3.java
deleted file mode 100644
index 5acc83e7b..000000000
--- a/app/src/main/java/protect/card_locker/intro/IntroSlide3.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package protect.card_locker.intro;
-
-import android.os.Bundle;
-import androidx.fragment.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import protect.card_locker.R;
-
-public class IntroSlide3 extends Fragment
-{
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
- {
- View v = inflater.inflate(R.layout.intro3_layout, container, false);
- return v;
- }
-}
diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide4.java b/app/src/main/java/protect/card_locker/intro/IntroSlide4.java
deleted file mode 100644
index 1a7ad6e69..000000000
--- a/app/src/main/java/protect/card_locker/intro/IntroSlide4.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package protect.card_locker.intro;
-
-import android.os.Bundle;
-import androidx.fragment.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import protect.card_locker.R;
-
-public class IntroSlide4 extends Fragment
-{
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
- {
- View v = inflater.inflate(R.layout.intro4_layout, container, false);
- return v;
- }
-}
diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide5.java b/app/src/main/java/protect/card_locker/intro/IntroSlide5.java
deleted file mode 100644
index ab3b5b757..000000000
--- a/app/src/main/java/protect/card_locker/intro/IntroSlide5.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package protect.card_locker.intro;
-
-import android.os.Bundle;
-import androidx.fragment.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import protect.card_locker.R;
-
-public class IntroSlide5 extends Fragment
-{
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
- {
- View v = inflater.inflate(R.layout.intro5_layout, container, false);
- return v;
- }
-}
diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide6.java b/app/src/main/java/protect/card_locker/intro/IntroSlide6.java
deleted file mode 100644
index 217967844..000000000
--- a/app/src/main/java/protect/card_locker/intro/IntroSlide6.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package protect.card_locker.intro;
-
-import android.os.Bundle;
-import androidx.fragment.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import protect.card_locker.R;
-
-public class IntroSlide6 extends Fragment
-{
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
- {
- View v = inflater.inflate(R.layout.intro6_layout, container, false);
- return v;
- }
-}
diff --git a/app/src/main/res/drawable-hdpi/app_icon_intro.png b/app/src/main/res/drawable-hdpi/app_icon_intro.png
deleted file mode 100755
index 11c0465c6002a861f667feb83a1c34a00e70ee71..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 19927
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
diff --git a/app/src/main/res/drawable-hdpi/intro2_image.png b/app/src/main/res/drawable-hdpi/intro2_image.png
deleted file mode 100644
index 6a718057d65f0b5697ad3cd9755f6a33fedb5d22..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 31376
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