From c936e3c9c0ff8410c37ac81b5e27df239b31167b Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Sat, 23 Nov 2019 20:27:37 +0100 Subject: [PATCH] Switch to SearchView --- .../protect/card_locker/MainActivity.java | 110 +++++++++++++----- .../res/drawable-hdpi/ic_search_white.png | Bin 0 -> 582 bytes .../res/drawable-mdpi/ic_search_white.png | Bin 0 -> 410 bytes .../res/drawable-xhdpi/ic_search_white.png | Bin 0 -> 783 bytes .../res/drawable-xxhdpi/ic_search_white.png | Bin 0 -> 1292 bytes app/src/main/res/layout/main_activity.xml | 22 +--- app/src/main/res/menu/main_menu.xml | 6 + app/src/main/res/values/strings.xml | 2 +- .../protect/card_locker/MainActivityTest.java | 33 ++---- 9 files changed, 100 insertions(+), 73 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_search_white.png create mode 100644 app/src/main/res/drawable-mdpi/ic_search_white.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_search_white.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_search_white.png diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 5a59eac09..a632e9d95 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -1,6 +1,8 @@ package protect.card_locker; +import android.app.SearchManager; import android.content.ClipData; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.ClipboardManager; @@ -11,6 +13,7 @@ import android.database.Cursor; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; @@ -38,6 +41,7 @@ import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends AppCompatActivity { private static final String TAG = "LoyaltyCardLocker"; + private Menu _menu; @Override protected void onCreate(Bundle savedInstanceState) @@ -47,44 +51,66 @@ public class MainActivity extends AppCompatActivity Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - final EditText filter = findViewById(R.id.menu_filter); - - updateLoyaltyCardList(filter.getText().toString()); + updateLoyaltyCardList(""); SharedPreferences prefs = getSharedPreferences("protect.card_locker", MODE_PRIVATE); if (prefs.getBoolean("firstrun", true)) { startIntro(); prefs.edit().putBoolean("firstrun", false).commit(); } - - final TextWatcher FilterWatcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } - - @Override - public void afterTextChanged(Editable editable) { - updateLoyaltyCardList(editable.toString()); - } - }; - filter.addTextChangedListener(FilterWatcher); } @Override - protected void onResume() - { + protected void onResume() { super.onResume(); - final EditText filter = findViewById(R.id.menu_filter); + String filter = ""; - updateLoyaltyCardList(filter.getText().toString()); + if (_menu != null) + { + SearchView searchView = (SearchView) _menu.findItem(R.id.action_search).getActionView(); + + if (!searchView.isIconified()) { + filter = searchView.getQuery().toString(); + } + } + + updateLoyaltyCardList(filter); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == 1) + { + // We're coming back from another view so clear the search + // We only do this now to prevent a flash of all entries right after picking one + if (_menu != null) + { + MenuItem searchItem = _menu.findItem(R.id.action_search); + searchItem.collapseActionView(); + } + } + } + + @Override + public void onBackPressed() { + if (_menu == null) + { + super.onBackPressed(); + return; + } + + SearchView searchView = (SearchView) _menu.findItem(R.id.action_search).getActionView(); + + if (!searchView.isIconified()) { + searchView.setIconified(true); + } else { + super.onBackPressed(); + } } private void updateLoyaltyCardList(String filterText) { - final EditText filter = findViewById(R.id.menu_filter); final ListView cardList = findViewById(R.id.list); final TextView helpText = findViewById(R.id.helpText); final TextView noMatchingCardsText = findViewById(R.id.noMatchingCardsText); @@ -92,7 +118,6 @@ public class MainActivity extends AppCompatActivity if(db.getLoyaltyCardCount() > 0) { - filter.setVisibility(View.VISIBLE); // We want the cardList to be visible regardless of the filtered match count // to ensure that the noMatchingCardsText doesn't end up being shown below // the keyboard @@ -109,7 +134,6 @@ public class MainActivity extends AppCompatActivity } else { - filter.setVisibility(View.GONE); cardList.setVisibility(View.GONE); helpText.setVisibility(View.VISIBLE); noMatchingCardsText.setVisibility(View.GONE); @@ -138,7 +162,7 @@ public class MainActivity extends AppCompatActivity ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard, i); - startActivity(i); + startActivityForResult(i, 1); } }); } @@ -179,8 +203,36 @@ public class MainActivity extends AppCompatActivity @Override public boolean onCreateOptionsMenu(Menu menu) { + _menu = menu; + getMenuInflater().inflate(R.menu.main_menu, menu); + SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); + SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); + searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); + searchView.setSubmitButtonEnabled(false); + + searchView.setOnCloseListener(new SearchView.OnCloseListener() { + @Override + public boolean onClose() { + invalidateOptionsMenu(); + return false; + } + }); + + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + updateLoyaltyCardList(newText); + return true; + } + }); + return super.onCreateOptionsMenu(menu); } @@ -192,21 +244,21 @@ public class MainActivity extends AppCompatActivity if (id == R.id.action_add) { Intent i = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); - startActivity(i); + startActivityForResult(i, 1); return true; } if(id == R.id.action_import_export) { Intent i = new Intent(getApplicationContext(), ImportExportActivity.class); - startActivity(i); + startActivityForResult(i, 1); return true; } if(id == R.id.action_settings) { Intent i = new Intent(getApplicationContext(), SettingsActivity.class); - startActivity(i); + startActivityForResult(i, 1); return true; } @@ -314,6 +366,6 @@ public class MainActivity extends AppCompatActivity private void startIntro() { Intent intent = new Intent(this, IntroActivity.class); - startActivity(intent); + startActivityForResult(intent, 1); } } \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_search_white.png b/app/src/main/res/drawable-hdpi/ic_search_white.png new file mode 100644 index 0000000000000000000000000000000000000000..b74d89872e9916af2dc07855f053534f20f02baa GIT binary patch literal 582 zcmV-M0=fN(P)Q&!DP^^Maprt4ABt_6d(s#16WrQ$nVoY{7 zS=fOOgYJILw>vvK6U#DY%$PCl?0UVH03Cn_SON}!AH)H_^KeY5XwJU@)_?%;dk1XH zip?p4<4=GIz)#>f1)DPkRPu7Z0odGe@)kmIV;Dy>kCop zRh0rJ949^jU4R`k&jvU+md>B3Jg{^XS%#@Uz){CJboU$;sdCL(`FhGTv?W~YxE&NB zphHq6d+ui7b2yo)BU6A!{&1dk#gHS+>B$s8@0B4JEeo0HEoI~6fz}Y993*FM_f^ZI0USxij>mM&N z%J(9>lvoKYC3b{smS-{7c+mL|P8sp4sv@0o%HeI2aKfUKbfV#&t;G-bcWc*UT~Qkpymi1Qxo8h*TWn zMkH|MBQT(adIe)r@TD;;-zunUdp&5AX;|i$z`LuoO`=Z=N>#K@?3|N-1Zl^*t4Xfc z&$ZM#`ofLq*bPI_4s{=trMFvdLf-k1zCVY&6`RstbC;80r5BROwsXIQlTeYWbU0}; zQs>7?O_H8fqM&G$__q>UP`i|bB)`7oU;A1TM;w2QU#Dd9g{$j4O#lD@07*qoM6N<$ Eg5zPi9smFU literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_search_white.png b/app/src/main/res/drawable-xhdpi/ic_search_white.png new file mode 100644 index 0000000000000000000000000000000000000000..a35ff9349e9f6971045a45c40b5ba26f09da8b5a GIT binary patch literal 783 zcmV+q1MvKbP)qQPxIAq#b(;KD@~Vpl>6ZdxC!Lb_29-H0w+ z2)a>Jg4%qi^gl3x5YF72$GM)9-Wm8|Ks___KaV+Q5(H{$YHDg~YHAj&QmOQSDUb(6 za0MQ~3%COpU=J*VQIPsy68{LcILUGooP$Ns*QtrW<=K92GVyw@!CXhJ2n72DT(+5b zJ-@)aPDuV6C|ORv${9%ep8QKh5+u$(SO-~<0Xg0-Ck==|D{I)-WnYR2d>*`s7$*%j zBE~uey}liI(w?Uku}WpI$uUR3?+_8b`y@bK2$JgjbQ|M#flXoTzhK;#I{z%p{In$> z1wn*E9|YJEf?KtGi#!(mOuD|_-U$a@k7ZvIf&c}V0!#@(&Bx^Lz~Jj1bo+Gpm7+>r z8~$bl!N*()P&5RyAEUnk@MQ3rbtS-+A(-`;eO?%R=3NQ!@Y=H>th#Mi0+{aonV5a< z8GQb5C4i{}=3@4F-_5CQEJ4>zvFfGTE82x<`%HXUk0hWb;(lPnV36G*7R|1R* z0&K+Kt6SJ|r!KF;Dem5yZi6G1ePso)*Id5_7lpv6nbBp*$7gVB@bL&fxE7#~Th}HL zHZ6?*URY)B%AX;~xscXXq1C4`&%BiU4H)!AfE4%bB@w8ZG126Kmlc+M_2mB=_+<2@ z1^4a4TG|Kvq#X#U^Eu(PuVpvz(YU4E$TvbyoMe$NQ%AxLuN<-heu5pa;F}1;+_$&= ztq>)>%RlRXx8j=!z0|iCf^CJH>YnGBFMBTn2Rlx!>oyX9#NPFrZrbjhJTAMyWwicnMD#<;}M%x+UNgFi3PtFDoU4JFyJB3KktMNkn`1QkI= zP!UvwmPE)TS%g2JKS+WZL`Y8Z1`(2%e2oa1#3rw%rlzK*rl!`4{R6s{X^PiGL$m+@ N002ovPDHLkV1nZyY^neN literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_search_white.png b/app/src/main/res/drawable-xxhdpi/ic_search_white.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1207e2c8e0eae34bf7e196f695aa1145da4595 GIT binary patch literal 1292 zcmV+n1@roeP)_^si>UbP+$J`cs`8%@j}0n6%>!b8sVV>2EtP+P5cC*4#m{nmo_fY} z`Q~S*iuD(W!^B?1`Hf&3el|p0Bp&AQ`~)#n3O?V9^3RD&P;P~Xbt;Hq;xaC3-1UAD zTV0NJxCd?$x7zS+;&%G%9Xun7y8vfxC1Z_?2AJ`n{8#zBx#EI1jPNM z`^13)$}xa7I5+1mm(mNHOy##1L7rBGo;rCxJCV#oZinM`28t+Cgs~&lE{M30)m-QJ zd;_w*WE{*J>L9n-03D31X4FKg7=reu4$ zCDZwNT-LJ5xMyYR8tDPuLD%a8Ir|xIve`xhj4*OL6+V!&n)p*A>xhj8nAg12f{$cf z(8xMxqXBdg#;}iM9cDyoWwse0rpdST`bgFujRAIvRkj)6NE2VT`AF7gO*k5}E<>ux zJgS;NqmN{5KtU#3o~qt91Dsi8fCm}_sJlR&xS+zx+M+oFc8GW75H6goVT}R4Sl3a< z2t$W_BRwt0kfKyTJ({uiyB#HZ8X5B=A{mOl#1BX$U5k1GA`@`Ir}upI90T{ zZ=(T%=+Dn)fMwGaCtCl#M#imxt-x?ZwwF8eK|w}WmV9Hg0Xi8k7&Q^%pcHKQE460jX;0l8!pzl+_Ll3=*UkP8MV$5;@jF{`x*@;qcVW_|EO zn4GVdeuS|g&agzJz~B4>=8kL+xB^v8^3a@nf~Kip9@npg&rdM>LMH;Q0qyDA9>z+e z`S8IAHP<{$(0p`uz#EmP1COIf%V-^`_LyGi!zC-_VZAu9Dc~}oOs^wKNwkinN0fSC z%mx%wT98ssk0|ZsIOwg;sTah1V7-%r-D)6?>5p~0Baw&aWNMd;gDNtcbaf|$Fq36^ zOf}Ak(577739XpPx-g*l6b{@bxSey23v|{9H3(5tMO40u^C!~L4*Y$baSlznd^mSu zEU1u%IKvIM{o2|b1Gw#upok!Ds~gOTMlXLmXa(m^MTT|jnZtW-yQBXUqUL+M)o=u( zT$s(rZ>fB~E~Sio)uhL;*j;y&A&t?DcK12lkayAcvJV68pmk&w%>aYBlo9dG_Huu4 zdnaTuNEHrmHJ! zj>H`a#2tw{65PfeO~_6#=Z@6>8IwO6ZpIxYoh|NL;Ev8sbbpIG`uEKr7r$@D9f{j9 zXb2VUjEN@9?gWW;1OkCTAP@)y0)apv5C{YU8}SG6lqXK%BOAE@0000 - + tools:context="protect.card_locker.MainActivity"> - - diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index 5869d9468..537c289bc 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -2,6 +2,12 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="protect.card_locker.MainActivity"> + Loyalty Card Keychain + Search Add - Type to search You don\'t have any loyalty cards at the moment. Click the "+" (plus) button up top to get started.\n\nLoyalty Card Locker lets you carry your loyalty cards on your phone, so they are always within reach. No loyalty cards match the search filter. Please try some different terms. diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index 148355283..6a013a9bd 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -8,6 +8,7 @@ import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Color; import android.os.Bundle; +import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.View; import android.widget.EditText; @@ -51,9 +52,6 @@ public class MainActivityTest Activity activity = Robolectric.setupActivity(MainActivity.class); assertTrue(activity != null); - EditText filter = activity.findViewById(R.id.menu_filter); - assertEquals(View.GONE, filter.getVisibility()); - TextView helpText = activity.findViewById(R.id.helpText); assertEquals(View.VISIBLE, helpText.getVisibility()); @@ -72,9 +70,10 @@ public class MainActivityTest final Menu menu = shadowOf(activity).getOptionsMenu(); assertTrue(menu != null); - // The settings and add button should be present - assertEquals(menu.size(), 5); + // The settings, search and add button should be present + assertEquals(menu.size(), 6); + assertEquals("Search", menu.findItem(R.id.action_search).getTitle().toString()); assertEquals("Add", menu.findItem(R.id.action_add).getTitle().toString()); assertEquals("Import/Export", menu.findItem(R.id.action_import_export).getTitle().toString()); assertEquals("Start Intro", menu.findItem(R.id.action_intro).getTitle().toString()); @@ -104,7 +103,6 @@ public class MainActivityTest activityController.start(); activityController.resume(); - EditText filter = mainActivity.findViewById(R.id.menu_filter); TextView helpText = mainActivity.findViewById(R.id.helpText); TextView noMatchingCardsText = mainActivity.findViewById(R.id.noMatchingCardsText); ListView list = mainActivity.findViewById(R.id.list); @@ -114,7 +112,6 @@ public class MainActivityTest DBHelper db = new DBHelper(mainActivity); db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE); - assertEquals(View.GONE, filter.getVisibility()); assertEquals(View.VISIBLE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.GONE, list.getVisibility()); @@ -122,7 +119,6 @@ public class MainActivityTest activityController.pause(); activityController.resume(); - assertEquals(View.VISIBLE, filter.getVisibility()); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); @@ -141,7 +137,7 @@ public class MainActivityTest activityController.start(); activityController.resume(); - EditText filter = mainActivity.findViewById(R.id.menu_filter); + SearchView searchView = mainActivity.findViewById(R.id.action_search); TextView helpText = mainActivity.findViewById(R.id.helpText); TextView noMatchingCardsText = mainActivity.findViewById(R.id.noMatchingCardsText); ListView list = mainActivity.findViewById(R.id.list); @@ -153,79 +149,72 @@ public class MainActivityTest activityController.pause(); activityController.resume(); - assertEquals(View.VISIBLE, filter.getVisibility()); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); assertEquals(2, list.getCount()); - filter.setText("store"); + searchView.setQuery("store", false); activityController.pause(); activityController.resume(); - assertEquals(View.VISIBLE, filter.getVisibility()); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); assertEquals(2, list.getCount()); - filter.setText("first"); + searchView.setQuery("first", false); activityController.pause(); activityController.resume(); - assertEquals(View.VISIBLE, filter.getVisibility()); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); assertEquals(1, list.getCount()); - filter.setText("initial"); + searchView.setQuery("initial", false); activityController.pause(); activityController.resume(); - assertEquals(View.VISIBLE, filter.getVisibility()); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); assertEquals(1, list.getCount()); - filter.setText("second"); + searchView.setQuery("second", false); activityController.pause(); activityController.resume(); - assertEquals(View.VISIBLE, filter.getVisibility()); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); assertEquals(1, list.getCount()); - filter.setText("company"); + searchView.setQuery("company", false); activityController.pause(); activityController.resume(); - assertEquals(View.VISIBLE, filter.getVisibility()); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.VISIBLE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility()); assertEquals(0, list.getCount()); - filter.setText(""); + searchView.setQuery("", false); activityController.pause(); activityController.resume(); - assertEquals(View.VISIBLE, filter.getVisibility()); assertEquals(View.GONE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); assertEquals(View.VISIBLE, list.getVisibility());