Compare commits

..

66 Commits

Author SHA1 Message Date
Sylvia van Os
8e452ed6bd Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-02-11 20:04:50 +01:00
Sylvia van Os
a9e574a9b4 Release Catima 2.15.2 2022-02-11 20:04:38 +01:00
Sylvia van Os
f24d11403c Merge pull request #810 from CatimaLoyalty/create-pull-request/patch-1644601552
Update Fastlane changelogs
2022-02-11 19:46:45 +01:00
TheLastProject
e1c658ac2a Update Fastlane changelogs 2022-02-11 17:45:52 +00:00
Sylvia van Os
a5901700b4 Fix crash in edit activity on locale without region 2022-02-11 18:45:28 +01:00
Sylvia van Os
bf4cd7a961 Merge pull request #807 from CatimaLoyalty/create-pull-request/patch-1644529031
Update Fastlane changelogs
2022-02-10 22:37:35 +01:00
TheLastProject
79ca5196d0 Update Fastlane changelogs 2022-02-10 21:37:10 +00:00
Sylvia van Os
b24d641aa6 Fix manual language selection not applying anywhere 2022-02-10 22:36:51 +01:00
Sylvia van Os
84051555b6 Release Catima 2.15.1 2022-02-10 17:39:39 +01:00
Sylvia van Os
48ff57d0fc Merge pull request #802 from CatimaLoyalty/create-pull-request/patch-1644510077
Update Fastlane changelogs
2022-02-10 17:23:42 +01:00
TheLastProject
3a6828b34b Update Fastlane changelogs 2022-02-10 16:21:16 +00:00
Sylvia van Os
efd36d061f Update CHANGELOG 2022-02-10 17:20:52 +01:00
bors[bot]
a5ef8ae914 Merge #801
801: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)


Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2022-02-10 11:14:04 +00:00
Allan Nordhøy
37ce61646b Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.7% (238 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-02-10 12:13:15 +01:00
bors[bot]
5e59315017 Merge #799
799: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)


Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: SC <lalocas@protonmail.com>
Co-authored-by: Still Hsu <dev@stillu.cc>
2022-02-09 16:50:40 +00:00
Still Hsu
fbed1348aa Translated using Weblate (Chinese (Traditional))
Currently translated at 3.9% (4 of 101 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/zh_Hant/
2022-02-09 15:57:11 +01:00
Still Hsu
438e9f09a3 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/zh_Hant/
2022-02-09 15:57:11 +01:00
SC
aee9176518 Translated using Weblate (Portuguese)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/pt/
2022-02-09 15:57:11 +01:00
Oğuz Ersen
70f7768cee Translated using Weblate (Turkish)
Currently translated at 58.4% (59 of 101 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-02-09 15:57:11 +01:00
solokot
bf7e35c361 Translated using Weblate (Russian)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-02-09 15:57:11 +01:00
Heimen Stoffels
71a6fb2f56 Translated using Weblate (Dutch)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-02-09 15:57:11 +01:00
Sylvia van Os
8d799fce26 Fix fastlane directory names 2022-02-08 22:02:38 +01:00
bors[bot]
ae6e98b876 Merge #798
798: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)


Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
2022-02-07 16:38:06 +00:00
Oğuz Ersen
44d8597fa5 Translated using Weblate (Turkish)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-02-07 12:56:29 +01:00
Altons
de47b7b1d2 Translated using Weblate (French)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-02-07 12:56:29 +01:00
Altons
631d65708e Translated using Weblate (German)
Currently translated at 100.0% (241 of 241 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-02-07 12:56:29 +01:00
Sylvia van Os
62ffcbc948 Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-02-06 22:53:09 +01:00
Sylvia van Os
14ef3086a4 Make spotBugs happy 2022-02-06 22:52:55 +01:00
Sylvia van Os
011b0f7ecc Merge pull request #796 from CatimaLoyalty/create-pull-request/patch-1644183457
Update Fastlane changelogs
2022-02-06 22:37:56 +01:00
TheLastProject
89eaac12d5 Update Fastlane changelogs 2022-02-06 21:37:37 +00:00
Sylvia van Os
2fbe5a821c Fix main menu item hiding logic 2022-02-06 22:37:21 +01:00
Sylvia van Os
5516acecce Release Catima 2.15.0 2022-02-06 12:49:02 +01:00
bors[bot]
6163de3086 Merge #792
792: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)


Co-authored-by: 109247019824 <stoyan@gmx.com>
2022-02-06 10:54:51 +00:00
Sylvia van Os
4658896304 Add spacing for FAB below groups 2022-02-06 11:53:08 +01:00
Sylvia van Os
e0d9e2b2dd Merge pull request #793 from CatimaLoyalty/create-pull-request/patch-1644124546
Update contributors
2022-02-06 11:50:13 +01:00
Sylvia van Os
7dd2291376 Merge pull request #786 from Kethen/colors
old color themes, ucrop color, edit button icon color by theme, ucrop toolbar font
2022-02-06 11:49:35 +01:00
TheLastProject
bc69b82029 Update contributors 2022-02-06 05:15:46 +00:00
109247019824
1502ac1923 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/bg/
2022-02-05 23:57:50 +01:00
Katharine Chui
0552acae26 spotbug 2022-02-06 03:44:20 +08:00
Katharine Chui
18e30d2726 apply dynamic color instead of leaving it as catima theme for invalid theme key 2022-02-06 03:38:28 +08:00
Sylvia van Os
1646db24df Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker 2022-02-05 16:54:49 +01:00
Sylvia van Os
6a6a8fff2b Include basic error details on import failure 2022-02-05 16:54:40 +01:00
Sylvia van Os
a0f8f6e6b5 Update label name in needs info autoclose action 2022-02-05 13:48:05 +01:00
bors[bot]
3dda3aa1a5 Merge #790
790: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)


Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Michael Moroni <michaelmoroni@disroot.org>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
2022-02-04 18:37:42 +00:00
Sylvia van Os
ac6bffcc67 Fix Norwegian translation 2022-02-04 19:37:02 +01:00
Oğuz Ersen
93fac2e726 Translated using Weblate (Turkish)
Currently translated at 58.0% (58 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/tr/
2022-02-04 17:56:31 +01:00
Oğuz Ersen
9b724ebcc7 Translated using Weblate (Turkish)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/tr/
2022-02-04 17:56:31 +01:00
Michael Moroni
540ef6d345 Translated using Weblate (Italian)
Currently translated at 7.0% (7 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/it/
2022-02-04 17:56:31 +01:00
Altons
64fa790836 Translated using Weblate (German)
Currently translated at 6.0% (6 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-02-04 17:56:31 +01:00
Altons
2c18b0dd19 Translated using Weblate (French)
Currently translated at 16.0% (16 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-02-04 17:56:31 +01:00
solokot
f570f2746a Translated using Weblate (Russian)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/ru/
2022-02-04 17:56:31 +01:00
Heimen Stoffels
4c9c717792 Translated using Weblate (Dutch)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nl/
2022-02-04 17:56:31 +01:00
Allan Nordhøy
db4408108a Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.3% (236 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/nb_NO/
2022-02-04 17:56:31 +01:00
Michael Moroni
f75df30493 Translated using Weblate (Italian)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/it/
2022-02-04 17:56:31 +01:00
Altons
0f914414af Translated using Weblate (French)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/fr/
2022-02-04 17:56:31 +01:00
Altons
3468293f5f Translated using Weblate (German)
Currently translated at 100.0% (240 of 240 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/de/
2022-02-04 17:56:31 +01:00
Katharine Chui
c9b8b2df9e requested changes
theme color preference is now before pure black background preference

new setting string arrays for when dynamic color is not available

general refactoring and formatting changes
2022-02-04 14:35:10 +08:00
Katharine Chui
3d138c9504 ucrop toolbar typeface 2022-02-03 20:40:52 +08:00
Katharine Chui
72b95988e5 hide catima theme when dynamic color is not available 2022-02-03 19:36:24 +08:00
Katharine Chui
188c147173 better themed color resolution for edit button on card view 2022-02-03 18:05:03 +08:00
Katharine Chui
6224a13d17 ucrop color 2022-02-03 17:53:32 +08:00
bors[bot]
f393b9b618 Merge #787
787: Translations update from Hosted Weblate r=TheLastProject a=weblate

Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Catima/Android](https://hosted.weblate.org/projects/catima/catima/).


It also includes following components:

* [Catima/Android (Fastlane)](https://hosted.weblate.org/projects/catima/fastlane/)



Current translation status:

![Weblate translation status](https://hosted.weblate.org/widgets/catima/-/catima/horizontal-auto.svg)


Co-authored-by: Altons <marsupilami450@gmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
2022-02-03 07:08:34 +00:00
Joel A
6fa6cdfadf Translated using Weblate (Swedish)
Currently translated at 99.5% (237 of 238 strings)

Translation: Catima/Android
Translate-URL: https://hosted.weblate.org/projects/catima/catima/sv/
2022-02-03 00:51:59 +01:00
Altons
bc7f44f60a Translated using Weblate (German)
Currently translated at 7.0% (7 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/de/
2022-02-03 00:51:59 +01:00
Altons
5579784b0a Translated using Weblate (French)
Currently translated at 16.0% (16 of 100 strings)

Translation: Catima/Android (Fastlane)
Translate-URL: https://hosted.weblate.org/projects/catima/fastlane/fr/
2022-02-03 00:51:59 +01:00
Katharine Chui
edf953cdad colors 2022-02-03 05:12:20 +08:00
169 changed files with 1044 additions and 289 deletions

View File

@@ -17,7 +17,8 @@ jobs:
days-before-close: 90
close-issue-message: 'This issue is missing necessary information and cannot be worked on in its current state. It has therefore been closed to keep the issue tracker clean. If you have more information, feel free to reopen it.'
close-pr-message: 'This PR is missing necessary information and cannot be merged in its current state. It has therefore been closed to keep the issue tracker clean. If you have more information, feel free to reopen it.'
only-labels: 'needs info'
stale-issue-label: 'needs info'
stale-pr-label: 'needs info'
only-labels: 'state: needs info'
stale-issue-label: 'state: needs info'
stale-pr-label: 'state: needs info'
remove-stale-when-updated: false
enable-statistics: true

View File

@@ -1,6 +1,16 @@
# Changelog
## Unreleased - 101
## v2.15.2 - 103 (2022-02-11)
- Fix manual language selection not applying everywhere
- Fix crash in edit view on regionless locale
## v2.15.1 - 102 (2022-02-10)
- Various minor fixes
- Fix crash when using Norwegian translation
## v2.15.0 - 101 (2022-02-06)
- Fix cropper not using theme colour
- Fix minor theming issues

View File

@@ -18,8 +18,8 @@ android {
applicationId "me.hackerchick.catima"
minSdkVersion 21
targetSdkVersion 31
versionCode 100
versionName "2.14.1"
versionCode 103
versionName "2.15.2"
vectorDrawables.useSupportLibrary true
multiDexEnabled true

View File

@@ -116,7 +116,7 @@
</activity>
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:name=".UCropWrapper"
android:theme="@style/AppTheme.NoActionBar" />
<provider

View File

@@ -19,10 +19,9 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// XXX on the splash screen activity, aka the main activity, this has to be executed after applying dynamic colors, not before
// so running this only on non main for now
// XXX splash screen activity has to do this after installing splash screen before view inflate
if (!this.getClass().getSimpleName().equals(MainActivity.class.getSimpleName())) {
Utils.patchOledDarkTheme(this);
Utils.patchColors(this);
}
}
@@ -31,17 +30,15 @@ public class CatimaAppCompatActivity extends AppCompatActivity {
super.onPostCreate(savedInstanceState);
// material 3 designer does not consider status bar colors
// XXX changing this in onCreate causes issues with the splash screen activity, so doing this here
boolean darkMode = Utils.isDarkModeEnabled(this);
if (Build.VERSION.SDK_INT >= 23) {
getWindow().setStatusBarColor(Color.TRANSPARENT);
getWindow().getDecorView().setSystemUiVisibility(Utils.isDarkModeEnabled(this) ? 0 : View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
getWindow().getDecorView().setSystemUiVisibility(darkMode ? 0 : View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
// icons are always white back then
getWindow().setStatusBarColor(Utils.isDarkModeEnabled(this) ? Color.TRANSPARENT : Color.argb(127, 0, 0, 0));
getWindow().setStatusBarColor(darkMode ? Color.TRANSPARENT : Color.argb(127, 0, 0, 0));
}
// XXX android 9 and below has a nasty rendering bug if the theme was patched earlier
// the splash screen activity needs the fix regardless to solve a dynamic color api issue
if (!this.getClass().getSimpleName().equals(MainActivity.class.getSimpleName())) {
Utils.postPatchOledDarkTheme(this);
}
Utils.postPatchColors(this);
}
}

View File

@@ -15,7 +15,7 @@ import protect.card_locker.preferences.Settings;
public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListItemViewHolder> {
Settings mSettings;
private final Context mContext;
public final Context mContext;
private final GroupAdapterListener mListener;
SQLiteDatabase mDatabase;
@@ -23,7 +23,7 @@ public class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.Gro
super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER);
setHasStableIds(true);
mSettings = new Settings(inputContext);
mContext = inputContext.getApplicationContext();
mContext = inputContext;
mListener = inputListener;
mDatabase = new DBHelper(inputContext).getReadableDatabase();

View File

@@ -35,6 +35,7 @@ import java.util.List;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
import protect.card_locker.importexport.ImportExportResultType;
public class ImportExportActivity extends CatimaAppCompatActivity {
private static final String TAG = "Catima";
@@ -97,7 +98,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
startExport(writer, uri, exportPassword.toCharArray(), true);
} catch (IOException e) {
Log.e(TAG, "Failed to export file: " + result.toString(), e);
onExportComplete(ImportExportResult.GenericFailure, uri);
onExportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, result.toString()), uri);
}
});
@@ -175,7 +176,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
startImport(reader, uri, importDataFormat, password, true);
} catch (IOException e) {
Log.e(TAG, "Failed to import file: " + uri.toString(), e);
onImportComplete(ImportExportResult.GenericFailure, uri, importDataFormat);
onImportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, e.toString()), uri, importDataFormat);
}
}
@@ -357,56 +358,51 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
builder.show();
}
private String buildResultDialogMessage(ImportExportResult result, boolean isImport) {
int messageId;
if (result.resultType() == ImportExportResultType.Success) {
messageId = isImport ? R.string.importSuccessful : R.string.exportSuccessful;
} else {
messageId = isImport ? R.string.importFailed : R.string.exportFailed;
}
StringBuilder messageBuilder = new StringBuilder(getResources().getString(messageId));
if (result.developerDetails() != null) {
messageBuilder.append("\n\n");
messageBuilder.append(getResources().getString(R.string.include_if_asking_support));
messageBuilder.append("\n\n");
messageBuilder.append(result.developerDetails());
}
return messageBuilder.toString();
}
private void onImportComplete(ImportExportResult result, Uri path, DataFormat dataFormat) {
if (result == ImportExportResult.BadPassword) {
ImportExportResultType resultType = result.resultType();
if (resultType == ImportExportResultType.BadPassword) {
retryWithPassword(dataFormat, path);
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
int messageId;
if (result == ImportExportResult.Success) {
builder.setTitle(R.string.importSuccessfulTitle);
messageId = R.string.importSuccessful;
} else {
builder.setTitle(R.string.importFailedTitle);
messageId = R.string.importFailed;
}
final String message = getResources().getString(messageId);
builder.setMessage(message);
builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.importSuccessfulTitle : R.string.importFailedTitle);
builder.setMessage(buildResultDialogMessage(result, true));
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
builder.create().show();
}
private void onExportComplete(ImportExportResult result, final Uri path) {
ImportExportResultType resultType = result.resultType();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
int messageId;
if (result == ImportExportResult.Success) {
builder.setTitle(R.string.exportSuccessfulTitle);
messageId = R.string.exportSuccessful;
} else {
builder.setTitle(R.string.exportFailedTitle);
messageId = R.string.exportFailed;
}
final String message = getResources().getString(messageId);
builder.setMessage(message);
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.exportSuccessfulTitle : R.string.exportFailedTitle);
builder.setMessage(buildResultDialogMessage(result, false));
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
if (result == ImportExportResult.Success) {
if (resultType == ImportExportResultType.Success) {
final CharSequence sendLabel = ImportExportActivity.this.getResources().getText(R.string.sendLabel);
builder.setPositiveButton(sendLabel, (dialog, which) -> {

View File

@@ -16,6 +16,7 @@ import java.nio.charset.StandardCharsets;
import protect.card_locker.async.CompatCallable;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
import protect.card_locker.importexport.ImportExportResultType;
import protect.card_locker.importexport.MultiFormatExporter;
import protect.card_locker.importexport.MultiFormatImporter;
@@ -63,19 +64,20 @@ public class ImportExportTask implements CompatCallable<ImportExportResult> {
private ImportExportResult performImport(Context context, InputStream stream, SQLiteDatabase database, char[] password) {
ImportExportResult importResult = MultiFormatImporter.importData(context, database, stream, format, password);
Log.i(TAG, "Import result: " + importResult.name());
Log.i(TAG, "Import result: " + importResult);
return importResult;
}
private ImportExportResult performExport(Context context, OutputStream stream, SQLiteDatabase database, char[] password) {
ImportExportResult result = ImportExportResult.GenericFailure;
ImportExportResult result;
try {
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
result = MultiFormatExporter.exportData(context, database, stream, format, password);
writer.close();
} catch (IOException e) {
result = new ImportExportResult(ImportExportResultType.GenericFailure, e.toString());
Log.e(TAG, "Unable to export file", e);
}

View File

@@ -35,7 +35,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
private int mCurrentSelectedIndex = -1;
Settings mSettings;
boolean mDarkModeEnabled;
private final Context mContext;
public final Context mContext;
private final CardAdapterListener mListener;
protected SparseBooleanArray mSelectedItems;
protected SparseBooleanArray mAnimationItemsIndex;
@@ -46,7 +46,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
super(inputCursor, DBHelper.LoyaltyCardDbIds.ID);
setHasStableIds(true);
mSettings = new Settings(inputContext);
mContext = inputContext.getApplicationContext();
mContext = inputContext;
mListener = inputListener;
mSelectedItems = new SparseBooleanArray();
mAnimationItemsIndex = new SparseBooleanArray();

View File

@@ -37,7 +37,7 @@ import android.widget.Toast;
import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.tabs.TabLayout;
import com.jaredrummler.android.colorpicker.ColorPickerDialog;
@@ -69,6 +69,7 @@ import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
@@ -113,8 +114,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
public static final String BUNDLE_BARCODETYPE = "barcodeType";
public static final String BUNDLE_ADDGROUP = "addGroup";
ExtendedFloatingActionButton saveButton;
TabLayout tabs;
ImageView thumbnail;
@@ -137,6 +136,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
Button enterButton;
Toolbar toolbar;
int loyaltyCardId;
boolean updateLoyaltyCard;
String cardId;
@@ -293,7 +294,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.loyalty_card_edit_activity);
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
@@ -447,14 +448,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
for (int i = locales.size() - 1; i >= 0; i--) {
Locale locale = locales.get(i);
String currencySymbol = Currency.getInstance(locale).getSymbol();
currencyList.remove(currencySymbol);
currencyList.add(0, currencySymbol);
currencyPrioritizeLocaleSymbols(currencyList, locale);
}
} else {
String currencySymbol = Currency.getInstance(mSystemLocale).getSymbol();
currencyList.remove(currencySymbol);
currencyList.add(0, currencySymbol);
currencyPrioritizeLocaleSymbols(currencyList, mSystemLocale);
}
currencyList.add(0, getString(R.string.points));
@@ -692,9 +689,22 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
);
// Fix theming
int colorPrimary = MaterialColors.getColor(this, R.attr.colorPrimary, ContextCompat.getColor(this, R.color.md_theme_light_primary));
mCropperOptions.setToolbarColor(colorPrimary);
mCropperOptions.setStatusBarColor(colorPrimary);
int colorOnPrimary = MaterialColors.getColor(this, R.attr.colorOnPrimary, ContextCompat.getColor(this, R.color.md_theme_light_onPrimary));
int colorSurface = MaterialColors.getColor(this, R.attr.colorSurface, ContextCompat.getColor(this, R.color.md_theme_light_surface));
int colorOnSurface = MaterialColors.getColor(this, R.attr.colorOnSurface, ContextCompat.getColor(this, R.color.md_theme_light_onSurface));
int colorBackground = MaterialColors.getColor(this, android.R.attr.colorBackground, ContextCompat.getColor(this, R.color.md_theme_light_onSurface));
mCropperOptions.setToolbarColor(colorSurface);
mCropperOptions.setStatusBarColor(colorSurface);
mCropperOptions.setToolbarWidgetColor(colorOnSurface);
mCropperOptions.setRootViewBackgroundColor(colorBackground);
// set tool tip to be the darker of primary color
if (Utils.isDarkModeEnabled(this)) {
mCropperOptions.setActiveControlsWidgetColor(colorOnPrimary);
} else {
mCropperOptions.setActiveControlsWidgetColor(colorPrimary);
}
}
@Override
@@ -896,7 +906,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
cardImageFrontHolder.setOnClickListener(new ChooseCardImage());
cardImageBackHolder.setOnClickListener(new ChooseCardImage());
saveButton = findViewById(R.id.fabSave);
FloatingActionButton saveButton = findViewById(R.id.fabSave);
saveButton.setOnClickListener(v -> doSave());
saveButton.bringToFront();
@@ -908,7 +918,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
protected void setColorFromIcon() {
Object icon = thumbnail.getTag();
if (icon != null && (icon instanceof Bitmap)) {
updateTempState(LoyaltyCardField.headerColor, new Palette.Builder((Bitmap) icon).generate().getDominantColor(tempLoyaltyCard.headerColor != null ? tempLoyaltyCard.headerColor : R.attr.colorPrimary));
updateTempState(LoyaltyCardField.headerColor, new Palette.Builder((Bitmap) icon).generate().getDominantColor(tempLoyaltyCard.headerColor != null ? tempLoyaltyCard.headerColor : R.attr.colorPrimary));
} else {
Log.d("setColorFromIcon", "attempting header color change from icon but icon does not exist");
}
@@ -1267,10 +1277,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
return;
}
// Validation done, save
saveButton.setText(R.string.saving);
saveButton.setIcon(null);
List<Group> selectedGroups = new ArrayList<>();
for (Integer chipId : groupsChips.getCheckedChipIds()) {
@@ -1397,13 +1403,22 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
}
}
}
mCropperLauncher.launch(
UCrop.of(
sourceUri,
destUri
).withOptions(mCropperOptions)
.getIntent(this)
);
Intent ucropIntent = UCrop.of(
sourceUri,
destUri
).withOptions(mCropperOptions)
.getIntent(this);
ucropIntent.setClass(this, UCropWrapper.class);
for (int i = 0; i < toolbar.getChildCount(); i++) {
// send toolbar font details to ucrop wrapper
View child = toolbar.getChildAt(i);
if (child instanceof AppCompatTextView) {
AppCompatTextView childTextView = (AppCompatTextView) child;
ucropIntent.putExtra(UCropWrapper.UCROP_TOOLBAR_TYPEFACE_STYLE, childTextView.getTypeface().getStyle());
break;
}
}
mCropperLauncher.launch(ucropIntent);
}
private void generateBarcode() {
@@ -1494,4 +1509,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
throw new UnsupportedOperationException();
}
}
private void currencyPrioritizeLocaleSymbols(ArrayList<String> currencyList, Locale locale) {
try {
String currencySymbol = Currency.getInstance(locale).getSymbol();
currencyList.remove(currencySymbol);
currencyList.add(0, currencySymbol);
} catch (IllegalArgumentException e) {
Log.d(TAG, "Could not get currency data for locale info: " + e);
}
}
}

View File

@@ -16,6 +16,5 @@ public class LoyaltyCardLockerApplication extends Application {
Settings settings = new Settings(this);
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
DynamicColors.applyToActivitiesIfAvailable(this);
}
}

View File

@@ -33,7 +33,8 @@ import android.widget.Toast;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
@@ -96,7 +97,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
String barcodeIdString;
CatimaBarcode format;
ExtendedFloatingActionButton editButton;
FloatingActionButton editButton;
Guideline centerGuideline;
SeekBar barcodeScaler;
@@ -578,14 +579,17 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
bottomSheetButton.setColorFilter(textColor);
int complementaryColor = Utils.getComplementaryColor(darkenedColor);
editButton.setBackgroundTintList(ColorStateList.valueOf(complementaryColor));
Drawable editButtonIcon = editButton.getIcon();
Drawable editButtonIcon = editButton.getDrawable();
editButtonIcon.mutate();
int colorPrimary = MaterialColors.getColor(this, R.attr.colorPrimary, ContextCompat.getColor(this, R.color.md_theme_light_primary));
int colorOnPrimary = MaterialColors.getColor(this, R.attr.colorOnPrimary, ContextCompat.getColor(this, R.color.md_theme_light_onPrimary));
boolean darkMode = Utils.isDarkModeEnabled(this);
if (Utils.needsDarkForeground(complementaryColor)) {
editButtonIcon.setTint(ContextCompat.getColor(this, R.color.md_theme_light_onBackground));
editButtonIcon.setTint(darkMode ? colorOnPrimary : colorPrimary);
} else {
editButtonIcon.setTint(ContextCompat.getColor(this, R.color.md_theme_dark_onBackground));
editButtonIcon.setTint(darkMode ? colorPrimary : colorOnPrimary);
}
editButton.setIcon(editButtonIcon);
editButton.setImageDrawable(editButtonIcon);
Bitmap icon = Utils.retrieveCardImage(this, loyaltyCard.id, ImageLocationType.icon);
if (icon != null) {
@@ -647,7 +651,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
dotIndicator.removeAllViews();
if (imageTypes.size() >= 2) {
dots = new ImageView[imageTypes.size()];
boolean darkMode = Utils.isDarkModeEnabled(getApplicationContext());
for (int i = 0; i < imageTypes.size(); i++) {
dots[i] = new ImageView(this);

View File

@@ -11,7 +11,6 @@ import android.database.CursorIndexOutOfBoundsException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
@@ -29,8 +28,7 @@ import androidx.appcompat.widget.Toolbar;
import androidx.core.splashscreen.SplashScreen;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.color.DynamicColors;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.io.UnsupportedEncodingException;
@@ -49,6 +47,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
private ActionMode mCurrentActionMode;
private SearchView mSearchView;
private GestureDetector mGestureDetector;
private int mLoyaltyCardCount = 0;
protected String mFilter = "";
protected Object mGroup = null;
protected DBHelper.LoyaltyCardOrder mOrder = DBHelper.LoyaltyCardOrder.Alpha;
@@ -142,8 +141,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
DBHelper db = new DBHelper(MainActivity.this);
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.e(TAG, "Deleting card: " + loyaltyCard.id);
@@ -155,7 +152,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
TabLayout.Tab tab = ((TabLayout) findViewById(R.id.groups)).getTabAt(selectedTab);
mGroup = tab != null ? tab.getTag() : null;
updateLoyaltyCardList();
updateLoyaltyCardList(true);
dialog.dismiss();
});
@@ -180,20 +177,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
protected void onCreate(Bundle inputSavedInstanceState) {
super.onCreate(inputSavedInstanceState);
SplashScreen.installSplashScreen(this);
// onPreCreate can't tell this activity uses a material theme due to splash screen, force color application here
DynamicColors.applyIfAvailable(this);
Utils.patchOledDarkTheme(this);
setTitle(R.string.app_name);
// XXX color patching has to be done again after setting splash screen
Utils.patchColors(this);
setContentView(R.layout.main_activity);
// XXX more dynamic color fixing due to splash screen
// without this the background color will get stuck with the old color before dynamic color
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
findViewById(android.R.id.content).setBackgroundColor(typedValue.data);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -206,7 +193,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
selectedTab = tab.getPosition();
Log.d("onTabSelected", "Tab Position " + tab.getPosition());
mGroup = tab.getTag();
updateLoyaltyCardList();
updateLoyaltyCardList(false);
// Store active tab in Shared Preference to restore next app launch
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
@@ -246,7 +233,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
registerForContextMenu(mCardList);
mGroup = null;
updateLoyaltyCardList();
updateLoyaltyCardList(true);
/*
* This was added for Huawei, but Huawei is just too much of a fucking pain.
@@ -350,10 +337,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
assert tab != null;
mGroup = tab.getTag();
}
updateLoyaltyCardList();
updateLoyaltyCardList(true);
// End of active tab logic
ExtendedFloatingActionButton addButton = findViewById(R.id.fabAdd);
FloatingActionButton addButton = findViewById(R.id.fabAdd);
addButton.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), ScanActivity.class);
Bundle bundle = new Bundle();
@@ -376,23 +363,17 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
super.onBackPressed();
}
private void displayCardSetupOptions(boolean shouldShow) {
View search = findViewById(R.id.action_search);
View folder = findViewById(R.id.action_unfold);
View sort = findViewById(R.id.action_sort);
if (search != null && mSearchView.isIconified()) {
search.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
}
if (folder != null) {
folder.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
}
if (sort != null) {
sort.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
private void displayCardSetupOptions(Menu menu, boolean shouldShow) {
for (int id : new int[]{R.id.action_search, R.id.action_unfold, R.id.action_sort}) {
menu.findItem(id).setVisible(shouldShow);
}
}
private void updateLoyaltyCardList() {
private void updateLoyaltyCardCount() {
mLoyaltyCardCount = DBHelper.getLoyaltyCardCount(mDatabase);
}
private void updateLoyaltyCardList(boolean updateCount) {
Group group = null;
if (mGroup != null) {
group = (Group) mGroup;
@@ -400,13 +381,18 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase, mFilter, group, mOrder, mOrderDirection));
if (DBHelper.getLoyaltyCardCount(mDatabase) > 0) {
if (updateCount) {
updateLoyaltyCardCount();
// Update menu icons if necessary
invalidateOptionsMenu();
}
if (mLoyaltyCardCount > 0) {
// We want the cardList to be visible regardless of the filtered match count
// to ensure that the noMatchingCardsText doesn't end up being shown below
// the keyboard
mHelpText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.GONE);
displayCardSetupOptions(true);
if (mAdapter.getItemCount() > 0) {
mCardList.setVisibility(View.VISIBLE);
@@ -426,7 +412,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
} else {
mCardList.setVisibility(View.GONE);
mHelpText.setVisibility(View.VISIBLE);
displayCardSetupOptions(false);
mNoMatchingCardsText.setVisibility(View.GONE);
mNoGroupCardsText.setVisibility(View.GONE);
@@ -467,6 +452,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
public boolean onCreateOptionsMenu(Menu inputMenu) {
getMenuInflater().inflate(R.menu.main_menu, inputMenu);
displayCardSetupOptions(inputMenu, mLoyaltyCardCount > 0);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
if (searchManager != null) {
mSearchView = (SearchView) inputMenu.findItem(R.id.action_search).getActionView();
@@ -492,7 +479,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
TabLayout.Tab currentTab = groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition());
mGroup = currentTab != null ? currentTab.getTag() : null;
updateLoyaltyCardList();
updateLoyaltyCardList(false);
return true;
}
@@ -522,7 +509,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
if (id == R.id.action_sort) {
TabLayout.Tab tab = ((TabLayout) findViewById(R.id.groups)).getTabAt(selectedTab);
AtomicInteger currentIndex = new AtomicInteger();
List<DBHelper.LoyaltyCardOrder> loyaltyCardOrders = Arrays.asList(DBHelper.LoyaltyCardOrder.values());
for (int i = 0; i < loyaltyCardOrders.size(); i++) {
@@ -602,7 +588,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
sortPrefEditor.apply();
// Update card list
updateLoyaltyCardList();
updateLoyaltyCardList(false);
}
@Override

View File

@@ -13,7 +13,7 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;
@@ -51,7 +51,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro
protected void onResume() {
super.onResume();
ExtendedFloatingActionButton addButton = findViewById(R.id.fabAdd);
FloatingActionButton addButton = findViewById(R.id.fabAdd);
addButton.setOnClickListener(v -> createGroup());
addButton.bringToFront();

View File

@@ -0,0 +1,79 @@
package protect.card_locker;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.textview.MaterialTextView;
import com.yalantis.ucrop.UCropActivity;
public class UCropWrapper extends UCropActivity {
public static final String UCROP_TOOLBAR_TYPEFACE_STYLE = "ucop_toolbar_typeface_style";
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
boolean darkMode = Utils.isDarkModeEnabled(this);
// setup status bar to look like the rest of the app
if (Build.VERSION.SDK_INT >= 23) {
getWindow().getDecorView().setSystemUiVisibility(darkMode ? 0 : View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
// icons are always white back then
if (!darkMode) {
getWindow().setStatusBarColor(ColorUtils.compositeColors(Color.argb(127, 0, 0, 0), getWindow().getStatusBarColor()));
}
}
// find and check views that we wish to color modify
// for when we update ucrop or switch to another cropper
View check = findViewById(com.yalantis.ucrop.R.id.wrapper_controls);
if (check instanceof FrameLayout) {
FrameLayout controls = (FrameLayout) check;
check = findViewById(com.yalantis.ucrop.R.id.wrapper_states);
if (check instanceof LinearLayout) {
LinearLayout states = (LinearLayout) check;
for (int i = 0; i < controls.getChildCount(); i++) {
check = controls.getChildAt(i);
if (check instanceof AppCompatImageView) {
AppCompatImageView controlsBackgroundImage = (AppCompatImageView) check;
// everything gathered and are as expected, now perform color patching
Utils.patchColors(this);
int colorSurface = MaterialColors.getColor(this, R.attr.colorSurface, ContextCompat.getColor(this, R.color.md_theme_light_surface));
int colorOnSurface = MaterialColors.getColor(this, R.attr.colorOnSurface, ContextCompat.getColor(this, R.color.md_theme_light_onSurface));
Drawable controlsBackgroundImageDrawable = controlsBackgroundImage.getBackground();
controlsBackgroundImageDrawable.mutate();
controlsBackgroundImageDrawable.setTint(darkMode ? colorOnSurface : colorSurface);
controlsBackgroundImage.setBackgroundDrawable(controlsBackgroundImageDrawable);
states.setBackgroundColor(darkMode ? colorSurface : colorOnSurface);
break;
}
}
}
}
// change toolbar font
check = findViewById(com.yalantis.ucrop.R.id.toolbar_title);
if (check instanceof MaterialTextView) {
MaterialTextView toolbarTextview = (MaterialTextView) check;
Intent intent = getIntent();
int style = intent.getIntExtra(UCROP_TOOLBAR_TYPEFACE_STYLE, -1);
if (style != -1) {
toolbarTextview.setTypeface(Typeface.defaultFromStyle(style));
}
}
}
}

View File

@@ -17,6 +17,7 @@ import android.util.Log;
import android.util.TypedValue;
import android.widget.Toast;
import com.google.android.material.color.DynamicColors;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
@@ -464,21 +465,45 @@ public class Utils {
}
// replace colors in the current theme
// use before views are inflated, after dynamic color
public static void patchOledDarkTheme(AppCompatActivity activity) {
if (isDarkModeEnabled(activity) && new Settings(activity).getOledDark()) {
activity.getTheme().applyStyle(R.style.DarkBackground, true);
public static void patchColors(AppCompatActivity activity) {
Settings settings = new Settings(activity);
String color = settings.getColor();
Resources.Theme theme = activity.getTheme();
Resources resources = activity.getResources();
if (color.equals(resources.getString(R.string.settings_key_pink_theme))) {
theme.applyStyle(R.style.pink, true);
} else if (color.equals(resources.getString(R.string.settings_key_magenta_theme))) {
theme.applyStyle(R.style.magenta, true);
} else if (color.equals(resources.getString(R.string.settings_key_violet_theme))) {
theme.applyStyle(R.style.violet, true);
} else if (color.equals(resources.getString(R.string.settings_key_blue_theme))) {
theme.applyStyle(R.style.blue, true);
} else if (color.equals(resources.getString(R.string.settings_key_sky_blue_theme))) {
theme.applyStyle(R.style.skyblue, true);
} else if (color.equals(resources.getString(R.string.settings_key_green_theme))) {
theme.applyStyle(R.style.green, true);
} else if (color.equals(resources.getString(R.string.settings_key_brown_theme))) {
theme.applyStyle(R.style.brown, true);
} else if (color.equals(resources.getString(R.string.settings_key_catima_theme))) {
// catima theme is AppTheme itself, no dynamic colors nor applyStyle
} else {
// final catch all in case of invalid theme value from older versions
// also handles R.string.settings_key_system_theme
DynamicColors.applyIfAvailable(activity);
}
if (isDarkModeEnabled(activity) && settings.getOledDark()) {
theme.applyStyle(R.style.DarkBackground, true);
}
}
// XXX android 9 and below has issues with patched theme where the background becomes a
// rendering mess
// use after views are inflated
public static void postPatchOledDarkTheme(AppCompatActivity activity) {
if (isDarkModeEnabled(activity) && new Settings(activity).getOledDark()) {
TypedValue typedValue = new TypedValue();
activity.getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
activity.findViewById(android.R.id.content).setBackgroundColor(typedValue.data);
}
public static void postPatchColors(AppCompatActivity activity) {
TypedValue typedValue = new TypedValue();
activity.getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
activity.findViewById(android.R.id.content).setBackgroundColor(typedValue.data);
}
}

View File

@@ -1,7 +1,23 @@
package protect.card_locker.importexport;
public enum ImportExportResult {
Success,
GenericFailure,
BadPassword;
public class ImportExportResult {
private ImportExportResultType resultType;
private String developerDetails;
public ImportExportResult(ImportExportResultType resultType) {
this(resultType, null);
}
public ImportExportResult(ImportExportResultType resultType, String developerDetails) {
this.resultType = resultType;
this.developerDetails = developerDetails;
}
public ImportExportResultType resultType() {
return resultType;
}
public String developerDetails() {
return developerDetails;
}
}

View File

@@ -0,0 +1,7 @@
package protect.card_locker.importexport;
public enum ImportExportResultType {
Success,
GenericFailure,
BadPassword;
}

View File

@@ -32,20 +32,20 @@ public class MultiFormatExporter {
break;
}
String error;
if (exporter != null) {
try {
exporter.exportData(context, database, output, password);
return ImportExportResult.Success;
} catch (IOException e) {
Log.e(TAG, "Failed to export data", e);
} catch (InterruptedException e) {
return new ImportExportResult(ImportExportResultType.Success);
} catch (Exception e) {
Log.e(TAG, "Failed to export data", e);
error = e.toString();
}
return ImportExportResult.GenericFailure;
} else {
Log.e(TAG, "Unsupported data format exported: " + format.name());
return ImportExportResult.GenericFailure;
error = "Unsupported data format exported: " + format.name();
Log.e(TAG, error);
}
return new ImportExportResult(ImportExportResultType.GenericFailure, error);
}
}

View File

@@ -46,23 +46,26 @@ public class MultiFormatImporter {
break;
}
String error = null;
if (importer != null) {
database.beginTransaction();
try {
importer.importData(context, database, input, password);
database.setTransactionSuccessful();
return ImportExportResult.Success;
return new ImportExportResult(ImportExportResultType.Success);
} catch (ZipException e) {
return ImportExportResult.BadPassword;
return new ImportExportResult(ImportExportResultType.BadPassword);
} catch (IOException | FormatException | InterruptedException | JSONException | ParseException | NullPointerException e) {
Log.e(TAG, "Failed to import data", e);
error = e.toString();
} finally {
database.endTransaction();
}
} else {
Log.e(TAG, "Unsupported data format imported: " + format.name());
error = "Unsupported data format imported: " + format.name();
Log.e(TAG, error);
}
return ImportExportResult.GenericFailure;
return new ImportExportResult(ImportExportResultType.GenericFailure, error);
}
}

View File

@@ -107,4 +107,8 @@ public class Settings {
public boolean getOledDark() {
return getBoolean(R.string.settings_key_oled_dark, false);
}
public String getColor() {
return getString(R.string.setting_key_theme_color, mContext.getResources().getString(R.string.settings_key_system_theme));
}
}

View File

@@ -19,6 +19,8 @@ import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import com.google.android.material.color.DynamicColors;
import nl.invissvenska.numberpickerpreference.NumberDialogPreference;
import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment;
import protect.card_locker.CatimaAppCompatActivity;
@@ -140,6 +142,17 @@ public class SettingsActivity extends CatimaAppCompatActivity {
refreshActivity(true);
return true;
});
ListPreference colorPreference = findPreference(getResources().getString(R.string.setting_key_theme_color));
assert colorPreference != null;
colorPreference.setOnPreferenceChangeListener((preference, o) -> {
refreshActivity(true);
return true;
});
if (!DynamicColors.isDynamicColorAvailable()) {
colorPreference.setEntryValues(R.array.color_values_no_dynamic);
colorPreference.setEntries(R.array.color_value_strings_no_dynamic);
}
}
private void refreshActivity(boolean reloadMain) {

View File

@@ -7,15 +7,14 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="protect.card_locker.ManageGroupActivity">
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:icon="@drawable/save_24dp"
android:text="@string/save"
app:srcCompat="@drawable/save_24dp"
android:contentDescription="@string/save"
android:layout_margin="16dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -21,6 +21,8 @@
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="80dp"
android:clipToPadding="false"
android:scrollbars="vertical"
android:visibility="gone" />
</RelativeLayout>

View File

@@ -7,13 +7,13 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:icon="@drawable/save_24dp"
android:text="@string/save"
app:srcCompat="@drawable/save_24dp"
android:contentDescription="@string/save"
android:layout_margin="16dp" />
<com.google.android.material.appbar.AppBarLayout

View File

@@ -8,13 +8,13 @@
android:layout_height="fill_parent"
android:fitsSystemWindows="true">
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:icon="@drawable/ic_mode_edit_white_24dp"
android:text="@string/edit_card"
app:srcCompat="@drawable/ic_mode_edit_white_24dp"
android:contentDescription="@string/edit"
android:layout_margin="16dp" />
<FrameLayout

View File

@@ -8,13 +8,13 @@
android:fitsSystemWindows="true"
tools:context="protect.card_locker.MainActivity">
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:icon="@drawable/ic_add_white_24dp"
android:text="@string/action_add"
app:srcCompat="@drawable/ic_add_white_24dp"
android:contentDescription="@string/action_add"
android:layout_margin="16dp" />
<com.google.android.material.appbar.AppBarLayout

View File

@@ -8,13 +8,13 @@
android:fitsSystemWindows="true"
tools:context="protect.card_locker.ManageGroupsActivity">
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:icon="@drawable/ic_add_white_24dp"
android:text="@string/action_add"
app:srcCompat="@drawable/ic_add_white_24dp"
android:contentDescription="@string/action_add"
android:layout_margin="16dp" />
<com.google.android.material.appbar.AppBarLayout

View File

@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
android:fitsSystemWindows="true"
tools:context="protect.card_locker.preferences.SettingsActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
@@ -11,15 +13,16 @@
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
style="?attr/toolbarStyle"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
style="?attr/toolbarStyle" />
android:layout_height="?attr/actionBarSize" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/settings_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -7,22 +7,25 @@
android:title="@string/action_search"
android:icon="@drawable/ic_search_white"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always|collapseActionView"/>
app:showAsAction="always|collapseActionView"
android:visible="false"/>
<item
android:id="@+id/action_unfold"
android:title="@string/action_hide_details"
android:icon="@drawable/ic_baseline_unfold_less_24"
app:showAsAction="always"/>
app:showAsAction="always"
android:visible="false"/>
<item
android:id="@+id/action_sort"
android:title="@string/sort"
android:icon="@drawable/ic_baseline_sort_24"
app:showAsAction="always"/>
app:showAsAction="always"
android:visible="false"/>
<item
android:id="@+id/action_manage_groups"
android:icon="@drawable/ic_folder_white"
android:title="@string/groups"
app:showAsAction="ifRoom"/>
app:showAsAction="never"/>
<item
android:id="@+id/action_import_export"
android:icon="@drawable/ic_import_export_white_24dp"

View File

@@ -8,18 +8,18 @@ mondstern
Katharine Chui
Oğuz Ersen
IllusiveMan196
Petr Novák
Altonss
Taco
Petr Novák
Joel A
Taco
Gediminas Murauskas
StoyanDimitrov
Nyatsuki
Michael Moroni
Samantaz Fox
arno-github
Ankit Tiwari
Sergio Paredes
Michael Moroni
laralem
arshbeerSingh
huuhaa
@@ -74,6 +74,7 @@ Michael Gangolf
pbeckmann
Peer Beckmann
Quang Nguyen
Ratnesh
Reza
Rohan Babbar
Ronak Upadhyay

View File

@@ -229,4 +229,5 @@
<item quantity="one"><xliff:g>%s</xliff:g> точка</item>
<item quantity="other"><xliff:g>%s</xliff:g> точки</item>
</plurals>
<string name="settings_oled_dark">Чисто черен фон за тъмната тема</string>
</resources>

View File

@@ -229,4 +229,6 @@
<item quantity="one"><xliff:g>%s</xliff:g> Punkt</item>
<item quantity="other"><xliff:g>%s</xliff:g> Punkte</item>
</plurals>
<string name="settings_oled_dark">Rein schwarzer Hintergrund für dunkles Thema</string>
<string name="include_if_asking_support">Wenn Sie Unterstützung anfordern möchten, geben Sie bitte die folgenden Informationen an:</string>
</resources>

View File

@@ -229,4 +229,6 @@
<item quantity="one"><xliff:g>%s</xliff:g> point</item>
<item quantity="other"><xliff:g>%s</xliff:g> points</item>
</plurals>
<string name="settings_oled_dark">Fond noir pur pour le thème sombre</string>
<string name="include_if_asking_support">Si vous voulez demander de l\'aide, incluez les informations suivantes :</string>
</resources>

View File

@@ -229,4 +229,5 @@
<item quantity="one"><xliff:g>%s</xliff:g> punto</item>
<item quantity="other"><xliff:g>%s</xliff:g> punti</item>
</plurals>
<string name="settings_oled_dark">Sfondo nero puro per il tema scuro</string>
</resources>

View File

@@ -73,7 +73,7 @@
<string name="starImage">Favorittstjerne</string>
<string name="unstar">Fjern fra favoritter</string>
<string name="star">Legg til i favoritter</string>
<string name="noGroups">Klikk på «+»- (pluss)-tegnet for å legge til grupper for kategorisering først.</string>
<string name="noGroups">Klikk på «+»- (pluss)-tegnet for å legge til grupper for kategorisering.</string>
<string name="deleteConfirmationGroup">Slett gruppe?</string>
<string name="all">Alle</string>
<string name="groups">Grupper</string>
@@ -105,7 +105,7 @@
<string name="currency">Valuta</string>
<string name="balance">Saldo</string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="chooseImportType">Importer data fra?</string>
<string name="chooseImportType">Importer data fra</string>
<string name="app_loyalty_card_keychain">Kundekortknippe</string>
<string name="settings_disable_lockscreen_while_viewing_card">Forhindre skjermlås</string>
<string name="settings_keep_screen_on">Behold skjerm påslått</string>
@@ -223,6 +223,12 @@
<string name="options">Alternativer</string>
<string name="starred">Stjernemerket</string>
<string name="set_scale">Sett skalering</string>
<string name="showMoreInfo">Vis mer info</string>
<string name="hideMoreInfo">Skjul mer info</string>
<string name="showMoreInfo">Vis info</string>
<string name="hideMoreInfo">Skjul info</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> poeng</item>
<item quantity="other"><xliff:g>%s</xliff:g> poeng</item>
</plurals>
<string name="settings_oled_dark">Svart bakgrunn for mørk drakt</string>
<string name="include_if_asking_support">Inkluder følgende info hvis du vil ha hjelp:</string>
</resources>

View File

@@ -38,4 +38,208 @@
<item name="android:colorBackground">#000000</item>
<item name="colorSurface">#000000</item>
</style>
<!-- color themes -->
<style name="pink">
<item name="colorPrimary">#FFB2C0</item>
<item name="colorOnPrimary">#670024</item>
<item name="colorPrimaryContainer">#900036</item>
<item name="colorOnPrimaryContainer">#FFD9DF</item>
<item name="colorSecondary">#E5BDC2</item>
<item name="colorOnSecondary">#43292D</item>
<item name="colorSecondaryContainer">#5C3F43</item>
<item name="colorOnSecondaryContainer">#FFD9DE</item>
<item name="colorTertiary">#EBBF90</item>
<item name="colorOnTertiary">#452B08</item>
<item name="colorTertiaryContainer">#5F411C</item>
<item name="colorOnTertiaryContainer">#FFDDB8</item>
<item name="colorError">#FFB4A9</item>
<item name="colorErrorContainer">#930006</item>
<item name="colorOnError">#680003</item>
<item name="colorOnErrorContainer">#FFDAD4</item>
<item name="android:colorBackground">#201A1B</item>
<item name="colorOnBackground">#ECE0E0</item>
<item name="colorSurface">#201A1B</item>
<item name="colorOnSurface">#ECE0E0</item>
<item name="colorSurfaceVariant">#524345</item>
<item name="colorOnSurfaceVariant">#D6C1C3</item>
<item name="colorOutline">#9F8C8E</item>
<item name="colorOnSurfaceInverse">#201A1B</item>
<item name="colorSurfaceInverse">#ECE0E0</item>
<item name="colorPrimaryInverse">#BC0049</item>
</style>
<style name="magenta">
<item name="colorPrimary">#FBAAFF</item>
<item name="colorOnPrimary">#570068</item>
<item name="colorPrimaryContainer">#7B0091</item>
<item name="colorOnPrimaryContainer">#FFD5FF</item>
<item name="colorSecondary">#D7BFD5</item>
<item name="colorOnSecondary">#3B2B3B</item>
<item name="colorSecondaryContainer">#534153</item>
<item name="colorOnSecondaryContainer">#F5DBF2</item>
<item name="colorTertiary">#F6B8AE</item>
<item name="colorOnTertiary">#4C251F</item>
<item name="colorTertiaryContainer">#663B34</item>
<item name="colorOnTertiaryContainer">#FFDAD2</item>
<item name="colorError">#FFB4A9</item>
<item name="colorErrorContainer">#930006</item>
<item name="colorOnError">#680003</item>
<item name="colorOnErrorContainer">#FFDAD4</item>
<item name="android:colorBackground">#1E1A1D</item>
<item name="colorOnBackground">#E9E0E5</item>
<item name="colorSurface">#1E1A1D</item>
<item name="colorOnSurface">#E9E0E5</item>
<item name="colorSurfaceVariant">#4D444C</item>
<item name="colorOnSurfaceVariant">#D0C3CC</item>
<item name="colorOutline">#998E96</item>
<item name="colorOnSurfaceInverse">#1E1A1D</item>
<item name="colorSurfaceInverse">#E9E0E5</item>
<item name="colorPrimaryInverse">#9A25AE</item>
</style>
<style name="violet">
<item name="colorPrimary">#D4BAFF</item>
<item name="colorOnPrimary">#3E008E</item>
<item name="colorPrimaryContainer">#5727A7</item>
<item name="colorOnPrimaryContainer">#ECDCFF</item>
<item name="colorSecondary">#CDC2DB</item>
<item name="colorOnSecondary">#342D41</item>
<item name="colorSecondaryContainer">#4B4358</item>
<item name="colorOnSecondaryContainer">#E9DEF7</item>
<item name="colorTertiary">#F0B8C5</item>
<item name="colorOnTertiary">#4A2530</item>
<item name="colorTertiaryContainer">#643A46</item>
<item name="colorOnTertiaryContainer">#FFD9E2</item>
<item name="colorError">#FFB4A9</item>
<item name="colorErrorContainer">#930006</item>
<item name="colorOnError">#680003</item>
<item name="colorOnErrorContainer">#FFDAD4</item>
<item name="android:colorBackground">#1D1B1F</item>
<item name="colorOnBackground">#E6E1E5</item>
<item name="colorSurface">#1D1B1F</item>
<item name="colorOnSurface">#E6E1E5</item>
<item name="colorSurfaceVariant">#49454E</item>
<item name="colorOnSurfaceVariant">#CBC4CF</item>
<item name="colorOutline">#948E99</item>
<item name="colorOnSurfaceInverse">#1D1B1F</item>
<item name="colorSurfaceInverse">#E6E1E5</item>
<item name="colorPrimaryInverse">#6F43BF</item>
</style>
<style name="blue">
<item name="colorPrimary">#B9C3FF</item>
<item name="colorOnPrimary">#08218A</item>
<item name="colorPrimaryContainer">#293CA0</item>
<item name="colorOnPrimaryContainer">#DDE0FF</item>
<item name="colorSecondary">#C4C5DD</item>
<item name="colorOnSecondary">#2D2F42</item>
<item name="colorSecondaryContainer">#43465A</item>
<item name="colorOnSecondaryContainer">#E0E1FA</item>
<item name="colorTertiary">#E5BAD7</item>
<item name="colorOnTertiary">#45263E</item>
<item name="colorTertiaryContainer">#5D3C55</item>
<item name="colorOnTertiaryContainer">#FFD7F3</item>
<item name="colorError">#FFB4A9</item>
<item name="colorErrorContainer">#930006</item>
<item name="colorOnError">#680003</item>
<item name="colorOnErrorContainer">#FFDAD4</item>
<item name="android:colorBackground">#1B1B1F</item>
<item name="colorOnBackground">#E4E1E6</item>
<item name="colorSurface">#1B1B1F</item>
<item name="colorOnSurface">#E4E1E6</item>
<item name="colorSurfaceVariant">#46464F</item>
<item name="colorOnSurfaceVariant">#C6C5D0</item>
<item name="colorOutline">#90909A</item>
<item name="colorOnSurfaceInverse">#1B1B1F</item>
<item name="colorSurfaceInverse">#E4E1E6</item>
<item name="colorPrimaryInverse">#4355B9</item>
</style>
<style name="skyblue">
<item name="colorPrimary">#8BCEFF</item>
<item name="colorOnPrimary">#003450</item>
<item name="colorPrimaryContainer">#004B71</item>
<item name="colorOnPrimaryContainer">#C8E6FF</item>
<item name="colorSecondary">#B7C8D8</item>
<item name="colorOnSecondary">#22323F</item>
<item name="colorSecondaryContainer">#384956</item>
<item name="colorOnSecondaryContainer">#D3E4F5</item>
<item name="colorTertiary">#CFBFE8</item>
<item name="colorOnTertiary">#362B4B</item>
<item name="colorTertiaryContainer">#4D4162</item>
<item name="colorOnTertiaryContainer">#ECDCFF</item>
<item name="colorError">#FFB4A9</item>
<item name="colorErrorContainer">#930006</item>
<item name="colorOnError">#680003</item>
<item name="colorOnErrorContainer">#FFDAD4</item>
<item name="android:colorBackground">#1A1C1E</item>
<item name="colorOnBackground">#E2E2E5</item>
<item name="colorSurface">#1A1C1E</item>
<item name="colorOnSurface">#E2E2E5</item>
<item name="colorSurfaceVariant">#41474D</item>
<item name="colorOnSurfaceVariant">#C1C7CE</item>
<item name="colorOutline">#8B9198</item>
<item name="colorOnSurfaceInverse">#1A1C1E</item>
<item name="colorSurfaceInverse">#E2E2E5</item>
<item name="colorPrimaryInverse">#006494</item>
</style>
<style name="green">
<item name="colorPrimary">#78DC77</item>
<item name="colorOnPrimary">#003907</item>
<item name="colorPrimaryContainer">#00530F</item>
<item name="colorOnPrimaryContainer">#93F990</item>
<item name="colorSecondary">#B9CCB3</item>
<item name="colorOnSecondary">#253423</item>
<item name="colorSecondaryContainer">#3B4B38</item>
<item name="colorOnSecondaryContainer">#D5E8CE</item>
<item name="colorTertiary">#A1CFD5</item>
<item name="colorOnTertiary">#00363B</item>
<item name="colorTertiaryContainer">#1E4D52</item>
<item name="colorOnTertiaryContainer">#BCEBF0</item>
<item name="colorError">#FFB4A9</item>
<item name="colorErrorContainer">#930006</item>
<item name="colorOnError">#680003</item>
<item name="colorOnErrorContainer">#FFDAD4</item>
<item name="android:colorBackground">#1A1C19</item>
<item name="colorOnBackground">#E2E3DD</item>
<item name="colorSurface">#1A1C19</item>
<item name="colorOnSurface">#E2E3DD</item>
<item name="colorSurfaceVariant">#424840</item>
<item name="colorOnSurfaceVariant">#C2C8BD</item>
<item name="colorOutline">#8C9288</item>
<item name="colorOnSurfaceInverse">#1A1C19</item>
<item name="colorSurfaceInverse">#E2E3DD</item>
<item name="colorPrimaryInverse">#006E17</item>
</style>
<style name="brown">
<item name="colorPrimary">#FFB598</item>
<item name="colorOnPrimary">#5C1A00</item>
<item name="colorPrimaryContainer">#7B2E0D</item>
<item name="colorOnPrimaryContainer">#FFDBCD</item>
<item name="colorSecondary">#E7BEB0</item>
<item name="colorOnSecondary">#442A20</item>
<item name="colorSecondaryContainer">#5D4035</item>
<item name="colorOnSecondaryContainer">#FFDBCD</item>
<item name="colorTertiary">#D5C78E</item>
<item name="colorOnTertiary">#383005</item>
<item name="colorTertiaryContainer">#50461A</item>
<item name="colorOnTertiaryContainer">#F1E2A7</item>
<item name="colorError">#FFB4A9</item>
<item name="colorErrorContainer">#930006</item>
<item name="colorOnError">#680003</item>
<item name="colorOnErrorContainer">#FFDAD4</item>
<item name="android:colorBackground">#201A18</item>
<item name="colorOnBackground">#EDE0DC</item>
<item name="colorSurface">#201A18</item>
<item name="colorOnSurface">#EDE0DC</item>
<item name="colorSurfaceVariant">#52433E</item>
<item name="colorOnSurfaceVariant">#D8C2BB</item>
<item name="colorOutline">#A08C86</item>
<item name="colorOnSurfaceInverse">#201A18</item>
<item name="colorSurfaceInverse">#EDE0DC</item>
<item name="colorPrimaryInverse">#9A4523</item>
</style>
</resources>

View File

@@ -229,4 +229,6 @@
<item quantity="one"><xliff:g>%s</xliff:g> punt</item>
<item quantity="other"><xliff:g>%s</xliff:g> punten</item>
</plurals>
<string name="settings_oled_dark">Zwarte achtergrond gebruiken bij donker thema</string>
<string name="include_if_asking_support">Als je ondersteuning wilt, voorzie je verzoek dan van de volgende informatie:</string>
</resources>

View File

@@ -4,11 +4,11 @@
<string name="importOptionFilesystemExplanation">Escolha um ficheiro específico a partir do sistema de ficheiros.</string>
<string name="action_search">Pesquisa</string>
<string name="star">Adicionar aos favoritos</string>
<string name="noMatchingGiftCards">Não foi encontrado nada. Tente alterar a sua pesquisa.</string>
<string name="noMatchingGiftCards">Sem resultados. Tente alterar a sua pesquisa.</string>
<string name="storeName">Nome</string>
<string name="note">Nota</string>
<string name="barcodeType">Tipo de código de barras</string>
<string name="barcodeNoBarcode">Este cartão não tem código de barras</string>
<string name="barcodeNoBarcode">Sem código de barras</string>
<string name="cancel">Cancelar</string>
<string name="save">Guardar</string>
<string name="edit">Editar</string>
@@ -29,8 +29,8 @@
<string name="copy_to_clipboard">Copiar identificador para a área de transferência</string>
<string name="sendLabel">Enviar…</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> cartão selecionado</item>
<item quantity="other"><xliff:g>%d</xliff:g> cartões selecionados</item>
<item quantity="one"><xliff:g>%d</xliff:g> selecionado</item>
<item quantity="other"><xliff:g>%d</xliff:g> selecionados</item>
</plurals>
<string name="deleteConfirmation">Eliminar este cartão permanentemente\?</string>
<string name="share">Partilhar</string>
@@ -41,13 +41,13 @@
<string name="cardShortcut">Atalho do cartão</string>
<string name="noCardsMessage">Adicione primeiro um cartão</string>
<string name="noStoreError">Nenhum nome inserido</string>
<string name="noCardExistsError">Não foi possível encontrar o cartão</string>
<string name="noCardExistsError">Não foi possível encontrar esse cartão</string>
<string name="failedParsingImportUriError">Não foi possível analisar o URI de importação</string>
<string name="importExport">Importar / exportar</string>
<string name="exportName">Exportar</string>
<string name="importSuccessful">Dados do cartão importados</string>
<string name="noGroups">Primeiro clique no botão + para adicionar grupos para categorização.</string>
<string name="noGroupCards">Este grupo não contém cartões</string>
<string name="importSuccessful">Dados importados</string>
<string name="noGroups">Clique no botão + para adicionar grupos para categorização.</string>
<string name="noGroupCards">Este grupo está vazio</string>
<string name="intent_import_card_from_url_share_text">Quero partilhar um cartão</string>
<string name="settings_display_barcode_max_brightness">Iluminar o código de barras</string>
<string name="settings_keep_screen_on">Manter ecrã ligado</string>
@@ -55,7 +55,7 @@
<string name="groups">Grupos</string>
<string name="settings_lock_barcode_orientation">Bloquear orientação do código de barras</string>
<string name="settings_disable_lockscreen_while_viewing_card">Desativar bloqueio do ecrã</string>
<string name="exportSuccessful">Dados do cartão exportados</string>
<string name="exportSuccessful">Dados exportados</string>
<string name="all">Todos</string>
<string name="deleteConfirmationGroup">Eliminar o grupo\?</string>
<string name="settings">Configurações</string>
@@ -66,28 +66,28 @@
<string name="settings_dark_theme">Escuro</string>
<string name="settings_max_font_size_scale">Tamanho máximo da fonte</string>
<string name="selectBarcodeTitle">Selecionar código de barras</string>
<string name="enterBarcodeInstructions">Introduza o identificador do cartão e depois escolha o tipo de código de barras abaixo ou \"Este cartão não tem código de barras\".</string>
<string name="copy_to_clipboard_toast">Identificador do cartão copiado para a área de transferência</string>
<string name="thumbnailDescription">Miniatura do cartão</string>
<string name="enterBarcodeInstructions">Introduza o identificador e depois escolha o tipo de código de barras abaixo ou \"Sem código de barras\".</string>
<string name="copy_to_clipboard_toast">Identificador copiado para a área de transferência</string>
<string name="thumbnailDescription">Miniatura</string>
<string name="starImage">Favorito</string>
<string name="failedOpeningFileManager">Instalar primeiro um gestor de ficheiros.</string>
<string name="moveUp">Subir</string>
<string name="moveDown">Descer</string>
<string name="leaveWithoutSaveTitle">Sair</string>
<string name="noExternalStoragePermissionError">Conceda primeiro a autorização de acesso ao armazenamento externo para importar ou exportar cartões</string>
<string name="importExportHelp">A cópia de segurança dos seus cartões permite-lhe movê-los para outro dispositivo.</string>
<string name="noExternalStoragePermissionError">Conceda primeiro a autorização de acesso ao armazenamento externo para importar ou exportar dados</string>
<string name="importExportHelp">A cópia de segurança dos seus dados permite-lhe movê-los para outro dispositivo.</string>
<string name="importSuccessfulTitle">Importado</string>
<string name="importFailedTitle">A importação falhou</string>
<string name="importFailed">Não foi possível importar os cartões</string>
<string name="importFailed">Não foi possível importar</string>
<string name="exportSuccessfulTitle">Exportado</string>
<string name="exportFailedTitle">A exportação falhou</string>
<string name="exportFailed">Não foi possível exportar os cartões</string>
<string name="exportFailed">Não foi possível exportar</string>
<string name="importing">A importar…</string>
<string name="exporting">A exportar…</string>
<string name="settings_sky_blue_theme">Azul céu</string>
<string name="report_error">Reportar erro</string>
<string name="barcode">Código de barras</string>
<string name="chooseImportType">De onde importar os dados\?</string>
<string name="chooseImportType">Importar dados de</string>
<string name="card">Cartão</string>
<string name="expiryStateSentence">Expiram: <xliff:g>%s</xliff:g></string>
<string name="app_resources">Recursos livres de terceiros: <xliff:g id="app_resources_list">%s</xliff:g></string>
@@ -97,7 +97,7 @@
<string name="exportPassword">Defina uma palavra-passe para proteger a exportação (opcional)</string>
<string name="exportPasswordHint">Digite a palavra-passe</string>
<string name="setBarcodeId">Definir o valor do código de barras</string>
<string name="sameAsCardId">Igual ao identificador do cartão</string>
<string name="sameAsCardId">Igual ao identificador</string>
<string name="importFidmeMessage">Selecione a exportação <i>fidme-export-request-xxxxxx.zip</i> do FidMe para importar e depois selecione os tipos de código de barras manualmente.
\nPrimeiro crie a exportação no seu perfil do FidMe escolhendo a opção \"Proteção de dados\" e em seguida pressionando \"Extrair os meus dados\".</string>
<string name="importStocardMessage">Selecione a exportação <i>***-sync.zip</i> do Stocard para importar.
@@ -106,15 +106,15 @@
<string name="wrongValueForBarcodeType">O valor não é válido para o tipo de código de barras selecionado</string>
<string name="intent_import_card_from_url_share_multiple_text">Quero partilhar alguns cartões</string>
<string name="removeImage">Remover imagem</string>
<string name="backImageDescription">Imagem de trás do cartão</string>
<string name="frontImageDescription">Imagem frontal do cartão</string>
<string name="backImageDescription">Imagem de trás</string>
<string name="frontImageDescription">Imagem frontal</string>
<string name="photos">Fotografias</string>
<string name="passwordRequired">Introduza a palavra-passe</string>
<string name="settings_green_theme">Verde</string>
<string name="settings_grey_theme">Cinzento</string>
<string name="settings_brown_theme">Castanho</string>
<string name="updateBarcodeQuestionTitle">Atualizar o valor do código de barras\?</string>
<string name="updateBarcodeQuestionText">Alterou a identificação do cartão. Também quer atualizar o código de barras para usar o mesmo valor\?</string>
<string name="updateBarcodeQuestionText">Alterou o identificador. Também quer atualizar o código de barras para usar o mesmo valor\?</string>
<string name="no">Não</string>
<plurals name="groupCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> cartão</item>
@@ -129,7 +129,7 @@
<string name="app_revision_fmt">Informação da revisão: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="expiryStateSentenceExpired">Expirados: <xliff:g>%s</xliff:g></string>
<string name="leaveWithoutSaveConfirmation">Sair sem guardar\?</string>
<string name="addManually">Introduzir manualmente o identificador do cartão</string>
<string name="addManually">Introduzir manualmente o identificador</string>
<string name="addFromImage">Selecionar imagem da galeria</string>
<string name="groupsList">Grupos: <xliff:g>%s</xliff:g></string>
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
@@ -163,7 +163,7 @@
<string name="importVoucherVaultMessage">Selecione a exportação <i>vouchervault.json</i> do Voucher Vault para importar.
\nCrie-a primeiro pressionando a opção \"Exportar\" no Voucher Vault.</string>
<string name="unsupportedBarcodeType">Este tipo de código de barras ainda não pode ser mostrado. Pode vir a ser suportado numa versão posterior da aplicação.</string>
<string name="copy_to_clipboard_multiple_toast">Identificação do cartão copiado para a área de transferência</string>
<string name="copy_to_clipboard_multiple_toast">Identificação copiado para a área de transferência</string>
<string name="setFrontImage">Definir imagem frontal</string>
<string name="setBackImage">Definir imagem de trás</string>
<string name="failedGeneratingShareURL">Não foi possível gerar uma URL partilhável. Por favor reporte isto aos programadores.</string>
@@ -184,7 +184,7 @@
<string name="sort_by_most_recently_used">Mais usados recentemente</string>
<string name="sort_by_expiry">Validade</string>
<string name="sort_by_balance">Saldo</string>
<string name="reverse">Inverter</string>
<string name="reverse">…na ordem inversa</string>
<string name="sort_by">Ordenar por</string>
<string name="version_history">Histórico de versões</string>
<string name="credits">Créditos</string>
@@ -206,14 +206,14 @@
<item quantity="other">Eliminar os cartões <xliff:g>%d</xliff:g> permanentemente\?</item>
</plurals>
<string name="ok">OK</string>
<string name="card_ids_copied">Identificadores dos cartões copiados</string>
<string name="barcodeImageDescriptionWithType">Imagem do código de barras do cartão do tipo <xliff:g>%s</xliff:g></string>
<string name="card_ids_copied">Identificadores copiados</string>
<string name="barcodeImageDescriptionWithType">Imagem do código de barras <xliff:g>%s</xliff:g></string>
<string name="group_edit">Editar grupo</string>
<string name="group_name_already_in_use">O nome do grupo já está a ser usado</string>
<string name="group_name_is_empty">O nome do grupo não pode estar vazio</string>
<string name="group_updated">Grupo atualizado</string>
<string name="editGroup">A editar grupo: <xliff:g>%s</xliff:g></string>
<string name="noGiftCardsGroup">Ainda não tem nenhum cartão de fidelidade. Assim que tenha adicionado alguns, pode atribuí-los ao grupo aqui.</string>
<string name="noGiftCardsGroup">Crie alguns cartões e atribua-os depois ao grupo aqui.</string>
<string name="selectColor">Selecionar cor</string>
<string name="setIcon">Definir ícone</string>
<string name="action_show_details">Mostrar detalhes</string>
@@ -225,4 +225,10 @@
<string name="showMoreInfo">Mostrar info</string>
<string name="hideMoreInfo">Ocultar informação</string>
<string name="options">Opções</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> ponto</item>
<item quantity="other"><xliff:g>%s</xliff:g> pontos</item>
</plurals>
<string name="settings_oled_dark">Fundo preto puro para tema negro</string>
<string name="include_if_asking_support">Se quiser pedir ajuda, inclua as seguintes informações:</string>
</resources>

View File

@@ -239,4 +239,6 @@
<item quantity="many"><xliff:g>%s</xliff:g> баллов</item>
<item quantity="other"><xliff:g>%s</xliff:g> баллов</item>
</plurals>
<string name="settings_oled_dark">Чёрный фон для тёмной темы</string>
<string name="include_if_asking_support">Если вы хотите запросить поддержку, укажите следующую информацию:</string>
</resources>

View File

@@ -50,7 +50,7 @@
<string name="moveBarcodeToCenterOfScreen">Centrera streckkoden på skärmen</string>
<string name="noBarcodeFound">Hittade ingen streckkod</string>
<string name="points">Poäng</string>
<string name="chooseImportType">Importera data från...\?</string>
<string name="chooseImportType">Importera data från</string>
<string name="accept">Acceptera</string>
<string name="importCatima">Importera från Catima</string>
<string name="importFidme">Importera från FidMe</string>
@@ -220,4 +220,12 @@
<string name="noGiftCardsGroup">Skapa några kort och placera dem sedan i den här gruppen.</string>
<string name="translate_platform">på Weblate</string>
<string name="shortcutSelectCard">Välj ett kort</string>
<string name="showMoreInfo">Visa info</string>
<string name="starred">Stjärnmärkt</string>
<string name="hideMoreInfo">Dölj info</string>
<string name="options">Alternativ</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g>%s</xliff:g> poäng</item>
<item quantity="other"><xliff:g>%s</xliff:g> poäng</item>
</plurals>
</resources>

View File

@@ -229,4 +229,6 @@
<item quantity="one"><xliff:g>%s</xliff:g> puan</item>
<item quantity="other"><xliff:g>%s</xliff:g> puan</item>
</plurals>
<string name="settings_oled_dark">Koyu tema için saf siyah arka plan</string>
<string name="include_if_asking_support">Destek talep etmek istiyorsanız, aşağıdaki bilgileri ekleyin:</string>
</resources>

View File

@@ -3,15 +3,17 @@
<string name="app_revision_url">https://github.com/CatimaLoyalty/Android/releases</string>
<string name="action_search">搜尋</string>
<string name="action_add">新增</string>
<string name="noGiftCards">點選 + 按鈕以新增卡片\n或從 ⋮ 選單中匯入卡片</string>
<string name="noMatchingGiftCards">沒有找到任何東西。試試其他關鍵字。</string>
<string name="noGiftCards">點選 + 按鈕以新增卡片或從 ⋮ 選單中匯入卡片</string>
<string name="noMatchingGiftCards">找不到相關結果。試試其他關鍵字。</string>
<string name="storeName">名稱</string>
<string name="note">註記</string>
<string name="cardId">卡片 ID</string>
<string name="barcodeType">條碼種類</string>
<string name="barcodeNoBarcode">此卡片沒有可用的條碼</string>
<string name="barcodeNoBarcode">沒有可用的條碼</string>
<string name="noBarcode">無條碼</string>
<string name="privacy_policy_popup_text">隱私權政策(某些應用程式商店需要此條目): 我們並不會收集任何資料!任何人都可以檢視我們的原始碼並驗證這點。</string>
<string name="privacy_policy_popup_text">隱私權政策(某些應用程式商店需要此條目):
\n
\n我們並不會收集任何資料任何人都可以檢視我們的原始碼並驗證這點。</string>
<string name="star">新增至收藏</string>
<string name="app_license">公共版權 (Copylefted) 的自由軟體,許可 GPLv3+</string>
<string name="unstar">從收藏中移除</string>
@@ -25,22 +27,22 @@
<string name="accept">接受</string>
<string name="addCardTitle">新增卡片</string>
<string name="addFromImage">從圖庫中選擇圖片</string>
<string name="addManually">手動輸入卡片 ID</string>
<string name="addManually">手動輸入 ID</string>
<string name="all">全部</string>
<string name="balance">餘額</string>
<string name="balanceSentence">餘額: <xliff:g>%s</xliff:g></string>
<string name="app_copyright_old">基於 Loyalty Card Keychain\n著作權所有 © 20162020 Branden Archer</string>
<string name="barcode">條碼</string>
<string name="barcodeId">條碼內容</string>
<string name="barcodeImageDescriptionWithType">條碼種類 <xliff:g>%s</xliff:g>圖片</string>
<string name="barcodeImageDescriptionWithType">圖片為 <xliff:g>%s</xliff:g>條碼</string>
<string name="card">卡片</string>
<string name="card_ids_copied">已複製卡片 ID(s)</string>
<string name="card_ids_copied">已複製 ID(s)</string>
<string name="cardShortcut">卡片捷徑</string>
<string name="chooseExpiryDate">選擇逾期日期</string>
<string name="chooseImportType">哪裡匯入資料</string>
<string name="chooseImportType">地點匯入資料</string>
<string name="copy_to_clipboard">已複製 ID 至剪貼簿中</string>
<string name="copy_to_clipboard_multiple_toast">已複製多個卡片 ID 至剪貼簿中</string>
<string name="copy_to_clipboard_toast">已複製卡片 ID 至剪貼簿中</string>
<string name="copy_to_clipboard_multiple_toast">已複製多個 ID 至剪貼簿中</string>
<string name="copy_to_clipboard_toast">已複製 ID 至剪貼簿中</string>
<string name="credits">貢獻者</string>
<string name="currency">幣別</string>
<string name="debug_version_fmt">版本:<xliff:g id="version">%s</xliff:g></string>
@@ -50,29 +52,29 @@
<string name="editBarcode">編輯條碼</string>
<string name="editCardTitle">編輯圖片</string>
<string name="enter_group_name">輸入群組名稱</string>
<string name="enterBarcodeInstructions">輸入卡片 ID、選擇條碼種類、或選擇「此卡片沒有可用的條碼」。</string>
<string name="enterBarcodeInstructions">輸入 ID、選擇條碼種類、或選擇「此卡片沒有可用的條碼」。</string>
<string name="errorReadingImage">無法讀取此圖片</string>
<string name="expiryDate">逾期日期</string>
<string name="expiryStateSentence">逾期於:<xliff:g>%s</xliff:g></string>
<string name="expiryStateSentenceExpired">已逾期:<xliff:g>%s</xliff:g></string>
<string name="exportFailed">無法匯出卡片</string>
<string name="exportFailed">無法進行匯出</string>
<string name="exportFailedTitle">匯出失敗</string>
<string name="exporting">匯出中…</string>
<string name="exportName">匯出</string>
<string name="exportOptionExplanation">資料將寫至您所選的位置。</string>
<string name="exportPassword">透過密碼保護您的匯出檔 (選用)</string>
<string name="exportPasswordHint">輸入密碼</string>
<string name="exportSuccessful">已匯出卡片資訊</string>
<string name="exportSuccessful">已匯出資料</string>
<string name="exportSuccessfulTitle">已匯出</string>
<string name="failedOpeningFileManager">請先安裝檔案管理員。</string>
<string name="failedParsingImportUriError">無法讀取匯入 URI</string>
<string name="frontImageDescription">卡片 (正面)</string>
<string name="frontImageDescription">正面圖片</string>
<string name="groups">群組</string>
<string name="groupsList">群組:<xliff:g>%s</xliff:g></string>
<string name="help_translate_this_app">幫助翻譯本程式</string>
<string name="importExport">匯入/匯出</string>
<string name="importFailedTitle">匯入失敗</string>
<string name="importFailed">無法匯入卡片</string>
<string name="importFailed">無法匯入資料</string>
<string name="importing">匯入中…</string>
<string name="importSuccessfulTitle">已匯入</string>
<string name="intent_import_card_from_url_share_multiple_text">我想要分享些卡片給你</string>
@@ -83,8 +85,8 @@
<string name="never">永不</string>
<string name="no"></string>
<string name="noBarcodeFound">找不到可用的條碼</string>
<string name="noCardExistsError">無法找到卡片</string>
<string name="noCardIdError">尚未輸入卡片 ID</string>
<string name="noCardExistsError">無法找到卡片</string>
<string name="noCardIdError">尚未輸入 ID</string>
<string name="noCardsMessage">請先新增卡片</string>
<string name="sort">排列</string>
<string name="settings_catima_theme">Catima</string>
@@ -100,7 +102,7 @@
<string name="sort_by_most_recently_used">最近使用</string>
<string name="sort_by_expiry">逾期日期</string>
<string name="sort_by_balance">餘額</string>
<string name="reverse">反序</string>
<string name="reverse">...以反序排列</string>
<string name="sort_by">排列方式</string>
<string name="version_history">版本歷史</string>
<string name="source_repository">原始碼版本庫</string>
@@ -110,7 +112,7 @@
<string name="on_google_play">於 Google Play</string>
<string name="report_error">回報錯誤</string>
<string name="setBarcodeId">設定條碼內容</string>
<string name="sameAsCardId">卡片 ID 相同</string>
<string name="sameAsCardId">與 ID 相同</string>
<string name="photos">圖片</string>
<string name="setFrontImage">設定正面圖片</string>
<string name="setBackImage">設定背面圖片</string>
@@ -127,7 +129,7 @@
<string name="app_contributors">感謝以下貢獻者: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="privacy_policy">隱私權政策</string>
<plurals name="selectedCardCount">
<item quantity="other">已選取 <xliff:g>%d</xliff:g> 張卡片</item>
<item quantity="other">已選取 <xliff:g>%d</xliff:g></item>
</plurals>
<plurals name="deleteCardsTitle">
<item quantity="other">刪除 <xliff:g>%d</xliff:g> 張卡片</item>
@@ -142,8 +144,8 @@
<string name="share">分享</string>
<string name="settings_system_theme">系統主題</string>
<string name="settings_theme">主題</string>
<string name="thumbnailDescription">卡片縮圖</string>
<string name="noGroupCards">此群組中無任何卡片</string>
<string name="thumbnailDescription">縮圖</string>
<string name="noGroupCards">此群組為空</string>
<string name="settings_category_title_ui">用戶界面</string>
<string name="settings_max_font_size_scale">最大字體大小</string>
<string name="settings_light_theme">淺色</string>
@@ -152,17 +154,17 @@
<string name="settings_lock_barcode_orientation">鎖定條碼螢幕方向</string>
<string name="settings_keep_screen_on">螢幕恆亮</string>
<string name="settings_disable_lockscreen_while_viewing_card">防止螢幕鎖定</string>
<string name="importSuccessful">已匯入卡片資訊</string>
<string name="importSuccessful">已匯入資料</string>
<string name="moveUp">往上移動</string>
<string name="moveDown">往下移動</string>
<string name="lockScreen">禁止旋轉</string>
<string name="unlockScreen">允許旋轉</string>
<string name="ok">OK</string>
<string name="sendLabel">送出…</string>
<string name="scanCardBarcode">掃描卡片條碼</string>
<string name="scanCardBarcode">掃描條碼</string>
<string name="noStoreError">尚未輸入卡片名稱</string>
<string name="importExportHelp">備份您的卡片以將這些卡片移至其他裝置中。</string>
<string name="noExternalStoragePermissionError">在匯入及匯出卡片前,請先允許外部儲存裝置存取權限</string>
<string name="importExportHelp">備份您的資料以將其轉移至其他裝置中。</string>
<string name="noExternalStoragePermissionError">在匯入及匯出資料前,請先允許外部儲存裝置存取權限</string>
<string name="importOptionFilesystemTitle">自檔案系統中匯入</string>
<string name="importOptionFilesystemExplanation">自檔案系統中選取檔案。</string>
<string name="importOptionFilesystemButton">自檔案系統</string>
@@ -174,7 +176,7 @@
<string name="importVoucherVaultMessage">選取您自 Voucher Vault 匯出的 <i>vouchervault.json</i> 檔案以進行匯入。
\n請您先透過 Voucher Vault 進行匯出。</string>
<string name="importStocard">自 Stocard 中匯入</string>
<string name="importStocardMessage">>選取您自 Stocard 匯出的 <i>***-sync.zip</i> 檔案以進行匯入。
<string name="importStocardMessage">&gt;選取您自 Stocard 匯出的 <i>***-sync.zip</i> 檔案以進行匯入。
\n請您寫封 Email 至 support@stocardapp.com 索取您的資料。</string>
<string name="importLoyaltyCardKeychain">自 Loyalty Card Keychain 中匯入</string>
<string name="importLoyaltyCardKeychainMessage">選取您自 Loyalty Card Keychain <i>LoyaltyCardKeychain.csv</i> 檔案以進行匯入。
@@ -191,15 +193,37 @@
<string name="app_libraries">第三方自由函示庫:<xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources">第三方自由資源:<xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">選擇條碼</string>
<string name="noGroups">點選 + 加號按鈕新增群組。</string>
<string name="noGroups">請點選 + 加號按鈕新增群組。</string>
<string name="moveBarcodeToTopOfScreen">將條碼移至螢幕上方</string>
<string name="moveBarcodeToCenterOfScreen">將條碼移至螢幕中央</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="unsupportedBarcodeType">尚支援此條碼種類,但未來版本的應用程式可能會支援此條碼種類。</string>
<string name="wrongValueForBarcodeType">條碼內容不適用於此條碼種類</string>
<string name="backImageDescription">卡片 (背面)</string>
<string name="updateBarcodeQuestionText">您已更新了條碼 ID是否要更新條碼內容以匹配此 ID</string>
<string name="backImageDescription">背面圖片</string>
<string name="updateBarcodeQuestionText">您已更新了 ID是否要更新條碼內容以匹配此 ID</string>
<string name="failedGeneratingShareURL">無法建立可分享的 URL請回報此錯誤。</string>
<string name="swipeToSwitchImages">滑動或長按以切換圖片</string>
<string name="starImage">收藏標示</string>
<string name="noGiftCardsGroup">建立一些卡片,然後將它們分配到這個群組中。</string>
<string name="showMoreInfo">顯示資訊</string>
<string name="hideMoreInfo">隱藏資訊</string>
<string name="action_show_details">顯示詳情</string>
<string name="shortcutSelectCard">選擇卡片</string>
<string name="starred">已收藏</string>
<plurals name="balancePoints">
<item quantity="other"><xliff:g>%s</xliff:g> 個點數</item>
</plurals>
<string name="selectColor">選擇顏色</string>
<string name="setIcon">設定圖示</string>
<string name="group_edit">編輯群組</string>
<string name="group_name_already_in_use">此群組名稱已存在</string>
<string name="group_name_is_empty">群組名稱不能為空</string>
<string name="group_updated">已更新群組</string>
<string name="editGroup">編輯群組中:<xliff:g>%s</xliff:g></string>
<string name="settings_oled_dark">使用深色主題時,使用純黑色背景</string>
<string name="action_hide_details">隱藏詳情</string>
<string name="translate_platform">於 Weblate</string>
<string name="options">選項</string>
<string name="set_scale">設定大小</string>
<string name="include_if_asking_support">如果您想請求協助,請附上以下訊息:</string>
</resources>

View File

@@ -12,6 +12,52 @@
<item>@string/settings_dark_theme</item>
</string-array>
<string-array name="color_values">
<item>@string/settings_key_system_theme</item>
<item>@string/settings_key_catima_theme</item>
<item>@string/settings_key_pink_theme</item>
<item>@string/settings_key_magenta_theme</item>
<item>@string/settings_key_violet_theme</item>
<item>@string/settings_key_blue_theme</item>
<item>@string/settings_key_sky_blue_theme</item>
<item>@string/settings_key_green_theme</item>
<item>@string/settings_key_brown_theme</item>
</string-array>
<string-array name="color_value_strings">
<item>@string/settings_system_theme</item>
<item>@string/settings_catima_theme</item>
<item>@string/settings_pink_theme</item>
<item>@string/settings_magenta_theme</item>
<item>@string/settings_violet_theme</item>
<item>@string/settings_blue_theme</item>
<item>@string/settings_sky_blue_theme</item>
<item>@string/settings_green_theme</item>
<item>@string/settings_brown_theme</item>
</string-array>
<string-array name="color_values_no_dynamic">
<item>@string/settings_key_system_theme</item>
<item>@string/settings_key_pink_theme</item>
<item>@string/settings_key_magenta_theme</item>
<item>@string/settings_key_violet_theme</item>
<item>@string/settings_key_blue_theme</item>
<item>@string/settings_key_sky_blue_theme</item>
<item>@string/settings_key_green_theme</item>
<item>@string/settings_key_brown_theme</item>
</string-array>
<string-array name="color_value_strings_no_dynamic">
<item>@string/settings_catima_theme</item>
<item>@string/settings_pink_theme</item>
<item>@string/settings_magenta_theme</item>
<item>@string/settings_violet_theme</item>
<item>@string/settings_blue_theme</item>
<item>@string/settings_sky_blue_theme</item>
<item>@string/settings_green_theme</item>
<item>@string/settings_brown_theme</item>
</string-array>
<string-array name="locale_values">
<item />
<item>bg</item>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="action_search">Search</string>
<string name="action_add">Add card</string>
<string name="action_add">Add</string>
<plurals name="selectedCardCount">
<item quantity="one"><xliff:g>%d</xliff:g> selected</item>
<item quantity="other"><xliff:g>%d</xliff:g> selected</item>
@@ -18,9 +18,8 @@
<string name="star">Add to favorites</string>
<string name="unstar">Remove from favorites</string>
<string name="cancel">Cancel</string>
<string name="save">Save changes</string>
<string name="save">Save</string>
<string name="edit">Edit</string>
<string name="edit_card">Edit card</string>
<string name="delete">Delete</string>
<string name="confirm">Confirm</string>
<string name="lockScreen">Block Rotation</string>
@@ -269,5 +268,5 @@
<string name="options">Options</string>
<string name="starred">Starred</string>
<string name="set_scale">Set scale</string>
<string name="saving">Saving...</string>
<string name="include_if_asking_support">If you want to request support, include the following info:</string>
</resources>

View File

@@ -52,4 +52,208 @@
<!-- place holder for dark background night theme overrides -->
<style name="DarkBackground" />
<!-- color themes -->
<style name="pink">
<item name="colorPrimary">#BC0049</item>
<item name="colorOnPrimary">#FFFFFF</item>
<item name="colorPrimaryContainer">#FFD9DF</item>
<item name="colorOnPrimaryContainer">#400013</item>
<item name="colorSecondary">#76565B</item>
<item name="colorOnSecondary">#FFFFFF</item>
<item name="colorSecondaryContainer">#FFD9DE</item>
<item name="colorOnSecondaryContainer">#2B1519</item>
<item name="colorTertiary">#795831</item>
<item name="colorOnTertiary">#FFFFFF</item>
<item name="colorTertiaryContainer">#FFDDB8</item>
<item name="colorOnTertiaryContainer">#2C1700</item>
<item name="colorError">#BA1B1B</item>
<item name="colorErrorContainer">#FFDAD4</item>
<item name="colorOnError">#FFFFFF</item>
<item name="colorOnErrorContainer">#410001</item>
<item name="android:colorBackground">#FCFCFC</item>
<item name="colorOnBackground">#201A1B</item>
<item name="colorSurface">#FCFCFC</item>
<item name="colorOnSurface">#201A1B</item>
<item name="colorSurfaceVariant">#F4DDDF</item>
<item name="colorOnSurfaceVariant">#524345</item>
<item name="colorOutline">#847375</item>
<item name="colorOnSurfaceInverse">#FAEEEE</item>
<item name="colorSurfaceInverse">#362F30</item>
<item name="colorPrimaryInverse">#FFB2C0</item>
</style>
<style name="magenta">
<item name="colorPrimary">#9A25AE</item>
<item name="colorOnPrimary">#FFFFFF</item>
<item name="colorPrimaryContainer">#FFD5FF</item>
<item name="colorOnPrimaryContainer">#350040</item>
<item name="colorSecondary">#6B586B</item>
<item name="colorOnSecondary">#FFFFFF</item>
<item name="colorSecondaryContainer">#F5DBF2</item>
<item name="colorOnSecondaryContainer">#251626</item>
<item name="colorTertiary">#82524A</item>
<item name="colorOnTertiary">#FFFFFF</item>
<item name="colorTertiaryContainer">#FFDAD2</item>
<item name="colorOnTertiaryContainer">#32110C</item>
<item name="colorError">#BA1B1B</item>
<item name="colorErrorContainer">#FFDAD4</item>
<item name="colorOnError">#FFFFFF</item>
<item name="colorOnErrorContainer">#410001</item>
<item name="android:colorBackground">#FCFCFC</item>
<item name="colorOnBackground">#1E1A1D</item>
<item name="colorSurface">#FCFCFC</item>
<item name="colorOnSurface">#1E1A1D</item>
<item name="colorSurfaceVariant">#ECDEE8</item>
<item name="colorOnSurfaceVariant">#4D444C</item>
<item name="colorOutline">#7E747C</item>
<item name="colorOnSurfaceInverse">#F7EEF3</item>
<item name="colorSurfaceInverse">#332F32</item>
<item name="colorPrimaryInverse">#FBAAFF</item>
</style>
<style name="violet">
<item name="colorPrimary">#6F43BF</item>
<item name="colorOnPrimary">#FFFFFF</item>
<item name="colorPrimaryContainer">#ECDCFF</item>
<item name="colorOnPrimaryContainer">#25005B</item>
<item name="colorSecondary">#635B70</item>
<item name="colorOnSecondary">#FFFFFF</item>
<item name="colorSecondaryContainer">#E9DEF7</item>
<item name="colorOnSecondaryContainer">#1F182B</item>
<item name="colorTertiary">#7F525E</item>
<item name="colorOnTertiary">#FFFFFF</item>
<item name="colorTertiaryContainer">#FFD9E2</item>
<item name="colorOnTertiaryContainer">#32101B</item>
<item name="colorError">#BA1B1B</item>
<item name="colorErrorContainer">#FFDAD4</item>
<item name="colorOnError">#FFFFFF</item>
<item name="colorOnErrorContainer">#410001</item>
<item name="android:colorBackground">#FFFBFD</item>
<item name="colorOnBackground">#1D1B1F</item>
<item name="colorSurface">#FFFBFD</item>
<item name="colorOnSurface">#1D1B1F</item>
<item name="colorSurfaceVariant">#E7E0EB</item>
<item name="colorOnSurfaceVariant">#49454E</item>
<item name="colorOutline">#7A757F</item>
<item name="colorOnSurfaceInverse">#F5EFF4</item>
<item name="colorSurfaceInverse">#323033</item>
<item name="colorPrimaryInverse">#D4BAFF</item>
</style>
<style name="blue">
<item name="colorPrimary">#4355B9</item>
<item name="colorOnPrimary">#FFFFFF</item>
<item name="colorPrimaryContainer">#DDE0FF</item>
<item name="colorOnPrimaryContainer">#000D61</item>
<item name="colorSecondary">#5B5D71</item>
<item name="colorOnSecondary">#FFFFFF</item>
<item name="colorSecondaryContainer">#E0E1FA</item>
<item name="colorOnSecondaryContainer">#171A2C</item>
<item name="colorTertiary">#77536D</item>
<item name="colorOnTertiary">#FFFFFF</item>
<item name="colorTertiaryContainer">#FFD7F3</item>
<item name="colorOnTertiaryContainer">#2D1228</item>
<item name="colorError">#BA1B1B</item>
<item name="colorErrorContainer">#FFDAD4</item>
<item name="colorOnError">#FFFFFF</item>
<item name="colorOnErrorContainer">#410001</item>
<item name="android:colorBackground">#FEFBFF</item>
<item name="colorOnBackground">#1B1B1F</item>
<item name="colorSurface">#FEFBFF</item>
<item name="colorOnSurface">#1B1B1F</item>
<item name="colorSurfaceVariant">#E3E1EC</item>
<item name="colorOnSurfaceVariant">#46464F</item>
<item name="colorOutline">#767680</item>
<item name="colorOnSurfaceInverse">#F3F0F5</item>
<item name="colorSurfaceInverse">#303034</item>
<item name="colorPrimaryInverse">#B9C3FF</item>
</style>
<style name="skyblue">
<item name="colorPrimary">#006494</item>
<item name="colorOnPrimary">#FFFFFF</item>
<item name="colorPrimaryContainer">#C8E6FF</item>
<item name="colorOnPrimaryContainer">#001E31</item>
<item name="colorSecondary">#50606E</item>
<item name="colorOnSecondary">#FFFFFF</item>
<item name="colorSecondaryContainer">#D3E4F5</item>
<item name="colorOnSecondaryContainer">#0C1D29</item>
<item name="colorTertiary">#65597B</item>
<item name="colorOnTertiary">#FFFFFF</item>
<item name="colorTertiaryContainer">#ECDCFF</item>
<item name="colorOnTertiaryContainer">#201634</item>
<item name="colorError">#BA1B1B</item>
<item name="colorErrorContainer">#FFDAD4</item>
<item name="colorOnError">#FFFFFF</item>
<item name="colorOnErrorContainer">#410001</item>
<item name="android:colorBackground">#FCFCFF</item>
<item name="colorOnBackground">#1A1C1E</item>
<item name="colorSurface">#FCFCFF</item>
<item name="colorOnSurface">#1A1C1E</item>
<item name="colorSurfaceVariant">#DEE3EA</item>
<item name="colorOnSurfaceVariant">#41474D</item>
<item name="colorOutline">#72787E</item>
<item name="colorOnSurfaceInverse">#F0F0F3</item>
<item name="colorSurfaceInverse">#2F3032</item>
<item name="colorPrimaryInverse">#8BCEFF</item>
</style>
<style name="green">
<item name="colorPrimary">#006E17</item>
<item name="colorOnPrimary">#FFFFFF</item>
<item name="colorPrimaryContainer">#93F990</item>
<item name="colorOnPrimaryContainer">#002203</item>
<item name="colorSecondary">#52634F</item>
<item name="colorOnSecondary">#FFFFFF</item>
<item name="colorSecondaryContainer">#D5E8CE</item>
<item name="colorOnSecondaryContainer">#101F0F</item>
<item name="colorTertiary">#38656A</item>
<item name="colorOnTertiary">#FFFFFF</item>
<item name="colorTertiaryContainer">#BCEBF0</item>
<item name="colorOnTertiaryContainer">#001F23</item>
<item name="colorError">#BA1B1B</item>
<item name="colorErrorContainer">#FFDAD4</item>
<item name="colorOnError">#FFFFFF</item>
<item name="colorOnErrorContainer">#410001</item>
<item name="android:colorBackground">#FCFDF6</item>
<item name="colorOnBackground">#1A1C19</item>
<item name="colorSurface">#FCFDF6</item>
<item name="colorOnSurface">#1A1C19</item>
<item name="colorSurfaceVariant">#DEE5D8</item>
<item name="colorOnSurfaceVariant">#424840</item>
<item name="colorOutline">#73796F</item>
<item name="colorOnSurfaceInverse">#F0F1EB</item>
<item name="colorSurfaceInverse">#2F312D</item>
<item name="colorPrimaryInverse">#78DC77</item>
</style>
<style name="brown">
<item name="colorPrimary">#9A4523</item>
<item name="colorOnPrimary">#FFFFFF</item>
<item name="colorPrimaryContainer">#FFDBCD</item>
<item name="colorOnPrimaryContainer">#380C00</item>
<item name="colorSecondary">#77574C</item>
<item name="colorOnSecondary">#FFFFFF</item>
<item name="colorSecondaryContainer">#FFDBCD</item>
<item name="colorOnSecondaryContainer">#2C160D</item>
<item name="colorTertiary">#695E2F</item>
<item name="colorOnTertiary">#FFFFFF</item>
<item name="colorTertiaryContainer">#F1E2A7</item>
<item name="colorOnTertiaryContainer">#221B00</item>
<item name="colorError">#BA1B1B</item>
<item name="colorErrorContainer">#FFDAD4</item>
<item name="colorOnError">#FFFFFF</item>
<item name="colorOnErrorContainer">#410001</item>
<item name="android:colorBackground">#FCFCFC</item>
<item name="colorOnBackground">#201A18</item>
<item name="colorSurface">#FCFCFC</item>
<item name="colorOnSurface">#201A18</item>
<item name="colorSurfaceVariant">#F5DED6</item>
<item name="colorOnSurfaceVariant">#52433E</item>
<item name="colorOutline">#85736D</item>
<item name="colorOnSurfaceInverse">#FCEEEA</item>
<item name="colorSurfaceInverse">#362F2D</item>
<item name="colorPrimaryInverse">#FFB598</item>
</style>
</resources>

View File

@@ -15,6 +15,15 @@
app:iconSpaceReserved="false"
app:singleLineTitle="false" />
<ListPreference
android:key="@string/setting_key_theme_color"
android:title="@string/settings_theme_color"
android:defaultValue="@string/settings_key_system_theme"
android:entries="@array/color_value_strings"
android:entryValues="@array/color_values"
app:iconSpaceReserved="false"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="@string/settings_key_oled_dark"

View File

@@ -49,6 +49,7 @@ import androidx.core.content.res.ResourcesCompat;
import protect.card_locker.async.TaskHandler;
import protect.card_locker.importexport.DataFormat;
import protect.card_locker.importexport.ImportExportResult;
import protect.card_locker.importexport.ImportExportResultType;
import protect.card_locker.importexport.MultiFormatExporter;
import protect.card_locker.importexport.MultiFormatImporter;
@@ -324,7 +325,7 @@ public class ImportExportTest {
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
outStream.close();
TestHelpers.getEmptyDb(activity);
@@ -333,7 +334,7 @@ public class ImportExportTest {
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -354,7 +355,7 @@ public class ImportExportTest {
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, password);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
outStream.close();
TestHelpers.getEmptyDb(activity);
@@ -363,7 +364,7 @@ public class ImportExportTest {
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, password);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -386,7 +387,7 @@ public class ImportExportTest {
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
outStream.close();
TestHelpers.getEmptyDb(activity);
@@ -395,7 +396,7 @@ public class ImportExportTest {
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -457,7 +458,7 @@ public class ImportExportTest {
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
outStream.close();
TestHelpers.getEmptyDb(activity);
@@ -466,7 +467,7 @@ public class ImportExportTest {
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
assertEquals(NUM_GROUPS, DBHelper.getGroupCount(mDatabase));
@@ -500,14 +501,14 @@ public class ImportExportTest {
// Export into CSV data
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
outStream.close();
ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray());
// Import the CSV data on top of the existing database
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -529,7 +530,7 @@ public class ImportExportTest {
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
TestHelpers.getEmptyDb(activity);
@@ -543,7 +544,7 @@ public class ImportExportTest {
// Attempt to import the data
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, format, null);
assertEquals(ImportExportResult.GenericFailure, result);
assertEquals(ImportExportResultType.GenericFailure, result.resultType());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -586,7 +587,7 @@ public class ImportExportTest {
// Check that the listener was executed
assertNotNull(listener.result);
assertEquals(ImportExportResult.Success, listener.result);
assertEquals(ImportExportResultType.Success, listener.result.resultType());
TestHelpers.getEmptyDb(activity);
@@ -607,7 +608,7 @@ public class ImportExportTest {
// Check that the listener was executed
assertNotNull(listener.result);
assertEquals(ImportExportResult.Success, listener.result);
assertEquals(ImportExportResultType.Success, listener.result.resultType());
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
@@ -633,7 +634,7 @@ public class ImportExportTest {
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -670,7 +671,7 @@ public class ImportExportTest {
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -707,7 +708,7 @@ public class ImportExportTest {
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.GenericFailure, result);
assertEquals(ImportExportResultType.GenericFailure, result.resultType());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
TestHelpers.getEmptyDb(activity);
@@ -731,7 +732,7 @@ public class ImportExportTest {
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -768,7 +769,7 @@ public class ImportExportTest {
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -805,7 +806,7 @@ public class ImportExportTest {
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -842,7 +843,7 @@ public class ImportExportTest {
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
csvText = "";
@@ -861,7 +862,7 @@ public class ImportExportTest {
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -1020,7 +1021,7 @@ public class ImportExportTest {
// Import the CSV data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(7, DBHelper.getLoyaltyCardCount(mDatabase));
assertEquals(3, DBHelper.getGroupCount(mDatabase));
@@ -1162,7 +1163,7 @@ public class ImportExportTest {
// Import the Fidme data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Fidme, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -1210,13 +1211,13 @@ public class ImportExportTest {
// Import the Stocard data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Stocard, null);
assertEquals(ImportExportResult.BadPassword, result);
assertEquals(ImportExportResultType.BadPassword, result.resultType());
assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase));
inputStream = getClass().getResourceAsStream("stocard.zip");
result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Stocard, "da811b40a4dac56f0cbb2d99b21bbb9a".toCharArray());
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);
@@ -1302,7 +1303,7 @@ public class ImportExportTest {
// Import the Voucher Vault data
ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.VoucherVault, null);
assertEquals(ImportExportResult.Success, result);
assertEquals(ImportExportResultType.Success, result.resultType());
assertEquals(2, DBHelper.getLoyaltyCardCount(mDatabase));
LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);

View File

@@ -28,7 +28,7 @@ import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.textfield.MaterialAutoCompleteTextView;
import com.google.android.material.textfield.TextInputLayout;
@@ -313,6 +313,24 @@ public class LoyaltyCardViewActivityTest {
}
}
@Test
@Config(qualifiers="de")
public void noCrashOnRegionlessLocale() {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
final Context context = activity.getApplicationContext();
activityController.start();
activityController.visible();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check default settings
checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null);
}
@Test
public void noDataLossOnResumeOrRotate() {
registerMediaStoreIntentHandler();
@@ -1218,7 +1236,7 @@ public class LoyaltyCardViewActivityTest {
ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton);
ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton);
LinearLayout dotIndicator = activity.findViewById(R.id.dotIndicator);
ExtendedFloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
FloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler);
// Android should not be in fullscreen mode
@@ -1322,7 +1340,7 @@ public class LoyaltyCardViewActivityTest {
View bottomSheet = activity.findViewById(R.id.bottom_sheet);
ImageButton maximizeButton = activity.findViewById(R.id.maximizeButton);
ImageButton minimizeButton = activity.findViewById(R.id.minimizeButton);
ExtendedFloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
FloatingActionButton editButton = activity.findViewById(R.id.fabEdit);
SeekBar barcodeScaler = activity.findViewById(R.id.barcodeScaler);
// Android should not be in fullscreen mode

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