/* * Copyright (c) 2015 Jonas Kalderstam. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.nononsenseapps.notepad.ui.common; import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.databinding.DataBindingUtil; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.support.v4.widget.SimpleCursorAdapter.ViewBinder; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.SearchView; import android.widget.SearchView.OnQueryTextListener; import com.nononsenseapps.notepad.R; import com.nononsenseapps.notepad.data.model.sql.Task; import com.nononsenseapps.notepad.databinding.FragmentSearchBinding; public class FragmentSearch extends Fragment { public final static String QUERY = "query"; protected SimpleCursorAdapter mAdapter; protected LoaderCallbacks<Cursor> mCallback; protected String mQuery = ""; protected SearchView mSearchView; private FragmentSearchBinding binding; public static FragmentSearch getInstance(final String initialQuery) { FragmentSearch f = new FragmentSearch(); Bundle args = new Bundle(); args.putString(QUERY, initialQuery); f.setArguments(args); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { if (getArguments().containsKey(QUERY)) mQuery = getArguments().getString(QUERY); } setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.fragment_search, menu); // Get the SearchView and set the searchable configuration mSearchView = (SearchView) menu.findItem(R.id.menu_search) .getActionView(); // Assumes current activity is the searchable activity SearchManager searchManager = (SearchManager) getContext().getSystemService(Context.SEARCH_SERVICE); mSearchView.setSearchableInfo(searchManager .getSearchableInfo(getActivity().getComponentName())); mSearchView.setIconifiedByDefault(false); // Do not iconify the widget; // expand it by default mSearchView.setQueryRefinementEnabled(true); mSearchView.setSubmitButtonEnabled(false); // Disable suggestions in search activity mSearchView.setSuggestionsAdapter(null); mSearchView.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextSubmit(final String query) { doSearch(query); return true; } @Override public boolean onQueryTextChange(final String query) { doSearch(query); return true; } }); mSearchView.setQuery(mQuery, false); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_search, container, true); return binding.getRoot(); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setupAdapter(); } void setupAdapter() { mAdapter = getAdapter(); mAdapter.setViewBinder(getViewBinder()); // Set adapter binding.list.setAdapter(mAdapter); binding.list.setOnItemClickListener(getOnItemClickListener()); // Start loading data mCallback = new LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int id, Bundle arg1) { return new CursorLoader(getActivity(), getSearchUri(), getFields(), null, new String[] { mQuery }, getSortOrder()); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor c) { mAdapter.swapCursor(c); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } }; doSearch(mQuery); } protected void doSearch(final String query) { mQuery = query == null ? "" : query; // If not loaded yet, let it load if (mCallback != null) getLoaderManager().restartLoader(0, null, mCallback); } /** * Override to give different search behaviour */ protected Uri getSearchUri() { return Task.URI_SEARCH; } /** * Override to give different search behaviour */ protected String[] getFields() { return Task.Columns.FIELDS; } /** * Override to give different search behaviour */ protected String getSortOrder() { return Task.Columns.TITLE; } /** * Override to get different search behaviour */ protected SimpleCursorAdapter getAdapter() { return new SimpleCursorAdapter(getActivity(), R.layout.tasklist_item_rich, null, new String[] { Task.Columns.TITLE, Task.Columns.NOTE, Task.Columns.DUE, Task.Columns.COMPLETED, Task.Columns.LEFT, Task.Columns.RIGHT }, new int[] { android.R.id.text1, android.R.id.text1, R.id.date, R.id.checkbox, R.id.drag_handle, R.id.drag_padding }, 0); } /** * Override to give different search behaviour */ protected OnItemClickListener getOnItemClickListener() { return new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View origin, int pos, long id) { startActivity(new Intent(Intent.ACTION_EDIT, Task.getUri(id))); } }; } /** * Override to give different search behaviour */ protected ViewBinder getViewBinder() { // Get the global list settings final SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(getActivity()); // Load pref for item height final int rowCount = 3; return new ViewBinder() { String sTemp = ""; @Override public boolean setViewValue(View view, Cursor c, int colIndex) { switch (colIndex) { // Matches order in Task.Columns.Fields case 1: // Title sTemp = c.getString(colIndex); // Set height of text for non-headers if (rowCount == 1) { ((TitleNoteTextView) view).setSingleLine(true); } else { ((TitleNoteTextView) view).setSingleLine(false); ((TitleNoteTextView) view).setMaxLines(rowCount); } // Change color based on complete status ((TitleNoteTextView) view).useSecondaryColor(!c.isNull(3)); ((TitleNoteTextView) view).setTextTitle(sTemp); return true; case 2: // Note // Only if task it not locked if (c.getInt(9) != 1) { ((TitleNoteTextView) view).setTextRest(c .getString(colIndex)); } else { ((TitleNoteTextView) view).setTextRest(""); } return true; default: // Checkbox view.setVisibility(View.GONE); return true; } } }; } }