diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 15b9b18c1..04bb77083 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -2,9 +2,13 @@ name: Android CI on: push: - branches: [ master ] + branches: + - master + - staging + - trying pull_request: - branches: [ master ] + branches: + - master jobs: build: diff --git a/.github/workflows/autoclose-needs-info.yml b/.github/workflows/autoclose-needs-info.yml index f48095107..41a807934 100644 --- a/.github/workflows/autoclose-needs-info.yml +++ b/.github/workflows/autoclose-needs-info.yml @@ -2,7 +2,7 @@ name: 'Close issues and PRs needing info for too long' on: schedule: - cron: '30 1 * * *' - + permissions: issues: write pull-requests: write diff --git a/.github/workflows/changelog-to-fastlane.yml b/.github/workflows/changelog-to-fastlane.yml index 613c5df27..147bccae3 100644 --- a/.github/workflows/changelog-to-fastlane.yml +++ b/.github/workflows/changelog-to-fastlane.yml @@ -1,7 +1,8 @@ name: Convert CHANGELOG to Fastlane on: push: - branches: [ master ] + branches: + - master jobs: convert_changelog_to_fastlane: diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 1f05e5ce1..44bbd448b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,10 +13,12 @@ name: "CodeQL" on: push: - branches: [ master ] + branches: + - master pull_request: # The branches below must be a subset of the branches above - branches: [ master ] + branches: + - master schedule: - cron: '33 1 * * 4' diff --git a/CHANGELOG.md b/CHANGELOG.md index aee407a7b..49496e81f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## Unreleased - 89 + +- Fix swiping between groups not working on an empty group +- Allow password-protecting exports +- Improve usage of space for QR codes + +## v2.7.3 - 88 (2021-10-10) + +- Fix incorrect migration making first card become invisible + +## v2.7.2 - 87 (2021-10-09) + +- Fix regression breaking import/export + +## v2.7.1 - 86 (2021-10-07) + +- Improve search with spaces + ## v2.7.0 - 85 (2021-10-05) Android 4.4 is no longer supported starting with this release. If you want to use Catima on Android 4.4, please use version 2.6.1. diff --git a/app/build.gradle b/app/build.gradle index deb3a58d1..6b1d90657 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "me.hackerchick.catima" minSdkVersion 21 targetSdkVersion 31 - versionCode 85 - versionName "2.7.0" + versionCode 88 + versionName "2.7.3" vectorDrawables.useSupportLibrary true multiDexEnabled true @@ -80,9 +80,7 @@ android { dependencies { // AndroidX - implementation "androidx.multidex:multidex:2.0.1" implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.1' implementation 'androidx.exifinterface:exifinterface:1.3.3' implementation 'androidx.preference:preference:1.1.1' diff --git a/app/src/main/java/protect/card_locker/CatimaBarcode.java b/app/src/main/java/protect/card_locker/CatimaBarcode.java index 59a1d5305..2b295f5c5 100644 --- a/app/src/main/java/protect/card_locker/CatimaBarcode.java +++ b/app/src/main/java/protect/card_locker/CatimaBarcode.java @@ -63,6 +63,13 @@ public class CatimaBarcode { return barcodeFormats.contains(mBarcodeFormat); } + public boolean isSquare(){ + return mBarcodeFormat == BarcodeFormat.AZTEC + || mBarcodeFormat == BarcodeFormat.DATA_MATRIX + || mBarcodeFormat == BarcodeFormat.MAXICODE + || mBarcodeFormat == BarcodeFormat.QR_CODE; + } + public BarcodeFormat format() { return mBarcodeFormat; } diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 1469bb84e..a784fcea9 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -7,6 +7,7 @@ import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; +import android.text.TextUtils; import java.io.FileNotFoundException; import java.math.BigDecimal; @@ -20,7 +21,7 @@ public class DBHelper extends SQLiteOpenHelper { public static final String DATABASE_NAME = "Catima.db"; public static final int ORIGINAL_DATABASE_VERSION = 1; - public static final int DATABASE_VERSION = 12; + public static final int DATABASE_VERSION = 13; public static class LoyaltyCardDbGroups { @@ -293,6 +294,24 @@ public class DBHelper extends SQLiteOpenHelper insertFTS(db, loyaltyCard.id, loyaltyCard.store, loyaltyCard.note); } } + + if(oldVersion < 13 && newVersion >= 13) + { + db.execSQL("DELETE FROM " + LoyaltyCardDbFTS.TABLE + ";"); + + Cursor cursor = db.rawQuery("SELECT * FROM " + LoyaltyCardDbIds.TABLE + ";", null, null); + + if (cursor.moveToFirst()) { + LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor); + insertFTS(db, loyaltyCard.id, loyaltyCard.store, loyaltyCard.note); + + while (cursor.moveToNext()) { + loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor); + insertFTS(db, loyaltyCard.id, loyaltyCard.store, loyaltyCard.note); + } + } + cursor.close(); + } } private ContentValues generateFTSContentValues(final int id, final String store, final String note) { @@ -663,38 +682,26 @@ public class DBHelper extends SQLiteOpenHelper return db.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE + " JOIN " + LoyaltyCardDbFTS.TABLE + " ON " + LoyaltyCardDbFTS.TABLE + "." + LoyaltyCardDbFTS.ID + " = " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.ID + - (filter.isEmpty() ? " " : " AND " + LoyaltyCardDbFTS.TABLE + " MATCH ? ") + + (filter.trim().isEmpty() ? " " : " AND " + LoyaltyCardDbFTS.TABLE + " MATCH ? ") + groupFilter.toString() + " ORDER BY " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.STAR_STATUS + " DESC, " + " (CASE WHEN " + LoyaltyCardDbIds.TABLE + "." + orderField + " IS NULL THEN 1 ELSE 0 END), " + LoyaltyCardDbIds.TABLE + "." + orderField + " COLLATE NOCASE " + getDbDirection(order, direction) + ", " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC " + - limitString, filter.isEmpty() ? null : new String[] { filter + '*' }, null); + limitString, filter.trim().isEmpty() ? null : new String[] { TextUtils.join("* ", filter.split(" ")) + '*' }, null); } + /** + * Returns the amount of loyalty cards. + * + * @return Integer + */ public int getLoyaltyCardCount() { SQLiteDatabase db = getReadableDatabase(); return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIds.TABLE); } - /** - * Returns the amount of loyalty cards with the filter text in either the store or note. - * - * @param filter - * @return Integer - */ - public int getLoyaltyCardCount(String filter) - { - if (filter.isEmpty()) { - return getLoyaltyCardCount(); - } - - SQLiteDatabase db = getReadableDatabase(); - return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbFTS.TABLE, - LoyaltyCardDbFTS.TABLE + " MATCH ? ", withArgs(filter + '*')); - } - /** * Returns a cursor to all groups. * @@ -709,20 +716,22 @@ public class DBHelper extends SQLiteOpenHelper } public List getGroups() { - try(Cursor data = getGroupCursor()) { - List groups = new ArrayList<>(); + Cursor data = getGroupCursor(); - if (!data.moveToFirst()) { - return groups; - } - - groups.add(Group.toGroup(data)); - while (data.moveToNext()) { - groups.add(Group.toGroup(data)); - } + List groups = new ArrayList<>(); + if (!data.moveToFirst()) { + data.close(); return groups; } + + groups.add(Group.toGroup(data)); + while (data.moveToNext()) { + groups.add(Group.toGroup(data)); + } + + data.close(); + return groups; } public void reorderGroups(final List groups) diff --git a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java index 886c73879..1e89bb091 100644 --- a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java @@ -42,7 +42,7 @@ class GroupCursorAdapter extends BaseCursorAdapter { + exportPassword = input.getText().toString(); + chooseFileWithIntent(intentCreateDocumentAction, CHOOSE_EXPORT_LOCATION); + }); + builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel()); + builder.show(); + } }); @@ -187,7 +211,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity builder.show(); } - private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password) + private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password, final boolean closeWhenDone) { ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() { @@ -195,6 +219,13 @@ public class ImportExportActivity extends CatimaAppCompatActivity public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) { onImportComplete(result, targetUri, dataFormat); + if (closeWhenDone) { + try { + target.close(); + } catch (IOException ioException) { + ioException.printStackTrace(); + } + } } }; @@ -203,19 +234,25 @@ public class ImportExportActivity extends CatimaAppCompatActivity importExporter.execute(); } - private void startExport(final OutputStream target, final Uri targetUri) + private void startExport(final OutputStream target, final Uri targetUri,char[] password, final boolean closeWhenDone) { ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() { @Override - public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) - { + public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) { onExportComplete(result, targetUri); + if (closeWhenDone) { + try { + target.close(); + } catch (IOException ioException) { + ioException.printStackTrace(); + } + } } }; importExporter = new ImportExportTask(ImportExportActivity.this, - DataFormat.Catima, target, listener); + DataFormat.Catima, target,password, listener); importExporter.execute(); } @@ -393,6 +430,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity { if (requestCode == CHOOSE_EXPORT_LOCATION) { + OutputStream writer; if (uri.getScheme() != null) { @@ -402,9 +440,8 @@ public class ImportExportActivity extends CatimaAppCompatActivity { writer = new FileOutputStream(new File(uri.toString())); } - Log.e(TAG, "Starting file export with: " + uri.toString()); - startExport(writer, uri); + startExport(writer, uri,exportPassword.toCharArray(),true); } else { @@ -420,10 +457,10 @@ public class ImportExportActivity extends CatimaAppCompatActivity Log.e(TAG, "Starting file import with: " + uri.toString()); - startImport(reader, uri, importDataFormat, password); + startImport(reader, uri, importDataFormat, password, true); } } - catch(FileNotFoundException e) + catch(IOException e) { Log.e(TAG, "Failed to import/export file: " + uri.toString(), e); if (requestCode == CHOOSE_EXPORT_LOCATION) diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java index 1538185c3..df2d26e0d 100644 --- a/app/src/main/java/protect/card_locker/ImportExportTask.java +++ b/app/src/main/java/protect/card_locker/ImportExportTask.java @@ -35,7 +35,7 @@ class ImportExportTask extends AsyncTask /** * Constructor which will setup a task for exporting to the given file */ - ImportExportTask(Activity activity, DataFormat format, OutputStream output, + ImportExportTask(Activity activity, DataFormat format, OutputStream output,char[] password, TaskCompleteListener listener) { super(); @@ -43,6 +43,7 @@ class ImportExportTask extends AsyncTask this.doImport = false; this.format = format; this.outputStream = output; + this.password = password; this.listener = listener; } @@ -70,14 +71,14 @@ class ImportExportTask extends AsyncTask return importResult; } - private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db) + private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db,char[] password) { ImportExportResult result = ImportExportResult.GenericFailure; try { OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8); - result = MultiFormatExporter.exportData(context, db, stream, format); + result = MultiFormatExporter.exportData(context, db, stream, format,password); writer.close(); } catch (IOException e) @@ -118,7 +119,7 @@ class ImportExportTask extends AsyncTask } else { - result = performExport(activity.getApplicationContext(), outputStream, db); + result = performExport(activity.getApplicationContext(), outputStream, db,password); } return result; diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 7470d1a6c..15791d381 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -21,7 +21,6 @@ import java.math.BigDecimal; import java.text.DateFormat; import java.util.ArrayList; -import androidx.cardview.widget.CardView; import androidx.recyclerview.widget.RecyclerView; import protect.card_locker.preferences.Settings; @@ -62,7 +61,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter { + inputListener.onRowClicked(getAdapterPosition()); + inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + return true; + }); } } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java b/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java index 4765f6fc9..c031f7904 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java @@ -1,14 +1,18 @@ package protect.card_locker; +import android.app.Application; + import androidx.appcompat.app.AppCompatDelegate; -import androidx.multidex.MultiDexApplication; + import protect.card_locker.preferences.Settings; -public class LoyaltyCardLockerApplication extends MultiDexApplication { +public class LoyaltyCardLockerApplication extends Application { + + @Override public void onCreate() { super.onCreate(); - Settings settings = new Settings(getApplicationContext()); + Settings settings = new Settings(this); AppCompatDelegate.setDefaultNightMode(settings.getTheme()); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 11bb5bd25..91bbb2b2b 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -268,7 +268,10 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements if (imageTypes.get(mainImageIndex) == ImageType.BARCODE) { redrawBarcodeAfterResize(); } - centerGuideline.setGuidelinePercent(0.5f * scale); + if(loyaltyCard!=null && format!=null && format.isSquare()) + centerGuideline.setGuidelinePercent(0.75f * scale); + else + centerGuideline.setGuidelinePercent(0.5f * scale); } @Override @@ -417,6 +420,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements setupOrientation(); format = loyaltyCard.barcodeType; + if(format != null && format.isSquare()){ + centerGuideline.setGuidelinePercent(0.75f); + } + else{ + centerGuideline.setGuidelinePercent(0.5f); + } cardIdString = loyaltyCard.cardId; barcodeIdString = loyaltyCard.barcodeId; diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index d2b0f9319..84d2ced33 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -195,9 +195,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard @Override public void onTabSelected(TabLayout.Tab tab) { selectedTab = tab.getPosition(); + Log.d("onTabSelected","Tab Position "+tab.getPosition()); mGroup = tab.getTag(); updateLoyaltyCardList(); - // Store active tab in Shared Preference to restore next app launch SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences( getString(R.string.sharedpreference_active_tab), @@ -230,6 +230,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard mHelpText.setOnTouchListener(gestureTouchListener); mNoMatchingCardsText.setOnTouchListener(gestureTouchListener); mCardList.setOnTouchListener(gestureTouchListener); + mNoGroupCardsText.setOnTouchListener(gestureTouchListener); mAdapter = new LoyaltyCardCursorAdapter(this, null, this); mCardList.setAdapter(mAdapter); @@ -633,6 +634,12 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard } + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + mGestureDetector.onTouchEvent(ev); + return super.dispatchTouchEvent(ev); + } + @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.d(TAG, "On fling"); @@ -648,9 +655,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard } Integer currentTab = groupsTabLayout.getSelectedTabPosition(); - + Log.d("onFling","Current Tab "+currentTab); // Swipe right if (velocityX < -150) { + Log.d("onFling","Right Swipe detected "+velocityX); Integer nextTab = currentTab + 1; if (nextTab == groupsTabLayout.getTabCount()) { @@ -664,6 +672,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard // Swipe left if (velocityX > 150) { + Log.d("onFling","Left Swipe detected "+velocityX); Integer nextTab = currentTab - 1; if (nextTab < 0) { diff --git a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java index 4afe49841..119443bba 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java @@ -6,6 +6,7 @@ import android.graphics.Bitmap; import net.lingala.zip4j.io.outputstream.ZipOutputStream; import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.EncryptionMethod; import net.lingala.zip4j.util.InternalZipConstants; import org.apache.commons.csv.CSVFormat; @@ -30,14 +31,21 @@ import protect.card_locker.Utils; */ public class CatimaExporter implements Exporter { - public void exportData(Context context, DBHelper db, OutputStream output) throws IOException, InterruptedException + public void exportData(Context context, DBHelper db, OutputStream output,char[] password) throws IOException, InterruptedException { // Necessary vars int readLen; byte[] readBuffer = new byte[InternalZipConstants.BUFF_SIZE]; // Create zip output stream - ZipOutputStream zipOutputStream = new ZipOutputStream(output); + ZipOutputStream zipOutputStream; + + if(password!=null && password.length>0){ + zipOutputStream = new ZipOutputStream(output,password); + } + else{ + zipOutputStream = new ZipOutputStream(output); + } // Generate CSV ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream(); @@ -45,8 +53,7 @@ public class CatimaExporter implements Exporter writeCSV(db, catimaOutputStreamWriter); // Add CSV to zip file - ZipParameters csvZipParameters = new ZipParameters(); - csvZipParameters.setFileNameInZip("catima.csv"); + ZipParameters csvZipParameters = createZipParameters("catima.csv",password); zipOutputStream.putNextEntry(csvZipParameters); InputStream csvInputStream = new ByteArrayInputStream(catimaOutputStream.toByteArray()); while ((readLen = csvInputStream.read(readBuffer)) != -1) { @@ -71,8 +78,7 @@ public class CatimaExporter implements Exporter // If it exists, add to the .zip file Bitmap image = Utils.retrieveCardImage(context, card.id, front); if (image != null) { - ZipParameters imageZipParameters = new ZipParameters(); - imageZipParameters.setFileNameInZip(Utils.getCardImageFileName(card.id, front)); + ZipParameters imageZipParameters = createZipParameters(Utils.getCardImageFileName(card.id, front),password); zipOutputStream.putNextEntry(imageZipParameters); InputStream imageInputStream = new ByteArrayInputStream(Utils.bitmapToByteArray(image)); while ((readLen = imageInputStream.read(readBuffer)) != -1) { @@ -86,6 +92,16 @@ public class CatimaExporter implements Exporter zipOutputStream.close(); } + private ZipParameters createZipParameters(String fileName, char[] password){ + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setFileNameInZip(fileName); + if(password!=null && password.length>0){ + zipParameters.setEncryptFiles(true); + zipParameters.setEncryptionMethod(EncryptionMethod.AES); + } + return zipParameters; + } + private void writeCSV(DBHelper db, OutputStreamWriter output) throws IOException, InterruptedException { CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180); diff --git a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java index ce1273373..0c42f5210 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java @@ -48,7 +48,7 @@ public class CatimaImporter implements Importer bufferedInputStream.mark(100); // First, check if this is a zip file - ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream); + ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream,password); boolean isZipFile = false; diff --git a/app/src/main/java/protect/card_locker/importexport/Exporter.java b/app/src/main/java/protect/card_locker/importexport/Exporter.java index 6f70f6d80..ad4928030 100644 --- a/app/src/main/java/protect/card_locker/importexport/Exporter.java +++ b/app/src/main/java/protect/card_locker/importexport/Exporter.java @@ -17,5 +17,5 @@ public interface Exporter * Export the database to the output stream in a given format. * @throws IOException */ - void exportData(Context context, DBHelper db, OutputStream output) throws IOException, InterruptedException; + void exportData(Context context, DBHelper db, OutputStream output,char[] password) throws IOException, InterruptedException; } diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java index 8e95c49c4..b45cf1eda 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java @@ -22,7 +22,7 @@ public class MultiFormatExporter * another ImportExportResult otherwise. If not Success, partial data may have been * written to the output stream, and it should be discarded. */ - public static ImportExportResult exportData(Context context, DBHelper db, OutputStream output, DataFormat format) + public static ImportExportResult exportData(Context context, DBHelper db, OutputStream output, DataFormat format,char[] password) { Exporter exporter = null; @@ -40,7 +40,7 @@ public class MultiFormatExporter { try { - exporter.exportData(context, db, output); + exporter.exportData(context, db, output,password); return ImportExportResult.Success; } catch(IOException e) diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index b3be826d2..63b4bd844 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -116,14 +116,14 @@ public class StocardImporter implements Importer .substring("/loyalty-card-providers/".length()) ); - try { + if (jsonObject.has("input_barcode_format")) { loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "barcodeType", jsonObject.getString("input_barcode_format") ); - } catch (JSONException ignored) {} + } } } else if (fileName.endsWith("notes/default.json")) { loyaltyCardHashMap = appendToLoyaltyCardHashMap( diff --git a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java index 1bf4d8df1..3e88fb87e 100644 --- a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java +++ b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java @@ -1,6 +1,7 @@ package protect.card_locker.preferences; +import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; @@ -41,7 +42,6 @@ public class SettingsActivity extends CatimaAppCompatActivity // Display the fragment as the main content. SettingsFragment fragment = new SettingsFragment(); - fragment.setParentReference(this); getSupportFragmentManager().beginTransaction() .replace(R.id.settings_container, fragment) .commit(); @@ -64,11 +64,6 @@ public class SettingsActivity extends CatimaAppCompatActivity public static class SettingsFragment extends PreferenceFragmentCompat { private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment"; - private SettingsActivity parent; - - public void setParentReference(SettingsActivity settingsActivity) { - parent = settingsActivity; - } @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { @@ -120,8 +115,9 @@ public class SettingsActivity extends CatimaAppCompatActivity }); localePreference.setOnPreferenceChangeListener((preference, newValue) -> { // Refresh the activity - parent.finish(); - startActivity(parent.getIntent()); + Intent intent = new Intent(getContext(), SettingsActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + getContext().startActivity(intent); return true; }); 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 1201fddd4..634dc05b3 100644 --- a/app/src/main/res/layout/loyalty_card_edit_activity.xml +++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml @@ -68,7 +68,7 @@ android:paddingTop="@dimen/inputPadding" android:orientation="horizontal"> - - + - - + @@ -382,7 +382,7 @@ android:paddingTop="@dimen/inputPadding"> - - + diff --git a/app/src/main/res/layout/loyalty_card_layout.xml b/app/src/main/res/layout/loyalty_card_layout.xml index c1f94cb4b..0456b8340 100644 --- a/app/src/main/res/layout/loyalty_card_layout.xml +++ b/app/src/main/res/layout/loyalty_card_layout.xml @@ -25,7 +25,7 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - + в Google Play и използване на данни Помогнете за превода на приложението - \ No newline at end of file + + diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml new file mode 100644 index 000000000..665bfbff0 --- /dev/null +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -0,0 +1,90 @@ + + + সংরক্ষণ + বাতিল + তারা মুক্ত + তারা + বারকোড না বারকোড + বারকোড ধরন + বিঃদ্রঃ + দোকানের নাম + কোন ম্যাচিং উপহার কার্ড নেই + উপহার কার্ড নেই + কর্ম যোগ + সব + গোষ্ঠী কার্ড নেই + গোষ্ঠীগুলি নেই + গোষ্ঠীগুলি + গোষ্ঠী নাম লিখুন + রপ্তানি সফল + আগম সফল + url শেয়ার টেক্সট থেকে ইন্টেন্ট ইম্পোর্ট কার্ড + কার্ড দেখা কালিন লকস্ক্রিন নিষ্ক্রিয় + সেটিংস পর্দা খোলা রাখুন + তালাবদ্ধ বার কোড অভিযোজন + সর্বোচ্চ হরফ আকার + সাদাটে থিম + যন্ত্রর থিম + থিম + বিভাগ শিরোনাম + তারা ছবি + ক্যাতিনা আগম + আমদানি লয়্যালটি কার্ড কীচেন + স্টো কার্ড আমদানি করুন + আমদানি ভাউচার ভল্ট + বারকোড আইডি + কার্ড আইডির মতো + বারকোড আইডি সেট করুন + অসমর্থিত বারকোড টাইপ + বারকোড টাইপের জন্য ভুল মান + ক্লিপবোর্ড একাধিক টোস্টে অনুলিপি করুন + url থেকে ইন্টেন্ট ইম্পোর্ট কার্ড একাধিক টেক্সট শেয়ার করে + সামনের চিত্রের বর্ণনা + পিছনের চিত্রের বর্ণনা + ছবি + সদর ছবি স্থাপন + পিছনের ছবি স্থাপন + ছবি অপসারণ + ছবি নেত্তয়া + হালনাগাদ বারকোড প্রশ্ন শিরোনাম + হালনাগাদ বারকোড প্রশ্ন টেক্সট + হাঁ + না + পাসওয়ার্ড প্রয়োজন + শেয়ার ইউআরএল তৈরি করতে ব্যর্থ হয়েছে + টর্চলাইট চালু করুন + টর্চলাইট বন্ধ করুন + লোকেল + সিস্টেম লোকেল + থিম রঙ + কটিমা থিম + গোলাপী থিম + ম্যাজেন্টা থিম + ভায়োলেট থিম + নীল থিম + আকাশী নীল থিম + সবুজ থিম + বাদামী থিম + সাজান + আরও তথ্য টগল করুন + ছবি পরিবর্তন করতে সোয়াইপ করুন + নামের দ্বারা সাজান + সর্বাধিক সম্প্রতি ব্যবহৃত দ্বারা সাজান + মেয়াদ শেষ করে সাজান + বিপরীত + ক্রমানুসার + কোন কার্ড নেই ত্রুটি + স্টোরেজ ত্রুটি নেই + কার্ড আইডি কপি করা হয়েছে + কোন কার্ড বার্তা নেই + কার্ডের শিরোনাম যোগ করুন + কার্ডের শিরোনাম সম্পাদনা করুন + লেবেল পাঠান + ভাগ + নকল করুন ক্লিপবোর্ড এ + নিশ্চিতকরণ মুছে দিন + পর্দা আনলক করুন + নিশ্চিত করুন + মুছে ফেলুন + সম্পাদনা + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index af7f0f7c9..32e2aba63 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -46,7 +46,7 @@ Beliebige Anwendung oder deinen bevorzugten Dateimanager zur Dateiauswahl verwenden. Aus anderer Anwendung Über - Freie Software, lizensiert unter der GPLv3+. + Freie Software, lizensiert unter der GPLv3+ Über %s Version: %s Revisionsinfo: %s @@ -66,7 +66,7 @@ Farbschema Gib die Kartennummer ein und wähle entweder den Barcode-Typ unten oder wähle \"Diese Karte hat keinen Barcode\" aus. Basierend auf Loyalty Card Keychain -\nCopyright © 2016-2020 Branden Archer. +\nCopyright © 2016-2020 Branden Archer Die Daten werden an einen Ort deiner Wahl geschrieben. Die Import-URI konnte nicht verarbeitet werden Teilen @@ -117,16 +117,16 @@ Annehmen Datenschutzrichtlinie Wählen Sie Ihren vouchervault.json-Export aus Voucher Vault zum Importieren aus. -\nOder erstellen Sie ihn, indem Sie zuerst auf Export in Voucher Vault drücken. +\nErstellen Sie ihn, indem Sie zuerst auf Export in Voucher Vault drücken. Aus Voucher Vault importieren Wählen Sie Ihren LoyaltyCardKeychain.csv-Export aus Loyalty Card Keychain zum Importieren aus. -\nOder erstellen Sie ihn über das Menü Import/Export in Loyalty Card Keychain, indem Sie dort zuerst auf Export drücken. +\nErstellen Sie ihn über das Menü Import/Export in Loyalty Card Keychain, indem Sie dort zuerst auf Export drücken. Aus Loyalty Card Keychain importieren Wählen Sie Ihren fidme-export-request-xxxxxx.zip-Export aus FidMe zum Importieren aus und wählen Sie anschließend die Strichcodetypen manuell aus. \nOder erstellen Sie ihn aus Ihrem FidMe-Profil, indem Sie Datenschutz wählen und dann zuerst auf Meine Daten extrahieren drücken. Aus FidMe importieren Wählen Sie Ihren catima.zip-Export aus Catima zum Importieren aus. -\nOder erstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken. +\nErstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken. Aus Catima importieren Manuell eingeben Entspricht Kartennummer @@ -139,7 +139,7 @@ Der Wert ist für den gewählten Barcodetyp leider nicht gültig Freie Ressourcen von Drittanbietern: %s Freie Bibliotheken von Drittanbietern: %s - Copyright © 2019–%d Sylvia van Os. + Copyright © 2019–%d Sylvia van Os Ich möchte diese Karten mit dir teilen Kartennummern in die Zwischenablage kopiert Kartennummer(n) kopiert @@ -156,7 +156,7 @@ Bild der Kartenrückseite Bitte gib das Passwort ein Wählen Sie Ihren ***-sync.zip-Export aus Stocard zum Importieren aus. -\nOder Sie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten. +\nSie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten. Von Stocard importieren Licht ausschalten Licht einschalten @@ -198,4 +198,16 @@ Name Sortieren Umgekehrt + Versionshistorie + Dank an + Hilfe bei der Übersetzung + und Datennutzung + Bewerte die Anwendung + auf Google Play + Lizenz + Quellcode + auf GitHub + Fehler melden + Legen Sie ein Passwort fest, um Ihren Export zu schützen (optional) + Passwort eingeben \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ee4353f7a..dc2cb44ec 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -200,12 +200,14 @@ Solde Signaler une erreur sur Google Play - Notez cette app + Notez cette appli utilisation des données sur GitHub Dépôt source Licence - Aidez à traduire cette app + Aidez à traduire cette appli Contributeurs Historique des versions + Définissez un mot de passe pour protéger vos exportations (facultatif) + Entrez le mot de passe \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 325f5ab96..64f0a7147 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -47,7 +47,7 @@ Usa qualsiasi app o il tuo gestore di file preferito per aprire un file. Usa un’altra app Informazioni - Software libero con copyleft, licenza GPLv3+. + Software libero con copyleft, licenza GPLv3+ Informazioni su %s Versione: %s Informazioni sulla revisione: %s @@ -67,7 +67,7 @@ Dati della carta importati Dati della carta importati Basato su Loyalty Card Keychain -\ncopyright © 2016–2020 Branden Archer. +\ncopyright © 2016–2020 Branden Archer I dati verranno scritti in una posizione a tua scelta. Tipo di codice a barre Rimuovi dai preferiti @@ -116,16 +116,16 @@ \nNESSUN DATO VIENE RACCOLTO, cosa che chiunque può confermare dato che la nostra applicazione è un software libero. Informativa sulla riservatezza Seleziona la tua esportazione vouchervault.json da Voucher Vault da importare. -\nOppure crealo premendo prima Esporta in Voucher Vault. +\nCrealo premendo prima Esporta in Voucher Vault. Importa da Voucher Vault Seleziona la tua esportazione LoyaltyCardKeychain.csv da Loyalty Card Keychain per importarla. -\nOppure createlo dal menù Importazione/Esportazione in Loyalty Card Keychain premendo prima su Esporta. +\nCreatelo dal menù Importazione/Esportazione in Loyalty Card Keychain premendo prima su Esporta. Importa da Loyalty Card Keychain Seleziona la tua esportazione fidme-export-request-xxxxxx.zip da FidMe per importare, e seleziona i tipi di codice a barre manualmente dopo. -\nOppure crearlo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima. +\nCrearlo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima. Importa da FidMe Seleziona la tua esportazione catima.zip da Catima per importarla. -\nOppure crealo dal menù Importazione/Esportazione di un\'altra applicazione Catima premendo prima Esporta. +\nCrealo dal menù Importazione/Esportazione di un\'altra applicazione Catima premendo prima Esporta. Importa da Catima Imposta il valore del codice a barre Uguale all\'ID della carta @@ -138,7 +138,7 @@ Il valore non è valido per il tipo di codice a barre selezionato Risorse libre di terze parti: %s Librerie libre di terze parti: %s - Copyright © 2019–%d Sylvia van Os. + Copyright © 2019–%d Sylvia van Os Voglio condividere alcune carte con te Numeri delle carte copiati negli appunti Numero/i della carta copiato/i @@ -155,7 +155,7 @@ Immagine frontale della carta Si prega di inserire la password Seleziona la tua esportazione ***-sync.zip da Stocard per importare. -\nOppure ottenerlo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati. +\nOttienilo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati. Importa da Stocard Spegni la torcia Accendi la torcia @@ -198,4 +198,16 @@ Usate più di recente Nome Ordina + Licenza + Repository fonti + su GitHub + Inserisci la password + su Google Play + Imposta una password per proteggere la tua esportazione (opzionale) + Cronologia delle versioni + Crediti + Aiuta a tradurre questa app + e utilizzo dei dati + Valuta questa applicazione + Segnala un errore \ No newline at end of file diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 4621cdcc5..9a7e96fdd 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -25,7 +25,7 @@ Eksportuoja… Pirmiausia suteikite išorinės saugyklos leidimą, kad galėtumėte importuoti arba eksportuoti korteles Apie - Copylefted libre programinė įranga, licencijuota GPLv3+. + Copylefted libre programinė įranga, licencijuota GPLv3+ Apie %s Versija: %s Revizijos info: %s @@ -45,10 +45,10 @@ Ieškoti Kortelės sparčioji nuoroda Pasirinkite savo vouchervault.json eksportą iš Voucher Vault, kurį norite importuoti. -\nArba sukurkite jį pirmiausia paspausdami Eksportuoti Voucher Vault. +\nSukurkite jį pirmiausia paspausdami Eksportuoti Voucher Vault. Importuoti iš Voucher Vault Pasirinkite savo LoyaltyCardKeychain.csv eksportą iš Loyalty Card Keychain, kurį norite importuoti. -\nArba sukurkite jį iš Loyalty Card Keychain meniu Importas/Eksportas, pirmiausia paspausdami Eksportuoti. +\nSukurkite jį iš Loyalty Card Keychain meniu Importavimas/Eksportavimas, pirmiausia paspausdami Eksportuoti. Importuoti iš Loyalty Card Keychain Loyalty Card Keychain Panašu, kad %s reikšmė nėra tinkama. @@ -79,13 +79,13 @@ Tokia pat kaip kortelės ID Brūkšninio kodo reikšmė Pasirinkite ***-sync.zip eksportą iš Stocard, kad galėtumėte importuoti. -\nArba gaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis. +\nGaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis. Importuoti iš Stocard Pasirinkite fidme-export-request-xxxxxx.zip eksportą iš FidMe, kurį norite importuoti, ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu. -\nArba sukurkite jį iš savo FidMe profilio, pasirinkę Duomenų apsauga ir pirmiausia paspaudę Išgauti mano duomenis. +\nSukurkite jį iš savo FidMe profilio, pasirinkę Duomenų apsauga ir pirmiausia paspaudę Išgauti mano duomenis. Importuoti iš FidMe - Norėdami importuoti, pasirinkite savo catima.zip eksportą iš Catima. -\nArba sukurkite ją iš kitos Catima programos importavimo / eksportavimo meniu, pirmiausia paspausdami Eksportuoti ten. + Norėdami importuoti, pasirinkite savo catima.zip eksportavimą iš Catima. +\nSukurkite ją iš kitos Catima programos importavimo / eksportavimo meniu, pirmiausia ten paspausdami Eksportuoti. Importuoti iš Catima Priimti Privatumo politikos pranešimas (kurio reikalaujama kai kuriose programėlių parduotuvėse): @@ -145,8 +145,8 @@ Libre trečiųjų šalių ištekliai: %s Libre trečiųjų šalių bibliotekos: %s Paremta Loyalty Card Keychain -\nautorinės teisės © 2016–2020 Branden Archer. - Autorinės teisės © 2019–%d Sylvia van Os. +\nautorinės teisės © 2016–2020 Branden Archer + Autorinės teisės © 2019–%d Sylvia van Os Naudoti kitą programą Norėdami atidaryti failą, naudokite bet kurią programą arba mėgstamą failų tvarkyklę. Naudoti kitą programą @@ -202,4 +202,14 @@ Vėliausiai naudota Pavadinimas Rikiuoti + Padėkos + Šaltinio repozitorija + ir duomenų naudojimas + Įvertinkite šią programėlę + Versijų istorija + Licencija + GitHub + Google Play + Padėkite išversti šią programėlę + Pranešti apie klaidą \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 03aa47a5a..66c81bf31 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -44,7 +44,7 @@ Bruk en hvilken som helst app, eller din favoritt-filutforsker for å åpne en fil. Bruk en annen app Om - Copyleft fri programvare, lisensiert under GPLv3+. + Gemenhetslig fri programvare, lisensiert GPLv3+ Om %s Versjon: %s Utgivelsesinfo: %s @@ -64,7 +64,7 @@ System Drakt Basert på Kundekortknippe -\nopphavsrett 2016–2020 Branden Archer. +\nopphavsrett 2016–2020 Branden Archer Kunne ikke tolke importerings-URI Del Dette kortet har ingen strekkode @@ -124,14 +124,14 @@ Sett strekkodeverdi Samme som kort-ID Strekkodeverdi - Finn en fil som antagelig heter voucher.vault.json å importere. -\nEller opprett den ved å trykke «Eksport» i Voucher Vault først. + Velg din vouchervault.json-eksport fra Voucher Vault å importere. +\nOpprett den ved å trykke «Eksport» i Voucher Vault først. Importer fra Voucher Vault - Velg din LoyaltyCardKeychain.csv - eksporter fra kundekort Nøkkelring til import. -\nEller lage det fra Import/Eksport-menyen i lojalitetskort Nøkkelringen ved å trykke på Eksport det første. + Velg din LoyaltyCardKeychain.csv-eksport fra Kundekortknippe å importere. +\nOpprett den i «Import/Eksport»-menyen i Kundekortknippe ved å trykke «Eksporter» der først. Importer fra Kundekortknippe - Velg din fidme-eksport-be-xxxxxx.zip eksporter fra FidMe til å importere, og velg strekkode typer manuelt etterpå. -\nEller lage den fra FidMe profil ved å velge Beskyttelse av Data og deretter trykke Trekke ut dataene mine første. + Velg din fidme.export-request-xxxxx.zip-eksport fra FidMe å importere, for så å velge strekkodetypene manuelt etterpå- +\nOpprett den i din FidMe-profil ved å velge «Databeskyttelse», for så å trykke «Pakk ut dataen min» først. Maks. skriftstørrelse Verdien er ikke gyldig for valgt strekkodetype Jeg vil dele noen kort med deg @@ -139,7 +139,7 @@ Frie tredjepartsressurser: %s Frie tredjepartsbibliotek: %s Kopierte kort-ID(er) - Opphavsrett © 2019–%d Sylvia van Os. + Opphavsrett © 2019–%d Sylvia van Os Du har endret kortets ID. Ønsker du å også oppdatere strekkoden til samme verdi? Nei Ja @@ -152,7 +152,7 @@ Kortets bakside Kortets forside Velg din ***-sync.zip-eksport fra Stocard å importere. -\nEller få den ved å sende e-post til support@stocardapp.com der du etterspør eksport av dataen din. +\nSkaff den ved å sende e-post til support@stocardapp.com der du etterspør eksport av dataen din. Skriv inn passordet Importer fra Stocard Klarte ikke å lage delbar nettadresse. Rapporter denne feilen. @@ -162,8 +162,8 @@ Slett dette kortet for godt? - Slett dette kortet for godt? - Slett disse %s kortene for godt? + Slett dette kortet for godt\? + Slett disse %d kortene for godt\? Skru på lommelykten Skru av lommelykten @@ -199,11 +199,15 @@ Hjelp med å oversette denne appen Lisens Versjonshistorikk - Velg din catima.zip fra Catima å importere. Eller lag den fra Importer/Eksporter-menyen i en annen Catima-app ved å trykke på \"Eksporter\" der først + Velg din catima.zip-eksport fra Catima å importere. +\nOpprett den fra «Importer/Eksporter»-menyen i en annen Catima-app ved å trykke på «Eksporter» der først Kildekode på GitHub og bruk av data Vurder denne appen på Google Play Rapporter feil - + Bidragsytere + Sett et passord for å beskytte eksporten din (valgfritt) + Skriv inn passord + \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 42d304610..9bd6f9fc6 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -116,15 +116,15 @@ Privacybeleid Accepteren Kies het te importeren vouchervault.json-exportbestand. -\nOf ga naar het exportmenu van Voucher Vault om een exportbestand samen te stellen. +\nGa naar het exportmenu van Voucher Vault om een exportbestand samen te stellen. Importeren uit Voucher Vault Kies het te importeren genaamd LoyaltyCardKeychain.csv-exportbestand. -\nOf ga naar het import-/exportmenu van Klantenkaartkluis om een exportbestand samen te stellen. +\nGa naar het import-/exportmenu van Klantenkaartkluis om een exportbestand samen te stellen. Importeren uit Klantenkaartkluis Kies het te importeren fidme-export-request-xxxxxx.zip-exportbestand en kies nadien de juiste barcodes. -\nOf ga naar je FidMe-profiel en druk op ‘Gegevensbescherming’ om een exportbestand samen te stellen. +\nGa naar je FidMe-profiel en druk op ‘Gegevensbescherming’ om een exportbestand samen te stellen. Kies het te importeren Catima.zip-exportbestand. -\nOf ga naar het import-/exportmenu van Catima op een ander apparaat om een exportbestand samen te stellen. +\nGa naar het import-/exportmenu van Catima op een ander apparaat om een exportbestand samen te stellen. Importeren uit FidMe Importeren uit Catima De afbeelding kan niet worden uitgelezen @@ -155,7 +155,7 @@ Voorzijde van de kaart Voer het wachtwoord in Kies het te importeren Stocard-exportbestand genaamd ***-sync.zip. -\nOf stuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand. +\nStuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand. Importeren uit Stocard De te delen link kan niet worden gegenereerd. Meld deze fout. Zaklamp uitzetten @@ -208,4 +208,6 @@ Help deze app te vertalen Met dank aan Versiegeschiedenis - + Voer een wachtwoord in + Stel een wachtwoord in om je exportbestand te beveiligen (optioneel) + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2a7bd8e79..bc6b1a1a2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -54,7 +54,7 @@ Версия: %s Информация о версиях: %s Выбор штрих-кода - Введите номер карты и выберите тип штрих-кода. Или выберите \"Эта карта без штрих-кода\". + Введите номер карты и выберите тип штрих-кода (или выберите \"Эта карта без штрих-кода\"). Номер карты скопирован в буфер обмена Логотип карты Настройки @@ -216,4 +216,6 @@ Исходный код Лицензия Помощь в переводе приложения + Защитить файл экспорта паролем (необязательно) + Введите пароль \ No newline at end of file diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 8a0944a57..b3309b865 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -25,7 +25,7 @@ Te kartice zvestobe ni bilo moč najti Uvozi/izvozi Izvozi - Varnostna kopija omogoča varen prenos kartic na druge telefonske naprave. + Varnostna kopija omogoča varen prenos kartic na druge naprave. Uvoz je bil uspešen Uvoz ni uspel Napaka pri uvozu @@ -39,7 +39,7 @@ Izberite specifično datoteko iz datotečnega sistema. Iz datotečnega sistema Uporabi zunanjo aplikacijo - Uporabi zunanjo aplikacijo, kot npr. Dropbox, Google Drive ali ostale upravljalnike datotek, za odpiranje datoteko. + Uporabi zunanjo aplikacijo, kot npr. Dropbox, Google Drive ali ostale upravljalnike datotek, za odpiranje datoteke. Uporabi zunanjo aplikacijo Več o aplikaciji Licencirano s skladu z GPLv3. @@ -57,7 +57,7 @@ Prosim potrdite, če želite izbrisati to kartico\? Kartica Izberite sliko iz galerije - Ročno vnesite ID kartice + Ročno vnesite št. kartice Zapustite brez shranjevanja\? Izhod Premikanje navzdol @@ -71,18 +71,17 @@ Vnesite ime skupine Izvoženi podatki o karticah Uvoženi podatki o karticah - Želim z vami deliti kartico + Z vami želim deliti kartico Preprečitev zaklepanja zaslona Ohranite zaslon vklopljen Vnesite ID kartice in spodaj izberite vrsto črtne kode ali \"Ta kartica nima črtne kode\". Največja velikost pisave Temno - Luč + Svetlo Sistem Tema - Najljubša zvezda - Na podlagi kartice zvestobe obesek za ključe -\ncopyright © 2016-2020 Branden Archer. + Zvezdica za priljubljene + Na podlagi aplikacije Loyalty Card Keychain copyright © 2016-2020 Branden Archer. Podatki bodo zapisani na izbrano mesto. Ni bilo mogoče razčleniti URI uvoza Kopirana kartica ID(s) @@ -94,4 +93,72 @@ Vrsta črtne kode Ničesar nisem našel. Poskusite spremeniti iskanje. Iskanje + Vnesite geslo + Izberite geslo za zaščito izvoza (neobvezno) + Pomagajte pri prevajanju aplikacije + Zgodovina različic + Rjava + Siva + Zelena + Sinje modra + Modra + Vijolična + Magenta + Roza + Barva teme + Sistem + Jezik + Slika črtne kode tipa %s + Povlecite ali dolgo pritisnite da zamenjate slike + Razvrsti po + Obratno + Stanje + Potek + Nazadnje uporabljene + Ime + Razvrsti + Licence + na GitHubu + Ocenite aplikacijo + Prijavite napako + na Trgovini Google Play + in uporaba podatkov + Izvorna koda + Točke + Valuta + Stanje na računu + Slike ni bilo mogoče prebrati + Črtna koda ni bila najdena + %s točk + Stanje: %s + Uvoz iz? + Izvoz iz aplikacije Catima + Izvoz iz aplikacije Stocard + Izvoz iz aplikacije Voucher Vault + Politika zasebnosti + Izklop svetilke + Vklop svetilke + Vnesite geslo + Sprejmi + Uvoz iz aplikacije Loyalty Card Keychain + Vsebina črtne kode + Enaka kot številka kartice + Nastavi vsebino črtne kode + Ta vrednost ni veljavna pri izbranem tipu čtne kode + Naredi fotografijo + Z vami želim deliti kartice zvestobe + Številke kartic kopirane v odložišče + Uvoz iz aplikacije FidMe + Ne + Da + Slika sprednje strani + Slika zadnje strani + %s ni veljavno stanje. + Nastavi sliko sprednje strani + Nastavi sliko sprednje strani + Fotografije + Spremenili ste številko kartice. Želite posodobiti tudi črtno kodo na enako vrednost? + Posodobi črtno kodo? + Odstrani sliko + Te vrste črtne kode aplikacija ne more prikazati. Morda bo to možno v prihodnosti. \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3e6f66467..62f5904e9 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -5,8 +5,8 @@ Max. teckenstorlek Håll skärmen påslagen Ange kortets ID och välj antingen streckkodstyp nedan, eller \"Detta kort har ingen streckkod\". - Välj den exporterade fidme-export-request-xxxxxx.zip från FidMe som du vill importera och välj streckkodstyper manuellt efteråt, -\neller skapa en från din FidMe-profil först genom att välja \"Data Protection\" och sen trycka på \"Extract my data\". + Välj den exporterade fidme-export-request-xxxxxx.zip från FidMe som du vill importera och välj streckkodstyper manuellt efteråt. +\nSkapa den från din FidMe-profil först genom att välja \"Data Protection\" och sen trycka på \"Extract my data\". Använd vilken app som helst eller den filhanterare du föredrar för att öppna en fil. Använd en annan app Jag vill dela ett kort med dig @@ -21,12 +21,12 @@ %d kort valda Loyalty Card Keychain - Välj den exporterade LoyaltyCardKeychain.csv från Loyalty Card Keychain som du vill importera, -\neller skapa en från Import/Export-menyn i Loyalty Card Keychain först genom att trycka på Exportera. - Välj den exporterade vouchervault.json från Voucher Vault som du vill importera, -\neller skapa en först genom att trycka på Exportera i Voucher Vault. - Välj den exporterade ***-sync.zip från Stocard som du vill importera, -\neller skaffa en först genom att skicka e-post till support@stocardapp.com och be om att få dina data exporterade. + Välj den exporterade LoyaltyCardKeychain.csv från Loyalty Card Keychain som du vill importera. +\nSkapa den från Import/Export-menyn i Loyalty Card Keychain först genom att trycka på Exportera. + Välj den exporterade vouchervault.json från Voucher Vault som du vill importera. +\nSkapa den först genom att trycka på Exportera i Voucher Vault. + Välj den exporterade ***-sync.zip från Stocard som du vill importera. +\nSkaffa den först genom att skicka e-post till support@stocardapp.com och be om att få dina data exporterade. Ange gruppnamn Grupper @@ -90,8 +90,8 @@ Version: %s Om %s Baserad på Loyalty Card Keychain -\ncopyright © 2016–2020 Branden Archer. - Copyright © 2019–%d Sylvia van Os. +\ncopyright © 2016–2020 Branden Archer + Copyright © 2019–%d Sylvia van Os Om Använd en annan app Från filsystemet @@ -158,7 +158,7 @@ Välj förfallodatum Förfallodatum Favoritstjärna - Copyleftad fri programvara, under GPLv3+-licens. + Copyleftad fri programvara, under GPLv3+-licens Fria tredjepartsresurser: %s Fria tredjepartsbibliotek: %s %s verkar inte vara ett giltigt saldo. @@ -166,8 +166,8 @@ Saldo: %s Förhindra skärmlåsning Förhindra rotation - Välj den exporterade catima.zip från Catima som du vill importera, -\neller skapa en från Import/Export-menyn i en annan Catima-app genom att trycka på Exportera där först. + Välj den exporterade catima.zip från Catima som du vill importera. +\nSkapa den från Import/Export-menyn i en annan Catima-app genom att trycka på Exportera där först. Giltigt till: %s Kortdata exporterad Kortdata importerad @@ -198,4 +198,12 @@ Senast använda Namn Sortera + Licens + och dataanvändning + Betygsätt den här appen + på Google Play + Rapportera ett fel + Versionshistorik + Hjälp till med översättningen av appen + på GitHub \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 2f0d2f61e..a851327d0 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -208,4 +208,6 @@ Bu uygulamayı çevirmeye yardımcı olun Emeği Geçenler Sürüm Geçmişi + Dışa aktarmanızı korumak için bir parola belirleyin (isteğe bağlı) + Parola girin \ 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 aa689bccb..4e14f6b22 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -196,6 +196,8 @@ Yes No Please enter the password + Set a password to protect your export (optional) + Enter password Could not generate sharable URL. Please report this. Turn flashlight on Turn flashlight off @@ -243,4 +245,4 @@ Rate this app on Google Play Report Error - \ No newline at end of file + diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 41374d496..230faef6f 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -334,7 +334,7 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null); assertEquals(ImportExportResult.Success, result); outStream.close(); @@ -354,6 +354,39 @@ public class ImportExportTest TestHelpers.getEmptyDb(activity); } + public void multipleCardsExportImportPasswordProtected() throws IOException + { + final int NUM_CARDS = 10; + List passwords = Arrays.asList(null, "123456789".toCharArray()); + for(char[] password : passwords){ + addLoyaltyCards(NUM_CARDS); + + ByteArrayOutputStream outData = new ByteArrayOutputStream(); + OutputStreamWriter outStream = new OutputStreamWriter(outData); + + // Export data to CSV format + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,password); + assertEquals(ImportExportResult.Success, result); + outStream.close(); + + TestHelpers.getEmptyDb(activity); + + ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); + + // Import the CSV data + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, password); + assertEquals(ImportExportResult.Success, result); + + assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); + + checkLoyaltyCards(); + + // Clear the database for the next format under test + TestHelpers.getEmptyDb(activity); + } + + } + @Test public void multipleCardsExportImportSomeStarred() throws IOException { @@ -365,7 +398,7 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null); assertEquals(ImportExportResult.Success, result); outStream.close(); @@ -438,7 +471,7 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null); assertEquals(ImportExportResult.Success, result); outStream.close(); @@ -482,7 +515,7 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export into CSV data - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null); assertEquals(ImportExportResult.Success, result); outStream.close(); @@ -513,7 +546,7 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null); assertEquals(ImportExportResult.Success, result); TestHelpers.getEmptyDb(activity); @@ -560,8 +593,9 @@ public class ImportExportTest TestTaskCompleteListener listener = new TestTaskCompleteListener(); // Export to the file + final String password = "123456789"; FileOutputStream fileOutputStream = new FileOutputStream(exportFile); - ImportExportTask task = new ImportExportTask(activity, DataFormat.Catima, fileOutputStream, listener); + ImportExportTask task = new ImportExportTask(activity, DataFormat.Catima, fileOutputStream,password.toCharArray(), listener); task.execute(); // Actually run the task to completion @@ -579,7 +613,7 @@ public class ImportExportTest FileInputStream fileStream = new FileInputStream(exportFile); - task = new ImportExportTask(activity, DataFormat.Catima, fileStream, null, listener); + task = new ImportExportTask(activity, DataFormat.Catima, fileStream, password.toCharArray(), listener); task.execute(); // Actually run the task to completion @@ -901,7 +935,7 @@ public class ImportExportTest // Export everything ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - MultiFormatExporter.exportData(activity.getApplicationContext(), db, outputStream, DataFormat.Catima); + MultiFormatExporter.exportData(activity.getApplicationContext(), db, outputStream, DataFormat.Catima,null); // Wipe database TestHelpers.getEmptyDb(activity); diff --git a/bors.toml b/bors.toml new file mode 100644 index 000000000..d36046a52 --- /dev/null +++ b/bors.toml @@ -0,0 +1,2 @@ +status = [ 'build' ] +delete_merged_branches = true diff --git a/build.gradle b/build.gradle index 4f2af7dc8..37a0187d5 100644 --- a/build.gradle +++ b/build.gradle @@ -9,8 +9,8 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.2' - classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.0' + classpath 'com.android.tools.build:gradle:7.0.3' + classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.5' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/docs/README.md b/docs/README.md index 37ea6c020..774ecac2c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,6 +4,7 @@ Copylefted libre software (GPLv3+) card management app. [![GitHub Version](https://img.shields.io/github/v/release/TheLastProject/Catima.svg?logo=github&label=GitHub)](https://github.com/TheLastProject/Catima/releases) [![F-Droid Version](https://img.shields.io/f-droid/v/me.hackerchick.catima.svg?logo=f-droid&label=F-Droid)](https://f-droid.org/packages/me.hackerchick.catima/) +[![IzzyOnDroid Version](https://img.shields.io/endpoint?url=https://apt.izzysoft.de/fdroid/api/v1/shield/me.hackerchick.catima)](https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima) [![Google Play Store Version](https://img.shields.io/endpoint?color=blue&logo=google-play&url=https%3A%2F%2Fplayshields.herokuapp.com%2Fplay%3Fi%3Dme.hackerchick.catima%26l%3DGoogle%2520Play%26m%3D%24version)](https://play.google.com/store/apps/details?id=me.hackerchick.catima) ![Android CI](https://github.com/TheLastProject/Catima/workflows/Android%20CI/badge.svg) diff --git a/fastlane/metadata/android/bg/changelogs/86.txt b/fastlane/metadata/android/bg/changelogs/86.txt new file mode 100644 index 000000000..148ac9c7c --- /dev/null +++ b/fastlane/metadata/android/bg/changelogs/86.txt @@ -0,0 +1 @@ +- Подобрено е търсенето, съдържащо знак за интервал diff --git a/fastlane/metadata/android/cs_CZ/changelogs/86.txt b/fastlane/metadata/android/cs_CZ/changelogs/86.txt new file mode 100644 index 000000000..2a0f60780 --- /dev/null +++ b/fastlane/metadata/android/cs_CZ/changelogs/86.txt @@ -0,0 +1 @@ +- Zlepšení vyhledávání obsahující mezery diff --git a/fastlane/metadata/android/cs_CZ/changelogs/87.txt b/fastlane/metadata/android/cs_CZ/changelogs/87.txt new file mode 100644 index 000000000..5c4c3a155 --- /dev/null +++ b/fastlane/metadata/android/cs_CZ/changelogs/87.txt @@ -0,0 +1 @@ +- Oprava regrese narušující import/export diff --git a/fastlane/metadata/android/cs_CZ/changelogs/88.txt b/fastlane/metadata/android/cs_CZ/changelogs/88.txt new file mode 100644 index 000000000..32a33d24b --- /dev/null +++ b/fastlane/metadata/android/cs_CZ/changelogs/88.txt @@ -0,0 +1 @@ +- Oprava nesprávné migrace, která způsobila, že první karta se stala neviditelnou diff --git a/fastlane/metadata/android/en-US/changelogs/86.txt b/fastlane/metadata/android/en-US/changelogs/86.txt new file mode 100644 index 000000000..edf5cb624 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/86.txt @@ -0,0 +1 @@ +- Improve search with spaces \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/87.txt b/fastlane/metadata/android/en-US/changelogs/87.txt new file mode 100644 index 000000000..fdc077328 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/87.txt @@ -0,0 +1 @@ +- Fix regression breaking import/export \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/88.txt b/fastlane/metadata/android/en-US/changelogs/88.txt new file mode 100644 index 000000000..e63c500e3 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/88.txt @@ -0,0 +1 @@ +- Fix incorrect migration making first card become invisible \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/89.txt b/fastlane/metadata/android/en-US/changelogs/89.txt new file mode 100644 index 000000000..c76b3d372 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/89.txt @@ -0,0 +1,3 @@ +- Fix swiping between groups not working on an empty group +- Allow password-protecting exports +- Improve usage of space for QR codes \ No newline at end of file diff --git a/fastlane/metadata/android/nb-NO/title.txt b/fastlane/metadata/android/nb-NO/title.txt index ffa4058ad..a5925aaf6 100644 --- a/fastlane/metadata/android/nb-NO/title.txt +++ b/fastlane/metadata/android/nb-NO/title.txt @@ -1 +1 @@ -Catima — Den Open Source kortlommen +Catima — for kundekort, billetter og kuponger 🎴 diff --git a/fastlane/metadata/android/sv-SE/full_description.txt b/fastlane/metadata/android/sv-SE/full_description.txt index c66bd6586..f0b5d75a4 100644 --- a/fastlane/metadata/android/sv-SE/full_description.txt +++ b/fastlane/metadata/android/sv-SE/full_description.txt @@ -20,4 +20,3 @@ Med detta essentiella verktyg kan du ersätta värdelös plast med kontanter. Förenkla ditt liv och din shopping, och förlora aldrig ett papperskvitto, presentkort eller flygbiljett igen. Ta alla dina belöningar och bonusar med dig, och spara nya efter hand. - diff --git a/fastlane/metadata/android/sv-SE/title.txt b/fastlane/metadata/android/sv-SE/title.txt index 5e021b104..de3041fdc 100644 --- a/fastlane/metadata/android/sv-SE/title.txt +++ b/fastlane/metadata/android/sv-SE/title.txt @@ -1 +1 @@ -Catima — Den Open Source kortplånboken +Catima — Kortplånboken med öppen källkod diff --git a/fastlane/metadata/android/tr-TR/changelogs/86.txt b/fastlane/metadata/android/tr-TR/changelogs/86.txt new file mode 100644 index 000000000..193895b7d --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/86.txt @@ -0,0 +1 @@ +- Boşluklu aramaları iyileştir diff --git a/fastlane/metadata/android/tr-TR/changelogs/87.txt b/fastlane/metadata/android/tr-TR/changelogs/87.txt new file mode 100644 index 000000000..51c24270e --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/87.txt @@ -0,0 +1 @@ +- İçe/dışa aktarmayı bozan sorun düzeltildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/88.txt b/fastlane/metadata/android/tr-TR/changelogs/88.txt new file mode 100644 index 000000000..bac6f127f --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/88.txt @@ -0,0 +1 @@ +- İlk kartın görünmez hale gelmesine neden olan yanlış taşıma düzeltildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/89.txt b/fastlane/metadata/android/tr-TR/changelogs/89.txt new file mode 100644 index 000000000..2fee78bb4 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/89.txt @@ -0,0 +1,2 @@ +- Gruplar arasında kaydırmanın boş bir grup üzerinde çalışmaması düzeltildi +- Parola korumalı dışa aktarmalara izin ver