/*
* Copyright 2015 Lafayette College
*
* This file is part of OpenCVTour.
*
* OpenCVTour is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenCVTour is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenCVTour. If not, see <http://www.gnu.org/licenses/>.
*/
package alicrow.opencvtour;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.eyeem.recyclerviewtools.adapter.WrapAdapter;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import java.util.List;
/**
* Fragment to list available Tours
*/
public class TourListFragment extends Fragment implements View.OnClickListener {
private static final String TAG = "TourListFragment";
private RecyclerView _recycler_view;
private TourAdapter _adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tour_list, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
/// Must wait until OpenCV is initialized before loading the tours (since we load image descriptors).
BaseLoaderCallback _loader_callback = new BaseLoaderCallback(getActivity()) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
/// Add footer so the floating action button doesn't cover up the list.
_adapter = new TourAdapter(Tour.getTours(getActivity()));
WrapAdapter wrap_adapter = new WrapAdapter(_adapter);
wrap_adapter.addFooter(getActivity().getLayoutInflater().inflate(R.layout.empty_list_footer, _recycler_view, false));
_recycler_view.setAdapter(wrap_adapter);
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
_recycler_view = (RecyclerView) getActivity().findViewById(R.id.recycler_view);
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, getActivity(), _loader_callback);
_recycler_view.setLayoutManager(new LinearLayoutManager(getActivity()));
getActivity().findViewById(R.id.fab).setOnClickListener(this);
getActivity().findViewById(R.id.help_button).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.fab:
Tour.setSelectedTour(Tour.addNewTour());
startActivityForResult(new Intent(getActivity(), EditTourActivity.class), EditTourActivity.EDIT_TOUR_REQUEST);
break;
case R.id.help_button:
startActivity(new Intent(getActivity(), HelpActivity.class));
break;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == EditTourActivity.EDIT_TOUR_REQUEST) {
_adapter.notifyDataSetChanged();
}
}
/**
* Adapter to display tours
*/
class TourAdapter extends RecyclerView.Adapter<TourAdapter.ViewHolder> {
final List<Tour> _tours;
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public final TextView _text_view;
public final ImageView _edit_button;
public ViewHolder(RelativeLayout v) {
super(v);
_text_view = (TextView) v.findViewById(R.id.tour_name);
_edit_button = (ImageView) v.findViewById(R.id.edit_tour);
_text_view.setOnClickListener(this);
_edit_button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int position = getAdapterPosition();
Tour.setSelectedTour(_tours.get(position));
switch(view.getId()) {
case R.id.edit_tour:
startActivity(new Intent(getActivity(), EditTourActivity.class));
break;
case R.id.tour_name:
startActivity(new Intent(getActivity(), FollowTourActivity.class));
break;
}
}
}
public TourAdapter(List<Tour> tours) {
_tours = tours;
}
// Create new views (invoked by the layout manager)
@Override
public TourAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.tour_line, parent, false);
// set the view's size, margins, paddings and layout parameters
return new ViewHolder((RelativeLayout) v);
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder._text_view.setText(_tours.get(position).getName());
if(!_tours.get(position).getEditable()) {
/// Disable the edit button
holder._edit_button.setVisibility(View.GONE);
holder._edit_button.setClickable(false);
}
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return _tours.size();
}
}
}