Compare commits

..

1 Commits

Author SHA1 Message Date
Sylvia van Os
83e381b24e Re-enable missingQuantity lint checks
https://github.com/WeblateOrg/weblate/issues/7520
2025-07-24 23:16:13 +02:00
81 changed files with 328 additions and 705 deletions

View File

@@ -1,9 +1,8 @@
# Changelog
## v2.36.0 - 150 (2025-08-05)
## Unreleased - 150
- Add a widget showing all non-archived cards
- Prevent the keyboard from overlapping the save button in edit and group screens
- Made it harder to accidentally close edit view
## v2.35.1 - 149 (2025-06-17)

View File

@@ -17,8 +17,8 @@ android {
applicationId = "me.hackerchick.catima"
minSdk = 21
targetSdk = 35
versionCode = 150
versionName = "2.36.0"
versionCode = 149
versionName = "2.35.1"
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true
@@ -112,7 +112,6 @@ dependencies {
implementation("androidx.appcompat:appcompat:1.7.1")
implementation("androidx.constraintlayout:constraintlayout:2.2.1")
implementation("androidx.core:core-ktx:1.16.0")
implementation("androidx.core:core-remoteviews:1.1.0")
implementation("androidx.core:core-splashscreen:1.0.1")
implementation("androidx.exifinterface:exifinterface:1.4.1")
implementation("androidx.palette:palette:1.0.0")
@@ -129,7 +128,7 @@ dependencies {
implementation("net.lingala.zip4j:zip4j:2.11.5")
// Testing
val androidXTestVersion = "1.7.0"
val androidXTestVersion = "1.6.1"
val junitVersion = "4.13.2"
testImplementation("androidx.test:core:$androidXTestVersion")
testImplementation("junit:junit:$junitVersion")
@@ -137,10 +136,10 @@ dependencies {
androidTestImplementation("androidx.test:core:$androidXTestVersion")
androidTestImplementation("junit:junit:$junitVersion")
androidTestImplementation("androidx.test.ext:junit:1.3.0")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test:runner:$androidXTestVersion")
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0")
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
}
tasks.register("copyRawResFiles", Copy::class) {

View File

@@ -30,20 +30,6 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:localeConfig="@xml/locales_config">
<receiver
android:name=".ListWidget"
android:label="@string/card_list_widget_name"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/list_widget_info" />
</receiver>
<activity
android:name=".MainActivity"
android:exported="true"
@@ -89,8 +75,7 @@
<activity
android:name=".ManageGroupActivity"
android:label="@string/group_edit"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"/>
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".LoyaltyCardViewActivity"
android:exported="true"

View File

@@ -0,0 +1,126 @@
package protect.card_locker;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import com.google.zxing.BarcodeFormat;
import java.util.ArrayList;
import protect.card_locker.databinding.BarcodeSelectorActivityBinding;
/**
* This activity is callable and will allow a user to enter
* barcode data and generate all barcodes possible for
* the data. The user may then select any barcode, where its
* data and type will be returned to the caller.
*/
public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements BarcodeSelectorAdapter.BarcodeSelectorListener {
private BarcodeSelectorActivityBinding binding;
private static final String TAG = "Catima";
// Result this activity will return
public static final String BARCODE_CONTENTS = "contents";
public static final String BARCODE_FORMAT = "format";
private final Handler typingDelayHandler = new Handler(Looper.getMainLooper());
public static final Integer INPUT_DELAY = 250;
private BarcodeSelectorAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = BarcodeSelectorActivityBinding.inflate(getLayoutInflater());
setTitle(R.string.selectBarcodeTitle);
setContentView(binding.getRoot());
Utils.applyWindowInsets(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
enableToolbarBackButton();
EditText cardId = binding.cardId;
ListView mBarcodeList = binding.barcodes;
mAdapter = new BarcodeSelectorAdapter(this, new ArrayList<>(), this);
mBarcodeList.setAdapter(mAdapter);
cardId.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Delay the input processing so we avoid overload
typingDelayHandler.removeCallbacksAndMessages(null);
typingDelayHandler.postDelayed(() -> {
Log.d(TAG, "Entered text: " + s);
runOnUiThread(() -> {
generateBarcodes(s.toString());
});
}, INPUT_DELAY);
}
});
final Bundle b = getIntent().getExtras();
final String initialCardId = b != null ? b.getString(LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID) : null;
if (initialCardId != null) {
cardId.setText(initialCardId);
} else {
generateBarcodes("");
}
}
private void generateBarcodes(String value) {
// Update barcodes
ArrayList<CatimaBarcodeWithValue> barcodes = new ArrayList<>();
for (BarcodeFormat barcodeFormat : CatimaBarcode.barcodeFormats) {
CatimaBarcode catimaBarcode = CatimaBarcode.fromBarcode(barcodeFormat);
barcodes.add(new CatimaBarcodeWithValue(catimaBarcode, value));
}
mAdapter.setBarcodes(barcodes);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
setResult(Activity.RESULT_CANCELED);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onRowClicked(int inputPosition, View view) {
CatimaBarcodeWithValue barcodeWithValue = mAdapter.getItem(inputPosition);
CatimaBarcode catimaBarcode = barcodeWithValue.catimaBarcode();
if (!mAdapter.isValid(view)) {
Toast.makeText(this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show();
return;
}
String barcodeFormat = catimaBarcode.format().name();
String value = barcodeWithValue.value();
Log.d(TAG, "Selected barcode type " + barcodeFormat);
Intent result = new Intent();
result.putExtra(BARCODE_FORMAT, barcodeFormat);
result.putExtra(BARCODE_CONTENTS, value);
BarcodeSelectorActivity.this.setResult(RESULT_OK, result);
finish();
}
}

View File

@@ -1,118 +0,0 @@
package protect.card_locker
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.core.view.MenuProvider
import androidx.core.widget.doOnTextChanged
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import protect.card_locker.BarcodeSelectorAdapter.BarcodeSelectorListener
import protect.card_locker.databinding.BarcodeSelectorActivityBinding
/**
* This activity is callable and will allow a user to enter
* barcode data and generate all barcodes possible for
* the data. The user may then select any barcode, where its
* data and type will be returned to the caller.
*/
class BarcodeSelectorActivity : CatimaAppCompatActivity(), BarcodeSelectorListener, MenuProvider {
private lateinit var binding: BarcodeSelectorActivityBinding
private lateinit var mAdapter: BarcodeSelectorAdapter
companion object {
private const val TAG = "Catima"
// Result this activity will return
const val BARCODE_CONTENTS = "contents"
const val BARCODE_FORMAT = "format"
const val INPUT_DELAY = 250L
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
addMenuProvider(this)
binding = BarcodeSelectorActivityBinding.inflate(layoutInflater)
setTitle(R.string.selectBarcodeTitle)
setContentView(binding.getRoot())
Utils.applyWindowInsets(binding.getRoot())
setSupportActionBar(binding.toolbar)
enableToolbarBackButton()
var typingDelayJob: Job? = null
val cardId = binding.cardId
val mBarcodeList = binding.barcodes
mAdapter = BarcodeSelectorAdapter(this, ArrayList<CatimaBarcodeWithValue?>(), this)
mBarcodeList.adapter = mAdapter
cardId.doOnTextChanged { s, _, _, _ ->
typingDelayJob?.cancel()
typingDelayJob =
lifecycleScope.launch {
delay(INPUT_DELAY) // Delay the input processing so we avoid overload
Log.d(TAG, "Entered text: $s")
generateBarcodes(s.toString())
}
}
val initialCardId = intent.extras?.getString(LoyaltyCard.BUNDLE_LOYALTY_CARD_CARD_ID)
initialCardId?.let {
cardId.setText(initialCardId)
} ?: generateBarcodes("")
}
private fun generateBarcodes(value: String?) {
// Update barcodes
val barcodes = ArrayList<CatimaBarcodeWithValue?>()
CatimaBarcode.barcodeFormats.forEach {
val catimaBarcode = CatimaBarcode.fromBarcode(it)
barcodes.add(CatimaBarcodeWithValue(catimaBarcode, value))
}
mAdapter.setBarcodes(barcodes)
}
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
if (menuItem.itemId == android.R.id.home) {
setResult(RESULT_CANCELED)
finish()
}
return true
}
override fun onRowClicked(inputPosition: Int, view: View) {
val barcodeWithValue = mAdapter.getItem(inputPosition)
val catimaBarcode = barcodeWithValue!!.catimaBarcode()
if (!mAdapter.isValid(view)) {
Toast.makeText(this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show()
return
}
val barcodeFormat = catimaBarcode.format().name
val value = barcodeWithValue.value()
Log.d(TAG, "Selected barcode type $barcodeFormat")
Intent().apply {
putExtra(BARCODE_FORMAT, barcodeFormat)
putExtra(BARCODE_CONTENTS, value)
setResult(RESULT_OK, this)
}
finish()
}
}

View File

@@ -0,0 +1,111 @@
package protect.card_locker;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import protect.card_locker.databinding.CardShortcutConfigureActivityBinding;
import protect.card_locker.preferences.Settings;
/**
* The configuration screen for creating a shortcut.
*/
public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
private CardShortcutConfigureActivityBinding binding;
static final String TAG = "Catima";
private SQLiteDatabase mDatabase;
private LoyaltyCardCursorAdapter mAdapter;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
binding = CardShortcutConfigureActivityBinding.inflate(getLayoutInflater());
mDatabase = new DBHelper(this).getReadableDatabase();
// Set the result to CANCELED. This will cause nothing to happen if the
// aback button is pressed.
setResult(RESULT_CANCELED);
setContentView(binding.getRoot());
Utils.applyWindowInsets(binding.getRoot());
Toolbar toolbar = binding.toolbar;
toolbar.setTitle(R.string.shortcutSelectCard);
setSupportActionBar(toolbar);
// If there are no cards, bail
int cardCount = DBHelper.getLoyaltyCardCount(mDatabase);
if (cardCount == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show();
finish();
}
Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this, null);
binding.list.setAdapter(mAdapter);
}
@Override
protected void onResume() {
super.onResume();
var layoutManager = (GridLayoutManager) binding.list.getLayoutManager();
if (layoutManager != null) {
var settings = new Settings(this);
layoutManager.setSpanCount(settings.getPreferredColumnCount());
}
}
private void onClickAction(int position) {
Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All);
selected.moveToPosition(position);
LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(CardShortcutConfigure.this, selected);
Log.d(TAG, "Creating shortcut for card " + loyaltyCard.store + "," + loyaltyCard.id);
ShortcutInfoCompat shortcut = ShortcutHelper.createShortcutBuilder(CardShortcutConfigure.this, loyaltyCard).build();
setResult(RESULT_OK, ShortcutManagerCompat.createShortcutResultIntent(CardShortcutConfigure.this, shortcut));
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu inputMenu) {
getMenuInflater().inflate(R.menu.card_details_menu, inputMenu);
return super.onCreateOptionsMenu(inputMenu);
}
@Override
public boolean onOptionsItemSelected(MenuItem inputItem) {
int id = inputItem.getItemId();
if (id == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog();
invalidateOptionsMenu();
return true;
}
return super.onOptionsItemSelected(inputItem);
}
@Override
public void onRowClicked(int inputPosition) {
onClickAction(inputPosition);
}
@Override
public void onRowLongClicked(int inputPosition) {
// do nothing
}
}

View File

@@ -1,96 +0,0 @@
package protect.card_locker
import android.database.sqlite.SQLiteDatabase
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.widget.Toast
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.view.MenuProvider
import androidx.recyclerview.widget.GridLayoutManager
import protect.card_locker.LoyaltyCardCursorAdapter.CardAdapterListener
import protect.card_locker.databinding.CardShortcutConfigureActivityBinding
import protect.card_locker.preferences.Settings
class CardShortcutConfigure : CatimaAppCompatActivity(), CardAdapterListener, MenuProvider {
private lateinit var binding: CardShortcutConfigureActivityBinding
private lateinit var mDatabase: SQLiteDatabase
private lateinit var mAdapter: LoyaltyCardCursorAdapter
private companion object {
private const val TAG: String = "Catima"
}
public override fun onCreate(savedInstanceBundle: Bundle?) {
super.onCreate(savedInstanceBundle)
addMenuProvider(this)
binding = CardShortcutConfigureActivityBinding.inflate(layoutInflater)
mDatabase = DBHelper(this).readableDatabase
// Set the result to CANCELED.
// This will cause nothing to happen if the back button is pressed.
setResult(RESULT_CANCELED)
setContentView(binding.getRoot())
Utils.applyWindowInsets(binding.getRoot())
binding.toolbar.apply {
setTitle(R.string.shortcutSelectCard)
setSupportActionBar(this)
}
// If there are no cards, bail
if (DBHelper.getLoyaltyCardCount(mDatabase) == 0) {
Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show()
finish()
}
val cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All)
mAdapter = LoyaltyCardCursorAdapter(this, cardCursor, this, null)
binding.list.setAdapter(mAdapter)
}
override fun onResume() {
super.onResume()
val layoutManager = binding.list.layoutManager as GridLayoutManager?
layoutManager?.setSpanCount(Settings(this).getPreferredColumnCount())
}
private fun onClickAction(position: Int) {
val selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All)
selected.moveToPosition(position)
val loyaltyCard = LoyaltyCard.fromCursor(this, selected)
Log.d(TAG, "Creating shortcut for card ${loyaltyCard.store}, ${loyaltyCard.id}")
val shortcut = ShortcutHelper.createShortcutBuilder(this, loyaltyCard).build()
setResult(RESULT_OK,
ShortcutManagerCompat.createShortcutResultIntent(this, shortcut))
finish()
}
override fun onCreateMenu(inputMenu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.card_details_menu, inputMenu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
if (menuItem.itemId == R.id.action_display_options) {
mAdapter.showDisplayOptionsDialog()
}
return true
}
override fun onRowClicked(inputPosition: Int) {
onClickAction(inputPosition)
}
override fun onRowLongClicked(inputPosition: Int) {
// do nothing
}
}

View File

@@ -1,130 +0,0 @@
package protect.card_locker
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.Icon
import android.os.Build
import android.view.View
import android.widget.RemoteViews
import androidx.core.widget.RemoteViewsCompat
import protect.card_locker.DBHelper.LoyaltyCardArchiveFilter
class ListWidget : AppWidgetProvider() {
fun updateAll(context: Context) {
val appWidgetManager = AppWidgetManager.getInstance(context)
val componentName = ComponentName(context, ListWidget::class.java)
onUpdate(
context,
appWidgetManager,
appWidgetManager.getAppWidgetIds(componentName)
)
}
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
val database = DBHelper(context).readableDatabase
// Get cards
val order = Utils.getLoyaltyCardOrder(context);
val orderDirection = Utils.getLoyaltyCardOrderDirection(context);
val loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(
database,
"",
null,
order,
orderDirection,
LoyaltyCardArchiveFilter.Unarchived
)
// Bind every card to cell in the grid
var hasCards = false
val remoteCollectionItemsBuilder = RemoteViewsCompat.RemoteCollectionItems.Builder()
if (loyaltyCardCursor.moveToFirst()) {
do {
val loyaltyCard = LoyaltyCard.fromCursor(context, loyaltyCardCursor)
remoteCollectionItemsBuilder.addItem(
loyaltyCard.id.toLong(),
createRemoteViews(
context, loyaltyCard
)
)
hasCards = true
} while (loyaltyCardCursor.moveToNext())
}
loyaltyCardCursor.close()
// Create the base empty view
var views = RemoteViews(context.packageName, R.layout.list_widget_empty)
if (hasCards) {
// If we have cards, create the list
views = RemoteViews(context.packageName, R.layout.list_widget)
val templateIntent = Intent(context, LoyaltyCardViewActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
context,
0,
templateIntent,
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
views.setPendingIntentTemplate(R.id.grid_view, pendingIntent)
RemoteViewsCompat.setRemoteAdapter(
context,
views,
appWidgetId,
R.id.grid_view,
remoteCollectionItemsBuilder.build()
)
}
// Let Android know the widget is ready for display
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
private fun createRemoteViews(context: Context, loyaltyCard: LoyaltyCard): RemoteViews {
// Create a single cell for the grid view, bind it to open in the LoyaltyCardViewActivity
// Note: Android 5 will not use bitmaps
val remoteViews = RemoteViews(context.packageName, R.layout.list_widget_item).apply {
val headerColor = Utils.getHeaderColor(context, loyaltyCard)
val foreground = if (Utils.needsDarkForeground(headerColor)) Color.BLACK else Color.WHITE
setInt(R.id.item_container_foreground, "setBackgroundColor", headerColor)
val icon = loyaltyCard.getImageThumbnail(context)
// setImageViewIcon is not supported on Android 5, so force Android 5 down the text path
if (icon != null && Build.VERSION.SDK_INT >= 23) {
setInt(R.id.item_container_foreground, "setBackgroundColor", foreground)
setImageViewIcon(R.id.item_image, Icon.createWithBitmap(icon))
setViewVisibility(R.id.item_text, View.INVISIBLE)
setViewVisibility(R.id.item_image, View.VISIBLE)
} else {
setImageViewBitmap(R.id.item_image, null)
setTextViewText(R.id.item_text, loyaltyCard.store)
setViewVisibility(R.id.item_text, View.VISIBLE)
setViewVisibility(R.id.item_image, View.INVISIBLE)
setTextColor(
R.id.item_text,
foreground
)
}
// Add the card ID to the intent template
val fillInIntent = Intent().apply {
putExtra(LoyaltyCardViewActivity.BUNDLE_ID, loyaltyCard.id)
}
setOnClickFillInIntent(R.id.item_container, fillInIntent)
}
return remoteViews
}
}

View File

@@ -24,6 +24,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
@@ -44,9 +45,6 @@ import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.exifinterface.media.ExifInterface;
import androidx.lifecycle.ViewModelProvider;
@@ -300,7 +298,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
super.onCreate(savedInstanceState);
binding = LoyaltyCardEditActivityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Utils.applyWindowInsetsAndFabOffset(binding.getRoot(), binding.fabSave);
Utils.applyWindowInsets(binding.getRoot());
viewModel = new ViewModelProvider(this).get(LoyaltyCardEditActivityViewModel.class);
@@ -683,7 +681,15 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
askBeforeQuitIfChanged();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
View view = getCurrentFocus();
if (view != null && imm.isAcceptingText()) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
view.clearFocus();
}
else {
askBeforeQuitIfChanged();
}
}
});
}
@@ -1517,7 +1523,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
int id = item.getItemId();
if (id == android.R.id.home) {
askBeforeQuitIfChanged();
getOnBackPressedDispatcher().onBackPressed();
return true;
}

View File

@@ -880,8 +880,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
} else if (id == R.id.action_star_unstar) {
DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, loyaltyCard.starStatus == 0 ? 1 : 0);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
// Re-init loyaltyCard with new data from DB
onResume();
invalidateOptionsMenu();
@@ -892,7 +890,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show();
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
// Re-init loyaltyCard with new data from DB
onResume();
@@ -918,7 +915,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
DBHelper.deleteLoyaltyCard(database, LoyaltyCardViewActivity.this, loyaltyCardId);
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
new ListWidget().updateAll(LoyaltyCardViewActivity.this);
finish();
dialog.dismiss();

View File

@@ -2,8 +2,6 @@ package protect.card_locker;
import android.app.Activity;
import android.app.SearchManager;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -332,8 +330,22 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
selectedTab = activeTabPref.getInt(getString(R.string.sharedpreference_active_tab), 0);
// Restore sort preferences from Shared Preferences
mOrder = Utils.getLoyaltyCardOrder(this);
mOrderDirection = Utils.getLoyaltyCardOrderDirection(this);
// If one of the sorting prefererences has never been set or is set to an invalid value,
// stick to the defaults.
SharedPreferences sortPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_sort),
Context.MODE_PRIVATE);
String orderString = sortPref.getString(getString(R.string.sharedpreference_sort_order), null);
String orderDirectionString = sortPref.getString(getString(R.string.sharedpreference_sort_direction), null);
if (orderString != null && orderDirectionString != null) {
try {
mOrder = DBHelper.LoyaltyCardOrder.valueOf(orderString);
mOrderDirection = DBHelper.LoyaltyCardOrderDirection.valueOf(orderDirectionString);
} catch (IllegalArgumentException ignored) {
}
}
mGroup = null;
@@ -430,8 +442,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
if (mCurrentActionMode != null) {
mCurrentActionMode.finish();
}
new ListWidget().updateAll(mAdapter.mContext);
}
private void processParseResultList(List<ParseResult> parseResultList, String group, boolean closeAppOnNoBarcode) {
@@ -699,8 +709,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
showReversed.isChecked() ? DBHelper.LoyaltyCardOrderDirection.Descending : DBHelper.LoyaltyCardOrderDirection.Ascending
);
new ListWidget().updateAll(this);
dialog.dismiss();
});

View File

@@ -48,7 +48,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
super.onCreate(inputSavedInstanceState);
binding = ActivityManageGroupBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Utils.applyWindowInsetsAndFabOffset(binding.getRoot(), binding.fabSave);
Utils.applyWindowInsets(binding.getRoot());
Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);

View File

@@ -4,7 +4,6 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -51,7 +50,6 @@ import androidx.palette.graphics.Palette;
import com.google.android.material.color.DynamicColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
@@ -1141,27 +1139,6 @@ public class Utils {
return WindowInsetsCompat.CONSUMED;
});
}
public static void applyWindowInsetsAndFabOffset(View root, FloatingActionButton fab) {
/* This function is a copy of applyWindowInsets, with the added behaviour that it ensures the FAB will be displayed vertically above the keyboard at all times */
ViewCompat.setOnApplyWindowInsetsListener(root, (view, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
layoutParams.leftMargin = insets.left;
layoutParams.bottomMargin = insets.bottom;
layoutParams.rightMargin = insets.right;
layoutParams.topMargin = insets.top;
view.setLayoutParams(layoutParams);
// This is required to move the FAB above the keyboard when keyboard is open
Insets imeInsets = windowInsets.getInsets(WindowInsetsCompat.Type.ime());
boolean isKeyboardVisible = windowInsets.isVisible(WindowInsetsCompat.Type.ime());
fab.setTranslationY(isKeyboardVisible ? (- imeInsets.bottom) : 0);
return WindowInsetsCompat.CONSUMED;
});
}
public static ImageView.ScaleType getRecommendedScaleTypeForThumbnailImage(@Nullable Bitmap image) {
// Return something sensible if no image
@@ -1177,40 +1154,4 @@ public class Utils {
return ImageView.ScaleType.FIT_CENTER;
}
public static DBHelper.LoyaltyCardOrder getLoyaltyCardOrder(Context context) {
SharedPreferences sortPref = context.getSharedPreferences(
"sharedpreference_sort",
Context.MODE_PRIVATE
);
String orderString = sortPref.getString("sharedpreference_sort_order", null);
if (orderString != null) {
try {
return DBHelper.LoyaltyCardOrder.valueOf(orderString);
} catch (IllegalArgumentException ignored) {
}
}
return DBHelper.LoyaltyCardOrder.Alpha;
}
public static DBHelper.LoyaltyCardOrderDirection getLoyaltyCardOrderDirection(Context context) {
SharedPreferences sortPref = context.getSharedPreferences(
"sharedpreference_sort",
Context.MODE_PRIVATE
);
String orderDirectionString = sortPref.getString("sharedpreference_sort_direction", null);
if (orderDirectionString != null) {
try {
return DBHelper.LoyaltyCardOrderDirection.valueOf(orderDirectionString);
} catch (IllegalArgumentException ignored) {
}
}
return DBHelper.LoyaltyCardOrderDirection.Ascending;
}
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- android:columnWidth must be kept in sync with list_widget_item.xml -->
<GridView
android:id="@+id/grid_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:numColumns="auto_fit"
android:columnWidth="107dp"
android:verticalSpacing="4dp"
android:horizontalSpacing="4dp"
android:gravity="center"/>
</LinearLayout>

View File

@@ -1,17 +0,0 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/widget_layout"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/no_cards_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/card_list_widget_empty"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="12sp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeStepGranularity="2sp" />
</LinearLayout>

View File

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
85.6dp : 53.98dp
Both multiplied by 1.25 to fit better
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="107dp"
android:layout_height="67.475dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:gravity="center"
android:id="@+id/item_container"
android:background="@drawable/round_outline"
android:clipToOutline="true">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/item_container_foreground">
<ImageView
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center|center" />
<TextView
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:autoSizeMinTextSize="6sp"
app:autoSizeTextType="uniform"
android:layout_gravity="center|center"
android:gravity="center" />
</FrameLayout>
</FrameLayout>

View File

@@ -16,15 +16,15 @@ Altonss
B o d o
Michael Moroni
Eric
Silvério Santos
Максим Горпиніч
GM
Priit Jõerüüt
laralem
Petr Novák
Joel A
Edgars Andersons
Petr Novák
laralem
Priit Jõerüüt
Silvério Santos
Taco
Edgars Andersons
nadiafekihahmed
pfaffenrodt
Aayush Gupta
@@ -32,49 +32,48 @@ Scrambled777
ikanakova
Giovanni Donisi
HudobniVolk
Jiri Grönroos
Nyatsuki
josé m
Jiri Grönroos
Samantaz Fox
Balázs Meskó
Milo Ivir
Fjuro
josé m
Arno-github
Ankit Tiwari
Cliff Heraldo
Sergio Paredes
Ankit Tiwari
Arno-github
Kachelkaiser
Jose Delvani
Warder
GitSpoon
Milan Šalka
mdvhimself
Skrripy
Vasilis
huuhaa
Milan Šalka
தமிழ் நேரம்
huuhaa
Skrripy
Kachelkaiser
Fjuro
Projjal Moitra
Quentin PAGÈS
Vasilis
ngocanhtve
waffshappen
Marnick L'Eau
ngocanhtve
StellarSand
Quentin PAGÈS
Projjal Moitra
Robin
JungHee Lee
hajertabbane
Ziad OUALHADJ
Warder
GitSpoon
Robin Liu
Ricky Tigg
Renko
Denis Shilin
しいたけ
Alexander Ivanov
Miha Frangež
Viet Nguyen Hoang
Miha Frangež
stavpup
ehrt74
Virginie
Tim Trek
Ricky Tigg
Peter Dave Hello
Michael Gangolf
rudy3
@@ -82,6 +81,6 @@ Kim Seohyun
Govind S Nair
Freddo espresso
Augustin LAVILLE
Aliaksandr Trush
arshbeerSingh
MisterCosta96
Aliaksandr Trush

View File

@@ -308,6 +308,4 @@
<string name="sort_by_valid_from">Начало валидност</string>
<string name="width">Ширина</string>
<string name="setBarcodeWidth">Задаване ширина на щрих кода</string>
<string name="card_list_widget_name">Списък с карти</string>
<string name="card_list_widget_empty">Когато добавите карти в Catima те ще се покажат тук. Ако имате карти уверете се, че са извън архива.</string>
</resources>

View File

@@ -314,6 +314,4 @@
<string name="sort_by_valid_from">Platnost od</string>
<string name="setBarcodeWidth">Nastavit šířku čárového kódu</string>
<string name="width">Šířka</string>
<string name="card_list_widget_name">Seznam karet</string>
<string name="card_list_widget_empty">Karty přidané do aplikace Catima se zobrazí zde. Pokud máte karty, ujistěte se, že nejsou všechny archivovány.</string>
</resources>

View File

@@ -304,6 +304,4 @@
<string name="sort_by_valid_from">Gültig ab</string>
<string name="width">Breite</string>
<string name="setBarcodeWidth">Barcodebreite einstellen</string>
<string name="card_list_widget_empty">Nachdem du einige Treuekarten in Catima hinzugefügt hast, werden sie hier angezeigt. Wenn du Karten hast, stelle sicher, dass sie nicht alle archiviert sind.</string>
<string name="card_list_widget_name">Kartenliste</string>
</resources>

View File

@@ -307,6 +307,4 @@
<string name="sort_by_valid_from">Έναρξη ισχύος</string>
<string name="setBarcodeWidth">Ορισμός πλάτους γραμμωτού κώδικα</string>
<string name="width">Πλάτος</string>
<string name="card_list_widget_empty">Αφού προσθέσετε μερικές κάρτες επιβράβευσης στο Catima, θα εμφανιστούν εδώ. Εάν έχετε κάρτες, βεβαιωθείτε ότι δεν είναι όλες αρχειοθετημένες.</string>
<string name="card_list_widget_name">Λίστα καρτών</string>
</resources>

View File

@@ -303,6 +303,4 @@
<string name="sort_by_valid_from">Kehtib alates</string>
<string name="setBarcodeWidth">Määratle triipkoodi laius</string>
<string name="width">Laius</string>
<string name="card_list_widget_name">Kaartide loend</string>
<string name="card_list_widget_empty">Kui lisad Catimasse kliendikaarte, siis saavad nad olema nähtavad siin. Kui sul on kaardid lisatud, siis palun kontrolli, et nad kõik poleks arhiveeritud.</string>
</resources>

View File

@@ -308,6 +308,4 @@
<string name="sort_by_valid_from">Voimassa alkaen</string>
<string name="width">Leveys</string>
<string name="setBarcodeWidth">Aseta viivakoodin leveys</string>
<string name="card_list_widget_name">Korttiluettelo</string>
<string name="card_list_widget_empty">Kun olet lisännyt kanta-asiakaskortteja Catimaan, ne näkyvät täällä. Jos sinulla on kortteja, varmista, etteivät ne kaikki ole arkistoituja.</string>
</resources>

View File

@@ -314,6 +314,4 @@
<string name="sort_by_valid_from">Valide à partir du</string>
<string name="width">Largeur</string>
<string name="setBarcodeWidth">Définir la largeur du code-barres</string>
<string name="card_list_widget_name">Liste des cartes</string>
<string name="card_list_widget_empty">Après avoir ajouter des cartes de fidélité dans Catima, elles apparaîtront ici. Si vous avez des cartes, assurez-vous qu\'elles ne soient pas archivées.</string>
</resources>

View File

@@ -302,6 +302,4 @@
<string name="sort_by_valid_from">Válido desde</string>
<string name="width">Anchura</string>
<string name="setBarcodeWidth">Establecer anchura do código de barras</string>
<string name="card_list_widget_name">Lista de tarxetas</string>
<string name="card_list_widget_empty">Aquí aparecerán as tarxetas fidelidade cando as engadas a Catima. Se tes tarxetas mira que non estean arquivadas.</string>
</resources>

View File

@@ -314,6 +314,4 @@
<string name="sort_by_valid_from">Valido da</string>
<string name="setBarcodeWidth">Imposta la larghezza del codice a barre</string>
<string name="width">Larghezza</string>
<string name="card_list_widget_name">Lista delle carte</string>
<string name="card_list_widget_empty">Dopo aver aggiunto alcune carte fedeltà in Catima, queste appariranno qui. Se hai delle carte, assicurati che non siano tutte archiviate.</string>
</resources>

View File

@@ -309,6 +309,4 @@
<string name="sort_by_valid_from">Derīga no</string>
<string name="setBarcodeWidth">Iestatīt svītrkoda platumu</string>
<string name="width">Platums</string>
<string name="card_list_widget_name">Karšu saraksts</string>
<string name="card_list_widget_empty">Pēc klienta karšu pievienošanas Catima tās parādīsies šeit. Ja Tev ir kartes, jāpārliecinās, ka tās visas nav arhivētas.</string>
</resources>

View File

@@ -308,6 +308,4 @@
<string name="sort_by_valid_from">Op geldig vanaf</string>
<string name="width">Breedte</string>
<string name="setBarcodeWidth">Stel Barcodebreedte in</string>
<string name="card_list_widget_name">Kaartenlijst</string>
<string name="card_list_widget_empty">Zodra er kaarten in Catima toegevoegd zijn worden deze hier getoond. Heb je al kaarten? Controleer dan of deze niet gearchiveerd zijn.</string>
</resources>

View File

@@ -314,6 +314,4 @@
<string name="sort_by_valid_from">Válido a partir de</string>
<string name="width">Largura</string>
<string name="setBarcodeWidth">Definir largura do código de barras</string>
<string name="card_list_widget_name">Lista de cartões</string>
<string name="card_list_widget_empty">Depois que você adicionar alguns cartões de fidelidade no Catima, eles aparecerão aqui. Se você tiver cartões, verifique se eles não estão todos arquivados.</string>
</resources>

View File

@@ -314,6 +314,4 @@
<string name="sort_by_valid_from">Válido a partir de</string>
<string name="width">Largura</string>
<string name="setBarcodeWidth">Definir a largura do código de barras</string>
<string name="card_list_widget_name">Lista de cartões</string>
<string name="card_list_widget_empty">Após adicionar cartões de fidelidade em Catima, eles aparecerão aqui. Se tem cartões, certifique-se de que não estão todos arquivados.</string>
</resources>

View File

@@ -308,6 +308,4 @@
<string name="generic_error_please_retry">Lamento, ocorreu um erro, tente novamente...</string>
<string name="setBarcodeWidth">Definir Largura do Código de Barra</string>
<string name="width">Largura</string>
<string name="card_list_widget_name">Lista de cartões</string>
<string name="card_list_widget_empty">Após adicionar cartões de fidelidade em Catima, eles aparecerão aqui. Se tem cartões, certifique-se de que não estão todos arquivados.</string>
</resources>

View File

@@ -320,6 +320,4 @@
<string name="sort_by_valid_from">Начало действия</string>
<string name="width">Ширина</string>
<string name="setBarcodeWidth">Указать ширину штрих-кода</string>
<string name="card_list_widget_name">Список карт</string>
<string name="card_list_widget_empty">После добавления карт лояльности в Catima, они появятся здесь. Если у вас есть карты, убедитесь, что они не архивированы.</string>
</resources>

View File

@@ -314,6 +314,4 @@
<string name="addFromPkpass">Vyberte súbor Passbook (.pkpass)</string>
<string name="settings_use_volume_keys_navigation">Zmena kariet pomocou tlačidiel hlasitosti</string>
<string name="settings_use_volume_keys_navigation_summary">Pre posúvanie medzi kartami používať tlačidlá hlasitosti</string>
<string name="card_list_widget_name">Zoznam kariet</string>
<string name="card_list_widget_empty">Po pridaní vernostných kariet do Catima sa zobrazia tu. Ak máte karty, uistite sa, že nie sú všetky archivované.</string>
</resources>

View File

@@ -308,6 +308,4 @@
<string name="sort_by_valid_from">İtibaren Geçerli</string>
<string name="width">Genişlik</string>
<string name="setBarcodeWidth">Barkod Genişliğini Ayarla</string>
<string name="card_list_widget_name">Kart listesi</string>
<string name="card_list_widget_empty">Catima\'ya sadakat kartları eklediğinizde, burada gözükecekler. Eğer kartlarınız varsa, arşivlemediğinizden emin olun.</string>
</resources>

View File

@@ -319,6 +319,4 @@
<string name="sort_by_valid_from">Діє з</string>
<string name="width">Ширина</string>
<string name="setBarcodeWidth">Встановити ширину штрих-коду</string>
<string name="card_list_widget_name">Список карток</string>
<string name="card_list_widget_empty">Після того, як ви додасте кілька карток лояльності в Catima, вони з’являться тут. Якщо у вас є картки, переконайтеся, що вони не всі заархівовані.</string>
</resources>

View File

@@ -296,10 +296,4 @@
<string name="settings_column_count_5">5</string>
<string name="settings_column_count_6">6</string>
<string name="settings_column_count_7">7</string>
<string name="sort_by_valid_from">Có hiệu lực từ</string>
<string name="addFromPkpass">Chọn tệp Passbook (.pkpass)</string>
<string name="unsupportedFile">Tập tin này không được hỗ trợ</string>
<string name="generic_error_please_retry">Xin lỗi, có gì đó không ổn, vui lòng thử lại...</string>
<string name="width">Chiều rộng</string>
<string name="setBarcodeWidth">Đặt chiều rộng mã vạch</string>
</resources>

View File

@@ -302,6 +302,4 @@
<string name="sort_by_valid_from">有效期开始日</string>
<string name="width">宽度</string>
<string name="setBarcodeWidth">设置条码宽度</string>
<string name="card_list_widget_name">卡片列表</string>
<string name="card_list_widget_empty">在 Catima 中添加了一些会员卡后,它们会出现在这里。如果你有卡片,确保不是所有都已归档。</string>
</resources>

View File

@@ -362,7 +362,5 @@
<string name="unsupportedFile">This file is not supported</string>
<string name="generic_error_please_retry">Sorry, something went wrong, please try again...</string>
<string name="width">Width</string>
<string name="card_list_widget_name">Card list</string>
<string name="setBarcodeWidth">Set Barcode Width</string>
<string name="card_list_widget_empty">After you add some loyalty cards in Catima, they will appear here. If you have cards, make sure they are not all archived.</string>
</resources>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialKeyguardLayout="@layout/list_widget"
android:initialLayout="@layout/list_widget"
android:minWidth="245dp"
android:minHeight="54dp"
android:previewImage="@drawable/widget_preview"
android:resizeMode="horizontal|vertical"
android:targetCellWidth="4"
android:targetCellHeight="2"
android:updatePeriodMillis="86400000"
android:widgetCategory="home_screen" />

View File

@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.android.application") version "8.12.0" apply false
id("com.android.application") version "8.11.1" apply false
id("org.jetbrains.kotlin.android") version "2.2.0" apply false
}

View File

@@ -1,2 +0,0 @@
- Přidán widget zobrazující všechny nearchivované karty
- Zabránění překrytí tlačítka uložení klávesnicí na stránkách úpravy a skupin

View File

@@ -1,2 +0,0 @@
- Widget, das alle nichtarchvierten Karten anzeigt, hinzugefügt
- Beugt dem Verdecken der „Speichern“-Taste durch die Tastatur in der Bearbeitungs- bzw. Gruppenansicht vor

View File

@@ -1,2 +1 @@
- Add a widget showing all non-archived cards
- Prevent the keyboard from overlapping the save button in edit and group screens
- Made it harder to accidentally close edit view

View File

@@ -1 +0,0 @@
- Sõltuvuste ja tõlgete uuendused

View File

@@ -1,2 +0,0 @@
- Vidin, mis näitab kõiki mittearhiveeritud kaarte
- Klahvistik enam ei varja muutmis- ja grupivaadetes salvestusnuppu

View File

@@ -1,2 +0,0 @@
- Ajout d'un widget affichant toutes les cartes non archivées
- Empêche le clavier de passer au-dessus du bouton de sauvegarde dans les écrans de modifications et de regroupements

View File

@@ -1 +0,0 @@
- Neleisti klaviatūrai uždengti išsaugojimo mygtuko, redagavimo ir grupių ekranuose

View File

@@ -1,5 +0,0 @@
- Pridėta galimybė pridėti sparčiuosius klavišus į pagrindinį ekraną kuriant arba redaguojant kortelę. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
- Valdiklis pašalintas, nes buvo prastas sparčiųjų klavišų pakaitalas. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
- Ištaisyta atsarginių kopijų eksportavimo klaida (Android 7+). pull #153 (https://github.com/brarcher/loyalty-card-locker/pull/153))
- Eksportuojant atsargines kopijas pateikiamas tikslesnis MIME tipas. (pull #156 (https://github.com/brarcher/loyalty-card-locker/pull/156))
- Pataisyta klaida, dėl kurios nebuvo galima redaguoti kortelės. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))

View File

@@ -1,2 +0,0 @@
- Pridėta galimybė pridėti kortelių sparčiąsias nuorodas tiesiai iš paleidiklio arba pagrindinio ekrano. (pull #161 (https://github.com/brarcher/loyalty-card-locker/pull/161))
- Pašalinta lojalumo kortelių sparčiųjų nuorodų kūrimo galimybė tiesiogiai programoje. Dėl to nebereikia leidimo sparčiųjų nuorodų kūrimui. (pull #163 (https://github.com/brarcher/loyalty-card-locker/pull/163))

View File

@@ -1,2 +0,0 @@
- Ištaisyta klaida „Android SDK 24+“ versijose, dėl kurios naudojant failų pasirinkimo importavimo funkciją programėlė sugestų. (pull #170 (https://github.com/brarcher/loyalty-card-locker/pull/170))
- Naujas piktograma ir spalvų schema. (pull #171 (https://github.com/brarcher/loyalty-card-locker/pull/171))

View File

@@ -1,3 +0,0 @@
- Pataisytas gedimas importuojant kai kuriuos sugadintus CSV failus. (pull #177 (https://github.com/brarcher/loyalty-card-locker/pull/177))
- Pataisytas atsarginių kopijų importavimas iš failų sistemos. (pull #180 (https://github.com/brarcher/loyalty-card-locker/pull/180))
- Pataisyta problema importuojant atsargines kopijas iš kai kurių turinio tiekėjų. (pull #179 (https://github.com/brarcher/loyalty-card-locker/pull/179))

View File

@@ -1,3 +0,0 @@
- Italų kalbos vertimai.
- Palaikymas visiems 1D brūkšninių kodų tipams. (anksčiau palaikomi tik produktų 1D brūkšniniai kodai)
- Pridėtas būtinas kameros leidimas, kuris iš pradžių trūko.

View File

@@ -1,2 +0,0 @@
- Pievienots logrīks, kurā ir parādītas visas nearhivētās kartes
- Labošanas un kopu skatos novērsta saglabāšanas pogas aizklāšana ar tastatūru

View File

@@ -1,5 +1,5 @@
- Bij het bewerken van een kaart-ID wordt de bestaande ID vooraf ingevuld.
- Beperk de breedte van barcodes om geheugenfouten te verminderen.
- Bij het bewerken van een kaart verandert "Kaart invoeren" in "Kaart bewerken" als er al een ID is.
- Zachter kleurenschema en schonere lay-out bij kaartweergave.
- Introductiewizard toegevoegd bij eerste app-start.
- Bij het bewerken van een kaart-ID wordt de bestaande ID vooraf ingevuld. (Pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
- Beperk de breedte van barcodes om geheugenfouten te verminderen. (Pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
- Bij het bewerken van een kaart verandert "Kaart invoeren" in "Kaart bewerken" als er al een ID is. (Pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
- Zachter kleurenschema en schonere lay-out bij kaartweergave. (Pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
- Introductiewizard toegevoegd bij eerste app-start. (Pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))

View File

@@ -1 +0,0 @@
- Material You kleurenschema nu beschikbaar op meer apparaten

View File

@@ -1,4 +1,4 @@
- Kleine UI-fixes
- Voorkom dat datums gereset worden bij roteren van het kaartbewerkingsscherm
- Herstel van datums bij roteren van het kaartbewerkingsscherm
- Oplossen van crashes bij roteren met kleurkiezer zichtbaar
- Stocard-importfouten opgelost

View File

@@ -1,4 +1,3 @@
- Lange winkelnaam in de preview over meerdere regels splitsen
- Optie om voor- of achterkant afbeelding te gebruiken in thumbnail-menu
- Kleine import/export-fixes
- Kleine UI fixes

View File

@@ -1 +0,0 @@
- Terugswipen sluit niet meer het toetsenbord en zoekveld af op Android 13 en nieuwer

View File

@@ -1,3 +0,0 @@
- Optie om tussen kaarten te wisselen met de volumeknoppen toegevoegd
- Fix voor importeren van Stocard export
- Fix: De tekst "Importeren geannuleerd" verschijnt niet meer na succesvolle import

View File

@@ -1 +0,0 @@
- Zorg dat tekst correct past in het "Kaart toevoegen" dialoogvenster

View File

@@ -1,4 +1,2 @@
- Toon standaard 4 kolommen op brede schermen
- Laat toe het aantal kolommen in portret- en landschapmodus te veranderen in de instellingen
- Zoektekst verdwijnt niet langer bij het roteren van het hoofdscherm of openen van een kaart
- Limitier de maximale lengte van een notitie op het hoofdscherm
- toon standaard 4 kolommen op brede schermen
- laat toe het aantal kolommen in portret- en landschapmodus te veranderen in de instellingen

View File

@@ -1,3 +0,0 @@
- Ondersteuning voor Passbook (.pkpass bestanden) toegevoegd
- Fix voor issues met importeren van PDF bestanden met een transparante achtergrond
- Verbeter de display van kaarten met een transparante achtergrond

View File

@@ -1 +0,0 @@
- Fix crash bij het openen van een invalide pkpass bestand

View File

@@ -1 +0,0 @@
- Verbeter display van het archief/favoriet icoontje

View File

@@ -1,3 +0,0 @@
- Implementeer alle eisen voor Android 15 support
- Voorkom dat toetsenbord over de opsla knop in het bewerkscherm komt
- Verbeterde herkenning van pkpass bestanden (ondersteuning voor application/vnd-com.apple.pkpass mime type)

View File

@@ -1,2 +0,0 @@
- Kaarten kunnen nu ook op startdatum gesorteerd worden
- Schakel doelversie tijdelijk terug naar Android 14 om enkele gebruikersinterfaceissues op te lossen

View File

@@ -1,3 +0,0 @@
- Zet doelversie naar Android 15
- Fix crash bij het lezen van een niet ondersteund pkpass bestand
- Verbeter pkpass ondersteuning

View File

@@ -1,4 +0,0 @@
- De breedte van een barcode kan nu beheerd worden in volledig scherm modus
- Verwijder verwarrende opties in het import menu
- Verschillende fixes voor het scannen van kaarten
- Fix een crash bij het laden van een pkpass bestand zonder barcode

View File

@@ -1 +0,0 @@
- Updates van afhankelijkheden en vertalingen

View File

@@ -1,2 +0,0 @@
- Voeg een widget toe welke all niet-gearchiveerde kaarten toont
- Voorkom dat het toetsenbord de opslaknop verbergd in het bewerk en groep scherm

View File

@@ -1,2 +0,0 @@
- Adicionar um widget que mostra todos os cartões não arquivados
- Impedir que o teclado sobreponha o botão gravar em ecrãs de edição e grupo

View File

@@ -1,2 +0,0 @@
- Adicionar um widget que mostra todos os cartões não arquivados
- Impedir que o teclado sobreponha o botão gravar em ecrãs de edição e grupo

View File

@@ -1,2 +0,0 @@
- Добавлен виджет, показывающий все неархивные карты
- Исправлена ошибка перекрытия клавиатурой кнопки сохранения на экранах редактирования и групп

View File

@@ -2,4 +2,4 @@
- Obmedzte šírku čiarových kódov, aby ste znížili využitie pamäte a chyby spôsobené nedostatkom pamäte. (ťah #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
- Pri úprave karty zmeňte tlačidlo „Zadať kartu“ na „Upraviť kartu“, ak už ID karty existuje. (ťah #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
- Zmeňte farebnú schému na jemnejšiu a kompatibilnú s ikonou aplikácie a zmeňte rozloženie pri zobrazení karty, aby bolo prehľadnejšie. (ťah #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
- Pridať sprievodcu, ktorý sa spustí pri prvom spustení aplikácie. (ťah #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
- Pridať úvodného sprievodcu, ktorý sa spustí pri prvom spustení. (ťah #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))

View File

@@ -1,2 +0,0 @@
- Pridať widget zobrazujúci všetky nearchivované karty
- Zabrániť prekrývaniu tlačidla uloženia na obrazovkách úprav a zoskupenia z klávesnice

View File

@@ -1,11 +1,11 @@
- AKTUÁLNA ZMENA: Zmenil sa formát zálohy, - https://github.com/TheLastProject/Catima/wiki/Export-format
- AKTUÁLNA ZMENA: Zmenil sa formát zdieľania URL, - https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format
- Umožniť zapnutie alebo vypnutie baterky počas skenovania
- AKTUÁLNA ZMENA: Zmenený formát zálohy, https://github.com/TheLastProject/Catima/wiki/Export-format
- AKTUÁLNA ZMENA: Zmenený formát zdieľania URL, https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format
- Umožnite zapnut alebo vypnut baterku pri skenovani
- Pridaná podpora UPC-E
- Podpora pridania fotografie prednej a zadnej strany u každej karty
- Podpora pridania prednej a zadnej fotografie na každú kartu
- Podpora importu súborov zip chránených heslom
- Podpora importu Stocard (Beta)
- Oprava medzier v poznámkach z importu Fidme
- Podpora importu zo Stocard (Beta)
- Oprava zbytočných medzier v poznámkach z importu Fidme
- Podpora nového formátu exportu Voucher Vault
- Oprava plávajúcich akčných tlačidiel v Android 4
- Oprava horného okraja panela aplikácií prehliadača vernostných kariet
- Oprava plávajúcich akčných tlačidiel za inými prvkami UI v systéme Android 4
- Oprava horného okraja panela vernostných kariet

View File

@@ -1,22 +1,22 @@
Zastavte hľadanie vernostných kariet pri pokladni v obchode alebo internetovom obchode.
Zastavte hľadanie plastových vernostných kariet počas pokladne v obchode alebo internetovom obchode.
<b>Naskenujte čiarové kódy do zariadenia pomocou fotoaparátu, zabudnite na karty.</b>
Zabudnite na peňaženku alebo si ju uschovajte.
Zabudnite na peňaženku alebo si ju uschovajte ako ultraľahkú na cennosti.
S týmto základným nástrojom na každodenné nosenie (EDC) môžete nahradiť nepotrebné plastové karty hotovosťou.
- Vyhnite sa špehovaniu s veľmi malým počtom povolení. Bez internetu a bez reklám.
- Pridajte karty alebo kódy s menami a farbami.
- Manuálne zadanie kódu, ak nie je k dispozícii čiarový kód.
- Importujte karty a kódy zo súborov, Catima, FidMe, kľúčenky k vernostným kartám, Stocard.
- Vyhnite sa špehovaniu s veľmi malým počtom povolení. Bez prístupu na internet a bez reklám.
- Pridajte karty alebo kódy s menami a prispôsobiteľnými farbami.
- Manuálne zadanie kódu, ak nie je k dispozícii čiarový kód na uloženie alebo sa nedá použiť.
- Importujte karty a kódy zo súborov, Catima, FidMe, kľúčenky k vernostným kartám, Stocard a trezoru poukážok.
- Vytvorte si zálohu všetkých svojich kariet a v prípade potreby ich preneste do nového zariadenia.
- Zdieľajte kupóny, exkluzívne ponuky, promo kódy alebo karty pomocou ľubovoľnej aplikácie.
- Zdieľajte kupóny, exkluzívne ponuky, promo kódy alebo karty a kódy pomocou ľubovoľnej aplikácie.
- Tmavá téma a možnosti prístupnosti pre zrakovo postihnutých používateľov.
- Vytvorené pre všetkých komunitou softvéru libre.
- Ručne vytvorené preklady pre viac ako 40 jazykov.
- Bezplatné, podporované komunitou.
- Používajte, upravujte a zdieľajte podľa vlastného uváženia; *so všetkým*.
- Lokalizované ručne vytvorené preklady pre viac ako 40 jazykov.
- Bezplatné, podporované príspevkami komunity.
- Používajte, študujte, upravujte a zdieľajte podľa vlastného uváženia; *so všetkým*.
- Nielen slobodný softvér / otvorený zdrojový kód. *správa kariet s *copyleftom* (GPLv3+).
Zjednodušte si život a nakupovanie a už nikdy nestratíte žiadny doklad.
Vezmite si všetky svoje odmeny so sebou a ušetrite na cestách.
Zjednodušte si život a nakupovanie a už nikdy nestratíte papierový doklad, darčekovú kartu platobnú v obchode ani letenku.
Vezmite si všetky svoje odmeny a bonusy so sebou a ušetrite na cestách.

View File

@@ -1,2 +0,0 @@
- Додано віджет, який показує всі неархівовані картки
- Запобігання перекриттю кнопки збереження клавіатурою на екранах редагування та групування

View File

@@ -1,2 +0,0 @@
- 添加显示所有非已归档卡片的小部件
- 防止编辑与分组屏幕中键盘和保存按钮相重叠

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- FIXME: Disable the MissingQuantity check until https://github.com/WeblateOrg/weblate/issues/7520 gets fixed -->
<issue id="MissingQuantity" severity="ignore" />
</lint>