From 55373e82a5a4e1b67fc34db1ea3e165c62e514a9 Mon Sep 17 00:00:00 2001 From: Arshbeer Singh Date: Wed, 4 Nov 2020 01:25:13 -0800 Subject: [PATCH 1/7] Fix Issue #65 --- .../protect/card_locker/MainActivity.java | 164 +++++++++++------- app/src/main/res/drawable/ic_close.xml | 10 ++ app/src/main/res/drawable/ic_copy.xml | 9 + app/src/main/res/drawable/ic_edit.xml | 10 ++ app/src/main/res/drawable/ic_share.xml | 10 ++ app/src/main/res/menu/card_longclick_menu.xml | 15 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 3 + 8 files changed, 163 insertions(+), 59 deletions(-) create mode 100644 app/src/main/res/drawable/ic_close.xml create mode 100644 app/src/main/res/drawable/ic_copy.xml create mode 100644 app/src/main/res/drawable/ic_edit.xml create mode 100644 app/src/main/res/drawable/ic_share.xml diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 433cd9a60..69d86ef42 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -1,11 +1,9 @@ package protect.card_locker; -import android.app.AlertDialog; import android.app.SearchManager; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; @@ -16,10 +14,8 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; import android.util.Log; -import android.view.ContextMenu; import android.view.GestureDetector; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; @@ -27,6 +23,7 @@ import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.view.ActionMode; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.tabs.TabLayout; import java.util.List; @@ -37,11 +34,71 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O { private static final String TAG = "Catima"; + LoyaltyCard card; + private ActionMode currentActionMode; private Menu menu; private GestureDetector gestureDetector; protected String filter = ""; protected int selectedTab = 0; + private ActionMode.Callback currentActionModeCallback = new ActionMode.Callback() + { + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) + { + mode.getMenuInflater().inflate(R.menu.card_longclick_menu, menu); + mode.setTitle(getString(R.string.card_selected) + card.store); + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) + { + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) + { + if (item.getItemId() == R.id.action_copy_to_clipboard) + { + mode.finish(); + ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText(card.store, card.cardId); + clipboard.setPrimaryClip(clip); + Toast.makeText(MainActivity.this, R.string.copy_to_clipboard_toast, Toast.LENGTH_LONG).show(); + return true; + } + else if (item.getItemId() == R.id.action_share) + { + mode.finish(); + final ImportURIHelper importURIHelper = new ImportURIHelper(MainActivity.this); + importURIHelper.startShareIntent(card); + return true; + } + else if(item.getItemId() == R.id.action_edit) + { + mode.finish(); + Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); + Bundle bundle = new Bundle(); + bundle.putInt("id", card.id); + bundle.putBoolean("update", true); + intent.putExtras(bundle); + startActivity(intent); + return true; + } + + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) + { + currentActionMode= null; + } + }; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -126,17 +183,39 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O .show(); } */ + + ListView listView = findViewById(R.id.list); + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() + { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) + { + if (currentActionMode != null) + { + return false; + } + + ListView listView = findViewById(R.id.list); + Cursor cardCursor = (Cursor) listView.getItemAtPosition(position); + card = LoyaltyCard.toLoyaltyCard(cardCursor); + + currentActionMode = startSupportActionMode(currentActionModeCallback); + return true; + } + }); } @Override - protected void onResume() { + protected void onResume() + { super.onResume(); if (menu != null) { SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); - if (!searchView.isIconified()) { + if (!searchView.isIconified()) + { filter = searchView.getQuery().toString(); } } @@ -167,7 +246,8 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O // End of active tab logic FloatingActionButton addButton = findViewById(R.id.fabAdd); - addButton.setOnClickListener(new View.OnClickListener() { + addButton.setOnClickListener(new View.OnClickListener() + { @Override public void onClick(View v) { Intent i = new Intent(getApplicationContext(), ScanActivity.class); @@ -209,7 +289,8 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O } @Override - public void onBackPressed() { + public void onBackPressed() + { if (menu == null) { super.onBackPressed(); @@ -218,7 +299,8 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); - if (!searchView.isIconified()) { + if (!searchView.isIconified()) + { searchView.setIconified(true); } else { TabLayout groupsTabLayout = findViewById(R.id.groups); @@ -332,45 +414,6 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O startActivity(browserIntent); } - @Override - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) - { - super.onCreateContextMenu(menu, v, menuInfo); - if (v.getId()==R.id.list) - { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.card_longclick_menu, menu); - } - } - - @Override - public boolean onContextItemSelected(MenuItem item) - { - AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); - ListView listView = findViewById(R.id.list); - - Cursor cardCursor = (Cursor)listView.getItemAtPosition(info.position); - LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor); - - if(item.getItemId() == R.id.action_clipboard) - { - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText(card.store, card.cardId); - clipboard.setPrimaryClip(clip); - - Toast.makeText(this, R.string.copy_to_clipboard_toast, Toast.LENGTH_LONG).show(); - return true; - } - else if(item.getItemId() == R.id.action_share) - { - final ImportURIHelper importURIHelper = new ImportURIHelper(this); - importURIHelper.startShareIntent(card); - return true; - } - - return super.onContextItemSelected(item); - } - @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -379,27 +422,33 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O getMenuInflater().inflate(R.menu.main_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); - if (searchManager != null) { + if (searchManager != null) + { SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setSubmitButtonEnabled(false); - searchView.setOnCloseListener(new SearchView.OnCloseListener() { + searchView.setOnCloseListener(new SearchView.OnCloseListener() + { @Override - public boolean onClose() { + public boolean onClose() + { invalidateOptionsMenu(); return false; } }); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() + { @Override - public boolean onQueryTextSubmit(String query) { + public boolean onQueryTextSubmit(String query) + { return false; } @Override - public boolean onQueryTextChange(String newText) { + public boolean onQueryTextChange(String newText) + { filter = newText; TabLayout groupsTabLayout = findViewById(R.id.groups); @@ -414,7 +463,6 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O } }); } - return super.onCreateOptionsMenu(menu); } @@ -430,14 +478,14 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O return true; } - if(id == R.id.action_import_export) + if (id == R.id.action_import_export) { Intent i = new Intent(getApplicationContext(), ImportExportActivity.class); startActivityForResult(i, Utils.MAIN_REQUEST); return true; } - if(id == R.id.action_settings) + if (id == R.id.action_settings) { Intent i = new Intent(getApplicationContext(), SettingsActivity.class); startActivityForResult(i, Utils.MAIN_REQUEST); @@ -450,7 +498,7 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O return true; } - if(id == R.id.action_about) + if (id == R.id.action_about) { Intent i = new Intent(getApplicationContext(), AboutActivity.class); startActivityForResult(i, Utils.MAIN_REQUEST); diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml new file mode 100644 index 000000000..874303af5 --- /dev/null +++ b/app/src/main/res/drawable/ic_close.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_copy.xml b/app/src/main/res/drawable/ic_copy.xml new file mode 100644 index 000000000..00d235484 --- /dev/null +++ b/app/src/main/res/drawable/ic_copy.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_edit.xml b/app/src/main/res/drawable/ic_edit.xml new file mode 100644 index 000000000..9d692c216 --- /dev/null +++ b/app/src/main/res/drawable/ic_edit.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_share.xml b/app/src/main/res/drawable/ic_share.xml new file mode 100644 index 000000000..2b7b5f35f --- /dev/null +++ b/app/src/main/res/drawable/ic_share.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/menu/card_longclick_menu.xml b/app/src/main/res/menu/card_longclick_menu.xml index 5ff953855..2e23a87de 100644 --- a/app/src/main/res/menu/card_longclick_menu.xml +++ b/app/src/main/res/menu/card_longclick_menu.xml @@ -3,11 +3,24 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 57f10246e..f1cdcc58c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ Search Add + Selected:\u0020 Click the + plus button to add a card, or import some from the ⋮ menu first. Didn\'t find anything. Try changing your search. diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index fba2c047c..5ad402cd7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -7,6 +7,9 @@ @color/colorPrimaryDark @color/colorSecondary @color/colorSecondary + @color/colorPrimary + true + @drawable/ic_close + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 01c87830f..5bc7daeb5 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,6 +10,8 @@ #ffffff #000000 + #44000000 + #F8F8F8 #FFFFFF #DDDDDD diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index 45c05623b..60fda819d 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -2,4 +2,6 @@ https://github.com/TheLastProject/Catima/releases https://github.com/TheLastProject/Catima + 100 + 50 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1cdcc58c..65fb75a17 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,7 +77,7 @@ Select Barcode Enter the card ID, and either pick its barcode type below, or “This card has no barcode”. - Card ID copied to clipboard + Card ID(s) copied to clipboard Thumbnail for card Favorite star diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index b702ea127..641330c58 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -2,6 +2,10 @@ package protect.card_locker; import android.app.Activity; import android.content.ComponentName; +<<<<<<< HEAD +======= +import android.content.Intent; +>>>>>>> cdd9472 (WIP Issue #14 (and #65)) import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Color; @@ -9,14 +13,19 @@ import android.view.Menu; import android.view.View; import android.widget.ListView; import android.widget.TextView; +<<<<<<< HEAD import com.google.android.material.tabs.TabLayout; import com.google.zxing.BarcodeFormat; +======= +import com.google.zxing.BarcodeFormat; +>>>>>>> cdd9472 (WIP Issue #14 (and #65)) import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +<<<<<<< HEAD import org.robolectric.annotation.Config; import org.robolectric.android.controller.ActivityController; import org.robolectric.shadows.ShadowActivity; @@ -28,6 +37,13 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +======= +import org.robolectric.android.controller.ActivityController; +import org.robolectric.annotation.Config; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +>>>>>>> cdd9472 (WIP Issue #14 (and #65)) import static org.robolectric.Shadows.shadowOf; @RunWith(RobolectricTestRunner.class) @@ -37,10 +53,9 @@ public class MainActivityTest private SharedPreferences prefs; @Test - public void initiallyNoLoyaltyCards() throws Exception - { + public void initiallyNoLoyaltyCards() { Activity activity = Robolectric.setupActivity(MainActivity.class); - assertTrue(activity != null); + assertNotNull(activity); TextView helpText = activity.findViewById(R.id.helpText); assertEquals(View.VISIBLE, helpText.getVisibility()); @@ -53,12 +68,11 @@ public class MainActivityTest } @Test - public void onCreateShouldInflateLayout() throws Exception - { + public void onCreateShouldInflateLayout() { final MainActivity activity = Robolectric.setupActivity(MainActivity.class); final Menu menu = shadowOf(activity).getOptionsMenu(); - assertTrue(menu != null); + assertNotNull(menu); // The settings, import/export, groups, search and add button should be present assertEquals(menu.size(), 6); @@ -251,7 +265,7 @@ public class MainActivityTest assertEquals(2, list.getCount()); - mainActivity.filter = "store"; + mainActivity.mFilter = "store"; activityController.pause(); activityController.resume(); @@ -262,6 +276,7 @@ public class MainActivityTest assertEquals(2, list.getCount()); +<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -284,6 +299,9 @@ public class MainActivityTest assertEquals(2, list.getCount()); mainActivity.filter = "first"; +======= + mainActivity.mFilter = "first"; +>>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); @@ -294,6 +312,7 @@ public class MainActivityTest assertEquals(1, list.getCount()); +<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -316,6 +335,9 @@ public class MainActivityTest assertEquals(1, list.getCount()); mainActivity.filter = "initial"; +======= + mainActivity.mFilter = "initial"; +>>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); @@ -326,6 +348,7 @@ public class MainActivityTest assertEquals(1, list.getCount()); +<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -348,6 +371,9 @@ public class MainActivityTest assertEquals(1, list.getCount()); mainActivity.filter = "second"; +======= + mainActivity.mFilter = "second"; +>>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); @@ -358,6 +384,7 @@ public class MainActivityTest assertEquals(1, list.getCount()); +<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -380,6 +407,9 @@ public class MainActivityTest assertEquals(1, list.getCount()); mainActivity.filter = "company"; +======= + mainActivity.mFilter = "company"; +>>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); @@ -390,6 +420,7 @@ public class MainActivityTest assertEquals(0, list.getCount()); +<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -412,6 +443,9 @@ public class MainActivityTest assertEquals(0, list.getCount()); mainActivity.filter = ""; +======= + mainActivity.mFilter = ""; +>>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); From 45663065f960072dba8a24a109acf2ba984fc5ce Mon Sep 17 00:00:00 2001 From: Arshbeer Singh Date: Tue, 17 Nov 2020 02:14:22 -0800 Subject: [PATCH 3/7] WIP Issue #14 (and #65) Implement Functionality to Copy Multiple Cards --- .../card_locker/CardShortcutConfigure.java | 4 +- .../card_locker/LoyaltyCardCursorAdapter.java | 60 ++++++++++++------- .../protect/card_locker/MainActivity.java | 55 ++++++++++++----- app/src/main/res/values/strings.xml | 2 + 4 files changed, 84 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index 669150996..e34ebccd9 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -21,7 +21,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; /** * The configuration screen for creating a shortcut. */ -public class CardShortcutConfigure extends AppCompatActivity implements LoyaltyCardCursorAdapter.MessageAdapterListener +public class CardShortcutConfigure extends AppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener { static final String TAG = "Catima"; final DBHelper mDb = new DBHelper(this); @@ -92,7 +92,7 @@ public class CardShortcutConfigure extends AppCompatActivity implements LoyaltyC } @Override - public void onMessageRowClicked(int inputPosition) { + public void onRowClicked(int inputPosition) { onClickAction(inputPosition); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 869ece904..2c1dbde17 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -14,11 +14,9 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import org.w3c.dom.Text; - import java.math.BigDecimal; import java.text.DateFormat; -import java.util.Date; +import java.util.ArrayList; import androidx.cardview.widget.CardView; import androidx.constraintlayout.widget.ConstraintLayout; @@ -30,18 +28,20 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter getSelectedItems() + { + + ArrayList result = new ArrayList<>(); + + int i; + for(i = 0; i < mSelectedItems.size(); i++) + { + mCursor.moveToPosition(mSelectedItems.keyAt(i)); + result.add(LoyaltyCard.toLoyaltyCard(mCursor)); + } + + return result; + } + private void resetCurrentIndex() { mCurrentSelectedIndex = -1; } - public interface MessageAdapterListener + public interface CardAdapterListener { void onIconClicked(int inputPosition); - void onMessageRowClicked(int inputPosition); + void onRowClicked(int inputPosition); void onRowLongClicked(int inputPosition); } @@ -259,17 +279,17 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter 1 ? R.string.copy_to_clipboard_multiple_toast : R.string.copy_to_clipboard_toast, Toast.LENGTH_LONG).show(); + inputMode.finish(); return true; } else if (inputItem.getItemId() == R.id.action_share) { +// final ImportURIHelper importURIHelper = new ImportURIHelper(MainActivity.this); +// importURIHelper.startShareIntent(mCard); inputMode.finish(); - final ImportURIHelper importURIHelper = new ImportURIHelper(MainActivity.this); - importURIHelper.startShareIntent(mCard); return true; } else if(inputItem.getItemId() == R.id.action_edit) { - inputMode.finish(); + if (mAdapter.getSelectedItemCount() != 1) { + throw new IllegalArgumentException("Cannot edit more than 1 card at a time"); + } + Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); Bundle bundle = new Bundle(); - bundle.putInt("id", mCard.id); + bundle.putInt("id", mAdapter.getSelectedItems().get(0).id); bundle.putBoolean("update", true); intent.putExtras(bundle); startActivity(intent); + inputMode.finish(); return true; } @@ -327,10 +352,6 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor mCardList.setLayoutManager(mLayoutManager); mCardList.setItemAnimator(new DefaultItemAnimator()); - DividerItemDecoration itemDecorator= new DividerItemDecoration(this, LinearLayoutManager.VERTICAL); - itemDecorator.setDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.list_divider)); - mCardList.addItemDecoration(itemDecorator); - final TextView helpText = findViewById(R.id.helpText); final TextView noMatchingCardsText = findViewById(R.id.noMatchingCardsText); @@ -363,6 +384,10 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor mCardList.setAdapter(mAdapter); registerForContextMenu(mCardList); + + if (mCurrentActionMode != null) { + mCurrentActionMode.finish(); + } } public void updateTabGroups(TabLayout groupsTabLayout) @@ -616,7 +641,7 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor } @Override - public void onMessageRowClicked(int inputPosition) + public void onRowClicked(int inputPosition) { if (mAdapter.getSelectedItemCount() > 0) @@ -625,7 +650,7 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor } else { - Cursor selected = (Cursor) mDB.getLoyaltyCardCursor(); + Cursor selected = mAdapter.getCursor(); selected.moveToPosition(inputPosition); LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(selected); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 65fb75a17..85902a053 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -37,6 +37,7 @@ Scan Card Barcode Card Shortcut Add a card first + Copied Card ID(s) Image of card barcode @@ -174,4 +175,5 @@ Set barcode value This barcode type can\'t yet be displayed. It may be supported in a newer version of the app. The value is not valid for the selected barcode type + Copied card IDs to clipboard From 6421f09eabfb90500feebac464ba9a30ea403c18 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Sun, 18 Apr 2021 13:47:51 +0200 Subject: [PATCH 4/7] Implement multi-copy and multi-share --- .../card_locker/BarcodeSelectorActivity.java | 7 ++-- .../card_locker/BaseCursorAdapter.java | 1 + .../card_locker/CardShortcutConfigure.java | 12 ++---- .../java/protect/card_locker/DBHelper.java | 3 +- .../card_locker/ImportExportActivity.java | 17 ++++---- .../protect/card_locker/ImportExportTask.java | 1 - .../protect/card_locker/ImportURIHelper.java | 31 +++++++++++--- .../card_locker/LoyaltyCardEditActivity.java | 24 +++++------ .../LoyaltyCardLockerApplication.java | 2 +- .../card_locker/LoyaltyCardViewActivity.java | 23 +++++----- .../protect/card_locker/MainActivity.java | 42 ++++++++++--------- .../main/java/protect/card_locker/Utils.java | 17 ++++---- .../importexport/CsvDatabaseImporter.java | 6 --- .../importexport/DatabaseImporter.java | 2 - .../importexport/FidmeImporter.java | 12 ------ .../importexport/MultiFormatExporter.java | 2 - .../importexport/MultiFormatImporter.java | 3 -- .../card_locker/preferences/Settings.java | 4 +- .../preferences/SettingsActivity.java | 10 ++--- app/src/main/res/menu/card_add_menu.xml | 3 +- app/src/main/res/values/strings.xml | 1 + .../card_locker/ImportExportActivityTest.java | 7 ++-- .../protect/card_locker/ImportExportTest.java | 4 +- .../protect/card_locker/ImportURITest.java | 4 +- .../LoyaltyCardCursorAdapterTest.java | 8 ++-- .../LoyaltyCardViewActivityTest.java | 38 +++++++++-------- .../protect/card_locker/MainActivityTest.java | 29 +++++-------- .../java/protect/card_locker/UtilsTest.java | 2 - logo.svg | 19 ++------- 29 files changed, 149 insertions(+), 185 deletions(-) diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java index 2c4b0c9cd..191a6e010 100644 --- a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java @@ -4,9 +4,6 @@ import android.app.Activity; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; @@ -28,6 +25,10 @@ import java.util.Collections; import java.util.LinkedList; import java.util.Map; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + /** * This activity is callable and will allow a user to enter * barcode data and generate all barcodes possible for diff --git a/app/src/main/java/protect/card_locker/BaseCursorAdapter.java b/app/src/main/java/protect/card_locker/BaseCursorAdapter.java index ee80b7c0c..a20041e1d 100644 --- a/app/src/main/java/protect/card_locker/BaseCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/BaseCursorAdapter.java @@ -1,6 +1,7 @@ package protect.card_locker; import android.database.Cursor; + import androidx.recyclerview.widget.RecyclerView; public abstract class BaseCursorAdapter extends RecyclerView.Adapter diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index e34ebccd9..c6a8cee52 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -2,22 +2,18 @@ package protect.card_locker; import android.content.Intent; import android.database.Cursor; -import android.graphics.Bitmap; import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.pm.ShortcutInfoCompat; -import androidx.core.content.pm.ShortcutManagerCompat; -import androidx.core.graphics.drawable.IconCompat; - import android.os.Parcelable; import android.util.Log; import android.view.View; import android.widget.Toast; -import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.RecyclerView; + /** * The configuration screen for creating a shortcut. */ diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 140a786df..bf7ad087a 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -6,14 +6,13 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; -import android.graphics.Color; import com.google.zxing.BarcodeFormat; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Currency; import java.util.Date; -import java.util.ArrayList; import java.util.List; public class DBHelper extends SQLiteOpenHelper diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index 97b243b75..2445605a9 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -8,15 +8,6 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; - -import android.provider.ContactsContract; import android.util.Log; import android.view.MenuItem; import android.view.View; @@ -29,7 +20,13 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; -import java.text.DateFormat; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; public class ImportExportActivity extends AppCompatActivity { diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java index 9ea99c627..8e288b345 100644 --- a/app/src/main/java/protect/card_locker/ImportExportTask.java +++ b/app/src/main/java/protect/card_locker/ImportExportTask.java @@ -8,7 +8,6 @@ import android.util.Log; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index ed2d7f1df..269e91a2e 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -10,6 +10,7 @@ import java.io.InvalidObjectException; import java.math.BigDecimal; import java.util.Currency; import java.util.Date; +import java.util.List; public class ImportURIHelper { private static final String STORE = DBHelper.LoyaltyCardDbIds.STORE; @@ -29,6 +30,7 @@ public class ImportURIHelper { private final String oldHost; private final String oldPath; private final String shareText; + private final String shareMultipleText; public ImportURIHelper(Context context) { this.context = context; @@ -37,6 +39,7 @@ public class ImportURIHelper { oldHost = "brarcher.github.io"; oldPath = "/loyalty-card-locker/share"; shareText = context.getResources().getString(R.string.intent_import_card_from_url_share_text); + shareMultipleText = context.getResources().getString(R.string.intent_import_card_from_url_share_multiple_text); } private boolean isImportUri(Uri uri) { @@ -126,17 +129,33 @@ public class ImportURIHelper { return uriBuilder.build(); } - private void startShareIntent(Uri uri) { + public void startShareIntent(List loyaltyCards) { + int loyaltyCardCount = loyaltyCards.size(); + + StringBuilder text = new StringBuilder(); + if (loyaltyCardCount == 1) { + text.append(shareText); + } else { + text.append(shareMultipleText); + } + text.append("\n\n"); + + for (int i = 0; i < loyaltyCardCount; i++) { + LoyaltyCard loyaltyCard = loyaltyCards.get(i); + + text.append(loyaltyCard.store + ": " + toUri(loyaltyCard)); + + if (i < (loyaltyCardCount - 1)) { + text.append("\n"); + } + } + Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, shareText + "\n" + uri.toString()); + sendIntent.putExtra(Intent.EXTRA_TEXT, text.toString()); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); context.startActivity(shareIntent); } - - public void startShareIntent(LoyaltyCard loyaltyCard) { - startShareIntent(toUri(loyaltyCard)); - } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 7d1430fb8..39ef4424d 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -6,22 +6,10 @@ import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.content.res.TypedArray; -import android.graphics.Bitmap; import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; - -import com.google.android.material.chip.Chip; -import com.google.android.material.chip.ChipGroup; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.snackbar.Snackbar; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import androidx.fragment.app.DialogFragment; - import android.os.LocaleList; import android.text.Editable; import android.text.InputType; @@ -29,7 +17,6 @@ import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.MenuItem; -import android.view.MotionEvent; import android.view.View; import android.view.ViewTreeObserver; import android.view.WindowManager; @@ -42,6 +29,10 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.google.android.material.chip.Chip; +import com.google.android.material.chip.ChipGroup; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayout; import com.google.zxing.BarcodeFormat; import com.jaredrummler.android.colorpicker.ColorPickerDialog; @@ -50,7 +41,6 @@ import com.jaredrummler.android.colorpicker.ColorPickerDialogListener; import java.io.InvalidObjectException; import java.math.BigDecimal; import java.text.DateFormat; -import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; @@ -60,6 +50,12 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.DialogFragment; + public class LoyaltyCardEditActivity extends AppCompatActivity { private static final String TAG = "Catima"; diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java b/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java index 0705435fc..43d950cc0 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java @@ -1,8 +1,8 @@ package protect.card_locker; import android.app.Application; -import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.app.AppCompatDelegate; import protect.card_locker.preferences.Settings; public class LoyaltyCardLockerApplication extends Application { diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 308151e51..28eb59169 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -7,24 +7,12 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.constraintlayout.widget.Guideline; -import androidx.core.graphics.drawable.DrawableCompat; -import androidx.core.widget.TextViewCompat; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.appcompat.widget.Toolbar; - import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; @@ -41,8 +29,17 @@ import com.google.zxing.BarcodeFormat; import java.math.BigDecimal; import java.text.DateFormat; +import java.util.Arrays; import java.util.List; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.appcompat.widget.Toolbar; +import androidx.constraintlayout.widget.Guideline; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.core.widget.TextViewCompat; import protect.card_locker.preferences.Settings; public class LoyaltyCardViewActivity extends AppCompatActivity @@ -491,7 +488,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity break; case R.id.action_share: - importURIHelper.startShareIntent(loyaltyCard); + importURIHelper.startShareIntent(Arrays.asList(loyaltyCard)); return true; case R.id.action_lock_unlock: diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 6278ce259..edb945e3d 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -10,31 +10,27 @@ import android.content.res.Configuration; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.SearchView; -import androidx.appcompat.widget.Toolbar; import android.util.Log; import android.view.GestureDetector; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; -import android.widget.AdapterView; -import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.tabs.TabLayout; + +import java.util.List; + +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.tabs.TabLayout; -import java.util.List; - import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends AppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener @@ -80,12 +76,11 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor } else { StringBuilder cardIds = new StringBuilder(); - - for (int i = 0; i < cardCount - 1; i++) { + for (int i = 0; i < cardCount; i++) { LoyaltyCard loyaltyCard = mAdapter.getSelectedItems().get(i); cardIds.append(loyaltyCard.store + ": " + loyaltyCard.cardId); - if (i != (cardCount - 1)) { + if (i < (cardCount - 1)) { cardIds.append("\n"); } } @@ -101,8 +96,8 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor } else if (inputItem.getItemId() == R.id.action_share) { -// final ImportURIHelper importURIHelper = new ImportURIHelper(MainActivity.this); -// importURIHelper.startShareIntent(mCard); + final ImportURIHelper importURIHelper = new ImportURIHelper(MainActivity.this); + importURIHelper.startShareIntent(mAdapter.getSelectedItems()); inputMode.finish(); return true; } @@ -618,13 +613,20 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor mAdapter.toggleSelection(inputPosition); int count = mAdapter.getSelectedItemCount(); - if (count == 0) - { + if (count == 0) { mCurrentActionMode.finish(); - } else - { + } else { mCurrentActionMode.setTitle("Selected: " + count + " Cards"); + MenuItem editItem = mCurrentActionMode.getMenu().findItem(R.id.action_edit); + if (count == 1) { + editItem.setVisible(true); + editItem.setEnabled(true); + } else { + editItem.setVisible(false); + editItem.setEnabled(false); + } + mCurrentActionMode.invalidate(); } } diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 9f7a91f3b..23690cd00 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -9,6 +9,14 @@ import android.provider.MediaStore; import android.util.Log; import android.widget.Toast; +import com.google.zxing.BinaryBitmap; +import com.google.zxing.LuminanceSource; +import com.google.zxing.MultiFormatReader; +import com.google.zxing.NotFoundException; +import com.google.zxing.RGBLuminanceSource; +import com.google.zxing.Result; +import com.google.zxing.common.HybridBinarizer; + import java.io.IOException; import java.math.BigDecimal; import java.text.NumberFormat; @@ -19,15 +27,6 @@ import java.util.GregorianCalendar; import androidx.core.graphics.ColorUtils; -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.LuminanceSource; -import com.google.zxing.MultiFormatReader; -import com.google.zxing.NotFoundException; -import com.google.zxing.RGBLuminanceSource; -import com.google.zxing.Result; -import com.google.zxing.common.HybridBinarizer; - public class Utils { private static final String TAG = "Catima"; diff --git a/app/src/main/java/protect/card_locker/importexport/CsvDatabaseImporter.java b/app/src/main/java/protect/card_locker/importexport/CsvDatabaseImporter.java index f1aa773e2..6836cb5eb 100644 --- a/app/src/main/java/protect/card_locker/importexport/CsvDatabaseImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CsvDatabaseImporter.java @@ -7,23 +7,17 @@ import com.google.zxing.BarcodeFormat; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; -import org.json.JSONException; import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.math.BigDecimal; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.text.ParseException; import java.util.Currency; import java.util.Date; import java.util.List; -import java.util.zip.ZipFile; import protect.card_locker.DBHelper; import protect.card_locker.FormatException; diff --git a/app/src/main/java/protect/card_locker/importexport/DatabaseImporter.java b/app/src/main/java/protect/card_locker/importexport/DatabaseImporter.java index afb320eda..427b56535 100644 --- a/app/src/main/java/protect/card_locker/importexport/DatabaseImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/DatabaseImporter.java @@ -2,10 +2,8 @@ package protect.card_locker.importexport; import org.json.JSONException; -import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.text.ParseException; import protect.card_locker.DBHelper; diff --git a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java index 05fa9051e..d7a1b84bf 100644 --- a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java @@ -1,33 +1,21 @@ package protect.card_locker.importexport; -import android.annotation.SuppressLint; import android.database.sqlite.SQLiteDatabase; -import android.graphics.Color; import com.google.zxing.BarcodeFormat; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; -import org.json.JSONArray; import org.json.JSONException; -import org.json.JSONObject; -import java.io.BufferedReader; -import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.StringReader; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Currency; -import java.util.Date; -import java.util.TimeZone; import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import protect.card_locker.DBHelper; diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java index fedc446e7..ed0ee525b 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java @@ -7,8 +7,6 @@ import java.io.OutputStreamWriter; import protect.card_locker.DBHelper; import protect.card_locker.DataFormat; -import protect.card_locker.importexport.CsvDatabaseExporter; -import protect.card_locker.importexport.DatabaseExporter; public class MultiFormatExporter { diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java index 4d5324521..187ee03fb 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java @@ -6,14 +6,11 @@ import org.json.JSONException; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.text.ParseException; import protect.card_locker.DBHelper; import protect.card_locker.DataFormat; import protect.card_locker.FormatException; -import protect.card_locker.importexport.CsvDatabaseImporter; -import protect.card_locker.importexport.DatabaseImporter; public class MultiFormatImporter { diff --git a/app/src/main/java/protect/card_locker/preferences/Settings.java b/app/src/main/java/protect/card_locker/preferences/Settings.java index 19836fa59..ede946634 100644 --- a/app/src/main/java/protect/card_locker/preferences/Settings.java +++ b/app/src/main/java/protect/card_locker/preferences/Settings.java @@ -2,11 +2,11 @@ package protect.card_locker.preferences; import android.content.Context; import android.content.SharedPreferences; -import androidx.preference.PreferenceManager; + import androidx.annotation.IntegerRes; import androidx.annotation.StringRes; import androidx.appcompat.app.AppCompatDelegate; - +import androidx.preference.PreferenceManager; import protect.card_locker.R; public class Settings diff --git a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java index 9280f8d5f..c6f7fb776 100644 --- a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java +++ b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java @@ -1,15 +1,15 @@ package protect.card_locker.preferences; import android.os.Bundle; +import android.view.MenuItem; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentActivity; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.app.AppCompatDelegate; -import android.view.MenuItem; - import nl.invissvenska.numberpickerpreference.NumberDialogPreference; import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment; import protect.card_locker.R; diff --git a/app/src/main/res/menu/card_add_menu.xml b/app/src/main/res/menu/card_add_menu.xml index 9eb7100fa..4159f22dd 100644 --- a/app/src/main/res/menu/card_add_menu.xml +++ b/app/src/main/res/menu/card_add_menu.xml @@ -1,4 +1,3 @@ - + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 85902a053..545fad587 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -176,4 +176,5 @@ This barcode type can\'t yet be displayed. It may be supported in a newer version of the app. The value is not valid for the selected barcode type Copied card IDs to clipboard + I want to share some cards with you diff --git a/app/src/test/java/protect/card_locker/ImportExportActivityTest.java b/app/src/test/java/protect/card_locker/ImportExportActivityTest.java index ed75cf130..7b08ccbb7 100644 --- a/app/src/test/java/protect/card_locker/ImportExportActivityTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportActivityTest.java @@ -1,8 +1,5 @@ package protect.card_locker; -import static org.junit.Assert.assertEquals; -import static org.robolectric.Shadows.shadowOf; - import android.app.Activity; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -10,6 +7,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.view.View; + import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; @@ -17,6 +15,9 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import static org.junit.Assert.assertEquals; +import static org.robolectric.Shadows.shadowOf; + @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) public class ImportExportActivityTest diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index f2ef6f387..23c8d3689 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -17,7 +17,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.annotation.LooperMode; -import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -25,13 +24,12 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.text.ParseException; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Currency; import java.util.Date; diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index 93f41ec25..03a259a70 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -3,13 +3,16 @@ 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 java.math.BigDecimal; import java.util.Currency; @@ -18,7 +21,6 @@ import java.util.Date; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static protect.card_locker.DBHelper.LoyaltyCardDbIds; @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index ebf6c89d1..6729c43d6 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -5,10 +5,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Color; -import androidx.preference.PreferenceManager; -import androidx.test.core.app.ApplicationProvider; -import protect.card_locker.preferences.Settings; - import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -27,6 +23,10 @@ import java.text.DateFormat; import java.util.Currency; import java.util.Date; +import androidx.preference.PreferenceManager; +import androidx.test.core.app.ApplicationProvider; +import protect.card_locker.preferences.Settings; + import static org.junit.Assert.assertEquals; @RunWith(RobolectricTestRunner.class) diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index d4761358a..30ecf35f3 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -1,26 +1,18 @@ package protect.card_locker; -import static android.os.Looper.getMainLooper; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.robolectric.Shadows.shadowOf; - import android.app.Activity; import android.app.DatePickerDialog; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; -import androidx.preference.PreferenceManager; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -30,20 +22,13 @@ import android.widget.ImageButton; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; -import androidx.core.widget.TextViewCompat; -import androidx.test.core.app.ApplicationProvider; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.textfield.MaterialAutoCompleteTextView; import com.google.android.material.textfield.TextInputLayout; import com.google.zxing.BarcodeFormat; import com.google.zxing.client.android.Intents; -import java.io.IOException; -import java.math.BigDecimal; -import java.text.DateFormat; -import java.text.ParseException; -import java.util.Currency; -import java.util.Date; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -53,10 +38,27 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.android.controller.ActivityController; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; -import org.robolectric.shadows.ShadowAlertDialog; import org.robolectric.shadows.ShadowDialog; import org.robolectric.shadows.ShadowLog; +import java.io.IOException; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.ParseException; +import java.util.Currency; +import java.util.Date; + +import androidx.core.widget.TextViewCompat; +import androidx.preference.PreferenceManager; +import androidx.test.core.app.ApplicationProvider; + +import static android.os.Looper.getMainLooper; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.robolectric.Shadows.shadowOf; + @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) public class LoyaltyCardViewActivityTest diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index 641330c58..62bfdd000 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -2,10 +2,6 @@ package protect.card_locker; import android.app.Activity; import android.content.ComponentName; -<<<<<<< HEAD -======= -import android.content.Intent; ->>>>>>> cdd9472 (WIP Issue #14 (and #65)) import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Color; @@ -13,21 +9,16 @@ import android.view.Menu; import android.view.View; import android.widget.ListView; import android.widget.TextView; -<<<<<<< HEAD import com.google.android.material.tabs.TabLayout; import com.google.zxing.BarcodeFormat; -======= -import com.google.zxing.BarcodeFormat; ->>>>>>> cdd9472 (WIP Issue #14 (and #65)) import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -<<<<<<< HEAD -import org.robolectric.annotation.Config; import org.robolectric.android.controller.ActivityController; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; import java.math.BigDecimal; @@ -36,16 +27,18 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -======= -import org.robolectric.android.controller.ActivityController; -import org.robolectric.annotation.Config; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; ->>>>>>> cdd9472 (WIP Issue #14 (and #65)) import static org.robolectric.Shadows.shadowOf; +<<<<<<>>>>>>cdd9472(WIP Issue #14(and #65)) + <<<<<<>>>>>>cdd9472(WIP Issue #14(and #65)) + <<<<<<>>>>>>cdd9472(WIP Issue #14(and #65)) + @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) public class MainActivityTest diff --git a/app/src/test/java/protect/card_locker/UtilsTest.java b/app/src/test/java/protect/card_locker/UtilsTest.java index 761633feb..e12ab9133 100644 --- a/app/src/test/java/protect/card_locker/UtilsTest.java +++ b/app/src/test/java/protect/card_locker/UtilsTest.java @@ -5,13 +5,11 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import org.robolectric.util.Util; import java.math.BigDecimal; import java.util.Currency; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) diff --git a/logo.svg b/logo.svg index 9501e0fc3..26ab5100d 100644 --- a/logo.svg +++ b/logo.svg @@ -1,19 +1,8 @@ - + Date: Mon, 26 Apr 2021 19:23:22 +0200 Subject: [PATCH 5/7] Fix unit tests --- .../protect/card_locker/ImportURIHelper.java | 2 +- .../card_locker/LoyaltyCardCursorAdapter.java | 39 +++--- .../protect/card_locker/MainActivity.java | 14 +- .../main/res/layout/loyalty_card_layout.xml | 4 +- .../protect/card_locker/DatabaseTest.java | 2 +- .../protect/card_locker/ImportExportTest.java | 56 +++----- .../protect/card_locker/ImportURITest.java | 2 +- .../LoyaltyCardCursorAdapterTest.java | 49 +++++-- .../LoyaltyCardViewActivityTest.java | 67 +++++---- .../protect/card_locker/MainActivityTest.java | 129 +++++++----------- .../java/protect/card_locker/TestHelpers.java | 18 +++ .../java/protect/card_locker/UtilsTest.java | 1 - 12 files changed, 188 insertions(+), 195 deletions(-) create mode 100644 app/src/test/java/protect/card_locker/TestHelpers.java diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 269e91a2e..3d2f8e481 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -146,7 +146,7 @@ public class ImportURIHelper { text.append(loyaltyCard.store + ": " + toUri(loyaltyCard)); if (i < (loyaltyCardCount - 1)) { - text.append("\n"); + text.append("\n\n"); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 2c1dbde17..617e9a134 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -40,14 +40,13 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter 0) { // We want the cardList to be visible regardless of the filtered match count @@ -359,7 +364,7 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor // the keyboard mCardList.setVisibility(View.VISIBLE); helpText.setVisibility(View.GONE); - if(mDB.getLoyaltyCardCount(filterText) > 0) + if(mAdapter.getItemCount() > 0) { noMatchingCardsText.setVisibility(View.GONE); } @@ -375,11 +380,6 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor noMatchingCardsText.setVisibility(View.GONE); } - mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this); - mCardList.setAdapter(mAdapter); - - registerForContextMenu(mCardList); - if (mCurrentActionMode != null) { mCurrentActionMode.finish(); } diff --git a/app/src/main/res/layout/loyalty_card_layout.xml b/app/src/main/res/layout/loyalty_card_layout.xml index c0f98980b..ff4185b8b 100644 --- a/app/src/main/res/layout/loyalty_card_layout.xml +++ b/app/src/main/res/layout/loyalty_card_layout.xml @@ -44,7 +44,7 @@ android:textSize="@dimen/noteTextSize" /> groupsToGroupNames(List groups) @@ -445,7 +431,7 @@ public class ImportExportTest assertTrue(result); outStream.close(); - clearDatabase(); + TestHelpers.getEmptyDb(activity); ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); @@ -471,7 +457,7 @@ public class ImportExportTest assertEquals(emptyGroup, db.getLoyaltyCardGroups(10)); // Clear the database for the next format under test - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -500,7 +486,7 @@ public class ImportExportTest checkLoyaltyCards(); // Clear the database for the next format under test - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -519,7 +505,7 @@ public class ImportExportTest boolean result = MultiFormatExporter.exportData(db, outStream, DataFormat.Catima); assertTrue(result); - clearDatabase(); + TestHelpers.getEmptyDb(activity); // commons-csv would throw a RuntimeException if an entry was quotes but had // content after. For example: @@ -535,7 +521,7 @@ public class ImportExportTest assertEquals(0, db.getLoyaltyCardCount()); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } } @@ -574,7 +560,7 @@ public class ImportExportTest assertNotNull(listener.success); assertEquals(true, listener.success); - clearDatabase(); + TestHelpers.getEmptyDb(activity); // Import everything back from the default location @@ -597,7 +583,7 @@ public class ImportExportTest checkLoyaltyCards(); // Clear the database for the next format under test - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -633,7 +619,7 @@ public class ImportExportTest assertNull(card.headerColor); assertEquals(0, card.starStatus); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -671,7 +657,7 @@ public class ImportExportTest assertNull(card.headerColor); assertEquals(0, card.starStatus); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -696,7 +682,7 @@ public class ImportExportTest assertEquals(false, result); assertEquals(0, db.getLoyaltyCardCount()); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -734,7 +720,7 @@ public class ImportExportTest assertEquals(1, (long) card.headerColor); assertEquals(0, card.starStatus); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -772,7 +758,7 @@ public class ImportExportTest assertEquals(1, (long) card.headerColor); assertEquals(1, card.starStatus); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -810,7 +796,7 @@ public class ImportExportTest assertEquals(1, (long) card.headerColor); assertEquals(0, card.starStatus); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -867,7 +853,7 @@ public class ImportExportTest assertEquals(1, (long) card.headerColor); assertEquals(0, card.starStatus); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -1024,7 +1010,7 @@ public class ImportExportTest assertEquals(null, card6.headerColor); assertEquals(0, card6.starStatus); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } @Test @@ -1085,6 +1071,6 @@ public class ImportExportTest assertEquals(Color.rgb(128, 0, 128), (long) card.headerColor); assertEquals(0, card.starStatus); - clearDatabase(); + TestHelpers.getEmptyDb(activity); } } diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index 03a259a70..7957f89ce 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -33,7 +33,7 @@ public class ImportURITest { { Activity activity = Robolectric.setupActivity(MainActivity.class); importURIHelper = new ImportURIHelper(activity); - db = new DBHelper(activity); + db = TestHelpers.getEmptyDb(activity); } @Test diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 6729c43d6..9923335b6 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.view.View; import android.widget.ImageView; @@ -17,6 +18,7 @@ import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowLog; import java.math.BigDecimal; import java.text.DateFormat; @@ -24,10 +26,14 @@ import java.util.Currency; import java.util.Date; import androidx.preference.PreferenceManager; -import androidx.test.core.app.ApplicationProvider; +import androidx.recyclerview.widget.RecyclerView; import protect.card_locker.preferences.Settings; +import static android.os.Looper.getMainLooper; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.robolectric.Shadows.shadowOf; @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) @@ -40,8 +46,10 @@ public class LoyaltyCardCursorAdapterTest @Before public void setUp() { + ShadowLog.stream = System.out; + activity = Robolectric.setupActivity(MainActivity.class); - db = new DBHelper(activity); + db = TestHelpers.getEmptyDb(activity); settings = PreferenceManager.getDefaultSharedPreferences(activity); } @@ -54,12 +62,12 @@ public class LoyaltyCardCursorAdapterTest private View createView(Cursor cursor) { - LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(activity.getApplicationContext(), cursor); + LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(activity.getApplicationContext(), cursor, (MainActivity) activity); - View view = adapter.newView(activity.getApplicationContext(), cursor, null); - adapter.bindView(view, activity.getApplicationContext(), cursor); + RecyclerView.ViewHolder viewHolder = adapter.createViewHolder(activity.findViewById(R.id.list), 0); + adapter.bindViewHolder((LoyaltyCardCursorAdapter.LoyaltyCardListItemViewHolder) viewHolder, cursor.getPosition()); - return view; + return viewHolder.itemView; } private void checkView(final View view, final String store, final String note, final String expiry, final String balance, boolean checkFontSizes) @@ -148,7 +156,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapterFontSizes() { - final Context context = ApplicationProvider.getApplicationContext(); + final Context context = activity.getApplicationContext(); Date expiryDate = new Date(); String dateString = context.getString(R.string.expiryStateSentence, DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate)); @@ -173,22 +181,39 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapterStarring() { - db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0); - db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1); - db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1); + assertNotEquals(-1, db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0)); + assertNotEquals(-1, db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1)); + assertNotEquals(-1, db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1)); + + assertEquals(3, db.getLoyaltyCardCount()); Cursor cursor = db.getLoyaltyCardCursor(); + assertEquals(3, cursor.getCount()); + cursor.moveToFirst(); + System.out.println(LoyaltyCard.toLoyaltyCard(cursor).store); + cursor.moveToNext(); + System.out.println(LoyaltyCard.toLoyaltyCard(cursor).store); + cursor.moveToNext(); + System.out.println(LoyaltyCard.toLoyaltyCard(cursor).store); + + assertTrue(cursor.moveToFirst()); + LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor); + assertEquals("storeB", loyaltyCard.store); View view = createView(cursor); ImageView star = view.findViewById(R.id.star); assertEquals(View.VISIBLE, star.getVisibility()); - cursor.moveToNext(); + assertTrue(cursor.moveToNext()); + loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor); + assertEquals("storeC", loyaltyCard.store); view = createView(cursor); star = view.findViewById(R.id.star); assertEquals(View.VISIBLE, star.getVisibility()); - cursor.moveToNext(); + assertTrue(cursor.moveToNext()); + loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor); + assertEquals("storeA", loyaltyCard.store); view = createView(cursor); star = view.findViewById(R.id.star); assertEquals(View.GONE, star.getVisibility()); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 30ecf35f3..ff5aa2193 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -50,7 +50,6 @@ import java.util.Date; import androidx.core.widget.TextViewCompat; import androidx.preference.PreferenceManager; -import androidx.test.core.app.ApplicationProvider; import static android.os.Looper.getMainLooper; import static org.junit.Assert.assertEquals; @@ -330,7 +329,7 @@ public class LoyaltyCardViewActivityTest activityController.resume(); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); + final Context context = activity.getApplicationContext(); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never) , "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),""); } @@ -345,7 +344,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); assertEquals(0, db.getLoyaltyCardCount()); final EditText storeField = activity.findViewById(R.id.storeNameEdit); @@ -390,7 +389,7 @@ public class LoyaltyCardViewActivityTest activityController.resume(); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); + final Context context = activity.getApplicationContext(); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),""); @@ -414,7 +413,7 @@ public class LoyaltyCardViewActivityTest activityController.resume(); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); + final Context context = activity.getApplicationContext(); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), ""); @@ -433,7 +432,7 @@ public class LoyaltyCardViewActivityTest activityController.resume(); LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); + final Context context = activity.getApplicationContext(); checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId),""); @@ -487,8 +486,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); @@ -506,8 +505,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); @@ -525,8 +524,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); @@ -549,8 +548,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); @@ -587,8 +586,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); @@ -620,8 +619,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); @@ -645,8 +644,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); @@ -696,8 +695,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); @@ -737,7 +736,7 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity)activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); @@ -786,7 +785,7 @@ public class LoyaltyCardViewActivityTest ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity)activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); activityController.start(); @@ -806,7 +805,7 @@ public class LoyaltyCardViewActivityTest ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity)activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0); activityController.start(); @@ -825,7 +824,7 @@ public class LoyaltyCardViewActivityTest ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0); activityController.start(); @@ -843,7 +842,7 @@ public class LoyaltyCardViewActivityTest ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0); activityController.start(); @@ -860,8 +859,8 @@ public class LoyaltyCardViewActivityTest public void removeBarcodeFromLoyaltyCard() throws IOException, ParseException { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); - DBHelper db = new DBHelper(activity); + final Context context = activity.getApplicationContext(); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); @@ -891,7 +890,7 @@ public class LoyaltyCardViewActivityTest ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity)activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); final int LARGE_FONT_SIZE = 40; @@ -966,7 +965,7 @@ public class LoyaltyCardViewActivityTest ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK,0); activityController.start(); activityController.visible(); @@ -1001,7 +1000,7 @@ public class LoyaltyCardViewActivityTest ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity)activityController.get(); - DBHelper db = new DBHelper(activity); + DBHelper db = TestHelpers.getEmptyDb(activity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); activityController.start(); @@ -1112,7 +1111,7 @@ public class LoyaltyCardViewActivityTest activityController.resume(); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); + final Context context = activity.getApplicationContext(); shadowOf(getMainLooper()).idle(); @@ -1135,7 +1134,7 @@ public class LoyaltyCardViewActivityTest activityController.resume(); Activity activity = (Activity)activityController.get(); - final Context context = ApplicationProvider.getApplicationContext(); + final Context context = activity.getApplicationContext(); checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", null, "AZTEC"); assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor()); diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index 62bfdd000..09f9b4a87 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -20,25 +20,19 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.android.controller.ActivityController; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; +import org.w3c.dom.Text; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import androidx.recyclerview.widget.RecyclerView; + +import static android.os.Looper.getMainLooper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.robolectric.Shadows.shadowOf; -<<<<<<>>>>>>cdd9472(WIP Issue #14(and #65)) - <<<<<<>>>>>>cdd9472(WIP Issue #14(and #65)) - <<<<<<>>>>>>cdd9472(WIP Issue #14(and #65)) - @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) public class MainActivityTest @@ -56,7 +50,7 @@ public class MainActivityTest TextView noMatchingCardsText = activity.findViewById(R.id.noMatchingCardsText); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); - ListView list = activity.findViewById(R.id.list); + RecyclerView list = activity.findViewById(R.id.list); assertEquals(View.GONE, list.getVisibility()); } @@ -99,11 +93,11 @@ public class MainActivityTest TextView helpText = mainActivity.findViewById(R.id.helpText); TextView noMatchingCardsText = mainActivity.findViewById(R.id.noMatchingCardsText); - ListView list = mainActivity.findViewById(R.id.list); + RecyclerView list = mainActivity.findViewById(R.id.list); - assertEquals(0, list.getCount()); + assertEquals(0, list.getAdapter().getItemCount()); - DBHelper db = new DBHelper(mainActivity); + DBHelper db = TestHelpers.getEmptyDb(mainActivity); db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0); assertEquals(View.VISIBLE, helpText.getVisibility()); @@ -117,9 +111,7 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getAdapter().getCount()); - Cursor cursor = (Cursor)list.getAdapter().getItem(0); - assertNotNull(cursor); + assertEquals(1, list.getAdapter().getItemCount()); db.close(); } @@ -132,14 +124,15 @@ public class MainActivityTest Activity mainActivity = (Activity)activityController.get(); activityController.start(); activityController.resume(); + activityController.visible(); TextView helpText = mainActivity.findViewById(R.id.helpText); TextView noMatchingCardsText = mainActivity.findViewById(R.id.noMatchingCardsText); - ListView list = mainActivity.findViewById(R.id.list); + RecyclerView list = mainActivity.findViewById(R.id.list); - assertEquals(0, list.getCount()); + assertEquals(0, list.getAdapter().getItemCount()); - DBHelper db = new DBHelper(mainActivity); + DBHelper db = TestHelpers.getEmptyDb(mainActivity); db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0); db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0); db.insertLoyaltyCard("storeD", "note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 1); @@ -151,27 +144,17 @@ public class MainActivityTest activityController.pause(); activityController.resume(); + activityController.visible(); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(4, list.getAdapter().getCount()); - Cursor cursor = (Cursor)list.getAdapter().getItem(0); - assertNotNull(cursor); - assertEquals("storeC",cursor.getString(cursor.getColumnIndex("store"))); - - cursor = (Cursor)list.getAdapter().getItem(1); - assertNotNull(cursor); - assertEquals("storeD",cursor.getString(cursor.getColumnIndex("store"))); - - cursor = (Cursor)list.getAdapter().getItem(2); - assertNotNull(cursor); - assertEquals("storeA",cursor.getString(cursor.getColumnIndex("store"))); - - cursor = (Cursor)list.getAdapter().getItem(3); - assertNotNull(cursor); - assertEquals("storeB",cursor.getString(cursor.getColumnIndex("store"))); + assertEquals(4, list.getAdapter().getItemCount()); + assertEquals("storeC", ((TextView) list.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.store)).getText()); + assertEquals("storeD", ((TextView) list.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.store)).getText()); + assertEquals("storeA", ((TextView) list.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.store)).getText()); + assertEquals("storeB", ((TextView) list.findViewHolderForAdapterPosition(3).itemView.findViewById(R.id.store)).getText()); db.close(); } @@ -185,7 +168,7 @@ public class MainActivityTest activityController.start(); activityController.resume(); - DBHelper db = new DBHelper(mainActivity); + DBHelper db = TestHelpers.getEmptyDb(mainActivity); TabLayout groupTabs = mainActivity.findViewById(R.id.groups); @@ -237,10 +220,10 @@ public class MainActivityTest TextView helpText = mainActivity.findViewById(R.id.helpText); TextView noMatchingCardsText = mainActivity.findViewById(R.id.noMatchingCardsText); - ListView list = mainActivity.findViewById(R.id.list); + RecyclerView list = mainActivity.findViewById(R.id.list); TabLayout groupTabs = mainActivity.findViewById(R.id.groups); - DBHelper db = new DBHelper(mainActivity); + DBHelper db = TestHelpers.getEmptyDb(mainActivity); db.insertLoyaltyCard("The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0); db.insertLoyaltyCard("The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, BarcodeFormat.UPC_A, Color.BLACK, 0); @@ -256,7 +239,7 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(2, list.getCount()); + assertEquals(2, list.getAdapter().getItemCount()); mainActivity.mFilter = "store"; @@ -267,9 +250,8 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(2, list.getCount()); + assertEquals(2, list.getAdapter().getItemCount()); -<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -280,7 +262,7 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); // Switch back to all groups groupTabs.selectTab(groupTabs.getTabAt(0)); @@ -289,12 +271,9 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(2, list.getCount()); + assertEquals(2, list.getAdapter().getItemCount()); - mainActivity.filter = "first"; -======= mainActivity.mFilter = "first"; ->>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); @@ -303,9 +282,8 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); -<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -316,7 +294,7 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); // Switch back to all groups groupTabs.selectTab(groupTabs.getTabAt(0)); @@ -325,12 +303,9 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); - mainActivity.filter = "initial"; -======= mainActivity.mFilter = "initial"; ->>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); @@ -339,9 +314,8 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); -<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -352,7 +326,7 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); // Switch back to all groups groupTabs.selectTab(groupTabs.getTabAt(0)); @@ -361,12 +335,9 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); - mainActivity.filter = "second"; -======= mainActivity.mFilter = "second"; ->>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); @@ -375,20 +346,21 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); -<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); activityController.pause(); activityController.resume(); + shadowOf(getMainLooper()).idle(); + assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.VISIBLE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(0, list.getCount()); + assertEquals(0, list.getAdapter().getItemCount()); // Switch back to all groups groupTabs.selectTab(groupTabs.getTabAt(0)); @@ -397,34 +369,34 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); - mainActivity.filter = "company"; -======= mainActivity.mFilter = "company"; ->>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); + shadowOf(getMainLooper()).idle(); + assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.VISIBLE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(0, list.getCount()); + assertEquals(0, list.getAdapter().getItemCount()); -<<<<<<< HEAD // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); activityController.pause(); activityController.resume(); + shadowOf(getMainLooper()).idle(); + assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.VISIBLE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(0, list.getCount()); + assertEquals(0, list.getAdapter().getItemCount()); // Switch back to all groups groupTabs.selectTab(groupTabs.getTabAt(0)); @@ -433,21 +405,20 @@ public class MainActivityTest assertEquals(View.VISIBLE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(0, list.getCount()); + assertEquals(0, list.getAdapter().getItemCount()); - mainActivity.filter = ""; -======= mainActivity.mFilter = ""; ->>>>>>> cdd9472 (WIP Issue #14 (and #65)) activityController.pause(); activityController.resume(); + shadowOf(getMainLooper()).idle(); + assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(2, list.getCount()); + assertEquals(2, list.getAdapter().getItemCount()); // Switch to Group one groupTabs.selectTab(groupTabs.getTabAt(1)); @@ -455,11 +426,13 @@ public class MainActivityTest activityController.pause(); activityController.resume(); + shadowOf(getMainLooper()).idle(); + assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(1, list.getCount()); + assertEquals(1, list.getAdapter().getItemCount()); // Switch back to all groups groupTabs.selectTab(groupTabs.getTabAt(0)); @@ -468,7 +441,7 @@ public class MainActivityTest assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); - assertEquals(2, list.getCount()); + assertEquals(2, list.getAdapter().getItemCount()); db.close(); } diff --git a/app/src/test/java/protect/card_locker/TestHelpers.java b/app/src/test/java/protect/card_locker/TestHelpers.java new file mode 100644 index 000000000..cccca7bc6 --- /dev/null +++ b/app/src/test/java/protect/card_locker/TestHelpers.java @@ -0,0 +1,18 @@ +package protect.card_locker; + +import android.app.Activity; +import android.database.sqlite.SQLiteDatabase; + +public class TestHelpers { + static public DBHelper getEmptyDb(Activity activity) { + DBHelper db = new DBHelper(activity); + // Make sure DB is empty + SQLiteDatabase database = db.getWritableDatabase(); + database.execSQL("delete from " + DBHelper.LoyaltyCardDbIds.TABLE); + database.execSQL("delete from " + DBHelper.LoyaltyCardDbGroups.TABLE); + database.execSQL("delete from " + DBHelper.LoyaltyCardDbIdsGroups.TABLE); + database.close(); + + return db; + } +} diff --git a/app/src/test/java/protect/card_locker/UtilsTest.java b/app/src/test/java/protect/card_locker/UtilsTest.java index e12ab9133..53e4d76ca 100644 --- a/app/src/test/java/protect/card_locker/UtilsTest.java +++ b/app/src/test/java/protect/card_locker/UtilsTest.java @@ -1,6 +1,5 @@ package protect.card_locker; - import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; From 6dc8490b5ecdee9fbc9c8a4a95f15e9a4a5f68f7 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Mon, 26 Apr 2021 19:27:28 +0200 Subject: [PATCH 6/7] Fix lint --- app/src/main/res/layout/loyalty_card_layout.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/loyalty_card_layout.xml b/app/src/main/res/layout/loyalty_card_layout.xml index ff4185b8b..aad759f5c 100644 --- a/app/src/main/res/layout/loyalty_card_layout.xml +++ b/app/src/main/res/layout/loyalty_card_layout.xml @@ -94,7 +94,7 @@ android:layout_height="@dimen/cardThumbnailSize" android:layout_centerHorizontal="true" android:contentDescription="@string/thumbnailDescription" - android:src="@drawable/ic_done" /> + app:srcCompat="@drawable/ic_done" /> From cbbb434aae1679d8b2c475a53bf7f9a93dc7cc2a Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Mon, 26 Apr 2021 20:01:31 +0200 Subject: [PATCH 7/7] spotBugs --- .../java/protect/card_locker/LoyaltyCardCursorAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 617e9a134..f3b0f3f7d 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -21,12 +21,11 @@ import java.util.ArrayList; import androidx.cardview.widget.CardView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.RecyclerView; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import protect.card_locker.preferences.Settings; public class LoyaltyCardCursorAdapter extends BaseCursorAdapter { - Settings settings; - private static int mCurrentSelectedIndex = -1; private Cursor mCursor; Settings mSettings; @@ -204,6 +203,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter