mirror of
https://github.com/CatimaLoyalty/Android.git
synced 2025-12-25 08:07:56 -05:00
Compare commits
133 Commits
| 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 | ||
|
|
8f6bd8c266 | ||
|
|
599d58e3c7 | ||
|
|
1dd58bf2d0 | ||
|
|
90cf3adc25 | ||
|
|
26797addb8 | ||
|
|
b320e6f253 | ||
|
|
48d9ac4eed | ||
|
|
388eb273e4 | ||
|
|
0eee713712 | ||
|
|
3ff1262149 | ||
|
|
f4a420b699 | ||
|
|
b35b0cf1f9 | ||
|
|
2f4ee75c85 | ||
|
|
b3356b6575 | ||
|
|
359a37c8a6 | ||
|
|
a5a57fe8c8 | ||
|
|
c1f088c191 | ||
|
|
fec8d05927 | ||
|
|
466f068e36 | ||
|
|
b5880223a5 | ||
|
|
0a8a621fad | ||
|
|
5267607b79 | ||
|
|
5474a516f4 | ||
|
|
221b8cd7d1 | ||
|
|
2b544a74bd | ||
|
|
bcb7df24ec | ||
|
|
59fb95a4a7 | ||
|
|
157617fe4a | ||
|
|
ecdfeee3e6 | ||
|
|
3cd3a53268 | ||
|
|
9edf3c3028 | ||
|
|
82d8addafa | ||
|
|
3b446145b8 | ||
|
|
92fec8558e | ||
|
|
df858a7d65 | ||
|
|
a4c0c51a45 | ||
|
|
33d4b3ab7c | ||
|
|
06dc720108 | ||
|
|
a24805232c | ||
|
|
5ec1bcb721 | ||
|
|
cddc273333 | ||
|
|
0bd46b96cb | ||
|
|
2b6926c800 | ||
|
|
ceb6bb8328 | ||
|
|
8fd88e29ec | ||
|
|
d97b1cc1d0 | ||
|
|
baf2848ce0 | ||
|
|
b16ea272ae | ||
|
|
59fa7d143d | ||
|
|
658cfd2d4a | ||
|
|
a428db36c4 | ||
|
|
469eaefcb6 | ||
|
|
e991c9fdc1 |
33
.github/workflows/gradle-update.yml
vendored
33
.github/workflows/gradle-update.yml
vendored
@@ -1,33 +0,0 @@
|
||||
name: Gradle update
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '3 6 * * *'
|
||||
permissions:
|
||||
actions: none
|
||||
checks: none
|
||||
contents: write
|
||||
deployments: none
|
||||
discussions: none
|
||||
id-token: none
|
||||
issues: none
|
||||
packages: none
|
||||
pages: none
|
||||
pull-requests: write
|
||||
repository-projects: none
|
||||
security-events: none
|
||||
statuses: none
|
||||
jobs:
|
||||
gradle-update:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: obfusk/gradle-update-action@v3.0.0
|
||||
id: gradle-update
|
||||
- uses: gradle/actions/wrapper-validation@v4
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v7.0.8
|
||||
with:
|
||||
title: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"
|
||||
commit-message: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"
|
||||
branch-suffix: timestamp
|
||||
@@ -1,5 +1,10 @@
|
||||
# Changelog
|
||||
|
||||
## v2.36.0 - 150 (2025-08-05)
|
||||
|
||||
- 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)
|
||||
|
||||
- Dependency and translation updates
|
||||
|
||||
30
Gemfile.lock
30
Gemfile.lock
@@ -10,26 +10,26 @@ GEM
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.3.2)
|
||||
aws-partitions (1.1105.0)
|
||||
aws-sdk-core (3.224.0)
|
||||
aws-eventstream (1.4.0)
|
||||
aws-partitions (1.1117.0)
|
||||
aws-sdk-core (3.226.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
base64
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
logger
|
||||
aws-sdk-kms (1.101.0)
|
||||
aws-sdk-core (~> 3, >= 3.216.0)
|
||||
aws-sdk-kms (1.105.0)
|
||||
aws-sdk-core (~> 3, >= 3.225.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.186.1)
|
||||
aws-sdk-core (~> 3, >= 3.216.0)
|
||||
aws-sdk-s3 (1.189.1)
|
||||
aws-sdk-core (~> 3, >= 3.225.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.11.0)
|
||||
aws-sigv4 (1.12.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
base64 (0.2.0)
|
||||
base64 (0.3.0)
|
||||
claide (1.1.0)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
@@ -58,10 +58,10 @@ GEM
|
||||
faraday (>= 0.8.0)
|
||||
http-cookie (~> 1.0.0)
|
||||
faraday-em_http (1.0.0)
|
||||
faraday-em_synchrony (1.0.0)
|
||||
faraday-em_synchrony (1.0.1)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-multipart (1.1.0)
|
||||
faraday-multipart (1.1.1)
|
||||
multipart-post (~> 2.0)
|
||||
faraday-net_http (1.0.2)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
@@ -71,7 +71,7 @@ GEM
|
||||
faraday_middleware (1.2.1)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.4.0)
|
||||
fastlane (2.227.2)
|
||||
fastlane (2.228.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
@@ -158,7 +158,7 @@ GEM
|
||||
httpclient (2.9.0)
|
||||
mutex_m
|
||||
jmespath (1.6.2)
|
||||
json (2.12.0)
|
||||
json (2.12.2)
|
||||
jwt (2.10.1)
|
||||
base64
|
||||
logger (1.7.0)
|
||||
@@ -168,14 +168,14 @@ GEM
|
||||
multipart-post (2.4.1)
|
||||
mutex_m (0.3.0)
|
||||
nanaimo (0.4.0)
|
||||
naturally (2.2.1)
|
||||
naturally (2.3.0)
|
||||
nkf (0.2.0)
|
||||
optparse (0.6.0)
|
||||
os (1.1.4)
|
||||
ostruct (0.6.1)
|
||||
plist (3.7.2)
|
||||
public_suffix (6.0.2)
|
||||
rake (13.2.1)
|
||||
rake (13.3.0)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
|
||||
@@ -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,18 +129,18 @@ 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")
|
||||
testImplementation("org.robolectric:robolectric:4.14.1")
|
||||
testImplementation("org.robolectric:robolectric:4.15.1")
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -44,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;
|
||||
|
||||
@@ -297,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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -594,6 +596,11 @@ public class Utils {
|
||||
double width = bitmap.getWidth();
|
||||
double height = bitmap.getHeight();
|
||||
|
||||
// Early exit
|
||||
if (Math.max(width, height) <= maxSize) {
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
if (height > width) {
|
||||
double scale = height / maxSize;
|
||||
height = maxSize;
|
||||
@@ -1134,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
|
||||
@@ -1149,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,64 +16,65 @@ Altonss
|
||||
B o d o
|
||||
Michael Moroni
|
||||
Eric
|
||||
Silvério Santos
|
||||
Максим Горпиніч
|
||||
GM
|
||||
Joel A
|
||||
Petr Novák
|
||||
laralem
|
||||
Priit Jõerüüt
|
||||
Taco
|
||||
laralem
|
||||
Petr Novák
|
||||
Joel A
|
||||
Edgars Andersons
|
||||
Taco
|
||||
nadiafekihahmed
|
||||
pfaffenrodt
|
||||
Aayush Gupta
|
||||
Scrambled777
|
||||
Silvério Santos
|
||||
ikanakova
|
||||
Giovanni Donisi
|
||||
HudobniVolk
|
||||
Jiri Grönroos
|
||||
Nyatsuki
|
||||
Samantaz Fox
|
||||
josé m
|
||||
Milo Ivir
|
||||
Samantaz Fox
|
||||
Balázs Meskó
|
||||
Arno-github
|
||||
Ankit Tiwari
|
||||
Milo Ivir
|
||||
Fjuro
|
||||
Cliff Heraldo
|
||||
Sergio Paredes
|
||||
Jose Delvani
|
||||
mdvhimself
|
||||
Milan Šalka
|
||||
தமிழ் நேரம்
|
||||
huuhaa
|
||||
Skrripy
|
||||
Ankit Tiwari
|
||||
Arno-github
|
||||
Kachelkaiser
|
||||
Projjal Moitra
|
||||
Quentin PAGÈS
|
||||
Jose Delvani
|
||||
Warder
|
||||
GitSpoon
|
||||
Milan Šalka
|
||||
mdvhimself
|
||||
Skrripy
|
||||
Vasilis
|
||||
ngocanhtve
|
||||
huuhaa
|
||||
தமிழ் நேரம்
|
||||
waffshappen
|
||||
Marnick L'Eau
|
||||
Fjuro
|
||||
ngocanhtve
|
||||
StellarSand
|
||||
Quentin PAGÈS
|
||||
Projjal Moitra
|
||||
Robin
|
||||
JungHee Lee
|
||||
hajertabbane
|
||||
Ziad OUALHADJ
|
||||
Denis Shilin
|
||||
Robin Liu
|
||||
Ricky Tigg
|
||||
Renko
|
||||
Denis Shilin
|
||||
しいたけ
|
||||
Alexander Ivanov
|
||||
Miha Frangež
|
||||
Viet Nguyen Hoang
|
||||
stavpup
|
||||
ehrt74
|
||||
Warder
|
||||
Virginie
|
||||
Tim Trek
|
||||
GitSpoon
|
||||
Ricky Tigg
|
||||
Peter Dave Hello
|
||||
Michael Gangolf
|
||||
rudy3
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -300,4 +300,5 @@
|
||||
<string name="unsupportedFile">File ini tidak didukung</string>
|
||||
<string name="generic_error_please_retry">Maaf, terjadi kesalahan, silakan coba lagi...</string>
|
||||
<string name="sort_by_valid_from">Berlaku dari</string>
|
||||
<string name="width">Lebar</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>
|
||||
|
||||
@@ -307,4 +307,6 @@
|
||||
<string name="addFromPkpass">Selectează un fișier de tip Passbook (.pkpass)</string>
|
||||
<string name="unsupportedFile">Acest fișier nu este suportat</string>
|
||||
<string name="generic_error_please_retry">Scuze, ceva nu a funționat. Încearcă din nou ...</string>
|
||||
<string name="width">Lățime</string>
|
||||
<string name="setBarcodeWidth">Setează Lățimea Codului de Bare</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,8 +1,8 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
plugins {
|
||||
id("com.android.application") version "8.10.1" apply false
|
||||
id("org.jetbrains.kotlin.android") version "2.1.21" apply false
|
||||
id("com.android.application") version "8.12.0" apply false
|
||||
id("org.jetbrains.kotlin.android") version "2.2.0" apply false
|
||||
}
|
||||
|
||||
allprojects {
|
||||
|
||||
@@ -10,4 +10,4 @@
|
||||
7. Upload `app/build/outputs/apk/gplay/release/app-gplay-release.apk` to Google Play Open Testing
|
||||
8. Push the version update commit: `git push`
|
||||
9. Create a new release on GitHub and attach the `app/build/outputs/apk/foss/release/app-foss-release.apk` and `SHA256SUMS` files
|
||||
10. After the release has been approved on Google Play Production, update the metadata there: `bundle exec fastlane supply --version_code <VERSION_CODE>`
|
||||
10. When pushing the release to Google Play Production, update the metadata there: `bundle exec fastlane supply --version_code <VERSION_CODE>`
|
||||
|
||||
1
fastlane/metadata/android/ar/changelogs/149.txt
Normal file
1
fastlane/metadata/android/ar/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- تحديثات التبعية و الترجمة
|
||||
2
fastlane/metadata/android/ar/changelogs/27.txt
Normal file
2
fastlane/metadata/android/ar/changelogs/27.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- تقليل الحد الأدنى لإصدار مجموعة أدوات مطوري البرامج من 17 إلى 15. (طلب سحب رقم 226 (https://github.com/brarcher/loyalty-card-locker/pull/226))
|
||||
- إزالة إستخدام مكتبة apache الموروثة, أستخدمت فقط في مرحلة أختبار الوحدة ولم تعد مطلوبة.(طلب سحب رقم 225 (https://github.com/brarcher/loyalty-card-locker/pull/225))
|
||||
5
fastlane/metadata/android/ar/changelogs/28.txt
Normal file
5
fastlane/metadata/android/ar/changelogs/28.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
- أُضيفت ترجمات
|
||||
- اللغة البولندية (طلب سحب رقم 232 (https://github.com/brarcher/loyalty-card-locker/pull/232))
|
||||
- اللغة الإسبانية (طلب سحب رقم 232 (https://github.com/brarcher/loyalty-card-locker/pull/232))
|
||||
- اللغة السلوفاكية (طلب سحب رقم 232 (https://github.com/brarcher/loyalty-card-locker/pull/232))
|
||||
- حدثت الترجمات (طلب سحب رقم 239 (https://github.com/brarcher/loyalty-card-locker/pull/239))
|
||||
2
fastlane/metadata/android/ar/changelogs/29.txt
Normal file
2
fastlane/metadata/android/ar/changelogs/29.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- إصلاح الترجمة الإسبانية (طلب سحب رقم 224 (https://github.com/brarcher/loyalty-card-locker/pull/244))
|
||||
- تحديث الترجمات (طلب سحب رقم 224 (https://github.com/brarcher/loyalty-card-locker/pull/244))
|
||||
14
fastlane/metadata/android/ar/changelogs/3.txt
Normal file
14
fastlane/metadata/android/ar/changelogs/3.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
- الآن رسمياً ندعم الباركودات التالية ذات أحادية الأبعاد و ثنائية الأبعاد:
|
||||
- AZTEC
|
||||
- CODABAR
|
||||
- CODE_39
|
||||
- CODE_128
|
||||
- DATA_MATRIX
|
||||
- EAN_8
|
||||
- EAN_13
|
||||
- ITF
|
||||
- PDF_417
|
||||
- QR_CODE
|
||||
- UPC_A
|
||||
|
||||
- الباركودات المُوَلَّدة بواسطة البرنامج الآن تظهر بشكل أكبر من أجل تسهيل عملية المسح بإستخدام جهاز المسح (القارئ الضوئي)
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 22 KiB |
@@ -1 +1 @@
|
||||
Catima
|
||||
كاتيما - محفظة بطاقة الولاء
|
||||
|
||||
1
fastlane/metadata/android/cs-CZ/changelogs/149.txt
Normal file
1
fastlane/metadata/android/cs-CZ/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Aktualizace závislostí a překladů
|
||||
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
|
||||
1
fastlane/metadata/android/de-DE/changelogs/149.txt
Normal file
1
fastlane/metadata/android/de-DE/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Übersetzungs- und Abhängigkeitsaktualisierungen
|
||||
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
|
||||
2
fastlane/metadata/android/en-US/changelogs/150.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/150.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
- 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
|
||||
1
fastlane/metadata/android/fr-FR/changelogs/149.txt
Normal file
1
fastlane/metadata/android/fr-FR/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Mises à jour des dépendances et des traductions
|
||||
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/it-IT/changelogs/149.txt
Normal file
1
fastlane/metadata/android/it-IT/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Aggiornamento delle dipendenze e delle traduzioni
|
||||
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
|
||||
4
fastlane/metadata/android/pt-PT/changelogs/141.txt
Normal file
4
fastlane/metadata/android/pt-PT/changelogs/141.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Alterar a coluna padrão em ecrãs largas para 4
|
||||
- Permitir substituir a contagem de colunas para retrato e paisagem em configurações
|
||||
- Manter o filtro de pesquisa do ecrã principal ao girar o ecrã ou abrir um cartão
|
||||
- Limitar o comprimento máximo de exibição de nota no ecrã principal
|
||||
4
fastlane/metadata/android/pt-PT/changelogs/148.txt
Normal file
4
fastlane/metadata/android/pt-PT/changelogs/148.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Adicionar capacidade de escolher a largura de código de barras na visualização em ecrã cheio
|
||||
- Remover a confusão da função importar da app
|
||||
- Várias correções de digitalização
|
||||
- Corrigir travar ao carregar um ficheiro de pkpass sem código de barras
|
||||
1
fastlane/metadata/android/pt-PT/changelogs/149.txt
Normal file
1
fastlane/metadata/android/pt-PT/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Atualizações de dependências e traduções
|
||||
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
|
||||
4
fastlane/metadata/android/pt/changelogs/141.txt
Normal file
4
fastlane/metadata/android/pt/changelogs/141.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Alterar a coluna padrão em ecrãs largas para 4
|
||||
- Permitir substituir a contagem de colunas para retrato e paisagem em configurações
|
||||
- Manter o filtro de pesquisa do ecrã principal ao girar o ecrã ou abrir um cartão
|
||||
- Limitar o comprimento máximo de exibição de nota no ecrã principal
|
||||
4
fastlane/metadata/android/pt/changelogs/148.txt
Normal file
4
fastlane/metadata/android/pt/changelogs/148.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Adicionar capacidade de escolher a largura de código de barras na visualização em ecrã cheio
|
||||
- Remover a confusão da função importar da app
|
||||
- Várias correções de digitalização
|
||||
- Corrigir travar ao carregar um ficheiro de pkpass sem código de barras
|
||||
1
fastlane/metadata/android/pt/changelogs/149.txt
Normal file
1
fastlane/metadata/android/pt/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Atualizações de dependências e traduções
|
||||
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
|
||||
1
fastlane/metadata/android/ru-RU/changelogs/149.txt
Normal file
1
fastlane/metadata/android/ru-RU/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Обновления зависимостей и переводов
|
||||
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))
|
||||
|
||||
1
fastlane/metadata/android/sk/changelogs/149.txt
Normal file
1
fastlane/metadata/android/sk/changelogs/149.txt
Normal file
@@ -0,0 +1 @@
|
||||
- Aktualizácie závislostí a prekladov
|
||||
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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user