mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 14:25:52 +00:00
Bug 839325 - Make GeckoViewsFactory use a HashMap instead of a table of string compares. r=sriram
This commit is contained in:
parent
777ac77877
commit
ed59b64f3b
@ -16,6 +16,10 @@ import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
public final class GeckoViewsFactory implements LayoutInflater.Factory {
|
||||
private static final String LOGTAG = "GeckoViewsFactory";
|
||||
|
||||
@ -25,7 +29,55 @@ public final class GeckoViewsFactory implements LayoutInflater.Factory {
|
||||
private static final String GECKO_IDENTIFIER = "Gecko.";
|
||||
private static final int GECKO_IDENTIFIER_LENGTH = GECKO_IDENTIFIER.length();
|
||||
|
||||
private GeckoViewsFactory() { }
|
||||
private final Map<String, Constructor<? extends View>> mFactoryMap;
|
||||
|
||||
private GeckoViewsFactory() {
|
||||
// initialize the hashmap to a capacity that is a prime number greater than
|
||||
// (size * 4/3). The size is the number of items we expect to put in it, and
|
||||
// 4/3 is the inverse of the default load factor.
|
||||
mFactoryMap = new HashMap<String, Constructor<? extends View>>(53);
|
||||
Class<Context> arg1Class = Context.class;
|
||||
Class<AttributeSet> arg2Class = AttributeSet.class;
|
||||
try {
|
||||
mFactoryMap.put("AboutHomePromoBox", AboutHomePromoBox.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("AboutHomeContent", AboutHomeContent.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("AboutHomeContent$TopSitesGridView", AboutHomeContent.TopSitesGridView.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("AboutHomeSection", AboutHomeSection.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("AwesomeBarTabs", AwesomeBarTabs.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("AwesomeBarTabs.Background", AwesomeBarTabs.Background.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("BackButton", BackButton.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("BrowserToolbarBackground", BrowserToolbarBackground.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("BrowserToolbar$RightEdge", BrowserToolbar.RightEdge.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("CheckableLinearLayout", CheckableLinearLayout.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("FormAssistPopup", FormAssistPopup.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("ForwardButton", ForwardButton.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("GeckoApp$MainLayout", GeckoApp.MainLayout.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("LinkTextView", LinkTextView.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("FindInPageBar", FindInPageBar.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("IconTabWidget", IconTabWidget.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("MenuButton", MenuButton.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("RemoteTabs", RemoteTabs.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("TabRow", TabRow.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("TabsButton", TabsButton.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("TabsPanel", TabsPanel.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("TabsTray", TabsTray.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("ThumbnailView", ThumbnailView.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("TextSelectionHandle", TextSelectionHandle.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("gfx.LayerView", LayerView.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("AllCapsTextView", AllCapsTextView.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("Button", GeckoButton.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("EditText", GeckoEditText.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("FrameLayout", GeckoFrameLayout.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("ImageButton", GeckoImageButton.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("ImageView", GeckoImageView.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("LinearLayout", GeckoLinearLayout.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("RelativeLayout", GeckoRelativeLayout.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("TextSwitcher", GeckoTextSwitcher.class.getConstructor(arg1Class, arg2Class));
|
||||
mFactoryMap.put("TextView", GeckoTextView.class.getConstructor(arg1Class, arg2Class));
|
||||
} catch (NoSuchMethodException nsme) {
|
||||
Log.e(LOGTAG, "Unable to initialize views factory", nsme);
|
||||
}
|
||||
}
|
||||
|
||||
// Making this a singleton class.
|
||||
private static final GeckoViewsFactory INSTANCE = new GeckoViewsFactory();
|
||||
@ -46,83 +98,17 @@ public final class GeckoViewsFactory implements LayoutInflater.Factory {
|
||||
else
|
||||
return null;
|
||||
|
||||
if (TextUtils.isEmpty(viewName))
|
||||
return null;
|
||||
|
||||
Log.i(LOGTAG, "Creating custom Gecko view: " + viewName);
|
||||
Constructor<? extends View> constructor = mFactoryMap.get(viewName);
|
||||
if (constructor != null) {
|
||||
try {
|
||||
return constructor.newInstance(context, attrs);
|
||||
} catch (Exception e) {
|
||||
Log.e(LOGTAG, "Unable to instantiate view " + name, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (TextUtils.equals(viewName, "AboutHomePromoBox"))
|
||||
return new AboutHomePromoBox(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "AboutHomeContent"))
|
||||
return new AboutHomeContent(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "AboutHomeContent$TopSitesGridView"))
|
||||
return new AboutHomeContent.TopSitesGridView(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "AboutHomeSection"))
|
||||
return new AboutHomeSection(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "AwesomeBarTabs"))
|
||||
return new AwesomeBarTabs(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "AwesomeBarTabs.Background"))
|
||||
return new AwesomeBarTabs.Background(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "BackButton"))
|
||||
return new BackButton(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "BrowserToolbarBackground"))
|
||||
return new BrowserToolbarBackground(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "BrowserToolbar$RightEdge"))
|
||||
return new BrowserToolbar.RightEdge(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "CheckableLinearLayout"))
|
||||
return new CheckableLinearLayout(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "FormAssistPopup"))
|
||||
return new FormAssistPopup(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "ForwardButton"))
|
||||
return new ForwardButton(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "GeckoApp$MainLayout"))
|
||||
return new GeckoApp.MainLayout(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "LinkTextView"))
|
||||
return new LinkTextView(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "FindInPageBar"))
|
||||
return new FindInPageBar(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "IconTabWidget"))
|
||||
return new IconTabWidget(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "MenuButton"))
|
||||
return new MenuButton(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "RemoteTabs"))
|
||||
return new RemoteTabs(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "TabRow"))
|
||||
return new TabRow(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "TabsButton"))
|
||||
return new TabsButton(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "TabsPanel"))
|
||||
return new TabsPanel(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "TabsTray"))
|
||||
return new TabsTray(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "ThumbnailView"))
|
||||
return new ThumbnailView(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "TextSelectionHandle"))
|
||||
return new TextSelectionHandle(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "gfx.LayerView"))
|
||||
return new LayerView(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "AllCapsTextView"))
|
||||
return new AllCapsTextView(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "Button"))
|
||||
return new GeckoButton(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "EditText"))
|
||||
return new GeckoEditText(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "FrameLayout"))
|
||||
return new GeckoFrameLayout(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "ImageButton"))
|
||||
return new GeckoImageButton(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "ImageView"))
|
||||
return new GeckoImageView(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "LinearLayout"))
|
||||
return new GeckoLinearLayout(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "RelativeLayout"))
|
||||
return new GeckoRelativeLayout(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "TextSwitcher"))
|
||||
return new GeckoTextSwitcher(context, attrs);
|
||||
else if (TextUtils.equals(viewName, "TextView"))
|
||||
return new GeckoTextView(context, attrs);
|
||||
else
|
||||
Log.d(LOGTAG, "Warning: unknown custom view: " + viewName);
|
||||
Log.d(LOGTAG, "Warning: unknown custom view: " + name);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -45,7 +45,7 @@ class TextSelectionHandle extends ImageView implements View.OnTouchListener {
|
||||
|
||||
private GeckoApp mActivity;
|
||||
|
||||
TextSelectionHandle(Context context, AttributeSet attrs) {
|
||||
public TextSelectionHandle(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setOnTouchListener(this);
|
||||
mActivity = (GeckoApp) context;
|
||||
|
Loading…
Reference in New Issue
Block a user