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.
+
+
+
+
+
+
+After installing the app, just click the link you were given again and choose "Import loyalty card".