package com.backfire.utils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

import org.apache.http.util.EncodingUtils;

import com.umeng.analytics.MobclickAgent;


import android.content.Context;



public class UEHandler implements Thread.UncaughtExceptionHandler {  
    /** Debug Log tag*/  
    public static final String TAG = "UEHandler";  
    /** 是否开启日志输出,在Debug状态下开启, 
     * 在Release状态下关闭以提示程序性能 
     * */  
    public static final boolean DEBUG = true;  
    /** 系统默认的UncaughtException处理类 */  
    private Thread.UncaughtExceptionHandler mDefaultHandler;  
    /** CrashHandler实例 */  
    private static UEHandler INSTANCE;  
    /** 程序的Context对象 */  
    private Context mContext;  
    private ByteArrayOutputStream baos;
    private PrintStream printStream;
    private static String ERRORLOG ;
      
    /** 保证只有一个CrashHandler实例 */  
    private UEHandler() {}  
    /** 获取CrashHandler实例 ,单例模式*/  
    public static UEHandler getInstance() {  
        if (INSTANCE == null) {  
            INSTANCE = new UEHandler();  
        }  
        return INSTANCE;  
    }  
  
    /** 
     * 初始化,注册Context对象, 
     * 获取系统默认的UncaughtException处理器, 
     * 设置该CrashHandler为程序的默认处理器 
     *  
     * @param ctx 
     */  
    public void init(Context ctx) {  
        mContext = ctx;  
        ERRORLOG= "/data/data/"+mContext.getPackageName()+"/error.log";//设置路径
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();   
        Thread.setDefaultUncaughtExceptionHandler(this);  
    }  
  
    /** 
     * 当UncaughtException发生时会转入该函数来处理 
     */  
    @Override  
    public void uncaughtException(Thread thread, Throwable ex) {  
    	MobclickAgent.reportError(mContext,ex.getMessage());
        if (!handleException(ex) && mDefaultHandler != null) {  
            //如果用户没有处理则让系统默认的异常处理器来处理  
            mDefaultHandler.uncaughtException(thread, ex);  
        } else {  
            //Sleep一会后结束程序  
            try {  
                Thread.sleep(3000);  
            } catch (InterruptedException e) {  
                Log.e(TAG, "Error : ", e);  
                e.printStackTrace();
            }  
            
            android.os.Process.killProcess(android.os.Process.myPid());  
            System.exit(10);  
        }  
    }  
  
    /** 
     * 自定义错误处理,收集错误信息 
     * 发送错误报告等操作均在此完成. 
     * 开发者可以根据自己的情况来自定义异常处理逻辑 
     * @param ex 
     * @return true:如果处理了该异常信息;否则返回false 
     */  
    private boolean handleException(Throwable ex) {  
        if (ex == null) {  
            return true;  
        }  
    	ex.printStackTrace();
        baos = new ByteArrayOutputStream();  
        printStream = new PrintStream(baos);  
        ex.printStackTrace(printStream);  
        byte[] data = baos.toByteArray(); 
        String info = new String(data);  
        write2ErrorLog(info);
        //发送错误报告到服务器  
         //sendReportsToServer();  
        return true;  
    }  
  
//    /** 
//     * 在程序启动时候, 可以调用该函数来发送以前没有发送的报告 
//     */  
//    public void sendReportsToServer() {  
//    	final String errorStr =  getErrorLog();
//		if (errorStr != null) {// 如果错误信息不等于空，则直接提交错误信息到服务器
//			new Thread() {
//				public void run() {
//					// 获取手机信息
//					String imeiStr="";
//					try {
//						TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
//						  imeiStr = telephonyManager.getDeviceId();
//					} catch (Exception e3) {
//						// TODO Auto-generated catch block
//						e3.printStackTrace();
//					}
//					String versionName="1.0.0";
//					try {
//						versionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName;
//					} catch (NameNotFoundException e2) {
//							e2.printStackTrace();
//					}
//					String content = "appver："+versionName+";error:" + errorStr + ";model:"
//							+ Build.MODEL + ";os:" + Build.VERSION.RELEASE;
//					try {
//						// 进行转码
//						content = URLEncoder.encode(content, "UTF-8");
//					} catch (UnsupportedEncodingException e1) {
//						e1.printStackTrace();
//					}
//
//					// 请求链接
//					final String urlAPI = "http://3ghappy.net/and/Resp.aspx?imei="
//							+ imeiStr + "&content=" + content
//							+"&app="+mContext.getString(R.string.app_name)+"&type=error";
//
//					// 创建Http Get连接
//					HttpGet httpRequest = new HttpGet(urlAPI);
//					try {
//						HttpResponse httpResponse = new DefaultHttpClient()
//								.execute(httpRequest);
//						if (httpResponse!=null
//								&&httpResponse.getStatusLine().getStatusCode() == 200) {
//							// 如果提交错误信息成功，则将错误信息删除
//							UEHandler.delectErrorLog();
//						}
//					} catch (ClientProtocolException e) {
//						e.printStackTrace();
//					} catch (IOException e) {
//						e.printStackTrace();
//					}
//				}
//			}.start();
//		}
//	}
       /**
	 * 将错误信息写入error.log文件
	 * @param path
	 * @param content
	 */
	synchronized private void write2ErrorLog(String content) {
		File file;
		FileOutputStream out = null;
		try {
			file = new File(ERRORLOG);
			if (file.exists()) {  
                // 清空之前的记录  
                file.delete();  
            }   
        	// 创建文件
        	file.createNewFile(); 
			// 打开文件file的OutputStream
			out = new FileOutputStream(file);
			String infoToWrite = content;
			// 将字符串转换成byte数组写入文件
			out.write(infoToWrite.getBytes()); 
			
			
		} catch (IOException e) {
			// 将出错信息打印到Logcat
			 e.toString();

		} finally {  
            try {  
                if (out != null) {  
                	// 关闭文件file的OutputStream
                	out.close(); 
                 }
                }  catch (Exception e) {  
                e.printStackTrace();  
              }  
		}
	}

	/**
	 * 获取错误信息。如果上次软件为中途退出，
	 * 则在从新开启软件时提醒用户是否提交错误内容
	 * @return 如果返回null则表示无错误。否则，返回的为错误
	 */
	synchronized public String getErrorLog() {
		File file;
		String str = "";
		FileInputStream in;
		try {
			// 打开文件file的InputStream
			file = new File(ERRORLOG);
			if (!file.exists()) {  
                return null;
            }   
			in = new FileInputStream(file);
			// 将文件内容全部读入到byte数组
			int length = (int) file.length();
			byte[] temp = new byte[length];
			in.read(temp, 0, length);
			// 将byte数组用UTF-8编码并存入display字符串中
			str = EncodingUtils.getString(temp, "UTF-8");
			// 关闭文件file的InputStream
			in.close();
		} catch (IOException e) {
			 e.toString();
		} 
		return str;
	}
	/**
	 * 删除错误信息
	 */
	public static  void delectErrorLog(){
		File file  = new File(ERRORLOG);
			if (file.exists()) {  
                // 清空之前的记录  
                file.delete();  
            }   
	}
}