Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bc5e77bbd | ||
|
|
d8ddee0667 | ||
|
|
5e8312e816 | ||
|
|
8e10022158 | ||
|
|
b209b670a5 | ||
|
|
ecdec0f773 | ||
|
|
5c90107a7b | ||
|
|
6a8a9878d7 | ||
|
|
3400d10cc6 | ||
|
|
05e171170b | ||
|
|
cb967a8d8d | ||
|
|
5835da2931 | ||
|
|
2e9339b8aa | ||
|
|
bbba4b2e11 | ||
|
|
d9659ecc9d | ||
|
|
c558278962 | ||
|
|
c137cb9428 | ||
|
|
1d2f54c69b | ||
|
|
d4a377fe18 | ||
|
|
9844113568 | ||
|
|
c49f26db95 | ||
|
|
9744dfe6ff | ||
|
|
55dfd1fe09 | ||
|
|
0a3c81154c | ||
|
|
70a9689bb2 | ||
|
|
54f6d8d26f | ||
|
|
c0622ddaec | ||
|
|
12578eab3e | ||
|
|
5dd57577af | ||
|
|
d883c84b4e | ||
|
|
0ebe1b387d | ||
|
|
942aff2af5 | ||
|
|
c1606fef62 | ||
|
|
cc895353a9 | ||
|
|
73bac0ae8d | ||
|
|
158e424a47 | ||
|
|
133fa13d3b | ||
|
|
44ff4d0cc6 | ||
|
|
a7b280c08b | ||
|
|
5fe0429c98 | ||
|
|
bf391022fd | ||
|
|
a431bf8c30 | ||
|
|
a242944ee6 | ||
|
|
84a7e84486 | ||
|
|
d4988f1d4c | ||
|
|
04e52f0a8a |
2
.gitignore
vendored
@@ -6,3 +6,5 @@
|
||||
.DS_Store
|
||||
/build
|
||||
/captures
|
||||
/app/release
|
||||
/app/debug
|
||||
|
||||
15
CHANGELOG.md
@@ -1,5 +1,20 @@
|
||||
# Changelog
|
||||
|
||||
## v1.4.1 (2020-12-01)
|
||||
|
||||
Changes:
|
||||
|
||||
- Improved translations
|
||||
- Small UI fixes
|
||||
|
||||
## v1.4.0 (2020-11-28)
|
||||
|
||||
Changes:
|
||||
|
||||
- Move About screen into its own activity
|
||||
- Ask user if they want to use their camera or manually enter ID on add/edit card
|
||||
- Make group ordering manual instead of forced alphabetically
|
||||
|
||||
## v1.3.0 (2020-11-22)
|
||||
|
||||
Changes:
|
||||
|
||||
@@ -13,8 +13,9 @@ android {
|
||||
applicationId "me.hackerchick.catima"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 29
|
||||
versionCode 47
|
||||
versionName "1.3.0"
|
||||
versionCode 49
|
||||
versionName "1.4.1"
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
@@ -53,7 +54,6 @@ dependencies {
|
||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
||||
implementation 'com.jaredrummler:colorpicker:1.0.2'
|
||||
implementation group: 'com.google.guava', name: 'guava', version: '20.0'
|
||||
implementation 'com.github.apl-devs:appintro:v4.2.0'
|
||||
implementation "com.vanniktech:vntnumberpickerpreference:1.0.0"
|
||||
implementation 'androidx.cardview:cardview:1.0.0'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":41,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
|
||||
@@ -33,6 +33,11 @@
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".AboutActivity"
|
||||
android:label="@string/about"
|
||||
android:theme="@style/AppTheme.NoActionBar">
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".ManageGroupsActivity"
|
||||
android:label="@string/groups"
|
||||
|
||||
125
app/src/main/java/protect/card_locker/AboutActivity.java
Normal file
@@ -0,0 +1,125 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.database.Cursor;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.text.util.Linkify;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
import org.w3c.dom.Text;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Map;
|
||||
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.text.HtmlCompat;
|
||||
|
||||
public class AboutActivity extends AppCompatActivity
|
||||
{
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.about_activity);
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if(actionBar != null)
|
||||
{
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
final Map<String, String> USED_LIBRARIES = new ImmutableMap.Builder<String, String>()
|
||||
.put("Commons CSV", "https://commons.apache.org/proper/commons-csv/")
|
||||
.put("Guava", "https://github.com/google/guava")
|
||||
.put("ZXing", "https://github.com/zxing/zxing")
|
||||
.put("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded")
|
||||
.put("Color Picker", "https://github.com/jaredrummler/ColorPicker")
|
||||
.put("VNTNumberPickerPreference", "https://github.com/vanniktech/VNTNumberPickerPreference")
|
||||
.build();
|
||||
|
||||
final Map<String, String> USED_ASSETS = ImmutableMap.of
|
||||
(
|
||||
"Save by Bernar Novalyi", "https://thenounproject.com/term/save/716011"
|
||||
);
|
||||
|
||||
StringBuilder libs = new StringBuilder().append("<br/>");
|
||||
for (Map.Entry<String, String> entry : USED_LIBRARIES.entrySet())
|
||||
{
|
||||
libs.append("<br/><a href=\"").append(entry.getValue()).append("\">").append(entry.getKey()).append("</a><br/>");
|
||||
}
|
||||
|
||||
StringBuilder resources = new StringBuilder().append("<br/>");
|
||||
for (Map.Entry<String, String> entry : USED_ASSETS.entrySet())
|
||||
{
|
||||
resources.append("<br/><a href=\"").append(entry.getValue()).append("\">").append(entry.getKey()).append("</a><br/>");
|
||||
}
|
||||
|
||||
String appName = getString(R.string.app_name);
|
||||
int year = Calendar.getInstance().get(Calendar.YEAR);
|
||||
|
||||
String version = "?";
|
||||
try
|
||||
{
|
||||
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
|
||||
version = pi.versionName;
|
||||
}
|
||||
catch (PackageManager.NameNotFoundException e)
|
||||
{
|
||||
Log.w(TAG, "Package name not found", e);
|
||||
}
|
||||
|
||||
setTitle(String.format(getString(R.string.about_title_fmt), appName));
|
||||
|
||||
TextView aboutTextView = findViewById(R.id.aboutText);
|
||||
aboutTextView.setText(HtmlCompat.fromHtml(String.format(getString(R.string.debug_version_fmt), version) +
|
||||
"<br/><br/>" +
|
||||
String.format(getString(R.string.app_revision_fmt),
|
||||
"<a href=\"" + getString(R.string.app_revision_url) + "\">" +
|
||||
"GitHub" +
|
||||
"</a>") +
|
||||
"<br/><br/>" +
|
||||
String.format(getString(R.string.app_copyright_fmt), year) +
|
||||
"<br/><br/>" +
|
||||
getString(R.string.app_copyright_old) +
|
||||
"<br/><br/>" +
|
||||
getString(R.string.app_license) +
|
||||
"<br/><br/>" +
|
||||
String.format(getString(R.string.app_libraries), appName, libs.toString()) +
|
||||
"<br/><br/>" +
|
||||
String.format(getString(R.string.app_resources), appName, resources.toString()), HtmlCompat.FROM_HTML_MODE_COMPACT));
|
||||
aboutTextView.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item)
|
||||
{
|
||||
int id = item.getItemId();
|
||||
|
||||
if (id == android.R.id.home) {
|
||||
finish();
|
||||
}
|
||||
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
23
app/src/main/java/protect/card_locker/BarcodeValues.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package protect.card_locker;
|
||||
|
||||
public class BarcodeValues {
|
||||
private final String mFormat;
|
||||
private final String mContent;
|
||||
|
||||
public BarcodeValues(String format, String content) {
|
||||
mFormat = format;
|
||||
mContent = content;
|
||||
}
|
||||
|
||||
public String format() {
|
||||
return mFormat;
|
||||
}
|
||||
|
||||
public String content() {
|
||||
return mContent;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return mFormat == null && mContent == null;
|
||||
}
|
||||
}
|
||||
@@ -14,12 +14,13 @@ public class DBHelper extends SQLiteOpenHelper
|
||||
{
|
||||
public static final String DATABASE_NAME = "Catima.db";
|
||||
public static final int ORIGINAL_DATABASE_VERSION = 1;
|
||||
public static final int DATABASE_VERSION = 5;
|
||||
public static final int DATABASE_VERSION = 6;
|
||||
|
||||
static class LoyaltyCardDbGroups
|
||||
{
|
||||
public static final String TABLE = "groups";
|
||||
public static final String ID = "_id";
|
||||
public static final String ORDER = "orderId";
|
||||
}
|
||||
|
||||
static class LoyaltyCardDbIds
|
||||
@@ -52,7 +53,8 @@ public class DBHelper extends SQLiteOpenHelper
|
||||
{
|
||||
// create table for card groups
|
||||
db.execSQL("create table " + LoyaltyCardDbGroups.TABLE + "(" +
|
||||
LoyaltyCardDbGroups.ID + " TEXT primary key not null)");
|
||||
LoyaltyCardDbGroups.ID + " TEXT primary key not null," +
|
||||
LoyaltyCardDbGroups.ORDER + " INTEGER DEFAULT '0')");
|
||||
|
||||
// create table for cards
|
||||
db.execSQL("create table " + LoyaltyCardDbIds.TABLE + "(" +
|
||||
@@ -109,6 +111,13 @@ public class DBHelper extends SQLiteOpenHelper
|
||||
LoyaltyCardDbIdsGroups.groupID + " TEXT," +
|
||||
"primary key (" + LoyaltyCardDbIdsGroups.cardID + "," + LoyaltyCardDbIdsGroups.groupID +"))");
|
||||
}
|
||||
|
||||
// Upgrade from version 5 to 6
|
||||
if(oldVersion < 6 && newVersion >= 6)
|
||||
{
|
||||
db.execSQL("ALTER TABLE " + LoyaltyCardDbGroups.TABLE
|
||||
+ " ADD COLUMN " + LoyaltyCardDbGroups.ORDER + " INTEGER DEFAULT '0'");
|
||||
}
|
||||
}
|
||||
|
||||
public long insertLoyaltyCard(final String store, final String note, final String cardId,
|
||||
@@ -376,7 +385,7 @@ public class DBHelper extends SQLiteOpenHelper
|
||||
SQLiteDatabase db = getReadableDatabase();
|
||||
|
||||
Cursor res = db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE +
|
||||
" ORDER BY " + LoyaltyCardDbGroups.ID + " COLLATE NOCASE ASC", null, null);
|
||||
" ORDER BY " + LoyaltyCardDbGroups.ORDER + " ASC," + LoyaltyCardDbGroups.ID + " COLLATE NOCASE ASC", null, null);
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -398,6 +407,26 @@ public class DBHelper extends SQLiteOpenHelper
|
||||
return groups;
|
||||
}
|
||||
|
||||
public void reorderGroups(final List<Group> groups)
|
||||
{
|
||||
Integer order = 0;
|
||||
|
||||
SQLiteDatabase db = getWritableDatabase();
|
||||
ContentValues contentValues;
|
||||
|
||||
for (Group group : groups)
|
||||
{
|
||||
contentValues = new ContentValues();
|
||||
contentValues.put(LoyaltyCardDbGroups.ORDER, order);
|
||||
|
||||
db.update(LoyaltyCardDbGroups.TABLE, contentValues,
|
||||
LoyaltyCardDbGroups.ID + "=?",
|
||||
new String[]{group._id});
|
||||
|
||||
order++;
|
||||
}
|
||||
}
|
||||
|
||||
public Group getGroup(final String groupName)
|
||||
{
|
||||
SQLiteDatabase db = getReadableDatabase();
|
||||
@@ -467,6 +496,7 @@ public class DBHelper extends SQLiteOpenHelper
|
||||
SQLiteDatabase db = getWritableDatabase();
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(LoyaltyCardDbGroups.ID, name);
|
||||
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
|
||||
final long newId = db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
|
||||
return newId;
|
||||
}
|
||||
@@ -475,6 +505,7 @@ public class DBHelper extends SQLiteOpenHelper
|
||||
{
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(LoyaltyCardDbGroups.ID, name);
|
||||
contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount());
|
||||
final long newId = db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues);
|
||||
return (newId != -1);
|
||||
}
|
||||
|
||||
@@ -37,15 +37,18 @@ class GroupCursorAdapter extends CursorAdapter
|
||||
public void bindView(View view, Context context, Cursor cursor)
|
||||
{
|
||||
// Find fields to populate in inflated template
|
||||
TextView nameField = (TextView) view.findViewById(R.id.name);
|
||||
TextView countField = (TextView) view.findViewById(R.id.cardCount);
|
||||
TextView nameField = view.findViewById(R.id.name);
|
||||
TextView countField = view.findViewById(R.id.cardCount);
|
||||
|
||||
// Extract properties from cursor
|
||||
Group group = Group.toGroup(cursor);
|
||||
|
||||
Integer groupCardCount = db.getGroupCardCount(group._id);
|
||||
|
||||
// Populate fields with extracted properties
|
||||
nameField.setText(group._id);
|
||||
countField.setText(String.format(context.getString(R.string.groupCardCount), db.getGroupCardCount(group._id)));
|
||||
|
||||
countField.setText(context.getResources().getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount));
|
||||
|
||||
nameField.setTextSize(settings.getCardTitleListFontSize());
|
||||
countField.setTextSize(settings.getCardNoteListFontSize());
|
||||
|
||||
@@ -48,8 +48,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
{
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
protected static final int SELECT_BARCODE_REQUEST = 1;
|
||||
|
||||
ImageView thumbnail;
|
||||
EditText storeFieldEdit;
|
||||
EditText noteFieldEdit;
|
||||
@@ -62,11 +60,13 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
View barcodeImageLayout;
|
||||
View barcodeCaptureLayout;
|
||||
|
||||
Button captureButton;
|
||||
Button enterButton;
|
||||
|
||||
int loyaltyCardId;
|
||||
boolean updateLoyaltyCard;
|
||||
String barcodeType;
|
||||
String cardId;
|
||||
|
||||
Uri importLoyaltyCardUri = null;
|
||||
Integer headingColorValue = null;
|
||||
|
||||
@@ -82,6 +82,10 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
final Bundle b = intent.getExtras();
|
||||
loyaltyCardId = b != null ? b.getInt("id") : 0;
|
||||
updateLoyaltyCard = b != null && b.getBoolean("update", false);
|
||||
|
||||
barcodeType = b != null ? b.getString("barcodeType") : null;
|
||||
cardId = b != null ? b.getString("cardId") : null;
|
||||
|
||||
importLoyaltyCardUri = intent.getData();
|
||||
|
||||
Log.d(TAG, "View activity: id=" + loyaltyCardId
|
||||
@@ -119,7 +123,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
barcodeImageLayout = findViewById(R.id.barcodeLayout);
|
||||
barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout);
|
||||
|
||||
captureButton = findViewById(R.id.captureButton);
|
||||
enterButton = findViewById(R.id.enterButton);
|
||||
|
||||
storeFieldEdit.addTextChangedListener(new TextWatcher() {
|
||||
@@ -318,6 +321,21 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
|
||||
thumbnail.setOnClickListener(new ColorSelectListener(headingColorValue));
|
||||
|
||||
if (!initDone) {
|
||||
hasChanged = false;
|
||||
initDone = true;
|
||||
}
|
||||
|
||||
// Update from intent
|
||||
if (barcodeType != null) {
|
||||
barcodeTypeField.setText(barcodeType.isEmpty() ? getString(R.string.noBarcode) : barcodeType);
|
||||
barcodeType = null;
|
||||
}
|
||||
if (cardId != null) {
|
||||
cardIdFieldView.setText(cardId);
|
||||
cardId = null;
|
||||
}
|
||||
|
||||
if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0)
|
||||
{
|
||||
String formatString = barcodeTypeField.getText().toString();
|
||||
@@ -335,37 +353,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
}
|
||||
}
|
||||
|
||||
View.OnClickListener captureCallback = new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
IntentIntegrator integrator = new IntentIntegrator(LoyaltyCardEditActivity.this);
|
||||
integrator.setDesiredBarcodeFormats(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES);
|
||||
|
||||
String prompt = getResources().getString(R.string.scanCardBarcode);
|
||||
integrator.setPrompt(prompt);
|
||||
integrator.setBeepEnabled(false);
|
||||
integrator.initiateScan();
|
||||
}
|
||||
};
|
||||
|
||||
captureButton.setOnClickListener(captureCallback);
|
||||
|
||||
enterButton.setOnClickListener(new EditCardIdAndBarcode());
|
||||
barcodeImage.setOnClickListener(new EditCardIdAndBarcode());
|
||||
|
||||
if(cardIdFieldView.getText().length() > 0)
|
||||
{
|
||||
cardAndBarcodeLayout.setVisibility(View.VISIBLE);
|
||||
enterButton.setText(R.string.editCard);
|
||||
}
|
||||
else
|
||||
{
|
||||
cardAndBarcodeLayout.setVisibility(View.GONE);
|
||||
enterButton.setText(R.string.enterCard);
|
||||
}
|
||||
|
||||
ArrayList<String> barcodeList = new ArrayList<>(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES);
|
||||
barcodeList.add(0, getString(R.string.noBarcode));
|
||||
ArrayAdapter<String> barcodeAdapter = new ArrayAdapter<>(this, android.R.layout.select_dialog_item, barcodeList);
|
||||
@@ -380,11 +370,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
});
|
||||
|
||||
generateIcon(storeFieldEdit.getText().toString());
|
||||
|
||||
if (!initDone) {
|
||||
hasChanged = false;
|
||||
initDone = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -425,17 +410,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
Intent i = new Intent(getApplicationContext(), BarcodeSelectorActivity.class);
|
||||
|
||||
String cardId = cardIdFieldView.getText().toString();
|
||||
if(cardId.length() > 0)
|
||||
{
|
||||
final Bundle b = new Bundle();
|
||||
b.putString("initialCardId", cardId);
|
||||
i.putExtras(b);
|
||||
}
|
||||
|
||||
startActivityForResult(i, SELECT_BARCODE_REQUEST);
|
||||
Utils.createSetBarcodeDialog(LoyaltyCardEditActivity.this, LoyaltyCardEditActivity.this, true, cardIdFieldView.getText().toString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -590,41 +565,12 @@ public class LoyaltyCardEditActivity extends AppCompatActivity
|
||||
{
|
||||
super.onActivityResult(requestCode, resultCode, intent);
|
||||
|
||||
String contents = null;
|
||||
String format = null;
|
||||
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent);
|
||||
|
||||
IntentResult result =
|
||||
IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
|
||||
if (result != null)
|
||||
{
|
||||
Log.i(TAG, "Received barcode information from capture");
|
||||
contents = result.getContents();
|
||||
format = result.getFormatName();
|
||||
}
|
||||
barcodeType = barcodeValues.format();
|
||||
cardId = barcodeValues.content();
|
||||
|
||||
if(requestCode == SELECT_BARCODE_REQUEST && resultCode == Activity.RESULT_OK)
|
||||
{
|
||||
Log.i(TAG, "Received barcode information from typing it");
|
||||
|
||||
contents = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_CONTENTS);
|
||||
format = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_FORMAT);
|
||||
}
|
||||
|
||||
if(contents != null && contents.isEmpty() == false &&
|
||||
format != null)
|
||||
{
|
||||
Log.i(TAG, "Read barcode id: " + contents);
|
||||
Log.i(TAG, "Read format: " + format);
|
||||
|
||||
TextView cardIdView = findViewById(R.id.cardIdView);
|
||||
cardIdView.setText(contents);
|
||||
|
||||
// Set special NO_BARCODE value to prevent onResume from overwriting it
|
||||
barcodeTypeField.setText(format.isEmpty() ? getString(R.string.noBarcode) : format);
|
||||
onResume();
|
||||
|
||||
hasChanged = true;
|
||||
}
|
||||
onResume();
|
||||
}
|
||||
|
||||
private void showBarcode() {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.SearchManager;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
@@ -7,41 +8,36 @@ import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Configuration;
|
||||
import android.database.Cursor;
|
||||
import android.os.Bundle;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.SearchView;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.util.Log;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.zxing.integration.android.IntentIntegrator;
|
||||
import com.google.zxing.integration.android.IntentResult;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import protect.card_locker.preferences.SettingsActivity;
|
||||
|
||||
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener
|
||||
{
|
||||
private static final String TAG = "Catima";
|
||||
private static final int MAIN_REQUEST_CODE = 1;
|
||||
|
||||
private Menu menu;
|
||||
private GestureDetector gestureDetector;
|
||||
@@ -145,18 +141,16 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O
|
||||
addButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Intent i = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
|
||||
startActivityForResult(i, MAIN_REQUEST_CODE);
|
||||
Utils.createSetBarcodeDialog(MainActivity.this, MainActivity.this, false, null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
|
||||
super.onActivityResult(requestCode, resultCode, intent);
|
||||
|
||||
if (requestCode == MAIN_REQUEST_CODE)
|
||||
{
|
||||
if (requestCode == Utils.MAIN_REQUEST) {
|
||||
// We're coming back from another view so clear the search
|
||||
// We only do this now to prevent a flash of all entries right after picking one
|
||||
filter = "";
|
||||
@@ -168,6 +162,19 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O
|
||||
|
||||
// In case the theme changed
|
||||
recreate();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent);
|
||||
|
||||
if(!barcodeValues.isEmpty()) {
|
||||
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
|
||||
Bundle newBundle = new Bundle();
|
||||
newBundle.putString("barcodeType", barcodeValues.format());
|
||||
newBundle.putString("cardId", barcodeValues.content());
|
||||
newIntent.putExtras(newBundle);
|
||||
startActivity(newIntent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,7 +260,7 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O
|
||||
|
||||
ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard, i);
|
||||
|
||||
startActivityForResult(i, MAIN_REQUEST_CODE);
|
||||
startActivityForResult(i, Utils.MAIN_REQUEST);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -376,129 +383,34 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O
|
||||
if (id == R.id.action_manage_groups)
|
||||
{
|
||||
Intent i = new Intent(getApplicationContext(), ManageGroupsActivity.class);
|
||||
startActivityForResult(i, MAIN_REQUEST_CODE);
|
||||
startActivityForResult(i, Utils.MAIN_REQUEST);
|
||||
return true;
|
||||
}
|
||||
|
||||
if(id == R.id.action_import_export)
|
||||
{
|
||||
Intent i = new Intent(getApplicationContext(), ImportExportActivity.class);
|
||||
startActivityForResult(i, MAIN_REQUEST_CODE);
|
||||
startActivityForResult(i, Utils.MAIN_REQUEST);
|
||||
return true;
|
||||
}
|
||||
|
||||
if(id == R.id.action_settings)
|
||||
{
|
||||
Intent i = new Intent(getApplicationContext(), SettingsActivity.class);
|
||||
startActivityForResult(i, MAIN_REQUEST_CODE);
|
||||
startActivityForResult(i, Utils.MAIN_REQUEST);
|
||||
return true;
|
||||
}
|
||||
|
||||
if(id == R.id.action_about)
|
||||
{
|
||||
displayAboutDialog();
|
||||
Intent i = new Intent(getApplicationContext(), AboutActivity.class);
|
||||
startActivityForResult(i, Utils.MAIN_REQUEST);
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void displayAboutDialog()
|
||||
{
|
||||
final Map<String, String> USED_LIBRARIES = new ImmutableMap.Builder<String, String>()
|
||||
.put("Commons CSV", "https://commons.apache.org/proper/commons-csv/")
|
||||
.put("Guava", "https://github.com/google/guava")
|
||||
.put("ZXing", "https://github.com/zxing/zxing")
|
||||
.put("ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded")
|
||||
.put("AppIntro", "https://github.com/apl-devs/AppIntro")
|
||||
.put("Color Picker", "https://github.com/jaredrummler/ColorPicker")
|
||||
.put("VNTNumberPickerPreference", "https://github.com/vanniktech/VNTNumberPickerPreference")
|
||||
.build();
|
||||
|
||||
final Map<String, String> USED_ASSETS = ImmutableMap.of
|
||||
(
|
||||
"Save by Bernar Novalyi", "https://thenounproject.com/term/save/716011"
|
||||
);
|
||||
|
||||
StringBuilder libs = new StringBuilder().append("<ul>");
|
||||
for (Map.Entry<String, String> entry : USED_LIBRARIES.entrySet())
|
||||
{
|
||||
libs.append("<li><a href=\"").append(entry.getValue()).append("\">").append(entry.getKey()).append("</a></li>");
|
||||
}
|
||||
libs.append("</ul>");
|
||||
|
||||
StringBuilder resources = new StringBuilder().append("<ul>");
|
||||
for (Map.Entry<String, String> entry : USED_ASSETS.entrySet())
|
||||
{
|
||||
resources.append("<li><a href=\"").append(entry.getValue()).append("\">").append(entry.getKey()).append("</a></li>");
|
||||
}
|
||||
resources.append("</ul>");
|
||||
|
||||
String appName = getString(R.string.app_name);
|
||||
int year = Calendar.getInstance().get(Calendar.YEAR);
|
||||
|
||||
String version = "?";
|
||||
try
|
||||
{
|
||||
PackageInfo pi = getPackageManager().getPackageInfo(getPackageName(), 0);
|
||||
version = pi.versionName;
|
||||
}
|
||||
catch (PackageManager.NameNotFoundException e)
|
||||
{
|
||||
Log.w(TAG, "Package name not found", e);
|
||||
}
|
||||
|
||||
WebView wv = new WebView(this);
|
||||
|
||||
// Set CSS for dark mode if dark mode
|
||||
String css = "";
|
||||
if(isDarkModeEnabled(this))
|
||||
{
|
||||
css = "<style>body {color:white; background-color:black;}</style>";
|
||||
}
|
||||
|
||||
String html =
|
||||
"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />" +
|
||||
css +
|
||||
"<h1>" +
|
||||
String.format(getString(R.string.about_title_fmt),
|
||||
"<a href=\"" + getString(R.string.app_webpage_url)) + "\">" +
|
||||
appName +
|
||||
"</a>" +
|
||||
"</h1><p>" +
|
||||
appName +
|
||||
" " +
|
||||
String.format(getString(R.string.debug_version_fmt), version) +
|
||||
"</p><p>" +
|
||||
String.format(getString(R.string.app_revision_fmt),
|
||||
"<a href=\"" + getString(R.string.app_revision_url) + "\">" +
|
||||
"GitHub" +
|
||||
"</a>") +
|
||||
"</p><hr/><p>" +
|
||||
String.format(getString(R.string.app_copyright_fmt), year) +
|
||||
"</p><p>" +
|
||||
getString(R.string.app_copyright_old) +
|
||||
"</p><hr/><p>" +
|
||||
getString(R.string.app_license) +
|
||||
"</p><hr/><p>" +
|
||||
String.format(getString(R.string.app_libraries), appName, libs.toString()) +
|
||||
"</p><hr/><p>" +
|
||||
String.format(getString(R.string.app_resources), appName, resources.toString());
|
||||
|
||||
wv.loadDataWithBaseURL("file:///android_res/drawable/", html, "text/html", "utf-8", null);
|
||||
new AlertDialog.Builder(this)
|
||||
.setView(wv)
|
||||
.setCancelable(true)
|
||||
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener()
|
||||
{
|
||||
public void onClick(DialogInterface dialog, int which)
|
||||
{
|
||||
dialog.dismiss();
|
||||
}
|
||||
})
|
||||
.show();
|
||||
}
|
||||
|
||||
protected static boolean isDarkModeEnabled(Context inputContext)
|
||||
{
|
||||
Configuration config = inputContext.getResources().getConfiguration();
|
||||
|
||||
@@ -15,6 +15,8 @@ import android.widget.TextView;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
@@ -112,12 +114,16 @@ public class ManageGroupsActivity extends AppCompatActivity
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
public void moveGroupUp(View view) {
|
||||
moveGroup(view, true);
|
||||
}
|
||||
|
||||
public void moveGroupDown(View view) {
|
||||
moveGroup(view, false);
|
||||
}
|
||||
|
||||
public void editGroup(View view) {
|
||||
LinearLayout parentRow = (LinearLayout) view.getParent();
|
||||
|
||||
TextView groupNameTextView = (TextView) parentRow.findViewById(R.id.name);
|
||||
|
||||
final String groupName = (String) groupNameTextView.getText();
|
||||
final String groupName = getGroupname(view);
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle(R.string.enter_group_name);
|
||||
@@ -131,8 +137,6 @@ public class ManageGroupsActivity extends AppCompatActivity
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
db.updateGroup(groupName, input.getText().toString());
|
||||
updateGroupList();
|
||||
// Rename may change ordering, so invalidate
|
||||
invalidateHomescreenActiveTab();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
|
||||
@@ -146,11 +150,7 @@ public class ManageGroupsActivity extends AppCompatActivity
|
||||
}
|
||||
|
||||
public void deleteGroup(View view) {
|
||||
LinearLayout parentRow = (LinearLayout) view.getParent();
|
||||
|
||||
TextView groupNameTextView = (TextView) parentRow.findViewById(R.id.name);
|
||||
|
||||
final String groupName = (String) groupNameTextView.getText();
|
||||
final String groupName = getGroupname(view);
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle(R.string.deleteConfirmationGroup);
|
||||
@@ -187,8 +187,6 @@ public class ManageGroupsActivity extends AppCompatActivity
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
db.insertGroup(input.getText().toString());
|
||||
updateGroupList();
|
||||
// Create may change ordering, so invalidate
|
||||
invalidateHomescreenActiveTab();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
|
||||
@@ -201,4 +199,56 @@ public class ManageGroupsActivity extends AppCompatActivity
|
||||
|
||||
return dialog;
|
||||
}
|
||||
|
||||
private String getGroupname(View view) {
|
||||
LinearLayout parentRow = (LinearLayout) view.getParent().getParent();
|
||||
TextView groupNameTextView = parentRow.findViewById(R.id.name);
|
||||
return (String) groupNameTextView.getText();
|
||||
}
|
||||
|
||||
private void moveGroup(View view, boolean up) {
|
||||
final String groupName = getGroupname(view);
|
||||
|
||||
List<Group> groups = db.getGroups();
|
||||
|
||||
int currentIndex = -1;
|
||||
Integer newIndex;
|
||||
|
||||
// Get current index in group list
|
||||
for (int i = 0; i < groups.size(); i++) {
|
||||
if (groups.get(i)._id.equals(groupName)) {
|
||||
currentIndex = i;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (currentIndex == -1) {
|
||||
throw new IndexOutOfBoundsException();
|
||||
}
|
||||
|
||||
// Reinsert group in correct position
|
||||
if (up) {
|
||||
newIndex = currentIndex - 1;
|
||||
} else {
|
||||
newIndex = currentIndex + 1;
|
||||
}
|
||||
|
||||
// Don't try to move out of bounds
|
||||
if (newIndex < 0 || newIndex >= groups.size()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Group group = groups.remove(currentIndex);
|
||||
groups.add(newIndex, group);
|
||||
|
||||
// Update database
|
||||
db.reorderGroups(groups);
|
||||
|
||||
// Update UI
|
||||
updateGroupList();
|
||||
|
||||
// Ordering may have changed, so invalidate
|
||||
invalidateHomescreenActiveTab();
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,31 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
||||
import com.google.zxing.integration.android.IntentIntegrator;
|
||||
import com.google.zxing.integration.android.IntentResult;
|
||||
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
|
||||
public class Utils {
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
// Barcode config dialog
|
||||
private static AlertDialog setBarcodeDialog;
|
||||
|
||||
// Activity request codes
|
||||
public static final int MAIN_REQUEST = 1;
|
||||
public static final int SELECT_BARCODE_REQUEST = 2;
|
||||
|
||||
static final double LUMINANCE_MIDPOINT = 0.5;
|
||||
|
||||
static public LetterBitmap generateIcon(Context context, String store, Integer backgroundColor) {
|
||||
@@ -27,4 +47,92 @@ public class Utils {
|
||||
static public boolean needsDarkForeground(Integer backgroundColor) {
|
||||
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
|
||||
}
|
||||
|
||||
static public void startCameraBarcodeScan(Context context, Activity activity) {
|
||||
IntentIntegrator integrator = new IntentIntegrator(activity);
|
||||
integrator.setDesiredBarcodeFormats(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES);
|
||||
|
||||
String prompt = context.getResources().getString(R.string.scanCardBarcode);
|
||||
integrator.setPrompt(prompt);
|
||||
integrator.setBeepEnabled(false);
|
||||
integrator.initiateScan();
|
||||
}
|
||||
|
||||
static public void createSetBarcodeDialog(final Context context, final Activity activity, boolean isUpdate, final String initialCardId) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
// Get the layout inflater
|
||||
LayoutInflater inflater = activity.getLayoutInflater();
|
||||
|
||||
// Inflate and set the layout for the dialog
|
||||
// Pass null as the parent view because its going in the dialog layout
|
||||
builder.setView(inflater.inflate(R.layout.dialog_create, null));
|
||||
|
||||
if (isUpdate) {
|
||||
builder.setTitle(context.getString(R.string.editCardTitle));
|
||||
} else {
|
||||
builder.setTitle(context.getString(R.string.addCardTitle));
|
||||
}
|
||||
|
||||
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
setBarcodeDialog.cancel();
|
||||
}
|
||||
});
|
||||
setBarcodeDialog = builder.create();
|
||||
setBarcodeDialog.show();
|
||||
|
||||
View addFromCamera = setBarcodeDialog.getWindow().findViewById(R.id.add_from_camera);
|
||||
View addManually = setBarcodeDialog.getWindow().findViewById(R.id.add_manually);
|
||||
|
||||
addFromCamera.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Utils.startCameraBarcodeScan(context, activity);
|
||||
|
||||
setBarcodeDialog.hide();
|
||||
}
|
||||
});
|
||||
|
||||
addManually.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Intent i = new Intent(context, BarcodeSelectorActivity.class);
|
||||
if (initialCardId != null) {
|
||||
final Bundle b = new Bundle();
|
||||
b.putString("initialCardId", initialCardId);
|
||||
i.putExtras(b);
|
||||
}
|
||||
activity.startActivityForResult(i, Utils.SELECT_BARCODE_REQUEST);
|
||||
|
||||
setBarcodeDialog.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static public BarcodeValues parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent) {
|
||||
String contents = null;
|
||||
String format = null;
|
||||
|
||||
IntentResult result =
|
||||
IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
|
||||
if (result != null)
|
||||
{
|
||||
Log.i(TAG, "Received barcode information from capture");
|
||||
contents = result.getContents();
|
||||
format = result.getFormatName();
|
||||
}
|
||||
|
||||
if(requestCode == Utils.SELECT_BARCODE_REQUEST && resultCode == Activity.RESULT_OK)
|
||||
{
|
||||
Log.i(TAG, "Received barcode information from typing it");
|
||||
|
||||
contents = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_CONTENTS);
|
||||
format = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_FORMAT);
|
||||
}
|
||||
|
||||
Log.i(TAG, "Read barcode id: " + contents);
|
||||
Log.i(TAG, "Read format: " + format);
|
||||
|
||||
return new BarcodeValues(format, contents);
|
||||
}
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 139 B |
BIN
app/src/main/res/drawable-hdpi/ic_baseline_arrow_drop_up_24.png
Normal file
|
After Width: | Height: | Size: 140 B |
BIN
app/src/main/res/drawable-hdpi/ic_camera_white.png
Normal file
|
After Width: | Height: | Size: 327 B |
|
After Width: | Height: | Size: 107 B |
BIN
app/src/main/res/drawable-mdpi/ic_baseline_arrow_drop_up_24.png
Normal file
|
After Width: | Height: | Size: 110 B |
BIN
app/src/main/res/drawable-mdpi/ic_camera_white.png
Normal file
|
After Width: | Height: | Size: 217 B |
|
After Width: | Height: | Size: 139 B |
BIN
app/src/main/res/drawable-xhdpi/ic_baseline_arrow_drop_up_24.png
Normal file
|
After Width: | Height: | Size: 147 B |
BIN
app/src/main/res/drawable-xhdpi/ic_camera_white.png
Normal file
|
After Width: | Height: | Size: 375 B |
|
After Width: | Height: | Size: 169 B |
|
After Width: | Height: | Size: 176 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_camera_white.png
Normal file
|
After Width: | Height: | Size: 523 B |
41
app/src/main/res/layout/about_activity.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context="protect.card_locker.MainActivity">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:theme="@style/AppTheme.AppBarOverlay">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="?attr/colorPrimary"
|
||||
app:popupTheme="@style/AppTheme.PopupOverlay"/>
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="?attr/actionBarSize"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/aboutText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:linksClickable="true"
|
||||
android:singleLine="false"
|
||||
android:focusable="true" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
47
app/src/main/res/layout/dialog_create.xml
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
<LinearLayout
|
||||
android:id="@+id/add_from_camera"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/inputPadding">
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_camera_white"
|
||||
app:tint="@color/iconColor"
|
||||
android:padding="@dimen/inputPadding" />
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/addWithCamera"
|
||||
android:padding="@dimen/inputPadding" />
|
||||
</LinearLayout>
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="@android:color/darker_gray"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/add_manually"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/inputPadding">
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_mode_edit_white_24dp"
|
||||
app:tint="@color/iconColor"
|
||||
android:padding="@dimen/inputPadding" />
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/addManually"
|
||||
android:padding="@dimen/inputPadding" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
@@ -2,7 +2,7 @@
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="horizontal"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical"
|
||||
@@ -11,58 +11,74 @@
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:layout_width="0dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/valueLayout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="visible">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="@dimen/storeNameTextSize"
|
||||
android:textStyle="bold"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
android:textSize="@dimen/storeNameTextSize"
|
||||
android:textStyle="bold"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cardCount"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:textSize="@dimen/noteTextSize"/>
|
||||
</LinearLayout>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/edit"
|
||||
android:layout_width="@dimen/cardThumbnailSize"
|
||||
android:layout_height="@dimen/cardThumbnailSize"
|
||||
android:layout_marginLeft="@dimen/activity_margin"
|
||||
android:src="@drawable/ic_mode_edit_white_24dp"
|
||||
android:contentDescription="@string/edit"
|
||||
app:tint="#000000"
|
||||
android:onClick="editGroup" />
|
||||
<LinearLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1">
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/delete"
|
||||
android:layout_width="@dimen/cardThumbnailSize"
|
||||
android:layout_height="@dimen/cardThumbnailSize"
|
||||
android:layout_marginLeft="@dimen/activity_margin"
|
||||
android:src="@drawable/ic_delete_white_24dp"
|
||||
android:contentDescription="@string/delete"
|
||||
app:tint="#000000"
|
||||
android:onClick="deleteGroup"/>
|
||||
<ImageButton
|
||||
android:id="@+id/moveUp"
|
||||
android:layout_width="@dimen/cardThumbnailSize"
|
||||
android:layout_height="@dimen/cardThumbnailSize"
|
||||
android:layout_weight="1"
|
||||
android:src="@drawable/ic_baseline_arrow_drop_up_24"
|
||||
android:contentDescription="@string/moveUp"
|
||||
app:tint="@color/iconColor"
|
||||
android:onClick="moveGroupUp"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/moveDown"
|
||||
android:layout_width="@dimen/cardThumbnailSize"
|
||||
android:layout_height="@dimen/cardThumbnailSize"
|
||||
android:layout_weight="1"
|
||||
android:src="@drawable/ic_baseline_arrow_drop_down_24"
|
||||
android:contentDescription="@string/moveDown"
|
||||
app:tint="@color/iconColor"
|
||||
android:onClick="moveGroupDown"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/edit"
|
||||
android:layout_width="@dimen/cardThumbnailSize"
|
||||
android:layout_height="@dimen/cardThumbnailSize"
|
||||
android:layout_weight="1"
|
||||
android:src="@drawable/ic_mode_edit_white_24dp"
|
||||
android:contentDescription="@string/edit"
|
||||
app:tint="@color/iconColor"
|
||||
android:onClick="editGroup" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/delete"
|
||||
android:layout_width="@dimen/cardThumbnailSize"
|
||||
android:layout_height="@dimen/cardThumbnailSize"
|
||||
android:layout_weight="1"
|
||||
android:src="@drawable/ic_delete_white_24dp"
|
||||
android:contentDescription="@string/delete"
|
||||
app:tint="@color/iconColor"
|
||||
android:onClick="deleteGroup"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -123,30 +123,22 @@
|
||||
<!-- Buttons -->
|
||||
<TableLayout android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:shrinkColumns="1"
|
||||
android:background="@color/inputContrastBackground">
|
||||
android:shrinkColumns="1">
|
||||
|
||||
<LinearLayout android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/inputBackground">
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout android:orientation="horizontal"
|
||||
android:padding="10.0dip"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/barcodeCaptureLayout">
|
||||
<Button android:id="@+id/captureButton"
|
||||
android:layout_margin="@dimen/inputMargin"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/capture"
|
||||
android:layout_weight="1.0"/>
|
||||
<Button android:id="@+id/enterButton"
|
||||
android:layout_margin="@dimen/inputMargin"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/enterCard"
|
||||
android:text="@string/editCard"
|
||||
android:layout_weight="1.0"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context="protect.card_locker.MainActivity">
|
||||
tools:context="protect.card_locker.ManageGroupsActivity">
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/fabAdd"
|
||||
|
||||
@@ -2,8 +2,10 @@
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="action_search">Suche</string>
|
||||
<string name="action_add">Neu</string>
|
||||
<string name="noGiftCards">Sie haben noch keine Kundenkarte angelegt. Über den \"+\"-Button oben rechts können welche angelegt werden.\n\nDiese App ermöglicht es, Kundenkarten immer mit zu führen.</string>
|
||||
<string name="noMatchingGiftCards">Es passen keine Kundenkarten zum Filter. Bitte probiere verschiedene Begriffe aus.</string>
|
||||
<string name="noGiftCards">Klicken Sie auf die Schaltfläche + (plus), um zuerst eine Karte hinzuzufügen.
|
||||
\n
|
||||
\nCatima trägt Ihre Karten auf dem Gerät, so dass sie immer in Reichweite sind.</string>
|
||||
<string name="noMatchingGiftCards">Nichts gefunden. Versuchen Sie, Ihre Suche zu ändern.</string>
|
||||
<string name="storeName">Geschäft</string>
|
||||
<string name="note">Notiz</string>
|
||||
<string name="cardId">Kartennummer</string>
|
||||
@@ -28,7 +30,7 @@
|
||||
<string name="addCardTitle">Neue Kundenkarte</string>
|
||||
<string name="scanCardBarcode">Strichcode scannen</string>
|
||||
<string name="cardShortcut">Shortcut zu einer Karte</string>
|
||||
<string name="noCardsMessage">Es ist noch keine Karte vorhanden, bitte zuerst eine hinzufügen</string>
|
||||
<string name="noCardsMessage">Fügen Sie zuerst eine Karte hinzu</string>
|
||||
<string name="barcodeImageDescription">Bild des Strichcodes</string>
|
||||
<string name="noStoreError">Kein Geschäft angegeben</string>
|
||||
<string name="noCardIdError">Keine Kartennummer angegeben</string>
|
||||
@@ -36,24 +38,24 @@
|
||||
<string name="cardIdFormat">%1$s: %2$s</string>
|
||||
<string name="importExport">Import/Export</string>
|
||||
<string name="exportName">Exportieren</string>
|
||||
<string name="importExportHelp">Gesicherte Daten ermöglichen das Verschieben der Kundenkarten auf ein anderes Gerät.</string>
|
||||
<string name="importSuccessfulTitle">Import erfolgreich</string>
|
||||
<string name="importExportHelp">Durch das Sichern Ihrer Karten können Sie sie auf ein anderes Gerät verschieben.</string>
|
||||
<string name="importSuccessfulTitle">Importiert</string>
|
||||
<string name="importFailedTitle">Import fehlgeschlagen</string>
|
||||
<string name="importFailed">Import fehlgeschlagen</string>
|
||||
<string name="exportSuccessfulTitle">Export erfolgreich</string>
|
||||
<string name="importFailed">Karten konnten nicht importiert werden</string>
|
||||
<string name="exportSuccessfulTitle">Exportiert</string>
|
||||
<string name="exportFailedTitle">Export fehlgeschlagen</string>
|
||||
<string name="exportFailed">Export fehlgeschlagen</string>
|
||||
<string name="exportFailed">Karten konnten nicht exportiert werden</string>
|
||||
<string name="importing">Importiere…</string>
|
||||
<string name="exporting">Exportiere…</string>
|
||||
<string name="noExternalStoragePermissionError">Ohne die Berechtigung für den externen Speicher kann kein Import oder Export erfolgen</string>
|
||||
<string name="noExternalStoragePermissionError">Erteilen Sie zuerst die Erlaubnis zur externen Speicherung, um Karten zu importieren oder zu exportieren</string>
|
||||
<string name="importOptionFilesystemTitle">Importiere aus Dateisystem</string>
|
||||
<string name="importOptionFilesystemExplanation">Wähle eine Datei aus dem Speicher aus.</string>
|
||||
<string name="importOptionFilesystemButton">Aus Dateisystem</string>
|
||||
<string name="importOptionApplicationTitle">Externe Anwendung verwenden</string>
|
||||
<string name="importOptionApplicationExplanation">Wählen Sie eine Datei aus einer App wie Dropbox, Google Drive, oder Ihrem bevorzugten Dateisystem aus.</string>
|
||||
<string name="importOptionApplicationButton">Nutze eine externe App</string>
|
||||
<string name="importOptionApplicationExplanation">Verwenden Sie eine beliebige Anwendung oder Ihren bevorzugten Dateiverwaltungsprogramm, um eine Datei zu öffnen.</string>
|
||||
<string name="importOptionApplicationButton">Externe Anwendung nutzen</string>
|
||||
<string name="about">Über</string>
|
||||
<string name="app_license">Lizensiert unter der GPLv3.</string>
|
||||
<string name="app_license">Freie Software, lizensiert unter der GPLv3+.</string>
|
||||
<string name="about_title_fmt">Über <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Informationen zu dieser Version: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
@@ -69,19 +71,19 @@
|
||||
<string name="storeNameColorDescription">Farbe für den Geschäftsnamen</string>
|
||||
<string name="settings">Einstellungen</string>
|
||||
<string name="settings_category_title_ui">Benutzeroberfläche</string>
|
||||
<string name="settings_card_title_list_font_size">Schriftgröße des Titels in der Listenansicht</string>
|
||||
<string name="settings_card_note_list_font_size">Schriftgröße der Notiz in der Listenansicht</string>
|
||||
<string name="settings_card_title_font_size">Schriftgröße des Titels</string>
|
||||
<string name="settings_card_title_list_font_size">Schriftgröße des Kartentitels (Listenmodus)</string>
|
||||
<string name="settings_card_note_list_font_size">Schriftgröße der Kartennotiz (Listenmodus)</string>
|
||||
<string name="settings_card_title_font_size">Schriftgröße des Kartentitels (Vorschau)</string>
|
||||
<string name="settings_card_id_font_size">Schriftgröße der Kartennummer</string>
|
||||
<string name="settings_card_note_font_size">Schriftgröße der Notiz</string>
|
||||
<string name="settings_card_note_font_size">Schriftgröße der Kartennotiz (Vorschau)</string>
|
||||
<string name="settings_display_barcode_max_brightness">Helligkeit bei Strichcode Ansicht erhöhen</string>
|
||||
<string name="settings_lock_barcode_orientation">Strichcodeausrichtung sperren</string>
|
||||
<string name="exportSuccessful">Kundenkartendaten erflogreich exportiert</string>
|
||||
<string name="importSuccessful">Kundenkartendaten erflogreich importiert</string>
|
||||
<string name="exportSuccessful">Kartendaten exportiert</string>
|
||||
<string name="importSuccessful">Kartendaten importiert</string>
|
||||
<string name="intent_import_card_from_url_share_text">Ich will eine Karte mit Ihnen teilen</string>
|
||||
<string name="settings_dark_theme">Dunkel</string>
|
||||
<string name="settings_light_theme">Hell</string>
|
||||
<string name="settings_system_theme">Systemvorgabe</string>
|
||||
<string name="settings_system_theme">System</string>
|
||||
<string name="settings_theme">Design</string>
|
||||
<string name="enterBarcodeInstructions">Geben Sie die Karten-ID ein und wählen Sie das Bild aus, das den Strichcode darstellt, den Sie verwenden möchten, oder wählen Sie „Diese Karte hat keinen Strichcode“, um keinen Strichcode zu verwenden.</string>
|
||||
<string name="app_copyright_old">Basiert auf Loyalty Card Keychain, Copyright 2016–2020 Branden Archer.</string>
|
||||
@@ -94,10 +96,13 @@
|
||||
<string name="starImage">Favoritenstern</string>
|
||||
<string name="deleteConfirmationGroup">Bitte bestätigen Sie, dass Sie diese Gruppe löschen möchten</string>
|
||||
<string name="all">Alle</string>
|
||||
<string name="groupCardCount"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> Karten</string>
|
||||
<string name="noGroups">Sie haben im Moment keine Gruppen. Klicken Sie auf die Schaltfläche + (Plus), um loszulegen.
|
||||
<string name="noGroups">Klicken Sie auf die Schaltfläche + (plus), um zuerst Gruppen hinzuzufügen.
|
||||
\n
|
||||
\nKarten können Gruppen zugewiesen werden, um sie leichter zu finden.</string>
|
||||
\nGruppen machen es einfacher, Dinge zu finden.</string>
|
||||
<string name="groups">Gruppen</string>
|
||||
<string name="enter_group_name">Geben Sie den Gruppennamen ein</string>
|
||||
</resources>
|
||||
<string name="leaveWithoutSaveConfirmation">Sind Sie sicher, dass Sie diesen Bildschirm verlassen wollen\? Vorgenommene Änderungen werden nicht gespeichert.</string>
|
||||
<string name="leaveWithoutSaveTitle">Beenden ohne zu speichern</string>
|
||||
<string name="failedOpeningFileManager">Fehler beim Öffnen eines Dateiverwaltungsprogrammes. Stellen Sie sicher, dass eine installiert ist.</string>
|
||||
<string name="noBarcode">Kein Strichcode</string>
|
||||
</resources>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<string name="cardShortcut">Raccourci de carte</string>
|
||||
<string name="noCardsMessage">Ajoutez d\'abord une carte</string>
|
||||
<string name="barcodeImageDescription">Image du code-barres</string>
|
||||
<string name="noStoreError">Aucun nom n\'a été saisi</string>
|
||||
<string name="noStoreError">Aucun nom de magasin saisi</string>
|
||||
<string name="noCardIdError">Aucun numéro de carte saisi</string>
|
||||
<string name="noCardExistsError">Aucune carte trouvée</string>
|
||||
<string name="cardIdFormat">%1$s: %2$s</string>
|
||||
@@ -51,10 +51,10 @@
|
||||
<string name="importOptionApplicationExplanation">Utilisez le gestionnaire de fichiers de votre choix pour importer un fichier.</string>
|
||||
<string name="importOptionApplicationButton">Utiliser une application externe</string>
|
||||
<string name="about">À propos</string>
|
||||
<string name="app_license">Gemenhetslig fri programvare, lisensiert GPLv3+.</string>
|
||||
<string name="app_license">Logiciel libre à copyleft, sous licence GPLv3+.</string>
|
||||
<string name="about_title_fmt">À propos de <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Version : <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Notes de version : <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"app_revision_url\">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Notes de version : <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> utilise les bibliothèques-tierces suivantes : <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> utilise les ressources-tierces suivantes : <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">Choisissez le code-barres</string>
|
||||
@@ -75,7 +75,7 @@
|
||||
<string name="settings_display_barcode_max_brightness">Augmenter la luminosité du code-barres</string>
|
||||
<string name="settings_lock_barcode_orientation">Verrouiller l\'orientation du code-barres</string>
|
||||
<string name="exportSuccessful">Carte exportée avec succès</string>
|
||||
<string name="importSuccessful">Données importées avec succès</string>
|
||||
<string name="importSuccessful">Carte de fidélité importée</string>
|
||||
<string name="intent_import_card_from_url_share_text">Je veux partager une carte avec toi</string>
|
||||
<string name="settings_dark_theme">Sombre</string>
|
||||
<string name="settings_light_theme">Clair</string>
|
||||
@@ -96,7 +96,6 @@
|
||||
<string name="starImage">Étoile favorite</string>
|
||||
<string name="deleteConfirmationGroup">Confirmez que vous voulez supprimer cette carte</string>
|
||||
<string name="all">Tous</string>
|
||||
<string name="groupCardCount"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> cartes</string>
|
||||
<string name="noGroups">Cliquez d\'abord sur le bouton \"+\" (plus) pour ajouter un groupe.
|
||||
\n
|
||||
\nLes groupes permettent de facilement retrouver vos cartes.</string>
|
||||
@@ -106,4 +105,12 @@
|
||||
<string name="leaveWithoutSaveConfirmation">Voulez-vous quitter la page \? Toutes vos modifications seront perdues.</string>
|
||||
<string name="leaveWithoutSaveTitle">Quitter sans enregistrer</string>
|
||||
<string name="failedOpeningFileManager">Gestionnaire de fichiers introuvable. Installez-en un si nécessaire.</string>
|
||||
<string name="addManually">Entrer manuellement l\'identifiant de la carte</string>
|
||||
<string name="addWithCamera">Scannez le code-barres avec votre appareil photo</string>
|
||||
<string name="moveDown">Descendre dans la liste</string>
|
||||
<string name="moveUp">Monter dans la liste</string>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="one"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> carte</item>
|
||||
<item quantity="other"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> cartes</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -94,10 +94,9 @@
|
||||
<string name="starImage">Stella preferita</string>
|
||||
<string name="deleteConfirmationGroup">Conferma di voler eliminare questo gruppo</string>
|
||||
<string name="all">Tutti</string>
|
||||
<string name="groupCardCount"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> carte</string>
|
||||
<string name="noGroups">Al momento non hai gruppi. Fai clic sul pulsante + (più) per iniziare.
|
||||
\n
|
||||
\nLe carte possono essere assegnate a gruppi per renderle più facili da trovare.</string>
|
||||
<string name="groups">Gruppi</string>
|
||||
<string name="enter_group_name">Inserisci il nome del gruppo</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
||||
@@ -55,8 +55,8 @@
|
||||
<string name="importOptionApplicationButton">Bruk eksternt program</string>
|
||||
<string name="about">Om</string>
|
||||
<string name="app_license">Gemenhetslig fri programvare, lisensiert GPLv3+.</string>
|
||||
<string name="about_title_fmt">Om <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"app_name\">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Versjon: <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"version\">%s</xliff:g></string>
|
||||
<string name="about_title_fmt">Om <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Versjon: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Utgivelsesinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> brukfer følgende tredjepartsbibliotek: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> bruker følgende tredjepartsressurser: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
@@ -94,7 +94,6 @@
|
||||
<string name="starImage">Favorittstjerne</string>
|
||||
<string name="unstar">Fjern fra favoritter</string>
|
||||
<string name="star">Legg til i favoritter</string>
|
||||
<string name="groupCardCount"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> kort</string>
|
||||
<string name="noGroups">Klikk på «+»-tegnet for å legge til grupper først.
|
||||
\n
|
||||
\nGrupper gjør ting enklere å finne.</string>
|
||||
@@ -106,4 +105,8 @@
|
||||
<string name="failedOpeningFileManager">Klarte ikke å åpne noen filbehandler. Forsikre deg om at du har installert en.</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Er du sikker på at du vil forlate denne skjermen\? Endringer vil ikke bli lagret.</string>
|
||||
<string name="leaveWithoutSaveTitle">Forlat uten å lagre</string>
|
||||
</resources>
|
||||
<string name="addManually">Skriv inn kort-ID manuelt</string>
|
||||
<string name="addWithCamera">Skann strekkoden med kameraet ditt</string>
|
||||
<string name="moveDown">Flytt nedover i listen</string>
|
||||
<string name="moveUp">Flytt oppover i listen</string>
|
||||
</resources>
|
||||
|
||||
@@ -15,4 +15,6 @@
|
||||
<color name="inputBackground">#000000</color>
|
||||
<color name="inputBorder">#222222</color>
|
||||
<color name="inputDividerBorder">#666666</color>
|
||||
|
||||
<color name="iconColor">#ffffff</color>
|
||||
</resources>
|
||||
@@ -2,8 +2,10 @@
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="action_search">Zoeken</string>
|
||||
<string name="action_add">Toevoegen</string>
|
||||
<string name="noGiftCards">Je hebt nog geen klantenkaarten toegevoegd. Druk op de knop \'+\' (plus) om te beginnen.\n\nMet Klantenkaartkluis beheer je je klantenkaarten op je smartphone of tablet zodat ze altijd binnen handbereik zijn.</string>
|
||||
<string name="noMatchingGiftCards">Geen kaarten komen overeen met het filter. Probeer alsjeblieft wat andere termen.</string>
|
||||
<string name="noGiftCards">Druk op de knop \'+\' (plus) om een kaart toe te voegen.
|
||||
\n
|
||||
\nMet Catima heb je je klantenkaarten altijd binnen handbereik, gewoon op je apparaat.</string>
|
||||
<string name="noMatchingGiftCards">Geen zoekresultaten. Probeer een andere zoekopdracht.</string>
|
||||
<string name="storeName">Winkel</string>
|
||||
<string name="note">Aantekening</string>
|
||||
<string name="cardId">Kaartnummer</string>
|
||||
@@ -26,45 +28,45 @@
|
||||
<string name="share">Delen</string>
|
||||
<string name="sendLabel">Versturen…</string>
|
||||
<string name="addedShortcut">Snelkoppeling is toegevoegd</string>
|
||||
<string name="editCardTitle">Klantenkaart bewerken</string>
|
||||
<string name="addCardTitle">Klantenkaart toevoegen</string>
|
||||
<string name="editCardTitle">Kaart bewerken</string>
|
||||
<string name="addCardTitle">Kaart toevoegen</string>
|
||||
<string name="scanCardBarcode">Scan de barcode van de kaart</string>
|
||||
<string name="cardShortcut">Kaartsnelkoppeling</string>
|
||||
<string name="noCardsMessage">Je hebt nog geen kaarten toegevoegd.</string>
|
||||
<string name="noCardsMessage">Voeg eerst een kaart toe</string>
|
||||
<string name="barcodeImageDescription">Afbeelding van barcode</string>
|
||||
<string name="noStoreError">Geen winkelnaam ingevoerd</string>
|
||||
<string name="noCardIdError">Geen kaartnummer ingevoerd</string>
|
||||
<string name="noCardExistsError">De klantenkaart kan niet worden opgevraagd</string>
|
||||
<string name="noCardExistsError">De kaart is niet aangetroffen</string>
|
||||
<string name="failedParsingImportUriError">Kan de import-uri niet verwerken</string>
|
||||
<string name="cardIdFormat">%1$s: %2$s</string>
|
||||
<string name="importExport">Importeren/Exporteren</string>
|
||||
<string name="exportName">Exporteren</string>
|
||||
<string name="importExportHelp">Door de gegevens te back-uppen kun je je kaarten overzetten naar een ander apparaat.</string>
|
||||
<string name="importExportHelp">Door je kaarten te back-uppen, kun je ze overzetten naar een ander apparaat.</string>
|
||||
<string name="importSuccessfulTitle">Importeren voltooid</string>
|
||||
<string name="importFailedTitle">Importeren mislukt</string>
|
||||
<string name="importFailed">Het importeren is mislukt</string>
|
||||
<string name="exportSuccessfulTitle">Exporteren voltooid</string>
|
||||
<string name="exportFailedTitle">Exporteren mislukt</string>
|
||||
<string name="exportFailed">Het exporteren is mislukt</string>
|
||||
<string name="importing">Bezig met importeren…...</string>
|
||||
<string name="exporting">Bezig met exporteren…...</string>
|
||||
<string name="noExternalStoragePermissionError">Het importeren of exporteren van kaarten is niet mogelijk zonder de machtiging \'externe opslag\'.</string>
|
||||
<string name="importing">Bezig met importeren…</string>
|
||||
<string name="exporting">Bezig met exporteren…</string>
|
||||
<string name="noExternalStoragePermissionError">Verleen het recht \'externe opslag\' om kaarten te kunnen im- of exporteren</string>
|
||||
<string name="exportOptionExplanation">De gegevens worden weggeschreven op een locatie naar keuze.</string>
|
||||
<string name="importOptionFilesystemTitle">Importeren uit bestandssysteem</string>
|
||||
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand uit het bestandssysteem.</string>
|
||||
<string name="importOptionFilesystemButton">Uit bestandssysteem</string>
|
||||
<string name="importOptionApplicationTitle">Externe toepassing gebruiken</string>
|
||||
<string name="importOptionApplicationExplanation">Open een bestand middels een externe app, zoals Dropbox, Google Drive of je favoriete bestandsbeheerder.</string>
|
||||
<string name="importOptionFilesystemExplanation">Kies een specifiek bestand vanop het bestandssysteem.</string>
|
||||
<string name="importOptionFilesystemButton">Van bestandssysteem</string>
|
||||
<string name="importOptionApplicationTitle">Externe app gebruiken</string>
|
||||
<string name="importOptionApplicationExplanation">Open een bestand middels een app of je favoriete bestandsbeheerder.</string>
|
||||
<string name="importOptionApplicationButton">Externe app gebruiken</string>
|
||||
<string name="about">Over</string>
|
||||
<string name="app_license">Uitgebracht onder de GPLv3-licentie.</string>
|
||||
<string name="app_license">Vrije software, uitgebracht onder de GPLv3-licentie.</string>
|
||||
<string name="about_title_fmt">Over <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Versie: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Versie-informatie: <xliff:g id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> gebruikt de volgende bibliotheken van externe partijen: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> gebruikt de volgende bronnen van externe partijen: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">Barcode toevoegen</string>
|
||||
<string name="enterBarcodeInstructions">Voer de barcode in en kies daarna de afbeelding van de barcode die je wilt gebruiken., of druk op “Deze kaart heeft geen barcode” om geen barcode te gebruiken.</string>
|
||||
<string name="enterBarcodeInstructions">Voer de barcode in en kies daarna de afbeelding van de barcode die je wilt gebruiken of druk op “Deze kaart heeft geen barcode” om geen barcode te gebruiken.</string>
|
||||
<string name="copy_to_clipboard_toast">Kaartnummer is gekopieerd naar het klembord</string>
|
||||
<string name="thumbnailDescription">Miniatuurvoorbeeld van kaart</string>
|
||||
<string name="change">Aanpassen</string>
|
||||
@@ -73,31 +75,42 @@
|
||||
<string name="storeNameBackgroundColorDescription">Achtergrondkleur van winkeltekst</string>
|
||||
<string name="storeNameColorDescription">Kleur van winkeltekst</string>
|
||||
<string name="settings">Instellingen</string>
|
||||
<string name="settings_category_title_ui">Uiterlijk en bediening</string>
|
||||
<string name="settings_category_title_ui">Vormgeving</string>
|
||||
<string name="settings_theme">Thema</string>
|
||||
<string name="settings_system_theme">Systeemthema</string>
|
||||
<string name="settings_system_theme">Systeem</string>
|
||||
<string name="settings_light_theme">Licht</string>
|
||||
<string name="settings_dark_theme">Donker</string>
|
||||
<string name="settings_card_title_list_font_size">Lettergrootte van kaartnamen op de lijst</string>
|
||||
<string name="settings_card_note_list_font_size">Lettergrootte van aantekeningen op de lijst</string>
|
||||
<string name="settings_card_title_font_size">Lettergrootte van kaartnamen</string>
|
||||
<string name="settings_card_title_list_font_size">Lettergrootte van kaartnamen (lijstmodus)</string>
|
||||
<string name="settings_card_note_list_font_size">Lettergrootte van aantekeningen (lijstmodus)</string>
|
||||
<string name="settings_card_title_font_size">Lettergrootte van kaartnamen (voorvertoning)</string>
|
||||
<string name="settings_card_id_font_size">Lettergrootte van kaartnummer</string>
|
||||
<string name="settings_card_note_font_size">Lettergrootte van aantekeningen</string>
|
||||
<string name="settings_card_note_font_size">Lettergrootte van aantekeningen (voorvertoning)</string>
|
||||
<string name="settings_display_barcode_max_brightness">Scherm helderder maken bij tonen van barcode</string>
|
||||
<string name="settings_lock_barcode_orientation">Barcode-oriëntatie vergrendelen</string>
|
||||
<string name="intent_import_card_from_url_share_text">Ik wil een klantenkaart met je delen</string>
|
||||
<string name="all">Alles</string>
|
||||
<string name="importSuccessful">De import van klantenkaartgegevens was succesvol</string>
|
||||
<string name="deleteConfirmationGroup">Bevestig dat u deze groep wilt verwijderen</string>
|
||||
<string name="groupCardCount"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> kaart</string>
|
||||
<string name="noGroups">Je hebt geen groepen op dit moment. Klik op de + (plus) knop om te beginnen.
|
||||
<string name="importSuccessful">De kaartgegevens zijn geïmporteerd</string>
|
||||
<string name="deleteConfirmationGroup">Bevestig dat je deze groep wilt verwijderen</string>
|
||||
<string name="noGroups">Druk op de knop \'+\' (plus) om een groep toe te voegen.
|
||||
\n
|
||||
\nKaarten kunnen worden toegewezen aan groepen om ze gemakkelijker te vinden.</string>
|
||||
<string name="exportSuccessful">De export van klantenkaartgegevens was succesvol</string>
|
||||
<string name="groups">Groep</string>
|
||||
<string name="enter_group_name">Voer groepsnaam in</string>
|
||||
\nDoor kaarten te groeperen vind je ze makkelijker terug.</string>
|
||||
<string name="exportSuccessful">De kaartgegevens zijn geëxporteerd</string>
|
||||
<string name="groups">Groepen</string>
|
||||
<string name="enter_group_name">Voer een groepsnaam in</string>
|
||||
<string name="starImage">Favoriete ster</string>
|
||||
<string name="app_copyright_old">Gebaseerd op Loyalty Card Keychain, copyright 2016–2020 Branden Archer.</string>
|
||||
<string name="unstar">Verwijder uit favorieten</string>
|
||||
<string name="unstar">Verwijderen uit favorieten</string>
|
||||
<string name="star">Toevoegen aan favorieten</string>
|
||||
<string name="addManually">Kaartnummer handmatig invoeren</string>
|
||||
<string name="addWithCamera">Barcode scannen met camera</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Weet je zeker dat je dit wilt\? Hierdoor worden je aanpassingen niet opgeslagen.</string>
|
||||
<string name="leaveWithoutSaveTitle">Afbreken zonder opslaan</string>
|
||||
<string name="moveDown">Omlaag verplaatsen</string>
|
||||
<string name="moveUp">Omhoog verplaatsen</string>
|
||||
<string name="failedOpeningFileManager">Kan de bestandsbeheerder niet openen - zorg dat je er een hebt geïnstalleerd.</string>
|
||||
<string name="noBarcode">Geen barcode</string>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="one"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> kaart</item>
|
||||
<item quantity="other"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> kaarten</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -57,7 +57,7 @@
|
||||
<string name="app_license">Wolne oprogramowanie copylefted, licencjonowane GPLv3 +.</string>
|
||||
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Wersja: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Info o wydaniu: <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"app_revision_url\">%s</xliff:g></string>
|
||||
<string name="app_revision_fmt">Info o wydaniu: <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" id="app_revision_url">%s</xliff:g></string>
|
||||
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> wykorzystuje następujące biblioteki osób trzecich: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> wykorzystuje następujące zasoby osób trzecich: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">Wybierz kod kreskowy</string>
|
||||
@@ -83,7 +83,6 @@
|
||||
<string name="settings_display_barcode_max_brightness">Rozjaśnij widok kodu kreskowego</string>
|
||||
<string name="settings_lock_barcode_orientation">Zablokuj autoobracanie kodów kreskowych</string>
|
||||
<string name="intent_import_card_from_url_share_text">Chcę udostępnić Ci kartę lojalnościową</string>
|
||||
<string name="groupCardCount"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> karty</string>
|
||||
<string name="deleteConfirmationGroup">Potwierdź, że chcesz usunąć tę grupę</string>
|
||||
<string name="all">Wszystko</string>
|
||||
<string name="noGroups">Kliknij przycisk + (plus), aby najpierw dodać grupy.
|
||||
@@ -101,4 +100,4 @@
|
||||
<string name="star">Dodaj do ulubionych</string>
|
||||
<string name="noBarcode">Brak kodu kreskowego</string>
|
||||
<string name="barcodeType">Typ kodu kreskowego</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
||||
@@ -90,17 +90,19 @@
|
||||
<string name="intent_import_card_from_url_share_text">Я хочу поделиться картой с вами</string>
|
||||
<string name="exportSuccessful">Данные карты экспортированы</string>
|
||||
<string name="all">Все</string>
|
||||
<string name="groupCardCount"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">%d</xliff:g> карт</string>
|
||||
<string name="noGroups">Нажмите кнопку + (плюс), чтобы сначала добавить группы.
|
||||
\n
|
||||
\nГруппы упрощают поиск.</string>
|
||||
<string name="groups">Группы</string>
|
||||
<string name="enter_group_name">Введите название группы</string>
|
||||
<string name="importSuccessful">Данные карты импортированы</string>
|
||||
<string name="importSuccessful">Данные карты лояльности успешно импортированы</string>
|
||||
<string name="starImage">Любимая звезда</string>
|
||||
<string name="app_copyright_old">На основе Loyalty Card Keychain, авторские права 2016–2020 Branden Archer.</string>
|
||||
<string name="unstar">Удалить из избранного</string>
|
||||
<string name="star">Добавить в избранное</string>
|
||||
<string name="noBarcode">Нет штрих-кода</string>
|
||||
<string name="deleteConfirmationGroup">Подтвердите, что хотите удалить эту группу</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Вы уверены, что хотите покинуть этот экран\? Изменения не будут сохранены.</string>
|
||||
<string name="leaveWithoutSaveTitle">Выйти без сохранения</string>
|
||||
<string name="failedOpeningFileManager">Не удалось открыть файловый менеджер. Пожалуйста, убедитись, что он установлен.</string>
|
||||
</resources>
|
||||
@@ -1,4 +0,0 @@
|
||||
<resources
|
||||
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
|
||||
</resources>
|
||||
@@ -14,4 +14,6 @@
|
||||
<color name="inputBackground">#FFFFFF</color>
|
||||
<color name="inputBorder">#DDDDDD</color>
|
||||
<color name="inputDividerBorder">#AAAAAA</color>
|
||||
|
||||
<color name="iconColor">#000000</color>
|
||||
</resources>
|
||||
@@ -130,10 +130,18 @@
|
||||
<string name="enter_group_name">Enter group name</string>
|
||||
<string name="groups">Groups</string>
|
||||
<string name="noGroups">Click the "+" (plus) button to add groups first.\n\nGroups make things easier to find.</string>
|
||||
<string name="groupCardCount"><xliff:g>%d</xliff:g> cards</string>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> card</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> cards</item>
|
||||
</plurals>
|
||||
|
||||
<string name="all">All</string>
|
||||
<string name="deleteConfirmationGroup">Please confirm you want to delete this group</string>
|
||||
<string name="failedOpeningFileManager">Failed opening a file manager. Please make sure one is installed.</string>
|
||||
<string name="moveUp">Move up in list</string>
|
||||
<string name="moveDown">Move down in list</string>
|
||||
<string name="leaveWithoutSaveTitle">Leave without saving</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Are you sure you want to leave this screen? Changed made will not be saved.</string>
|
||||
<string name="addWithCamera">Scan the barcode with your camera</string>
|
||||
<string name="addManually">Manually enter card ID</string>
|
||||
</resources>
|
||||
|
||||
@@ -29,5 +29,4 @@
|
||||
<item name="android:padding">@dimen/no_data_padding</item>
|
||||
<item name="android:textSize">@dimen/no_data_textSize</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -202,7 +202,7 @@ public class ImportExportTest
|
||||
private void checkGroups()
|
||||
{
|
||||
Cursor cursor = db.getGroupCursor();
|
||||
int index = 1;
|
||||
int index = db.getGroupCount();
|
||||
|
||||
while(cursor.moveToNext())
|
||||
{
|
||||
@@ -212,7 +212,7 @@ public class ImportExportTest
|
||||
|
||||
assertEquals(expectedGroupName, group._id);
|
||||
|
||||
index++;
|
||||
index--;
|
||||
}
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import static org.junit.Assert.assertTrue;
|
||||
import static org.robolectric.Shadows.shadowOf;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.ActivityInfo;
|
||||
@@ -38,6 +39,7 @@ import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.android.controller.ActivityController;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadows.ShadowActivity;
|
||||
import org.robolectric.shadows.ShadowDialog;
|
||||
import org.robolectric.shadows.ShadowLog;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@@ -145,11 +147,15 @@ public class LoyaltyCardViewActivityTest
|
||||
* Initiate and complete a barcode capture, either in success
|
||||
* or in failure
|
||||
*/
|
||||
private void captureBarcodeWithResult(final Activity activity, final int buttonId, final boolean success) throws IOException
|
||||
private void captureBarcodeWithResult(final Activity activity, final boolean success) throws IOException
|
||||
{
|
||||
// Start image capture
|
||||
final Button captureButton = activity.findViewById(buttonId);
|
||||
captureButton.performClick();
|
||||
final Button startButton = activity.findViewById(R.id.enterButton);
|
||||
startButton.performClick();
|
||||
|
||||
Dialog dialog = ShadowDialog.getLatestDialog();
|
||||
ShadowDialog shadowDialog = shadowOf(dialog);
|
||||
shadowDialog.clickOn(R.id.add_from_camera);
|
||||
|
||||
ShadowActivity.IntentForResult intentForResult = shadowOf(activity).peekNextStartedActivityForResult();
|
||||
assertNotNull(intentForResult);
|
||||
@@ -181,11 +187,15 @@ public class LoyaltyCardViewActivityTest
|
||||
* Initiate and complete a barcode selection, either in success
|
||||
* or in failure
|
||||
*/
|
||||
private void selectBarcodeWithResult(final Activity activity, final int buttonId, final String barcodeData, final String barcodeType, final boolean success) throws IOException
|
||||
private void selectBarcodeWithResult(final Activity activity, final String barcodeData, final String barcodeType, final boolean success) throws IOException
|
||||
{
|
||||
// Start image capture
|
||||
final Button captureButton = activity.findViewById(buttonId);
|
||||
captureButton.performClick();
|
||||
// Start barcode selector
|
||||
final Button startButton = activity.findViewById(R.id.enterButton);
|
||||
startButton.performClick();
|
||||
|
||||
Dialog dialog = ShadowDialog.getLatestDialog();
|
||||
ShadowDialog shadowDialog = shadowOf(dialog);
|
||||
shadowDialog.clickOn(R.id.add_manually);
|
||||
|
||||
ShadowActivity.IntentForResult intentForResult = shadowOf(activity).peekNextStartedActivityForResult();
|
||||
assertNotNull(intentForResult);
|
||||
@@ -231,8 +241,6 @@ public class LoyaltyCardViewActivityTest
|
||||
}
|
||||
else
|
||||
{
|
||||
int captureVisibility = (mode == ViewMode.UPDATE_CARD || mode == ViewMode.ADD_CARD) ? View.VISIBLE : View.GONE;
|
||||
|
||||
int editVisibility = View.VISIBLE;
|
||||
|
||||
checkFieldProperties(activity, R.id.storeNameEdit, editVisibility, store);
|
||||
@@ -240,7 +248,6 @@ public class LoyaltyCardViewActivityTest
|
||||
checkFieldProperties(activity, R.id.cardAndBarcodeLayout, cardId.isEmpty() ? View.GONE : View.VISIBLE, null);
|
||||
checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId);
|
||||
checkFieldProperties(activity, R.id.barcodeTypeField, View.VISIBLE, barcodeType);
|
||||
checkFieldProperties(activity, R.id.captureButton, captureVisibility, null);
|
||||
checkFieldProperties(activity, R.id.barcode, View.VISIBLE, null);
|
||||
}
|
||||
}
|
||||
@@ -318,7 +325,7 @@ public class LoyaltyCardViewActivityTest
|
||||
checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
|
||||
|
||||
// Complete barcode capture successfully
|
||||
captureBarcodeWithResult(activity, R.id.captureButton, true);
|
||||
captureBarcodeWithResult(activity, true);
|
||||
|
||||
checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA, BARCODE_TYPE);
|
||||
|
||||
@@ -339,7 +346,7 @@ public class LoyaltyCardViewActivityTest
|
||||
checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
|
||||
|
||||
// Complete barcode capture in failure
|
||||
captureBarcodeWithResult(activity, R.id.captureButton, false);
|
||||
captureBarcodeWithResult(activity, false);
|
||||
|
||||
checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
|
||||
}
|
||||
@@ -357,7 +364,7 @@ public class LoyaltyCardViewActivityTest
|
||||
checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
|
||||
|
||||
// Complete barcode capture successfully
|
||||
captureBarcodeWithResult(activity, R.id.captureButton, true);
|
||||
captureBarcodeWithResult(activity, true);
|
||||
|
||||
checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA, BARCODE_TYPE);
|
||||
|
||||
@@ -449,7 +456,7 @@ public class LoyaltyCardViewActivityTest
|
||||
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE);
|
||||
|
||||
// Complete barcode capture successfully
|
||||
captureBarcodeWithResult(activity, R.id.captureButton, true);
|
||||
captureBarcodeWithResult(activity, true);
|
||||
|
||||
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
|
||||
}
|
||||
@@ -470,7 +477,7 @@ public class LoyaltyCardViewActivityTest
|
||||
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE);
|
||||
|
||||
// Complete barcode capture successfully
|
||||
captureBarcodeWithResult(activity, R.id.captureButton, true);
|
||||
captureBarcodeWithResult(activity, true);
|
||||
|
||||
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
|
||||
|
||||
@@ -620,7 +627,7 @@ public class LoyaltyCardViewActivityTest
|
||||
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
|
||||
|
||||
// Complete empty barcode selection successfully
|
||||
selectBarcodeWithResult(activity, R.id.enterButton, BARCODE_DATA, "", true);
|
||||
selectBarcodeWithResult(activity, BARCODE_DATA, "", true);
|
||||
|
||||
// Check if the barcode type is NO_BARCODE as expected
|
||||
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, activity.getApplicationContext().getString(R.string.noBarcode));
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
@@ -20,6 +21,8 @@ import org.robolectric.Robolectric;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.android.controller.ActivityController;
|
||||
import org.robolectric.shadows.ShadowAlertDialog;
|
||||
import org.robolectric.shadows.ShadowDialog;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -70,16 +73,16 @@ public class MainActivityTest
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clickAddLaunchesLoyaltyCardEditActivity()
|
||||
public void clickAddLaunchesAddDialog()
|
||||
{
|
||||
final MainActivity activity = Robolectric.setupActivity(MainActivity.class);
|
||||
|
||||
activity.findViewById(R.id.fabAdd).performClick();
|
||||
|
||||
Intent intent = shadowOf(activity).peekNextStartedActivityForResult().intent;
|
||||
Dialog dialog = ShadowDialog.getLatestDialog();
|
||||
ShadowDialog shadowDialog = shadowOf(dialog);
|
||||
|
||||
assertEquals(new ComponentName(activity, LoyaltyCardEditActivity.class), intent.getComponent());
|
||||
assertNull(intent.getExtras());
|
||||
assertEquals("Add Card", shadowDialog.getTitle());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -190,14 +193,14 @@ public class MainActivityTest
|
||||
assertEquals("All", groupTabs.getTabAt(0).getText().toString());
|
||||
assertEquals("One", groupTabs.getTabAt(1).getText().toString());
|
||||
|
||||
// Adding another group should have them sorted alphabetically
|
||||
// Adding another group should have it added to the end
|
||||
db.insertGroup("Alphabetical two");
|
||||
activityController.pause();
|
||||
activityController.resume();
|
||||
assertEquals(3, groupTabs.getTabCount());
|
||||
assertEquals("All", groupTabs.getTabAt(0).getText().toString());
|
||||
assertEquals("Alphabetical two", groupTabs.getTabAt(1).getText().toString());
|
||||
assertEquals("One", groupTabs.getTabAt(2).getText().toString());
|
||||
assertEquals("One", groupTabs.getTabAt(1).getText().toString());
|
||||
assertEquals("Alphabetical two", groupTabs.getTabAt(2).getText().toString());
|
||||
|
||||
// Removing a group should also change the list
|
||||
db.deleteGroup("Alphabetical two");
|
||||
|
||||
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 106 KiB |
BIN
docs/migrate/protect_card_locker/step_11.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 66 KiB |
@@ -1,7 +1,7 @@
|
||||
En avez-vous marre de chercher votre carte de fidélité en plastique lors de votre commande au magasin ? Vous recherchez une solution gratuite qui ne prendra pas vos informations ?
|
||||
Vous en avez assez de chercher votre carte de fidélité en plastique à la caisse ? Vous cherchez une solution gratuite qui respecte vos données ?
|
||||
|
||||
Catima est une application qui stockera vos cartes de fidélité basées sur des codes-barres sur votre téléphone. Le code de l'application est ouvert et essaye de bien faire une chose : gérer vos cartes !
|
||||
Catima est une application qui stocke toutes vos cartes de fidélité à code-barres dans votre téléphone. L'application ne fera qu'une chose : gérer vos cartes du mieux qu'elle peut. Son code est ouvert, vous pouvez donc le vérifier par vous-même !
|
||||
|
||||
De nouvelles cartes peuvent être ajoutées en un clin d'œil. Utilisez votre appareil photo pour capturer le code-barres ou saisissez le numéro. Lorsque le code-barres est chargé dans le magasin et affiché, il peut être scanné avec un lecteur de codes-barres moderne. (Certains magasins utilisent des lecteurs de codes-barres plus anciens, tels que des scanneurs à plat, au lieu de scanneurs d'images. Ceux-ci ne peuvent pas lire l'écran du téléphone. À la place, demandez au vendeur de saisir le numéro manuellement).
|
||||
De nouvelles cartes peuvent être ajoutées en un clin d'œil. Vous pouvez soit photographier le code-barres, soit saisir le numéro manuellement. Lorsqu vous chargez une carte en caisse, son code-barres est affiché, ce qui permet au vendeur de le scanner avec n'importe quel lecteur moderne. (Certains magasins utilisent des lecteurs plus anciens, tels que des scanners à plat. Ceux-ci ne peuvent pas lire l'écran du téléphone. Le vendeur devra donc saisir le numéro manuellement).
|
||||
|
||||
L'application nécessite très peu d'autorisations et ne tente jamais d'accéder à Internet. Il existe une option pour sauvegarder vos cartes sur le stockage local. De là, vous pouvez envoyer la sauvegarde dans un endroit sûr.
|
||||
L'application ne nécessite que très peu d'autorisations et ne tente jamais d'accéder à Internet. Il existe une fonction d'import/export de vos cartes. Celà vous permettra de les sauvegarder dans un endroit sûr.
|
||||
|
||||
7
fastlane/metadata/android/nl/full_description.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Ben jij het ook zo zat om tijdens het afrekenen steeds weer te moeten graaien naar je plastic klantenkaart? Heb je niet liever een gratis, digitaal alternatief dat veilig omgaat met je gegevens?
|
||||
|
||||
Dan is Catima wat voor jou! Met deze app kun je je op barcode gebaseerde klantenkaarten opslaan op je telefoon. De app is open source en heeft maar één doel: het beheren en organiseren van je kaarten!
|
||||
|
||||
Je voegt nieuwe kaarten in een handomdraai toe, met je camera of door het nummer ervan in te voeren. In de winkel hoef je vervolgens alleen maar de kaart te openen zodat deze kan worden gescand door elke moderne barcodescanner. (Sommige winkels gebruiken nog ouderwetse barcodescanners, zoals flatbedscanners, welke je scherm niet kunnen aflezen. In dat geval moet de kassamedewerker het nummer handmatig invoeren.).
|
||||
|
||||
Catima vereist nauwelijks rechten en maakt geen contact met het internet. Je kunt je kaarten back-uppen naar je lokale opslag en de back-up vervolgens overzetten naar een veilig opslagmedium.
|
||||
1
fastlane/metadata/android/nl/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Organiseer je op barcodes gebaseerde klantenkaarten op je telefoon
|
||||
1
fastlane/metadata/android/nl/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Catima - Klantenkaartbeheerder
|
||||