mirror of
https://github.com/CatimaLoyalty/Android.git
synced 2025-12-24 15:47:53 -05:00
Compare commits
80 Commits
fix/weblat
...
v2.36.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a514f285f7 | ||
|
|
5634df1f5a | ||
|
|
f2b46310de | ||
|
|
a646717277 | ||
|
|
63e992be5c | ||
|
|
98a574f223 | ||
|
|
6dfbcc3577 | ||
|
|
4c00c8b94d | ||
|
|
cde3dd8ecf | ||
|
|
e22ad2c4a8 | ||
|
|
62aeadae71 | ||
|
|
7e89db428b | ||
|
|
50e13c22c6 | ||
|
|
7e323dc342 | ||
|
|
c0cd051831 | ||
|
|
b1b97c8972 | ||
|
|
256687ecdb | ||
|
|
9829cc3100 | ||
|
|
2aa8be2642 | ||
|
|
75a6482c0e | ||
|
|
14e953db4c | ||
|
|
60e3c864c8 | ||
|
|
87ca4a5dd3 | ||
|
|
a70671cf0b | ||
|
|
67d7ea4ca2 | ||
|
|
53f58940dd | ||
|
|
f2639612f0 | ||
|
|
d29344af73 | ||
|
|
32635bdc9a | ||
|
|
8457cc06d2 | ||
|
|
a8316769a1 | ||
|
|
2f6bae7333 | ||
|
|
e951402049 | ||
|
|
4d5e3043ff | ||
|
|
d57f528165 | ||
|
|
14e84e5e0f | ||
|
|
fe79d3e866 | ||
|
|
88369ea070 | ||
|
|
944e83e480 | ||
|
|
8bb15bcb57 | ||
|
|
cb6358892b | ||
|
|
9956f6de34 | ||
|
|
893bd551e0 | ||
|
|
5c67459330 | ||
|
|
e2988ec29a | ||
|
|
2c96b11725 | ||
|
|
0d52a49e8b | ||
|
|
504ab7f148 | ||
|
|
d75f228632 | ||
|
|
410f0f2a6f | ||
|
|
c4672d282c | ||
|
|
9297fee839 | ||
|
|
acc72c0937 | ||
|
|
54c27f7038 | ||
|
|
7277ff26fc | ||
|
|
9a0149def8 | ||
|
|
e217e99864 | ||
|
|
9674af3bae | ||
|
|
a2b85dd37a | ||
|
|
220fe96268 | ||
|
|
917b6cfb7d | ||
|
|
0b687e1788 | ||
|
|
b35fa810ef | ||
|
|
0d1e10d064 | ||
|
|
96359e5942 | ||
|
|
bf63390f65 | ||
|
|
6f54981333 | ||
|
|
aed145239b | ||
|
|
99a8c917b9 | ||
|
|
ef39f30fd7 | ||
|
|
24e996e1a9 | ||
|
|
4178dce4e2 | ||
|
|
514eaae616 | ||
|
|
5692251668 | ||
|
|
6208dd3fd9 | ||
|
|
85288a3658 | ||
|
|
bae7e676b4 | ||
|
|
6ae7491a18 | ||
|
|
e5de694711 | ||
|
|
996cd2cd2c |
@@ -1,8 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
## Unreleased - 150
|
||||
## v2.36.0 - 150 (2025-08-05)
|
||||
|
||||
- Made it harder to accidentally close edit view
|
||||
- Add a widget showing all non-archived cards
|
||||
- Prevent the keyboard from overlapping the save button in edit and group screens
|
||||
|
||||
## v2.35.1 - 149 (2025-06-17)
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@ android {
|
||||
applicationId = "me.hackerchick.catima"
|
||||
minSdk = 21
|
||||
targetSdk = 35
|
||||
versionCode = 149
|
||||
versionName = "2.35.1"
|
||||
versionCode = 150
|
||||
versionName = "2.36.0"
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
multiDexEnabled = true
|
||||
@@ -112,6 +112,7 @@ 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")
|
||||
@@ -128,7 +129,7 @@ dependencies {
|
||||
implementation("net.lingala.zip4j:zip4j:2.11.5")
|
||||
|
||||
// Testing
|
||||
val androidXTestVersion = "1.6.1"
|
||||
val androidXTestVersion = "1.7.0"
|
||||
val junitVersion = "4.13.2"
|
||||
testImplementation("androidx.test:core:$androidXTestVersion")
|
||||
testImplementation("junit:junit:$junitVersion")
|
||||
@@ -136,10 +137,10 @@ dependencies {
|
||||
|
||||
androidTestImplementation("androidx.test:core:$androidXTestVersion")
|
||||
androidTestImplementation("junit:junit:$junitVersion")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.2.1")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.3.0")
|
||||
androidTestImplementation("androidx.test:runner:$androidXTestVersion")
|
||||
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0")
|
||||
}
|
||||
|
||||
tasks.register("copyRawResFiles", Copy::class) {
|
||||
|
||||
@@ -30,6 +30,20 @@
|
||||
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"
|
||||
@@ -75,7 +89,8 @@
|
||||
<activity
|
||||
android:name=".ManageGroupActivity"
|
||||
android:label="@string/group_edit"
|
||||
android:theme="@style/AppTheme.NoActionBar"/>
|
||||
android:theme="@style/AppTheme.NoActionBar"
|
||||
android:windowSoftInputMode="adjustResize"/>
|
||||
<activity
|
||||
android:name=".LoyaltyCardViewActivity"
|
||||
android:exported="true"
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
118
app/src/main/java/protect/card_locker/BarcodeSelectorActivity.kt
Normal file
118
app/src/main/java/protect/card_locker/BarcodeSelectorActivity.kt
Normal file
@@ -0,0 +1,118 @@
|
||||
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()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
130
app/src/main/java/protect/card_locker/ListWidget.kt
Normal file
130
app/src/main/java/protect/card_locker/ListWidget.kt
Normal file
@@ -0,0 +1,130 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,6 @@ 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;
|
||||
@@ -45,6 +44,9 @@ 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;
|
||||
|
||||
@@ -298,7 +300,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = LoyaltyCardEditActivityBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
Utils.applyWindowInsets(binding.getRoot());
|
||||
Utils.applyWindowInsetsAndFabOffset(binding.getRoot(), binding.fabSave);
|
||||
|
||||
viewModel = new ViewModelProvider(this).get(LoyaltyCardEditActivityViewModel.class);
|
||||
|
||||
@@ -681,15 +683,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
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();
|
||||
}
|
||||
askBeforeQuitIfChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1523,7 +1517,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
int id = item.getItemId();
|
||||
|
||||
if (id == android.R.id.home) {
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
askBeforeQuitIfChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -880,6 +880,8 @@ 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();
|
||||
@@ -890,6 +892,7 @@ 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();
|
||||
@@ -915,6 +918,7 @@ 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();
|
||||
|
||||
@@ -2,6 +2,8 @@ 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;
|
||||
@@ -330,22 +332,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
selectedTab = activeTabPref.getInt(getString(R.string.sharedpreference_active_tab), 0);
|
||||
|
||||
// Restore sort preferences from Shared Preferences
|
||||
// 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) {
|
||||
}
|
||||
}
|
||||
mOrder = Utils.getLoyaltyCardOrder(this);
|
||||
mOrderDirection = Utils.getLoyaltyCardOrderDirection(this);
|
||||
|
||||
mGroup = null;
|
||||
|
||||
@@ -442,6 +430,8 @@ 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) {
|
||||
@@ -709,6 +699,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
showReversed.isChecked() ? DBHelper.LoyaltyCardOrderDirection.Descending : DBHelper.LoyaltyCardOrderDirection.Ascending
|
||||
);
|
||||
|
||||
new ListWidget().updateAll(this);
|
||||
|
||||
dialog.dismiss();
|
||||
});
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana
|
||||
super.onCreate(inputSavedInstanceState);
|
||||
binding = ActivityManageGroupBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
Utils.applyWindowInsets(binding.getRoot());
|
||||
Utils.applyWindowInsetsAndFabOffset(binding.getRoot(), binding.fabSave);
|
||||
Toolbar toolbar = binding.toolbar;
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ 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;
|
||||
@@ -50,6 +51,7 @@ 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;
|
||||
@@ -1139,6 +1141,27 @@ 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
|
||||
@@ -1154,4 +1177,40 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
BIN
app/src/main/res/drawable-nodpi/widget_preview.png
Normal file
BIN
app/src/main/res/drawable-nodpi/widget_preview.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
18
app/src/main/res/layout/list_widget.xml
Normal file
18
app/src/main/res/layout/list_widget.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<?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>
|
||||
17
app/src/main/res/layout/list_widget_empty.xml
Normal file
17
app/src/main/res/layout/list_widget_empty.xml
Normal file
@@ -0,0 +1,17 @@
|
||||
<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>
|
||||
36
app/src/main/res/layout/list_widget_item.xml
Normal file
36
app/src/main/res/layout/list_widget_item.xml
Normal file
@@ -0,0 +1,36 @@
|
||||
<?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>
|
||||
@@ -16,15 +16,15 @@ Altonss
|
||||
B o d o
|
||||
Michael Moroni
|
||||
Eric
|
||||
Silvério Santos
|
||||
Максим Горпиніч
|
||||
GM
|
||||
Joel A
|
||||
Petr Novák
|
||||
laralem
|
||||
Priit Jõerüüt
|
||||
Silvério Santos
|
||||
Taco
|
||||
laralem
|
||||
Petr Novák
|
||||
Joel A
|
||||
Edgars Andersons
|
||||
Taco
|
||||
nadiafekihahmed
|
||||
pfaffenrodt
|
||||
Aayush Gupta
|
||||
@@ -32,48 +32,49 @@ Scrambled777
|
||||
ikanakova
|
||||
Giovanni Donisi
|
||||
HudobniVolk
|
||||
Nyatsuki
|
||||
Jiri Grönroos
|
||||
Nyatsuki
|
||||
josé m
|
||||
Samantaz Fox
|
||||
Balázs Meskó
|
||||
Milo Ivir
|
||||
josé m
|
||||
Arno-github
|
||||
Ankit Tiwari
|
||||
Fjuro
|
||||
Cliff Heraldo
|
||||
Sergio Paredes
|
||||
Jose Delvani
|
||||
mdvhimself
|
||||
Milan Šalka
|
||||
தமிழ் நேரம்
|
||||
huuhaa
|
||||
Skrripy
|
||||
Ankit Tiwari
|
||||
Arno-github
|
||||
Kachelkaiser
|
||||
Fjuro
|
||||
Projjal Moitra
|
||||
Quentin PAGÈS
|
||||
Jose Delvani
|
||||
Warder
|
||||
GitSpoon
|
||||
Milan Šalka
|
||||
mdvhimself
|
||||
Skrripy
|
||||
Vasilis
|
||||
ngocanhtve
|
||||
huuhaa
|
||||
தமிழ் நேரம்
|
||||
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
|
||||
Viet Nguyen Hoang
|
||||
Miha Frangež
|
||||
Viet Nguyen Hoang
|
||||
stavpup
|
||||
ehrt74
|
||||
Virginie
|
||||
Tim Trek
|
||||
Ricky Tigg
|
||||
Peter Dave Hello
|
||||
Michael Gangolf
|
||||
rudy3
|
||||
@@ -81,6 +82,6 @@ Kim Seohyun
|
||||
Govind S Nair
|
||||
Freddo espresso
|
||||
Augustin LAVILLE
|
||||
Aliaksandr Trush
|
||||
arshbeerSingh
|
||||
MisterCosta96
|
||||
Aliaksandr Trush
|
||||
|
||||
@@ -308,4 +308,6 @@
|
||||
<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>
|
||||
|
||||
@@ -314,4 +314,6 @@
|
||||
<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>
|
||||
|
||||
@@ -304,4 +304,6 @@
|
||||
<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>
|
||||
|
||||
@@ -307,4 +307,6 @@
|
||||
<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>
|
||||
|
||||
@@ -303,4 +303,6 @@
|
||||
<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>
|
||||
|
||||
@@ -308,4 +308,6 @@
|
||||
<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>
|
||||
|
||||
@@ -314,4 +314,6 @@
|
||||
<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>
|
||||
|
||||
@@ -302,4 +302,6 @@
|
||||
<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>
|
||||
|
||||
@@ -314,4 +314,6 @@
|
||||
<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>
|
||||
|
||||
@@ -309,4 +309,6 @@
|
||||
<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>
|
||||
|
||||
@@ -308,4 +308,6 @@
|
||||
<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>
|
||||
|
||||
@@ -314,4 +314,6 @@
|
||||
<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>
|
||||
|
||||
@@ -314,4 +314,6 @@
|
||||
<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>
|
||||
|
||||
@@ -308,4 +308,6 @@
|
||||
<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>
|
||||
|
||||
@@ -320,4 +320,6 @@
|
||||
<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>
|
||||
|
||||
@@ -314,4 +314,6 @@
|
||||
<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>
|
||||
|
||||
@@ -308,4 +308,6 @@
|
||||
<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>
|
||||
|
||||
@@ -319,4 +319,6 @@
|
||||
<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>
|
||||
|
||||
@@ -296,4 +296,10 @@
|
||||
<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>
|
||||
|
||||
@@ -302,4 +302,6 @@
|
||||
<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>
|
||||
|
||||
@@ -362,5 +362,7 @@
|
||||
<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>
|
||||
|
||||
12
app/src/main/res/xml/list_widget_info.xml
Normal file
12
app/src/main/res/xml/list_widget_info.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?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" />
|
||||
@@ -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.11.1" apply false
|
||||
id("com.android.application") version "8.12.0" apply false
|
||||
id("org.jetbrains.kotlin.android") version "2.2.0" apply false
|
||||
}
|
||||
|
||||
|
||||
2
fastlane/metadata/android/cs-CZ/changelogs/150.txt
Normal file
2
fastlane/metadata/android/cs-CZ/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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
|
||||
2
fastlane/metadata/android/de-DE/changelogs/150.txt
Normal file
2
fastlane/metadata/android/de-DE/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- Widget, das alle nichtarchvierten Karten anzeigt, hinzugefügt
|
||||
- Beugt dem Verdecken der „Speichern“-Taste durch die Tastatur in der Bearbeitungs- bzw. Gruppenansicht vor
|
||||
@@ -1 +1,2 @@
|
||||
- Made it harder to accidentally close edit view
|
||||
- Add a widget showing all non-archived cards
|
||||
- Prevent the keyboard from overlapping the save button in edit and group screens
|
||||
1
fastlane/metadata/android/et/changelogs/149.txt
Normal file
1
fastlane/metadata/android/et/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Sõltuvuste ja tõlgete uuendused
|
||||
2
fastlane/metadata/android/et/changelogs/150.txt
Normal file
2
fastlane/metadata/android/et/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- Vidin, mis näitab kõiki mittearhiveeritud kaarte
|
||||
- Klahvistik enam ei varja muutmis- ja grupivaadetes salvestusnuppu
|
||||
2
fastlane/metadata/android/fr-FR/changelogs/150.txt
Normal file
2
fastlane/metadata/android/fr-FR/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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
|
||||
1
fastlane/metadata/android/lt/changelogs/150.txt
Normal file
1
fastlane/metadata/android/lt/changelogs/150.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Neleisti klaviatūrai uždengti išsaugojimo mygtuko, redagavimo ir grupių ekranuose
|
||||
5
fastlane/metadata/android/lt/changelogs/16.txt
Normal file
5
fastlane/metadata/android/lt/changelogs/16.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
- 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))
|
||||
2
fastlane/metadata/android/lt/changelogs/17.txt
Normal file
2
fastlane/metadata/android/lt/changelogs/17.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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))
|
||||
2
fastlane/metadata/android/lt/changelogs/18.txt
Normal file
2
fastlane/metadata/android/lt/changelogs/18.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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))
|
||||
3
fastlane/metadata/android/lt/changelogs/19.txt
Normal file
3
fastlane/metadata/android/lt/changelogs/19.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
- 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))
|
||||
3
fastlane/metadata/android/lt/changelogs/2.txt
Normal file
3
fastlane/metadata/android/lt/changelogs/2.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
- 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.
|
||||
2
fastlane/metadata/android/lv/changelogs/150.txt
Normal file
2
fastlane/metadata/android/lv/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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
|
||||
@@ -1,5 +1,5 @@
|
||||
- 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))
|
||||
- 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.
|
||||
|
||||
1
fastlane/metadata/android/nl-NL/changelogs/119.txt
Normal file
1
fastlane/metadata/android/nl-NL/changelogs/119.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Material You kleurenschema nu beschikbaar op meer apparaten
|
||||
@@ -1,4 +1,4 @@
|
||||
- Kleine UI-fixes
|
||||
- Herstel van datums bij roteren van het kaartbewerkingsscherm
|
||||
- Voorkom dat datums gereset worden bij roteren van het kaartbewerkingsscherm
|
||||
- Oplossen van crashes bij roteren met kleurkiezer zichtbaar
|
||||
- Stocard-importfouten opgelost
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
- 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
|
||||
|
||||
1
fastlane/metadata/android/nl-NL/changelogs/138.txt
Normal file
1
fastlane/metadata/android/nl-NL/changelogs/138.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Terugswipen sluit niet meer het toetsenbord en zoekveld af op Android 13 en nieuwer
|
||||
3
fastlane/metadata/android/nl-NL/changelogs/139.txt
Normal file
3
fastlane/metadata/android/nl-NL/changelogs/139.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
- 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
|
||||
1
fastlane/metadata/android/nl-NL/changelogs/140.txt
Normal file
1
fastlane/metadata/android/nl-NL/changelogs/140.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Zorg dat tekst correct past in het "Kaart toevoegen" dialoogvenster
|
||||
@@ -1,2 +1,4 @@
|
||||
- toon standaard 4 kolommen op brede schermen
|
||||
- laat toe het aantal kolommen in portret- en landschapmodus te veranderen in de instellingen
|
||||
- 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
|
||||
|
||||
3
fastlane/metadata/android/nl-NL/changelogs/142.txt
Normal file
3
fastlane/metadata/android/nl-NL/changelogs/142.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
- 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
|
||||
1
fastlane/metadata/android/nl-NL/changelogs/143.txt
Normal file
1
fastlane/metadata/android/nl-NL/changelogs/143.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Fix crash bij het openen van een invalide pkpass bestand
|
||||
1
fastlane/metadata/android/nl-NL/changelogs/144.txt
Normal file
1
fastlane/metadata/android/nl-NL/changelogs/144.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Verbeter display van het archief/favoriet icoontje
|
||||
3
fastlane/metadata/android/nl-NL/changelogs/145.txt
Normal file
3
fastlane/metadata/android/nl-NL/changelogs/145.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
- 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)
|
||||
2
fastlane/metadata/android/nl-NL/changelogs/146.txt
Normal file
2
fastlane/metadata/android/nl-NL/changelogs/146.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- Kaarten kunnen nu ook op startdatum gesorteerd worden
|
||||
- Schakel doelversie tijdelijk terug naar Android 14 om enkele gebruikersinterfaceissues op te lossen
|
||||
3
fastlane/metadata/android/nl-NL/changelogs/147.txt
Normal file
3
fastlane/metadata/android/nl-NL/changelogs/147.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
- Zet doelversie naar Android 15
|
||||
- Fix crash bij het lezen van een niet ondersteund pkpass bestand
|
||||
- Verbeter pkpass ondersteuning
|
||||
4
fastlane/metadata/android/nl-NL/changelogs/148.txt
Normal file
4
fastlane/metadata/android/nl-NL/changelogs/148.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- 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
|
||||
1
fastlane/metadata/android/nl-NL/changelogs/149.txt
Normal file
1
fastlane/metadata/android/nl-NL/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Updates van afhankelijkheden en vertalingen
|
||||
2
fastlane/metadata/android/nl-NL/changelogs/150.txt
Normal file
2
fastlane/metadata/android/nl-NL/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- Voeg een widget toe welke all niet-gearchiveerde kaarten toont
|
||||
- Voorkom dat het toetsenbord de opslaknop verbergd in het bewerk en groep scherm
|
||||
2
fastlane/metadata/android/pt-PT/changelogs/150.txt
Normal file
2
fastlane/metadata/android/pt-PT/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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
|
||||
2
fastlane/metadata/android/pt/changelogs/150.txt
Normal file
2
fastlane/metadata/android/pt/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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
|
||||
2
fastlane/metadata/android/ru-RU/changelogs/150.txt
Normal file
2
fastlane/metadata/android/ru-RU/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- Добавлен виджет, показывающий все неархивные карты
|
||||
- Исправлена ошибка перекрытия клавиатурой кнопки сохранения на экранах редактирования и групп
|
||||
@@ -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ť úvodného sprievodcu, ktorý sa spustí pri prvom spustení. (ťah #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
|
||||
- Pridať sprievodcu, ktorý sa spustí pri prvom spustení aplikácie. (ťah #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
|
||||
|
||||
2
fastlane/metadata/android/sk/changelogs/150.txt
Normal file
2
fastlane/metadata/android/sk/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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
|
||||
@@ -1,11 +1,11 @@
|
||||
- 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
|
||||
- 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
|
||||
- Pridaná podpora UPC-E
|
||||
- Podpora pridania prednej a zadnej fotografie na každú kartu
|
||||
- Podpora pridania fotografie prednej a zadnej strany u každej karty
|
||||
- Podpora importu súborov zip chránených heslom
|
||||
- Podpora importu zo Stocard (Beta)
|
||||
- Oprava zbytočných medzier v poznámkach z importu Fidme
|
||||
- Podpora importu Stocard (Beta)
|
||||
- Oprava medzier v poznámkach z importu Fidme
|
||||
- Podpora nového formátu exportu Voucher Vault
|
||||
- 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
|
||||
- Oprava plávajúcich akčných tlačidiel v Android 4
|
||||
- Oprava horného okraja panela aplikácií prehliadača vernostných kariet
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
Zastavte hľadanie plastových vernostných kariet počas pokladne v obchode alebo internetovom obchode.
|
||||
Zastavte hľadanie vernostných kariet pri pokladni 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 ako ultraľahkú na cennosti.
|
||||
Zabudnite na peňaženku alebo si ju uschovajte.
|
||||
|
||||
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 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.
|
||||
- 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.
|
||||
- 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 a kódy pomocou ľubovoľnej aplikácie.
|
||||
- Zdieľajte kupóny, exkluzívne ponuky, promo kódy alebo karty 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.
|
||||
- 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*.
|
||||
- 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*.
|
||||
- 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 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.
|
||||
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.
|
||||
|
||||
2
fastlane/metadata/android/uk/changelogs/150.txt
Normal file
2
fastlane/metadata/android/uk/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- Додано віджет, який показує всі неархівовані картки
|
||||
- Запобігання перекриттю кнопки збереження клавіатурою на екранах редагування та групування
|
||||
2
fastlane/metadata/android/zh-CN/changelogs/150.txt
Normal file
2
fastlane/metadata/android/zh-CN/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 添加显示所有非已归档卡片的小部件
|
||||
- 防止编辑与分组屏幕中键盘和保存按钮相重叠
|
||||
Reference in New Issue
Block a user