package info.guardianproject.pixelknot.adapters;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.squareup.picasso.Picasso;
import java.text.NumberFormat;
import java.util.ArrayList;
import info.guardianproject.pixelknot.App;
import info.guardianproject.pixelknot.ObservableArrayList;
import info.guardianproject.pixelknot.R;
import info.guardianproject.pixelknot.StegoEncryptionJob;
import info.guardianproject.pixelknot.StegoJob;
import info.guardianproject.pixelknot.UIHelpers;
public class OutboxAdapter extends RecyclerView.Adapter<OutboxViewHolder> implements ObservableArrayList.OnChangeListener {
private final ArrayList<StegoEncryptionJob> mEncryptionJobs;
public interface OutboxAdapterListener {
void onOutboxItemClicked(StegoEncryptionJob job);
}
private final Context mContext;
private OutboxAdapterListener mListener;
public OutboxAdapter(Context context) {
super();
mContext = context;
mEncryptionJobs = new ArrayList<>();
// Listen to changes in underlying data
App.getInstance().getJobs().setOnChangeListener(this);
updateList();
}
private void updateList() {
mEncryptionJobs.clear();
for (StegoJob job : App.getInstance().getJobs()) {
if (job instanceof StegoEncryptionJob)
mEncryptionJobs.add((StegoEncryptionJob) job);
}
notifyDataSetChanged();
}
public void setListener(OutboxAdapterListener listener) {
mListener = listener;
}
@Override
public void onListChanged(ObservableArrayList list) {
updateList();
}
@Override
public OutboxViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.outbox_item, parent, false);
return new OutboxViewHolder(view);
}
@Override
public void onBindViewHolder(OutboxViewHolder holder, int position) {
StegoEncryptionJob job = mEncryptionJobs.get(position);
holder.itemView.clearAnimation();
holder.mJob = job;
holder.mRootView.setOnClickListener(new ItemClickListener(job));
holder.mPhoto.setRounding(1f);
int viewSize = UIHelpers.dpToPx(180, mContext);
Picasso.with(mContext).load(job.getBitmapFile())
.resize(viewSize, viewSize)
.centerCrop()
.into(holder.mPhoto);
NumberFormat format = NumberFormat.getPercentInstance();
format.setMaximumFractionDigits(0);
holder.mProgressText.setText(format.format((float)job.getProgressPercent() / 100f));
holder.mStatusText.setText(R.string.tap_to_send);
holder.mProgress.setMax(100);
holder.mProgress.setProgress(job.getProgressPercent());
updateBasedOnStatus(holder, job);
job.setOnProgressListener(new StegoEncryptionJob.OnProgressListener() {
private OutboxViewHolder viewHolder;
public StegoEncryptionJob.OnProgressListener init(OutboxViewHolder viewHolder) {
this.viewHolder = viewHolder;
return this;
}
@Override
public void onProgressUpdate(final StegoEncryptionJob job, final int percent) {
viewHolder.itemView.post(new Runnable() {
@Override
public void run() {
NumberFormat format = NumberFormat.getPercentInstance();
format.setMaximumFractionDigits(0);
viewHolder.mProgressText.setText(format.format((float)percent / 100f));
viewHolder.mProgress.setProgress(percent);
updateBasedOnStatus(viewHolder, job);
}
});
}
}.init(holder));
}
private void updateBasedOnStatus(OutboxViewHolder holder, StegoEncryptionJob job) {
if (job.getProcessingStatus() == StegoJob.ProcessingStatus.ERROR) {
holder.mProgressText.setVisibility(View.GONE);
holder.mLayoutDone.setVisibility(View.GONE);
holder.mLayoutError.setVisibility(View.VISIBLE);
} else if (job.getProcessingStatus() == StegoJob.ProcessingStatus.EMBEDDED_SUCCESSFULLY || job.getProgressPercent() == 100) {
holder.mProgressText.setVisibility(View.GONE);
holder.mLayoutDone.setVisibility(View.VISIBLE);
holder.mLayoutError.setVisibility(View.GONE);
} else {
holder.mProgressText.setVisibility(View.VISIBLE);
holder.mLayoutDone.setVisibility(View.GONE);
holder.mLayoutError.setVisibility(View.GONE);
}
}
@Override
public int getItemCount() {
return mEncryptionJobs.size();
}
private class ItemClickListener implements View.OnClickListener {
private final StegoEncryptionJob mJob;
public ItemClickListener(StegoEncryptionJob job) {
mJob = job;
}
@Override
public void onClick(View view) {
if (mListener != null) {
mListener.onOutboxItemClicked(mJob);
}
}
}
}