blob: 44228bb581236253c2f42e0649223557669581f1 [file] [log] [blame]
package org.wordpress.android.ui.reader.adapters;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.CursorAdapter;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import org.wordpress.android.R;
import org.wordpress.android.datasets.ReaderSearchTable;
public class ReaderSearchSuggestionAdapter extends CursorAdapter {
private static final int MAX_SUGGESTIONS = 5;
private static final int CLEAR_ALL_ROW_ID = -1;
private static final int NUM_VIEW_TYPES = 2;
private static final int VIEW_TYPE_QUERY = 0;
private static final int VIEW_TYPE_CLEAR = 1;
private String mCurrentFilter;
private final Object[] mClearAllRow;
private final int mClearAllBgColor;
private final int mSuggestionBgColor;
public ReaderSearchSuggestionAdapter(Context context) {
super(context, null, false);
String clearAllText = context.getString(R.string.label_clear_search_history);
mClearAllRow = new Object[]{CLEAR_ALL_ROW_ID, clearAllText};
mClearAllBgColor = ContextCompat.getColor(context, R.color.grey_lighten_30);
mSuggestionBgColor = ContextCompat.getColor(context, R.color.filtered_list_suggestions);
}
public void setFilter(String filter) {
// skip if unchanged
if (isCurrentFilter(filter) && getCursor() != null) {
return;
}
// get db cursor containing matching query strings
Cursor sqlCursor = ReaderSearchTable.getQueryStringCursor(filter, MAX_SUGGESTIONS);
// create a MatrixCursor which will be the actual cursor behind this adapter
MatrixCursor matrixCursor = new MatrixCursor(
new String[]{
ReaderSearchTable.COL_ID,
ReaderSearchTable.COL_QUERY});
if (sqlCursor.moveToFirst()) {
// first populate the matrix from the db cursor...
do {
long id = sqlCursor.getLong(sqlCursor.getColumnIndex(ReaderSearchTable.COL_ID));
String query = sqlCursor.getString(sqlCursor.getColumnIndex(ReaderSearchTable.COL_QUERY));
matrixCursor.addRow(new Object[]{id, query});
} while (sqlCursor.moveToNext());
// ...then add our custom item
matrixCursor.addRow(mClearAllRow);
}
mCurrentFilter = filter;
swapCursor(matrixCursor);
}
/*
* forces setFilter() to always repopulate by skipping the isCurrentFilter() check
*/
private void reload() {
String newFilter = mCurrentFilter;
mCurrentFilter = null;
setFilter(newFilter);
}
private boolean isCurrentFilter(String filter) {
if (TextUtils.isEmpty(filter) && TextUtils.isEmpty(mCurrentFilter)) {
return true;
}
return filter != null && filter.equalsIgnoreCase(mCurrentFilter);
}
public String getSuggestion(int position) {
Cursor cursor = (Cursor) getItem(position);
if (cursor != null) {
return cursor.getString(cursor.getColumnIndex(ReaderSearchTable.COL_QUERY));
} else {
return null;
}
}
@Override
public int getItemViewType(int position) {
// use a different view type for the "clear" row so it doesn't get recycled and used
// as a query row
if (getItemId(position) == CLEAR_ALL_ROW_ID) {
return VIEW_TYPE_CLEAR;
}
return VIEW_TYPE_QUERY;
}
@Override
public int getViewTypeCount() {
return NUM_VIEW_TYPES;
}
private class SuggestionViewHolder {
private final TextView txtSuggestion;
private final ImageView imgDelete;
SuggestionViewHolder(View view) {
txtSuggestion = (TextView) view.findViewById(R.id.text_suggestion);
imgDelete = (ImageView) view.findViewById(R.id.image_delete);
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = LayoutInflater.from(context).inflate(R.layout.reader_listitem_suggestion, parent, false);
SuggestionViewHolder holder = new SuggestionViewHolder(view);
view.setTag(holder);
long id = cursor.getLong(cursor.getColumnIndex(ReaderSearchTable.COL_ID));
if (id == CLEAR_ALL_ROW_ID) {
view.setBackgroundColor(mClearAllBgColor);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
confirmClearSavedSearches(v.getContext());
}
});
holder.imgDelete.setVisibility(View.GONE);
} else {
view.setBackgroundColor(mSuggestionBgColor);
}
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
SuggestionViewHolder holder = (SuggestionViewHolder) view.getTag();
final String query = cursor.getString(cursor.getColumnIndex(ReaderSearchTable.COL_QUERY));
holder.txtSuggestion.setText(query);
long id = cursor.getLong(cursor.getColumnIndex(ReaderSearchTable.COL_ID));
if (id != CLEAR_ALL_ROW_ID) {
holder.imgDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ReaderSearchTable.deleteQueryString(query);
reload();
}
});
}
}
private void confirmClearSavedSearches(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.dlg_confirm_clear_search_history)
.setCancelable(true)
.setNegativeButton(R.string.no, null)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
clearSavedSearches();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private void clearSavedSearches() {
ReaderSearchTable.deleteAllQueries();
swapCursor(null);
}
}