/**
*
*/
package com.gmail.charleszq.picorner.ui.flickr;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.app.Service;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Space;
import android.widget.Toast;
import com.gmail.charleszq.picorner.R;
import com.gmail.charleszq.picorner.model.FlickrTagSearchParameter;
import com.gmail.charleszq.picorner.model.FlickrTagSearchParameter.FlickrTagSearchMode;
import com.gmail.charleszq.picorner.task.IGeneralTaskDoneListener;
import com.gmail.charleszq.picorner.task.flickr.MyFrequentlyUsedTagsTask;
import com.gmail.charleszq.picorner.ui.command.ICommand;
import com.gmail.charleszq.picorner.ui.helper.AbstractHiddenView;
import com.googlecode.flickrjandroid.tags.Tag;
/**
* @author charles(charleszq@gmail.com)
*
*/
public class MyFrequentlyUsedTagsView extends AbstractHiddenView implements
OnItemClickListener {
private ListView mListView;
private Button mCancelButton, mSearchButton;
private TagListAdapter mAdapter;
private Set<String> mSelectedTags = new HashSet<String>();
private SearchView mTagFilter;
private Space mSpace;
private OnClickListener mOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (v == mCancelButton) {
onAction(ACTION_CANCEL);
} else if (v == mSearchButton) {
doSearch(v.getContext());
}
}
};
private SearchView.OnQueryTextListener mQueryTextListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (query == null || query.trim().length() == 0)
return false;
TagFilter filter = new TagFilter(mAdapter);
filter.filter(query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText == null || newText.trim().length() == 0) {
mAdapter.mFilteredTags.clear();
mAdapter.mFilteredTags.addAll(mAdapter.mTags);
mAdapter.notifyDataSetChanged();
return true;
} else
return false;
}
};
/*
* (non-Javadoc)
*
* @see
* com.gmail.charleszq.picorner.ui.helper.IHiddenView#getView(android.content
* .Context)
*/
@Override
public View getView(Context ctx) {
if (mView == null) {
mView = LayoutInflater.from(ctx).inflate(R.layout.tags_list, null);
}
return mView;
}
protected void doSearch(Context context) {
if (mSelectedTags.isEmpty()) {
Toast.makeText(context,
context.getString(R.string.msg_flickr_my_tag_search),
Toast.LENGTH_SHORT).show();
return;
}
FlickrTagSearchParameter param = new FlickrTagSearchParameter();
StringBuilder sb = new StringBuilder();
for (String tag : mSelectedTags) {
sb.append(tag);
sb.append(" "); //$NON-NLS-1$
}
param.setTags(sb.toString().trim());
param.setSearchMode(FlickrTagSearchMode.ANY);
onAction(ACTION_DO, param);
}
@Override
public void init(ICommand<?> command, IHiddenViewActionListener listener) {
super.init(command, listener);
Context ctx = (Context) command.getAdapter(Context.class);
mView = getView(ctx);
// space
mSpace = (Space) mView.findViewById(R.id.my_tags_space);
mSpace.setVisibility(View.VISIBLE);
// list view.
mListView = (ListView) mView.findViewById(R.id.list_f_tags);
View emptyView = mView.findViewById(R.id.empty_friend_view);
mListView.setEmptyView(emptyView);
mAdapter = new TagListAdapter(ctx, mSelectedTags);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
// buttons
mCancelButton = (Button) mView.findViewById(R.id.btn_cancel_search);
mSearchButton = (Button) mView.findViewById(R.id.btn_search);
mCancelButton.setOnClickListener(mOnClickListener);
mSearchButton.setOnClickListener(mOnClickListener);
// filter
mTagFilter = (SearchView) mView.findViewById(R.id.tag_filter);
mTagFilter.setOnQueryTextListener(mQueryTextListener);
mSelectedTags.clear();
// hide the soft keyboard
InputMethodManager imm = (InputMethodManager) ctx
.getSystemService(Service.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mTagFilter.getWindowToken(), 0);
// load tags
loadTags(ctx);
}
private void loadTags(Context ctx) {
MyFrequentlyUsedTagsTask task = new MyFrequentlyUsedTagsTask(ctx);
task.addTaskDoneListener(new IGeneralTaskDoneListener<Collection<Tag>>() {
@Override
public void onTaskDone(Collection<Tag> result) {
if (result == null) {
onAction(ACTION_CANCEL);
return;
}
mAdapter.populateTags(result);
mSpace.setVisibility(View.GONE);
}
});
task.execute();
}
private static class TagListAdapter extends BaseAdapter {
List<Tag> mTags = new ArrayList<Tag>();
List<Tag> mFilteredTags = new ArrayList<Tag>();
private Context mContext;
private Set<String> mSelectedTags;
TagListAdapter(Context context, Set<String> tags) {
this.mContext = context;
mSelectedTags = tags;
}
@Override
public int getCount() {
return mFilteredTags.size();
}
@Override
public Object getItem(int position) {
return mFilteredTags.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null)
v = LayoutInflater.from(mContext).inflate(
R.layout.org_my_flickr_photo_list_item, null);
ImageView image = (ImageView) v.findViewById(R.id.photo_pool_icon);
image.setImageResource(R.drawable.ic_action_tags);
CheckedTextView check = (CheckedTextView) v
.findViewById(android.R.id.text1);
check.setTextColor(mContext.getResources().getColor(
R.color.comment_bg_color));
Tag t = (Tag) getItem(position);
check.setText(t.getValue());
check.setChecked(mSelectedTags.contains(t.getValue()));
return v;
}
void populateTags(Collection<Tag> tags) {
mTags.clear();
mFilteredTags.clear();
mTags.addAll(tags);
Collections.sort(mTags, new Comparator<Tag>() {
@Override
public int compare(Tag lhs, Tag rhs) {
return rhs.getCount() - lhs.getCount();
}
});
mFilteredTags.addAll(mTags);
notifyDataSetChanged();
}
void pushlishResult() {
notifyDataSetChanged();
}
}
private static class TagFilter extends Filter {
private TagListAdapter mAdapter;
TagFilter(TagListAdapter adapter) {
this.mAdapter = adapter;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
mAdapter.mFilteredTags.clear();
String query = constraint.toString().toLowerCase();
for (Tag tag : mAdapter.mTags) {
if (tag.getValue().toLowerCase().contains(query)) {
mAdapter.mFilteredTags.add(tag);
}
}
FilterResults result = new FilterResults();
result.count = mAdapter.mFilteredTags.size();
result.values = mAdapter.mFilteredTags;
return result;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mAdapter.pushlishResult();
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Tag t = (Tag) mAdapter.getItem(position);
if (mSelectedTags.contains(t.getValue())) {
mSelectedTags.remove(t.getValue());
} else {
mSelectedTags.add(t.getValue());
}
mAdapter.notifyDataSetChanged();
}
}