소스 검색

add download files

yanyi 6 년 전
부모
커밋
b56ca977d7

+ 2 - 2
app/build.gradle

@@ -33,6 +33,6 @@ dependencies {
     implementation project(':okhttplib')
     implementation 'com.yanyi.benyanyi:loglib:1.0.0'
     implementation 'com.yanyi.benyanyi:permissionlib:1.0.1'
-//    implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
-//    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
+    implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
+    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
 }

+ 5 - 9
app/src/main/java/com/mylove/okhttp/DownloadActivity.java

@@ -9,9 +9,9 @@ import android.widget.Button;
 import android.widget.ProgressBar;
 
 import com.mylove.loglib.JLog;
+import com.mylove.okhttp.download.DownLoadObserver;
 import com.mylove.okhttp.download.DownloadInfo;
 import com.mylove.okhttp.download.DownloadManager;
-import com.mylove.okhttp.download.OnDownloadCallBack;
 
 /**
  * @author BenYanYi
@@ -59,19 +59,15 @@ public class DownloadActivity extends AppCompatActivity implements View.OnClickL
     public void onClick(View v) {
         switch (v.getId()) {
             case R.id.main_btn_down1:
-                DownloadManager.getInstance(mContext).download(url1, new OnDownloadCallBack() {
+                DownloadManager.getInstance(mContext).download(url1, new DownLoadObserver() {
                     @Override
                     public void onNext(DownloadInfo downloadInfo) {
+                        super.onNext(downloadInfo);
                         JLog.v(downloadInfo.getProgress());
                         progress1.setMax((int) downloadInfo.getTotal());
                         progress1.setProgress((int) downloadInfo.getProgress());
                     }
 
-                    @Override
-                    public void onError(Throwable e) {
-
-                    }
-
                     @Override
                     public void onComplete() {
 
@@ -79,7 +75,7 @@ public class DownloadActivity extends AppCompatActivity implements View.OnClickL
                 });
                 break;
             case R.id.main_btn_down2:
-                DownloadManager.getInstance(mContext).download(url2, new OnDownloadCallBack() {
+                DownloadManager.getInstance(mContext).download(url2, new DownLoadObserver() {
                     @Override
                     public void onNext(DownloadInfo downloadInfo) {
                         JLog.v(downloadInfo.getProgress());
@@ -97,7 +93,7 @@ public class DownloadActivity extends AppCompatActivity implements View.OnClickL
                 });
                 break;
             case R.id.main_btn_down3:
-                DownloadManager.getInstance(mContext).download(url3, new OnDownloadCallBack() {
+                DownloadManager.getInstance(mContext).download(url3, new DownLoadObserver() {
                     @Override
                     public void onNext(DownloadInfo downloadInfo) {
                         JLog.v(downloadInfo.getProgress());

+ 1 - 1
okhttplib/src/main/java/com/mylove/okhttp/DownloadBean.java

@@ -6,7 +6,7 @@ package com.mylove.okhttp;
  * @email ben@yanyi.red
  * @overview 下载状态
  */
-class DownloadBean {
+public class DownloadBean {
     public int progress;
     public int status = 0;
     public String filePath;

+ 16 - 39
okhttplib/src/main/java/com/mylove/okhttp/DownloadObservables.java

@@ -4,8 +4,6 @@ import android.annotation.SuppressLint;
 import android.content.Context;
 import android.support.annotation.NonNull;
 
-import com.mylove.okhttp.listener.OnDownloadCallBack;
-
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -16,9 +14,7 @@ import io.reactivex.Observable;
 import io.reactivex.ObservableEmitter;
 import io.reactivex.ObservableOnSubscribe;
 import io.reactivex.ObservableSource;
-import io.reactivex.Observer;
 import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
 import io.reactivex.functions.Function;
 import io.reactivex.schedulers.Schedulers;
 import okhttp3.Call;
@@ -67,54 +63,34 @@ public class DownloadObservables {
         return instance;
     }
 
-    void request(String url, String filePath, final OnDownloadCallBack onDownloadCallBack) {
+    void request(String url, String filePath, DownloadObserver downloadObserver) {
         this.filePath = filePath;
         this.url = url;
-        getObservableMap()
-//        getObservable()
+//        getObservableMap()
+        getObservable()
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
 //                .subscribeOn(Schedulers.newThread())
 //                .observeOn(Schedulers.newThread())
-                .subscribe(new Observer<Integer>() {
-                    @Override
-                    public void onSubscribe(Disposable d) {
-
-                    }
-
-                    @Override
-                    public void onNext(Integer integer) {
-                        onDownloadCallBack.onDownloading(integer);
-                    }
-
-                    @Override
-                    public void onError(Throwable e) {
-                        onDownloadCallBack.onFailure(e);
-                    }
-
-                    @Override
-                    public void onComplete() {
-                        onDownloadCallBack.onSuccess(filePaths);
-                    }
-                });
+                .subscribe(downloadObserver);
     }
 
-    private Observable<Integer> getObservable() {
-        return Observable.create(new ObservableOnSubscribe<Integer>() {
+    private Observable<DownloadBean> getObservable() {
+        return Observable.create(new ObservableOnSubscribe<DownloadBean>() {
             @Override
-            public void subscribe(ObservableEmitter<Integer> emitter) {
+            public void subscribe(ObservableEmitter<DownloadBean> emitter) {
                 send(emitter);
             }
         });
     }
 
-    private Observable<Integer> getObservableMap() {
-        return Observable.just(url).flatMap(new Function<String, ObservableSource<Integer>>() {
+    private Observable<DownloadBean> getObservableMap() {
+        return Observable.just(url).flatMap(new Function<String, ObservableSource<DownloadBean>>() {
             @Override
-            public ObservableSource<Integer> apply(String s) {
-                return Observable.create(new ObservableOnSubscribe<Integer>() {
+            public ObservableSource<DownloadBean> apply(String s) {
+                return Observable.create(new ObservableOnSubscribe<DownloadBean>() {
                     @Override
-                    public void subscribe(ObservableEmitter<Integer> emitter) {
+                    public void subscribe(ObservableEmitter<DownloadBean> emitter) {
                         send(emitter);
                     }
                 });
@@ -130,7 +106,7 @@ public class DownloadObservables {
 //        }, BackpressureStrategy.MISSING);
 //    }
 
-    private void send(ObservableEmitter<Integer> subscriber) {
+    private void send(ObservableEmitter<DownloadBean> subscriber) {
         InternetBean bean = Internet.ifInternet(mContext);
         if (bean.getStatus()) {
             Request request = new Request.Builder()
@@ -146,7 +122,7 @@ public class DownloadObservables {
     /**
      * 请求
      */
-    private void sendCall(final String url, Call call, final ObservableEmitter<Integer> subscriber) {
+    private void sendCall(final String url, Call call, final ObservableEmitter<DownloadBean> subscriber) {
 
         call.enqueue(new Callback() {
             @Override
@@ -185,10 +161,11 @@ public class DownloadObservables {
                         if (OkHttpInfo.isLOG)
                             LogHelper.d(bean);
                         // 下载中
-                        subscriber.onNext(progress);
+                        subscriber.onNext(bean);
                     }
                     fos.flush();
                     // 下载完成
+                    bean.progress = 100;
                     bean.status = 1;
                     if (OkHttpInfo.isLOG)
                         LogHelper.d(bean);

+ 30 - 0
okhttplib/src/main/java/com/mylove/okhttp/DownloadObserver.java

@@ -0,0 +1,30 @@
+package com.mylove.okhttp;
+
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
+
+/**
+ * @author BenYanYi
+ * @date 2018/11/29 17:24
+ * @email ben@yanyi.red
+ * @overview
+ */
+public abstract class DownloadObserver implements Observer<DownloadBean> {
+    protected Disposable d;
+
+    @Override
+    public void onComplete() {
+
+    }
+
+    @Override
+    public void onSubscribe(Disposable d) {
+        this.d = d;
+    }
+
+    @Override
+    public void onError(Throwable e) {
+
+    }
+
+}

+ 3 - 4
okhttplib/src/main/java/com/mylove/okhttp/DownloadRequest.java

@@ -3,7 +3,6 @@ package com.mylove.okhttp;
 import android.annotation.SuppressLint;
 import android.content.Context;
 
-import com.mylove.okhttp.listener.OnDownloadCallBack;
 import com.mylove.okhttp.listener.OnDownloadListener;
 
 /**
@@ -45,13 +44,13 @@ public class DownloadRequest {
 
     /**
      * @param filePath           储存下载文件的SDCard目录
-     * @param onDownloadCallBack 监听
+     * @param downloadObserver 监听
      */
-    public void downloads(String filePath, OnDownloadCallBack onDownloadCallBack) {
+    public void downloads(String filePath,DownloadObserver downloadObserver) {
         //saveDir判断不能为空
         if (FormatUtil.isEmpty(filePath)) {
             throw new NullPointerException("filePath is the SDCard directory of the downloaded file, cannot be empty.");
         }
-        DownloadObservables.getInstance(mContext).request(url, filePath, onDownloadCallBack);
+        DownloadObservables.getInstance(mContext).request(url, filePath, downloadObserver);
     }
 }

+ 2 - 2
okhttplib/src/main/java/com/mylove/okhttp/FileUtil.java

@@ -12,13 +12,13 @@ import java.io.IOException;
  * @author myLove
  */
 
-public class FileUtil {
+class FileUtil {
     /**
      * @param saveDir
      * @return
      * @throws IOException 判断下载目录是否存在
      */
-    public static String isExistDir(String saveDir) throws IOException {
+    static String isExistDir(String saveDir) throws IOException {
         // 下载位置
         File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);
         if (!downloadFile.mkdirs()) {

+ 32 - 39
okhttplib/src/main/java/com/mylove/okhttp/UpdateUtil.java

@@ -9,7 +9,6 @@ import android.os.Build;
 import android.support.annotation.DrawableRes;
 import android.support.v4.content.FileProvider;
 import android.support.v7.app.AlertDialog;
-import android.widget.Toast;
 
 import com.mylove.okhttp.listener.OnDownloadCallBack;
 
@@ -40,7 +39,7 @@ public class UpdateUtil {
     private ProgressDialog progressDialog;
 
     private boolean isInstallApk = false;
-    private OnDownloadCallBack downloadCallBack;
+    private OnDownloadCallBack onDownloadCallBack;
 
     private String filePath;
 
@@ -123,7 +122,7 @@ public class UpdateUtil {
      * 下载监听
      */
     public UpdateUtil setDownloadCallBack(OnDownloadCallBack downloadCallBack) {
-        this.downloadCallBack = downloadCallBack;
+        this.onDownloadCallBack = downloadCallBack;
         return this;
     }
 
@@ -196,39 +195,41 @@ public class UpdateUtil {
 
     private void download() {
         if (FormatUtil.isEmpty(filePath)) {
-            filePath = mActivity.getResources().getString(R.string.app_name);
+            filePath = mActivity.getPackageName();
         }
-        OkHttpUtil.getInstance(mActivity).downloadFile(downloadUrl).downloads(filePath, new OnDownloadCallBack() {
-            @Override
-            public void onDownloading(int progress) {
-                if (notificationUtil != null && isShowNotice) {
-                    notificationUtil.updateProgressText(1020, progress, "已下载" + progress + "%");
-                }
-                progressDialog.setProgress(progress);
-                progressDialog.setMessage("已下载" + progress + "%");
-                if (downloadCallBack != null) {
-                    downloadCallBack.onDownloading(progress);
-                }
-            }
 
+        OkHttpUtil.getInstance(mActivity).downloadFile(downloadUrl).downloads(filePath, new DownloadObserver() {
             @Override
-            public void onSuccess(String filePath) {
-                progressDialog.dismiss();
-                notificationUtil.cancel(1020);
-                if (isInstallApk && FileUtil.ifUrl(filePath, ".apk")) {
-                    installApk(new File(filePath));
-                }
-                if (downloadCallBack != null) {
-                    downloadCallBack.onSuccess(filePath);
+            public void onNext(DownloadBean downloadBean) {
+                if (downloadBean == null) {
+                    if (onDownloadCallBack != null) {
+                        onDownloadCallBack.onFailure(new Throwable("下载失败"));
+                    }
+                } else if (downloadBean.status == 0) {
+                    if (notificationUtil != null && isShowNotice) {
+                        notificationUtil.updateProgressText(1020, downloadBean.progress, "已下载" + downloadBean.progress + "%");
+                    }
+                    progressDialog.setProgress(downloadBean.progress);
+                    progressDialog.setMax(100);
+                    progressDialog.setMessage("已下载" + downloadBean.progress + "%");
+                    if (onDownloadCallBack != null) {
+                        onDownloadCallBack.onDownloading(downloadBean.progress);
+                    }
+                } else if (downloadBean.status == 1) {
+                    d.dispose();
+                    progressDialog.dismiss();
+                    notificationUtil.cancel(1020);
+                    if (isInstallApk && FileUtil.ifUrl(downloadBean.filePath, ".apk")) {
+                        installApk(new File(downloadBean.filePath));
+                    }
                 }
             }
 
             @Override
-            public void onFailure(Throwable throwable) {
-                Toast.makeText(mActivity, "下载失败", Toast.LENGTH_SHORT).show();
-                LogHelper.e(throwable.getMessage());
-                if (downloadCallBack != null) {
-                    downloadCallBack.onFailure(throwable);
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (onDownloadCallBack != null) {
+                    onDownloadCallBack.onFailure(e);
                 }
             }
         });
@@ -239,19 +240,11 @@ public class UpdateUtil {
      *
      * @param file
      */
-    public void installApk(final File file) {
-//        if (Build.VERSION.SDK_INT >= 26) {
-//            boolean b = getPackageManager().canRequestPackageInstalls();
-//            if (b) {
-//                installApk();//安装应用的逻辑(写自己的就可以)
-//            } else {
-//                //请求安装未知应用来源的权限
-//                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);
-//            }
-//        }
+    private void installApk(File file) {
         //判读版本是否在7.0以上
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             //在AndroidManifest中的android:authorities值
+            LogHelper.a(file.getAbsolutePath());
             Uri apkUri = FileProvider.getUriForFile(mActivity, mActivity.getPackageName() + ".fileProvider", file);
             Intent install = new Intent(Intent.ACTION_VIEW);
             install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);