package br.com.javace.javou.ui.fragment;
import android.Manifest;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.daimajia.androidanimations.library.Techniques;
import com.daimajia.androidanimations.library.YoYo;
import com.nineoldandroids.animation.Animator;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import br.com.javace.javou.R;
import br.com.javace.javou.adapter.ParticipantAdapter;
import br.com.javace.javou.dao.ParticipantDao;
import br.com.javace.javou.interfaces.OnItemClickListener;
import br.com.javace.javou.interfaces.OnItemLongClickListener;
import br.com.javace.javou.interfaces.OnScrollListener;
import br.com.javace.javou.model.participant.Participant;
import br.com.javace.javou.model.raffle.Raffle;
import br.com.javace.javou.task.ParticipantDeleteTask;
import br.com.javace.javou.task.ParticipantPresenceTask;
import br.com.javace.javou.task.ParticipantSendTask;
import br.com.javace.javou.task.ParticipantTask;
import br.com.javace.javou.ui.activity.MainActivity;
import br.com.javace.javou.ui.activity.NewParticipantActivity;
import br.com.javace.javou.ui.activity.ParticipantDetailActivity;
import br.com.javace.javou.ui.activity.ParticipantFortunateActivity;
import br.com.javace.javou.ui.activity.RaffleActivity;
import br.com.javace.javou.ui.activity.ResumeActivity;
import br.com.javace.javou.ui.base.BaseActivity;
import br.com.javace.javou.ui.base.BaseFragment;
import br.com.javace.javou.util.Constant;
import br.liveo.searchliveo.SearchLiveo;
import br.liveo.searchliveo.interfaces.OnSearchListener;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* Created by Rudsonlive on 10/07/15.
*/
public class ParticipantFragment extends BaseFragment implements OnSearchListener {
private boolean isActionMode;
private boolean isSearchView;
private ProgressDialog mDialog;
private int mPositionActionMode;
private OnScrollListener mEndlessListener;
private ArrayList<Participant> mParticipants;
private ParticipantAdapter mParticipantAdapter;
@BindView(R.id.toolbar) Toolbar mToolbar;
@BindView(R.id.search_liveo) SearchLiveo mSearchLiveo;
@BindView(R.id.recycler_view) RecyclerView mRecyclerView;
@BindView(R.id.float_add) FloatingActionButton mBtnFloatAdd;
@BindView(R.id.swipe_container) SwipeRefreshLayout mSwipeRefreshLayout;
public static ParticipantFragment newInstance(){
return new ParticipantFragment();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_participant, container, false);
ButterKnife.bind(this, view);
mToolbar.setTitle(getString(R.string.participant));
mToolbar.setNavigationIcon(R.drawable.ic_face_unlock_white_24dp);
((MainActivity)getActivity()).setSupportActionBar(mToolbar);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mToolbar.setElevation(15);
}
mRecyclerView.setHasFixedSize(true);
final LinearLayoutManager manager = new LinearLayoutManager(getActivity());
manager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(manager);
mEndlessListener = new OnScrollListener(manager, mBtnFloatAdd) {
@Override
public void onLoadMore(int currentPage) {
}
@Override
public void onScroll(RecyclerView recyclerView, int dx, int dy, boolean onScroll) {
}
};
mSearchLiveo.with(getActivity(), this).build();
mBtnFloatAdd.setOnClickListener(onClickFloatAdd);
mRecyclerView.addOnScrollListener(mEndlessListener);
mSwipeRefreshLayout.setOnRefreshListener(onRefresh);
mSwipeRefreshLayout.setColorSchemeResources(R.color.shirt_size_p, R.color.shirt_size_m, R.color.shirt_size_g, R.color.shirt_size_gg);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
if (savedInstanceState == null){
loadParticipant();
}else{
isActionMode = savedInstanceState.getBoolean(Constant.ACTION_MODE);
mParticipants = savedInstanceState.getParcelableArrayList(Constant.PARTICIPANT);
if (getParticipants() != null){
resultAdapter(getParticipants());
}
if (isActionMode){
mPositionActionMode = savedInstanceState.getInt(Constant.POSITION);
showActionMode(mPositionActionMode);
}
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(Constant.ACTION_MODE, isActionMode);
outState.putInt(Constant.POSITION, mPositionActionMode);
outState.putParcelableArrayList(Constant.PARTICIPANT, getParticipants());
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu, menu);
menu.findItem(R.id.menu_discart).setVisible(false);
menu.findItem(R.id.menu_delete).setVisible(false);
isSearchView = false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_search:
isSearchView = true;
mSearchLiveo.show();
break;
case R.id.menu_raffle:
raffleParticipant(true);
break;
case R.id.menu_woman:
raffleParticipant(false);
break;
case R.id.menu_send:
if (checkPermission()) {
generateSendingFile();
}
break;
case R.id.menu_resume:
generateResume();
break;
}
return true;
}
private void generateResume() {
Intent intent = new Intent(getActivity(), ResumeActivity.class);
startActivityForResult(intent, 0, BaseActivity.ActivityAnimation.SLIDE_LEFT);
}
private void loadParticipant(){
mEndlessListener.resetEndlessRecyclerView();
new ParticipantTask(getActivity()){
@Override
protected void onPreExecute() {
super.onPreExecute();
mSwipeRefreshLayout.setRefreshing(true);
}
@Override
protected void onPostExecute(ArrayList<Participant> participants) {
super.onPostExecute(participants);
if (participants != null && participants.size() > 0){
mParticipants = new ArrayList<>();
mParticipants = participants;
resultAdapter(mParticipants);
}
mSwipeRefreshLayout.setRefreshing(false);
}
}.execute();
}
private SwipeRefreshLayout.OnRefreshListener onRefresh = new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadParticipant();
}
};
private void resultAdapter(ArrayList<Participant> participants){
mParticipantAdapter = new ParticipantAdapter(getActivity(), participants);
getParticipantAdapter().setOnClickListener(onClickListener);
getParticipantAdapter().setOnItemClickListener(onItemClickListener);
getParticipantAdapter().setOnItemLongClickListener(onItemLongClickListener);
mRecyclerView.setAdapter(getParticipantAdapter());
}
private void raffleParticipant(boolean isMan) {
if (mParticipants != null && mParticipants.size() > 0) {
Raffle raffle = new Raffle(mParticipants);
if (raffle.isValid() && isMan) {
Participant participant = raffle.getFortunate();
ParticipantDao participantDao = new ParticipantDao(getActivity());
participantDao.updateAsRaffled(participant);
Intent intent = new Intent(getActivity(), ParticipantFortunateActivity.class);
intent.putExtra(Constant.PARTICIPANT, participant);
startActivityForResult(intent, 0, BaseActivity.ActivityAnimation.SLIDE_LEFT);
} else if (raffle.isValidSex() && !isMan) {
Participant participant = raffle.getFortunateSex();
ParticipantDao participantDao = new ParticipantDao(getActivity());
participantDao.updateAsRaffled(participant);
Intent intent = new Intent(getActivity(), ParticipantFortunateActivity.class);
intent.putExtra(Constant.PARTICIPANT, participant);
startActivityForResult(intent, 0, BaseActivity.ActivityAnimation.SLIDE_LEFT);
} else {
Toast.makeText(getActivity(), R.string.warning_not_participante_fortunate, Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), R.string.warning_not_participante_fortunate, Toast.LENGTH_SHORT).show();
}
}
private OnItemClickListener onClickListener = new OnItemClickListener() {
@Override
public void onItemClick(View v, final int position) {
TextView txtShirtSize = (TextView) v.findViewById(R.id.txt_shirt_size);
YoYo.with(Techniques.Bounce).withListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
Intent intent = new Intent(getActivity(), ParticipantDetailActivity.class);
intent.putExtra(Constant.INSERT, false);
intent.putExtra(Constant.PARTICIPANT, mParticipants.get(position));
startActivityForResult(intent, 1, BaseActivity.ActivityAnimation.SLIDE_LEFT);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}).playOn(txtShirtSize);
}
};
private OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
if (!isActionMode) {
confirmUndoPresence(getParticipants().get(position), position);
}else{
hideActionMode();
((MainActivity)getActivity()).hideActionMode();
}
hideSearch();
}
};
private OnItemLongClickListener onItemLongClickListener = new OnItemLongClickListener() {
@Override
public void onItemLongClick(View v, int position) {
showActionMode(position);
}
};
private void confirmUndoPresence(final Participant participant, final int position){
new ParticipantPresenceTask(getActivity(), participant){
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(!participant.isAttend());
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result){
if (isSearchView) {
loadParticipant();
isSearchView = false;
} else {
getParticipantAdapter().readAttendParticipant(position, !participant.isAttend());
}
}else{
Toast.makeText(getActivity(), R.string.error_confirmed_presence, Toast.LENGTH_LONG).show();
}
hideDialog();
}
}.execute();
}
private View.OnClickListener onClickFloatAdd = new View.OnClickListener() {
@Override
public void onClick(View v) {
hideSearch();
Intent intent = new Intent(getActivity(), NewParticipantActivity.class);
intent.putExtra(Constant.INSERT, true);
startActivityForResult(intent, 0, BaseActivity.ActivityAnimation.SLIDE_LEFT);
}
};
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null){
if (requestCode == SearchLiveo.REQUEST_CODE_SPEECH_INPUT) {
if (mSearchLiveo != null) {
mSearchLiveo.resultVoice(requestCode, resultCode, data);
}
}else{
loadParticipant();
}
}
}
private void showDialog(boolean attend) {
mDialog = ProgressDialog.show(getActivity(), getString(R.string.wait),
getString(attend ? R.string.warning_wait_confirmed_presence : R.string.warning_wait_undo_confirmed_presence));
}
private void showSendFileDialog() {
mDialog = ProgressDialog.show(getActivity(), getString(R.string.wait),
getString(R.string.warning_send_participante_attend));
}
private void showDeleteDialog() {
mDialog = ProgressDialog.show(getActivity(), getString(R.string.wait),
getString(R.string.warning_delete_wait_participante));
}
private void hideDialog(){
if (mDialog != null){
mDialog.dismiss();
}
}
public void showActionMode(int position){
if (isActionMode){
hideActionMode();
}
if (getParticipantAdapter() != null) {
isActionMode = true;
hideSearch();
mPositionActionMode = position;
getParticipantAdapter().setChecked(mPositionActionMode + 1, true);
((MainActivity) getActivity()).showActionMode(getParticipants().get(mPositionActionMode).getName());
}
}
public void hideActionMode(){
hideSearch();
if (getParticipantAdapter() != null) {
isActionMode = false;
getParticipantAdapter().resetarCheck();
((MainActivity) getActivity()).hideActionMode();
}
}
public ActionMode.Callback actionModeCallback = new ActionMode.Callback() {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// TODO Auto-generated method stub
if (mode != null){
hideActionMode();
}
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
mode.getMenuInflater().inflate(R.menu.menu_action_mode, menu);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_delete:
confirmDelete(mPositionActionMode);
break;
}
mode.finish();
return false;
}
};
private void deleteParticipant(final Participant participant){
new ParticipantDeleteTask(getActivity(), participant.getId()){
@Override
protected void onPreExecute() {
super.onPreExecute();
showDeleteDialog();
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
getParticipantAdapter().remove(mPositionActionMode);
if (participant.isGroup()){
loadParticipant();
}
Toast.makeText(getActivity(), R.string.warning_delete_participante, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), R.string.error_delete_participante, Toast.LENGTH_SHORT).show();
}
hideDialog();
}
}.execute();
}
private void confirmDelete(final int position){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(getString(R.string.warning_participant_excluded));
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//TODO
deleteParticipant(getParticipants().get(position));
dialog.dismiss();
}
});
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//TODO
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
public ArrayList<Participant> getParticipants() {
return mParticipants;
}
public ParticipantAdapter getParticipantAdapter() {
return mParticipantAdapter;
}
@Override
public void changedSearch(CharSequence text) {
if (mParticipantAdapter != null && !isActionMode){
mParticipantAdapter.searchParticipantes(text);
}
}
private void hideSearch() {
if (mSearchLiveo.isActive()) {
mSearchLiveo.hide();
}
}
@Override
public void onDetach() {
super.onDetach();
hideSearch();
}
private boolean checkPermission(){
try {
List<String> permissoes = new ArrayList<>();
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissoes.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissoes.isEmpty()) {
String[] array = new String[permissoes.size()];
permissoes.toArray(array);
ActivityCompat.requestPermissions(getActivity(), array, 0);
return false;
}
}catch (Exception e){
e.getStackTrace();
}
return true;
}
private void generateSendingFile(){
if (mParticipants != null && mParticipants.size() > 0) {
new ParticipantSendTask(mParticipants) {
@Override
protected void onPreExecute() {
super.onPreExecute();
showSendFileDialog();
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if (aBoolean) {
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("message/rfc822");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"handersonbf@gmail.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getString(R.string.subject));
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, getString(R.string.text));
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(Constant.PATH_FILE_JAVOU)));
startActivity(Intent.createChooser(emailIntent, getString(R.string.send_email)));
} else {
Toast.makeText(getActivity(), R.string.warning_not_participante_attend, Toast.LENGTH_SHORT).show();
}
hideDialog();
}
}.execute();
}else{
Toast.makeText(getActivity(), R.string.warning_not_participante_attend, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean isPermission = true;
for (int i = 0; i < permissions.length; i++){
if (grantResults[i] != PackageManager.PERMISSION_GRANTED){
isPermission = false;
break;
}
}
if (isPermission){
generateSendingFile();
}
}
}