diff --git a/common/build.gradle b/common/build.gradle index 9c418b625..bc5c7ddd9 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -189,8 +189,5 @@ dependencies { api files('libs/Msc.jar') api 'com.github.li-xiaojun:XPopup:2.9.1' - //app-updater - api 'com.github.jenly1314.AppUpdater:app-updater:1.1.3' - //app-dialog - api 'com.github.jenly1314.AppUpdater:app-dialog:1.1.3' + } diff --git a/common/src/main/java/com/yunbao/common/utils/APKDownloadUtil.java b/common/src/main/java/com/yunbao/common/utils/APKDownloadUtil.java new file mode 100644 index 000000000..420f75401 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/APKDownloadUtil.java @@ -0,0 +1,184 @@ +package com.yunbao.common.utils; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.view.Display; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.core.content.FileProvider; + +import com.yunbao.common.R; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class APKDownloadUtil { + /** + * APK文件下载 + * + * @param url + */ + public void downloadAPK(Activity context, String url, OnUpdateListener listener) { + Request request = new Request.Builder().url(url) + .addHeader("Accept-Encoding", "identity").build(); + File downloadFile = new File(context.getCacheDir(), "update_app.apk"); + try { + if (!downloadFile.exists() + && !downloadFile.createNewFile()) { + return; + } + } catch (IOException e) { + e.printStackTrace(); + } + showDialod(context); + new OkHttpClient().newCall(request).enqueue(new Callback() { + private Handler handler = new Handler(); + + @Override + public void onFailure(Call call, IOException e) { + // 下载失败 + handler.post(() -> { + listener.updateFailure(-1, e.getMessage()); + progressDialog.dismiss(); + }); + } + + @Override + public void onResponse(Call call, Response response) { + Looper.prepare(); + byte[] buf = new byte[2048]; + int len; + try (InputStream inputStream = response.body().byteStream(); + FileOutputStream outputStream = new FileOutputStream(downloadFile)) { + long total = response.body().contentLength(); + long sum = 0; + while ((len = inputStream.read(buf)) != -1) { + outputStream.write(buf, 0, len); + sum += len; + int progress = (int) (sum * 1.0f / total * 100); + // 下载中 + handler.post(new Runnable() { + @Override + public void run() { + tvProgress.setText(progress + "%"); + progressBar.setProgress(progress); + } + }); + } + outputStream.flush(); + //启动安装app + installApk(context, downloadFile, context.getPackageName() + ".fileprovider"); + handler.post(() -> progressDialog.dismiss()); + } catch (Exception e) { + e.printStackTrace(); + new Handler().post(() -> { + listener.updateFailure(-1, e.getMessage()); + progressDialog.dismiss(); + }); + } + } + }); + } + + /** + * 更新监听 + */ + public interface OnUpdateListener { + void updateFailure(int code, String error); + } +// +// /** +// * 启动app安装 +// * +// * @param context +// * @param filePath +// */ +// private static void startInstall(Context context, File filePath) { +// +// Intent install = new Intent(Intent.ACTION_VIEW); +// install.setDataAndType(Uri.parse("file://" + filePath.getAbsolutePath()), +// "application/vnd.android.package-archive"); +// install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// context.startActivity(install); +// } + + + /** + * 安装apk + * + * @param context + * @param file + */ + public void installApk(Context context, File file, String authority) { + Intent intent = getInstallIntent(context, file, authority); + context.startActivity(intent); + } + + /** + * 获取安装Intent + * + * @param context + * @param file + * @param authority + * @return + */ + public Intent getInstallIntent(Context context, File file, String authority) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addCategory(Intent.CATEGORY_DEFAULT); + Uri uriData; + String type = "application/vnd.android.package-archive"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + uriData = FileProvider.getUriForFile(context, authority, file); + } else { + uriData = Uri.fromFile(file); + } + intent.setDataAndType(uriData, type); + return intent; + } + + public TextView tvProgress; + public ProgressBar progressBar; + public Dialog progressDialog; + + private void showDialod(Activity context) { + if (progressDialog == null) { + progressDialog = new Dialog(context, R.style.dialog); + View view = LayoutInflater.from(context).inflate(R.layout.dialog_progress, null); + tvProgress = view.findViewById(R.id.tvProgress); + progressBar = view.findViewById(R.id.progressBar); + progressDialog.setContentView(view); + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Display display = wm.getDefaultDisplay(); + int width = display.getWidth(); + Window window = progressDialog.getWindow();// 这部分是设置dialog宽高的,宽高是我从sharedpreferences里面获取到的。之前程序启动的时候有获取 + window.getDecorView().setPadding(0, 0, 0, 0); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = width / 4 * 3; + window.setAttributes(lp); + } + progressDialog.setCancelable(false); + progressDialog.show(); + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/VersionUtil.java b/common/src/main/java/com/yunbao/common/utils/VersionUtil.java index 82a13aa94..27c6ab2df 100644 --- a/common/src/main/java/com/yunbao/common/utils/VersionUtil.java +++ b/common/src/main/java/com/yunbao/common/utils/VersionUtil.java @@ -2,37 +2,26 @@ package com.yunbao.common.utils; import android.app.Activity; import android.app.Dialog; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; -import android.os.Handler; import android.text.TextUtils; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; -import com.king.app.dialog.AppDialog; -import com.king.app.updater.AppUpdater; -import com.king.app.updater.UpdateConfig; -import com.king.app.updater.callback.UpdateCallback; -import com.king.app.updater.http.OkHttpManager; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.CommonAppContext; import com.yunbao.common.R; import com.yunbao.common.bean.ConfigBean; -import java.io.File; - public class VersionUtil { private static String sVersion; public TextView tvProgress; public ProgressBar progressBar; + /** * 是否是最新版本 */ @@ -49,176 +38,122 @@ public class VersionUtil { else return false; // return curVersion.equal(version); } - public void updateProgress(long progress, long total){ - if(tvProgress == null || progressBar == null){ - return; - } - if(progress > 0){ - int currProgress = (int)(progress * 1.0f / total * 100.0f); - tvProgress.setText(currProgress + "%"); - progressBar.setProgress(currProgress); - }else{ - tvProgress.setText("稍等"); - } - } - public void upd( Activity context, ConfigBean configBean, String downloadUrl){ - UpdateConfig config = new UpdateConfig(); - config.setUrl(downloadUrl); - config.addHeader("token","xxxxxx"); - AppUpdater mAppUpdater = new AppUpdater(context,config) - .setHttpManager(OkHttpManager.getInstance()) - .setUpdateCallback(new UpdateCallback() { - @Override - public void onDownloading(boolean isDownloading) { - if(isDownloading){ - ToastUtil.show("已经在下载中,请勿重复下载。"); - }else{ -// showToast("开始下载…"); - View view = LayoutInflater.from(context).inflate(R.layout.dialog_progress,null); - tvProgress = view.findViewById(R.id.tvProgress); - progressBar = view.findViewById(R.id.progressBar); - AppDialog.INSTANCE.showDialog(context,view,false); - } - } - - @Override - public void onStart(String url) { - updateProgress(0,100); - } - - @Override - public void onProgress(long progress, long total, boolean isChange) { - if(isChange){ - updateProgress(progress,total); - } - } - - @Override - public void onFinish(File file) { - AppDialog.INSTANCE.dismissDialog(); - ToastUtil.show("下载完成"); - } - - @Override - public void onError(Exception e) { - AppDialog.INSTANCE.dismissDialog(); - ToastUtil.show("下载失败"); - } - - @Override - public void onCancel() { - AppDialog.INSTANCE.dismissDialog(); - ToastUtil.show("取消下载"); - } - }); - mAppUpdater.start(); - } //是否是谷歌版本 - public void showDialog( Activity context, ConfigBean configBean, String downloadUrl) { - //不是谷歌 - if (CommonAppConfig.IS_GOOGLE_PLAY == false) { - //不强更 - if(configBean.getForceUpdate()!=1){ - DialogUitl.Builder builder = new DialogUitl.Builder(context); - builder.setTitle(WordUtil.getString(R.string.version_update)) - .setContent(configBean.getUpdateDes()) - .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) - .setCancelString(WordUtil.getString(R.string.version_not_update)) - .setCancelable(false) - .setClickCallback(new DialogUitl.SimpleCallback2() { - public void onCancelClick() { + public void showDialog(Activity context, ConfigBean configBean, String downloadUrl) { + //不是谷歌 + if (CommonAppConfig.IS_GOOGLE_PLAY == false) { + //不强更 + if (configBean.getForceUpdate() != 1) { + DialogUitl.Builder builder = new DialogUitl.Builder(context); + builder.setTitle(WordUtil.getString(R.string.version_update)) + .setContent(configBean.getUpdateDes()) + .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) + .setCancelString(WordUtil.getString(R.string.version_not_update)) + .setCancelable(false) + .setClickCallback(new DialogUitl.SimpleCallback2() { + public void onCancelClick() { - } + } - @Override - public void onConfirmClick(Dialog dialog, String content) { - context.runOnUiThread(new Runnable() { - @Override - public void run() { - upd(context,configBean,downloadUrl); - } - }); + @Override + public void onConfirmClick(Dialog dialog, String content) { + context.runOnUiThread(new Runnable() { + @Override + public void run() { +// upd(context,configBean,downloadUrl); + new APKDownloadUtil().downloadAPK(context, configBean.getDownloadApkUrl(), new APKDownloadUtil.OnUpdateListener() { + @Override + public void updateFailure(int code, String error) { - } - }) - .build() - .show(); - }else{ - DialogUitl.Builder builder = new DialogUitl.Builder(context); - builder.setTitle(WordUtil.getString(R.string.version_update)) - .setContent(configBean.getUpdateDes()) - .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) - .setCancelString(WordUtil.getString(R.string.version_not_update)) - .setCancelable(false) - .setClickCallback(new DialogUitl.SimpleCallback2() { - public void onCancelClick() { - context.finish(); - } + } + }); + } + }); - @Override - public void onConfirmClick(Dialog dialog, String content) { - upd(context,configBean,downloadUrl); - } - }) - .build() - .show(); - } + } + }) + .build() + .show(); + } else { + DialogUitl.Builder builder = new DialogUitl.Builder(context); + builder.setTitle(WordUtil.getString(R.string.version_update)) + .setContent(configBean.getUpdateDes()) + .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) + .setCancelString(WordUtil.getString(R.string.version_not_update)) + .setCancelable(false) + .setClickCallback(new DialogUitl.SimpleCallback2() { + public void onCancelClick() { + context.finish(); + } - //谷歌版本 - } else if (CommonAppConfig.IS_GOOGLE_PLAY == true) { - //谷歌强制更新 - if(configBean.getGoogle_isup().equals("1")) { - DialogUitl.Builder builder = new DialogUitl.Builder(context); - builder.setTitle(WordUtil.getString(R.string.version_update)) - .setContent(configBean.getUpdateDes()) - .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) - .setCancelString(WordUtil.getString(R.string.version_not_update)) - .setCancelable(false) - .setClickCallback(new DialogUitl.SimpleCallback2() { - public void onCancelClick() { - context.finish(); - } + @Override + public void onConfirmClick(Dialog dialog, String content) { +// upd(context,configBean,downloadUrl); + new APKDownloadUtil().downloadAPK(context, configBean.getDownloadApkUrl(), new APKDownloadUtil.OnUpdateListener() { + @Override + public void updateFailure(int code, String error) { - @Override - public void onConfirmClick(Dialog dialog, String content) { - Intent i = new Intent(android.content.Intent.ACTION_VIEW); - i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu")); - context.startActivity(i); - context.finish(); - } - }) - .build() - .show(); - //谷歌不强制 - }else { - DialogUitl.Builder builder = new DialogUitl.Builder(context); - builder.setTitle(WordUtil.getString(R.string.version_update)) - .setContent(configBean.getUpdateDes()) - .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) - .setCancelString(WordUtil.getString(R.string.version_not_update)) - .setCancelable(false) - .setClickCallback(new DialogUitl.SimpleCallback2() { - public void onCancelClick() { - } + } + }); + } + }) + .build() + .show(); + } - @Override - public void onConfirmClick(Dialog dialog, String content) { - Intent i = new Intent(android.content.Intent.ACTION_VIEW); - i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu")); - context.startActivity(i); - context.finish(); - } - }) - .build() - .show(); - } + //谷歌版本 + } else if (CommonAppConfig.IS_GOOGLE_PLAY == true) { + //谷歌强制更新 + if (configBean.getGoogle_isup().equals("1")) { + DialogUitl.Builder builder = new DialogUitl.Builder(context); + builder.setTitle(WordUtil.getString(R.string.version_update)) + .setContent(configBean.getUpdateDes()) + .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) + .setCancelString(WordUtil.getString(R.string.version_not_update)) + .setCancelable(false) + .setClickCallback(new DialogUitl.SimpleCallback2() { + public void onCancelClick() { + context.finish(); + } + + @Override + public void onConfirmClick(Dialog dialog, String content) { + Intent i = new Intent(android.content.Intent.ACTION_VIEW); + i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu")); + context.startActivity(i); + context.finish(); + } + }) + .build() + .show(); + //谷歌不强制 + } else { + DialogUitl.Builder builder = new DialogUitl.Builder(context); + builder.setTitle(WordUtil.getString(R.string.version_update)) + .setContent(configBean.getUpdateDes()) + .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) + .setCancelString(WordUtil.getString(R.string.version_not_update)) + .setCancelable(false) + .setClickCallback(new DialogUitl.SimpleCallback2() { + public void onCancelClick() { + } + + @Override + public void onConfirmClick(Dialog dialog, String content) { + Intent i = new Intent(android.content.Intent.ACTION_VIEW); + i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu")); + context.startActivity(i); + context.finish(); + } + }) + .build() + .show(); } } - - + } /** diff --git a/common/src/main/res/drawable/app_dialog_bg.xml b/common/src/main/res/drawable/app_dialog_bg.xml new file mode 100644 index 000000000..0c984ca59 --- /dev/null +++ b/common/src/main/res/drawable/app_dialog_bg.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_progress.xml b/common/src/main/res/layout/dialog_progress.xml index eb1bbbfb2..e78936588 100644 --- a/common/src/main/res/layout/dialog_progress.xml +++ b/common/src/main/res/layout/dialog_progress.xml @@ -19,7 +19,7 @@ android:layout_height="wrap_content" android:layout_toRightOf="@+id/ivIcon" android:textSize="14sp" - android:textColor="@color/app_dialog_title_color" + android:textColor="#333333" android:text="更新中"/>