Niedzielski has uploaded a new change for review. https://gerrit.wikimedia.org/r/249325
Change subject: Add pronunciation icon lead image logic ...................................................................... Add pronunciation icon lead image logic Add logic for showing the pronunciation icon. The audio player portion will come in a later patch so showing pronunciations is always disabled in this patch. Bug: T114524 Change-Id: I5390238adb1edc1521889e14c81285b1a5b04fe2 --- M app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java A app/src/main/java/org/wikipedia/richtext/IntrinsicImageSpan.java A app/src/main/java/org/wikipedia/richtext/PronunciationSpan.java M app/src/main/java/org/wikipedia/richtext/RichTextUtil.java M app/src/main/java/org/wikipedia/views/ArticleHeaderView.java A app/src/main/res/drawable-hdpi/ic_volume_up_black_24dp.png A app/src/main/res/drawable-mdpi/ic_volume_up_black_24dp.png A app/src/main/res/drawable-xhdpi/ic_volume_up_black_24dp.png A app/src/main/res/drawable-xxhdpi/ic_volume_up_black_24dp.png A app/src/main/res/drawable-xxxhdpi/ic_volume_up_black_24dp.png 10 files changed, 200 insertions(+), 43 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/25/249325/1 diff --git a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java index 31cd378..714bb0a 100755 --- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java +++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java @@ -8,11 +8,7 @@ import android.support.design.widget.CoordinatorLayout; import android.support.v4.app.FragmentActivity; import android.text.Html; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.SpannableStringBuilder; import android.text.TextUtils; -import android.text.style.AbsoluteSizeSpan; import android.util.TypedValue; import android.graphics.PointF; import android.view.animation.Animation; @@ -32,11 +28,7 @@ import org.wikipedia.bridge.CommunicationBridge; import org.wikipedia.page.PageFragment; import org.wikipedia.page.gallery.GalleryActivity; -import org.wikipedia.richtext.LeadingSpan; -import org.wikipedia.richtext.ParagraphSpan; -import org.wikipedia.richtext.RichTextUtil; import org.wikipedia.util.DimenUtil; -import org.wikipedia.util.StringUtil; import org.wikipedia.views.ArticleHeaderView; import org.wikipedia.views.ObservableWebView; @@ -190,7 +182,8 @@ } // set the page title text, and honor any HTML formatting in the title - articleHeaderView.setText(Html.fromHtml(getPage().getDisplayTitle()), getPage().getTitle().getSite().getLanguageCode()); + articleHeaderView.setTitle(Html.fromHtml(getPage().getDisplayTitle())); + articleHeaderView.setLocale(getPage().getTitle().getSite().getLanguageCode()); // Set the subtitle, too, so text measurements are accurate. layoutWikiDataDescription(getTitle().getDescription()); @@ -322,18 +315,13 @@ */ private void layoutWikiDataDescription(@Nullable final String description) { if (!TextUtils.isEmpty(description)) { - CharSequence title = articleHeaderView.getText(); int titleLineCount = articleHeaderView.getLineCount(); - SpannableStringBuilder builder = new SpannableStringBuilder(title); - builder.append("\n"); - builder.append(subtitleSpannable(description, getDimensionPixelSize(R.dimen.descriptionTextSize))); - articleHeaderView.setText(builder); + articleHeaderView.setSubtitle(description); // Only show the description if it's two lines or less. if ((articleHeaderView.getLineCount() - titleLineCount) > 2) { - // Restore title. - articleHeaderView.setText(title); + articleHeaderView.setSubtitle(null); } } } @@ -352,19 +340,6 @@ private void setImageLayoutParams(int width, int height) { image.setLayoutParams(new FrameLayout.LayoutParams(width, height)); - } - - private SpannableString subtitleSpannable(@Nullable CharSequence str, int sizePx) { - final float leadingScalar = DimenUtil.getFloat(R.dimen.lead_subtitle_leading_scalar); - final float paragraphScalar = DimenUtil.getFloat(R.dimen.lead_subtitle_paragraph_scalar); - CharSequence nonnullStr = StringUtil.emptyIfNull(str); - return RichTextUtil.setSpans(new SpannableString(nonnullStr), - 0, - nonnullStr.length(), - Spannable.SPAN_INCLUSIVE_INCLUSIVE, - new AbsoluteSizeSpan(sizePx, false), - new LeadingSpan(leadingScalar), - new ParagraphSpan(paragraphScalar)); } private void loadLeadImage() { @@ -442,10 +417,6 @@ private float getDimension(@DimenRes int id) { return getResources().getDimension(id); - } - - private int getDimensionPixelSize(@DimenRes int id) { - return getResources().getDimensionPixelSize(id); } private Resources getResources() { diff --git a/app/src/main/java/org/wikipedia/richtext/IntrinsicImageSpan.java b/app/src/main/java/org/wikipedia/richtext/IntrinsicImageSpan.java new file mode 100644 index 0000000..ca0093c --- /dev/null +++ b/app/src/main/java/org/wikipedia/richtext/IntrinsicImageSpan.java @@ -0,0 +1,87 @@ +package org.wikipedia.richtext; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.support.annotation.DrawableRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.style.ImageSpan; + +public class IntrinsicImageSpan extends ImageSpan { + @Nullable private Drawable drawable; + + public IntrinsicImageSpan(@NonNull Context context, Bitmap bitmap) { + super(context, bitmap); + init(); + } + + public IntrinsicImageSpan(@NonNull Context context, Bitmap bitmap, int verticalAlignment) { + super(context, bitmap, verticalAlignment); + init(); + } + + public IntrinsicImageSpan(Drawable d) { + super(d); + init(); + } + + public IntrinsicImageSpan(Drawable d, int verticalAlignment) { + super(d, verticalAlignment); + init(); + } + + public IntrinsicImageSpan(Drawable d, String source) { + super(d, source); + init(); + } + + public IntrinsicImageSpan(Drawable d, String source, int verticalAlignment) { + super(d, source, verticalAlignment); + init(); + } + + public IntrinsicImageSpan(@NonNull Context context, Uri uri) { + super(context, uri); + init(); + } + + public IntrinsicImageSpan(@NonNull Context context, Uri uri, int verticalAlignment) { + super(context, uri, verticalAlignment); + init(); + } + + public IntrinsicImageSpan(@NonNull Context context, @DrawableRes int resourceId) { + super(context, resourceId); + init(); + } + + public IntrinsicImageSpan(@NonNull Context context, @DrawableRes int resourceId, int verticalAlignment) { + super(context, resourceId, verticalAlignment); + init(); + } + + @Override @Nullable public Drawable getDrawable() { + return drawable; + } + + private void init() { + // super.getDrawable() is convoluted: + // * May return an original or a new Drawable; does not keep a reference in the latter + // case. + // * May set the bounds or not. + // * May set the bounds differently. + // + // This is the only seam to change the Drawable state. + drawable = super.getDrawable(); + + setIntrinsicSize(); + } + + private void setIntrinsicSize() { + if (drawable != null) { + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/wikipedia/richtext/PronunciationSpan.java b/app/src/main/java/org/wikipedia/richtext/PronunciationSpan.java new file mode 100644 index 0000000..725b13e --- /dev/null +++ b/app/src/main/java/org/wikipedia/richtext/PronunciationSpan.java @@ -0,0 +1,10 @@ +package org.wikipedia.richtext; + +import android.text.style.ClickableSpan; +import android.view.View; + +public class PronunciationSpan extends ClickableSpan { + @Override public void onClick(View widget) { + // TODO: implementation. + } +} diff --git a/app/src/main/java/org/wikipedia/richtext/RichTextUtil.java b/app/src/main/java/org/wikipedia/richtext/RichTextUtil.java index 5e5e13f..3089897 100644 --- a/app/src/main/java/org/wikipedia/richtext/RichTextUtil.java +++ b/app/src/main/java/org/wikipedia/richtext/RichTextUtil.java @@ -10,11 +10,11 @@ import java.util.List; public final class RichTextUtil { - @NonNull public static SpannableString setSpans(@NonNull SpannableString spanned, - int start, - int end, - int flags, - @NonNull Object... spans) { + @NonNull public static Spannable setSpans(@NonNull Spannable spanned, + int start, + int end, + int flags, + @NonNull Object... spans) { for (Object span : spans) { spanned.setSpan(span, start, end, flags); } diff --git a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java index 925ab6b..79557aa 100644 --- a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java +++ b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java @@ -10,8 +10,17 @@ import android.os.Build; import android.support.annotation.ColorInt; import android.support.annotation.ColorRes; +import android.support.annotation.DimenRes; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.AbsoluteSizeSpan; +import android.text.style.ImageSpan; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; @@ -23,9 +32,17 @@ import org.wikipedia.R; import org.wikipedia.Utils; +import org.wikipedia.drawable.DrawableUtil; import org.wikipedia.page.leadimages.ImageViewWithFace; import org.wikipedia.page.leadimages.ImageViewWithFace.OnImageLoadListener; +import org.wikipedia.richtext.IntrinsicImageSpan; +import org.wikipedia.richtext.LeadingSpan; +import org.wikipedia.richtext.ParagraphSpan; +import org.wikipedia.richtext.PronunciationSpan; +import org.wikipedia.richtext.RichTextUtil; +import org.wikipedia.util.DimenUtil; import org.wikipedia.util.GradientUtil; +import org.wikipedia.util.StringUtil; import butterknife.Bind; import butterknife.ButterKnife; @@ -34,6 +51,9 @@ @Bind(R.id.image) ImageViewWithFace image; @Bind(R.id.placeholder) ImageView placeholder; @Bind(R.id.text) AppTextView text; + + @NonNull private CharSequence title = ""; + @NonNull private CharSequence subtitle = ""; public ArticleHeaderView(Context context) { super(context); @@ -128,12 +148,22 @@ return text.getText(); } - public void setText(CharSequence text) { - this.text.setText(text); + public void setTitle(@Nullable CharSequence text) { + title = StringUtil.emptyIfNull(text); + updateText(); } - public void setText(CharSequence text, String locale) { - this.text.setText(text, locale); + public void setSubtitle(@Nullable CharSequence text) { + subtitle = StringUtil.emptyIfNull(text); + updateText(); + } + + public boolean hasSubtitle() { + return !TextUtils.isEmpty(subtitle); + } + + public void setLocale(String locale) { + text.setText(locale); } public void setTextColor(@ColorInt int color) { @@ -146,6 +176,61 @@ public void setTextSize(int unit, float size) { text.setTextSize(unit, size); + } + + public void setPronunciation() { + // TODO: implementation. + updateText(); + } + + public boolean hasPronunciation() { + // TODO: implementation. + return false; + } + + private void updateText() { + SpannableStringBuilder builder = new SpannableStringBuilder(title); + + if (hasPronunciation()) { + builder.append(" "); + builder.append(pronunciationSpanned()); + } + + if (hasSubtitle()) { + builder.append("\n"); + builder.append(subtitleSpanned()); + } + + text.setText(builder); + } + + private Spanned pronunciationSpanned() { + return RichTextUtil.setSpans(new SpannableString(" "), + 0, + 1, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE, + pronunciationIconSpan(), + new PronunciationSpan()); + } + + private Object pronunciationIconSpan() { + ImageSpan span = new IntrinsicImageSpan(getContext(), R.drawable.ic_volume_up_black_24dp, + ImageSpan.ALIGN_BASELINE); + DrawableUtil.setTint(span.getDrawable(), Color.WHITE); + return span; + } + + private Spanned subtitleSpanned() { + final float leadingScalar = DimenUtil.getFloat(R.dimen.lead_subtitle_leading_scalar); + final float paragraphScalar = DimenUtil.getFloat(R.dimen.lead_subtitle_paragraph_scalar); + return RichTextUtil.setSpans(new SpannableString(subtitle), + 0, + subtitle.length(), + Spannable.SPAN_INCLUSIVE_EXCLUSIVE, + new AbsoluteSizeSpan(getDimensionPixelSize(R.dimen.descriptionTextSize), + false), + new LeadingSpan(leadingScalar), + new ParagraphSpan(paragraphScalar)); } private void setTextDropShadow() { @@ -190,4 +275,8 @@ @ColorInt private int getColor(@ColorRes int id) { return ContextCompat.getColor(getContext(), id); } -} \ No newline at end of file + + private int getDimensionPixelSize(@DimenRes int id) { + return getResources().getDimensionPixelSize(id); + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_volume_up_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_volume_up_black_24dp.png new file mode 100644 index 0000000..159d9c2 --- /dev/null +++ b/app/src/main/res/drawable-hdpi/ic_volume_up_black_24dp.png Binary files differ diff --git a/app/src/main/res/drawable-mdpi/ic_volume_up_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_volume_up_black_24dp.png new file mode 100644 index 0000000..4ed2778 --- /dev/null +++ b/app/src/main/res/drawable-mdpi/ic_volume_up_black_24dp.png Binary files differ diff --git a/app/src/main/res/drawable-xhdpi/ic_volume_up_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_volume_up_black_24dp.png new file mode 100644 index 0000000..a0bd189 --- /dev/null +++ b/app/src/main/res/drawable-xhdpi/ic_volume_up_black_24dp.png Binary files differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_volume_up_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_volume_up_black_24dp.png new file mode 100644 index 0000000..c1e9aff --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/ic_volume_up_black_24dp.png Binary files differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_volume_up_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_volume_up_black_24dp.png new file mode 100644 index 0000000..6d09e7f --- /dev/null +++ b/app/src/main/res/drawable-xxxhdpi/ic_volume_up_black_24dp.png Binary files differ -- To view, visit https://gerrit.wikimedia.org/r/249325 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5390238adb1edc1521889e14c81285b1a5b04fe2 Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits