package com.mfh.comna.bizz.update;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import com.mfh.comn.net.data.IResponseData;
import com.mfh.comn.net.data.RspBean;
import com.mfh.comna.R;
import com.mfh.comna.api.helper.SharedPreferencesHelper;
import com.mfh.comna.api.ui.dialog.DialogHelper;
import com.mfh.comna.api.utils.DeviceUtils;
import com.mfh.comna.api.utils.FileUtil;
import com.mfh.comna.api.utils.MLog;
import com.mfh.comna.api.utils.SharedPreferencesUtil;
import com.mfh.comna.comn.ComnApplication;
import com.mfh.comna.comn.database.dao.FileNetDao;
import com.mfh.comna.comn.database.dao.NetCallBack;
import com.mfh.comna.network.NetFactory;
import net.tsz.afinal.http.AjaxParams;
import java.io.File;
/**
* 应用升级工具类
* TODO ,异步通知
* Created by Administrator on 14-6-4.
*/
public class AppUpdateManager {
private Context appContext;
private FileNetDao fileNetDao;
public static String APK_NAME_FOR_UPDATE = "appName";//应用程序名,用于检查版本更新
public static String APK_DOWNLOAD_DIR_NAME = "download";//apk下载存放目录
public static final String ACTION_APPUPDATE_CHECK_FINISH = "app.update.check.finish";
public static final String APP_DOWNLOAD_NOTIFY = "app.download.notify";
public static final String APP_UPDATE_NAME_BY_INIT = "init.activity.app.update.name";
private static final String URL_APP_UPDATE_VERSIOIN = NetFactory.getUpdateServerUrl() + "/app/update/version";
private static final String URL_APP_UPDATE_DOWNLOAD = NetFactory.getUpdateServerUrl() + "/app/update/download";
/**
* 构造函数
* @param context
*/
public AppUpdateManager(Context context) {
this.appContext = context;
//使用SD卡根路径存储下载的临时文件,若没有sd卡,则使用程序私有目录,比较昂贵
fileNetDao = new FileNetDao(APK_DOWNLOAD_DIR_NAME, URL_APP_UPDATE_DOWNLOAD, FileUtil.getSDRootPath());//"/storage/sdcard0"
fileNetDao.setUseLocalFirst(false);//每次都重新下载
}
/**
* 检查服务器端版本号,若有新版本则启动下载并安装
* @return
*/
public void checkServVersionCode(AjaxParams param) {
NetFactory.getHttp().get(URL_APP_UPDATE_VERSIOIN + "?apk=" + APK_NAME_FOR_UPDATE, param,
new NetCallBack.NormalNetTask<AppInfo>(AppInfo.class) {
@Override
public void processResult(IResponseData rspData) {
RspBean<AppInfo> result = (RspBean<AppInfo>) rspData;
final AppInfo appInfo = result.getValue();
if (appInfo == null) {
return;
}
int curVersion = ComnApplication.getVersionCode();
int newVersionCode = appInfo.getVersionCode();
MLog.d(String.format("checkServVersionCode.processResult, serverVC=%d, localVC=%d",
newVersionCode, curVersion));
if (appInfo.getVersionCode() > curVersion) {
String appName = appInfo.getApkName();
if (!TextUtils.isEmpty(appName)) {
SharedPreferencesUtil.set(appContext, SharedPreferencesHelper.PREF_NAME_APP_UPDATE,
SharedPreferencesHelper.PREF_KEY_APP_UPDATE_NAME, appInfo.getApkName());
SharedPreferencesUtil.set(appContext, SharedPreferencesHelper.PREF_NAME_APP_UPDATE,
SharedPreferencesHelper.PREF_KEY_APP_UPDATE_VERSIONNAME, appInfo.getVersionName());
Message msg = new Message();
msg.what = MSG_UPDATE_NEWVERSION;
// msg.obj = appInfo.getApkName();
uiHandler.sendMessage(msg);
}
} else {
SharedPreferencesUtil.clear(appContext, SharedPreferencesHelper.PREF_NAME_APP_UPDATE);
notifyFinish();
}
}
@Override
protected void doFailure(Throwable t, String errMsg) {
MLog.d("doFailure " + errMsg);
super.doFailure(t, errMsg);
notifyFinish();
}
});
}
/**
* 升级检查结束
*/
protected void notifyFinish() {
// Intent intent = new Intent(ACTION_APPUPDATE_CHECK_FINISH);
// appContext.sendBroadcast(intent);
}
/**
* 杀死当前进程
*/
private void killProcess() {
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
System.exit(0);
/*ActivityManager activityMan = (ActivityManager)appContext.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> process = activityMan.getRunningAppProcesses();
int len = process.size();
for(int i = 0;i<len;i++) {
if (process.get(i).processName.equals(appContext.getPackageName())) {
android.os.Process.killProcess(process.get(i).pid);
break;
}
}*/
}
private static final int MSG_UPDATE_NEWVERSION = 0;
private Handler uiHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MSG_UPDATE_NEWVERSION:{
YesOrNoToNewVersion();
}
}
super.handleMessage(msg);
}
};
/**
* 提示是否安装更新
* */
private void YesOrNoToNewVersion() {
final String appName = SharedPreferencesUtil.get(appContext, SharedPreferencesHelper.PREF_NAME_APP_UPDATE,
SharedPreferencesHelper.PREF_KEY_APP_UPDATE_NAME, "");
final String versionName = SharedPreferencesUtil.get(appContext, SharedPreferencesHelper.PREF_NAME_APP_UPDATE,
SharedPreferencesHelper.PREF_KEY_APP_UPDATE_VERSIONNAME, "");
SharedPreferencesUtil.clear(appContext, SharedPreferencesHelper.PREF_NAME_APP_UPDATE);
AlertDialog.Builder dialog = DialogHelper.getConfirmDialog(appContext,
appContext.getString(R.string.dialog_message_app_update),
appContext.getString(R.string.dialog_button_appupdate), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
doDownLoad(appName);
}
});
// dialog.setIcon(R.drawable.ic_launcher);
dialog.setTitle(appContext.getString(R.string.dialog_title_app_update, versionName));
dialog.setCancelable(false);
dialog.show();
}
/**
* 执行下载
*/
public void doDownLoad(String apkName) {
final Dialog dialog = DialogHelper.genProgressDialog(appContext,false,"正在下载更新程序...");
//执行下载
fileNetDao.processFile(apkName, new FileNetDao.CallBack() {
@Override
public void processFile(File file) {
try {
//下载完成,自动执行安装
doSetUp(file);
}
catch (Throwable e) {
if (dialog != null)
dialog.dismiss();
notifyFinish();
}
}
@Override
public void onFailure(String fileName, Throwable e) {
if (dialog != null)
dialog.dismiss();
notifyFinish();
}
});
}
/**
* 执行安装
*/
private void doSetUp(File file) {
if (!file.exists())
throw new RuntimeException("安装包不存在!");
DeviceUtils.installAPK(appContext, file);
killProcess();
}
}