diff --git a/mobile/android/base/AwesomeBar.java b/mobile/android/base/AwesomeBar.java index d35fd8716398..ca3f3f3ef41a 100644 --- a/mobile/android/base/AwesomeBar.java +++ b/mobile/android/base/AwesomeBar.java @@ -61,6 +61,7 @@ import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; @@ -109,6 +110,7 @@ public class AwesomeBar extends Activity implements GeckoEventListener { Log.d(LOGTAG, "creating awesomebar"); mResolver = Tabs.getInstance().getContentResolver(); + LayoutInflater.from(this).setFactory(GeckoViewsFactory.getInstance()); setContentView(R.layout.awesomebar); diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java index 5368066c7178..dd4c8aa6ef27 100644 --- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -1623,6 +1623,8 @@ abstract public class GeckoApp mRestoreSession = savedInstanceState.getBoolean(SAVED_STATE_SESSION); } + LayoutInflater.from(this).setFactory(GeckoViewsFactory.getInstance()); + super.onCreate(savedInstanceState); mOrientation = getResources().getConfiguration().orientation; diff --git a/mobile/android/base/GeckoViewsFactory.java b/mobile/android/base/GeckoViewsFactory.java new file mode 100644 index 000000000000..9350c347509b --- /dev/null +++ b/mobile/android/base/GeckoViewsFactory.java @@ -0,0 +1,59 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko; + +import java.util.HashMap; + +import android.content.Context; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; + +public final class GeckoViewsFactory implements LayoutInflater.Factory { + private static final String LOGTAG = "GeckoViewsFactory"; + + private static final String GECKO_VIEW_IDENTIFIER = "org.mozilla.gecko."; + private static final int GECKO_VIEW_IDENTIFIER_LENGTH = GECKO_VIEW_IDENTIFIER.length(); + + // List of custom views used + private static final int ABOUT_HOME_SECTION = 1; + private static final int AWESOME_BAR_TABS = 2; + private static final int FORM_ASSIST_POPUP = 3; + private static final int LINK_TEXT_VIEW = 4; + + private GeckoViewsFactory() { } + + // Making this a singleton class. + private static final GeckoViewsFactory INSTANCE = new GeckoViewsFactory(); + + public static GeckoViewsFactory getInstance() { + return INSTANCE; + } + + @Override + public View onCreateView(String name, Context context, AttributeSet attrs) { + if (!TextUtils.isEmpty(name) && name.startsWith(GECKO_VIEW_IDENTIFIER)) { + String viewName = name.substring(GECKO_VIEW_IDENTIFIER_LENGTH); + + if (TextUtils.isEmpty(viewName)) + return null; + + Log.i(LOGTAG, "Creating custom Gecko view: " + viewName); + + 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, "FormAssistPopup")) + return new FormAssistPopup(context, attrs); + else if (TextUtils.equals(viewName, "LinkTextView")) + return new LinkTextView(context, attrs); + } + + return null; + } +} diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index 95c49d3cda4e..f5f3b42dd927 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -97,6 +97,7 @@ FENNEC_JAVA_FILES = \ GeckoStateListDrawable.java \ GeckoThread.java \ GlobalHistory.java \ + GeckoViewsFactory.java \ LinkPreference.java \ LinkTextView.java \ NSSBridge.java \ diff --git a/mobile/android/base/TabsTray.java b/mobile/android/base/TabsTray.java index b4a106dd8eee..9c08d54db9d2 100644 --- a/mobile/android/base/TabsTray.java +++ b/mobile/android/base/TabsTray.java @@ -53,6 +53,8 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + LayoutInflater.from(this).setFactory(GeckoViewsFactory.getInstance()); + setContentView(R.layout.tabs_tray); mWaitingForClose = false;