package zlc.season.rxdownloadproject.activity; 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.functions.Consumer; import zlc.season.rxdownload2.RxDownload; import zlc.season.rxdownload2.entity.DownloadEvent; import zlc.season.rxdownload2.entity.DownloadFlag; import zlc.season.rxdownload2.entity.DownloadStatus; import zlc.season.rxdownloadproject.Constants; import zlc.season.rxdownloadproject.R; import zlc.season.rxdownloadproject.databinding.ActivityServiceDownloadBinding; import zlc.season.rxdownloadproject.model.DownloadController; import zlc.season.rxdownloadproject.model.ServiceModel; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; import static android.widget.Toast.LENGTH_SHORT; import static zlc.season.rxdownload2.function.Utils.log; public class ServiceDownloadActivity extends AppCompatActivity { private String url = Constants.URL4; private RxDownload mRxDownload; private DownloadController mDownloadController; private ActivityServiceDownloadBinding binding; private ServiceModel serviceModel = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // initData serviceModel = new ServiceModel(); // initView binding = DataBindingUtil.setContentView(this, R.layout.activity_service_download); binding.setItem(serviceModel); binding.contentServiceDownload.setPresenter(new Presenter()); setSupportActionBar(binding.toolbar); mRxDownload = RxDownload.getInstance(this); mDownloadController = new DownloadController(binding.contentServiceDownload.status, binding.contentServiceDownload.action); } @Override protected void onResume() { super.onResume(); mRxDownload.receiveDownloadStatus(url) .subscribe(new Consumer<DownloadEvent>() { @Override public void accept(DownloadEvent downloadEvent) throws Exception { if (downloadEvent.getFlag() == DownloadFlag.FAILED) { Throwable throwable = downloadEvent.getError(); log(throwable); } mDownloadController.setEvent(downloadEvent); updateProgress(downloadEvent); } }); } private void updateProgress(DownloadEvent event) { DownloadStatus status = event.getDownloadStatus(); binding.contentServiceDownload.progress.setIndeterminate(status.isChunked); binding.contentServiceDownload.progress.setMax((int) status.getTotalSize()); binding.contentServiceDownload.progress.setProgress((int) status.getDownloadSize()); serviceModel.setPercent(status.getPercent()); serviceModel.setSize(status.getFormatStatusString()); } private void start() { RxPermissions.getInstance(this) .request(WRITE_EXTERNAL_STORAGE) .doOnNext(new Consumer<Boolean>() { @Override public void accept(Boolean granted) throws Exception { if (!granted) { throw new RuntimeException("no permission"); } } }) .compose(mRxDownload.<Boolean>transformService(url)) .subscribe(new Consumer<Object>() { @Override public void accept(Object o) throws Exception { Toast.makeText(ServiceDownloadActivity.this, "下载开始", LENGTH_SHORT).show(); } }); } private void pause() { mRxDownload.pauseServiceDownload(url).subscribe(); } private void installApk() { File[] files = mRxDownload.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(); } } public class Presenter { public void onClick(View view) { mDownloadController.handleClick(new DownloadController.Callback() { @Override public void startDownload() { start(); } @Override public void pauseDownload() { pause(); } @Override public void install() { installApk(); } }); } public void onClickFinish(View view) { ServiceDownloadActivity.this.finish(); } } }