Compare commits

...

35 Commits

Author SHA1 Message Date
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
42 changed files with 814 additions and 151 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,6 @@
# Changelog
## Unreleased - 101
## 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 101
versionName "2.15.0"
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

@@ -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

@@ -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;
@@ -135,6 +136,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity {
Button enterButton;
Toolbar toolbar;
int loyaltyCardId;
boolean updateLoyaltyCard;
String cardId;
@@ -291,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) {
@@ -690,9 +693,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
@@ -906,7 +922,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");
}
@@ -1391,13 +1407,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() {

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,6 +33,7 @@ import android.widget.Toast;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.io.UnsupportedEncodingException;
@@ -580,10 +581,13 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
editButton.setBackgroundTintList(ColorStateList.valueOf(complementaryColor));
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.setImageDrawable(editButtonIcon);
@@ -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

@@ -180,20 +180,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);

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

@@ -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

@@ -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

@@ -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,5 @@
<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>
</resources>

View File

@@ -229,4 +229,5 @@
<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>
</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>
@@ -223,6 +223,11 @@
<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>
</resources>
<string name="showMoreInfo">Vis info</string>
<string name="hideMoreInfo">Skjul info</string>
<plurals name="balancePoints">
<item quantity="one"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> poeng</item>
<item quantity="other"><xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%d</xliff:g> poeng</item>
</plurals>
<string name="settings_oled_dark">Svart bakgrunn for mørk drakt</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,5 @@
<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>
</resources>

View File

@@ -239,4 +239,5 @@
<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>
</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,5 @@
<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>
</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

@@ -268,4 +268,5 @@
<string name="options">Options</string>
<string name="starred">Starred</string>
<string name="set_scale">Set scale</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

@@ -0,0 +1,3 @@
- Korrektur des Zuschneidesystems, das die Farbe des Themas nicht berücksichtigt hat
- Behebung kleinerer Fehler beim Thema
- Rein schwarzes Dunkelthema für OLED-Bildschirme hinzugefügt

View File

@@ -0,0 +1,3 @@
- Correction du système de recadrage qui ne respectait pas la couleur du thème
- Correction de problèmes mineurs liés aux thèmes
- Ajout d'un thème noir pur pour les écrans OLED

View File

@@ -0,0 +1,3 @@
- Sistemato lo strumento di ritaglio, che non usava i colori del tema
- Sistemati problemi secondari sul tema
- Aggiunto il tema scuro con sfondo nero puro per schermi OLED

View File

@@ -0,0 +1 @@
- Evitato che l'app crashi quando lo schermo si ruota nell'introduzione del primo avvio.

View File

@@ -1 +1,3 @@
- Kırpıcının tema rengini kullanmaması düzeltildi
- Küçük tema sorunları düzeltildi
- OLED ekranlar için saf siyah koyu tema eklendi