UploadActivity.java 12.7 KB
package libs.cnlive.com.uploadsdk;

import android.content.Context;
import android.os.Environment;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;


import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import libs.cnlive.com.uploadsdk.SDK.CNUploadActivity;
import libs.cnlive.com.uploadsdk.SDK.UploadFile;

public class UploadActivity extends CNUploadActivity implements AdapterView.OnItemClickListener {

    private ListView listView;
    private TextView currentDirTextView;
    private Map<String, List<UploadFile>> dataSource = new HashMap<>();
    private File currentDir;
    private FileAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_upload);
        listView = (ListView) findViewById(R.id.files);
        currentDirTextView = (TextView) findViewById(R.id.current_dir_tv);
        currentDir = Environment.getExternalStorageDirectory();
        initUploadPart(Contans.ACCESS_KEY, Contans.ACCESS_SECRET, UploadActivity.this, Contans.END_POINT);
        setUp();
    }

    public void setUp() {
        adapter = new FileAdapter(UploadActivity.this, null);
        listView.setOnItemClickListener(this);
        listView.setAdapter(adapter);
        switchDir(Environment.getExternalStorageDirectory());
    }

    private void switchDir(File dir) {
        if (dir == null || !dir.exists() || dir.isFile()) {
            throw new IllegalArgumentException("illegal dir");
        }

        this.currentDir = dir;
        this.currentDirTextView.setText("当前目录:" + this.currentDir.getPath());
        List<UploadFile> uploadFiles = dataSource.get(dir.getPath());
        if (uploadFiles != null && uploadFiles.size() > 0) {
            adapter.fillDatas();
            return;
        }

        uploadFiles = new ArrayList<UploadFile>();
        File[] files = dir.listFiles();
        if (files != null && files.length > 0) {

            for (File file : files) {
                UploadFile uploadFile = new UploadFile();
                uploadFile.status = UploadFile.STATUS_NOT_START;
                uploadFile.file = file;
                uploadFile.progress = 0;
                uploadFiles.add(uploadFile);
            }
        }
        dataSource.put(dir.getPath(), uploadFiles);
        adapter.fillDatas();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            if (currentDir.getPath().equalsIgnoreCase(Environment.getExternalStorageDirectory().getPath())) {
                return super.onKeyDown(keyCode, event);
            } else {
                switchDir(currentDir.getParentFile());
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        UploadFile item = adapter.getItem(position);
        if (item.file.isDirectory()) {
            switchDir(item.file);
        } else {
            if (item.status == UploadFile.STATUS_UPLOADING || item.status == UploadFile.STATUS_FINISH)
                return;
        }
    }

    class FileAdapter extends BaseAdapter {
        private List<UploadFile> mUploadFiles;
        private LayoutInflater mInflater;

        FileAdapter(Context context, List<UploadFile> uploadFiles) {
            this.mUploadFiles = new ArrayList<>();
            if (uploadFiles != null) {
                this.mUploadFiles.addAll(uploadFiles);
            }
            this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return mUploadFiles.size();
        }

        @Override
        public UploadFile getItem(int position) {
            return this.mUploadFiles.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder viewHolder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.upload_file_item,
                        parent, false);
                viewHolder = new ViewHolder();
                viewHolder.fileNameTextView = (TextView) convertView
                        .findViewById(R.id.file_name);
                viewHolder.fileSummaryLayout = (LinearLayout) convertView
                        .findViewById(R.id.file_summary_layout);
                viewHolder.fileSizeTextView = (TextView) convertView
                        .findViewById(R.id.file_size);
                viewHolder.fileModiyTextView = (TextView) convertView
                        .findViewById(R.id.file_last_modiy);
                viewHolder.uploadSummaryLayout = (LinearLayout) convertView
                        .findViewById(R.id.progress_summary_layout);
                viewHolder.uploadProgressBar = (ProgressBar) convertView
                        .findViewById(R.id.upload_progress_bar);
                viewHolder.progressTextView = (TextView) convertView
                        .findViewById(R.id.upload_progress_txt);
                viewHolder.uploadBtn = (TextView) convertView
                        .findViewById(R.id.upload_btn);
                viewHolder.pause = (TextView) convertView
                        .findViewById(R.id.pause);
                viewHolder.abort = (TextView) convertView.findViewById(R.id.abort);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.fileNameTextView.setText(mUploadFiles.get(position).file.getName());

            viewHolder.pause.setTag(position);
            viewHolder.pause.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(UploadActivity.this, "您点击了暂停:文件名" + getItem(position).file.getName(), Toast.LENGTH_SHORT).show();
                    pause(getItem(position));
                    getItem(position).isPaused = true;
                }
            });

            viewHolder.uploadBtn.setTag(position);
            viewHolder.uploadBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(UploadActivity.this, "您点击了上传:文件名" + getItem(position).file.getName(), Toast.LENGTH_SHORT).show();
                    getItem(position).isPaused = false;
                    uploadFile(getItem(position));
                }
            });

            viewHolder.abort.setTag(position);
            viewHolder.abort.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(UploadActivity.this, "您点击了取消上传" + getItem(position).file.getName(), Toast.LENGTH_SHORT).show();
                    abortMultipartUpload(getItem(position));
                }
            });

            if (!mUploadFiles.get(position).file.isDirectory()) {
                viewHolder.fileNameTextView.setVisibility(View.VISIBLE);
                long size = mUploadFiles.get(position).file.length();
                String sizeStr;

                if (size > 1024 * 1024) {
                    sizeStr = ((int) (size / 1024 / 1024) * 100) / 100 + "MB";
                } else {
                    sizeStr = (mUploadFiles.get(position).file.length() / 1024) + "kb";
                }
                viewHolder.fileSizeTextView.setText(sizeStr);
                if (mUploadFiles.get(position).status > UploadFile.STATUS_NOT_START) {
                    viewHolder.uploadSummaryLayout.setVisibility(View.VISIBLE);
                    viewHolder.uploadProgressBar.setProgress((int) mUploadFiles.get(position).progress);
                    viewHolder.fileSummaryLayout.setVisibility(View.GONE);
                    switch (mUploadFiles.get(position).status) {
//                        case UploadFile.STATUS_STARTED:
//                            viewHolder.progressTextView.setText("准备上传");
//                            break;
                        case UploadFile.STATUS_INIT:
                            viewHolder.progressTextView.setText("初始化完成");
                            break;
                        case UploadFile.STATUS_UPLOADPART:
                            viewHolder.progressTextView.setText("分块上传.."
                                    + (int) (mUploadFiles.get(position).progress) + "%");
                            break;
                        case UploadFile.STATUS_LISTING:
                            viewHolder.progressTextView.setText("获取上传的块..");
                            break;
                        case UploadFile.STATUS_COMPLETE:
                            viewHolder.progressTextView.setText("合并完成");
                            break;
                        case UploadFile.STATUS_UPLOADING:
                            viewHolder.progressTextView.setText(mUploadFiles
                                    .get(position).progress + "%");
                            break;
                        case UploadFile.STATUS_FINISH:
                            viewHolder.progressTextView.setText("完成上传");
                            break;
                        case UploadFile.STATUS_FAIL:
                            viewHolder.progressTextView.setText("上传失败");
                            break;

                        case UploadFile.STATUS_INIT_FAIL:
                            viewHolder.progressTextView.setText("上传失败");
                            break;
                        case UploadFile.STATUS_UPLOADPART_FAIL:
                            viewHolder.progressTextView.setText("分块上传失败");
                            break;
                        case UploadFile.STATUS_LISTING_FAIL:
                            viewHolder.progressTextView.setText("获取块失败");
                            break;
                        case UploadFile.STATUS_COMPLETE_FAIL:
                            viewHolder.progressTextView.setText("文件合并失败");
                            break;
                        case UploadFile.STATUS_PAUSED:
                            viewHolder.progressTextView.setText("已暂停");
                            break;
                        case UploadFile.STATUS_CONTINUE_UPLOAD_PART:
                            viewHolder.progressTextView.setText("准备继续上传");
                            break;
                    }
                } else {
                    viewHolder.fileSummaryLayout.setVisibility(View.VISIBLE);
                    viewHolder.uploadBtn.setVisibility(View.VISIBLE);
                    viewHolder.uploadSummaryLayout.setVisibility(View.GONE);
                    viewHolder.pause.setVisibility(View.VISIBLE);
                    viewHolder.abort.setVisibility(View.VISIBLE);
                }
            } else {
                viewHolder.fileSummaryLayout.setVisibility(View.GONE);
                viewHolder.uploadSummaryLayout.setVisibility(View.GONE);
                viewHolder.uploadBtn.setVisibility(View.GONE);
                viewHolder.pause.setVisibility(View.GONE);
                viewHolder.abort.setVisibility(View.GONE);
            }
            return convertView;
        }

        public void fillDatas() {
            this.mUploadFiles.clear();
            this.mUploadFiles.addAll(dataSource.get(currentDir.getPath()));
            this.notifyDataSetChanged();
        }

        public void updateCurrent() {
            this.notifyDataSetChanged();
        }

        class ViewHolder {
            TextView fileNameTextView;
            LinearLayout fileSummaryLayout;
            TextView fileSizeTextView;
            TextView fileModiyTextView;
            LinearLayout uploadSummaryLayout;
            ProgressBar uploadProgressBar;
            TextView progressTextView;
            TextView uploadBtn;
            TextView pause;
            TextView abort;
        }
    }

    @Override
    public void updateCurrent() {
        super.updateCurrent();
        adapter.updateCurrent();
    }
}