diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78ace2676..7a0e0be6a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -44,7 +44,17 @@ android:theme="@style/AppTheme.NoActionBar" android:configChanges="orientation|screenSize" android:windowSoftInputMode="stateHidden" - android:exported="true"/> + android:exported="true"> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/card_view_menu.xml b/app/src/main/res/menu/card_view_menu.xml index df5498c9e..3910d3faa 100644 --- a/app/src/main/res/menu/card_view_menu.xml +++ b/app/src/main/res/menu/card_view_menu.xml @@ -7,6 +7,11 @@ android:icon="@drawable/ic_lock_open_white_24dp" android:title="@string/lockScreen" app:showAsAction="always"/> + Please confirm that you want to delete this card. OK Copy ID to clipboard + Share Send… Added to Home Screen @@ -42,6 +43,7 @@ No Store entered No Card ID entered Could not lookup loyalty card + Could not parse the import Uri %1$s: %2$s %1$s - %2$s @@ -133,4 +135,9 @@ pref_display_card_max_brightness Lock barcode orientation pref_lock_barcode_orientation + + Import loyalty card + I want to share a loyalty card with you + brarcher.github.io + /loyalty-card-locker/share diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java new file mode 100644 index 000000000..c78f95605 --- /dev/null +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -0,0 +1,66 @@ +package protect.card_locker; + +import android.app.Activity; +import android.graphics.Color; +import android.net.Uri; +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.RobolectricTestRunner; +import org.robolectric.annotation.Config; +import java.io.InvalidObjectException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static protect.card_locker.DBHelper.LoyaltyCardDbIds; + +@RunWith(RobolectricTestRunner.class) +@Config(constants = BuildConfig.class, sdk = 23) +public class ImportURITest { + private ImportURIHelper importURIHelper; + private DBHelper db; + + @Before + public void setUp() + { + Activity activity = Robolectric.setupActivity(MainActivity.class); + importURIHelper = new ImportURIHelper(activity); + db = new DBHelper(activity); + } + + @Test + public void ensureNoDataLoss() throws InvalidObjectException + { + // Generate card + db.insertLoyaltyCard("store", "note", BarcodeFormat.UPC_A.toString(), LoyaltyCardDbIds.BARCODE_TYPE, Color.BLACK, Color.WHITE); + + // Get card + LoyaltyCard card = db.getLoyaltyCard(1); + + // Card to URI + Uri cardUri = importURIHelper.toUri(card); + + // Parse URI + LoyaltyCard parsedCard = importURIHelper.parse(cardUri); + + // Compare everything + assertEquals(card.barcodeType, parsedCard.barcodeType); + assertEquals(card.cardId, parsedCard.cardId); + assertEquals(card.headerColor, parsedCard.headerColor); + assertEquals(card.headerTextColor, parsedCard.headerTextColor); + assertEquals(card.note, parsedCard.note); + assertEquals(card.store, parsedCard.store); + } + + @Test + public void failToParseInvalidUri() + { + try { + importURIHelper.parse(Uri.parse("https://example.com/test")); + assertTrue(false); // Shouldn't get here + } catch(InvalidObjectException ex) { + // Desired behaviour + } + } +} diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 6f9218146..2d543527f 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -7,6 +7,8 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ResolveInfo; import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.widget.TextViewCompat; @@ -448,10 +450,11 @@ public class LoyaltyCardViewActivityTest final Menu menu = shadowOf(activity).getOptionsMenu(); assertTrue(menu != null); - // The settings and add button should be present - assertEquals(menu.size(), 2); + // The share, settings and add button should be present + assertEquals(menu.size(), 3); assertEquals("Block Rotation", menu.findItem(R.id.action_lock_unlock).getTitle().toString()); + assertEquals("Share", menu.findItem(R.id.action_share).getTitle().toString()); assertEquals("Edit", menu.findItem(R.id.action_edit).getTitle().toString()); } @@ -604,4 +607,25 @@ public class LoyaltyCardViewActivityTest } } } + + @Test + public void importCard() + { + Uri importUri = Uri.parse("https://brarcher.github.io/loyalty-card-locker/share?store=Example%20Store¬e=&cardid=123456&barcodetype=AZTEC&headercolor=-416706&headertextcolor=-1"); + + Intent intent = new Intent(); + intent.setData(importUri); + + ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).withIntent(intent).create(); + + activityController.start(); + activityController.visible(); + activityController.resume(); + + Activity activity = (Activity)activityController.get(); + + checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", "123456", "AZTEC"); + assertEquals(activity.findViewById(R.id.headingColorSample).getBackground(), new ColorDrawable(-416706)); + assertEquals(activity.findViewById(R.id.headingStoreTextColorSample).getBackground(), new ColorDrawable(-1)); + } } diff --git a/docs/index.md b/docs/index.md new file mode 120000 index 000000000..32d46ee88 --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/docs/share.md b/docs/share.md new file mode 100644 index 000000000..c4d1ed8c6 --- /dev/null +++ b/docs/share.md @@ -0,0 +1,10 @@ +# Shared Loyalty Card + +Someone wants to share a loyalty card with you. To import this loyalty card, you will first need to install the Loyalty Card Locker app. It is free, Open Source and contains no ads. + + +Get it on F-Droid + +Get it on Google Play + +After installing the app, just click the link you were given again and choose "Import loyalty card".