package com.gzsll.hupu.util; import android.app.Activity; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.support.v4.app.NotificationCompat; import android.text.Html; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.alibaba.fastjson.JSON; import com.gzsll.hupu.BuildConfig; import com.gzsll.hupu.Constants; import com.gzsll.hupu.R; import com.gzsll.hupu.bean.UpdateInfo; import com.gzsll.hupu.components.okhttp.OkHttpHelper; import com.gzsll.hupu.ui.main.MainActivity; import com.liulishuo.filedownloader.BaseDownloadTask; import com.liulishuo.filedownloader.FileDownloadListener; import com.liulishuo.filedownloader.FileDownloader; import com.yalantis.phoenix.util.Logger; import java.io.File; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; /** * Created by sll on 2015/10/8. */ public class UpdateAgent { private OkHttpHelper mOkHttpHelper; private Activity mActivity; private NotificationManager mNotifyManager; private NotificationCompat.Builder mBuilder; private Uri destinationUri; public static final String SDCARD_ROOT = Environment.getExternalStorageDirectory().getAbsolutePath() + "/gzsll/hupu"; public UpdateAgent(OkHttpHelper mOkHttpHelper, Activity mActivity) { this.mOkHttpHelper = mOkHttpHelper; this.mActivity = mActivity; } public void checkUpdate() { this.checkUpdate(true); } public void checkUpdate(final boolean show) { mNotifyManager = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE); mBuilder = new NotificationCompat.Builder(mActivity); Observable.create(new Observable.OnSubscribe<UpdateInfo>() { @Override public void call(Subscriber<? super UpdateInfo> subscriber) { try { String result = mOkHttpHelper.getStringFromServer(Constants.UPDATE_URL); subscriber.onNext(JSON.parseObject(result, UpdateInfo.class)); subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<UpdateInfo>() { @Override public void call(UpdateInfo updateInfo) { if (updateInfo != null) { checkUpdateFinished(updateInfo, show); if (updateInfo.extra != null) { SettingPrefUtil.setNeedExam(mActivity, updateInfo.extra.needExam == 1); } SettingPrefUtil.setHuPuSign(mActivity, updateInfo.hupuSign); } } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { throwable.printStackTrace(); } }); } private void checkUpdateFinished(UpdateInfo updateInfo, boolean show) { if (updateInfo.versionCode > BuildConfig.VERSION_CODE && SettingPrefUtil.getAutoUpdate( mActivity) && show) { showUpdateDialog(updateInfo); } } private void showUpdateDialog(final UpdateInfo updateInfo) { if (updateInfo != null) { MaterialDialog.Builder builder = new MaterialDialog.Builder(mActivity).title("升级新版本"); builder.positiveText("立刻升级").negativeText("取消").content(Html.fromHtml(updateInfo.updateInfo)); builder.callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { try { String url = updateInfo.updateUrl; mBuilder.setContentTitle(mActivity.getString(R.string.app_name) + "正在更新") .setAutoCancel(true) .setSmallIcon(mActivity.getPackageManager() .getPackageInfo(mActivity.getPackageName(), 0).applicationInfo.icon); destinationUri = Uri.parse(SDCARD_ROOT + File.separator + FormatUtil.getFileNameFromUrl(url)); FileDownloader.getImpl() .create(url) .setPath(SDCARD_ROOT + File.separator + FormatUtil.getFileNameFromUrl(url)) .setListener(listener) .start(); Toast.makeText(mActivity, "开始下载新版本,稍后会开始安装", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } } }).show(); } } private FileDownloadListener listener = new FileDownloadListener() { @Override protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) { } @Override protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) { int progress = soFarBytes * 100 / totalBytes; String content = String.format("正在下载:%1$d%%", progress); mBuilder.setContentText(content).setProgress(totalBytes, soFarBytes, false); PendingIntent pendingintent = PendingIntent.getActivity(mActivity, 0, new Intent(mActivity, MainActivity.class), PendingIntent.FLAG_CANCEL_CURRENT); mBuilder.setContentIntent(pendingintent); mNotifyManager.notify(0, mBuilder.build()); } @Override protected void blockComplete(BaseDownloadTask task) { } @Override protected void completed(BaseDownloadTask task) { Intent installAPKIntent = new Intent(Intent.ACTION_VIEW); //如果没有设置SDCard写权限,或者没有sdcard,apk文件保存在内存中,需要授予权限才能安装 FileUtil.chmod("777", destinationUri.getPath()); installAPKIntent.setDataAndType(Uri.parse("file://" + destinationUri.getPath()), "application/vnd.android.package-archive"); PendingIntent pendingIntent = PendingIntent.getActivity(mActivity, 0, installAPKIntent, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(pendingIntent); installAPKIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mActivity.startActivity(installAPKIntent); // 下载完成 mBuilder.setContentText("下载成功(点击安装)").setProgress(0, 0, false); mNotifyManager.notify(0, mBuilder.build()); } @Override protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) { } @Override protected void error(BaseDownloadTask task, Throwable e) { Logger.d("error:" + e.getMessage()); } @Override protected void warn(BaseDownloadTask task) { } }; }