package org.wikipedia.search;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import org.wikipedia.R;
import org.wikipedia.WikipediaApp;
import org.wikipedia.database.contract.SearchHistoryContract;
import org.wikipedia.util.FeedbackUtil;
import static org.wikipedia.Constants.RECENT_SEARCHES_FRAGMENT_LOADER_ID;
/** Displays a list of recent searches */
public class RecentSearchesFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
public interface Parent {
void switchToSearch(@NonNull String text);
}
private Parent parentFragment;
private View container;
private ListView recentSearchesList;
private RecentSearchesAdapter adapter;
private ImageView deleteButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_search_recent, container, false);
parentFragment = (Parent) getParentFragment();
this.container = rootView.findViewById(R.id.recent_searches_container);
recentSearchesList = (ListView) rootView.findViewById(R.id.recent_searches_list);
deleteButton = (ImageView) rootView.findViewById(R.id.recent_searches_delete_button);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new AlertDialog.Builder(getContext())
.setMessage(getString(R.string.clear_recent_searches_confirm))
.setPositiveButton(
getString(R.string.yes),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
new DeleteAllRecentSearchesTask(WikipediaApp.getInstance()).execute();
}
})
.setNegativeButton(getString(R.string.no), null)
.create().show();
}
});
FeedbackUtil.setToolbarButtonLongPressToast(deleteButton);
return rootView;
}
public void show() {
container.setVisibility(View.VISIBLE);
}
public void hide() {
container.setVisibility(View.GONE);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
adapter = new RecentSearchesAdapter(getContext(), null, true);
recentSearchesList.setAdapter(adapter);
recentSearchesList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
RecentSearch entry = (RecentSearch) view.getTag();
parentFragment.switchToSearch(entry.getText());
}
});
LoaderManager supportLoaderManager = getLoaderManager();
supportLoaderManager.initLoader(RECENT_SEARCHES_FRAGMENT_LOADER_ID, null, this);
supportLoaderManager.restartLoader(RECENT_SEARCHES_FRAGMENT_LOADER_ID, null, this);
}
@Override
public void onDestroyView() {
getLoaderManager().destroyLoader(RECENT_SEARCHES_FRAGMENT_LOADER_ID);
super.onDestroyView();
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
Uri uri = SearchHistoryContract.Query.URI;
final String[] projection = null;
final String selection = null;
final String[] selectionArgs = null;
String order = SearchHistoryContract.Query.ORDER_MRU;
return new CursorLoader(getContext(), uri, projection, selection, selectionArgs, order);
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoaderLoader, Cursor cursorLoader) {
if (!isAdded()) {
return;
}
adapter.swapCursor(cursorLoader);
boolean visible = recentSearchesList.getCount() > 0;
deleteButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoaderLoader) {
adapter.changeCursor(null);
}
public void updateList() {
adapter.notifyDataSetChanged();
}
private class RecentSearchesAdapter extends CursorAdapter {
RecentSearchesAdapter(Context context, Cursor c, boolean autoRequery) {
super(context, c, autoRequery);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return LayoutInflater.from(getActivity()).inflate(R.layout.item_search_recent, viewGroup, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView textView = (TextView) view.findViewById(R.id.text1);
RecentSearch entry = getEntry(cursor);
textView.setText(entry.getText());
view.setTag(entry);
}
@Override
public CharSequence convertToString(Cursor cursor) {
return getEntry(cursor).getText();
}
public RecentSearch getEntry(Cursor cursor) {
return RecentSearch.DATABASE_TABLE.fromCursor(cursor);
}
}
}