package com.leroymerlin.pandroid.ui; import android.content.Context; import android.support.v4.view.LayoutInflaterCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatDelegate; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import com.leroymerlin.pandroid.log.LogcatLogger; import java.util.ArrayList; import java.util.List; /** * Created by florian on 03/01/2018. */ public class PandroidViewFactory implements LayoutInflater.Factory2 { private static final String TAG = "PandroidLayoutInflater"; private List<LayoutInflater.Factory2> factories; private AppCompatDelegate appDelegate; private PandroidViewFactory(AppCompatDelegate delegate, List<LayoutInflater.Factory2> factories) { this.factories = factories; this.appDelegate = delegate; } public static void installPandroidViewFactory(AppCompatActivity compatActivity) { List<LayoutInflater.Factory2> factories = new ArrayList<>(); if (compatActivity instanceof PandroidFactoryProvider) { addProviderFactories((PandroidFactoryProvider) compatActivity, factories); } if (compatActivity.getApplication() instanceof PandroidFactoryProvider) { addProviderFactories((PandroidFactoryProvider) compatActivity.getApplication(), factories); } if (!factories.isEmpty()) { LayoutInflater inflater = LayoutInflater.from(compatActivity); if (inflater.getFactory2() == null) { PandroidViewFactory factory = new PandroidViewFactory(compatActivity.getDelegate(), factories); LayoutInflaterCompat.setFactory2(inflater, factory); } else { LogcatLogger.getInstance().w(TAG, "can't set layout inflater factory"); } } else { LogcatLogger.getInstance().w(TAG, "Your activity or application should implement PandroidFactoryProvider to install PandroidLayoutInflaterFactory"); } } private static void addProviderFactories(PandroidFactoryProvider compatActivity, List<LayoutInflater.Factory2> factories) { List<LayoutInflater.Factory2> activityFactories = compatActivity.getLayoutInflaterFactories(); if (activityFactories != null) { factories.addAll(activityFactories); } } @Override public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { for (LayoutInflater.Factory2 factory2 : factories) { View result = factory2.onCreateView(parent, name, context, attrs); if (result != null) return result; } return appDelegate.createView(parent, name, context, attrs); } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { return onCreateView(null, name, context, attrs); } }