package io.github.mayubao.kuaichuan.ui;
import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import io.github.mayubao.kuaichuan.AppContext;
import io.github.mayubao.kuaichuan.Constant;
import io.github.mayubao.kuaichuan.R;
import io.github.mayubao.kuaichuan.common.BaseActivity;
import io.github.mayubao.kuaichuan.core.FileSender;
import io.github.mayubao.kuaichuan.core.entity.FileInfo;
import io.github.mayubao.kuaichuan.core.utils.FileUtils;
import io.github.mayubao.kuaichuan.core.utils.ToastUtils;
import io.github.mayubao.kuaichuan.core.utils.WifiMgr;
import io.github.mayubao.kuaichuan.ui.adapter.FileSenderAdapter;
/**
* Created by mayubao on 2016/11/28.
* Contact me 345269374@qq.com
*/
public class FileSenderActivity extends BaseActivity {
private static final String TAG = FileSenderActivity.class.getSimpleName();
/**
* Topbar相关UI
*/
@Bind(R.id.tv_back)
TextView tv_back;
@Bind(R.id.tv_title)
TextView tv_title;
/**
* 进度条 已传 耗时等UI组件
*/
@Bind(R.id.pb_total)
ProgressBar pb_total;
@Bind(R.id.tv_value_storage)
TextView tv_value_storage;
@Bind(R.id.tv_unit_storage)
TextView tv_unit_storage;
@Bind(R.id.tv_value_time)
TextView tv_value_time;
@Bind(R.id.tv_unit_time)
TextView tv_unit_time;
/**
* 其他UI
*/
@Bind(R.id.lv_result)
ListView lv_result;
List<Map.Entry<String, FileInfo>> mFileInfoMapList;
FileSenderAdapter mFileSenderAdapter;
List<FileSender> mFileSenderList = new ArrayList<FileSender>();
// ScanResult mScanResult;
long mTotalLen = 0; //所有总文件的进度
long mCurOffset = 0; //每次传送的偏移量
long mLastUpdateLen = 0; //每个文件传送onProgress() 之前的进度
String[] mStorageArray = null;
long mTotalTime = 0;
long mCurTimeOffset = 0;
long mLastUpdateTime = 0;
String[] mTimeArray = null;
int mHasSendedFileCount = 0;
public static final int MSG_UPDATE_FILE_INFO = 0X6666;
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
//TODO 未完成 handler实现细节以及封装
if(msg.what == MSG_UPDATE_FILE_INFO){
updateTotalProgressView();
if(mFileSenderAdapter != null) mFileSenderAdapter.notifyDataSetChanged();
}
}
};
/**
* 更新进度 和 耗时的 View
*/
private void updateTotalProgressView() {
try{
//设置传送的总容量大小
mStorageArray = FileUtils.getFileSizeArrayStr(mTotalLen);
tv_value_storage.setText(mStorageArray[0]);
tv_unit_storage.setText(mStorageArray[1]);
//设置传送的时间情况
mTimeArray = FileUtils.getTimeByArrayStr(mTotalTime);
tv_value_time.setText(mTimeArray[0]);
tv_unit_time.setText(mTimeArray[1]);
//设置传送的进度条情况
if(mHasSendedFileCount == AppContext.getAppContext().getFileInfoMap().size()){
pb_total.setProgress(0);
tv_value_storage.setTextColor(getResources().getColor(R.color.color_yellow));
tv_value_time.setTextColor(getResources().getColor(R.color.color_yellow));
return;
}
long total = AppContext.getAppContext().getAllSendFileInfoSize();
int percent = (int)(mTotalLen * 100 / total);
pb_total.setProgress(percent);
if(total == mTotalLen){
pb_total.setProgress(0);
tv_value_storage.setTextColor(getResources().getColor(R.color.color_yellow));
tv_value_time.setTextColor(getResources().getColor(R.color.color_yellow));
}
}catch (Exception e){
//convert storage array has some problem
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_sender);
ButterKnife.bind(this);
init();
}
@Override
public void onBackPressed() {
// super.onBackPressed();
//需要判断是否有文件在发送?
if(hasFileSending()){
showExistDialog();
return;
}
finishNormal();
}
/**
* 正常退出
*/
private void finishNormal(){
// AppContext.FILE_SENDER_EXECUTOR.
stopAllFileSendingTask();
AppContext.getAppContext().getFileInfoMap().clear();
this.finish();
}
/**
* 停止所有的文件发送任务
*/
private void stopAllFileSendingTask(){
for(FileSender fileSender : mFileSenderList){
if(fileSender != null){
fileSender.stop();
}
}
}
/**
* 判断是否有文件在传送
*/
private boolean hasFileSending(){
for(FileSender fileSender : mFileSenderList){
if(fileSender.isRunning()){
return true;
}
}
return false;
}
/**
* 显示是否退出 对话框
*/
private void showExistDialog(){
// new AlertDialog.Builder(getContext())
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMessage(getResources().getString(R.string.tip_now_has_task_is_running_exist_now))
.setPositiveButton(getResources().getString(R.string.str_yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finishNormal();
}
})
.setNegativeButton(getResources().getString(R.string.str_no), null)
.create()
.show();
}
/**
* 初始化
*/
private void init(){
// mScanResult = getIntent().getParcelableExtra(Constant.KEY_SCAN_RESULT);
tv_title.setVisibility(View.VISIBLE);
tv_title.setText(getResources().getString(R.string.title_file_transfer));
pb_total.setMax(100);
mFileSenderAdapter = new FileSenderAdapter(getContext());
lv_result.setAdapter(mFileSenderAdapter);
// Map<String, FileInfo> dataMap = AppContext.getAppContext().getFileInfoMap();
// List<FileInfo> fileInfoList = new ArrayList<>(dataMap.values());
// Collections.sort(fileInfoList, Constant.DEFAULT_COMPARATOR2);
List<Map.Entry<String, FileInfo>> fileInfoMapList = new ArrayList<Map.Entry<String, FileInfo>>(AppContext.getAppContext().getFileInfoMap().entrySet());
mFileInfoMapList = fileInfoMapList;
Collections.sort(fileInfoMapList, Constant.DEFAULT_COMPARATOR);
//Android6.0 requires android.permission.READ_EXTERNAL_STORAGE
//TODO
if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_FILE);
}else{
initSendServer(fileInfoMapList);//开启传送文件
}
// AppContext.FILE_SENDER_EXECUTOR.execute();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE_WRITE_FILE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initSendServer(mFileInfoMapList);//开启传送文件
} else {
// Permission Denied
ToastUtils.show(this, getResources().getString(R.string.tip_permission_denied_and_not_send_file));
finishNormal();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
/**
* 开始传送文件
* @param fileInfoMapList
*/
private void initSendServer(List<Map.Entry<String, FileInfo>> fileInfoMapList) {
String serverIp = WifiMgr.getInstance(getContext()).getIpAddressFromHotspot();
for(Map.Entry<String, FileInfo> entry : fileInfoMapList){
final FileInfo fileInfo = entry.getValue();
FileSender fileSender = new FileSender(getContext(), fileInfo, serverIp, Constant.DEFAULT_SERVER_PORT);
fileSender.setOnSendListener(new FileSender.OnSendListener() {
@Override
public void onStart() {
mLastUpdateLen = 0;
mLastUpdateTime = System.currentTimeMillis();
}
@Override
public void onProgress(long progress, long total) {
//TODO 更新
//=====更新进度 流量 时间视图 start ====//
mCurOffset = progress - mLastUpdateLen > 0 ? progress - mLastUpdateLen : 0;
mTotalLen = mTotalLen + mCurOffset;
mLastUpdateLen = progress;
mCurTimeOffset = System.currentTimeMillis() - mLastUpdateTime > 0 ? System.currentTimeMillis() - mLastUpdateTime : 0;
mTotalTime = mTotalTime + mCurTimeOffset;
mLastUpdateTime = System.currentTimeMillis();
//=====更新进度 流量 时间视图 end ====//
//更新文件传送进度的UI
fileInfo.setProcceed(progress);
AppContext.getAppContext().updateFileInfo(fileInfo);
mHandler.sendEmptyMessage(MSG_UPDATE_FILE_INFO);
}
@Override
public void onSuccess(FileInfo fileInfo) {
//=====更新进度 流量 时间视图 start ====//
mHasSendedFileCount ++;
mTotalLen = mTotalLen + (fileInfo.getSize() - mLastUpdateLen);
mLastUpdateLen = 0;
mLastUpdateTime = System.currentTimeMillis();
//=====更新进度 流量 时间视图 end ====//
System.out.println(Thread.currentThread().getName());
//TODO 成功
fileInfo.setResult(FileInfo.FLAG_SUCCESS);
AppContext.getAppContext().updateFileInfo(fileInfo);
mHandler.sendEmptyMessage(MSG_UPDATE_FILE_INFO);
}
@Override
public void onFailure(Throwable t, FileInfo fileInfo) {
mHasSendedFileCount ++;//统计发送文件
//TODO 失败
fileInfo.setResult(FileInfo.FLAG_FAILURE);
AppContext.getAppContext().updateFileInfo(fileInfo);
mHandler.sendEmptyMessage(MSG_UPDATE_FILE_INFO);
}
});
mFileSenderList.add(fileSender);
AppContext.FILE_SENDER_EXECUTOR.execute(fileSender);
}
}
@OnClick({R.id.tv_back})
public void onClick(View view){
switch (view.getId()){
case R.id.tv_back:{
onBackPressed();
break;
}
}
}
}