From 61e89877b071396a3f7963fba14f5a19f7cd082b Mon Sep 17 00:00:00 2001 From: Chenxia Liu Date: Wed, 27 May 2015 15:48:17 -0700 Subject: [PATCH] Bug 1147064 - Abstract out shared doorhanger layout. r=margaret --HG-- rename : mobile/android/base/resources/layout/doorhanger.xml => mobile/android/base/resources/layout/default_doorhanger.xml extra : rebase_source : 3d2547b501a7f69cef6585549d97f85e36bb444d --- .../resources/layout/default_doorhanger.xml | 36 +++++++++ .../base/resources/layout/doorhanger.xml | 30 ++------ .../resources/layout/login_doorhanger.xml | 73 +++++-------------- .../base/widget/DefaultDoorHanger.java | 40 ++++++++++ mobile/android/base/widget/DoorHanger.java | 58 +++------------ .../android/base/widget/LoginDoorHanger.java | 16 ++++ 6 files changed, 130 insertions(+), 123 deletions(-) create mode 100644 mobile/android/base/resources/layout/default_doorhanger.xml diff --git a/mobile/android/base/resources/layout/default_doorhanger.xml b/mobile/android/base/resources/layout/default_doorhanger.xml new file mode 100644 index 000000000000..93c6f303f872 --- /dev/null +++ b/mobile/android/base/resources/layout/default_doorhanger.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + diff --git a/mobile/android/base/resources/layout/doorhanger.xml b/mobile/android/base/resources/layout/doorhanger.xml index be3c4ab88a3b..c6231e67e27a 100644 --- a/mobile/android/base/resources/layout/doorhanger.xml +++ b/mobile/android/base/resources/layout/doorhanger.xml @@ -5,40 +5,24 @@ - - + android:layout_height="wrap_content"/> - - - - - + android:orientation="vertical"> - + - + - - - - - - - + - - - - - - diff --git a/mobile/android/base/widget/DefaultDoorHanger.java b/mobile/android/base/widget/DefaultDoorHanger.java index e46590e6396d..3c42d8fe23ec 100644 --- a/mobile/android/base/widget/DefaultDoorHanger.java +++ b/mobile/android/base/widget/DefaultDoorHanger.java @@ -5,9 +5,17 @@ package org.mozilla.gecko.widget; +import android.text.Html; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.method.LinkMovementMethod; +import android.text.style.ForegroundColorSpan; +import android.text.style.URLSpan; import android.util.Log; import android.widget.Button; +import android.widget.TextView; import org.mozilla.gecko.R; +import org.mozilla.gecko.Tabs; import org.mozilla.gecko.prompts.PromptInput; import org.json.JSONArray; @@ -29,12 +37,15 @@ public class DefaultDoorHanger extends DoorHanger { private static int sSpinnerTextColor = -1; + private final TextView mMessage; private List mInputs; private CheckBox mCheckBox; public DefaultDoorHanger(Context context, DoorhangerConfig config, Type type) { super(context, config, type); + mMessage = (TextView) findViewById(R.id.doorhanger_message); + if (sSpinnerTextColor == -1) { sSpinnerTextColor = mResources.getColor(R.color.text_color_primary_disable_only); } @@ -61,6 +72,11 @@ public class DefaultDoorHanger extends DoorHanger { setButtons(config); } + @Override + protected int getContentResource() { + return R.layout.default_doorhanger; + } + private List getInputs() { return mInputs; } @@ -154,6 +170,30 @@ public class DefaultDoorHanger extends DoorHanger { }; } + private void setMessage(String message) { + Spanned markupMessage = Html.fromHtml(message); + mMessage.setText(markupMessage); + } + + private void addLink(String label, String url, String delimiter) { + String title = mMessage.getText().toString(); + SpannableString titleWithLink = new SpannableString(title + delimiter + label); + URLSpan linkSpan = new URLSpan(url) { + @Override + public void onClick(View view) { + Tabs.getInstance().loadUrlInTab(getURL()); + } + }; + + // Prevent text outside the link from flashing when clicked. + ForegroundColorSpan colorSpan = new ForegroundColorSpan(mMessage.getCurrentTextColor()); + titleWithLink.setSpan(colorSpan, 0, title.length(), 0); + + titleWithLink.setSpan(linkSpan, title.length() + 1, titleWithLink.length(), 0); + mMessage.setText(titleWithLink); + mMessage.setMovementMethod(LinkMovementMethod.getInstance()); + } + private void styleInput(PromptInput input, View view) { if (input instanceof PromptInput.MenulistInput) { styleDropdownInputs(input, view); diff --git a/mobile/android/base/widget/DoorHanger.java b/mobile/android/base/widget/DoorHanger.java index 7aaec7f16d3a..30804ff4ae96 100644 --- a/mobile/android/base/widget/DoorHanger.java +++ b/mobile/android/base/widget/DoorHanger.java @@ -7,24 +7,17 @@ package org.mozilla.gecko.widget; import android.content.Context; import android.content.res.Resources; -import android.text.Html; -import android.text.SpannableString; -import android.text.Spanned; -import android.text.method.LinkMovementMethod; -import android.text.style.ForegroundColorSpan; -import android.text.style.URLSpan; import android.util.Log; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewStub; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.TextView; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.mozilla.gecko.R; -import org.mozilla.gecko.Tabs; public abstract class DoorHanger extends LinearLayout { @@ -67,8 +60,7 @@ public abstract class DoorHanger extends LinearLayout { protected final Type mType; - private final ImageView mIcon; - private final TextView mMessage; + protected final ImageView mIcon; protected final Context mContext; protected final Resources mResources; @@ -81,34 +73,30 @@ public abstract class DoorHanger extends LinearLayout { protected DoorHanger(Context context, DoorhangerConfig config, Type type) { super(context); + mContext = context; mResources = context.getResources(); mTabId = config.getTabId(); mIdentifier = config.getId(); + mType = type; - int resource; - switch (type) { - case LOGIN: - resource = R.layout.login_doorhanger; - break; - default: - resource = R.layout.doorhanger; - } + setOrientation(VERTICAL); + + final ViewStub contentStub = (ViewStub) findViewById(R.id.content); + contentStub.setLayoutResource(getContentResource()); + contentStub.inflate(); - LayoutInflater.from(context).inflate(resource, this); mDivider = findViewById(R.id.divider_doorhanger); mIcon = (ImageView) findViewById(R.id.doorhanger_icon); - mMessage = (TextView) findViewById(R.id.doorhanger_message); - - mType = type; mButtonsContainer = (LinearLayout) findViewById(R.id.doorhanger_buttons); mOnButtonClickListener = config.getButtonClickListener(); mDividerColor = mResources.getColor(R.color.divider_light); - setOrientation(VERTICAL); } + protected abstract int getContentResource(); + protected abstract void loadConfig(DoorhangerConfig config); protected void setOptions(final JSONObject options) { @@ -160,30 +148,6 @@ public abstract class DoorHanger extends LinearLayout { mIcon.setVisibility(View.VISIBLE); } - protected void setMessage(String message) { - Spanned markupMessage = Html.fromHtml(message); - mMessage.setText(markupMessage); - } - - protected void addLink(String label, String url, String delimiter) { - String title = mMessage.getText().toString(); - SpannableString titleWithLink = new SpannableString(title + delimiter + label); - URLSpan linkSpan = new URLSpan(url) { - @Override - public void onClick(View view) { - Tabs.getInstance().loadUrlInTab(getURL()); - } - }; - - // Prevent text outside the link from flashing when clicked. - ForegroundColorSpan colorSpan = new ForegroundColorSpan(mMessage.getCurrentTextColor()); - titleWithLink.setSpan(colorSpan, 0, title.length(), 0); - - titleWithLink.setSpan(linkSpan, title.length() + 1, titleWithLink.length(), 0); - mMessage.setText(titleWithLink); - mMessage.setMovementMethod(LinkMovementMethod.getInstance()); - } - /** * Creates and adds a button into the DoorHanger. * @param text Button text diff --git a/mobile/android/base/widget/LoginDoorHanger.java b/mobile/android/base/widget/LoginDoorHanger.java index daec6528f7d3..924973379f50 100644 --- a/mobile/android/base/widget/LoginDoorHanger.java +++ b/mobile/android/base/widget/LoginDoorHanger.java @@ -13,6 +13,8 @@ import android.content.Context; import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; +import android.text.Html; +import android.text.Spanned; import android.text.method.PasswordTransformationMethod; import android.util.Log; import android.view.LayoutInflater; @@ -38,6 +40,7 @@ public class LoginDoorHanger extends DoorHanger { private enum ActionType { EDIT, SELECT } private final TextView mTitle; + private final TextView mMessage; private final TextView mLink; private int mCallbackID; @@ -45,11 +48,19 @@ public class LoginDoorHanger extends DoorHanger { super(context, config, Type.LOGIN); mTitle = (TextView) findViewById(R.id.doorhanger_title); + mMessage = (TextView) findViewById(R.id.doorhanger_message); mLink = (TextView) findViewById(R.id.doorhanger_link); + mIcon.setImageResource(R.drawable.icon_key); + mIcon.setVisibility(View.VISIBLE); loadConfig(config); } + private void setMessage(String message) { + Spanned markupMessage = Html.fromHtml(message); + mMessage.setText(markupMessage); + } + @Override protected void loadConfig(DoorhangerConfig config) { setOptions(config.getOptions()); @@ -57,6 +68,11 @@ public class LoginDoorHanger extends DoorHanger { setButtons(config); } + @Override + protected int getContentResource() { + return R.layout.login_doorhanger; + } + @Override protected void setOptions(final JSONObject options) { super.setOptions(options);