diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4b04a84ca..4b7089152 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,8 @@
android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+
+ android:windowSoftInputMode="stateHidden"
+ android:exported="true"/>
0 && barcodeTypeField.getText().length() > 0)
{
String formatString = barcodeTypeField.getText().toString();
@@ -274,6 +284,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
{
String store = storeFieldEdit.getText().toString();
String note = noteFieldEdit.getText().toString();
+ boolean shouldAddShortcut = shortcutCheckbox.isChecked();
String cardId = cardIdFieldView.getText().toString();
String barcodeType = barcodeTypeField.getText().toString();
@@ -296,12 +307,39 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
}
else
{
- db.insertLoyaltyCard(store, note, cardId, barcodeType);
+ loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType);
+ }
+
+ if(shouldAddShortcut)
+ {
+ addShortcut(loyaltyCardId, store);
}
finish();
}
+ private void addShortcut(int id, String name)
+ {
+ Intent shortcutIntent = new Intent(this, LoyaltyCardViewActivity.class);
+ shortcutIntent.setAction(Intent.ACTION_MAIN);
+ Bundle bundle = new Bundle();
+ bundle.putInt("id", id);
+ bundle.putBoolean("view", true);
+ shortcutIntent.putExtras(bundle);
+
+ Intent intent = new Intent();
+ intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
+ intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
+ intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource
+ .fromContext(this, R.mipmap.ic_launcher));
+ intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
+ // Do not duplicate the shortcut if it is already there
+ intent.putExtra("duplicate", false);
+ getApplicationContext().sendBroadcast(intent);
+
+ Toast.makeText(this, R.string.addedShortcut, Toast.LENGTH_LONG).show();
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
diff --git a/app/src/main/res/layout/loyalty_card_view_activity.xml b/app/src/main/res/layout/loyalty_card_view_activity.xml
index 8e2a6da93..940a869d7 100644
--- a/app/src/main/res/layout/loyalty_card_view_activity.xml
+++ b/app/src/main/res/layout/loyalty_card_view_activity.xml
@@ -146,6 +146,55 @@
android:background="@color/inputBorder" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Store
Note
+ Add Shortcut
Card ID
Barcode Type
@@ -26,6 +27,7 @@
OK
Copy ID to clipboard
Send…
+ Added shortcut
Edit Loyalty Card
Add Loyalty Card
diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
index 81320604c..6f7b56731 100644
--- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
+++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java
@@ -9,6 +9,7 @@ import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
+import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
@@ -29,6 +30,7 @@ import org.robolectric.android.controller.ActivityController;
import java.io.IOException;
+import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -87,6 +89,7 @@ public class LoyaltyCardViewActivityTest
*/
private void saveLoyaltyCardWithArguments(final Activity activity,
final String store, final String note,
+ final boolean addShortcut,
final String cardId,
final String barcodeType,
boolean creatingNewCard)
@@ -103,18 +106,25 @@ public class LoyaltyCardViewActivityTest
final EditText storeField = (EditText) activity.findViewById(R.id.storeNameEdit);
final EditText noteField = (EditText) activity.findViewById(R.id.noteEdit);
+ final CheckBox shortcutCheckbox = (CheckBox) activity.findViewById(R.id.shortcutCheckbox);
final TextView cardIdField = (TextView) activity.findViewById(R.id.cardIdView);
final TextView barcodeTypeField = (TextView) activity.findViewById(R.id.barcodeType);
storeField.setText(store);
noteField.setText(note);
+ shortcutCheckbox.setChecked(addShortcut);
cardIdField.setText(cardId);
barcodeTypeField.setText(barcodeType);
+ ShortcutAddedReceiver shortcutAddedReceiver = new ShortcutAddedReceiver();
+ shortcutAddedReceiver.registerReceiver(activity);
+
assertEquals(false, activity.isFinishing());
shadowOf(activity).clickMenuItem(R.id.action_save);
assertEquals(true, activity.isFinishing());
+ shortcutAddedReceiver.unregisterReceiver(activity);
+
assertEquals(1, db.getLoyaltyCardCount());
LoyaltyCard card = db.getLoyaltyCard(1);
@@ -122,6 +132,28 @@ public class LoyaltyCardViewActivityTest
assertEquals(note, card.note);
assertEquals(cardId, card.cardId);
assertEquals(barcodeType, card.barcodeType);
+
+ Intent shortcutRequest = shortcutAddedReceiver.lastRequest();
+
+ if(addShortcut)
+ {
+ assertNotNull(shortcutRequest);
+
+ String name = shortcutRequest.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
+ assertEquals(card.store, name);
+
+ Intent startIntent = shortcutRequest.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
+ assertNotNull(startIntent);
+ Bundle startBundle = startIntent.getExtras();
+ assertNotNull(startBundle);
+
+ assertEquals(card.id, startBundle.getInt("id", -1));
+ assertEquals(true, startBundle.getBoolean("view", false));
+ }
+ else
+ {
+ assertNull(shortcutRequest);
+ }
}
/**
@@ -184,6 +216,8 @@ public class LoyaltyCardViewActivityTest
checkFieldProperties(activity, R.id.storeNameEdit, editVisibility, store);
checkFieldProperties(activity, R.id.storeNameView, viewVisibility, store);
checkFieldProperties(activity, R.id.noteEdit, editVisibility, note);
+ checkFieldProperties(activity, R.id.shortcutBorder, editVisibility, null);
+ checkFieldProperties(activity, R.id.shortcutTablerow, editVisibility, null);
checkFieldProperties(activity, R.id.noteView, viewVisibility, note);
checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId);
checkFieldProperties(activity, R.id.cardIdDivider, cardId.isEmpty() ? View.GONE : View.VISIBLE, null);
@@ -274,7 +308,30 @@ public class LoyaltyCardViewActivityTest
checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA, BARCODE_TYPE);
// Save and check the gift card
- saveLoyaltyCardWithArguments(activity, "store", "note", BARCODE_DATA, BARCODE_TYPE, true);
+ saveLoyaltyCardWithArguments(activity, "store", "note", false, BARCODE_DATA, BARCODE_TYPE, true);
+ }
+
+ @Test
+ public void startWithoutParametersCaptureBarcodeCreateLoyaltyCardSaveShortcut() throws IOException
+ {
+ registerMediaStoreIntentHandler();
+
+ ActivityController activityController = Robolectric.buildActivity(LoyaltyCardViewActivity.class).create();
+ activityController.start();
+ activityController.visible();
+ activityController.resume();
+
+ Activity activity = (Activity)activityController.get();
+
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", "", "");
+
+ // Complete barcode capture successfully
+ captureBarcodeWithResult(activity, R.id.captureButton, true);
+
+ checkAllFields(activity, ViewMode.ADD_CARD, "", "", BARCODE_DATA, BARCODE_TYPE);
+
+ // Save and check the gift card
+ saveLoyaltyCardWithArguments(activity, "store", "note", true, BARCODE_DATA, BARCODE_TYPE, true);
}
@Test
diff --git a/app/src/test/java/protect/card_locker/ShortcutAddedReceiver.java b/app/src/test/java/protect/card_locker/ShortcutAddedReceiver.java
new file mode 100644
index 000000000..d29c17eac
--- /dev/null
+++ b/app/src/test/java/protect/card_locker/ShortcutAddedReceiver.java
@@ -0,0 +1,39 @@
+package protect.card_locker;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+public class ShortcutAddedReceiver extends BroadcastReceiver
+{
+ public static final String SHORTCUT_ADD_REQUEST = "com.android.launcher.action.INSTALL_SHORTCUT";
+
+ private Intent _request = null;
+
+ @Override
+ public void onReceive(Context context, Intent intent)
+ {
+ _request = intent;
+ }
+
+ public void registerReceiver(Context context)
+ {
+ context.registerReceiver(this, new IntentFilter(SHORTCUT_ADD_REQUEST));
+ }
+
+ public void unregisterReceiver(Context context)
+ {
+ context.unregisterReceiver(this);
+ }
+
+ public Intent lastRequest()
+ {
+ return _request;
+ }
+
+ public void reset()
+ {
+ _request = null;
+ }
+}