package com.ichi2.anki.dialogs; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.TextView; import com.afollestad.materialdialogs.MaterialDialog; import com.ichi2.anki.R; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; public class CardBrowserMySearchesDialog extends DialogFragment { public static int CARD_BROWSER_MY_SEARCHES_TYPE_LIST = 0; //list searches dialog public static int CARD_BROWSER_MY_SEARCHES_TYPE_SAVE = 1; //save searches dialog public interface MySearchesDialogListener { public void OnSelection(String searchName); public void OnRemoveSearch(String searchName); public void OnSaveSearch(String searchName, String searchTerms); } private static MySearchesDialogListener mMySearchesDialogListener; private MySearchesArrayAdapter mSearchesAdapter; private HashMap<String, String> mSavedFilters; private String mCurrentSearchTerms; public static CardBrowserMySearchesDialog newInstance(HashMap<String, String> savedFilters, MySearchesDialogListener mySearchesDialogListener, String currentSearchTerms, int type) { mMySearchesDialogListener = mySearchesDialogListener; CardBrowserMySearchesDialog m = new CardBrowserMySearchesDialog(); Bundle args = new Bundle(); args.putSerializable("savedFilters", savedFilters); args.putInt("type", type); args.putString("currentSearchTerms", currentSearchTerms); m.setArguments(args); return m; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Resources res = getResources(); Activity activity = getActivity(); final MaterialDialog.Builder builder = new MaterialDialog.Builder(activity); int type = getArguments().getInt("type"); if (type == CARD_BROWSER_MY_SEARCHES_TYPE_LIST) { mSavedFilters = (HashMap<String, String>) getArguments().getSerializable("savedFilters"); mSearchesAdapter = new MySearchesArrayAdapter(activity, new ArrayList<>(mSavedFilters.keySet())); mSearchesAdapter.notifyDataSetChanged(); //so the values are sorted. builder.title(res.getString(R.string.card_browser_list_my_searches_title)) .adapter(mSearchesAdapter, new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { mMySearchesDialogListener.OnSelection(mSearchesAdapter.getItem(which)); dialog.dismiss(); } }); } else if (type == CARD_BROWSER_MY_SEARCHES_TYPE_SAVE) { mCurrentSearchTerms = getArguments().getString("currentSearchTerms"); builder.title(getString(R.string.card_browser_list_my_searches_save)) .positiveText(getString(android.R.string.ok)) .negativeText(getString(R.string.cancel)) .input(R.string.card_browser_list_my_searches_new_name, R.string.empty_string, new MaterialDialog.InputCallback() { @Override public void onInput(MaterialDialog dialog, CharSequence text) { mMySearchesDialogListener.OnSaveSearch(text.toString(), mCurrentSearchTerms); } }); } MaterialDialog dialog = builder.build(); if (dialog.getListView() != null) { dialog.getListView().setDivider(new ColorDrawable(ContextCompat.getColor(activity, R.color.material_grey_600))); dialog.getListView().setDividerHeight(1); //adjust padding to use dp as seen here: http://stackoverflow.com/a/9685690/1332026 float scale = res.getDisplayMetrics().density; int dpAsPixels = (int) (5*scale + 0.5f); dialog.getView().setPadding(dpAsPixels, 0, dpAsPixels, dpAsPixels); } return dialog; } private void removeSearch(final String searchName) { if (mSearchesAdapter.getPosition(searchName) >= 0) { Resources res = getResources(); new MaterialDialog.Builder(getActivity()) .content(res.getString(R.string.card_browser_list_my_searches_remove_content, searchName)) .positiveText(res.getString(android.R.string.ok)) .negativeText(res.getString(R.string.cancel)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { mMySearchesDialogListener.OnRemoveSearch(searchName); mSavedFilters.remove(searchName); mSearchesAdapter.remove(searchName); mSearchesAdapter.notifyDataSetChanged(); dialog.dismiss(); if (mSavedFilters.size() == 0) { getDialog().dismiss(); } } }).show(); } } //using View Holder pattern for faster ListView scrolling. static class ViewHolder { private TextView mSearchName; private TextView mSearchTerms; private ImageButton mRemoveButton; } public class MySearchesArrayAdapter extends ArrayAdapter<String> { private Context mContext; private ArrayList<String> mSavedFiltersNames; public MySearchesArrayAdapter(Context context, ArrayList<String> savedFiltersNames) { super(context, R.layout.card_browser_item_my_searches_dialog, savedFiltersNames); mContext = context; mSavedFiltersNames = savedFiltersNames; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.card_browser_item_my_searches_dialog, parent, false); viewHolder.mSearchName = (TextView) convertView.findViewById(R.id.card_browser_my_search_name_textview); viewHolder.mSearchTerms = (TextView) convertView.findViewById(R.id.card_browser_my_search_terms_textview); viewHolder.mRemoveButton = (ImageButton) convertView.findViewById(R.id.card_browser_my_search_remove_button); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.mSearchName.setText(getItem(position)); viewHolder.mSearchTerms.setText(mSavedFilters.get(getItem(position))); viewHolder.mRemoveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { CardBrowserMySearchesDialog.this.removeSearch(getItem(position)); } }); return convertView; } @Override public void notifyDataSetChanged() { Collections.sort(mSavedFiltersNames, new Comparator<String>() { @Override public int compare(String lhs, String rhs) { return lhs.compareToIgnoreCase(rhs); } }); super.notifyDataSetChanged(); } @Override public boolean areAllItemsEnabled() { return true; } } }