package info.justaway.adapter;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import java.util.ArrayList;
import info.justaway.MainActivity;
import info.justaway.R;
import info.justaway.model.TwitterManager;
import info.justaway.util.MessageUtil;
import twitter4j.ResponseList;
import twitter4j.SavedSearch;
public class SearchAdapter extends ArrayAdapter<String> implements Filterable {
private ArrayList<String> mStrings = new ArrayList<>();
private ArrayList<twitter4j.SavedSearch> mSavedSearches = new ArrayList<>();
private String mSearchWord;
private LayoutInflater mInflater;
private int mLayout;
private Context mContext;
private boolean mSavedMode = false;
public SearchAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
mContext = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mLayout = textViewResourceId;
new SavedSearchesTask().execute();
}
public boolean isSavedMode() {
return mSavedMode;
}
@Override
public String getItem(int position) {
if (mStrings.size() > position) {
return mStrings.get(position);
} else {
return "";
}
}
@Override
public int getCount() {
return mStrings.size();
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// ビューを受け取る
View view = convertView;
if (view == null) {
// 受け取ったビューがnullなら新しくビューを生成
view = mInflater.inflate(this.mLayout, null);
}
assert view != null;
final String word = getItem(position);
((TextView) view.findViewById(R.id.word)).setText(word);
if (mSavedMode) {
final twitter4j.SavedSearch savedSearch = mSavedSearches.get(position);
view.findViewById(R.id.trash).setVisibility(View.VISIBLE);
view.findViewById(R.id.trash).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity activity = (MainActivity) mContext;
activity.cancelSearch();
new AlertDialog.Builder(activity)
.setMessage(String.format(mContext.getString(R.string.confirm_destroy_saved_search), word))
.setPositiveButton(
R.string.button_yes,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new DestroySavedSearchesTask().execute(savedSearch.getId());
mSavedSearches.remove(savedSearch);
mStrings.remove(savedSearch.getQuery());
if (mSavedSearches.size() > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
)
.setNegativeButton(
R.string.button_no,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}
)
.show();
}
});
} else {
view.findViewById(R.id.trash).setVisibility(View.GONE);
}
return view;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
mSavedMode = constraint == null || constraint.length() == 0;
if (mSavedMode) {
mStrings = new ArrayList<>();
for (twitter4j.SavedSearch savedSearche : mSavedSearches) {
mStrings.add(savedSearche.getQuery());
}
} else {
mSearchWord = constraint.toString();
mStrings = new ArrayList<>();
mStrings.add(mSearchWord + mContext.getString(R.string.label_search_tweet));
mStrings.add(mSearchWord + mContext.getString(R.string.label_search_user));
mStrings.add("@" + mSearchWord + mContext.getString(R.string.label_display_profile));
}
filterResults.values = mStrings;
filterResults.count = mStrings.size();
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
@Override
public String convertResultToString(Object resultValue) {
//ここでフィルタリングした値を選択したときに返す値を実装
if (mSavedMode) {
return (String) resultValue;
} else {
return mSearchWord;
}
}
};
}
public void reload() {
new SavedSearchesTask().execute();
}
public class SavedSearchesTask extends AsyncTask<Void, Void, ResponseList<SavedSearch>> {
@Override
protected ResponseList<SavedSearch> doInBackground(Void... params) {
try {
return TwitterManager.getTwitter().getSavedSearches();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(ResponseList<SavedSearch> savedSearches) {
if (savedSearches == null) {
return;
}
mSavedSearches.clear();
for (SavedSearch savedSearch : savedSearches) {
mSavedSearches.add(0, savedSearch);
}
}
}
public class DestroySavedSearchesTask extends AsyncTask<Long, Void, Boolean> {
@Override
protected Boolean doInBackground(Long... params) {
try {
TwitterManager.getTwitter().destroySavedSearch(params[0]);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean success) {
if (success) {
MessageUtil.showToast(R.string.toast_destroy_success);
}
}
}
}