Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.46 KB | None | 0 0
  1. public class ArCoreInteractor extends SuperInteractor<Model3D> {
  2. private String sku;
  3.  
  4. @Override
  5. public void loadData(@Nullable Bundle bundle, @NonNull ResultListener listener) {
  6.  
  7. //todo load from Cache
  8.  
  9. if (bundle != null) {
  10. sku = bundle.getString(ArCorePresenter.K_SKU_PRODUCT);
  11. if (!TextUtils.isEmpty(sku)) {
  12. mCompositeDisposible.add(
  13. Rest.call().getProduct(sku)
  14. .filter(productBaseResponse -> {
  15. if (TextUtils.isEmpty(productBaseResponse.getmData().getUrl3dModel())) {
  16. handleResponse(new Model3D(productBaseResponse.getmData().getImage()), listener);
  17. return false;
  18. } else
  19. return true;
  20. })
  21. .flatMap(this::getArchive)
  22. .flatMap(processResponse())
  23. .flatMap(unpackZip())
  24. .flatMap(getUriFile())
  25. .subscribeOn(Schedulers.io())
  26. .observeOn(AndroidSchedulers.mainThread())
  27. .subscribe(response -> handleResponse(response, listener), error -> handleError(RestUtils.ErrorMessages(error), listener)));
  28. } else {
  29. listener.onFailureResult("Error");
  30. }
  31. } else {
  32. listener.onFailureResult("Error");
  33. }
  34.  
  35. }
  36.  
  37. private ObservableSource<Response<ResponseBody>> getArchive(BaseResponse<Product> response) {
  38. return Rest.call().downloadFileByUrl(response.getmData().getUrl3dModel());
  39. }
  40.  
  41. private Function<File, Observable<Model3D>> getUriFile() {
  42. return file -> {
  43. for (File f : file.listFiles()) {
  44. if (f.getAbsolutePath().contains(".sfb")) {
  45. return Observable.just(new Model3D(Uri.fromFile(f)));
  46. }
  47. }
  48. return Observable.just(null);
  49. };
  50. }
  51.  
  52. @Override
  53. public void handleResponse(Model3D model3D, @NonNull ResultListener listener) {
  54. mData = model3D;
  55. listener.onSuccessResult();
  56. }
  57.  
  58.  
  59. private Function<Response<ResponseBody>, Observable<File>> processResponse() {
  60. return this::saveToDiskRx;
  61. }
  62.  
  63. private Observable<File> saveToDiskRx(final Response<ResponseBody> response) {
  64. return Observable.create((ObservableEmitter<File> emitter) -> {
  65. try {
  66. //String header = response.headers().get("Content-Disposition");
  67. String fileName = "my_temp.zip";
  68. File destinationFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsoluteFile(), fileName);
  69. BufferedSink bufferedSink = Okio.buffer(Okio.sink(destinationFile));
  70. bufferedSink.writeAll(response.body().source());
  71. bufferedSink.close();
  72.  
  73. emitter.onNext(destinationFile);
  74. emitter.onComplete();
  75. } catch (IOException e) {
  76. e.printStackTrace();
  77. emitter.onError(e);
  78. }
  79.  
  80. });
  81. }
  82.  
  83. private Function<File, Observable<File>> unpackZip() {
  84. return file -> {
  85. InputStream is;
  86. ZipInputStream zis;
  87. String parentFolder;
  88. String filename = "";
  89. String extractedFolder = null;
  90. try {
  91. parentFolder = file.getParentFile().getPath();
  92.  
  93. is = new FileInputStream(file.getAbsolutePath());
  94. zis = new ZipInputStream(new BufferedInputStream(is));
  95. ZipEntry ze;
  96. byte[] buffer = new byte[1024];
  97. int count;
  98.  
  99. while ((ze = zis.getNextEntry()) != null) {
  100. filename = ze.getName();
  101.  
  102. if (ze.isDirectory()) {
  103. if (extractedFolder == null)
  104. extractedFolder = ze.getName(); // main extractedFolder
  105. File fmd = new File(parentFolder + "/" + filename);
  106. fmd.mkdirs();
  107. continue;
  108. }
  109.  
  110. FileOutputStream fout = new FileOutputStream(parentFolder + "/" + filename);
  111.  
  112. while ((count = zis.read(buffer)) != -1) {
  113. fout.write(buffer, 0, count);
  114. }
  115.  
  116. fout.close();
  117. zis.closeEntry();
  118. }
  119.  
  120. zis.close();
  121. } catch (IOException e) {
  122. e.printStackTrace();
  123. }
  124.  
  125. StringBuilder pathExtractedFile = new StringBuilder(file.getAbsolutePath());
  126. int lastIndex = pathExtractedFile.lastIndexOf("/");
  127. pathExtractedFile.delete(lastIndex + 1, pathExtractedFile.length());
  128.  
  129. File extractedFile = new File(pathExtractedFile.append(extractedFolder).toString());
  130.  
  131. if (!file.delete()) Log.d("unpackZip", "Failed to deleted the zip file.");
  132. return Observable.just(extractedFile);
  133. };
  134. }
  135.  
  136. @Override
  137. public void handleError(String error, ResultListener listener) {
  138. listener.onFailureResult(error);
  139. }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement