Compare commits

..

67 Commits
v0.10 ... v0.12

Author SHA1 Message Date
Branden Archer
ecd2ecd517 Merge pull request #127 from brarcher/pre-v0.12
Update for v0.12
2017-07-12 22:55:31 -04:00
Branden Archer
f3e7d8f5c1 Update for v0.12 2017-07-12 22:47:29 -04:00
Branden Archer
f4522fb17d Merge pull request #126 from brarcher/scale-barcode
Scale barcode height to match reduced width
2017-07-12 22:14:03 -04:00
Branden Archer
824a72b156 Scale height of barcode to match ratio when reducing width
When reducing the pixel size of the width, if the height is not
scaled to match then 1D barcodes end up being squished and are
too narrow to scan. To avoid this, scale the height to match.
Then, when the barcode is loaded into a Bitmap it will scale up
to the correct size.

It was found that on a Galaxy S4 a barcode width of 400 px started
to see some blurriness, but 500 px still looked sharp. Reducing
the maximum width to 500 px.
2017-07-11 23:16:26 -04:00
Branden Archer
116a44fd1c Let BarcodeImageWriterTask's constructor be package private 2017-07-11 23:13:46 -04:00
Branden Archer
b6190d3250 Merge pull request #125 from arno-github/patch-3
French update
2017-07-03 15:55:48 -04:00
arno-github
82c40408f7 French update 2017-07-03 21:10:21 +02:00
Branden Archer
c6c9fb763a Merge pull request #124 from arno-github/patch-2
Update french translation
2017-07-02 22:36:30 -04:00
arno-github
dda5dcc652 Update french translation
Cosmetic changes
2017-07-02 20:00:21 +02:00
Branden Archer
d039ad9fa4 Merge pull request #122 from Entze/master
add & refine german translation
2017-06-29 21:44:02 -04:00
Lukas Grassauer
5c70c98eb9 Merge branch 'master' of github.com:brarcher/loyalty-card-locker 2017-06-29 16:28:17 +02:00
Lukas Grassauer
2face21985 add missing and revise de translations 2017-06-29 16:23:10 +02:00
Branden Archer
b38ec7b753 Merge pull request #121 from brarcher/pre-v0.11.1
Update for v0.11.1
2017-06-29 10:13:07 -04:00
Branden Archer
32d5aec76b Update for v0.11.1 2017-06-28 22:49:44 -04:00
Branden Archer
bdbcaf4b1e Merge pull request #120 from brarcher/handleConfigChanges
handle orientation and resize config change for IntroActivity
2017-06-28 22:48:50 -04:00
Branden Archer
f54905f218 handle orientation and resize config change for IntroActivity
If orientation and resize are not handled if the screen is
rotate or resized the IntroSlide fragment loses its layout,
and when it tries inflates the layout it fails to do so.
2017-06-28 22:42:02 -04:00
Branden Archer
2d3bd4a375 Merge pull request #118 from brarcher/credit
Add credit for save icon & update copyright string format
2017-06-26 22:56:36 -04:00
Branden Archer
de4ab95437 Add credit for save icon in about dialog 2017-06-26 22:10:09 -04:00
Branden Archer
09fba71710 Fix string format for copyright year
The year is an integer, but the format was for a string.
2017-06-26 22:10:09 -04:00
Branden Archer
2b84762b99 Merge pull request #117 from brarcher/changelog
Update CHANGELOG for v0.11
2017-06-26 22:07:38 -04:00
Branden Archer
3a4850d5cf Merge branch 'master' into changelog 2017-06-26 21:59:46 -04:00
Branden Archer
5bc8a915d6 Update CHANGELOG for v0.11 2017-06-26 21:59:36 -04:00
Branden Archer
15cbd5b641 Merge pull request #116 from brarcher/pre-v0.11
Update for v0.11 release
2017-06-26 21:59:07 -04:00
Branden Archer
d980079d76 Update for v0.11 release 2017-06-26 21:44:16 -04:00
Branden Archer
e58cbd972e Merge pull request #112 from brarcher/readme
Add attribution for save icon in README
2017-06-24 21:38:15 -04:00
Branden Archer
1fbecd439b Add attribution for save icon in README 2017-06-22 22:16:42 -04:00
Branden Archer
707306ac81 Merge pull request #111 from brarcher/readme
Update README with new screenshots
2017-06-21 23:42:12 -04:00
Branden Archer
86152586cd Update README with new screenshots 2017-06-21 23:32:09 -04:00
Branden Archer
fa33e4873e Merge pull request #109 from Airon90/patch-1
Update strings.xml
2017-06-20 22:43:40 -04:00
Branden Archer
24e4ef2d9b Merge branch 'master' into patch-1 2017-06-20 22:35:04 -04:00
Branden Archer
eac4142392 Escape ' in strings.xml 2017-06-20 22:23:33 -04:00
Branden Archer
f38a499bd8 Merge pull request #110 from brarcher/french
Update French translations
2017-06-20 22:21:45 -04:00
Branden Archer
0b8f52b87e Update French translations
Provided by GitHub user arno-github.
2017-06-20 22:14:27 -04:00
Michael Moroni
c8255a2648 Update strings.xml
Updated Italian (it) translation
2017-06-20 19:41:13 +02:00
Branden Archer
f28326e363 Merge pull request #108 from brarcher/intro
First run intro wizard
2017-06-18 23:46:37 -04:00
Branden Archer
a9952d021b Update to Robolectric 3.3.2
This is necessary, as Robolectric 3.0 did not work
with the newer Android SDK. Further, Robolectric 3.3.2
did not like running tests at SDK 17, so this was
also bumped.
2017-06-18 23:39:02 -04:00
Branden Archer
9274339be8 Add intro wizard for application 2017-06-18 23:37:51 -04:00
Branden Archer
18caa01089 Move the ic_launcher.xcf file into a separate directory 2017-06-18 23:05:23 -04:00
Branden Archer
ac495e1bf2 Add missing card add menu
There was no save button when creating a new card.
2017-06-18 23:05:22 -04:00
Branden Archer
a8eecb8841 Merge pull request #107 from brarcher/layout-and-colors
Layout and colors
2017-06-18 22:02:20 -04:00
Branden Archer
abdde45669 Update card view layout
This layout uses a TableLayout and shows lines dividing the
different parts of an entry.
2017-06-18 20:47:37 -04:00
Branden Archer
13b2faab39 Use save button in action bar 2017-06-18 15:37:40 -04:00
Branden Archer
433d31c30f Add super call in onCreateOptionsMenu 2017-06-18 15:37:40 -04:00
Branden Archer
fa7dcd253a Change menus names to focus where they are, not what they contain 2017-06-18 15:37:40 -04:00
Branden Archer
ac057f50e2 Change color palette to better match icon
The green primary color was a bit of contrast with the icons grey.
2017-06-18 15:37:40 -04:00
Branden Archer
ef33c7a33f Merge pull request #106 from brarcher/french-strings
Updated French strings.xml
2017-06-18 14:36:38 -04:00
Branden Archer
6028f7d674 Updated French strings.xml
Contributed by arno-github
2017-06-18 14:30:55 -04:00
Branden Archer
da5f999eed Merge pull request #104 from brarcher/edit-card
Update "Enter card" button if card id exists
2017-06-11 15:13:38 -04:00
Branden Archer
0a9124c834 Update "Enter card" button if card id exists
If someone is editing an existing card, or is adding a card
and wants to change the value, update the name of the button
from "Enter card" to "Edit card", to give the impression that
a new card id need not by typed from scratch.
2017-06-11 15:06:10 -04:00
Branden Archer
c173012955 Merge pull request #103 from brarcher/limit-width
Limit width of barcodes
2017-06-11 15:05:27 -04:00
Branden Archer
64db9e593d Limit width of barcodes
To reduce the amount of memory used in generating barcodes, limit
the width of the barcodes to no more than 3x the height.
This should be plenty sufficient to generate a usable barcode.

On devices with a really long width generating a barcode of 200x2560
is not useful and can result in an OutOfMemoryError.
2017-06-11 14:56:17 -04:00
Branden Archer
acde4ef181 Update to zxing 3.3.0 and zxing-android 3.5.0 2017-06-11 14:55:39 -04:00
Branden Archer
807ea25ac9 Merge pull request #102 from brarcher/privacy-policy
Create privacy-policy.md
2017-06-10 15:40:50 -04:00
Branden Archer
ad4476fead Create privacy-policy.md
This is required by Google for apps in the play store
which use certain permissions, such as the camera.
2017-06-10 15:33:25 -04:00
Branden Archer
f2c0e3904f Merge pull request #98 from brarcher/travis
Travis-CI changes
2017-05-20 18:07:47 -04:00
Branden Archer
0eeadbf77f Build only the release variant
Building both debug and release was unnecessary, and only
increased the time to validate a pull request
2017-05-20 13:36:23 -04:00
Branden Archer
c0e95bd4da do not emit xml results
gradle will output the failures, so this is unnecessary
2017-05-20 13:35:57 -04:00
Branden Archer
b7e8b8d36e Merge pull request #96 from brarcher/about
About
2017-03-06 21:49:53 -05:00
Branden Archer
2bca8b738a Change about dialog info to use map instead of String[][] 2017-03-05 14:42:19 -05:00
Branden Archer
2b617ceca5 Remove mention of Freepik icons from README
The main application icon was replaced, and the icon from
Freepik is no longer used.
2017-03-05 14:42:19 -05:00
Branden Archer
29838f4f73 Merge pull request #95 from brarcher/readme
Add Google Play badge
2017-03-04 00:08:04 -05:00
Branden Archer
1403d4a98e Add Google Play badge
Adds a Google Play badge and updated the F-Droid badge to match
2017-03-03 23:56:43 -05:00
Branden Archer
c4b860bb3d Merge pull request #94 from brarcher/pre-populate-enter-card
Pre-populate Barcode Selector
2017-02-12 22:48:35 -05:00
Branden Archer
2768f4c590 Start with all barcode images visible
If the user enters the barcode selector view with a pre-existing
id, the barcodes are immediately drawn. However, if the ImageViews
were invisible their initial size is not known, and as such the
generated barcode images are fuzzy or not as expected. To avoid this,
all images are set to be visible. The expectation is that once the
barcodes are drawn for the first time if they are invalid the images
will be made invisible anyway.
2017-02-12 22:42:25 -05:00
Branden Archer
8660d4e218 Pre-populate card id in Barcode Selector
If a user is attempting to update a card id of an existing card,
before when the Enter Card button was selected the barcode selector
view would be empty. To be more useful, the view will now be
pre-populated with the existing card id.
2017-02-12 22:42:25 -05:00
Branden Archer
596d899449 Merge pull request #93 from brarcher/changelog
Update changelog for v0.10
2017-02-12 15:53:25 -05:00
Branden Archer
0db5a6f803 Update changelog for v0.10 2017-02-12 15:40:20 -05:00
74 changed files with 1130 additions and 366 deletions

View File

@@ -1,21 +1,16 @@
language: android
sudo: true
android:
components:
# Uncomment the lines below if you want to
# use the latest revision of Android SDK Tools
- platform-tools
- tools
# The BuildTools version used by your project
- build-tools-23.0.2
install:
- echo y | android update sdk -u -a -t tools
- echo y | android update sdk -u -a -t platform-tools
- echo y | android update sdk -u -a -t build-tools-25.0.2
- echo y | android update sdk -u -a -t android-25
- echo y | android update sdk -u -a -t extra-google-m2repository
- echo y | android update sdk -u -a -t extra-android-m2repository
# The SDK version used to compile your project
- android-23
script: ./gradlew build lint findbugs test
script: ./gradlew assembleRelease testReleaseUnitTest lintRelease findbugs
after_failure:
- cat app/build/outputs/lint-results.xml
- cat app/build/reports/findbugs/findbugs.html
- cat app/build/reports/tests/debug/index.html

View File

@@ -1,3 +1,19 @@
## v0.11 (2017-06-26)
Improvements:
- When editing a card ID, pre-populate the existing ID to start. (https://github.com/brarcher/loyalty-card-locker/pull/94)
- Limit the width of generated barcodes to reduce memory usage and out of memory errors. (https://github.com/brarcher/loyalty-card-locker/pull/103)
- When editing a card, change the "Enter Card" button to say "Edit Card" if a card ID already exists. (https://github.com/brarcher/loyalty-card-locker/pull/104)
- Change the color scheme to be softer and compatible with the app icon, and change the layout when viewing a card to be cleaner. (https://github.com/brarcher/loyalty-card-locker/pull/107)
- Add an intro wizard which launches on the app's first launch. (https://github.com/brarcher/loyalty-card-locker/pull/108)
## v0.10 (2017-02-12)
Improvements:
- Changed the default import/export filename. (https://github.com/brarcher/loyalty-card-locker/pull/84)
- Correct string on the import/export page. (https://github.com/brarcher/loyalty-card-locker/pull/87)
- Improve layout of card view page. The text should be easier to read, and is selectable with a long click. (https://github.com/brarcher/loyalty-card-locker/pull/91)
## v0.9 (2017-01-17)
The "Locker" part of the name was not intuitive. To help remedy this a new application icon was created by betsythefc which better represents the purpose of the application: to store loyalty cards which use barcodes. Along with this new icon the name of the application has been changed to "Loyalty Card Keychain".

View File

@@ -1,8 +1,10 @@
# Loyalty Card Keychain
[![Build Status](https://travis-ci.org/brarcher/loyalty-card-locker.svg?branch=master)](https://travis-ci.org/brarcher/loyalty-card-locker)
[![F-Droid](https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Get_it_on_F-Droid.svg/160px-Get_it_on_F-Droid.svg.png)](https://f-droid.org/repository/browse/?fdid=protect.card_locker "Loyalty Card Keychain on F-Droid")
<a href="https://f-droid.org/repository/browse/?fdid=protect.card_locker" target="_blank">
<img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="90"/></a>
<a href="https://play.google.com/store/apps/details?id=protect.card_locker" target="_blank">
<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="90"/></a>
Stores all of your store loyalty cards on your phone, removing the need to carry them around. Currently the following barcode types are supported:
@@ -23,11 +25,13 @@ proposed changes.
# Screenshots
[<img src="https://cloud.githubusercontent.com/assets/5264535/18036233/32fae9a6-6d33-11e6-81e4-55ba60e83d9b.png" width=250>](https://cloud.githubusercontent.com/assets/5264535/18036233/32fae9a6-6d33-11e6-81e4-55ba60e83d9b.png)
[<img src="https://cloud.githubusercontent.com/assets/5264535/18036246/7ee5c7f0-6d33-11e6-90cf-d2b3ca5a94c7.png" width=250>](https://cloud.githubusercontent.com/assets/5264535/18036246/7ee5c7f0-6d33-11e6-90cf-d2b3ca5a94c7.png)
[<img src="https://user-images.githubusercontent.com/5264535/27416124-79b09162-56d9-11e7-967b-8923177dc228.png" width=250>](https://user-images.githubusercontent.com/5264535/27416124-79b09162-56d9-11e7-967b-8923177dc228.png)
[<img src="https://user-images.githubusercontent.com/5264535/27416127-7baea332-56d9-11e7-8a10-5be90bb02225.png" width=250>](https://user-images.githubusercontent.com/5264535/27416127-7baea332-56d9-11e7-8a10-5be90bb02225.png)
[<img src="https://user-images.githubusercontent.com/5264535/27416128-7d50f7b2-56d9-11e7-9833-1dd962f9cf66.png" width=250>](https://user-images.githubusercontent.com/5264535/27416128-7d50f7b2-56d9-11e7-9833-1dd962f9cf66.png)
[<img src="https://cloud.githubusercontent.com/assets/5264535/18036258/bb19562e-6d33-11e6-856e-740e8785ad71.png" width=250>](https://cloud.githubusercontent.com/assets/5264535/18036258/bb19562e-6d33-11e6-856e-740e8785ad71.png)
[<img src="https://cloud.githubusercontent.com/assets/5264535/18036269/0202baf8-6d34-11e6-9c17-449d5b348738.png" width=250>](https://cloud.githubusercontent.com/assets/5264535/18036269/0202baf8-6d34-11e6-9c17-449d5b348738.png)
[<img src="https://user-images.githubusercontent.com/5264535/27416132-7ea6272c-56d9-11e7-9a52-d73424bf902c.png" width=250>](https://user-images.githubusercontent.com/5264535/27416132-7ea6272c-56d9-11e7-9a52-d73424bf902c.png)
[<img src="https://user-images.githubusercontent.com/5264535/27416137-800aee90-56d9-11e7-9cc9-2a7dc63bb4fb.png" width=250>](https://user-images.githubusercontent.com/5264535/27416137-800aee90-56d9-11e7-9cc9-2a7dc63bb4fb.png)
[<img src="https://user-images.githubusercontent.com/5264535/27416140-82d8211a-56d9-11e7-8031-c71d3077bdc6.png" width=250>](https://user-images.githubusercontent.com/5264535/27416140-82d8211a-56d9-11e7-8031-c71d3077bdc6.png)
# Building
@@ -46,5 +50,5 @@ Windows:
# Thanks
App icon originals by [Freepik](https://www.flaticon.com) and distributed under the [CC BY 3.0](http://creativecommons.org/licenses/by/3.0/) license,
and formatted using [Android Asset Studio](https://romannurik.github.io/AndroidAssetStudio/index.html).
This application uses the following image:
- [Save](https://thenounproject.com/term/save/716011) by [Bernar Novalyi](https://thenounproject.com/bernar.novalyi)

View File

@@ -7,15 +7,15 @@ findbugs {
}
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "protect.card_locker"
minSdkVersion 11
minSdkVersion 17
targetSdkVersion 23
versionCode 10
versionName "0.10"
versionCode 13
versionName "0.12"
}
buildTypes {
release {
@@ -35,14 +35,15 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
compile 'com.google.zxing:core:3.2.1'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.journeyapps:zxing-android-embedded:3.5.0@aar'
compile 'com.google.zxing:core:3.3.0'
compile 'org.apache.commons:commons-csv:1.2'
compile group: 'com.google.guava', name: 'guava', version: '18.0'
compile group: 'com.google.guava', name: 'guava', version: '20.0'
compile 'com.github.apl-devs:appintro:v4.2.0'
testCompile 'junit:junit:4.12'
testCompile "org.robolectric:robolectric:3.0"
testCompile "org.robolectric:robolectric:3.3.2"
}
task findbugs(type: FindBugs, dependsOn: assembleDebug) {

View File

@@ -48,6 +48,11 @@
android:label="@string/importExport"
android:configChanges="orientation|screenSize"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".IntroActivity"
android:label=""
android:configChanges="orientation|screenSize"
android:theme="@style/AppTheme.NoActionBar"/>
</application>
</manifest>

View File

@@ -21,6 +21,7 @@ import java.lang.ref.WeakReference;
class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
{
private static final String TAG = "LoyaltyCardLocker";
private static final int MAX_WIDTH = 500;
private final WeakReference<ImageView> imageViewReference;
private final String cardId;
@@ -28,7 +29,7 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
private final int imageHeight;
private final int imageWidth;
public BarcodeImageWriterTask(ImageView imageView, String cardIdString,
BarcodeImageWriterTask(ImageView imageView, String cardIdString,
BarcodeFormat barcodeFormat)
{
// Use a WeakReference to ensure the ImageView can be garbage collected
@@ -36,8 +37,19 @@ class BarcodeImageWriterTask extends AsyncTask<Void, Void, Bitmap>
cardId = cardIdString;
format = barcodeFormat;
imageHeight = imageView.getHeight();
imageWidth = imageView.getWidth();
if(imageView.getWidth() < MAX_WIDTH)
{
imageHeight = imageView.getHeight();
imageWidth = imageView.getWidth();
}
else
{
// Scale down the image to reduce the memory needed to produce it
imageWidth = MAX_WIDTH;
double ratio = (double)MAX_WIDTH / (double)imageView.getWidth();
imageHeight = (int)(imageView.getHeight() * ratio);
}
}
public Bitmap doInBackground(Void... params)

View File

@@ -124,6 +124,14 @@ public class BarcodeSelectorActivity extends AppCompatActivity
// Noting to do
}
});
final Bundle b = getIntent().getExtras();
final String initialCardId = b != null ? b.getString("initialCardId") : null;
if(initialCardId != null)
{
cardId.setText(initialCardId);
}
}
private void createBarcodeOption(final ImageView image, final String formatType, final String cardId)
@@ -136,7 +144,6 @@ public class BarcodeSelectorActivity extends AppCompatActivity
}
image.setImageBitmap(null);
image.setVisibility(View.GONE);
image.setOnClickListener(new View.OnClickListener()
{
@Override

View File

@@ -0,0 +1,43 @@
package protect.card_locker;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.v4.app.Fragment;
import com.github.paolorotolo.appintro.AppIntro;
public class IntroActivity extends AppIntro
{
@Override
public void init(Bundle savedInstanceState)
{
addIntroSlide(R.layout.intro1_layout);
addIntroSlide(R.layout.intro2_layout);
addIntroSlide(R.layout.intro3_layout);
addIntroSlide(R.layout.intro4_layout);
addIntroSlide(R.layout.intro5_layout);
addIntroSlide(R.layout.intro6_layout);
}
private void addIntroSlide(@LayoutRes int layout)
{
Fragment slide = new IntroSlide();
Bundle args = new Bundle();
args.putInt("layout", layout);
slide.setArguments(args);
addSlide(slide);
}
@Override
public void onSkipPressed(Fragment fragment) {
finish();
}
@Override
public void onDonePressed(Fragment fragment) {
finish();
}
}

View File

@@ -0,0 +1,25 @@
package protect.card_locker;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class IntroSlide extends Fragment
{
int _layout;
@Override
public void setArguments(Bundle bundle)
{
_layout = bundle.getInt("layout");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.inflate(_layout, container, false);
return v;
}
}

View File

@@ -34,6 +34,27 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
private static final int SELECT_BARCODE_REQUEST = 1;
EditText storeFieldEdit;
TextView storeFieldView;
EditText noteFieldEdit;
TextView noteFieldView;
TextView cardIdFieldView;
View cardIdDivider;
View cardIdTableRow;
TextView barcodeTypeField;
ImageView barcodeImage;
View barcodeImageLayout;
View barcodeCaptureLayout;
Button captureButton;
Button enterButton;
int loyaltyCardId;
boolean updateLoyaltyCard;
boolean viewLoyaltyCard;
DBHelper db;
@Override
protected void onCreate(Bundle savedInstanceState)
{
@@ -47,6 +68,13 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
final Bundle b = getIntent().getExtras();
loyaltyCardId = b != null ? b.getInt("id") : 0;
updateLoyaltyCard = b != null && b.getBoolean("update", false);
viewLoyaltyCard = b != null && b.getBoolean("view", false);
db = new DBHelper(this);
}
@Override
@@ -54,11 +82,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
{
super.onResume();
final Bundle b = getIntent().getExtras();
final int loyaltyCardId = b != null ? b.getInt("id") : 0;
final boolean updateLoyaltyCard = b != null && b.getBoolean("update", false);
final boolean viewLoyaltyCard = b != null && b.getBoolean("view", false);
Log.i(TAG, "To view card: " + loyaltyCardId);
if(viewLoyaltyCard)
@@ -75,25 +98,20 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
}
}
final EditText storeFieldEdit = (EditText) findViewById(R.id.storeNameEdit);
final TextView storeFieldView = (TextView) findViewById(R.id.storeNameView);
final EditText noteFieldEdit = (EditText) findViewById(R.id.noteEdit);
final TextView noteFieldView = (TextView) findViewById(R.id.noteView);
final EditText cardIdFieldEdit = (EditText) findViewById(R.id.cardIdEdit);
final TextView cardIdFieldView = (TextView) findViewById(R.id.cardIdView);
final EditText barcodeTypeField = (EditText) findViewById(R.id.barcodeType);
final ImageView barcodeImage = (ImageView) findViewById(R.id.barcode);
final View barcodeIdLayout = findViewById(R.id.barcodeIdLayout);
final View barcodeTypeLayout = findViewById(R.id.barcodeTypeLayout);
final View barcodeImageLayout = findViewById(R.id.barcodeLayout);
final View barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout);
storeFieldEdit = (EditText) findViewById(R.id.storeNameEdit);
storeFieldView = (TextView) findViewById(R.id.storeNameView);
noteFieldEdit = (EditText) findViewById(R.id.noteEdit);
noteFieldView = (TextView) findViewById(R.id.noteView);
cardIdFieldView = (TextView) findViewById(R.id.cardIdView);
cardIdDivider = findViewById(R.id.cardIdDivider);
cardIdTableRow = findViewById(R.id.cardIdTableRow);
barcodeTypeField = (TextView) findViewById(R.id.barcodeType);
barcodeImage = (ImageView) findViewById(R.id.barcode);
barcodeImageLayout = findViewById(R.id.barcodeLayout);
barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout);
final Button captureButton = (Button) findViewById(R.id.captureButton);
final Button enterButton = (Button) findViewById(R.id.enterButton);
final Button saveButton = (Button) findViewById(R.id.saveButton);
final Button cancelButton = (Button) findViewById(R.id.cancelButton);
final DBHelper db = new DBHelper(this);
captureButton = (Button) findViewById(R.id.captureButton);
enterButton = (Button) findViewById(R.id.enterButton);
if(updateLoyaltyCard || viewLoyaltyCard)
{
@@ -111,9 +129,8 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
noteFieldView.setText(loyaltyCard.note);
}
if(cardIdFieldEdit.getText().length() == 0)
if(cardIdFieldView.getText().length() == 0)
{
cardIdFieldEdit.setText(loyaltyCard.cardId);
cardIdFieldView.setText(loyaltyCard.cardId);
}
@@ -128,19 +145,15 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
storeFieldView.setVisibility(View.GONE);
noteFieldView.setVisibility(View.GONE);
cardIdFieldView.setVisibility(View.GONE);
}
else
{
barcodeCaptureLayout.setVisibility(View.GONE);
captureButton.setVisibility(View.GONE);
saveButton.setVisibility(View.GONE);
cancelButton.setVisibility(View.GONE);
setTitle(R.string.viewCardTitle);
storeFieldEdit.setVisibility(View.GONE);
noteFieldEdit.setVisibility(View.GONE);
cardIdFieldEdit.setVisibility(View.GONE);
}
}
else
@@ -149,21 +162,13 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
storeFieldView.setVisibility(View.GONE);
noteFieldView.setVisibility(View.GONE);
cardIdFieldView.setVisibility(View.GONE);
}
if(cardIdFieldEdit.getText().length() == 0)
{
barcodeIdLayout.setVisibility(View.GONE);
}
barcodeTypeLayout.setVisibility(View.GONE);
if(cardIdFieldEdit.getText().length() > 0 && barcodeTypeField.getText().length() > 0)
if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0)
{
String formatString = barcodeTypeField.getText().toString();
final BarcodeFormat format = BarcodeFormat.valueOf(formatString);
final String cardIdString = cardIdFieldEdit.getText().toString();
final String cardIdString = cardIdFieldView.getText().toString();
if(barcodeImage.getHeight() == 0)
{
@@ -196,7 +201,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute();
}
barcodeIdLayout.setVisibility(View.VISIBLE);
barcodeImageLayout.setVisibility(View.VISIBLE);
}
@@ -222,54 +226,63 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
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);
}
});
saveButton.setOnClickListener(new View.OnClickListener()
if(cardIdFieldView.getText().length() > 0)
{
@Override
public void onClick(final View v)
{
String store = storeFieldEdit.getText().toString();
String note = noteFieldEdit.getText().toString();
String cardId = cardIdFieldEdit.getText().toString();
String barcodeType = barcodeTypeField.getText().toString();
if(store.isEmpty())
{
Snackbar.make(v, R.string.noStoreError, Snackbar.LENGTH_LONG).show();
return;
}
if(cardId.isEmpty() || barcodeType.isEmpty())
{
Snackbar.make(v, R.string.noCardIdError, Snackbar.LENGTH_LONG).show();
return;
}
if(updateLoyaltyCard)
{
db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType);
Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId);
}
else
{
db.insertLoyaltyCard(store, note, cardId, barcodeType);
}
finish();
}
});
cancelButton.setOnClickListener(new View.OnClickListener()
cardIdDivider.setVisibility(View.VISIBLE);
cardIdTableRow.setVisibility(View.VISIBLE);
enterButton.setText(R.string.editCard);
}
else
{
@Override
public void onClick(View v)
{
finish();
}
});
cardIdDivider.setVisibility(View.GONE);
cardIdTableRow.setVisibility(View.GONE);
enterButton.setText(R.string.enterCard);
}
}
private void doSave()
{
String store = storeFieldEdit.getText().toString();
String note = noteFieldEdit.getText().toString();
String cardId = cardIdFieldView.getText().toString();
String barcodeType = barcodeTypeField.getText().toString();
if(store.isEmpty())
{
Snackbar.make(storeFieldEdit, R.string.noStoreError, Snackbar.LENGTH_LONG).show();
return;
}
if(cardId.isEmpty() || barcodeType.isEmpty())
{
Snackbar.make(cardIdFieldView, R.string.noCardIdError, Snackbar.LENGTH_LONG).show();
return;
}
if(updateLoyaltyCard)
{
db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType);
Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId);
}
else
{
db.insertLoyaltyCard(store, note, cardId, barcodeType);
}
finish();
}
@Override
@@ -281,14 +294,18 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
if(viewLoyaltyCard)
{
getMenuInflater().inflate(R.menu.card_edit_menu, menu);
getMenuInflater().inflate(R.menu.card_view_menu, menu);
}
else if(updateLoyaltyCard)
{
getMenuInflater().inflate(R.menu.card_delete_menu, menu);
getMenuInflater().inflate(R.menu.card_update_menu, menu);
}
else
{
getMenuInflater().inflate(R.menu.card_add_menu, menu);
}
return true;
return super.onCreateOptionsMenu(menu);
}
@Override
@@ -343,6 +360,10 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
startActivity(intent);
finish();
return true;
case R.id.action_save:
doSave();
return true;
}
return super.onOptionsItemSelected(item);
@@ -377,14 +398,10 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
Log.i(TAG, "Read barcode id: " + contents);
Log.i(TAG, "Read format: " + format);
for(TextView view : new TextView[]{
(EditText) findViewById(R.id.cardIdEdit),
(TextView) findViewById(R.id.cardIdView)})
{
view.setText(contents);
}
TextView cardIdView = (TextView)findViewById(R.id.cardIdView);
cardIdView.setText(contents);
final EditText barcodeTypeField = (EditText) findViewById(R.id.barcodeType);
final TextView barcodeTypeField = (TextView) findViewById(R.id.barcodeType);
barcodeTypeField.setText(format);
onResume();
}

View File

@@ -4,6 +4,7 @@ import android.content.ClipData;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ClipboardManager;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.Cursor;
@@ -23,7 +24,10 @@ import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.common.collect.ImmutableMap;
import java.util.Calendar;
import java.util.Map;
public class MainActivity extends AppCompatActivity
{
@@ -38,6 +42,12 @@ public class MainActivity extends AppCompatActivity
setSupportActionBar(toolbar);
updateLoyaltyCardList();
SharedPreferences prefs = getSharedPreferences("protect.card_locker", MODE_PRIVATE);
if (prefs.getBoolean("firstrun", true)) {
startIntro();
prefs.edit().putBoolean("firstrun", false).commit();
}
}
@Override
@@ -149,6 +159,12 @@ public class MainActivity extends AppCompatActivity
return true;
}
if(id == R.id.action_intro)
{
startIntro();
return true;
}
if(id == R.id.action_about)
{
displayAboutDialog();
@@ -160,21 +176,34 @@ public class MainActivity extends AppCompatActivity
private void displayAboutDialog()
{
final String[][] USED_LIBRARIES = new String[][]
{
new String[] {"Commons CSV", "https://commons.apache.org/proper/commons-csv/"},
new String[] {"Guava", "https://github.com/google/guava"},
new String[] {"ZXing", "https://github.com/zxing/zxing"},
new String[] {"ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded"},
};
final Map<String, String> USED_LIBRARIES = ImmutableMap.of
(
"Commons CSV", "https://commons.apache.org/proper/commons-csv/",
"Guava", "https://github.com/google/guava",
"ZXing", "https://github.com/zxing/zxing",
"ZXing Android Embedded", "https://github.com/journeyapps/zxing-android-embedded",
"AppIntro", "https://github.com/apl-devs/AppIntro"
);
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 (String[] library : USED_LIBRARIES)
for (Map.Entry<String, String> entry : USED_LIBRARIES.entrySet())
{
libs.append("<li><a href=\"").append(library[1]).append("\">").append(library[0]).append("</a></li>");
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);
@@ -212,7 +241,9 @@ public class MainActivity extends AppCompatActivity
"</p><hr/><p>" +
getString(R.string.app_license) +
"</p><hr/><p>" +
String.format(getString(R.string.app_libraries), appName, libs.toString());
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)
@@ -227,4 +258,10 @@ public class MainActivity extends AppCompatActivity
})
.show();
}
private void startIntro()
{
Intent intent = new Intent(this, IntroActivity.class);
startActivity(intent);
}
}

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#222222"
android:layout_weight="10"
android:id="@+id/main">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:gravity="center"
android:paddingLeft="32dp"
android:layout_weight="3"
android:fontFamily="sans-serif-thin"
android:textColor="#ffffff"
android:paddingRight="32dp"
android:textSize="28sp"
android:text="@string/intro1Title"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center"
android:layout_weight="5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:src="@drawable/app_icon_intro"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:layout_gravity="center"
android:gravity="center"
android:textColor="#ffffff"
android:paddingLeft="64dp"
android:paddingRight="64dp"
android:textSize="16sp"
android:text="@string/intro1Description"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="64dp" />
</LinearLayout>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#222222"
android:layout_weight="10"
android:id="@+id/main">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:gravity="center"
android:paddingLeft="32dp"
android:layout_weight="3"
android:fontFamily="sans-serif-thin"
android:textColor="#ffffff"
android:paddingRight="32dp"
android:textSize="28sp"
android:text="@string/intro2Title"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center"
android:layout_weight="5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:src="@drawable/intro2_image"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:layout_gravity="center"
android:gravity="center"
android:textColor="#ffffff"
android:paddingLeft="64dp"
android:paddingRight="64dp"
android:textSize="16sp"
android:text="@string/intro2Description"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="64dp" />
</LinearLayout>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#222222"
android:layout_weight="10"
android:id="@+id/main">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:gravity="center"
android:paddingLeft="32dp"
android:layout_weight="3"
android:fontFamily="sans-serif-thin"
android:textColor="#ffffff"
android:paddingRight="32dp"
android:textSize="28sp"
android:text="@string/intro3Title"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center"
android:layout_weight="5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:src="@drawable/intro3_image"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:layout_gravity="center"
android:gravity="center"
android:textColor="#ffffff"
android:paddingLeft="64dp"
android:paddingRight="64dp"
android:textSize="16sp"
android:text="@string/intro3Description"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="64dp" />
</LinearLayout>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#222222"
android:layout_weight="10"
android:id="@+id/main">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:gravity="center"
android:paddingLeft="32dp"
android:layout_weight="3"
android:fontFamily="sans-serif-thin"
android:textColor="#ffffff"
android:paddingRight="32dp"
android:textSize="28sp"
android:text="@string/intro4Title"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center"
android:layout_weight="5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:src="@drawable/intro4_image"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:layout_gravity="center"
android:gravity="center"
android:textColor="#ffffff"
android:paddingLeft="64dp"
android:paddingRight="64dp"
android:textSize="16sp"
android:text="@string/intro4Description"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="64dp" />
</LinearLayout>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#222222"
android:layout_weight="10"
android:id="@+id/main">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:gravity="center"
android:paddingLeft="32dp"
android:layout_weight="3"
android:fontFamily="sans-serif-thin"
android:textColor="#ffffff"
android:paddingRight="32dp"
android:textSize="28sp"
android:text="@string/intro5Title"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center"
android:layout_weight="5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:src="@drawable/intro5_image"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:layout_gravity="center"
android:gravity="center"
android:textColor="#ffffff"
android:paddingLeft="64dp"
android:paddingRight="64dp"
android:textSize="16sp"
android:text="@string/intro5Description"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="64dp" />
</LinearLayout>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#222222"
android:layout_weight="10"
android:id="@+id/main">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:gravity="center"
android:paddingLeft="32dp"
android:layout_weight="3"
android:fontFamily="sans-serif-thin"
android:textColor="#ffffff"
android:paddingRight="32dp"
android:textSize="28sp"
android:text="@string/intro6Title"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center"
android:layout_weight="5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:src="@drawable/app_icon_intro"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="3"
android:layout_gravity="center"
android:gravity="center"
android:textColor="#ffffff"
android:paddingLeft="64dp"
android:paddingRight="64dp"
android:textSize="16sp"
android:text="@string/intro6Description"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="64dp" />
</LinearLayout>

View File

@@ -19,158 +19,230 @@
</android.support.design.widget.AppBarLayout>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:id="@+id/scrollView">
<ScrollView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/inputContrastBackground"
app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TableLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:shrinkColumns="1"
android:background="@color/inputContrastBackground">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout android:orientation="horizontal"
android:padding="10dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView android:textSize="@dimen/text_size_medium"
android:textStyle="bold"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20.0dip"
android:paddingEnd="20.0dip"
android:labelFor="@+id/storeName"
android:text="@string/storeName" />
<EditText android:id="@+id/storeNameEdit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:textSize="@dimen/text_size_medium"/>
<TextView android:id="@+id/storeNameView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:textSize="@dimen/text_size_medium"
android:textIsSelectable="true"/>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:padding="10dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView android:textSize="@dimen/text_size_medium"
android:textStyle="bold"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20.0dip"
android:paddingEnd="20.0dip"
android:labelFor="@+id/note"
android:text="@string/note" />
<EditText android:id="@+id/noteEdit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:textSize="@dimen/text_size_medium"/>
<TextView android:id="@+id/noteView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:textSize="@dimen/text_size_medium"
android:textIsSelectable="true"/>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:padding="10dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/barcodeIdLayout">
<TextView android:textSize="@dimen/text_size_medium"
android:textStyle="bold"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20.0dip"
android:paddingEnd="20.0dip"
android:labelFor="@+id/cardId"
android:text="@string/cardId" />
<EditText android:id="@+id/cardIdEdit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:inputType="text"
android:textSize="@dimen/text_size_medium"/>
<TextView android:id="@+id/cardIdView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:textSize="@dimen/text_size_medium"
android:textIsSelectable="true"/>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/barcodeTypeLayout">
<TextView android:textSize="@dimen/text_size_medium"
android:textStyle="bold"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:labelFor="@+id/barcodeType"
android:text="@string/barcodeType" />
<EditText android:id="@+id/barcodeType"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:inputType="text"/>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:id="@+id/barcodeLayout">
<ImageView
android:layout_width="0dp"
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
</LinearLayout>
<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_width="0dp"
android:layout_height="wrap_content"
android:text="@string/capture"
android:layout_weight="1.0"/>
<Button android:id="@+id/enterButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/enterCard"
android:layout_weight="1.0"/>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:baselineAligned="true">
<Button android:id="@+id/cancelButton"
android:layout_width="fill_parent"
<!-- Store Name -->
<View
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
<RelativeLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cancel"
android:layout_weight="1.0" />
<Button android:id="@+id/saveButton"
android:layout_width="fill_parent"
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
<TextView
android:id="@+id/storeNameField"
android:text="@string/storeName"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
android:layout_alignParentStart="true"/>
<EditText
android:id="@+id/storeNameEdit"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:layout_toEndOf="@id/storeNameField"/>
<TextView
android:id="@+id/storeNameView"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:textIsSelectable="true"
android:layout_toEndOf="@id/storeNameField"/>
</RelativeLayout>
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<!-- Note -->
<View
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
<RelativeLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/save"
android:layout_weight="1.0" />
</LinearLayout>
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
<TextView
android:id="@+id/noteField"
android:text="@string/note"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
android:layout_alignParentStart="true"/>
<EditText
android:id="@+id/noteEdit"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:layout_toEndOf="@id/noteField"/>
<TextView
android:id="@+id/noteView"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:textIsSelectable="true"
android:layout_toEndOf="@id/noteField"/>
</RelativeLayout>
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<!-- Card ID -->
<View
android:id="@+id/cardIdDivider"
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TableRow
android:id="@+id/cardIdTableRow"
android:background="@color/inputBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:gravity="start"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
<RelativeLayout
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="@dimen/inputPadding"
android:paddingEnd="@dimen/inputPadding">
<TextView
android:id="@+id/cardIdField"
android:text="@string/cardId"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:textSize="@dimen/inputSize"
android:padding="@dimen/inputPadding"
android:layout_alignParentStart="true"/>
<TextView
android:id="@+id/cardIdView"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="@dimen/inputPadding"
android:textSize="@dimen/inputSize"
android:textIsSelectable="true"
android:layout_toEndOf="@id/cardIdField"/>
</RelativeLayout>
<View
android:gravity="end"
android:layout_height="match_parent"
android:layout_width="@dimen/inputBorderThickness"
android:background="@color/inputBorder" />
</TableRow>
<View
android:layout_height="@dimen/inputBorderThickness"
android:layout_width="match_parent"
android:background="@color/inputBorder" />
<TextView android:id="@+id/barcodeType"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:id="@+id/barcodeLayout">
<ImageView
android:layout_width="0dp"
android:layout_height="@dimen/barcode_disp_height"
android:layout_gravity="center_horizontal"
android:id="@+id/barcode"
android:contentDescription="@string/barcodeImageDescription"
android:layout_weight="1.0"/>
</LinearLayout>
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
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_width="0dp"
android:layout_height="wrap_content"
android:text="@string/capture"
android:layout_weight="1.0"/>
<Button android:id="@+id/enterButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/enterCard"
android:layout_weight="1.0"/>
</LinearLayout>
</LinearLayout>
</TableLayout>
</LinearLayout>
</ScrollView>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_save"
android:icon="@drawable/save_24dp"
android:title="@string/save"
app:showAsAction="always"/>
</menu>

View File

@@ -2,9 +2,15 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_save"
android:icon="@drawable/save_24dp"
android:title="@string/save"
app:showAsAction="always"/>
<item
android:id="@+id/action_delete"
android:icon="@drawable/ic_delete_white_24dp"
android:title="@string/delete"
app:showAsAction="always"/>
app:showAsAction="never"/>
</menu>

View File

@@ -12,6 +12,10 @@
android:icon="@drawable/ic_import_export_white_24dp"
android:title="@string/importExport"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_intro"
android:title="@string/startIntro"
app:showAsAction="never"/>
<item
android:id="@+id/action_about"
android:title="@string/about"

View File

@@ -15,6 +15,7 @@
<string name="save">Uložit</string>
<string name="capture">Naskenovat kartu</string>
<string name="enterCard">Vložit vlastnoručně</string>
<!-- NEEDS TRANSLATED --><string name="editCard">Edit Card</string>
<string name="edit">Editovat</string>
<string name="delete">Smazat</string>
<string name="confirm">Potvrdit</string>
@@ -48,12 +49,13 @@
<string name="noExternalStoragePermissionError">Nelze importovat nebo exportovat karty bez přístupu k externímu uložišti</string>
<string name="about">O aplikaci</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%s</xliff:g> Branden Archer</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Licensed under the GPLv3.</string>
<string name="about_title_fmt">O aplikaci <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Verze: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revizní informace: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> používá tyto knihovny třetích stran: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<!-- NEEDS TRANSLATED --><string name="app_resources"><xliff:g id="app_name">%s</xliff:g> uses the following third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Vyberte čárový kód</string>
<string name="enterBarcodeInstructions">Zadejte hodnotu čárového kódu a potm vyberte kód, který představuje čárový kód, který je na kartě.</string>
@@ -75,4 +77,18 @@
<string name="importOptionFixedExplanation">Import ze stejné složky souborového systému do níž se zapisuje při exportu.</string>
<string name="importOptionFixedButton">Použít složku exportu</string>
<string name="sendLabel">Odeslat&#8230;</string>
<!-- NEEDS TRANSLATED --><string name="startIntro">Start Intro</string>
<!-- NEEDS TRANSLATED --><string name="intro1Title">Welcome to Loyalty Card Keychain\n</string>
<!-- NEEDS TRANSLATED --><string name="intro1Description">Manage your barcode-based store/loyalty cards on your phone!\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro2Title">Adding Cards\n</string>
<!-- NEEDS TRANSLATED --><string name="intro2Description">Add a new card by touching the plus from the card list.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro3Title">Adding Cards\n</string>
<!-- NEEDS TRANSLATED --><string name="intro3Description">To add the barcode, either capture with the camera or type in manually.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro4Title">Show Card\n</string>
<!-- NEEDS TRANSLATED --><string name="intro4Description">To display a card, click on the store name from the main screen\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro5Title">Backup\n</string>
<!-- NEEDS TRANSLATED --><string name="intro5Description">The cards can be backed-up. To export or import card data touch Import/Export in the menu on the main page.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro6Title">Feedback\n</string>
<!-- NEEDS TRANSLATED --><string name="intro6Description">This app is free, ad-free, and open source. See details by touching About in the menu on the main page.\n\nPlease leave feedback in the app store! (:</string>
</resources>

View File

@@ -5,17 +5,18 @@
<string name="about_title_fmt">Über <xliff:g id="app_name">%s</xliff:g></string>
<string name="action_add">Neu</string>
<string name="addCardTitle">Neue Kundenkarte</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%s</xliff:g> Branden Archer</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Lizensiert unter der GPLv3.</string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> benutzt die folgenden Fremdbibliotheken: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> verwendet folgenden Dritt-Ressourcen: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="viewCardTitle">Kundenkarte anzeigen</string>
<string name="ok">Ok</string>
<string name="note">Notiz</string>
<string name="save">Speichern</string>
<string name="scanCardBarcode">Barcode scannen</string>
<string name="selectBarcodeTitle">Barcode auswählen</string>
<string name="storeName">Firma</string>
<string name="noStoreError">Keine Firma angegeben</string>
<string name="storeName">Geschäft</string>
<string name="noStoreError">Kein Geschäft angegeben</string>
<string name="exportName">Exportieren</string>
<string name="exportedTo">Exportiert nach: %1$s</string>
<string name="fileMissing">Datei fehlt: %1$s</string>
@@ -25,25 +26,26 @@
<string name="importedFrom">Importiert von: %1$s</string>
<string name="noCardIdError">Keine Kartennummer angegeben</string>
<string name="noExternalStoragePermissionError">Ohne die Berechtigung für den externen Speicher kann kein Import oder Export erfolgen.</string>
<string name="noGiftCards">Du hast noch keine Kundenkarte angelegt. Über den "+" Button oben rechts, kannst du welche anlegen.\n\nDiese App ermöglicht es dir, deine Kundenkarten immer mit dir zu führen.</string>
<string name="cancel">Abrechen</string>
<string name="capture">Karte aufnehmen</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="cancel">Abbrechen</string>
<string name="capture">Karte erfassen</string>
<string name="cardId">Kartennummer</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="confirm">Bestätigen</string>
<string name="copy_to_clipboard">Kopiere die Nummer in die Zwischenablage</string>
<string name="delete">Löschen</string>
<string name="deleteConfirmation">Bitte bestätige, dass du die Karte löschen möchtest.</string>
<string name="deleteConfirmation">Bitte bestätigen Sie, dass diese Karte gelöscht werden soll.</string>
<string name="deleteTitle">Lösche die Kundenkarte</string>
<string name="edit">Bearbeiten</string>
<string name="editCardTitle">Kundenkarte bearbeiten</string>
<string name="enterCard">Karte einfügen</string>
<string name="editCard">Karte bearbeiten</string>
<string name="exportFailed">Export fehlgeschlagen: %1$s</string>
<string name="barcodeType">Barcodeart</string>
<string name="barcodeImageDescription">Bild des Barcodes</string>
<string name="copy_to_clipboard_toast">Nummer in die Zwischenablage kopiert</string>
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="enterBarcodeInstructions">Füge die Kundennummer ein, anschließend wähle die korrekte Barcodeart aus.</string>
<string name="enterBarcodeInstructions">Fügen Sie die Kundennummer ein, anschließend wählen Sie die korrekte Barcodeart aus.</string>
<string name="app_revision_fmt">Versions Information: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="importing">Importiere…</string>
<string name="exporting">Exportiere…</string>
@@ -53,16 +55,29 @@
<string name="importFailedTitle">Import fehlgeschlagen</string>
<string name="exportSuccessfulTitle">Export erfolgreich</string>
<string name="exportFailedTitle">Export fehlgeschlagen</string>
<string name="exportOptionExplanation">Die Datei wird ins Wurzelverzeichnis des externen Speichers geschrieben.</string>
<string name="exportOptionExplanation">Die Datei wird ins Rootverzeichnis des externen Speichers geschrieben.</string>
<string name="importOptionFilesystemTitle">Importiere vom Dateisystem</string>
<string name="importOptionFilesystemExplanation">Wähle eine Datei im Speicher aus.</string>
<string name="importOptionFilesystemButton">Vom Dateisystem</string>
<string name="importOptionApplicationTitle">Nutze eine externe App</string>
<string name="importOptionApplicationExplanation">Wähle eine Datei aus einer App wie Dropbox, Google Drive, oder deinem bevorzugten Dateisystem aus.</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="importOptionFixedTitle">Importiere vom Export Ort</string>
<string name="importOptionFixedExplanation">Importiere von derselben Stelle, wo die exportiere Datei liegen würde.</string>
<string name="importOptionFixedButton">Verwende die exportierte Stelle</string>
<string name="importOptionFixedTitle">Importiere vom Export-Pfad</string>
<string name="importOptionFixedExplanation">Importiere vom Export-Pfad.</string>
<string name="importOptionFixedButton">Verwende den Export-Pfad.</string>
<string name="sendLabel">Senden&#8230;</string>
</resources>
<string name="startIntro">Starte Einführung</string>
<string name="intro1Title">Willkommen zu Loyalty Card Keychain\n</string>
<string name="intro1Description">Verwalten Sie Ihre Barcode-Kundenkarten auf Ihrem Smartphone!\n\n</string>
<string name="intro2Title">Karten hinzufügen\n</string>
<string name="intro2Description">Fügen Sie neue Karten hinzu indem Sie das "+" Symbol in der Liste berühren.\n\n</string>
<string name="intro3Title">Karten hinzufügen\n</string>
<string name="intro3Description">Um einen Barcode hinzuzufügen, verwenden Sie die Kamera oder geben Sie den Code manuell ein.\n\n</string>
<string name="intro4Title">Karte anzeigen\n</string>
<string name="intro4Description">Um eine Karte anzuzeigen, den entsprechenen Namen in der Hauptansicht anwählen.\n\n</string>
<string name="intro5Title">Backup\n</string>
<string name="intro5Description">Sie können selbstverständlich Backups anlegen. Um Karten zu exportieren oder importieren wählen Sie Import/Export im Menü auf dem Hauptbildschirm.\n\n</string>
<string name="intro6Title">Feedback\n</string>
<string name="intro6Description">Diese App enthält keine Werbung, und ist freie und quelloffene Software. Für Details berühren Sie Über im Menü auf der Hauptseite.\n\nHinterlassen Sie uns ein Feedback im App-Store (:</string>
</resources>

View File

@@ -15,6 +15,7 @@
<string name="save">Enregistrer</string>
<string name="capture">Flasher</string>
<string name="enterCard">Mode manuel</string>
<string name="editCard">Modifier</string>
<string name="edit">Modifier</string>
<string name="delete">Supprimer</string>
<string name="confirm">Confirmer</string>
@@ -48,12 +49,13 @@
<string name="noExternalStoragePermissionError">Impossible d\'importer ou d\'exporter les données sans l\'autorisation d\'accès au stockage externe</string>
<string name="about">À propos</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%s</xliff:g> Branden Archer</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">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 sur les versions : <xliff:g 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-barre</string>
<string name="enterBarcodeInstructions">Saisissez les chiffres du code-barres et sélectionnez l\'image qui le représente</string>
@@ -76,4 +78,18 @@
<string name="importOptionFixedExplanation">Importe les données depuis le même emplacement que celui défini pour l\'export.</string>
<string name="importOptionFixedButton">Utiliser l\'emplacement de l\'export</string>
<string name="sendLabel">Envoyer&#8230;</string>
<string name="startIntro">Présentation</string>
<string name="intro1Title">Bienvenue dans\nLoyalty Card Keychain\n</string>
<string name="intro1Description">Gérez vos cartes de fidélité\nsur votre téléphone !\n\n</string>
<string name="intro2Title">Ajouter une carte\n</string>
<string name="intro2Description">Touchez le signe \'+\' en haut de l\'écran pour ajouter une carte.\n\n</string>
<string name="intro3Title">Ajouter une carte\n</string>
<string name="intro3Description">Pour enregistrer le code-barres, utilisez l\'appareil-photo ou entrez-le manuellement.\n\n</string>
<string name="intro4Title">Afficher une carte\n</string>
<string name="intro4Description">Pour afficher une carte, touchez le nom du magasin sur l\'écran principal\n\n</string>
<string name="intro5Title">Sauvegarde\n</string>
<string name="intro5Description">Les cartes peuvent être sauvegardées. Touchez \'Importer/Exporter\' sur l\'écran principal pour restaurer ou sauvegarder les cartes.\n\n</string>
<string name="intro6Title">Votre avis\n</string>
<string name="intro6Description">Cette application est gratuite, sans publicité, et son code est ouvert. Découvrez-en plus en touchant \'à propos\' sur l\'écran principal.\n\nLaissez un commentaire sur votre magasin d\'applications (:</string>
</resources>

View File

@@ -41,14 +41,16 @@
<string name="exporting">Esportazione in corso&#8230;</string>
<string name="noExternalStoragePermissionError">Impossibile importare o esportare i dati senza il permesso per l\'uso della memoria esterna.</string>
<string name="about">Informazioni</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%s</xliff:g> Branden Archer</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Pubblicato sotto licenza GPLv3.</string>
<string name="about_title_fmt">Informazioni su <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versione: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informazione sulla revisione: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> usa le seguenti librerie di terze parti: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<!-- NEEDS TRANSLATED --><string name="app_resources"><xliff:g id="app_name">%s</xliff:g> uses the following third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="ok">Ok</string>
<string name="enterCard">Inserisci carta</string>
<string name="editCard">Modifica carta</string>
<string name="selectBarcodeTitle">Seleziona codice a barre</string>
<string name="enterBarcodeInstructions">Digita il valore del codice a barre, quindi seleziona l\'immagine che rappresenta il codice a barre che vuoi usare.</string>
<string name="copy_to_clipboard">Copia ID negli appunti</string>
@@ -72,4 +74,18 @@
<string name="importOptionFixedExplanation">Importa dallo stesso posto del file system dove si è esportato.</string>
<string name="importOptionFixedButton">Usa luogo dell\'esportazione</string>
<string name="sendLabel">Invia&#8230;</string>
<string name="startIntro">Incomincia introduzione</string>
<string name="intro1Title">Benvenuto in Carte fedeltà\n</string>
<string name="intro1Description">Gestisci le tue tessere direttamente dal telefono!\n\n</string>
<string name="intro2Title">Aggiungi carte\n</string>
<string name="intro2Description">Aggiungi una nuova carta premendo il + dall\'elenco delle carte.\n\n</string>
<string name="intro3Title">Aggiungi carte\n</string>
<string name="intro3Description">Per aggiungere il codice a barre, catturalo con la fotocamera o inseriscilo manualmente.\n\n</string>
<string name="intro4Title">Mostra carta\n</string>
<string name="intro4Description">Per mostrare una carta, premi sul nome del negozio dalla schermata principale\n\n</string>
<string name="intro5Title">Backup\n</string>
<string name="intro5Description">I dati delle tessere possono essere salvati. Per esportare o importare tessere premi Importa/Esporta nel menù nella schermata principale.\n\n</string>
<string name="intro6Title">Feedback\n</string>
<string name="intro6Description">Questa app è gratuita, priva di pubblicità e open source. Guarda i dettagli premendo su Informazioni nella schermata principale.\n\nPer favore, lascia un feedback nell\'app store! (:</string>
</resources>

View File

@@ -15,6 +15,7 @@
<string name="save">Išsaugoti</string>
<string name="capture">Nufotografuoti kortelę</string>
<string name="enterCard">Įvesti kortelę</string>
<!-- NEEDS TRANSLATED --><string name="editCard">Edit Card</string>
<string name="edit">Redaguoti</string>
<string name="delete">Ištrinti</string>
<string name="confirm">Patvirtinti</string>
@@ -48,12 +49,13 @@
<string name="noExternalStoragePermissionError">Negalima importuoti/eksportuoti kortelių be išorinės atminties leidimo</string>
<string name="about">Apie</string>
<string name="app_copyright_fmt">Visos teisės saugomos 2016-<xliff:g>%s</xliff:g> Branden Archer</string>
<string name="app_copyright_fmt">Visos teisės saugomos 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Licenzijuota pagal GPLv3.</string>
<string name="about_title_fmt">Apie <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revizijos informacija: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> naudoja šias trečiosios šalies bibliotekas: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<!-- NEEDS TRANSLATED --><string name="app_resources"><xliff:g id="app_name">%s</xliff:g> uses the following third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Pasirinkite brūkšninį kodą</string>
<string name="enterBarcodeInstructions">Enter the barcode value then select the image which represents the barcode you want to use</string>
@@ -76,4 +78,18 @@
<!-- needs translated --><string name="importOptionFixedExplanation">Import from the same location on the filesystem that is written to on export.</string>
<!-- needs translated --><string name="importOptionFixedButton">Use export location</string>
<!-- needs translated --> <string name="sendLabel">Send&#8230;</string>
<!-- NEEDS TRANSLATED --><string name="startIntro">Start Intro</string>
<!-- NEEDS TRANSLATED --><string name="intro1Title">Welcome to Loyalty Card Keychain\n</string>
<!-- NEEDS TRANSLATED --><string name="intro1Description">Manage your barcode-based store/loyalty cards on your phone!\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro2Title">Adding Cards\n</string>
<!-- NEEDS TRANSLATED --><string name="intro2Description">Add a new card by touching the plus from the card list.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro3Title">Adding Cards\n</string>
<!-- NEEDS TRANSLATED --><string name="intro3Description">To add the barcode, either capture with the camera or type in manually.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro4Title">Show Card\n</string>
<!-- NEEDS TRANSLATED --><string name="intro4Description">To display a card, click on the store name from the main screen\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro5Title">Backup\n</string>
<!-- NEEDS TRANSLATED --><string name="intro5Description">The cards can be backed-up. To export or import card data touch Import/Export in the menu on the main page.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro6Title">Feedback\n</string>
<!-- NEEDS TRANSLATED --><string name="intro6Description">This app is free, ad-free, and open source. See details by touching About in the menu on the main page.\n\nPlease leave feedback in the app store! (:</string>
</resources>

View File

@@ -41,14 +41,16 @@
<string name="exporting">Exporterende&#8230;</string>
<string name="noExternalStoragePermissionError">Niet mogelijk te importeren of exporteren zonder rechten op externe opslag</string>
<string name="about">Over</string>
<string name="app_copyright_fmt">Auteursrecht 2016-<xliff:g>%s</xliff:g> Branden Archer</string>
<string name="app_copyright_fmt">Auteursrecht 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Gelicenseerd met GPLv3.</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">Revisieïnformatie: <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 derden: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<!-- NEEDS TRANSLATED --><string name="app_resources"><xliff:g id="app_name">%s</xliff:g> uses the following third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="ok">Oké</string>
<string name="enterCard">Voer kaart in</string>
<!-- NEEDS TRANSLATED --><string name="editCard">Edit Card</string>
<string name="selectBarcodeTitle">Selecteer barcode</string>
<string name="enterBarcodeInstructions">Voer de waarde van de barcode in en kies daarna de afbeelding die de barcode die je wil gebruiken representeert</string>
<string name="copy_to_clipboard">Kopieer het ID naar het klembord</string>
@@ -73,4 +75,18 @@
<string name="importOptionFixedExplanation">Importeer van zelfde locatie op het filesysteem waar tijdens exporteren naar geschreven is.</string>
<string name="importOptionFixedButton">gebruik exporteerlocaite</string>
<string name="sendLabel">Verzend&#8230;</string>
<!-- NEEDS TRANSLATED --><string name="startIntro">Start Intro</string>
<!-- NEEDS TRANSLATED --><string name="intro1Title">Welcome to Loyalty Card Keychain\n</string>
<!-- NEEDS TRANSLATED --><string name="intro1Description">Manage your barcode-based store/loyalty cards on your phone!\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro2Title">Adding Cards\n</string>
<!-- NEEDS TRANSLATED --><string name="intro2Description">Add a new card by touching the plus from the card list.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro3Title">Adding Cards\n</string>
<!-- NEEDS TRANSLATED --><string name="intro3Description">To add the barcode, either capture with the camera or type in manually.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro4Title">Show Card\n</string>
<!-- NEEDS TRANSLATED --><string name="intro4Description">To display a card, click on the store name from the main screen\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro5Title">Backup\n</string>
<!-- NEEDS TRANSLATED --><string name="intro5Description">The cards can be backed-up. To export or import card data touch Import/Export in the menu on the main page.\n\n</string>
<!-- NEEDS TRANSLATED --><string name="intro6Title">Feedback\n</string>
<!-- NEEDS TRANSLATED --><string name="intro6Description">This app is free, ad-free, and open source. See details by touching About in the menu on the main page.\n\nPlease leave feedback in the app store! (:</string>
</resources>

View File

@@ -1,7 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Palette generated by Material Palette - materialpalette.com/green/blue-grey -->
<!-- Palette generated by Material Palette -materialpalette.com/grey/blue-grey -->
<resources>
<color name="colorPrimary">#4CAF50</color>
<color name="colorPrimaryDark">#388E3C</color>
<color name="colorPrimary">#9E9E9E</color>
<color name="colorPrimaryDark">#616161</color>
<color name="colorAccent">#607D8B</color>
<color name="inputContrastBackground">#F8F8F8</color>
<color name="inputBackground">#FFFFFF</color>
<color name="inputBorder">#DDDDDD</color>
<color name="inputDividerBorder">#AAAAAA</color>
</resources>

View File

@@ -11,4 +11,9 @@
<dimen name="text_size_medium">18sp</dimen>
<dimen name="text_size_large">22sp</dimen>
<dimen name="inputBorderThickness">2dip</dimen>
<dimen name="inputBorderDividerThickness">4dip</dimen>
<dimen name="inputPadding">20dip</dimen>
<dimen name="inputSize">18sp</dimen>
</resources>

View File

@@ -15,6 +15,7 @@
<string name="save">Save</string>
<string name="capture">Capture Card</string>
<string name="enterCard">Enter Card</string>
<string name="editCard">Edit Card</string>
<string name="edit">Edit</string>
<string name="delete">Delete</string>
<string name="confirm">Confirm</string>
@@ -65,16 +66,30 @@
<string name="importOptionFixedButton">Use export location</string>
<string name="about">About</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%s</xliff:g> Branden Archer</string>
<string name="app_copyright_fmt">Copyright 2016-<xliff:g>%d</xliff:g> Branden Archer</string>
<string name="app_license">Licensed under the GPLv3.</string>
<string name="about_title_fmt">About <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">Revision Information: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries"><xliff:g id="app_name">%s</xliff:g> uses the following third-party libraries: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_resources"><xliff:g id="app_name">%s</xliff:g> uses the following third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="selectBarcodeTitle">Select Barcode</string>
<string name="enterBarcodeInstructions">Enter the barcode value then select the image which represents the barcode you want to use</string>
<string name="copy_to_clipboard_toast">Card ID copied to clipboard</string>
<string name="startIntro">Start Intro</string>
<string name="intro1Title">Welcome to Loyalty Card Keychain\n</string>
<string name="intro1Description">Manage your barcode-based store/loyalty cards on your phone!\n\n</string>
<string name="intro2Title">Adding Cards\n</string>
<string name="intro2Description">Add a new card by touching the plus from the card list.\n\n</string>
<string name="intro3Title">Adding Cards\n</string>
<string name="intro3Description">To add the barcode, either capture with the camera or type in manually.\n\n</string>
<string name="intro4Title">Show Card\n</string>
<string name="intro4Description">To display a card, click on the store name from the main screen\n\n</string>
<string name="intro5Title">Backup\n</string>
<string name="intro5Description">The cards can be backed-up. To export or import card data touch Import/Export in the menu on the main page.\n\n</string>
<string name="intro6Title">Feedback\n</string>
<string name="intro6Description">This app is free, ad-free, and open source. See details by touching About in the menu on the main page.\n\nPlease leave feedback in the app store! (:</string>
</resources>

View File

@@ -11,7 +11,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import static org.junit.Assert.assertEquals;
@@ -19,8 +19,8 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 17)
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 23)
public class DatabaseTest
{
private DBHelper db;

View File

@@ -11,7 +11,7 @@ import android.view.View;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.res.builder.RobolectricPackageManager;
@@ -20,16 +20,14 @@ import static org.robolectric.Shadows.shadowOf;
import static org.junit.Assert.assertEquals;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 17)
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 23)
public class ImportExportActivityTest
{
private void registerIntentHandler(String handler)
{
// Add something that will 'handle' the given intent type
RobolectricPackageManager packageManager = (RobolectricPackageManager) shadowOf(
RuntimeEnvironment.application).getPackageManager();
RobolectricPackageManager packageManager = shadowOf(RuntimeEnvironment.application.getPackageManager());
ResolveInfo info = new ResolveInfo();
info.isDefault = true;

View File

@@ -11,7 +11,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.io.ByteArrayInputStream;
@@ -26,8 +26,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 17)
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 23)
public class ImportExportTest
{
private Activity activity;

View File

@@ -11,13 +11,13 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import static org.junit.Assert.assertEquals;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 17)
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 23)
public class LoyaltyCardCursorAdapterTest
{
private Activity activity;

View File

@@ -18,7 +18,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.res.builder.RobolectricPackageManager;
@@ -32,8 +32,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.robolectric.Shadows.shadowOf;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 17)
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 23)
public class LoyaltyCardViewActivityTest
{
private final String BARCODE_DATA = "428311627547";
@@ -63,8 +63,7 @@ public class LoyaltyCardViewActivityTest
private void registerMediaStoreIntentHandler()
{
// Add something that will 'handle' the media capture intent
RobolectricPackageManager packageManager = (RobolectricPackageManager) shadowOf(
RuntimeEnvironment.application).getPackageManager();
RobolectricPackageManager packageManager = shadowOf(RuntimeEnvironment.application.getPackageManager());
ResolveInfo info = new ResolveInfo();
info.isDefault = true;
@@ -102,10 +101,8 @@ public class LoyaltyCardViewActivityTest
final EditText storeField = (EditText) activity.findViewById(R.id.storeNameEdit);
final EditText noteField = (EditText) activity.findViewById(R.id.noteEdit);
final EditText cardIdField = (EditText) activity.findViewById(R.id.cardIdEdit);
final EditText barcodeTypeField = (EditText) activity.findViewById(R.id.barcodeType);
final Button saveButton = (Button) activity.findViewById(R.id.saveButton);
final TextView cardIdField = (TextView) activity.findViewById(R.id.cardIdView);
final TextView barcodeTypeField = (TextView) activity.findViewById(R.id.barcodeType);
storeField.setText(store);
noteField.setText(note);
@@ -113,7 +110,7 @@ public class LoyaltyCardViewActivityTest
barcodeTypeField.setText(barcodeType);
assertEquals(false, activity.isFinishing());
saveButton.performClick();
shadowOf(activity).clickMenuItem(R.id.action_save);
assertEquals(true, activity.isFinishing());
assertEquals(1, db.getLoyaltyCardCount());
@@ -177,7 +174,6 @@ public class LoyaltyCardViewActivityTest
private void checkAllFields(final Activity activity, ViewMode mode,
final String store, final String note, final String cardId, final String barcodeType)
{
int cardIdVisibility = cardId.isEmpty() ? View.GONE : View.VISIBLE;
int captureVisibility = (mode == ViewMode.UPDATE_CARD || mode == ViewMode.ADD_CARD) ? View.VISIBLE : View.GONE;
int viewVisibility = (mode == ViewMode.VIEW_CARD) ? View.VISIBLE : View.GONE;
@@ -187,17 +183,12 @@ public class LoyaltyCardViewActivityTest
checkFieldProperties(activity, R.id.storeNameView, viewVisibility, store);
checkFieldProperties(activity, R.id.noteEdit, editVisibility, note);
checkFieldProperties(activity, R.id.noteView, viewVisibility, note);
checkFieldProperties(activity, R.id.cardIdEdit, editVisibility, cardId);
checkFieldProperties(activity, R.id.cardIdView, viewVisibility, cardId);
checkFieldProperties(activity, R.id.barcodeType, View.VISIBLE, barcodeType);
checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId);
checkFieldProperties(activity, R.id.cardIdDivider, cardId.isEmpty() ? View.GONE : View.VISIBLE, null);
checkFieldProperties(activity, R.id.cardIdTableRow, cardId.isEmpty() ? View.GONE : View.VISIBLE, null);
checkFieldProperties(activity, R.id.barcodeType, View.GONE, barcodeType);
checkFieldProperties(activity, R.id.captureButton, captureVisibility, null);
checkFieldProperties(activity, R.id.saveButton, captureVisibility, null);
checkFieldProperties(activity, R.id.cancelButton, captureVisibility, null);
checkFieldProperties(activity, R.id.barcode, View.VISIBLE, null);
checkFieldProperties(activity, R.id.barcodeIdLayout, cardIdVisibility, null);
checkFieldProperties(activity, R.id.barcodeLayout, cardIdVisibility, null);
checkFieldProperties(activity, R.id.barcodeTypeLayout, View.GONE, null);
}
@Test
@@ -222,33 +213,32 @@ public class LoyaltyCardViewActivityTest
activityController.resume();
Activity activity = (Activity)activityController.get();
ShadowActivity shadowActivity = shadowOf(activity);
DBHelper db = new DBHelper(activity);
assertEquals(0, db.getLoyaltyCardCount());
final EditText storeField = (EditText) activity.findViewById(R.id.storeNameEdit);
final EditText noteField = (EditText) activity.findViewById(R.id.noteEdit);
final EditText cardIdField = (EditText) activity.findViewById(R.id.cardIdEdit);
final TextView cardIdField = (TextView) activity.findViewById(R.id.cardIdView);
final Button saveButton = (Button) activity.findViewById(R.id.saveButton);
saveButton.performClick();
shadowActivity.clickMenuItem(R.id.action_save);
assertEquals(0, db.getLoyaltyCardCount());
storeField.setText("store");
saveButton.performClick();
shadowActivity.clickMenuItem(R.id.action_save);
assertEquals(0, db.getLoyaltyCardCount());
noteField.setText("note");
saveButton.performClick();
shadowActivity.clickMenuItem(R.id.action_save);
assertEquals(0, db.getLoyaltyCardCount());
cardIdField.setText("cardId");
saveButton.performClick();
shadowActivity.clickMenuItem(R.id.action_save);
assertEquals(0, db.getLoyaltyCardCount());
}
@Test
public void startWithoutParametersCancel()
public void startWithoutParametersBack()
{
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardViewActivity.class).create();
activityController.start();
@@ -257,10 +247,8 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
final Button cancelButton = (Button) activity.findViewById(R.id.cancelButton);
assertEquals(false, activity.isFinishing());
cancelButton.performClick();
shadowOf(activity).clickMenuItem(android.R.id.home);
assertEquals(true, activity.isFinishing());
}
@@ -323,9 +311,8 @@ public class LoyaltyCardViewActivityTest
checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA, BARCODE_TYPE);
// Cancel the gift card creation
final Button cancelButton = (Button) activity.findViewById(R.id.cancelButton);
assertEquals(false, activity.isFinishing());
cancelButton.performClick();
shadowOf(activity).clickMenuItem(android.R.id.home);
assertEquals(true, activity.isFinishing());
}
@@ -422,10 +409,9 @@ public class LoyaltyCardViewActivityTest
checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", BARCODE_DATA, BARCODE_TYPE);
// Cancel the gift card creation
final Button cancelButton = (Button) activity.findViewById(R.id.cancelButton);
// Cancel the loyalty card creation
assertEquals(false, activity.isFinishing());
cancelButton.performClick();
shadowOf(activity).clickMenuItem(android.R.id.home);
assertEquals(true, activity.isFinishing());
}
}

View File

@@ -2,8 +2,11 @@ package protect.card_locker;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ListView;
@@ -11,10 +14,12 @@ import android.widget.TextView;
import com.google.zxing.BarcodeFormat;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.util.ActivityController;
@@ -24,10 +29,20 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.robolectric.Shadows.shadowOf;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 17)
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 23)
public class MainActivityTest
{
private SharedPreferences prefs;
@Before
public void setUp()
{
// Assume that this is not the first launch
prefs = RuntimeEnvironment.application.getSharedPreferences("protect.card_locker", Context.MODE_PRIVATE);
prefs.edit().putBoolean("firstrun", false).commit();
}
@Test
public void initiallyNoLoyaltyCards() throws Exception
{
@@ -50,10 +65,11 @@ public class MainActivityTest
assertTrue(menu != null);
// The settings and add button should be present
assertEquals(menu.size(), 3);
assertEquals(menu.size(), 4);
assertEquals("Add", menu.findItem(R.id.action_add).getTitle().toString());
assertEquals("Import/Export", menu.findItem(R.id.action_import_export).getTitle().toString());
assertEquals("Start Intro", menu.findItem(R.id.action_intro).getTitle().toString());
assertEquals("About", menu.findItem(R.id.action_about).getTitle().toString());
}
@@ -100,4 +116,26 @@ public class MainActivityTest
Cursor cursor = (Cursor)list.getAdapter().getItem(0);
assertNotNull(cursor);
}
@Test
public void testFirstRunStartsIntro()
{
prefs.edit().remove("firstrun").commit();
ActivityController controller = Robolectric.buildActivity(MainActivity.class).create();
Activity activity = (Activity)controller.get();
assertTrue(activity.isFinishing() == false);
Intent next = shadowOf(activity).getNextStartedActivity();
ComponentName componentName = next.getComponent();
String name = componentName.flattenToShortString();
assertEquals("protect.card_locker/.IntroActivity", name);
Bundle extras = next.getExtras();
assertNull(extras);
assertEquals(false, prefs.getBoolean("firstrun", true));
}
}

View File

@@ -15,6 +15,7 @@ buildscript {
allprojects {
repositories {
jcenter()
maven { url 'https://jitpack.io' }
}
}

BIN
originals/intro2_image.xcf Normal file
View File

Binary file not shown.

BIN
originals/intro3_image.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
originals/intro4_image.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
originals/intro5_image.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

61
privacy-policy.md Normal file
View File

@@ -0,0 +1,61 @@
# PRIVACY POLICY MODEL FOR MOBILE APPLICATIONS
This privacy policy governs your use of the software application Loyalty Keychain (“Application”) for mobile devices
that was created by Protect. The Application is Basic description of the app (features, functionality and
content).
# What information does the Application obtain and how is it used?
The Application allows information on real estate properties to be added and maintained
by the user, which may includes images of the properties. This data is only stored on the mobile
device, and is not transmitted of off the device.
# User Provided Information
The Application does not have a registration option. The only information which is obtained
is any information provided by the App Store that the application was downloaded from.
# Automatically Collected Information
No information is collected from the Application and transmitted off of the mobile device, either automatically or manually.
# Does the Application collect precise real time location information of the device?
No.
# Do third parties see and/or have access to information obtained by the Application?
No, as no data is transmitted off of the mobile device by the Application.
# What are my opt-out rights?
There is no opt-out rights, as there is nothing to opt-out from. No data is transmitted off of the mobile device
by the Application, either manually or automatically.
# Data Retention Policy, Managing Your Information
No data is captured from users by the Application, so there is no information to manage. The only data
which is known is the data provided by the App Store the Application was downloaded from.
# Children
Ths Application is not used to knowingly solicit data from or market to children under the age of 13. If a parent or
guardian becomes aware that his or her child has provided us with information without their consent, he or she should
contact us at protect.github@gmail.com. We will delete such information from our files within a reasonable time.
# Security
We are concerned about safeguarding the confidentiality of your information. Note that no information is captured
by the Application and transmitted off of the mobile device. The only data breach possible is that with the user's
own mobile device.
# Changes
This Privacy Policy may be updated from time to time for any reason. We will notify you of any changes to our
Privacy Policy by posting the new Privacy Policy here. You are advised to consult this Privacy Policy regularly
for any changes, as continued use is deemed approval of all changes. You can check the history of this policy by
checking this history of this file in GitHub.
# Contact us
If you have any questions regarding privacy while using the Application, or have questions about our practices,
please contact us via email at protect.github@gmail.com.