package com.tsgame.tsgame_niuniu.system;

import android.app.Activity;
import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.util.Log;

import com.game.webgame.network.volleymanager;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.tencent.smtt.sdk.QbSdk;
import com.jx.jyhd.simcpux.Constants;
import com.tsgame.tsgame_niuniu.buglyutil.BuglyUtil;

import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.List;

public class Myapplication extends Application {

	public static Myapplication application;
	private static Myapplication instance;
	public static IWXAPI api;
	public static WeakReference<Activity> mCurrentActivity;
	private final List<Activity> activityList = new LinkedList<>();

	@RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
	@Override
	public void onCreate() {
		super.onCreate();

		registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
			@Override
			public void onActivityCreated (@NonNull Activity activity, Bundle bundle) {
			}

			@Override
			public void onActivityStarted (@NonNull Activity activity) {
			}

			@Override
			public void onActivityResumed (@NonNull Activity activity) {
				mCurrentActivity = new WeakReference<>(activity);
			}

			@Override
			public void onActivityPaused (@NonNull Activity activity) {
			}

			@Override
			public void onActivityStopped (@NonNull Activity activity) {
			}

			@Override
			public void onActivitySaveInstanceState (@NonNull Activity activity, @NonNull Bundle bundle) {
			}

			@Override
			public void onActivityDestroyed (@NonNull Activity activity) {
			}
		});

		initx5webview();
		wxinit();
		application = this;
		// 在这里为应用设置异常处理，然后程序才能获取未处理的异常
		CrashHandler crashHandler = CrashHandler.getInstance();
		crashHandler.init(this);
		CrashReport.initCrashReport(getApplicationContext(), BuglyUtil.appid, true);

		volleymanager.getInstance();

	}

	public static Myapplication getInstance() {
		if (null == instance) {
			instance = new Myapplication();
		}
		return instance;
	}
	private void initx5webview() {
		try {
			//搜集本地tbs内核信息并上报服务器，服务器返回结果决定使用哪个内核。
			QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
				@Override
				public void onViewInitFinished(boolean arg0) {
					//x5內核初始化完成的回调，为true表示x5内核加载成功，否则表示x5内核加载失败，会自动切换到系统内核。
					Log.d("initx5webview", " onViewInitFinished is " + arg0);
					Log.e("initx5webview","加载内核是否成功:"+arg0);
				}

				@Override
				public void onCoreInitFinished() {
				}
			};			// 设置允许移动网络下载内核，确保44286版本能正常下载
			QbSdk.setDownloadWithoutWifi(true);
			//x5内核初始化接口
			QbSdk.initX5Environment(getApplicationContext(), cb);
		}catch(Exception e){
			Log.d("appx5", String.valueOf(e));
		}
	}

	private void wxinit(){
		api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, true);
		api.registerApp(Constants.APP_ID);
		registerReceiver(new BroadcastReceiver() {
			@Override
			public void onReceive(Context context, Intent intent) {
				api.registerApp(Constants.APP_ID);
			}
		}, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
	}

	//08:CA:91:93:45:D3:C0:B4:76:73:E1:E6:7A:3D:74:C9:3E:B7:A7:11
	public void addActivity(Activity activity) {
		activityList.add(activity);
	}

	public void exit() {
		try {
			for (Activity activity : activityList) {
				if (activity != null)
					activity.finish();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			activityList.clear();
			android.os.Process.killProcess(android.os.Process.myPid());
		}
	}

	@Override
	public void onTrimMemory(int level) {
		super.onTrimMemory(level);
		switch (level) {
			//TRIM_MEMORY_UI_HIDDEN 表示应用程序的所有UI界面被隐藏了，即用户点击了Home键或者Back键导致应用的UI界面不可见．这时候应该释放一些资源
			case Activity.TRIM_MEMORY_UI_HIDDEN:
				Log.i("TRIM", "onTrimMemory() level=TRIM_MEMORY_UI_HIDDEN");
				break;
			//TRIM_MEMORY_RUNNING_MODERATE 表示应用程序正常运行，并且不会被杀掉。但是目前手机的内存已经有点低了，系统可能会开始根据LRU缓存规则来去杀死进程了。
			case Activity.TRIM_MEMORY_RUNNING_MODERATE:
				Log.i("TRIM", "onTrimMemory() level=TRIM_MEMORY_RUNNING_MODERATE");
				break;
			//TRIM_MEMORY_RUNNING_LOW 表示应用程序正常运行，并且不会被杀掉。但是目前手机的内存已经非常低了，我们应该去释放掉一些不必要的资源以提升系统的性能，同时这也会直接影响到我们应用程序的性能。
			case Activity.TRIM_MEMORY_RUNNING_LOW:
				Log.i("TRIM", "onTrimMemory() level=TRIM_MEMORY_RUNNING_LOW");
				break;
			//TRIM_MEMORY_RUNNING_CRITICAL 表示应用程序仍然正常运行，但是系统已经根据LRU缓存规则杀掉了大部分缓存的进程了。这个时候我们应当尽可能地去释放任何不必要的资源，不然的话系统可能会继续杀掉所有缓存中的进程，并且开始杀掉一些本来应当保持运行的进程，比如说后台运行的服务。
			case Activity.TRIM_MEMORY_RUNNING_CRITICAL:
				Log.i("TRIM", "onTrimMemory() level=TRIM_MEMORY_RUNNING_CRITICAL");
				break;
			//当应用程序是缓存的，则会收到以下几种类型的回调：
			//TRIM_MEMORY_BACKGROUND 表示手机目前内存已经很低了，系统准备开始根据LRU缓存来清理进程。这个时候我们的程序在LRU缓存列表的最近位置，是不太可能被清理掉的，但这时去释放掉一些比较容易恢复的资源能够让手机的内存变得比较充足，从而让我们的程序更长时间地保留在缓存当中，这样当用户返回我们的程序时会感觉非常顺畅，而不是经历了一次重新启动的过程。
			case Activity.TRIM_MEMORY_BACKGROUND:
				Log.i("TRIM", "onTrimMemory() level=TRIM_MEMORY_BACKGROUND");
				break;
			//TRIM_MEMORY_MODERATE 表示手机目前内存已经很低了，并且我们的程序处于LRU缓存列表的中间位置，如果手机内存还得不到进一步释放的话，那么我们的程序就有被系统杀掉的风险了。
			case Activity.TRIM_MEMORY_MODERATE:
				Log.i("TRIM", "onTrimMemory() level=TRIM_MEMORY_MODERATE");
				break;
			//TRIM_MEMORY_COMPLETE 表示手机目前内存已经很低了，并且我们的程序处于LRU缓存列表的最边缘位置，系统会最优先考虑杀掉我们的应用程序，在这个时候应当尽可能地把一切可以释放的东西都进行释放。
			case Activity.TRIM_MEMORY_COMPLETE:
				Log.i("TRIM", "onTrimMemory() level=TRIM_MEMORY_COMPLETE");
				break;
		}
	}

}