@Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_clear) { clear(); return true; } if (item.getItemId() == R.id.menu_export) { mFavoriteManager.export(getActivity(), mFilter); return true; } return super.onOptionsItemSelected(item); }
@Override protected void createOptionsMenu(final Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_search, menu); createSearchView(menu.findItem(R.id.menu_search)); if (getAdapter().getItemCount() > 0) { inflater.inflate(R.menu.menu_favorite, menu); super.createOptionsMenu(menu, inflater); } }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { mFilter = savedInstanceState.getString(STATE_FILTER); mSearchViewExpanded = savedInstanceState.getBoolean(STATE_SEARCH_VIEW_EXPANDED); } else { mFilter = getArguments().getString(EXTRA_FILTER); } }
@Override public void onChanged() { getAdapter().notifyChanged(); if (!isDetached()) { toggleEmptyView(getAdapter().getItemCount() == 0, mFilter); getActivity().invalidateOptionsMenu(); } }
@Test public void testSearchView() { SearchView searchView = (SearchView) actionViewResolver.getActionView(mock(MenuItem.class)); verify(searchView, atLeastOnce()).setOnSearchClickListener(searchViewClickListener.capture()); verify(searchView, atLeastOnce()).setOnCloseListener(searchViewCloseListener.capture()); searchViewClickListener.getAllValues() .get(searchViewClickListener.getAllValues().size() - 1) .onClick(searchView); assertFalse(((FavoriteFragment) fragment).startActionMode(null)); SearchView.OnCloseListener closeListener = searchViewCloseListener.getAllValues() .get(searchViewCloseListener.getAllValues().size() - 1); closeListener.onClose(); assertEquals(2, adapter.getItemCount()); ((FavoriteFragment) fragment).filter("ask"); verify(favoriteManager, times(2)).attach(observerCaptor.capture(), any()); when(favoriteManager.getSize()).thenReturn(1); when(favoriteManager.getItem(eq(0))).thenReturn(new TestFavorite( "2", "http://example.com", "ask HN", System.currentTimeMillis())); observerCaptor.getValue().onChanged(); assertEquals(1, adapter.getItemCount()); reset(searchView); closeListener.onClose(); verify(searchView).setQuery(eq(FavoriteActivity.EMPTY_QUERY), eq(true)); }
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (!intent.hasExtra(SearchManager.QUERY)) { return; } onItemSelected(null); mFilter = intent.getStringExtra(SearchManager.QUERY); if (TextUtils.equals(mFilter, EMPTY_QUERY)) { mFilter = null; } getSupportActionBar().setSubtitle(mFilter); FavoriteFragment fragment = (FavoriteFragment) getSupportFragmentManager() .findFragmentByTag(LIST_FRAGMENT_TAG); if (fragment != null) { fragment.filter(mFilter); } }
private void createSearchView(MenuItem menuSearch) { final SearchView searchView = (SearchView) mActionViewResolver.getActionView(menuSearch); searchView.setQueryHint(getString(R.string.hint_search_saved_stories)); searchView.setSearchableInfo(((SearchManager) getActivity() .getSystemService(Context.SEARCH_SERVICE)) .getSearchableInfo(getActivity().getComponentName())); searchView.setIconified(!mSearchViewExpanded); searchView.setQuery(mFilter, false); searchView.setOnSearchClickListener(v -> { mSearchViewExpanded = true; v.requestFocus(); }); searchView.setOnCloseListener(() -> { // trigger a dummy empty search intent, as empty query does not get submitted searchView.setQuery(FavoriteActivity.EMPTY_QUERY, true); return false; }); }
@Override public boolean startActionMode(ActionMode.Callback callback) { if (mSearchViewExpanded) { return false; } if (mActionMode == null) { mActionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(callback); } return true; }
@Override protected FavoriteRecyclerViewAdapter getAdapter() { if (mAdapter == null) { mAdapter = new FavoriteRecyclerViewAdapter(getContext(), this); } return mAdapter; }
@Override protected void prepareOptionsMenu(Menu menu) { // allow clearing filter if empty, or filter if non-empty menu.findItem(R.id.menu_search).setVisible(!TextUtils.isEmpty(mFilter) || getAdapter().getItemCount() > 0); if (getAdapter().getItemCount() > 0) { super.prepareOptionsMenu(menu); } }
private void clear() { mAlertDialogBuilder .init(getActivity()) .setMessage(R.string.confirm_clear) .setPositiveButton(android.R.string.ok, (dialog, which) -> mFavoriteManager.clear(getActivity(), mFilter)) .setNegativeButton(android.R.string.cancel, null) .create().show(); } }