package cn.flightfeather.thirdappmodule.activity;
|
|
import android.content.DialogInterface;
|
import android.os.Bundle;
|
import android.os.Environment;
|
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.widget.CardView;
|
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.RecyclerView;
|
import android.util.Log;
|
import android.view.View;
|
import android.widget.ProgressBar;
|
import android.widget.TextView;
|
import android.widget.Toast;
|
|
import com.google.gson.Gson;
|
import com.google.gson.GsonBuilder;
|
import com.ping.greendao.gen.MediafileDao;
|
|
import java.io.File;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import cn.flightfeather.thirdappmodule.CommonApplication;
|
import cn.flightfeather.thirdappmodule.R;
|
import cn.flightfeather.thirdappmodule.adapter.MediaFileListAdapter;
|
import cn.flightfeather.thirdappmodule.bean.entity.Mediafile;
|
import cn.flightfeather.thirdappmodule.task.CompressPhotoTask;
|
import okhttp3.MediaType;
|
import okhttp3.MultipartBody;
|
import okhttp3.RequestBody;
|
import okhttp3.ResponseBody;
|
import retrofit2.Call;
|
import retrofit2.Callback;
|
import retrofit2.Response;
|
import retrofit2.http.Multipart;
|
import retrofit2.http.POST;
|
import retrofit2.http.Part;
|
|
public class UploadMediaFilesActivity extends AppCompatActivity implements View.OnClickListener {
|
private RecyclerView rv_main;
|
private TextView tv_uploada;
|
private MediafileDao mediafileDao;
|
private CommonApplication application;
|
private List<Mediafile> mediaFileListCurrent;
|
private List<File> fileListCurrent;
|
private MediaFileListAdapter adapter;
|
private CardView cv_wait;
|
private TextView tv_waitText;
|
private AlertDialog.Builder uploadingDialog;
|
private int photoTotal = 0;
|
private int photoUploaded =0;
|
private ProgressBar pb_uploading;
|
private TextView tv_status;
|
private UploadService uploadService;
|
private List<File> outputFileList;
|
private AlertDialog uploadingDialog2;
|
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
setContentView(R.layout.activity_upload_media_files);
|
application = (CommonApplication) getApplication();
|
uploadService = application.getRetrofit().create(UploadService.class);
|
initUI();
|
initDataBase();
|
initData();
|
initUploadingDialog();
|
}
|
|
//初始化界面
|
private void initUI() {
|
getSupportActionBar().setTitle("文件上传");
|
rv_main = (RecyclerView) findViewById(R.id.rv_main);
|
tv_uploada = (TextView) findViewById(R.id.tv_upload);
|
cv_wait = (CardView) findViewById(R.id.cv_wait);
|
tv_waitText = (TextView) findViewById(R.id.tv_wait_text);
|
cv_wait.setVisibility(View.GONE);
|
|
LinearLayoutManager manager = new LinearLayoutManager(this);
|
rv_main.setLayoutManager(manager);
|
mediaFileListCurrent = new ArrayList<>();
|
adapter = new MediaFileListAdapter(this,mediaFileListCurrent);
|
rv_main.setAdapter(adapter);
|
|
tv_uploada.setOnClickListener(this);
|
}
|
|
//初始化数据库
|
private void initDataBase() {
|
mediafileDao = application.getDaoSession().getMediafileDao();
|
}
|
//初始化数据
|
private void initData() {
|
List<Mediafile> mediaFileList = mediafileDao.queryBuilder().where(MediafileDao.Properties.Remark.eq("未上传")).list();
|
if (mediaFileList!=null&&mediaFileList.size()>0){
|
mediaFileListCurrent.clear();
|
mediaFileListCurrent.addAll(mediaFileList);
|
//检查一下mediafile对应的图片是否存在,没有则删掉mediafile
|
for (int i = 0;i<mediaFileListCurrent.size();i++){
|
Mediafile mediaFile = mediaFileListCurrent.get(i);
|
File file = new File(Environment.getExternalStorageDirectory(),(mediaFile.getPath()+mediaFile.getDescription()));
|
if (!file.exists()){
|
Log.i(i+":","no Photo");
|
mediafileDao.delete(mediaFile);
|
}
|
}
|
List<Mediafile> mediaFileList2 = mediafileDao.queryBuilder().where(MediafileDao.Properties.Remark.eq("未上传")).list();
|
mediaFileListCurrent.clear();
|
mediaFileListCurrent.addAll(mediaFileList2);
|
photoTotal = mediaFileListCurrent.size();
|
photoUploaded = 0;
|
adapter.notifyDataSetChanged();
|
}
|
}
|
//上传前压缩图片
|
private void preUpload(){
|
CompressPhotoTask task = new CompressPhotoTask(mediaFileListCurrent,this);
|
task.execute();
|
pb_uploading.setMax(photoTotal);
|
pb_uploading.setProgress(photoUploaded);
|
tv_status.setText("压缩中...");
|
if (uploadingDialog2 != null && !uploadingDialog2.isShowing()) {
|
uploadingDialog2.show();
|
} else {
|
uploadingDialog2 = uploadingDialog.show();
|
}
|
}
|
//开始上传
|
public void startUplaod(List<File> outputFileList){
|
|
this.outputFileList = outputFileList;
|
updateUploadingStatus();
|
uploadSinglePhoto(outputFileList.get(0));
|
|
}
|
|
private void showErrorDialog(){
|
uploadingDialog2.dismiss();
|
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
dialog.setTitle("上传失败");
|
dialog.setMessage("请重试");
|
dialog.setPositiveButton("确定",null);
|
initData();
|
dialog.show();
|
|
}
|
//一次上传全部的图片
|
private void uploadAllPhoto(List<File> outputFileList){
|
List<MultipartBody.Part> photoList = new ArrayList<>();
|
//准备图片部分
|
for (File file:outputFileList){
|
// 创建 RequestBody,用于封装构建RequestBody
|
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
|
// MultipartBody.Part 和后端约定好Key,这里的partName是用image
|
MultipartBody.Part body = MultipartBody.Part.createFormData("Photos", file.getName(), requestFile);
|
photoList.add(body);
|
}
|
//将mediafile的备注设置为已上传,如果上传成功就将这个列表写入数据库
|
for (int i = 0;i<mediaFileListCurrent.size();i++){
|
Mediafile mediaFile = mediaFileListCurrent.get(i);
|
mediaFile.setRemark("已上传");
|
mediaFileListCurrent.set(i,mediaFile);
|
}
|
//准备mediafile的json
|
Gson gson = new GsonBuilder()
|
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
|
.create();
|
String a =gson.toJson(mediaFileListCurrent);
|
final RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), a);
|
MultipartBody.Part part = MultipartBody.Part.createFormData("mediafileVoList", null, requestBody);
|
photoList.add(part);
|
|
|
Call<ResponseBody> uploadPhotos =uploadService.uploadPhotos(photoList);
|
uploadPhotos.enqueue(new Callback<ResponseBody>() {
|
@Override
|
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
|
if (response.body()!=null){
|
mediafileDao.updateInTx(mediaFileListCurrent);
|
hideWait();
|
Toast.makeText(application, "上传成功", Toast.LENGTH_SHORT).show();
|
finish();
|
|
}else if (response.errorBody()!=null){
|
hideWait();
|
System.out.println("uploadPhotos:"+response.errorBody().toString());
|
Toast.makeText(application, "上传错误,请重试", Toast.LENGTH_SHORT).show();
|
}
|
}
|
|
@Override
|
public void onFailure(Call<ResponseBody> call, Throwable t) {
|
hideWait();
|
System.out.println("uploadPhotos:"+t.toString());
|
Toast.makeText(application, "网络连接失败", Toast.LENGTH_SHORT).show();
|
}
|
});
|
}
|
|
//显示确认上传的dialog
|
public void showConfirmUploadDialog(){
|
if (mediaFileListCurrent!=null&&mediaFileListCurrent.size()>0){
|
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
dialog.setTitle("开始上传吗?");
|
dialog.setMessage("推荐在wifi连接下上传,避免过多的流量消耗");
|
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialogInterface, int i) {
|
preUpload();
|
}
|
});
|
dialog.setNegativeButton("取消",null);
|
dialog.show();
|
}else {
|
Toast.makeText(application, "没有要上传的图片", Toast.LENGTH_SHORT).show();
|
}
|
|
}
|
private void initUploadingDialog(){
|
uploadingDialog = new AlertDialog.Builder(this);
|
uploadingDialog.setTitle("正在上传");
|
View view =View.inflate(UploadMediaFilesActivity.this,R.layout.dialog_uploading,null);
|
pb_uploading = (ProgressBar) view.findViewById(R.id.pb_uploading);
|
tv_status = (TextView) view.findViewById(R.id.tv_status);
|
uploadingDialog.setView(view);
|
uploadingDialog.setCancelable(false);
|
|
|
}
|
|
private void uploadSinglePhoto(File file){
|
List<MultipartBody.Part> photoList = new ArrayList<>();
|
//准备图片部分
|
|
// 创建 RequestBody,用于封装构建RequestBody
|
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
|
// MultipartBody.Part 和后端约定好Key,这里的partName是用image
|
MultipartBody.Part body = MultipartBody.Part.createFormData("Photos", file.getName(), requestFile);
|
photoList.add(body);
|
|
List<Mediafile> mediafiles = new ArrayList<>();
|
final Mediafile mediaFile = mediaFileListCurrent.get(photoUploaded);
|
mediaFile.setRemark("已上传");
|
mediafiles.add(mediaFile);
|
|
//准备mediafile的json
|
Gson gson = new GsonBuilder()
|
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
|
.create();
|
String a =gson.toJson(mediafiles);
|
|
final RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), a);
|
MultipartBody.Part part = MultipartBody.Part.createFormData("mediafileVoList", null, requestBody);
|
photoList.add(part);
|
|
Call<ResponseBody> uploadPhotos =uploadService.uploadPhotos(photoList);
|
uploadPhotos.enqueue(new Callback<ResponseBody>() {
|
@Override
|
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
|
if (response.body()!=null){
|
mediafileDao.update(mediaFile);
|
photoUploaded++;
|
updateUploadingStatus();
|
if (photoUploaded<photoTotal){
|
uploadSinglePhoto(outputFileList.get(photoUploaded));
|
}else {
|
Toast.makeText(application, "上传成功", Toast.LENGTH_SHORT).show();
|
clearTemp(outputFileList);
|
finish();
|
}
|
|
}else if (response.errorBody()!=null){
|
hideWait();
|
System.out.println("uploadSinglePhotos:"+response.errorBody().toString());
|
Toast.makeText(application, "上传错误,请重试", Toast.LENGTH_SHORT).show();
|
showErrorDialog();
|
|
}
|
}
|
|
@Override
|
public void onFailure(Call<ResponseBody> call, Throwable t) {
|
hideWait();
|
System.out.println("uploadSinglePhotos:"+t.toString());
|
Toast.makeText(application, "网络连接失败", Toast.LENGTH_SHORT).show();
|
showErrorDialog();
|
}
|
});
|
|
|
}
|
//更新上传的显示状态
|
private void updateUploadingStatus(){
|
pb_uploading.setProgress(photoUploaded);
|
tv_status.setText(photoUploaded+"/"+photoTotal);
|
}
|
//清理缓存
|
private void clearTemp(List<File> outputFileList){
|
if (outputFileList!=null&&outputFileList.size()>0){
|
for (File file:outputFileList){
|
if (file.exists()){
|
file.delete();
|
}
|
}
|
}
|
|
}
|
|
private void showCompressWait(){
|
tv_waitText.setText("压缩中");
|
cv_wait.setVisibility(View.VISIBLE);
|
}
|
private void showUploadWait(){
|
tv_waitText.setText("上传中");
|
cv_wait.setVisibility(View.VISIBLE);
|
}
|
private void hideWait(){
|
cv_wait.setVisibility(View.GONE);
|
}
|
|
@Override
|
public void onClick(View view) {
|
if (view.getId() == R.id.tv_upload) {
|
showConfirmUploadDialog();
|
}
|
}
|
interface UploadService{
|
@Multipart
|
@POST("mediafile/add/")
|
Call<ResponseBody> uploadPhotos(@Part List<MultipartBody.Part> partList);
|
}
|
|
@Override
|
protected void onStop() {
|
super.onStop();
|
|
}
|
}
|