Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.holoeverywhere.LayoutInflater Maven / Gradle / Ivy
package org.holoeverywhere;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
import org.holoeverywhere.SystemServiceManager.SystemServiceCreator;
import org.holoeverywhere.SystemServiceManager.SystemServiceCreator.SystemService;
import org.holoeverywhere.app.Application;
import org.holoeverywhere.internal.DialogTitle;
import org.holoeverywhere.internal.NumberPickerEditText;
import org.holoeverywhere.preference.PreferenceFrameLayout;
import org.holoeverywhere.widget.AutoCompleteTextView;
import org.holoeverywhere.widget.Button;
import org.holoeverywhere.widget.CalendarView;
import org.holoeverywhere.widget.CheckBox;
import org.holoeverywhere.widget.CheckedTextView;
import org.holoeverywhere.widget.DatePicker;
import org.holoeverywhere.widget.Divider;
import org.holoeverywhere.widget.EditText;
import org.holoeverywhere.widget.FragmentBreadCrumbs;
import org.holoeverywhere.widget.FrameLayout;
import org.holoeverywhere.widget.GridView;
import org.holoeverywhere.widget.LinearLayout;
import org.holoeverywhere.widget.ListView;
import org.holoeverywhere.widget.ModalBackgroundWrapper;
import org.holoeverywhere.widget.MultiAutoCompleteTextView;
import org.holoeverywhere.widget.NumberPicker;
import org.holoeverywhere.widget.ProgressBar;
import org.holoeverywhere.widget.RadioButton;
import org.holoeverywhere.widget.SeekBar;
import org.holoeverywhere.widget.Spinner;
import org.holoeverywhere.widget.Switch;
import org.holoeverywhere.widget.TextView;
import org.holoeverywhere.widget.TimePicker;
import org.holoeverywhere.widget.ToggleButton;
import org.xmlpull.v1.XmlPullParser;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build.VERSION;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import com.actionbarsherlock.internal.view.menu.ExpandedMenuView;
import com.actionbarsherlock.internal.view.menu.HoloListMenuItemView;
import com.actionbarsherlock.internal.widget.ActionBarContainer;
import com.actionbarsherlock.internal.widget.ActionBarView;
public class LayoutInflater extends android.view.LayoutInflater implements
Cloneable, android.view.LayoutInflater.Factory {
private final class HoloFactoryMerger extends ArrayList implements
Factory {
private static final long serialVersionUID = -851134244408815411L;
@Override
public View onCreateView(String name, Context context,
AttributeSet attrs) {
for (Factory factory : this) {
try {
View view = factory.onCreateView(name, context, attrs);
if (view != null) {
return view;
}
} catch (Exception e) {
}
}
return null;
}
}
@SystemService(Context.LAYOUT_INFLATER_SERVICE)
public static class LayoutInflaterCreator implements
SystemServiceCreator {
@Override
public LayoutInflater createService(Context context) {
return LayoutInflater.from(context);
}
}
public static interface OnInitInflaterListener {
public void onInitInflater(LayoutInflater inflater);
}
private static final Map> INSTANCES_MAP = new WeakHashMap>();
private static OnInitInflaterListener listener;
private static final Map VIEWS_MAP = new HashMap();
static {
remap(ProgressBar.class);
remap(LinearLayout.class);
remap(Switch.class);
remap(TextView.class);
remap(EditText.class);
remap(AutoCompleteTextView.class);
remap(MultiAutoCompleteTextView.class);
remap(CalendarView.class);
remap(Spinner.class);
remap(NumberPicker.class);
remap(DatePicker.class);
remap(TimePicker.class);
remap(ListView.class);
remap(Divider.class);
remap(SeekBar.class);
remap(Button.class);
remap(CheckedTextView.class);
remap(FragmentBreadCrumbs.class);
remap(ToggleButton.class);
remap(RadioButton.class);
remap(CheckBox.class);
remap(PreferenceFrameLayout.class);
remap(ViewPager.class);
remap(PagerTitleStrip.class);
remap(WebView.class);
remap(FrameLayout.class);
remap(GridView.class);
remap(ViewPager.class);
remap(ModalBackgroundWrapper.class);
remapInternal(ActionBarView.class, HoloListMenuItemView.class,
ExpandedMenuView.class, ActionBarContainer.class, DialogTitle.class,
NumberPickerEditText.class);
}
public static void clearInstances() {
LayoutInflater.INSTANCES_MAP.clear();
}
public static LayoutInflater from(android.view.LayoutInflater inflater) {
if (inflater instanceof LayoutInflater) {
return (LayoutInflater) inflater;
}
return new LayoutInflater(inflater, inflater.getContext());
}
public static LayoutInflater from(Context context) {
LayoutInflater inflater = null;
WeakReference reference = INSTANCES_MAP.get(context);
if (reference != null) {
inflater = reference.get();
}
if (inflater == null) {
inflater = new LayoutInflater(context);
reference = new WeakReference(inflater);
INSTANCES_MAP.put(context, reference);
}
return inflater;
}
public static LayoutInflater from(View view) {
return LayoutInflater.from(view.getContext());
}
public static View inflate(Context context, int resource) {
return LayoutInflater.from(context).inflate(resource, null);
}
public static View inflate(Context context, int resource, ViewGroup root) {
return LayoutInflater.from(context).inflate(resource, root);
}
public static View inflate(Context context, int resource, ViewGroup root,
boolean attachToRoot) {
return LayoutInflater.from(context).inflate(resource, root,
attachToRoot);
}
public static View inflate(View view, int resource) {
return LayoutInflater.from(view).inflate(resource, null);
}
public static View inflate(View view, int resource, ViewGroup root) {
return LayoutInflater.from(view).inflate(resource, root);
}
public static View inflate(View view, int resource, ViewGroup root,
boolean attachToRoot) {
return LayoutInflater.from(view).inflate(resource, root, attachToRoot);
}
public static void onDestroy(Context context) {
LayoutInflater.INSTANCES_MAP.remove(context);
}
public static void remap(Class... classes) {
for (Class clazz : classes) {
remap(clazz);
}
}
public static void remap(Class clazz) {
if (clazz != null) {
LayoutInflater.VIEWS_MAP
.put(clazz.getSimpleName(), clazz.getName());
}
}
@Deprecated
public static void remap(String prefix, String... classess) {
for (String clazz : classess) {
LayoutInflater.VIEWS_MAP.put(clazz, prefix + "." + clazz);
}
}
public static void remapHard(String from, String to) {
LayoutInflater.VIEWS_MAP.put(from, to);
}
private static void remapInternal(Class... classess) {
for (Class clazz : classess) {
remapHard("Internal." + clazz.getSimpleName(), clazz.getName());
}
}
public static void setOnInitInflaterListener(OnInitInflaterListener listener) {
LayoutInflater.listener = listener;
}
private final HoloFactoryMerger factoryMerger = new HoloFactoryMerger();
protected LayoutInflater(android.view.LayoutInflater original,
Context newContext) {
super(original, newContext);
init();
}
protected LayoutInflater(Context context) {
super(context);
init();
}
public void addFactory(Factory factory) {
checkFactoryOnNull(factory);
factoryMerger.add(factory);
}
public void addFactory(Factory factory, int index) {
checkFactoryOnNull(factory);
factoryMerger.add(index, factory);
}
private void checkFactoryOnNull(Factory factory) {
if (factory == null) {
throw new NullPointerException("Given factory can not be null");
}
}
@Override
public LayoutInflater cloneInContext(Context newContext) {
return new LayoutInflater(this, newContext);
}
public View inflate(int resource) {
return inflate(resource, null);
}
@Override
public View inflate(int resource, ViewGroup root) {
return inflate(resource, root, root != null);
}
@Override
public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
View view = super.inflate(resource, root, attachToRoot);
if (view != null) {
view = FontLoader.applyDefaultStyles(view);
}
return view;
}
@Override
public View inflate(XmlPullParser parser, ViewGroup root) {
return inflate(parser, root, root != null);
}
@Override
public View inflate(XmlPullParser parser, ViewGroup root,
boolean attachToRoot) {
View view = super.inflate(parser, root, attachToRoot);
if (view != null) {
view = FontLoader.applyDefaultStyles(view);
}
return view;
}
private void init() {
super.setFactory(factoryMerger);
factoryMerger.add(this);
if (LayoutInflater.listener != null) {
LayoutInflater.listener.onInitInflater(this);
}
}
@Override
protected View onCreateView(String name, AttributeSet attrs)
throws ClassNotFoundException {
String newName = LayoutInflater.VIEWS_MAP.get(name.intern());
View view;
if (newName != null) {
view = tryCreateView(newName, null, attrs);
if (view != null) {
return prepareView(view);
}
}
if (name.indexOf('.') > 0) {
view = tryCreateView(name, null, attrs);
if (view != null) {
return prepareView(view);
}
}
view = tryCreateView(name, "android.widget.", attrs);
if (view != null) {
return prepareView(view);
}
view = tryCreateView(name, "android.view.", attrs);
if (view != null) {
return prepareView(view);
} else {
throw new ClassNotFoundException("Could not find class: " + name);
}
}
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
try {
return onCreateView(name, attrs);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
@SuppressLint("NewApi")
private View prepareView(View view) {
if (Application.config().isDisableOverscrollEffects() && VERSION.SDK_INT >= 9) {
view.setOverScrollMode(View.OVER_SCROLL_NEVER);
}
return view;
}
@Override
public void setFactory(Factory factory) {
addFactory(factory, 0);
}
protected View tryCreateView(String name, String prefix, AttributeSet attrs) {
String newName = prefix == null ? "" : prefix;
newName += name;
try {
if (Class.forName(newName) != null) {
return createView(newName, null, attrs);
}
} catch (ClassNotFoundException e) {
}
return null;
}
}