package ar.rulosoft.mimanganu.adapters;
import android.content.SharedPreferences;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.RecyclerView;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import ar.rulosoft.mimanganu.R;
import ar.rulosoft.mimanganu.servers.ServerBase;
public class ServerRecAdapter extends RecyclerView.Adapter<ServerRecAdapter.ServerViewHolder> implements ActionMode.Callback {
private SharedPreferences pm;
private FragmentActivity mActivity;
private OnServerClickListener onServerClickListener;
private ServerBase[] servers;
private List<Integer> unused_servers;
private SparseBooleanArray selectedItems = new SparseBooleanArray();
public ActionMode actionMode;
private OnEndActionModeListener endActionModeListener;
public ServerRecAdapter(ServerBase[] serverBases, SharedPreferences pm, FragmentActivity mActivity) {
this.servers = serverBases;
this.pm = pm;
this.mActivity = mActivity;
unused_servers = stringToIntList(pm.getString("unused_servers", ""));
}
public void setOnServerClickListener(OnServerClickListener onServerClickListener) {
this.onServerClickListener = onServerClickListener;
}
public ServerBase getItem(int pos) {
return servers[0];
}
@Override
public int getItemCount() {
return servers.length;
}
@Override
public void onBindViewHolder(ServerViewHolder sHolder, final int pos) {
final ServerBase server = servers[pos];
sHolder.flag.setImageResource(server.getFlag());
sHolder.icon.setImageResource(server.getIcon());
sHolder.title.setText(server.getServerName());
sHolder.v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (actionMode == null) {
if (onServerClickListener != null)
onServerClickListener.onServerClick(server);
} else {
toggleSelection(pos);
}
}
});
RecyclerView.LayoutParams param = (RecyclerView.LayoutParams) sHolder.v.getLayoutParams();
if (!unused_servers.contains(server.getServerID()) || actionMode != null) {
param.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
param.width = RelativeLayout.LayoutParams.MATCH_PARENT;
sHolder.v.setVisibility(View.VISIBLE);
if (actionMode != null && selectedItems.get(pos)) {
sHolder.title.setAlpha(0.3f);
sHolder.icon.setAlpha(0.3f);
sHolder.flag.setAlpha(0.3f);
} else {
sHolder.title.setAlpha(1f);
sHolder.icon.setAlpha(1f);
sHolder.flag.setAlpha(1f);
}
} else {
sHolder.v.setVisibility(View.GONE);
param.height = 0;
param.width = 0;
}
sHolder.v.setLayoutParams(param);
sHolder.v.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return startActionMode();
}
});
}
public boolean startActionMode(){
if (actionMode != null) {
return false;
}
actionMode = mActivity.startActionMode(ServerRecAdapter.this);
return false;
}
@Override
public ServerViewHolder onCreateViewHolder(ViewGroup viewGroup, int pos) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.listitem_server, viewGroup, false);
return new ServerViewHolder(v);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mActivity.getMenuInflater();
inflater.inflate(R.menu.listitem_server_menu_cab, menu);
for (Integer sid : unused_servers) {
for (int i = 0; i < servers.length; i++) {
if (servers[i].getServerID() == sid) {
toggleSelection(i);
break;
}
}
}
mode.setTitle(mActivity.getString(R.string.edit_server_list));
notifyDataSetChanged();
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == R.id.action_done) {
unused_servers = new ArrayList<>();
for (Integer i : getSelectedItems()) {
unused_servers.add(servers[i].getServerID());
}
clearSelections();
actionMode.finish();
actionMode = null;
pm.edit().putString("unused_servers", intListToString(unused_servers)).apply();
notifyDataSetChanged();
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
this.actionMode = null;
clearSelections();
if(endActionModeListener != null){
endActionModeListener.onEndActionMode();
}
}
public List<Integer> stringToIntList(String sl) {
ArrayList<Integer> result = new ArrayList<>();
String[] parts = sl.split("\\|");
for (String s : parts) {
if (s.trim().length() > 0 && s.matches("\\d+")) {
result.add(Integer.parseInt(s));
}
}
return result;
}
public String intListToString(List<Integer> il) {
String result = "";
for (Integer integer : il) {
result = result + "|" + integer;
}
return result;
}
public void toggleSelection(int pos) {
if (selectedItems.get(pos, false)) {
selectedItems.delete(pos);
} else {
selectedItems.put(pos, true);
}
notifyItemChanged(pos);
}
public void clearSelections() {
selectedItems.clear();
notifyDataSetChanged();
}
public int getSelectedItemCount() {
return selectedItems.size();
}
public List<Integer> getSelectedItems() {
List<Integer> items = new ArrayList<Integer>(selectedItems.size());
for (int i = 0; i < selectedItems.size(); i++) {
items.add(selectedItems.keyAt(i));
}
return items;
}
public void setEndActionModeListener(OnEndActionModeListener endActionModeListener) {
this.endActionModeListener = endActionModeListener;
}
public interface OnServerClickListener {
void onServerClick(ServerBase server);
}
public class ServerViewHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView flag;
ImageView icon;
View v;
public ServerViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.server_nombre);
flag = (ImageView) itemView.findViewById(R.id.server_bandera);
icon = (ImageView) itemView.findViewById(R.id.server_imagen);
v = itemView;
}
}
public interface OnEndActionModeListener{
void onEndActionMode();
}
}