/*
* Artcodes recognises a different marker scheme that allows the
* creation of aesthetically pleasing, even beautiful, codes.
* Copyright (C) 2013-2016 The University of Nottingham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package uk.ac.horizon.artcodes.fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import uk.ac.horizon.artcodes.BR;
import uk.ac.horizon.artcodes.R;
import uk.ac.horizon.artcodes.adapter.ListAdapter;
import uk.ac.horizon.artcodes.databinding.AvailabilityBinding;
import uk.ac.horizon.artcodes.databinding.ListBinding;
import uk.ac.horizon.artcodes.model.Availability;
import uk.ac.horizon.artcodes.ui.Bindings;
public class AvailabilityEditListFragment extends ExperienceEditFragment
{
class AvailabilityAdapter extends ListAdapter<AvailabilityBinding>
{
private List<Availability> availabilities = new ArrayList<>();
private AvailabilityAdapter(Context context)
{
super(context);
}
private void setAvailabilities(List<Availability> availabilities)
{
this.availabilities = availabilities;
adapter.notifyDataSetChanged();
}
@Override
public void bind(final int position, final AvailabilityBinding binding)
{
final Availability availability = availabilities.get(position);
binding.setAvailability(availability);
if (availability.getEnd() == null)
{
if (availability.getStart() == null)
{
if (availability.getName() != null)
{
binding.availabilityDesc.setText(getString(R.string.available_near, availability.getName()));
binding.availabilityIcon.setImageResource(R.drawable.ic_place_32dp);
}
else
{
binding.availabilityDesc.setText(R.string.available_public);
binding.availabilityIcon.setImageResource(R.drawable.ic_public_32dp);
}
}
else
{
if (availability.getName() != null)
{
binding.availabilityDesc.setText(getString(R.string.available_from_near, Bindings.getDate(availability.getStart()), availability.getName()));
binding.availabilityIcon.setImageResource(R.drawable.ic_place_32dp);
}
else
{
binding.availabilityDesc.setText(getString(R.string.available_from, Bindings.getDate(availability.getStart())));
binding.availabilityIcon.setImageResource(R.drawable.ic_schedule_32dp);
}
}
}
else if (availability.getStart() == null)
{
if (availability.getName() != null)
{
binding.availabilityDesc.setText(getString(R.string.available_to_near, Bindings.getDate(availability.getEnd()), availability.getName()));
binding.availabilityIcon.setImageResource(R.drawable.ic_place_32dp);
}
else
{
binding.availabilityDesc.setText(getString(R.string.available_to, Bindings.getDate(availability.getEnd())));
binding.availabilityIcon.setImageResource(R.drawable.ic_schedule_32dp);
}
}
else
{
if (availability.getName() != null)
{
binding.availabilityDesc.setText(getString(R.string.available_between_near, Bindings.getDate(availability.getStart(), availability.getEnd()), availability.getName()));
binding.availabilityIcon.setImageResource(R.drawable.ic_place_32dp);
}
else
{
binding.availabilityDesc.setText(getString(R.string.available_between, Bindings.getDate(availability.getStart(), availability.getEnd())));
binding.availabilityIcon.setImageResource(R.drawable.ic_schedule_32dp);
}
}
binding.getRoot().setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
int index = getExperience().getAvailabilities().indexOf(availability);
AvailabilityEditDialogFragment.show(getFragmentManager(), AvailabilityEditListFragment.this, index);
}
});
}
@Override
public AvailabilityBinding createBinding(final ViewGroup parent, final int viewType)
{
return AvailabilityBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
}
@Override
public int getViewCount()
{
return availabilities.size();
}
private void addAvailability(final Availability availability)
{
getExperience().getAvailabilities().add(availability);
int index = getExperience().getAvailabilities().size() - 1;
Log.i("Added", "Added Availability at " + index);
adapter.notifyItemInserted(index);
notifyPropertyChanged(BR.showError);
AvailabilityEditDialogFragment.show(getFragmentManager(), AvailabilityEditListFragment.this, index);
}
void availabilityUpdated(final int index)
{
adapter.notifyItemChanged(index);
}
void deleteAvailability(final int index)
{
final Availability availability = getExperience().getAvailabilities().get(index);
getExperience().getAvailabilities().remove(index);
adapter.notifyItemRemoved(index);
notifyPropertyChanged(BR.showError);
Snackbar.make(getView(), R.string.action_deleted, Snackbar.LENGTH_LONG)
.setAction(R.string.action_delete_undo, new View.OnClickListener()
{
@Override
public void onClick(View v)
{
getExperience().getAvailabilities().add(index, availability);
adapter.notifyItemInserted(index);
}
})
.setActionTextColor(ContextCompat.getColor(getActivity(), R.color.apptheme_accent_light))
.show();
}
}
private AvailabilityAdapter adapter;
@Override
public int getTitleResource()
{
return R.string.fragment_availability;
}
@Override
public boolean displayAddFAB()
{
return true;
}
@Override
public void add()
{
adapter.addAvailability(new Availability());
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
ListBinding binding = ListBinding.inflate(inflater, container, false);
adapter = new AvailabilityAdapter(getActivity());
adapter.setEmptyIcon(R.drawable.ic_lock_black_144dp);
adapter.setEmptyMessage(getString(R.string.availability_private));
binding.setAdapter(adapter);
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)
{
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder viewHolder1)
{
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir)
{
adapter.deleteAvailability(viewHolder.getAdapterPosition());
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(binding.list);
return binding.getRoot();
}
@Override
public void onResume()
{
super.onResume();
adapter.setAvailabilities(getExperience().getAvailabilities());
}
public AvailabilityAdapter getAdapter()
{
return adapter;
}
}