package com.door43.translationstudio.newui;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import com.door43.translationstudio.R;
import com.door43.translationstudio.core.NativeSpeaker;
import java.util.ArrayList;
import java.util.List;
/**
* Created by joel on 2/19/2016.
*/
public class ContributorsAdapter extends RecyclerView.Adapter<ContributorsAdapter.GenericViewHolder> {
private static final int TYPE_SECURITY_NOTICE = 0;
private static final int TYPE_SPEAKER = 1;
private static final int TYPE_CONTROLS = 2;
public static final String EXTRA_DISPLAY_NEXT = "display_next";
private List<NativeSpeaker> mData = new ArrayList<>();
private OnClickListener mListener;
private boolean mDisplayNext = true;
/**
* Loads a new set of native speakers
* @param speakers
*/
public void setContributors(List<NativeSpeaker> speakers) {
mData = speakers;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if(position == 0) {
return TYPE_SECURITY_NOTICE;
} else if(position == getItemCount() - 1) {
return TYPE_CONTROLS;
} else {
return TYPE_SPEAKER;
}
}
@Override
public GenericViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case TYPE_SECURITY_NOTICE:
View noticeView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_publish_native_speaker_security_notice, parent, false);
return new ViewHolderNotice(noticeView);
case TYPE_CONTROLS:
View controlsView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_publish_native_speaker_controls, parent, false);
return new ViewHolderControls(controlsView);
case TYPE_SPEAKER:
default:
View speakerView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_publish_native_speaker_item, parent, false);
return new ViewHolderSpeaker(speakerView);
}
}
@Override
public void onBindViewHolder(GenericViewHolder holder, int position) {
// TRICKY: only the Native Speaker holder uses the position so we must account for the privacy notice
Bundle extras = new Bundle();
extras.putBoolean(EXTRA_DISPLAY_NEXT, mDisplayNext);
holder.putExtras(extras);
holder.loadView(mData, position - 1, mListener);
}
@Override
public int getItemCount() {
if(mData.size() > 0) {
return mData.size() + 2; // add space for security info and controls
} else {
return 1 + 2; // display notice card explaining they must add a translator
}
}
public void setOnClickListener(OnClickListener listener) {
mListener = listener;
}
/**
* Specifies if the next button should be displayed
* @param display
*/
public void setDisplayNext(boolean display) {
mDisplayNext = display;
}
public interface OnClickListener {
void onEditNativeSpeaker(NativeSpeaker speaker);
void onClickAddNativeSpeaker();
void onClickNext();
void onClickPrivacyNotice();
}
public static abstract class GenericViewHolder extends RecyclerView.ViewHolder {
public GenericViewHolder(View v) {
super(v);
}
public abstract void loadView(List<NativeSpeaker> speakers, int position, OnClickListener listener);
public abstract void putExtras(Bundle extras);
}
public static class ViewHolderNotice extends GenericViewHolder {
private final View mView;
public ViewHolderNotice(View v) {
super(v);
mView = v;
}
@Override
public void loadView(List<NativeSpeaker> speakers, int position, final OnClickListener listener) {
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClickPrivacyNotice();
}
});
}
@Override
public void putExtras(Bundle extras) {
}
}
public static class ViewHolderSpeaker extends GenericViewHolder {
private final TextView mNameView;
private final ImageButton mEditButton;
public ViewHolderSpeaker(View v) {
super(v);
mNameView = (TextView)v.findViewById(R.id.name);
mEditButton = (ImageButton)v.findViewById(R.id.edit_button);
}
@Override
public void loadView(final List<NativeSpeaker> speakers, final int position, final OnClickListener listener) {
if(speakers.size() > 0) {
mNameView.setText(speakers.get(position).toString());
mEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onEditNativeSpeaker(speakers.get(position));
}
});
} else {
// display notice a translator must be added
mNameView.setText(R.string.who_translated_notice);
mEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClickAddNativeSpeaker();
}
});
}
}
@Override
public void putExtras(Bundle extras) {
}
}
public static class ViewHolderControls extends GenericViewHolder {
private final Button mNextButton;
private final Button mAddButton;
private boolean displayNext = true;
public ViewHolderControls(View v) {
super(v);
mNextButton = (Button)v.findViewById(R.id.next_button);
mAddButton = (Button)v.findViewById(R.id.add_button);
}
@Override
public void loadView(List<NativeSpeaker> speakers, int position, final OnClickListener listener) {
if(displayNext) {
mNextButton.setVisibility(View.VISIBLE);
} else {
mNextButton.setVisibility(View.GONE);
}
mNextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClickNext();
}
});
mAddButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClickAddNativeSpeaker();
}
});
}
@Override
public void putExtras(Bundle extras) {
this.displayNext = extras.getBoolean(EXTRA_DISPLAY_NEXT, true);
}
}
}