From 23178d969404c945d12f745e5c236e872f4540aa Mon Sep 17 00:00:00 2001 From: Branden Archer Date: Sat, 25 Nov 2017 00:09:42 -0500 Subject: [PATCH] Optionally add shortcut when creating/editing a card When a card is being added or created, a checkbox will now be presented asking if a shortcut should be made. If selected, when saving a shortcut will be added to the home screen. The shortcut will directly launch the given card in view mode. --- app/src/main/AndroidManifest.xml | 5 +- .../card_locker/LoyaltyCardViewActivity.java | 40 ++++++++++++- .../res/layout/loyalty_card_view_activity.xml | 49 +++++++++++++++ app/src/main/res/values/strings.xml | 2 + .../LoyaltyCardViewActivityTest.java | 59 ++++++++++++++++++- .../card_locker/ShortcutAddedReceiver.java | 39 ++++++++++++ 6 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 app/src/test/java/protect/card_locker/ShortcutAddedReceiver.java 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; + } +}