package com.hiyo.game.pdk.tool;  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.InputStream;  
import java.net.URL;  
import java.net.URLConnection;  
import android.app.Activity;  
import android.app.AlertDialog;  
import android.app.ProgressDialog;  
import android.content.Context;  
import android.content.DialogInterface;  
import android.content.Intent;  
import android.content.pm.PackageInfo;  
import android.content.pm.PackageManager.NameNotFoundException;  
import android.net.ConnectivityManager;  
import android.net.NetworkInfo;  
import android.net.Uri;  
import android.util.Log;  
import android.webkit.URLUtil;  
import com.hiyo.game.pdk.activity.R;  
/** 
 * Android AutoUpdate. 
 *  
 * lazybone/2010.08.20 
 *  
 * 1.Set apkUrl. 
 *  
 * 2.check(). 
 *  
 * 3.add delFile() method in resume()\onPause(). 
 */ 
public class MyAutoUpdate {  
    public Activity activity = null;  
    public int versionCode = 0;  
    public String versionName = "";  
    private static final String TAG = "AutoUpdate";  
    private String currentFilePath = "";  
    private String currentTempFilePath = "";  
    private String fileEx = "";  
    private String fileNa = "";  
    private String strURL = "http://127.0.0.1:81/ApiDemos.apk";  
    private ProgressDialog dialog;  
    public MyAutoUpdate(Activity activity) {  
        this.activity = activity;  
        getCurrentVersion();  
    }  
    public void check() {  
        if (isNetworkAvailable(this.activity) == false) {  
            return;  
        }  
        if (true) {// Check version.  
            showUpdateDialog();  
        }  
    }  
    public static boolean isNetworkAvailable(Context ctx) {  
        try {  
            ConnectivityManager cm = (ConnectivityManager) ctx  
                    .getSystemService(Context.CONNECTIVITY_SERVICE);  
            NetworkInfo info = cm.getActiveNetworkInfo();  
            return (info != null && info.isConnected());  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
    public void showUpdateDialog() {  
        @SuppressWarnings("unused")  
        AlertDialog alert = new AlertDialog.Builder(this.activity)  
                .setTitle("Title")  
                .setIcon(R.drawable.icon)  
                .setMessage("Update or not?")  
                .setPositiveButton("Update",  
                        new DialogInterface.OnClickListener() {  
                            public void onClick(DialogInterface dialog,  
                                    int which) {  
                                downloadTheFile(strURL);  
                                showWaitDialog();  
                            }  
                        })  
                .setNegativeButton("Cancel",  
                        new DialogInterface.OnClickListener() {  
                            public void onClick(DialogInterface dialog,  
                                    int which) {  
                                dialog.cancel();  
                            }  
                        }).show();  
    }  
    public void showWaitDialog() {  
        dialog = new ProgressDialog(activity);  
        dialog.setMessage("Waitting for update...");  
        dialog.setIndeterminate(true);  
        dialog.setCancelable(true);  
        dialog.show();  
    }  
    public void getCurrentVersion() {  
        try {  
            PackageInfo info = activity.getPackageManager().getPackageInfo(  
                    activity.getPackageName(), 0);  
            this.versionCode = info.versionCode;  
            this.versionName = info.versionName;  
        } catch (NameNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  
    private void downloadTheFile(final String strPath) {  
        fileEx = strURL.substring(strURL.lastIndexOf(".") + 1, strURL.length())  
                .toLowerCase();  
        fileNa = strURL.substring(strURL.lastIndexOf("/") + 1,  
                strURL.lastIndexOf("."));  
        try {  
            if (strPath.equals(currentFilePath)) {  
                doDownloadTheFile(strPath);  
            }  
            currentFilePath = strPath;  
            Runnable r = new Runnable() {  
                public void run() {  
                    try {  
                        doDownloadTheFile(strPath);  
                    } catch (Exception e) {  
                        Log.e(TAG, e.getMessage(), e);  
                    }  
                }  
            };  
            new Thread(r).start();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    private void doDownloadTheFile(String strPath) throws Exception {  
        Log.i(TAG, "getDataSource()");  
        if (!URLUtil.isNetworkUrl(strPath)) {  
            Log.i(TAG, "getDataSource() It's a wrong URL!");  
        } else {  
            URL myURL = new URL(strPath);  
            URLConnection conn = myURL.openConnection();  
            conn.connect();  
            InputStream is = conn.getInputStream();  
            if (is == null) {  
                throw new RuntimeException("stream is null");  
            }  
            File myTempFile = File.createTempFile(fileNa, "." + fileEx);  
            currentTempFilePath = myTempFile.getAbsolutePath();  
            FileOutputStream fos = new FileOutputStream(myTempFile);  
            byte buf[] = new byte[128];  
            do {  
                int numread = is.read(buf);  
                if (numread <= 0) {  
                    break;  
                }  
                fos.write(buf, 0, numread);  
            } while (true);  
            Log.i(TAG, "getDataSource() Download  ok...");  
            dialog.cancel();  
            dialog.dismiss();  
            openFile(myTempFile);  
            try {  
                is.close();  
            } catch (Exception ex) {  
                Log.e(TAG, "getDataSource() error: " + ex.getMessage(), ex);  
            }  
        }  
    }  
    private void openFile(File f) {  
        Intent intent = new Intent();  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        intent.setAction(android.content.Intent.ACTION_VIEW);  
        String type = getMIMEType(f);  
        intent.setDataAndType(Uri.fromFile(f), type);  
        activity.startActivity(intent);  
    }  
    public void delFile() {  
        Log.i(TAG, "The TempFile(" + currentTempFilePath + ") was deleted.");  
        File myFile = new File(currentTempFilePath);  
        if (myFile.exists()) {  
            myFile.delete();  
        }  
    }  
    private String getMIMEType(File f) {  
        String type = "";  
        String fName = f.getName();  
        String end = fName  
                .substring(fName.lastIndexOf(".") + 1, fName.length())  
                .toLowerCase();  
        if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")  
                || end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {  
            type = "audio";  
        } else if (end.equals("3gp") || end.equals("mp4")) {  
            type = "video";  
        } else if (end.equals("jpg") || end.equals("gif") || end.equals("png")  
                || end.equals("jpeg") || end.equals("bmp")) {  
            type = "p_w_picpath";  
        } else if (end.equals("apk")) {  
            type = "application/vnd.android.package-archive";  
        } else {  
            type = "*";  
        }  
        if (end.equals("apk")) {  
        } else {  
            type += "/*";  
        }  
        return type;  
    }