package zlc.season.rxdownloadproject.activity;
import android.Manifest;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import com.tbruyelle.rxpermissions2.RxPermissions;
import java.io.File;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import zlc.season.rxdownload2.RxDownload;
import zlc.season.rxdownload2.entity.DownloadStatus;
import zlc.season.rxdownloadproject.Constants;
import zlc.season.rxdownloadproject.R;
import zlc.season.rxdownloadproject.databinding.ActivityBasicDownloadBinding;
import zlc.season.rxdownloadproject.model.BaseModel;
import zlc.season.rxdownloadproject.model.DownloadController;
import static zlc.season.rxdownload2.function.Utils.dispose;
public class BasicDownloadActivity extends AppCompatActivity {
private String url = Constants.URL;
private Disposable disposable;
private RxDownload rxDownload;
private DownloadController downloadController;
private ActivityBasicDownloadBinding binding = null;
private BaseModel baseModel = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// initData
baseModel = new BaseModel();
// initView
binding = DataBindingUtil.setContentView(this, R.layout.activity_basic_download);
binding.setItem(baseModel);
binding.contentBasicDownload.setPresenter(new Presenter());
setSupportActionBar(binding.toolbar);
//
rxDownload = RxDownload.getInstance(this);
downloadController = new DownloadController(binding.contentBasicDownload.status, binding.contentBasicDownload.action);
downloadController.setState(new DownloadController.Normal());
}
public class Presenter {
public void onClick(View view) {
switch (view.getId()) {
case R.id.action:
downloadController.handleClick(new DownloadController.Callback() {
@Override
public void startDownload() {
start();
}
@Override
public void pauseDownload() {
pause();
}
@Override
public void install() {
installApk();
}
});
break;
case R.id.finish:
BasicDownloadActivity.this.finish();
break;
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
dispose(disposable);
}
private void start() {
RxPermissions.getInstance(this)
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.doOnNext(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (!aBoolean) {
throw new RuntimeException("no permission");
}
}
})
.observeOn(Schedulers.io())
.compose(rxDownload.<Boolean>transform(url))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<DownloadStatus>() {
@Override
public void onSubscribe(Disposable d) {
disposable = d;
downloadController.setState(new DownloadController.Started());
}
@Override
public void onNext(DownloadStatus status) {
binding.contentBasicDownload.progress.setIndeterminate(status.isChunked);
binding.contentBasicDownload.progress.setMax((int) status.getTotalSize());
binding.contentBasicDownload.progress.setProgress((int) status.getDownloadSize());
baseModel.setPercent(status.getPercent());
baseModel.setSize(status.getFormatStatusString());
}
@Override
public void onError(Throwable e) {
downloadController.setState(new DownloadController.Paused());
}
@Override
public void onComplete() {
downloadController.setState(new DownloadController.Completed());
}
});
}
private void pause() {
downloadController.setState(new DownloadController.Paused());
dispose(disposable);
}
private void installApk() {
File[] files = rxDownload.getRealFiles(url);
if (files != null) {
Uri uri = Uri.fromFile(files[0]);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
startActivity(intent);
} else {
Toast.makeText(this, "File not exists", Toast.LENGTH_SHORT).show();
}
}
}