package com.buddycloud.fragments.adapter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import com.actionbarsherlock.view.ActionMode;
import com.actionbarsherlock.view.ActionMode.Callback;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.buddycloud.R;
import com.buddycloud.fragments.GenericSelectableChannelsFragment;
public abstract class SelectableChannelAdapter extends GenericChannelAdapter {
private static final int CHILD_PADDING = 4;
private Map<String, JSONObject> selection = new HashMap<String, JSONObject>();
private ActionMode mActionMode;
private GenericSelectableChannelsFragment fragment;
private View parentView;
@Override
public void configure(GenericSelectableChannelsFragment fragment, View view) {
this.fragment = fragment;
this.parentView = view;
super.configure(fragment, view);
}
protected void hideProgress() {
parentView.findViewById(R.id.channelListProgress).setVisibility(View.GONE);
}
protected void showProgress() {
parentView.findViewById(R.id.channelListProgress).setVisibility(View.VISIBLE);
}
private Callback createActionModeCallback(final ViewGroup viewGroup) {
return new ActionMode.Callback() {
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
SelectableChannelAdapter.this.onCreateActionMode(mode, menu);
return true;
}
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Context context = viewGroup.getContext();
onActionMenuClicked(context, item);
mode.finish();
return true;
}
public void onDestroyActionMode(ActionMode mode) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
viewGroup.getChildAt(i).setSelected(false);
}
selection.clear();
mActionMode = null;
}
};
}
@Override
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, final ViewGroup viewGroup) {
final View childView = super.getChildView(groupPosition, childPosition, isLastChild,
convertView, viewGroup);
if (!canSelect()) {
return childView;
}
childView.setPadding(CHILD_PADDING, CHILD_PADDING,
CHILD_PADDING, CHILD_PADDING);
childView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
JSONObject channelItem = getChild(groupPosition, childPosition);
if (mActionMode == null) {
Callback actionModeCallback = createActionModeCallback(viewGroup);
mActionMode = fragment.getSherlockActivity().startActionMode(actionModeCallback);
}
String jid = channelItem.optString("jid");
boolean mustSelect = !selection.containsKey(jid);
if (mustSelect) {
selection.put(jid, channelItem);
} else {
selection.remove(jid);
if (selection.isEmpty()) {
mActionMode.finish();
}
}
childView.setSelected(mustSelect);
return true;
}
});
childView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
JSONObject channelItem = getChild(groupPosition, childPosition);
fragment.selectChannel(channelItem.optString("jid"));
}
});
return childView;
}
protected Collection<JSONObject> getSelection() {
return selection.values();
}
protected void finishActionMode() {
if (mActionMode != null) {
mActionMode.finish();
}
}
protected abstract boolean canSelect();
protected abstract void onCreateActionMode(ActionMode mode, Menu menu);
protected abstract void onActionMenuClicked(Context context, MenuItem item);
}