package com.gingersoft.gsa.cloud.app;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.RemoteException;

import androidx.annotation.NonNull;

import com.billy.cc.core.component.CC;
import com.dianping.logan.Logan;
import com.dianping.logan.OnLoganProtocolStatus;
import com.gingersoft.gsa.cloud.common.BuildConfig;
import com.gingersoft.gsa.cloud.common.R;
import com.gingersoft.gsa.cloud.common.config.LoganConfig;
import com.gingersoft.gsa.cloud.common.config.expandconfig.ExpandInfoSetting;
import com.gingersoft.gsa.cloud.common.config.expandconfig.FunctionExtendedConfiguration;
import com.gingersoft.gsa.cloud.common.config.expandconfig.UIStyleExtendedConfiguration;
import com.gingersoft.gsa.cloud.common.constans.HttpsConstans;
import com.gingersoft.gsa.cloud.common.constans.PrintConstans;
import com.gingersoft.gsa.cloud.common.loadsir.CustomCallback;
import com.gingersoft.gsa.cloud.common.loadsir.EmptyCallback;
import com.gingersoft.gsa.cloud.common.loadsir.ErrorCallback;
import com.gingersoft.gsa.cloud.common.loadsir.LoadingCallback;
import com.gingersoft.gsa.cloud.common.loadsir.TimeoutCallback;
import com.gingersoft.gsa.cloud.common.loadsir.pos.PosPayStatusExceptionCallback;
import com.gingersoft.gsa.cloud.common.loadsir.pos.PosRefundStatusExceptionCallback;
import com.gingersoft.gsa.cloud.common.loadsir.pos.PosSettlementStatusExceptionCallback;
import com.gingersoft.gsa.cloud.common.loadsir.pos.PosTipsStatusExceptionCallback;
import com.gingersoft.gsa.cloud.common.loadsir.pos.PosVoidStatusExceptionCallback;
import com.gingersoft.gsa.cloud.common.loadsir.purchase.EmptyCategoryCallback;
import com.gingersoft.gsa.cloud.common.loadsir.purchase.NotGoodsCallback;
import com.gingersoft.gsa.cloud.common.logan.LoganManager;
import com.gingersoft.gsa.cloud.common.oaId.DeviceID;
import com.gingersoft.gsa.cloud.common.printer.AidlUtil;
import com.gingersoft.gsa.cloud.common.printer.PrinterFileUtils;
import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterFlowListener;
import com.gingersoft.gsa.cloud.common.printer.plugins.PrinterFlowProxy;
import com.gingersoft.gsa.cloud.common.utils.AppDevices;
import com.gingersoft.gsa.cloud.common.utils.crash.AppCrashHandler;
import com.gingersoft.gsa.cloud.common.utils.log.LogUtil;
import com.gingersoft.gsa.cloud.common.utils.other.SPUtils;
import com.gingersoft.gsa.cloud.component.ComponentAction;
import com.gingersoft.gsa.cloud.component.ComponentName;
import com.gingersoft.gsa.cloud.database.DaoManager;
import com.hyweb.n5.lib.exception.NoInitPrinterException;
import com.hyweb.n5.lib.util.PrinterUtil;
import com.jess.arms.base.BaseApplication;
import com.kingja.loadsir.core.LoadSir;
import com.qmuiteam.qmui.arch.QMUISwipeBackActivityManager;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import com.xuexiang.rxutil2.rxjava.RxJavaUtils;
import com.xuexiang.rxutil2.rxjava.task.RxIOTask;

import java.io.File;
import java.util.List;
import java.util.Locale;

import io.reactivex.functions.Consumer;
import io.reactivex.plugins.RxJavaPlugins;
import me.jessyan.autosize.AutoSize;
import me.jessyan.autosize.AutoSizeConfig;
import me.jessyan.autosize.onAdaptListener;
import me.jessyan.progressmanager.ProgressListener;
import me.jessyan.progressmanager.ProgressManager;
import me.jessyan.progressmanager.body.ProgressInfo;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;

/**
 * Created by Wyh on 2019/12/21.
 */
public class GsaCloudApplication extends BaseApplication {

    private final String TAG = this.getClass().getSimpleName();
    /**
     * 系统上下文
     */
    private static GsaCloudApplication mAppContext;
    private Activity mCurrentActivity;

    public static UIStyleExtendedConfiguration uiStyleConfiguration;
    public static FunctionExtendedConfiguration functionConfiguration;
    /**
     * 是否開啟皮膚切換
     */
    public static boolean openSkinMake = false;

    /**
     * 全局設置上下拉刷新框架Header 和 Footer
     */
    static {
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator((context, layout) -> {
            layout.setPrimaryColorsId(R.color.theme_color, android.R.color.white);//全局设置主题颜色
            return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header，默认是 贝塞尔雷达Header
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator((context, layout) -> {
            //指定为经典Footer，默认是 BallPulseFooter
            return new ClassicsFooter(context).setDrawableSize(20);
        });
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mAppContext = this;

        CC.enableVerboseLog(true);
        CC.enableDebug(true);
        CC.enableRemoteCC(true);

        //初始化美團日誌框架
        initLogan();
        LoganManager.w_action(TAG, TAG + ": onCreate start.....");

        RxJavaUtils.doInIOThread(new RxIOTask<Object>(0) {
            @Override
            public Void doInIOThread(Object o) {
                LoganManager.w_action(TAG, "init start.....");
                //初始化設備唯一ID
                initDeviceId();
                //初始化Hyweb支付回調
                initHywebCommandImpl();
                //初始化服務器地址
                initDomainUrl();
                //初始化數據庫框架
                initGreenDao();
                //初始化打印相關
                initPrint();
                //初始化crash記錄
                AppCrashHandler.getInstance().init(getAppContext());
                //初始化Rxjava相關
                initRxjava();
                //初始化Http请求响应进度监听器
//              initHttpProgressListener();
                //初始化QMUI相关
                initQMUI();
                //初始化哆啦A夢
                initDoraemonKit();
                //初始化上下拉刷新
                initRefresh();
                //初始化加载反馈页管理框架
                initLoadSir();
                //初始化今日頭條適配方案
                initAutoSize();
                //上傳餐廳擴展信息
                uploadExpandInfo();
                LoganManager.w_action(TAG, "init end.....");
                return null;
            }
        });
        LoganManager.w_action(TAG, TAG + ": onCreate end.....");
    }

    private void initQMUI() {
        //初始化側滑回退
//        QMUISwipeBackActivityManager.init(this);
        //初始化主題管理器
//        QDSkinManager.install(this);
    }

    /**
     * 初始化美團日誌框架
     */
    private void initLogan() {
        if (BuildConfig.DEBUG) {
            LoganConfig.UPLOAD_LOG_URL = "http://192.168.1.131:8080/logan-web/logan/upload.json";
        } else {
            LoganConfig.UPLOAD_LOG_URL = HttpsConstans.ROOT_HK_TEST_URL + "/logan-web/logan/upload.json";
        }
        com.dianping.logan.LoganConfig config = new com.dianping.logan.LoganConfig.Builder()
                .setCachePath(getFilesDir().getAbsolutePath())
                .setPath(getExternalFilesDir(null).getAbsolutePath()
                        + File.separator + LoganConfig.FILE_NAME)
                .setEncryptKey16(LoganConfig.EncryptKey16.getBytes())
                .setEncryptIV16(LoganConfig.EncryptIV16.getBytes())
                .setDay(LoganConfig.DAY)
                .build();
        Logan.init(config);
        Logan.setOnLoganProtocolStatus(new OnLoganProtocolStatus() {
            @Override
            public void loganProtocolStatus(String cmd, int code) {
                LoganManager.w_code(TAG, "loganProtocolStatus: " + cmd);
            }
        });
    }

    /**
     * 初始化滴滴開發,測試輔助工具哆啦A夢
     */
    private void initDoraemonKit() {
//        DoraemonKit.install(getAppContext(), DoraemonKitConfig.PRODUCE_ID);
    }

    /**
     * 獲取設備唯一ID
     *
     * @return
     */
    public final static void initDeviceId() {
        DeviceID.initDeviceId();
    }

    /**
     * 初始化Hyweb支付回調
     */
    private void initHywebCommandImpl() {
        if (AppDevices.isHywebPos()) {
            CC.obtainBuilder(ComponentName.COMPONENT_LOGIN)
                    .setActionName(ComponentAction.Login.INIT_HYWEB_COMMAND_IMPL)
                    .build()
                    .call();
        }
    }

    private void initRxjava() {
        //全局Rxjava異常
        RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) {
                //异常处理
                LoganManager.w_code(TAG, "onRxJavaErrorHandler: " + throwable.getMessage());
            }
        });
    }

    public Activity getCurrentActivity() {
        return mCurrentActivity;
    }

    public void setCurrentActivity(Activity mCurrentActivity) {
        this.mCurrentActivity = mCurrentActivity;
    }

    private void initRefresh() {
        ClassicsHeader.REFRESH_HEADER_PULLING = getString(R.string.srl_header_pulling);//"下拉可以刷新";
        ClassicsHeader.REFRESH_HEADER_REFRESHING = getString(R.string.srl_header_refreshing);//"正在刷新...";
        ClassicsHeader.REFRESH_HEADER_LOADING = getString(R.string.srl_header_loading);//"正在加载...";
        ClassicsHeader.REFRESH_HEADER_RELEASE = getString(R.string.srl_header_release);//"释放立即刷新";
        ClassicsHeader.REFRESH_HEADER_FINISH = getString(R.string.srl_header_finish);//"刷新完成";
        ClassicsHeader.REFRESH_HEADER_FAILED = getString(R.string.srl_header_failed);//"刷新失败";
        ClassicsHeader.REFRESH_HEADER_UPDATE = getString(R.string.srl_header_update);//"上次更新 M-d HH:mm";
        ClassicsHeader.REFRESH_HEADER_UPDATE = getString(R.string.srl_header_update);//"'Last update' M-d HH:mm";
        ClassicsHeader.REFRESH_HEADER_SECONDARY = getString(R.string.srl_header_secondary);//"释放进入二楼"

        ClassicsFooter.REFRESH_FOOTER_PULLING = getString(R.string.srl_footer_pulling);//"上拉加载更多";
        ClassicsFooter.REFRESH_FOOTER_RELEASE = getString(R.string.srl_footer_release);//"释放立即加载";
        ClassicsFooter.REFRESH_FOOTER_LOADING = getString(R.string.srl_footer_loading);//"正在刷新...";
        ClassicsFooter.REFRESH_FOOTER_REFRESHING = getString(R.string.srl_footer_refreshing);//"正在加载...";
        ClassicsFooter.REFRESH_FOOTER_FINISH = getString(R.string.srl_footer_finish);//"加载完成";
        ClassicsFooter.REFRESH_FOOTER_FAILED = getString(R.string.srl_footer_failed);//"加载失败";
        ClassicsFooter.REFRESH_FOOTER_NOTHING = getString(R.string.srl_footer_nothing);//"全部加载完成";
    }

    private void initLoadSir() {
        LoadSir.beginBuilder()
                .addCallback(new ErrorCallback())//添加各种状态页
                .addCallback(new EmptyCallback())
                .addCallback(new LoadingCallback())
                .addCallback(new TimeoutCallback())
                .addCallback(new CustomCallback())
                .addCallback(new PosPayStatusExceptionCallback())
                .addCallback(new PosRefundStatusExceptionCallback())
                .addCallback(new PosVoidStatusExceptionCallback())
                .addCallback(new PosTipsStatusExceptionCallback())
                .addCallback(new PosSettlementStatusExceptionCallback())
                .addCallback(new NotGoodsCallback())
                .addCallback(new EmptyCategoryCallback())
                .commit();
    }

    public static void initDomainUrl() {
        HttpsConstans.init(mAppContext);
        //需要單獨配置域名URL的，在接口上添加@Headers({"Domain-Name: settlement_report_server"})，不添加則是使用默認域名
        setGlobalDomain();
        //清機報表請求地址
        RetrofitUrlManager.getInstance().putDomain("settlement_report_server", HttpsConstans.ROOT_SETTLEMENT_REPORT_SERVER_ADDRESS_FORMAL);
        //gsa報表請求地址
        RetrofitUrlManager.getInstance().putDomain("gsa_report", HttpsConstans.REPORT_SERVER_ADDRESS);//DEFAULT_REPORT_ADDRESS
        //微信報表請求地址
        RetrofitUrlManager.getInstance().putDomain("wechat_report", HttpsConstans.WECHAR_REPORT_SERVER_ADDRESS);
        //沽清控制請求地址
        RetrofitUrlManager.getInstance().putDomain("soldoutctrl", HttpsConstans._SERVER_ADDRESS);
        //版本更新請求地址
        RetrofitUrlManager.getInstance().putDomain("update_version", HttpsConstans.member_web);
        //友常本地請求地址
        RetrofitUrlManager.getInstance().putDomain("yc_location", HttpsConstans.ROOT_SERVER_YOU_CHANG_HK);
        //System請求地址
        RetrofitUrlManager.getInstance().putDomain("system_url", HttpsConstans.SYSTEM_URL);

        //後台遷移新地址
        RetrofitUrlManager.getInstance().putDomain("new_base_url", HttpsConstans.ricepon_member);
        //ricepon_wechat請求地址
        RetrofitUrlManager.getInstance().putDomain("ricepon_wechat", HttpsConstans.ricepon_wechat);
        //ricepon_order請求地址
        RetrofitUrlManager.getInstance().putDomain("ricepon_order", HttpsConstans.ricepon_order);
        //member_web_ricepon_gsa請求地址
        RetrofitUrlManager.getInstance().putDomain("member_web_ricepon_gsa", HttpsConstans.member_web_ricepon_gsa);
        //member-web api 請求地址
        RetrofitUrlManager.getInstance().putDomain("member-web", HttpsConstans.member_web);
        //ricepon_gsa請求地址
        RetrofitUrlManager.getInstance().putDomain("ricepon_gsa", HttpsConstans.ricepon_gsa);
        //ricepon_activities請求地址
        RetrofitUrlManager.getInstance().putDomain("ricepon_activities", HttpsConstans.ricepon_activities);
        ///ricepon-cloud-gsa/api/請求地址
        RetrofitUrlManager.getInstance().putDomain("ricepon_cloud_gsa", HttpsConstans.ricepon_cloud_gsa);
        //61177
        RetrofitUrlManager.getInstance().putDomain("ricepon_member", HttpsConstans.RICEPON_MEMBER_61177);
        //餐廳模塊請求地址
        RetrofitUrlManager.getInstance().putDomain("ricepon_restaurant", HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL_RESTAURANT);
        //供應商模塊請求地址
        RetrofitUrlManager.getInstance().putDomain("ricepon-purchase", HttpsConstans.ROOT_SERVER_ADDRESS_RICEPON_PURCHASE);
        //服務器地址為64377的ricepon-member/api/
        RetrofitUrlManager.getInstance().putDomain("ricepon_hk_member", HttpsConstans.HK_TEST_RICEPON_MEMBER);
    }

    private void initHttpProgressListener() {
        ProgressManager.getInstance().addRequestListener("http://a.ricepon.com:58201/ricepon-cloud-gsa/api/restaurantTable/list?restaurantId=365", new ProgressListener() {

            @Override
            public void onProgress(ProgressInfo progressInfo) {
                LoganManager.w_printer(TAG, "request onProgress->" + progressInfo.toString());
            }

            @Override
            public void onError(long id, Exception e) {
                LoganManager.w_printer(TAG, "request onError->" + id);
            }
        });
        ProgressManager.getInstance().addResponseListener("http://a.ricepon.com:58201/ricepon-cloud-gsa/api/restaurantTable/list?restaurantId=365", new ProgressListener() {
            @Override
            public void onProgress(ProgressInfo progressInfo) {
                LoganManager.w_printer(TAG, "response onProgress->" + progressInfo.toString());
            }

            @Override
            public void onError(long id, Exception e) {
                LoganManager.w_printer(TAG, "response onError->" + id);
            }
        });
    }

    private void initPrint() {
        if (PrintConstans.PRINT_MODEL_V2.contains(Build.MODEL)) {
            //商米打印
            AidlUtil.getInstance().connectPrinterService(this);
        } else if (PrintConstans.PRINT_MODEL_N5.contains(Build.MODEL)) {
            try {
                //初始化N5打印
                PrinterUtil.initPrinter(this);
            } catch (NoInitPrinterException | RemoteException e) {
                e.printStackTrace();
            }
        } else {
            //如果當前機型不是上面兩種，那麼設置默認打印為ip打印
            //這個默認值的優先級<用戶在打印機列表中設置的默認打印機
            SPUtils.put(PrintConstans.DEFAULT_PRINT_METHOD, PrintConstans.IP_PRINT);
        }
        //打印流程
        PrinterFlowProxy.newInstance().registerPrinterFlowListener(new PrinterFlowListener() {

            private final String TAG = "PrinterPlugins";

            @Override
            public void onPrinterDataBefore(int orderType, int printType, String printerData, String printerDeviceInfo) {
                LoganManager.w_printer(TAG, "打印前数据-> printerData=" + printerData + "  printerDeviceInfo=" + printerDeviceInfo);
            }

            @Override
            public void onPrinterBitmapBefore(int orderType, int printType, String directoryName, List<Bitmap> bitmaps) {
                LoganManager.w_printer(TAG, "生成的打印圖片->");
                PrinterFileUtils.savePrinterBitmapByType(orderType, printType, directoryName, bitmaps);
            }

            @Override
            public void onPrintSuccess() {
                LoganManager.w_printer(TAG, "打印成功");
            }

            @Override
            public void onPrintError(Exception e, int errorCode) {
                if (e != null) {
                    LoganManager.w_printer(TAG, "打印失敗:" + e.getMessage());
                } else {
                    LoganManager.w_printer(TAG, "打印失敗:" + errorCode);
                }
            }

            @Override
            public void connectionBefore(String deviceName, String ip, int port, long ioTimeout, long printTimeout) {
                Object[] objs = {deviceName, ip, port, ioTimeout, printTimeout};
                LoganManager.w_printer(TAG, String.format("連接打印機前-> deviceName=%s ,IP=%s ,port=%s ,ioTimeout=%s ,printTimeout=%s", objs));
            }

            @Override
            public void connectionSuccess() {
                LoganManager.w_printer(TAG, "連接打印機成功");
            }

            @Override
            public void connectionError(Exception e) {
                if (e != null) {
                    LoganManager.w_printer(TAG, "連接打印機失敗:" + e.getMessage());
                } else {
                    LoganManager.w_printer(TAG, "連接打印機失敗");
                }
            }

            @Override
            public void disconnect(Exception e) {
                if (e != null) {
                    LoganManager.w_printer(TAG, e.getMessage());
                } else {
                    LoganManager.w_printer(TAG, "斷開打印機連接");
                }
            }
        });
    }

    public static void setGlobalDomain() {
        //配置全局默認URL
        //取出SharedPreferences中存儲的默認服務器地址
        RetrofitUrlManager.getInstance().setGlobalDomain(HttpsConstans.ROOT_SERVER_ADDRESS_FORMAL);
    }

    private void uploadExpandInfo() {
        uiStyleConfiguration = new UIStyleExtendedConfiguration();
        functionConfiguration = new FunctionExtendedConfiguration();
        ExpandInfoSetting.initUpdateExtendedConfiguration(uiStyleConfiguration, functionConfiguration);
    }

    private void initAutoSize() {
        //当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess()
        //在 Demo 中跳转的三方库中的 DefaultErrorActivity 就是在另外一个进程中, 所以要想适配这个 Activity 就需要调用 initCompatMultiProcess()
        AutoSize.initCompatMultiProcess(this);

        //如果在某些特殊情况下出现 InitProvider 未能正常实例化, 导致 AndroidAutoSize 未能完成初始化
        //可以主动调用 AutoSize.checkAndInit(this) 方法, 完成 AndroidAutoSize 的初始化后即可正常使用
//        AutoSize.checkAndInit(this);

//        如何控制 AndroidAutoSize 的初始化，让 AndroidAutoSize 在某些设备上不自动启动？https://github.com/JessYanCoding/AndroidAutoSize/issues/249

        /**
         * 以下是 AndroidAutoSize 可以自定义的参数, {@link AutoSizeConfig} 的每个方法的注释都写的很详细
         * 使用前请一定记得跳进源码，查看方法的注释, 下面的注释只是简单描述!!!
         */
        AutoSizeConfig.getInstance()

                //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
                //如果没有这个需求建议不开启
                .setCustomFragment(true)

                //是否屏蔽系统字体大小对 AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变
                //如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false
//                .setExcludeFontScale(true)

                //区别于系统字体大小的放大比例, AndroidAutoSize 允许 APP 内部可以独立于系统字体大小之外，独自拥有全局调节 APP 字体大小的能力
                //当然, 在 APP 内您必须使用 sp 来作为字体的单位, 否则此功能无效, 不设置或将此值设为 0 则取消此功能
//                .setPrivateFontScale(0.8f)

                //解决已高度基准适配时底部有空隙的问题
//                .setScreenHeight((QMUIDisplayHelper.getScreenHeight(this)))

                //屏幕适配监听器
                .setOnAdaptListener(new onAdaptListener() {
                    @Override
                    public void onAdaptBefore(Object target, Activity activity) {
                        //使用以下代码, 可以解决横竖屏切换时的屏幕适配问题
                        //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                        //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会重绘当前页面, ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
//                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
//                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                        LogUtil.d(String.format(Locale.ENGLISH, "%s onAdaptBefore!", target.getClass().getName()));
                    }

                    @Override
                    public void onAdaptAfter(Object target, Activity activity) {
                        LogUtil.d(String.format(Locale.ENGLISH, "%s onAdaptAfter!", target.getClass().getName()));
                    }
                });

        //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
//                .setLog(false)

        //是否使用设备的实际尺寸做适配, 默认为 false, 如果设置为 false, 在以屏幕高度为基准进行适配时
        //AutoSize 会将屏幕总高度减去状态栏高度来做适配
        //设置为 true 则使用设备的实际屏幕高度, 不会减去状态栏高度
        //在全面屏或刘海屏幕设备中, 获取到的屏幕高度可能不包含状态栏高度, 所以在全面屏设备中不需要减去状态栏高度，所以可以 setUseDeviceSize(true)
//                .setUseDeviceSize(true)

        //是否全局按照宽度进行等比例适配, 默认为 true, 如果设置为 false, AutoSize 会全局按照高度进行适配
//                .setBaseOnWidth(false)

        //设置屏幕适配逻辑策略类, 一般不用设置, 使用框架默认的就好
//                .setAutoAdaptStrategy(new AutoAdaptStrategy())
        customAdaptForExternal();
    }

    /**
     * 给外部的三方库 {@link Activity} 自定义适配参数, 因为三方库的 {@link Activity} 并不能通过实现
     * {@link me.jessyan.autosize.internal.CustomAdapt} 接口的方式来提供自定义适配参数 (因为远程依赖改不了源码)
     * 所以使用 {@link me.jessyan.autosize.external.ExternalAdaptManager} 来替代实现接口的方式, 来提供自定义适配参数
     */
    private void customAdaptForExternal() {
        /**
         * {@link ExternalAdaptManager} 是一个管理外部三方库的适配信息和状态的管理类, 详细介绍请看 {@link ExternalAdaptManager} 的类注释
         */
        AutoSizeConfig.getInstance().getExternalAdaptManager();

        //加入的 Activity 将会放弃屏幕适配, 一般用于三方库的 Activity, 详情请看方法注释
        //如果不想放弃三方库页面的适配, 请用 addExternalAdaptInfoOfActivity 方法, 建议对三方库页面进行适配, 让自己的 App 更完美一点
//                .addCancelAdaptOfActivity(DefaultErrorActivity.class)

        //为指定的 Activity 提供自定义适配参数, AndroidAutoSize 将会按照提供的适配参数进行适配, 详情请看方法注释
        //一般用于三方库的 Activity, 因为三方库的设计图尺寸可能和项目自身的设计图尺寸不一致, 所以要想完美适配三方库的页面
        //就需要提供三方库的设计图尺寸, 以及适配的方向 (以宽为基准还是高为基准?)
        //三方库页面的设计图尺寸可能无法获知, 所以如果想让三方库的适配效果达到最好, 只有靠不断的尝试
        //由于 AndroidAutoSize 可以让布局在所有设备上都等比例缩放, 所以只要您在一个设备上测试出了一个最完美的设计图尺寸
        //那这个三方库页面在其他设备上也会呈现出同样的适配效果, 等比例缩放, 所以也就完成了三方库页面的屏幕适配
        //即使在不改三方库源码的情况下也可以完美适配三方库的页面, 这就是 AndroidAutoSize 的优势
        //但前提是三方库页面的布局使用的是 dp 和 sp, 如果布局全部使用的 px, 那 AndroidAutoSize 也将无能为力
        //经过测试 DefaultErrorActivity 的设计图宽度在 380dp - 400dp 显示效果都是比较舒服的
//                .addExternalAdaptInfoOfActivity(DefaultErrorActivity.class, new ExternalAdaptInfo(true, 400));
    }

    private void initGreenDao() {
        DaoManager manager = DaoManager.getInstance();
        manager.init(this);
    }

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
//        if((newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES){
//            QDSkinManager.changeSkin(mAppContext,QDSkinManager.SKIN_DARK);
//        }else if(QDSkinManager.getCurrentSkin(mAppContext) == QDSkinManager.SKIN_DARK){
//            QDSkinManager.changeSkin(mAppContext,QDSkinManager.SKIN_BLUE);
//        }
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }

    /**
     * 获取系统上下文
     */
    public static GsaCloudApplication getAppContext() {
        return mAppContext;
    }

    public static String getAppName() {
        try {
            PackageManager packageManager = mAppContext.getPackageManager();
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    mAppContext.getPackageName(), 0);
            int labelRes = packageInfo.applicationInfo.labelRes;
            return mAppContext.getResources().getString(labelRes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
