package net.mvla.mvhs.map;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import net.mvla.mvhs.R;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
/**
* List
*/
public class MapListFragment extends Fragment {
private RecyclerView mRecyclerView;
private LocationAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void updateDataAndSearch(String search) {
if (mAdapter != null) {
mAdapter.updateDataAndSearch(search);
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mRecyclerView = (RecyclerView) inflater.inflate(R.layout.fragment_list, container, false);
mRecyclerView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_light_darker));
mAdapter = new LocationAdapter();
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setHasFixedSize(true);
GridLayoutManager layout = new GridLayoutManager(getActivity(), 4);
mRecyclerView.setLayoutManager(layout);
layout.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return mAdapter.getSpanSize(position);
}
});
return mRecyclerView;
}
private class LocationAdapter extends RecyclerView.Adapter<LocationAdapter.ArtViewHolder> {
private String mSearchQuery;
private List<LocationNode> mLocations;
public LocationAdapter() {
updateDataAndSearch("");
mSearchQuery = "";
}
@Override
public ArtViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.list_item_location, viewGroup, false);
ArtViewHolder holder = new ArtViewHolder(view);
holder.title = (TextView) view.findViewById(R.id.list_item_location_title_textview);
holder.desc = (TextView) view.findViewById(R.id.list_item_location_desc_textview);
return holder;
}
@Override
public void onBindViewHolder(ArtViewHolder holder, int i) {
LocationNode location = mLocations.get(i);
holder.title.setText(location.getName());
if (location.getTags().size() > 0) {
holder.desc.setText(TextUtils.join("\n", location.getTags()));
holder.desc.setVisibility(View.VISIBLE);
} else {
holder.desc.setVisibility(View.GONE);
}
}
public void updateDataAndSearch(String string) {
mSearchQuery = string;
if (!mSearchQuery.isEmpty()) {
mLocations = new ArrayList<>();
for (LocationNode location : new ArrayList<>(MapData.locationNodeMap.values())) {
if (location.matchFilter(string)) {
mLocations.add(location);
}
}
} else {
mLocations = new ArrayList<>(MapData.locationNodeMap.values());
}
Collections.sort(mLocations, (lhs, rhs) -> {
boolean leftRoom = Pattern.matches("^[0-9]*$", lhs.getName());
boolean rightRoom = Pattern.matches("^[0-9]*$", rhs.getName());
if (leftRoom && !rightRoom) {
return -1;
} else if (rightRoom && !leftRoom) {
return 1;
}
return lhs.getName().compareTo(rhs.getName());
});
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mLocations.size();
}
public int getSpanSize(int position) {
LocationNode locationNode = mLocations.get(position);
//Hacky solution: last row full
if (locationNode.getName().equals("618")) {
return 4;
}
if (Pattern.matches("^[0-9]*$", locationNode.getName())) {
return 1;
} else {
return 2;
}
}
class ArtViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView desc;
public ArtViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(v -> {
MapActivity activity = (MapActivity) getActivity();
activity.onMapListItemClicked(mLocations.get(getLayoutPosition()));
});
}
}
}
}