package com.sinata.download.utils;
|
|
import android.app.ProgressDialog;
|
import android.content.Context;
|
import android.content.DialogInterface;
|
import android.content.Intent;
|
import android.content.pm.PackageManager;
|
import android.os.Handler;
|
import android.os.Looper;
|
import android.os.Message;
|
import android.text.TextUtils;
|
import android.widget.Toast;
|
|
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentManager;
|
|
import com.sinata.download.R;
|
import com.sinata.download.entity.Version;
|
import com.sinata.download.http.DownLoadManager;
|
import com.sinata.download.DownloadLibrary;
|
import com.sinata.download.http.DownloadListener;
|
import com.sinata.download.service.ApkDownLoadListener;
|
import com.sinata.download.service.DownloadService;
|
|
import java.io.File;
|
import java.text.SimpleDateFormat;
|
import java.util.Locale;
|
|
|
/**
|
* author:Created by zhaohaoting on 2019/6/25
|
* email:526309416@qq.com
|
* desc:
|
*/
|
public class VersionUpdateUtils {
|
private Context mContext;
|
private final FragmentManager fragmentManager;
|
private boolean isServiceDownload = true; //是否开启服务后台下载
|
|
public VersionUpdateUtils(FragmentActivity mContext, boolean isServiceDownload, TipsDialogProvider tipsDialogProvider) {
|
this.mContext = mContext;
|
fragmentManager = mContext.getSupportFragmentManager();
|
this.tipsDialogProvider = tipsDialogProvider;
|
this.isServiceDownload = isServiceDownload;
|
}
|
|
/**
|
* 检查新版本
|
*
|
* @param currentVersion 服务最新版本
|
*/
|
public void checkNewVersion(Version currentVersion) {
|
|
try {
|
if (currentVersion.getReleaseCode().compareTo(mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName) < 1) {
|
return;
|
}
|
} catch (PackageManager.NameNotFoundException e) {
|
e.printStackTrace();
|
}
|
updateVersion(currentVersion);
|
}
|
|
/**
|
* 更新
|
*
|
* @param version
|
*/
|
private void updateVersion(final Version version) {
|
//若数据库缓存的应用版本号小于或等于了当前应用版本号,直接返回出去
|
|
//保存下载链接
|
String url = version.getUrl();
|
if (url == null) return;
|
if (version.isMandatory()) {
|
forceUpdate(version);
|
} else {
|
String versionCode = VersionPreferences.getString(VersionPreferences.VERSION_CODE, "0");
|
// /**(一天提示一次)*/
|
// if (version.getTipsTime().equals(new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA).format(System.currentTimeMillis()))) return;
|
/**(一个版本提示一次)*/
|
if (!TextUtils.isEmpty(versionCode) && version.getReleaseCode().compareTo(versionCode) < 1) {
|
return;
|
} else {
|
VersionPreferences.saveString(VersionPreferences.VERSION_CODE, version.getReleaseCode());
|
// delLocationNewPackage(url);
|
//静默下载安装包
|
if (Utils.isWifi(mContext)) {//如果在wifi状态下自动更新 否则提示用户
|
startService(version);
|
} else {
|
//提示有新版本
|
if (tipsDialogProvider != null) {
|
tipsDialogProvider.getVersionUpdateDialog(version, new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
String newVersionUrl = version.getUrl();
|
if (TextUtils.isEmpty(newVersionUrl)) return;
|
if (isServiceDownload) {
|
Toast.makeText(mContext, mContext.getString(R.string.add_download_queue), Toast.LENGTH_SHORT).show();
|
startService(version);
|
} else {
|
showDownloadDialog(newVersionUrl);
|
}
|
}
|
}, new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
VersionPreferences.saveString(VersionPreferences.TIPS_TIME, new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA).format(System.currentTimeMillis()));
|
dialog.dismiss();
|
}
|
}).show(fragmentManager, " tipsDialog");
|
}
|
}
|
}
|
}
|
}
|
|
/**
|
* 启动后台下载service
|
*
|
* @param version
|
*/
|
private void startService(Version version) {
|
Intent service = new Intent(mContext, DownloadService.class);
|
service.putExtra("url", version.getUrl());
|
service.putExtra("type", DownloadService.TYPE_APK);
|
mContext.startService(service);
|
}
|
|
private TipsDialogProvider tipsDialogProvider;
|
|
public void setTipsDialogProvider(TipsDialogProvider tipsDialogProvider) {
|
this.tipsDialogProvider = tipsDialogProvider;
|
}
|
|
public interface TipsDialogProvider {
|
|
DialogFragment getVersionUpdateDialog(Version version, DialogInterface.OnClickListener confirmClickListener, DialogInterface.OnClickListener cancelClickListener);
|
|
DialogFragment getForceUpdateDialog(Version version, DialogInterface.OnClickListener onClickListener);
|
}
|
|
/**
|
* 是否需要强制更新
|
*
|
* @param version
|
* @return
|
*/
|
private boolean isForceUpdateNewVersion(final Version version) {
|
return version.isMandatory();
|
}
|
|
/**
|
* 判断本地是否有最新安装包
|
*
|
* @param url
|
* @return
|
*/
|
private void delLocationNewPackage(final String url) {
|
String apklocalUrl = getApkLocationPath(url);
|
if (!TextUtils.isEmpty(apklocalUrl) && new File(apklocalUrl).exists()) {
|
File file = new File(apklocalUrl);
|
boolean exists = file.exists();
|
if (exists) {
|
file.delete();
|
}
|
}
|
}
|
|
/**
|
* 强制更新
|
*
|
* @param version
|
* @return
|
*/
|
private void forceUpdate(final Version version) {
|
//提示强制更新
|
if (tipsDialogProvider != null) {
|
tipsDialogProvider.getForceUpdateDialog(version, new DialogInterface.OnClickListener() {
|
|
@Override
|
public void onClick(DialogInterface dialogInterface, int which) {
|
showDownloadDialog(version.getUrl());
|
}
|
}).show(fragmentManager, "forceUpdateDialog");
|
}
|
}
|
|
private void showDownloadDialog(String url) {
|
final ProgressDialog mpDialog = new ProgressDialog(mContext);
|
mpDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置风格为线性进度条
|
mpDialog.setMessage(mContext.getString(R.string.new_version_downloading));
|
mpDialog.setCancelable(true);//设置进度条是否可以按退回键取消
|
mpDialog.setCanceledOnTouchOutside(false);
|
mpDialog.setMax(100);
|
mpDialog.show();
|
// delLocationNewPackage(version.getUrl());
|
final String apkLocationPath = getApkLocationPath(url);
|
DownLoadManager.downLoadFile(url, apkLocationPath, new DownloadListener() {
|
@Override
|
public void onStartDownload() {
|
}
|
|
@Override
|
public void onProgress(final int progress) {
|
mpDialog.setProgress(progress);
|
}
|
|
@Override
|
public void onFinishDownload(boolean isHasLocation) {
|
Message message = handler.obtainMessage(1, apkLocationPath);
|
message.sendToTarget();
|
}
|
|
@Override
|
public void onFail(String errorInfo) {
|
}
|
});
|
}
|
|
private Handler handler = new Handler(Looper.myLooper()) {
|
@Override
|
public void handleMessage(Message msg) {
|
if (msg.what == 1) {
|
ApkDownLoadListener apkDownLoadListener = DownloadLibrary.getApkDownLoadListener();
|
if (apkDownLoadListener != null) {
|
apkDownLoadListener.downLoadSuccess((String) msg.obj);
|
}
|
// Utils.installApk(mContext, (String) msg.obj);
|
}
|
}
|
};
|
|
/**
|
* 获取本地路径
|
*
|
* @param url
|
* @return
|
*/
|
public String getApkLocationPath(String url) {
|
String[] split = url.split("/");
|
int length = split.length;
|
if (length <= 0) return null;
|
String fileName = split[length - 1];
|
return DownloadLibrary.APK_PATH + fileName;
|
}
|
}
|