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

Reply via email to