diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 19f11e9..ad97454 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -20,6 +20,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -220,7 +221,7 @@ * 更新版本 */ @POST("/app/checkVersion") - Observable obtainVersion(@Header("token") String token); + Observable obtainVersion(@Header("token") String token); /** * 获取核实待办案卷 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 19f11e9..ad97454 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -20,6 +20,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -220,7 +221,7 @@ * 更新版本 */ @POST("/app/checkVersion") - Observable obtainVersion(@Header("token") String token); + Observable obtainVersion(@Header("token") String token); /** * 获取核实待办案卷 diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 66fd24c..3485bc2 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -22,6 +22,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -238,7 +239,7 @@ /** * 更新版本 */ - public static Observable getVersionResult() { + public static Observable getVersionResult() { Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainVersion(AuthenticationHelper.getToken()); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 19f11e9..ad97454 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -20,6 +20,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -220,7 +221,7 @@ * 更新版本 */ @POST("/app/checkVersion") - Observable obtainVersion(@Header("token") String token); + Observable obtainVersion(@Header("token") String token); /** * 获取核实待办案卷 diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 66fd24c..3485bc2 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -22,6 +22,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -238,7 +239,7 @@ /** * 更新版本 */ - public static Observable getVersionResult() { + public static Observable getVersionResult() { Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainVersion(AuthenticationHelper.getToken()); diff --git a/app/src/main/res/drawable/bg_progress.xml b/app/src/main/res/drawable/bg_progress.xml new file mode 100644 index 0000000..7a8f663 --- /dev/null +++ b/app/src/main/res/drawable/bg_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 19f11e9..ad97454 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -20,6 +20,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -220,7 +221,7 @@ * 更新版本 */ @POST("/app/checkVersion") - Observable obtainVersion(@Header("token") String token); + Observable obtainVersion(@Header("token") String token); /** * 获取核实待办案卷 diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 66fd24c..3485bc2 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -22,6 +22,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -238,7 +239,7 @@ /** * 更新版本 */ - public static Observable getVersionResult() { + public static Observable getVersionResult() { Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainVersion(AuthenticationHelper.getToken()); diff --git a/app/src/main/res/drawable/bg_progress.xml b/app/src/main/res/drawable/bg_progress.xml new file mode 100644 index 0000000..7a8f663 --- /dev/null +++ b/app/src/main/res/drawable/bg_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag.xml b/app/src/main/res/drawable/bg_text_tag.xml index d887d85..dc10eab 100644 --- a/app/src/main/res/drawable/bg_text_tag.xml +++ b/app/src/main/res/drawable/bg_text_tag.xml @@ -1,8 +1,12 @@ + android:shape="oval"> - + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 19f11e9..ad97454 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -20,6 +20,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -220,7 +221,7 @@ * 更新版本 */ @POST("/app/checkVersion") - Observable obtainVersion(@Header("token") String token); + Observable obtainVersion(@Header("token") String token); /** * 获取核实待办案卷 diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 66fd24c..3485bc2 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -22,6 +22,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -238,7 +239,7 @@ /** * 更新版本 */ - public static Observable getVersionResult() { + public static Observable getVersionResult() { Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainVersion(AuthenticationHelper.getToken()); diff --git a/app/src/main/res/drawable/bg_progress.xml b/app/src/main/res/drawable/bg_progress.xml new file mode 100644 index 0000000..7a8f663 --- /dev/null +++ b/app/src/main/res/drawable/bg_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag.xml b/app/src/main/res/drawable/bg_text_tag.xml index d887d85..dc10eab 100644 --- a/app/src/main/res/drawable/bg_text_tag.xml +++ b/app/src/main/res/drawable/bg_text_tag.xml @@ -1,8 +1,12 @@ + android:shape="oval"> - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notice_list.xml b/app/src/main/res/layout/item_notice_list.xml index 66a3154..51f92f1 100644 --- a/app/src/main/res/layout/item_notice_list.xml +++ b/app/src/main/res/layout/item_notice_list.xml @@ -17,7 +17,7 @@ android:layout_toStartOf="@id/noticeDateView" android:singleLine="true" android:text="这里是标题" - android:textSize="18sp" /> + android:textSize="@dimen/titleFontSize" /> + android:textColor="@color/gray" + android:textSize="12sp" /> + android:textColor="@color/gray" + android:textSize="@dimen/textFontSize" /> + android:textColor="@color/white" + android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 19f11e9..ad97454 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -20,6 +20,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -220,7 +221,7 @@ * 更新版本 */ @POST("/app/checkVersion") - Observable obtainVersion(@Header("token") String token); + Observable obtainVersion(@Header("token") String token); /** * 获取核实待办案卷 diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 66fd24c..3485bc2 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -22,6 +22,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -238,7 +239,7 @@ /** * 更新版本 */ - public static Observable getVersionResult() { + public static Observable getVersionResult() { Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainVersion(AuthenticationHelper.getToken()); diff --git a/app/src/main/res/drawable/bg_progress.xml b/app/src/main/res/drawable/bg_progress.xml new file mode 100644 index 0000000..7a8f663 --- /dev/null +++ b/app/src/main/res/drawable/bg_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag.xml b/app/src/main/res/drawable/bg_text_tag.xml index d887d85..dc10eab 100644 --- a/app/src/main/res/drawable/bg_text_tag.xml +++ b/app/src/main/res/drawable/bg_text_tag.xml @@ -1,8 +1,12 @@ + android:shape="oval"> - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notice_list.xml b/app/src/main/res/layout/item_notice_list.xml index 66a3154..51f92f1 100644 --- a/app/src/main/res/layout/item_notice_list.xml +++ b/app/src/main/res/layout/item_notice_list.xml @@ -17,7 +17,7 @@ android:layout_toStartOf="@id/noticeDateView" android:singleLine="true" android:text="这里是标题" - android:textSize="18sp" /> + android:textSize="@dimen/titleFontSize" /> + android:textColor="@color/gray" + android:textSize="12sp" /> + android:textColor="@color/gray" + android:textSize="@dimen/textFontSize" /> + android:textColor="@color/white" + android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tag_bottom_navigation.xml b/app/src/main/res/layout/tag_bottom_navigation.xml new file mode 100644 index 0000000..da34754 --- /dev/null +++ b/app/src/main/res/layout/tag_bottom_navigation.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 19f11e9..ad97454 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -20,6 +20,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -220,7 +221,7 @@ * 更新版本 */ @POST("/app/checkVersion") - Observable obtainVersion(@Header("token") String token); + Observable obtainVersion(@Header("token") String token); /** * 获取核实待办案卷 diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 66fd24c..3485bc2 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -22,6 +22,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -238,7 +239,7 @@ /** * 更新版本 */ - public static Observable getVersionResult() { + public static Observable getVersionResult() { Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainVersion(AuthenticationHelper.getToken()); diff --git a/app/src/main/res/drawable/bg_progress.xml b/app/src/main/res/drawable/bg_progress.xml new file mode 100644 index 0000000..7a8f663 --- /dev/null +++ b/app/src/main/res/drawable/bg_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag.xml b/app/src/main/res/drawable/bg_text_tag.xml index d887d85..dc10eab 100644 --- a/app/src/main/res/drawable/bg_text_tag.xml +++ b/app/src/main/res/drawable/bg_text_tag.xml @@ -1,8 +1,12 @@ + android:shape="oval"> - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notice_list.xml b/app/src/main/res/layout/item_notice_list.xml index 66a3154..51f92f1 100644 --- a/app/src/main/res/layout/item_notice_list.xml +++ b/app/src/main/res/layout/item_notice_list.xml @@ -17,7 +17,7 @@ android:layout_toStartOf="@id/noticeDateView" android:singleLine="true" android:text="这里是标题" - android:textSize="18sp" /> + android:textSize="@dimen/titleFontSize" /> + android:textColor="@color/gray" + android:textSize="12sp" /> + android:textColor="@color/gray" + android:textSize="@dimen/textFontSize" /> + android:textColor="@color/white" + android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tag_bottom_navigation.xml b/app/src/main/res/layout/tag_bottom_navigation.xml new file mode 100644 index 0000000..da34754 --- /dev/null +++ b/app/src/main/res/layout/tag_bottom_navigation.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..9d7b44f --- /dev/null +++ b/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f62ba66..a5cca2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -39,7 +40,8 @@ android:roundIcon="@mipmap/app_logo" android:supportsRtl="true" android:theme="@style/QMUI.Compat.NoActionBar" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + tools:targetApi="m"> @@ -84,14 +86,15 @@ + + android:resource="@xml/file_paths" /> observable = RetrofitServiceManager.getVersionResult(); - return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + Observable observable = RetrofitServiceManager.getVersionResult(); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { @@ -40,7 +41,7 @@ } @Override - public void onNext(Object resultBean) { + public void onNext(NewVersionBean resultBean) { if (resultBean != null) { updateListener.onSuccess(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java index 162af1e..82d1afc 100644 --- a/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java +++ b/app/src/main/java/com/casic/dcms/mvp/presenter/UpdatePresenterImpl.java @@ -1,5 +1,6 @@ package com.casic.dcms.mvp.presenter; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.BasePresenter; import com.casic.dcms.mvp.model.UpdateVersionModelImpl; import com.casic.dcms.mvp.view.IUpdateVersionView; @@ -21,7 +22,7 @@ } @Override - public void onSuccess(Object resultBean) { + public void onSuccess(NewVersionBean resultBean) { view.hideProgress(); view.obtainVersionResult(resultBean); } diff --git a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java index 749f6b9..85c7fdd 100644 --- a/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java +++ b/app/src/main/java/com/casic/dcms/mvp/view/IUpdateVersionView.java @@ -1,11 +1,13 @@ package com.casic.dcms.mvp.view; +import com.casic.dcms.bean.NewVersionBean; + public interface IUpdateVersionView { void showProgress(); void hideProgress(); - void obtainVersionResult(Object resultBean); + void obtainVersionResult(NewVersionBean resultBean); void obtainDataFail(); } diff --git a/app/src/main/java/com/casic/dcms/ui/MainActivity.java b/app/src/main/java/com/casic/dcms/ui/MainActivity.java index 138baf9..225d5d1 100644 --- a/app/src/main/java/com/casic/dcms/ui/MainActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/MainActivity.java @@ -215,6 +215,8 @@ } } + + @Override public void obtainUploadPositionResult(ActionResultBean resultBean) { // Log.d(TAG, "obtainUploadPositionResult: " + new Gson().toJson(resultBean)); diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java index ddb25aa..4177798 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/MinePageFragment.java @@ -1,16 +1,22 @@ package com.casic.dcms.ui.fragment; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; +import androidx.core.content.FileProvider; + import com.casic.dcms.BuildConfig; import com.casic.dcms.R; import com.casic.dcms.base.BaseFragment; import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.mvp.presenter.LoginOutPresenterImpl; import com.casic.dcms.mvp.presenter.UpdatePresenterImpl; import com.casic.dcms.mvp.view.ILoginOutView; @@ -20,13 +26,18 @@ import com.casic.dcms.ui.MainActivity; import com.casic.dcms.ui.UserInfoActivity; import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.SaveKeyValues; +import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; +import com.casic.dcms.utils.callback.IDownloadListener; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import java.io.File; + import butterknife.BindView; import butterknife.OnClick; @@ -44,6 +55,7 @@ private LoginOutPresenterImpl loginOutPresenter; private QMUITipDialog loadingDialog; private UpdatePresenterImpl updatePresenter; + private ProgressDialog progressDialog; @Override protected int initLayoutView() { @@ -66,6 +78,13 @@ .setTipWord("请求中,请稍后") .create(); updatePresenter = new UpdatePresenterImpl(this); + + //下载进度条 + progressDialog = new ProgressDialog(context); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(context.getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); } @Override @@ -93,7 +112,6 @@ startActivity(new Intent(context, HelpfulActivity.class)); break; case R.id.updateVersionView: - //TODO 更新接口有问题 updatePresenter.onReadyRetrofitRequest(); break; case R.id.loginOutButton: @@ -131,10 +149,70 @@ } @Override - public void obtainVersionResult(Object resultBean) { - //下载路径为 http://111.198.10.15:11409/static/ 拼接downloadUrl -// Log.d(TAG, "obtainLoginOutResult: " + new Gson().toJson(resultBean)); - ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + public void obtainVersionResult(NewVersionBean resultBean) { +// Log.d(TAG, "obtainVersionResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + NewVersionBean.DataBean data = resultBean.getData(); + String version = data.getVersion(); + if (BuildConfig.VERSION_NAME.equals(version)) { + ToastHelper.showToast("暂无新版本,无需更新", ToastHelper.INFO); + } else { + String downloadUrl = StringHelper.appendDownloadUrl(data.getDownloadUrl()); + //http://111.198.10.15:11409/static/app/v1.1.0.0.apk + new QMUIDialog.MessageDialogBuilder(context) + .setTitle("版本更新") + .setMessage("确定下载新版本吗?") + .setCanceledOnTouchOutside(false) + .addAction("取消", (dialog, index) -> dialog.dismiss()) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + //下载新版本 + progressDialog.setMessage("下载新版本中..."); + progressDialog.show(); + downloadApk(downloadUrl); + } + }).create().show(); + } + } + } + + //下载apk + private void downloadApk(String url) { + OtherUtils.downloadFile(url, new IDownloadListener() { + @Override + public void onDownloadStart(long totalBytes) { + progressDialog.setMax((int) totalBytes); + progressDialog.show(); + } + + @Override + public void onProgressChanged(long sumBytes) { + progressDialog.setProgress((int) sumBytes); + } + + @Override + public void onDownloadEnd(File file) { + progressDialog.dismiss(); + installApk(file); + } + }); + } + + //安装apk文件 + private void installApk(File apk) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0 + // 通过FileProvider创建一个content类型的Uri + data = FileProvider.getUriForFile(context, "com.casic.dcms.fileProvider", apk); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apk); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + context.startActivity(intent); } @Override diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index 37db458..d5fb6ba 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -1,6 +1,7 @@ package com.casic.dcms.utils; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.IOException; @@ -9,10 +10,26 @@ import java.util.Locale; public class FileUtils { - public static File getOutputAudioFile() { - File audioDir = new File(Environment.getExternalStorageDirectory(), "AudioFile"); + private static final String TAG = "FileUtils"; + private static File parentDir; + + public static void initFileConfig() { + parentDir = new File(Environment.getExternalStorageDirectory(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建Casic文件夹"); + } + } + } + + static File getOutputAudioFile() { + File audioDir = new File(parentDir, "AudioFile"); if (!audioDir.exists()) { - audioDir.mkdir(); + boolean mkdir = audioDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建AudioFile文件夹"); + } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); File audioFile = new File(audioDir + File.separator + "AUD_" + timeStamp + ".m4a"); @@ -27,18 +44,29 @@ } public static String getImageCompressPath() { - File dir = new File(Environment.getExternalStorageDirectory(), "CompressImageFile"); - if (!dir.exists()) { - dir.mkdir(); + File imageDir = new File(parentDir, "CompressImageFile"); + if (!imageDir.exists()) { + boolean mkdir = imageDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建CompressImageFile文件夹"); + } } - return dir.toString(); + return imageDir.toString(); + } + + //储存下载文件的目录 + public static String getDownloadFilePath() { + File downloadDir = new File(parentDir, "DownloadFile"); + if (!downloadDir.exists()) { + boolean mkdir = downloadDir.mkdir(); + if (mkdir) { + Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); + } + } + return downloadDir.toString(); } public static String getVideoCompressPath() { -// File dir = new File(Environment.getExternalStorageDirectory(), "CompressVideoFile"); -// if (!dir.exists()) { -// dir.mkdir(); -// } return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java index 2f4fd65..407d70e 100644 --- a/app/src/main/java/com/casic/dcms/utils/OtherUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/OtherUtils.java @@ -9,15 +9,30 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import androidx.core.app.ActivityCompat; import com.casic.dcms.ui.CaseProcessActivity; +import com.casic.dcms.utils.callback.IDownloadListener; import com.casic.dcms.widgets.BigPictureDialog; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + public class OtherUtils { private static final String TAG = "OtherUtils"; @@ -64,4 +79,60 @@ } return ""; } + + public static void downloadFile(String url, IDownloadListener listener) { + OkHttpClient okHttpClient = new OkHttpClient(); + Request request = new Request.Builder().get().url(url).build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + // 储存下载文件的目录 + String savePath = FileUtils.getDownloadFilePath(); + try { + ResponseBody body = response.body(); + if (body != null) { + is = body.byteStream(); + long total = body.contentLength(); + listener.onDownloadStart(total); + File file = new File(savePath, url.substring(url.lastIndexOf("/") + 1)); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + listener.onProgressChanged(sum); + } + fos.flush(); + listener.onDownloadEnd(file); + } else { + Log.d(TAG, "onResponse: body is null"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } } diff --git a/app/src/main/java/com/casic/dcms/utils/StringHelper.java b/app/src/main/java/com/casic/dcms/utils/StringHelper.java index a1e8ea0..f3364b0 100644 --- a/app/src/main/java/com/casic/dcms/utils/StringHelper.java +++ b/app/src/main/java/com/casic/dcms/utils/StringHelper.java @@ -125,6 +125,13 @@ } } + public static String appendDownloadUrl(String url) { + if (TextUtils.isEmpty(url)) { + return url; + } + return SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:11409") + "/static/" + url; + } + public static String reformatURL(List urls) { if (urls.isEmpty()) { return ""; diff --git a/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java new file mode 100644 index 0000000..57dbddf --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/callback/IDownloadListener.java @@ -0,0 +1,11 @@ +package com.casic.dcms.utils.callback; + +import java.io.File; + +public interface IDownloadListener { + void onDownloadStart(long totalBytes); + + void onProgressChanged(long sumBytes); + + void onDownloadEnd(File file); +} diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java index 19f11e9..ad97454 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitService.java @@ -20,6 +20,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -220,7 +221,7 @@ * 更新版本 */ @POST("/app/checkVersion") - Observable obtainVersion(@Header("token") String token); + Observable obtainVersion(@Header("token") String token); /** * 获取核实待办案卷 diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 66fd24c..3485bc2 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -22,6 +22,7 @@ import com.casic.dcms.bean.HighEventBean; import com.casic.dcms.bean.HomePageBean; import com.casic.dcms.bean.LoginResultBean; +import com.casic.dcms.bean.NewVersionBean; import com.casic.dcms.bean.OnlinePersonBean; import com.casic.dcms.bean.OvertimeCaseBean; import com.casic.dcms.bean.PhoneBookBean; @@ -238,7 +239,7 @@ /** * 更新版本 */ - public static Observable getVersionResult() { + public static Observable getVersionResult() { Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.obtainVersion(AuthenticationHelper.getToken()); diff --git a/app/src/main/res/drawable/bg_progress.xml b/app/src/main/res/drawable/bg_progress.xml new file mode 100644 index 0000000..7a8f663 --- /dev/null +++ b/app/src/main/res/drawable/bg_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag.xml b/app/src/main/res/drawable/bg_text_tag.xml index d887d85..dc10eab 100644 --- a/app/src/main/res/drawable/bg_text_tag.xml +++ b/app/src/main/res/drawable/bg_text_tag.xml @@ -1,8 +1,12 @@ + android:shape="oval"> - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notice_list.xml b/app/src/main/res/layout/item_notice_list.xml index 66a3154..51f92f1 100644 --- a/app/src/main/res/layout/item_notice_list.xml +++ b/app/src/main/res/layout/item_notice_list.xml @@ -17,7 +17,7 @@ android:layout_toStartOf="@id/noticeDateView" android:singleLine="true" android:text="这里是标题" - android:textSize="18sp" /> + android:textSize="@dimen/titleFontSize" /> + android:textColor="@color/gray" + android:textSize="12sp" /> + android:textColor="@color/gray" + android:textSize="@dimen/textFontSize" /> + android:textColor="@color/white" + android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tag_bottom_navigation.xml b/app/src/main/res/layout/tag_bottom_navigation.xml new file mode 100644 index 0000000..da34754 --- /dev/null +++ b/app/src/main/res/layout/tag_bottom_navigation.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..9d7b44f --- /dev/null +++ b/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/filepaths.xml b/app/src/main/res/xml/filepaths.xml deleted file mode 100644 index fafa14f..0000000 --- a/app/src/main/res/xml/filepaths.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file