/* * Copyright 2012 Share.Ltd All rights reserved. * Share.Ltd PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * ������� * @ActUpdateApp.java - 2012-11-23 ����11:25:24 - Anonymous */ package com.kaixin.android.service; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.kaixin.android.R; import com.kaixin.android.common.Constants; import com.kaixin.android.utils.ApplicationUtil; import com.kaixin.android.utils.CallService; /** * ������� * @author mous * */ public class UpdateApp { private final static int WHAT_PROGRESS = 1; private final static int WHAT_INSTALL = 2; private final static int WHAT_BROADCAST = 3; private final static int WHAT_COMUP = 4; private final static int NO_UPDATA = 5; private final static int WHAT_ERROR = -1; private boolean mCompulsoryUpdate; private ProgressBar mProgressBar; private int current; private TextView mDownloadTxt; public static int mLoadingProcess; public static String upAppName = ApplicationUtil.getApplicationContext().getString(R.string.apk_name); // ��������APK��ַ private String DOWNLOAD_URL = Constants.getApkUrl() + upAppName; private String mJsonVal; private Context context; private String mServerCode; private String mUpInfo; private String mUpCodeName; public UpdateApp(Context context) { this.context = context; } public void checkUpdate() { current = ApplicationUtil.getVersionCode(context); mLoadingProcess = 0; if (ApplicationUtil.isNetWorkConnected(context)) { new Thread() { public void run() { try { getServerCode(current); if (Integer.parseInt(mServerCode) > current) { if (!mCompulsoryUpdate) { sendMsg(WHAT_COMUP, 0); } else if (mCompulsoryUpdate) { sendMsg(WHAT_BROADCAST, 0); } else { sendMsg(NO_UPDATA, 0); } } } catch (Exception e) { e.printStackTrace(); } } }.start(); return; } else { Toast.makeText(context, context.getString(R.string.network_toast), Toast.LENGTH_SHORT).show(); } } private void getServerCode(int numberval) throws IOException { /*URL url = new URL(Constants.getUrl() + "/UpdateServlet/"); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setDoOutput(true); httpURLConnection.setDoInput(true); HttpURLConnection.setFollowRedirects(true); httpURLConnection.setRequestMethod("POST"); httpURLConnection.setUseCaches(false); httpURLConnection.setInstanceFollowRedirects(true); httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); httpURLConnection.setConnectTimeout(50000); httpURLConnection.setReadTimeout(50000); httpURLConnection.connect(); DataOutputStream out = new DataOutputStream(httpURLConnection.getOutputStream()); // String content = "version=" + numberval; // out.writeBytes(content); out.flush(); out.close(); BufferedReader in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream())); String line = null; mJsonVal = new StringBuilder(); while ((line = in.readLine()) != null) { mJsonVal.append(line); } try { JSONObject jsonObject; jsonObject = new JSONObject(mJsonVal.toString()); mServerCode = jsonObject.getJSONObject("data").getString("code"); mUpInfo = jsonObject.getJSONObject("data").getString("info"); mUpCodeName = jsonObject.getJSONObject("data").getString("name"); mCompulsoryUpdate = jsonObject.getJSONObject("data").optBoolean("type"); } catch (JSONException e) { e.printStackTrace(); } in.close(); httpURLConnection.disconnect();*/ mJsonVal = CallService.getUpdate(); try { JSONObject jsonObject; jsonObject = new JSONObject(mJsonVal.toString()); mServerCode = jsonObject.getJSONObject("data").getString("code"); mUpInfo = jsonObject.getJSONObject("data").getString("info"); mUpCodeName = jsonObject.getJSONObject("data").getString("name"); mCompulsoryUpdate = jsonObject.getJSONObject("data").optBoolean("type"); } catch (JSONException e) { e.printStackTrace(); } } public void Beginning() { LinearLayout ll = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.layout_progress, null); mProgressBar = (ProgressBar) ll.findViewById(R.id.down_pb); mDownloadTxt = (TextView) ll.findViewById(R.id.download_txt); Builder builder = new Builder(context); builder.setView(ll); builder.setTitle(context.getString(R.string.update_load_txt)); builder.setNegativeButton(context.getString(R.string.update_hide_txt), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(context, UpdateService.class); context.startService(intent); dialog.dismiss(); } }); builder.show(); new Thread() { public void run() { loadFile(DOWNLOAD_URL); } }.start(); } public void loadFile(String url) { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response; try { response = client.execute(get); HttpEntity entity = response.getEntity(); float length = entity.getContentLength(); InputStream is = entity.getContent(); FileOutputStream fileOutputStream = null; if (is != null) { File file = new File(Environment.getExternalStorageDirectory(), upAppName); fileOutputStream = new FileOutputStream(file); byte[] buf = new byte[1024]; int ch = -1; float count = 0; while ((ch = is.read(buf)) != -1) { fileOutputStream.write(buf, 0, ch); count += ch; sendMsg(1, (int) (count * 100 / length)); } } sendMsg(2, 0); fileOutputStream.flush(); if (fileOutputStream != null) { fileOutputStream.close(); } } catch (Exception e) { sendMsg(-1, 0); } } private void sendMsg(int flag, int c) { Message msg = new Message(); msg.what = flag; msg.arg1 = c; handler.sendMessage(msg); } private Handler handler = new Handler() { public void handleMessage(Message msg) { if (!Thread.currentThread().isInterrupted()) { switch (msg.what) { case WHAT_BROADCAST: showDialog(); break; case WHAT_COMUP: showCompulsoryDialog(); break; case NO_UPDATA: Toast.makeText(context, "当前无需更新!", Toast.LENGTH_SHORT).show(); break; case WHAT_PROGRESS: mProgressBar.setProgress(msg.arg1); mLoadingProcess = msg.arg1; mDownloadTxt.setText(context.getString(R.string.update_dow_ok_txt) + mLoadingProcess + "%"); break; case WHAT_INSTALL: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory(), upAppName)), "application/vnd.android.package-archive"); context.startActivity(intent); break; case WHAT_ERROR: String error = msg.getData().getString("error"); Toast.makeText(context, error, Toast.LENGTH_SHORT).show(); break; } } super.handleMessage(msg); } }; private void showCompulsoryDialog() { Dialog dialog = new AlertDialog.Builder(context) .setTitle(context.getString(R.string.update_com_dialog_tit)) .setMessage( context.getString(R.string.update_old_txt) + ApplicationUtil.getVerName(context) + context.getString(R.string.update_new_txt) + mUpCodeName + "\n 本次更新:\n" + mUpInfo + context.getString(R.string.update_com_up_txt)) .setPositiveButton(context.getString(R.string.update_ok_txt), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Beginning(); dialog.dismiss(); } }).setNegativeButton(context.getString(R.string.update_com_no_txt), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { ApplicationUtil.onExitApplication((Activity) context); } }).create(); dialog.show(); dialog.setCancelable(false); } private void showDialog() { Dialog dialog = new AlertDialog.Builder(context) .setTitle(context.getString(R.string.update_dialog_tit)) .setMessage( context.getString(R.string.update_old_txt) + ApplicationUtil.getVerName(context) + context.getString(R.string.update_new_txt) + mUpCodeName + "\n 本次更新:\n" + mUpInfo) .setPositiveButton(context.getString(R.string.update_ok_txt), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Beginning(); dialog.dismiss(); } }).setNegativeButton(context.getString(R.string.update_no_txt), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }).create(); dialog.show(); } public JSONObject getJsonObject(String Url) { HttpClient client = new DefaultHttpClient(); StringBuilder sb = new StringBuilder(); String js = null; JSONObject son = null; HttpGet myget = new HttpGet(Url); try { HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 8000); HttpResponse response = client.execute(myget); BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); for (String s = reader.readLine(); s != null; s = reader.readLine()) { sb.append(s); } js = sb.toString(); son = new JSONObject(js); } catch (Exception e) { return null; } return son; } }