package zeus.plugin;

import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Resources;
import android.view.LayoutInflater;

/**
 * 一些重复的方法放到这里。
 * Created by huangjian on 2016/7/14.
 */
public class ZeusHelper {

    //---------------------插件相关的代码-----------------------start
    /**
     * 一旦插件resources发生变化,这个resources就可以用来比较了
     */
    private Resources mMyResources = null;

    /**
     * 配置LAYOUT_INFLATER_SERVICE时的一些参数
     *
     * @param context       调用着的context
     * @param systemServcie systemServer对象
     * @param name          server的名字
     * @return systemServer对象
     */
    public static Object getSystemService(Context context, Object systemServcie, String name) {
        if (Context.LAYOUT_INFLATER_SERVICE.equals(name)) {
            LayoutInflater inflater = (LayoutInflater) systemServcie;
            inflater.cloneInContext(context);
            //使用某些加固之后该inflater里的mContext变量一直是系统的context,根本不是当前Context
            //所以这里手动设置一次
            PluginUtil.setField(inflater, "mContext", context);
            return inflater;
        }
        return systemServcie;
    }

    /**
     * 当系统调用attachBaseContext时,进行一些参数的设置
     *
     * @param newBase base的context即ContextImpl
     * @param context 调用者自己
     */
    public void attachBaseContext(Context newBase, ContextWrapper context) {
        //某些手机中的是mOuterContext作为context来用
        //这样写还可以防止某些手机的内存泄漏,有些手机会记录它启动当前界面的activity作为mOuterContext,
        //而如果之前的activity被finish,那么它也不能被GC回收
        PluginUtil.setField(newBase, "mOuterContext", context);
        //中兴手机是个奇葩,不知道它怎么实现的又重新生成了一个resources,这里得再次替换
        PluginUtil.setField(newBase, "mResources", PluginManager.mNowResources);
        mMyResources =  PluginManager.mNowResources;
    }

    /**
     * 解决有时插件通过inflate找不到资源的问题
     *
     * @return Resources.Theme 调用者自己生成的theme
     */
    public Resources.Theme getTheme(ZeusBaseActivity zeusBaseActivity) {
        Resources localResources = PluginManager.mNowResources;
        if ( localResources != null && mMyResources != localResources) {
            mMyResources = localResources;

            //中兴的rom中会将zeusBaseActivity.getBaseContext()的一个父类中添加mResources和mTheme,导致设置不全,这里全部设置
            PluginUtil.setFieldAllClass(zeusBaseActivity.getBaseContext(), "mResources", localResources);
            PluginUtil.setFieldAllClass(zeusBaseActivity.getBaseContext(), "mTheme", null);

            //AppCompatActivity包含了一个Resouces,这里设置为null让其再次生成一遍
            PluginUtil.setField(zeusBaseActivity, "mResources", null);
            //原始的theme指向的Resources是老的Resources,无法访问新插件,这里设置为null,
            // 系统会再次使用新的Resouces来生成一次theme,新的theme才能访问新的插件资源
            PluginUtil.setField(zeusBaseActivity, "mTheme", null);
        }
        return zeusBaseActivity.getSuperTheme();
    }

    /**
     * 系统配置改变时的回调,是为了支持插件的语言、地区、字体、字号等的切换
     */
    public static void onConfigurationChanged() {
        if (PluginManager.mNowResources != null
                && PluginManager.mBaseResources != null
                && PluginManager.mNowResources != PluginManager.mBaseResources) {
            PluginManager.mNowResources.updateConfiguration(PluginManager.mBaseResources.getConfiguration(),
                    PluginManager.mBaseResources.getDisplayMetrics());
        }
    }
}