package com.seafile.seadroid2.ui.adapter; import android.graphics.Color; import android.util.Log; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.google.common.collect.Lists; import com.seafile.seadroid2.R; import com.seafile.seadroid2.transfer.DownloadTaskInfo; import com.seafile.seadroid2.transfer.TransferTaskInfo; import com.seafile.seadroid2.transfer.UploadTaskInfo; import com.seafile.seadroid2.ui.activity.TransferActivity; import com.seafile.seadroid2.util.Utils; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * Adapter class for both uploading and downloading tasks */ public class TransferTaskAdapter extends BaseAdapter { private static final String DEBUG_TAG = "TransferTaskAdapter"; private SparseBooleanArray mSelectedItemsIds; private List<Integer> mSelectedItemsPositions = Lists.newArrayList(); private List<? extends TransferTaskInfo> mTransferTaskInfos; /** flag to mark if action mode was activated, used to update the state of multi selection buttons */ private boolean actionModeStarted; private TransferActivity mActivity; private TaskType mTransferTaskType; public enum TaskType {DOWNLOAD_TASK, UPLOAD_TASK} /** * Constructor of {@link TransferTaskAdapter} * <p> * set {@link TransferTaskAdapter #mDownloadTaskInfos} to null if the task is a uploading task</br> * set {@link TransferTaskAdapter #mUploadTaskInfos} to null if the task is a downloading task </br> * set {@link TransferTaskAdapter #mTransferTaskType} 0 to mark as Download Task, 1 mark to mark as Upload Task</br> * * @param activity * @param transferTaskInfos */ public TransferTaskAdapter(TransferActivity activity, List<? extends TransferTaskInfo> transferTaskInfos) { this.mTransferTaskInfos = transferTaskInfos; this.mActivity = activity; this.mSelectedItemsIds = new SparseBooleanArray(); } public void setCurrentTab(TaskType type) { this.mTransferTaskType = type; } /** * sort transfer list by task state, INIT goes to above, FINISHED goes to bottom. */ private class TaskInfoComparator implements Comparator<TransferTaskInfo> { private int taskStateToInteger(TransferTaskInfo info) { switch (info.state) { case TRANSFERRING: return 0; case INIT: return 1; case CANCELLED: return 2; case FAILED: return 3; case FINISHED: return 4; } return 0; } @Override public int compare(TransferTaskInfo infoA, TransferTaskInfo infoB) { // sort task list, transferring < init < cancelled < failed < finished return taskStateToInteger(infoA) - taskStateToInteger(infoB); } } public void setTransferTaskInfos(List<? extends TransferTaskInfo> infos) { mTransferTaskInfos = infos; Collections.sort(mTransferTaskInfos, new TaskInfoComparator()); } @Override public boolean hasStableIds() { // make adapter with stable ids by return true. // Also in {@link #getItemId} must either override hashCode() or has some kind of id field to be returned return true; } @Override public int getCount() { return mTransferTaskInfos.size(); } @Override public boolean isEmpty() { return mTransferTaskInfos.isEmpty(); } @Override public TransferTaskInfo getItem(int position) { return mTransferTaskInfos.get(position); } @Override public long getItemId(int position) { return position; } private void updateTaskView(TransferTaskInfo info, Viewholder viewHolder) { String stateStr = ""; int stateColor = R.color.light_black; long totalSize = 0l; long transferedSize = 0l; if (mTransferTaskType.equals(TaskType.DOWNLOAD_TASK)) { DownloadTaskInfo dti = (DownloadTaskInfo) info; totalSize = dti.fileSize; transferedSize = dti.finished; } else if (mTransferTaskType.equals(TaskType.UPLOAD_TASK)) { UploadTaskInfo uti = (UploadTaskInfo) info; totalSize = uti.totalSize; transferedSize = uti.uploadedSize; } String sizeStr = Utils.readableFileSize(totalSize).toString(); switch (info.state) { case INIT: if (mTransferTaskType.equals(TaskType.DOWNLOAD_TASK)) stateStr = mActivity.getString(R.string.download_waiting); else if (mTransferTaskType.equals(TaskType.UPLOAD_TASK)) stateStr = mActivity.getString(R.string.upload_waiting); viewHolder.fileSize.setVisibility(View.INVISIBLE); viewHolder.progressBar.setVisibility(View.INVISIBLE); break; case TRANSFERRING: int percent; if (totalSize == 0) percent = 0; else percent = (int) (transferedSize * 100 / totalSize); viewHolder.progressBar.setProgress(percent); sizeStr = String.format("%s / %s", Utils.readableFileSize(transferedSize), Utils.readableFileSize(totalSize)); viewHolder.fileSize.setVisibility(View.VISIBLE); viewHolder.progressBar.setVisibility(View.VISIBLE); break; case FINISHED: if (mTransferTaskType.equals(TaskType.DOWNLOAD_TASK)) stateStr = mActivity.getString(R.string.download_finished); else if (mTransferTaskType.equals(TaskType.UPLOAD_TASK)) stateStr = mActivity.getString(R.string.upload_finished); stateColor = Color.BLACK; viewHolder.fileSize.setVisibility(View.VISIBLE); viewHolder.progressBar.setVisibility(View.INVISIBLE); break; case CANCELLED: if (mTransferTaskType.equals(TaskType.DOWNLOAD_TASK)) stateStr = mActivity.getString(R.string.download_cancelled); else if (mTransferTaskType.equals(TaskType.UPLOAD_TASK)) stateStr = mActivity.getString(R.string.upload_cancelled); stateColor = Color.RED; viewHolder.fileSize.setVisibility(View.INVISIBLE); viewHolder.progressBar.setVisibility(View.INVISIBLE); break; case FAILED: if (mTransferTaskType.equals(TaskType.DOWNLOAD_TASK)) stateStr = mActivity.getString(R.string.download_failed); else if (mTransferTaskType.equals(TaskType.UPLOAD_TASK)) stateStr = mActivity.getString(R.string.upload_failed); stateColor = Color.RED; viewHolder.fileSize.setVisibility(View.INVISIBLE); viewHolder.progressBar.setVisibility(View.INVISIBLE); break; } viewHolder.fileSize.setText(sizeStr); viewHolder.state.setText(stateStr); viewHolder.state.setTextColor(stateColor); } public int getCheckedItemCount() { return mSelectedItemsIds.size(); } public List<Integer> getSelectedIds() { return mSelectedItemsPositions; } public void toggleSelection(int position) { if (mSelectedItemsIds.get(position)) { // unselected mSelectedItemsIds.delete(position); mSelectedItemsPositions.remove(Integer.valueOf(position)); } else { mSelectedItemsIds.put(position, true); mSelectedItemsPositions.add(position); } mActivity.onItemSelected(); notifyDataSetChanged(); } public void actionModeOn() { actionModeStarted = true; notifyDataSetChanged(); } public void actionModeOff() { actionModeStarted = false; notifyDataSetChanged(); } public void deselectAllItems() { mSelectedItemsIds.clear(); mSelectedItemsPositions.clear(); notifyDataSetChanged(); } public void selectAllItems() { mSelectedItemsIds.clear(); mSelectedItemsPositions.clear(); for (int i = 0; i < mTransferTaskInfos.size(); i++) { mSelectedItemsIds.put(i, true); mSelectedItemsPositions.add(i); } notifyDataSetChanged(); } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; final Viewholder viewHolder; if (convertView == null) { view = LayoutInflater.from(mActivity).inflate(R.layout.transfer_list_item, null); ImageView icon = (ImageView)view.findViewById(R.id.transfer_file_icon); ImageView multiSelectBtn = (ImageView)view.findViewById(R.id.transfer_file_multi_select_btn); TextView state = (TextView)view.findViewById(R.id.transfer_file_state); TextView targetPath = (TextView)view.findViewById(R.id.transfer_target_path); TextView fileName = (TextView)view.findViewById(R.id.transfer_file_name); TextView fileSize = (TextView)view.findViewById(R.id.transfer_file_size); ProgressBar progressBar = (ProgressBar)view.findViewById(R.id.transfer_file_progress_bar); viewHolder = new Viewholder(icon, multiSelectBtn, state, targetPath, fileName, fileSize, progressBar); view.setTag(viewHolder); } else { viewHolder = (Viewholder) convertView.getTag(); } int iconID; if (mTransferTaskType.equals(TaskType.DOWNLOAD_TASK)) { final DownloadTaskInfo taskInfo = (DownloadTaskInfo) mTransferTaskInfos.get(position); iconID = Utils.getFileIcon(taskInfo.pathInRepo); // the three fields are not dynamic viewHolder.icon.setImageResource(iconID); viewHolder.targetPath.setText(Utils.pathJoin(taskInfo.repoName, Utils.getParentPath(taskInfo.pathInRepo))); viewHolder.fileName.setText(Utils.fileNameFromPath(taskInfo.pathInRepo)); // Log.d(DEBUG_TAG, "multi select btn checked " + mSelectedItemsIds.get(position)); if (mSelectedItemsIds.get(position)) { viewHolder.multiSelectBtn.setImageResource(R.drawable.checkbox_checked); } else if (actionModeStarted) viewHolder.multiSelectBtn.setImageResource(R.drawable.checkbox_unchecked); else viewHolder.multiSelectBtn.setImageResource(R.drawable.btn_multiselect); viewHolder.multiSelectBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!mSelectedItemsIds.get(position)) { viewHolder.multiSelectBtn.setImageResource(R.drawable.checkbox_checked); mSelectedItemsIds.put(position, true); mSelectedItemsPositions.add(position); } else { viewHolder.multiSelectBtn.setImageResource(R.drawable.checkbox_unchecked); mSelectedItemsIds.delete(position); mSelectedItemsPositions.remove(Integer.valueOf(position)); } mActivity.onItemSelected(); } }); updateTaskView(taskInfo, viewHolder); } else if (mTransferTaskType.equals(TaskType.UPLOAD_TASK)) { UploadTaskInfo taskInfo = (UploadTaskInfo) mTransferTaskInfos.get(position); iconID = Utils.getFileIcon(taskInfo.localFilePath); String fullpath = Utils.pathJoin(taskInfo.repoName, taskInfo.parentDir); // the three fileds is not dynamic viewHolder.icon.setImageResource(iconID); viewHolder.targetPath.setText(fullpath); viewHolder.fileName.setText(Utils.fileNameFromPath(taskInfo.localFilePath)); // Log.d(DEBUG_TAG, "multi select btn checked " + mSelectedItemsIds.get(position)); if (mSelectedItemsIds.get(position)) { viewHolder.multiSelectBtn.setImageResource(R.drawable.checkbox_checked); } else if (actionModeStarted) viewHolder.multiSelectBtn.setImageResource(R.drawable.checkbox_unchecked); else viewHolder.multiSelectBtn.setImageResource(R.drawable.btn_multiselect); viewHolder.multiSelectBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!mSelectedItemsIds.get(position)) { viewHolder.multiSelectBtn.setImageResource(R.drawable.checkbox_checked); mSelectedItemsIds.put(position, true); mSelectedItemsPositions.add(position); } else { viewHolder.multiSelectBtn.setImageResource(R.drawable.checkbox_unchecked); mSelectedItemsIds.delete(position); mSelectedItemsPositions.remove(Integer.valueOf(position)); } mActivity.onItemSelected(); } }); updateTaskView(taskInfo, viewHolder); } return view; } private class Viewholder { ImageView icon, multiSelectBtn; TextView targetPath, fileName, fileSize, state; ProgressBar progressBar; public Viewholder(ImageView icon, ImageView multiSelectBtn, TextView state, TextView targetPath, TextView fileName, TextView fileSize, ProgressBar progressBar) { super(); this.icon = icon; this.multiSelectBtn = multiSelectBtn; this.state = state; this.targetPath = targetPath; this.fileName = fileName; this.fileSize = fileSize; this.progressBar = progressBar; } } }