jenkins-bot has submitted this change and it was merged.

Change subject: Fix vertical truncation of title and subtitle
......................................................................


Fix vertical truncation of title and subtitle

* Move subtitle from distinct TextView to title TextView with spans.
* Add AppTextView, a TextView subclass that measures it self properly
  even when the line spacing is changed. Since other TextView amendments
  may need to be made, it has a generic name.
* Inline LeadImagesHandler.findViewsById().

Bug: T111208
Change-Id: Ib253c84d706e492eb71ea71e589a2063fcbdaa65
---
M app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
A app/src/main/java/org/wikipedia/richtext/LeadingSpan.java
A app/src/main/java/org/wikipedia/richtext/ParagraphSpan.java
A app/src/main/java/org/wikipedia/richtext/RelativeLineHeightSpan.java
A app/src/main/java/org/wikipedia/richtext/RichTextUtil.java
M app/src/main/java/org/wikipedia/util/DimenUtil.java
A app/src/main/java/org/wikipedia/views/AppTextView.java
M app/src/main/res/layout/fragment_page.xml
A app/src/main/res/values-v19/dimens.xml
M app/src/main/res/values-v21/dimens.xml
A app/src/main/res/values-v23/dimens.xml
M app/src/main/res/values/dimens.xml
12 files changed, 362 insertions(+), 220 deletions(-)

Approvals:
  Dbrant: Looks good to me, approved
  jenkins-bot: Verified



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 bba378e..a60ea86 100755
--- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
+++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
@@ -12,7 +12,11 @@
 import android.support.annotation.Nullable;
 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.Gravity;
@@ -39,9 +43,12 @@
 import org.wikipedia.bridge.CommunicationBridge;
 import org.wikipedia.page.PageFragment;
 import org.wikipedia.page.gallery.GalleryActivity;
-import org.wikipedia.util.ApiUtil;
+import org.wikipedia.richtext.LeadingSpan;
+import org.wikipedia.richtext.ParagraphSpan;
+import org.wikipedia.richtext.RichTextUtil;
 import org.wikipedia.util.DimenUtil;
 import org.wikipedia.util.GradientUtil;
+import org.wikipedia.util.StringUtil;
 import org.wikipedia.views.ObservableWebView;
 import org.wikipedia.views.ViewUtil;
 
@@ -60,11 +67,6 @@
      * total screen height.
      */
     private static final float IMAGES_CONTAINER_RATIO = 0.5f;
-
-    /**
-     * The height, in dp, that the gradient will extend above the page title.
-     */
-    private static final int TITLE_GRADIENT_HEIGHT_DP = 64;
 
     /**
      * Maximum height of the page title text. If the text overflows this size, 
then the
@@ -107,9 +109,7 @@
 
     private ImageView imagePlaceholder;
     private ImageViewWithFace image;
-    private View pageTitleContainer;
     private TextView pageTitleText;
-    private TextView pageDescriptionText;
     private Drawable pageTitleGradient;
 
     private int displayHeightDp;
@@ -127,7 +127,9 @@
         this.bridge = bridge;
         this.webView = webView;
 
-        findViewsById(imageContainer);
+        imagePlaceholder = findView(imageContainer, 
R.id.page_image_placeholder);
+        image = findView(imageContainer, R.id.page_image);
+        pageTitleText = findView(imageContainer, R.id.page_title_text);
 
         pageTitleGradient = 
GradientUtil.getCubicGradient(getColor(R.color.lead_gradient_start), 
Gravity.BOTTOM);
         pageTitleText.setTypeface(Typeface.create(Typeface.SERIF, 
Typeface.NORMAL));
@@ -224,8 +226,6 @@
 
         // set the page title text, and honor any HTML formatting in the title
         pageTitleText.setText(Html.fromHtml(getPage().getDisplayTitle()));
-        // hide the description text...
-        pageDescriptionText.setVisibility(View.INVISIBLE);
 
         // kick off the (asynchronous) laying out of the page title text
         layoutPageTitle((int) (getDimension(R.dimen.titleTextSize)
@@ -246,8 +246,6 @@
         if (!isFragmentAdded()) {
             return;
         }
-        // remove padding from the title container while measuring
-        pageTitleContainer.setPadding(0, 0, 0, 0);
         // set the font size of the title
         pageTitleText.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp);
         // if we're still not being shown (if the fragment is still being 
created),
@@ -305,7 +303,7 @@
             // ok, we're not going to show lead images, so we need to make some
             // adjustments to our layout:
             // make the WebView padding be just the height of the title text, 
plus a fixed offset
-            titleContainerHeight = (int) ((pageTitleContainer.getHeight() / 
displayDensity))
+            titleContainerHeight = (int) ((pageTitleText.getHeight() / 
displayDensity))
                     + DISABLED_OFFSET_DP;
             imageContainer.setLayoutParams(new 
LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                     (int) ((titleContainerHeight) * displayDensity)));
@@ -316,22 +314,12 @@
             image.setImageDrawable(null);
             imagePlaceholder.setVisibility(View.GONE);
             pageTitleText.setVisibility(View.INVISIBLE);
-            pageDescriptionText.setVisibility(View.INVISIBLE);
             // set the color of the title
             
pageTitleText.setTextColor(getColor(Utils.getThemedAttributeId(getActivity(),
                     R.attr.lead_disabled_text_color)));
-            // remove bottom padding from the description
-            ViewUtil.setBottomPaddingDp(pageDescriptionText, 0);
             // and give it no drop shadow
             pageTitleText.setShadowLayer(0, 0, 0, 0);
-            // do the same for the description...
-            
pageDescriptionText.setTextColor(getColor(Utils.getThemedAttributeId(getActivity(),
-                    R.attr.lead_disabled_text_color)));
-            pageDescriptionText.setShadowLayer(0, 0, 0, 0);
-            // remove any background from the title container
-            pageTitleContainer.setBackgroundColor(Color.TRANSPARENT);
-            // set the correct to padding on the container
-            pageTitleContainer.setPadding(0, 0, 0, 0);
+            pageTitleText.setBackgroundColor(Color.TRANSPARENT);
         } else {
             // we're going to show the lead image, so make some adjustments to 
the
             // layout, in case we were previously not showing it:
@@ -343,28 +331,12 @@
             image.setVisibility(View.INVISIBLE);
             imagePlaceholder.setVisibility(View.VISIBLE);
             pageTitleText.setVisibility(View.INVISIBLE);
-            pageDescriptionText.setVisibility(View.INVISIBLE);
             // set the color of the title
             pageTitleText.setTextColor(getColor(R.color.lead_text_color));
-            // give default padding to the description
-            final int bottomPadding = 16;
-            ViewUtil.setBottomPaddingDp(pageDescriptionText, bottomPadding);
             // and give it a nice drop shadow!
             pageTitleText.setShadowLayer(2, 1, 1, 
getColor(R.color.lead_text_shadow));
-            // do the same for the description...
-            
pageDescriptionText.setTextColor(getColor(R.color.lead_text_color));
-            pageDescriptionText.setShadowLayer(2, 1, 1, 
getColor(R.color.lead_text_shadow));
             // set the title container background to be a gradient
-            ViewUtil.setBackgroundDrawable(pageTitleContainer, 
pageTitleGradient);
-            // set the correct padding on the container
-            pageTitleContainer.setPadding(0, (int) (TITLE_GRADIENT_HEIGHT_DP * 
displayDensity), 0, 0);
-        }
-
-        if (ApiUtil.hasHoneyComb()) {
-            // for API >10, decrease line spacing and boost bottom padding to 
account for it.
-            // (in API 10, decreased line spacing cuts off the bottom of the 
text)
-            final float lineSpacing = 0.8f;
-            pageTitleText.setLineSpacing(0, lineSpacing);
+            ViewUtil.setBackgroundDrawable(pageTitleText, pageTitleGradient);
         }
 
         final int paddingExtra = 8;
@@ -392,7 +364,6 @@
         image.setImageDrawable(null);
         imagePlaceholder.setVisibility(View.GONE);
         pageTitleText.setVisibility(View.GONE);
-        pageDescriptionText.setVisibility(View.GONE);
     }
 
     private void setWebViewPaddingTop(int padding) {
@@ -412,35 +383,22 @@
      * @param description WikiData description to be shown.
      */
     private void layoutWikiDataDescription(@Nullable final String description) 
{
-        // set the text of the description...
-        pageDescriptionText.setText(description);
-        // and wait for it to lay out, so that we know the height of the 
description text.
-        pageDescriptionText.post(new Runnable() {
-            @Override
-            public void run() {
-                if (!isFragmentAdded()) {
-                    return;
-                }
-                // only show the description if it's two lines or less, and 
nonempty,
-                // and adjust title padding based on whether the description 
is shown
-                int bottomPadding = 0;
-                if (TextUtils.isEmpty(description) || 
pageDescriptionText.getLineCount() > 2) {
-                    final int blankPadding = 16;
-                    bottomPadding += blankPadding;
-                    pageDescriptionText.setVisibility(View.GONE);
-                } else {
-                    pageDescriptionText.setVisibility(View.VISIBLE);
-                }
-                if (ApiUtil.hasHoneyComb() && !ApiUtil.hasLollipop()) {
-                    // boost the title padding a bit more, because these API 
versions don't
-                    // automatically apply correct padding when line spacing 
is decreased.
-                    final int extraPadding = 10;
-                    bottomPadding += extraPadding;
-                }
-                ViewUtil.setBottomPaddingDp(pageTitleText, bottomPadding);
-                pageTitleText.setVisibility(View.VISIBLE);
+        if (!TextUtils.isEmpty(description)) {
+            CharSequence title = pageTitleText.getText();
+            int titleLineCount = pageTitleText.getLineCount();
+
+            SpannableStringBuilder builder = new SpannableStringBuilder(title);
+            builder.append("\n");
+            builder.append(subtitleSpannable(description, 
getDimensionPixelSize(R.dimen.descriptionTextSize)));
+            pageTitleText.setText(builder);
+
+            // Only show the description if it's two lines or less.
+            if ((pageTitleText.getLineCount() - titleLineCount) > 2) {
+                // Restore title.
+                pageTitleText.setText(title);
             }
-        });
+        }
+        pageTitleText.setVisibility(View.VISIBLE);
     }
 
     /**
@@ -507,6 +465,19 @@
         image.setLayoutParams(new LinearLayout.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() {
         loadLeadImage(getLeadImageUrl());
     }
@@ -542,14 +513,6 @@
             anim.setFillAfter(true);
             image.startAnimation(anim);
         }
-    }
-
-    private void findViewsById(View root) {
-        imagePlaceholder = findView(root, R.id.page_image_placeholder);
-        image = findView(root, R.id.page_image);
-        pageTitleContainer = findView(root, R.id.page_title_container);
-        pageTitleText = findView(root, R.id.page_title_text);
-        pageDescriptionText = findView(root, R.id.page_description_text);
     }
 
     private void forceRefreshWebView() {
@@ -600,6 +563,10 @@
         return getResources().getDimension(id);
     }
 
+    private int getDimensionPixelSize(@DimenRes int id) {
+        return getResources().getDimensionPixelSize(id);
+    }
+
     @ColorInt
     private int getColor(@ColorRes int id) {
         return getResources().getColor(id);
diff --git a/app/src/main/java/org/wikipedia/richtext/LeadingSpan.java 
b/app/src/main/java/org/wikipedia/richtext/LeadingSpan.java
new file mode 100644
index 0000000..167de56
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/richtext/LeadingSpan.java
@@ -0,0 +1,24 @@
+package org.wikipedia.richtext;
+
+import android.graphics.Paint;
+
+public class LeadingSpan extends RelativeLineHeightSpan {
+    public LeadingSpan(float scalar) {
+        super(scalar);
+    }
+
+    @Override
+    public void chooseHeight(CharSequence text,
+                             int start,
+                             int end,
+                             int istartv,
+                             int v,
+                             Paint.FontMetricsInt metrics) {
+        // Don't change the state of metrics until all calculations are 
performed.
+        int scaledAscender = (int) scaledAscender(metrics);
+        int scaledDescender = (int) scaledDescender(metrics);
+
+        metrics.ascent = scaledAscender;
+        metrics.descent = scaledDescender;
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/wikipedia/richtext/ParagraphSpan.java 
b/app/src/main/java/org/wikipedia/richtext/ParagraphSpan.java
new file mode 100644
index 0000000..4f8a8b8
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/richtext/ParagraphSpan.java
@@ -0,0 +1,23 @@
+package org.wikipedia.richtext;
+
+import android.graphics.Paint;
+
+public class ParagraphSpan extends RelativeLineHeightSpan {
+    public ParagraphSpan(float scalar) {
+        super(scalar);
+    }
+
+    @Override
+    public void chooseHeight(CharSequence text,
+                             int start,
+                             int end,
+                             int istartv,
+                             int v,
+                             Paint.FontMetricsInt metrics) {
+        if (spanStart(text, start)) {
+            metrics.ascent = (int) scaledAscender(metrics);
+        } else if (spanEnd(text, end)) {
+            metrics.descent = (int) scaledDescender(metrics);
+        }
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/richtext/RelativeLineHeightSpan.java 
b/app/src/main/java/org/wikipedia/richtext/RelativeLineHeightSpan.java
new file mode 100644
index 0000000..8ae7c29
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/richtext/RelativeLineHeightSpan.java
@@ -0,0 +1,54 @@
+package org.wikipedia.richtext;
+
+import android.graphics.Paint;
+import android.text.Spanned;
+import android.text.style.LineHeightSpan;
+
+/*package*/ abstract class RelativeLineHeightSpan implements LineHeightSpan {
+    private final float scalar;
+
+    public RelativeLineHeightSpan(float scalar) {
+        this.scalar = scalar;
+    }
+
+    protected float scaledAscender(Paint.FontMetricsInt metrics) {
+        return -ascenderHeightRatio(metrics) * scaledLineHeight(metrics);
+    }
+
+    protected float scaledDescender(Paint.FontMetricsInt metrics) {
+        return descenderHeightRatio(metrics) * scaledLineHeight(metrics);
+    }
+
+    protected float descenderHeightRatio(Paint.FontMetricsInt metrics) {
+        return 1 - ascenderHeightRatio(metrics);
+    }
+
+    protected float ascenderHeightRatio(Paint.FontMetricsInt metrics) {
+        int height = lineHeight(metrics);
+        return height == 0 ? 0 : Math.abs(metrics.ascent) / (float) height;
+    }
+
+    protected float scaledLineHeight(Paint.FontMetricsInt metrics) {
+        return lineHeight(metrics) * scalar;
+    }
+
+    protected int lineHeight(Paint.FontMetricsInt metrics) {
+        return Math.abs(metrics.ascent) + Math.abs(metrics.descent);
+    }
+
+    protected boolean spanStart(CharSequence text, int start) {
+        return spanStart((Spanned) text, start);
+    }
+
+    protected boolean spanStart(Spanned text, int start) {
+        return text.getSpanStart(this) == start;
+    }
+
+    protected boolean spanEnd(CharSequence text, int end) {
+        return spanEnd((Spanned) text, end);
+    }
+
+    protected boolean spanEnd(Spanned text, int end) {
+        return text.getSpanEnd(this) == end;
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/wikipedia/richtext/RichTextUtil.java 
b/app/src/main/java/org/wikipedia/richtext/RichTextUtil.java
new file mode 100644
index 0000000..221e403
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/richtext/RichTextUtil.java
@@ -0,0 +1,19 @@
+package org.wikipedia.richtext;
+
+import android.support.annotation.NonNull;
+import android.text.SpannableString;
+
+public final class RichTextUtil {
+    @NonNull public static SpannableString setSpans(@NonNull SpannableString 
str,
+                                                    int start,
+                                                    int end,
+                                                    int flags,
+                                                    @NonNull Object... spans) {
+        for (Object span : spans) {
+            str.setSpan(span, start, end, flags);
+        }
+        return str;
+    }
+
+    private RichTextUtil() { }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/wikipedia/util/DimenUtil.java 
b/app/src/main/java/org/wikipedia/util/DimenUtil.java
index e7f1901..4586384 100644
--- a/app/src/main/java/org/wikipedia/util/DimenUtil.java
+++ b/app/src/main/java/org/wikipedia/util/DimenUtil.java
@@ -9,6 +9,8 @@
 import android.util.TypedValue;
 import android.view.Display;
 
+import org.wikipedia.WikipediaApp;
+
 public final class DimenUtil {
     public static float dpToPx(float dp) {
         return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, 
getDisplayMetrics());
@@ -30,6 +32,10 @@
         return getDisplayMetrics().density;
     }
 
+    public static float getFloat(@DimenRes int id) {
+        return getValue(id).getFloat();
+    }
+
     /** @return Dimension in dp. */
     public static float getDimension(@DimenRes int id) {
         return TypedValue.complexToFloat(getValue(id).data);
@@ -46,7 +52,7 @@
     }
 
     private static Resources getResources() {
-        return Resources.getSystem();
+        return WikipediaApp.getInstance().getResources();
     }
 
     /**
diff --git a/app/src/main/java/org/wikipedia/views/AppTextView.java 
b/app/src/main/java/org/wikipedia/views/AppTextView.java
new file mode 100644
index 0000000..c26b6e2
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/views/AppTextView.java
@@ -0,0 +1,47 @@
+package org.wikipedia.views;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+public class AppTextView extends TextView {
+    public AppTextView(Context context) {
+        this(context, null);
+    }
+
+    public AppTextView(Context context, AttributeSet attrs) {
+        this(context, attrs, android.R.attr.textViewStyle);
+    }
+
+    public AppTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public AppTextView(Context context, AttributeSet attrs, int defStyleAttr, 
int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        remeasureForLineSpacing();
+    }
+
+    // Ensure the descenders of the final line are not truncated. This usually 
happens when
+    // lineSpacingMultiplier is less than one.
+    private void remeasureForLineSpacing() {
+        setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() + 
calculateExtraDescenderSpace());
+    }
+
+    private int calculateExtraDescenderSpace() {
+        return Math.max(0, getIntrinsicLineHeight() - getLineHeight());
+    }
+
+    /** @return Line height without space multiplication and extra spacing 
addition. */
+    private int getIntrinsicLineHeight() {
+        return getPaint().getFontMetricsInt(null);
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_page.xml 
b/app/src/main/res/layout/fragment_page.xml
index c5fd44a..8cd4949 100644
--- a/app/src/main/res/layout/fragment_page.xml
+++ b/app/src/main/res/layout/fragment_page.xml
@@ -18,167 +18,153 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent">
 
-            <android.support.design.widget.CoordinatorLayout
-                android:id="@+id/page_contents_container"
+        <android.support.design.widget.CoordinatorLayout
+            android:id="@+id/page_contents_container"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+            <org.wikipedia.views.ObservableWebView
+                android:id="@+id/page_web_view"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent">
+                android:layout_height="match_parent"
+                />
 
-                <org.wikipedia.views.ObservableWebView
-                    android:id="@+id/page_web_view"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    />
-
-                <!-- dummy LinearLayout container for 2.3 support.
-                Remove when we drop support for 2.3. -->
-                <LinearLayout
+            <!-- dummy LinearLayout container for 2.3 support.
+            Remove when we drop support for 2.3. -->
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+                <FrameLayout
+                    android:id="@+id/page_image_container"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content">
-                    <FrameLayout
-                        android:id="@+id/page_image_container"
+                    <!-- dummy LinearLayout container for 2.3 support.
+                    Remove when we drop support for 2.3. -->
+                    <LinearLayout
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content">
-                        <!-- dummy LinearLayout container for 2.3 support.
-                        Remove when we drop support for 2.3. -->
-                        <LinearLayout
-                            android:layout_width="match_parent"
-                            android:layout_height="match_parent">
-                            <org.wikipedia.page.leadimages.ImageViewWithFace
-                                android:id="@+id/page_image"
-                                android:layout_width="match_parent"
-                                android:layout_height="match_parent"
-                                android:scaleType="centerCrop"
-                                android:visibility="invisible"/>
-                        </LinearLayout>
-                        <ImageView
-                            android:id="@+id/page_image_placeholder"
+                        android:layout_height="match_parent">
+                        <org.wikipedia.page.leadimages.ImageViewWithFace
+                            android:id="@+id/page_image"
                             android:layout_width="match_parent"
                             android:layout_height="match_parent"
                             android:scaleType="centerCrop"
-                            android:contentDescription="@null"/>
-                        <LinearLayout
-                            android:id="@+id/page_title_container"
-                            android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:orientation="vertical"
-                            android:layout_gravity="bottom">
-                            <TextView
-                                android:id="@+id/page_title_text"
-                                android:layout_width="match_parent"
-                                android:layout_height="wrap_content"
-                                style="@style/RtlAwareTextView"
-                                android:paddingTop="16dp"
-                                
android:paddingRight="@dimen/activity_horizontal_margin"
-                                
android:paddingLeft="@dimen/activity_horizontal_margin"/>
-                            <TextView
-                                android:id="@+id/page_description_text"
-                                android:layout_width="match_parent"
-                                android:layout_height="wrap_content"
-                                style="@style/RtlAwareTextView"
-                                android:layout_gravity="bottom"
-                                android:visibility="invisible"
-                                android:textSize="@dimen/descriptionTextSize"
-                                android:paddingBottom="16dp"
-                                
android:paddingRight="@dimen/activity_horizontal_margin"
-                                
android:paddingLeft="@dimen/activity_horizontal_margin"/>
-                        </LinearLayout>
-                    </FrameLayout>
+                            android:visibility="invisible"/>
+                    </LinearLayout>
+                    <ImageView
+                        android:id="@+id/page_image_placeholder"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:scaleType="centerCrop"
+                        android:contentDescription="@null"/>
+
+                    <org.wikipedia.views.AppTextView
+                        android:id="@+id/page_title_text"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="bottom"
+                        style="@style/RtlAwareTextView"
+                        android:paddingTop="32dp"
+                        
android:paddingRight="@dimen/activity_horizontal_margin"
+                        android:paddingBottom="16dp"
+                        android:paddingLeft="@dimen/activity_horizontal_margin"
+                        
android:lineSpacingMultiplier="@dimen/lead_title_leading_scalar" />
+                </FrameLayout>
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/bottom_content_container"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="-400dp"
+                android:layout_gravity="bottom"
+                android:orientation="vertical"
+                android:visibility="gone">
+
+                <LinearLayout
+                    android:id="@+id/read_more_container"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:visibility="gone">
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        
android:textAppearance="?android:attr/textAppearanceLarge"
+                        android:paddingLeft="@dimen/activity_horizontal_margin"
+                        
android:paddingRight="@dimen/activity_horizontal_margin"
+                        android:paddingBottom="16dp"
+                        android:fontFamily="serif"
+                        android:textSize="24sp"
+                        android:text="@string/read_more_section"/>
+                    <ListView
+                        android:id="@+id/read_more_list"
+                        android:layout_width="match_parent"
+                        android:layout_height="0dp"/>
                 </LinearLayout>
 
                 <LinearLayout
-                    android:id="@+id/bottom_content_container"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginBottom="-400dp"
-                    android:layout_gravity="bottom"
                     android:orientation="vertical"
-                    android:visibility="gone">
+                    android:paddingBottom="16dp"
+                    android:background="?attr/subtle_gray_color">
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="8dp"
+                        android:background="@drawable/toolbar_bottom_shadow"/>
 
-                    <LinearLayout
-                        android:id="@+id/read_more_container"
+                    <TextView
+                        android:id="@+id/page_external_link"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:visibility="gone">
-                        <TextView
-                            android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            
android:textAppearance="?android:attr/textAppearanceLarge"
-                            
android:paddingLeft="@dimen/activity_horizontal_margin"
-                            
android:paddingRight="@dimen/activity_horizontal_margin"
-                            android:paddingBottom="16dp"
-                            android:fontFamily="serif"
-                            android:textSize="24sp"
-                            android:text="@string/read_more_section"/>
-                        <ListView
-                            android:id="@+id/read_more_list"
-                            android:layout_width="match_parent"
-                            android:layout_height="0dp"/>
-                    </LinearLayout>
-
-                    <LinearLayout
+                        android:paddingTop="8dp"
+                        android:paddingLeft="@dimen/activity_horizontal_margin"
+                        
android:paddingRight="@dimen/activity_horizontal_margin"
+                        style="?android:textAppearanceSmall"
+                        android:text="@string/page_view_in_browser"
+                        android:textColor="?attr/link_color"
+                        android:gravity="center"/>
+                    <TextView
+                        android:id="@+id/page_last_updated_text"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center_horizontal"
+                        android:paddingTop="8dp"
+                        android:paddingLeft="@dimen/activity_horizontal_margin"
+                        
android:paddingRight="@dimen/activity_horizontal_margin"
+                        style="?android:textAppearanceSmall"
+                        android:textIsSelectable="true"
+                        android:textColorLink="?attr/link_color"/>
+                    <TextView
+                        android:id="@+id/page_license_text"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:paddingBottom="16dp"
-                        android:background="?attr/subtle_gray_color">
-                        <View
-                            android:layout_width="match_parent"
-                            android:layout_height="8dp"
-                            
android:background="@drawable/toolbar_bottom_shadow"/>
-
-                        <TextView
-                            android:id="@+id/page_external_link"
-                            android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:paddingTop="8dp"
-                            
android:paddingLeft="@dimen/activity_horizontal_margin"
-                            
android:paddingRight="@dimen/activity_horizontal_margin"
-                            style="?android:textAppearanceSmall"
-                            android:text="@string/page_view_in_browser"
-                            android:textColor="?attr/link_color"
-                            android:gravity="center"/>
-                        <TextView
-                            android:id="@+id/page_last_updated_text"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:layout_gravity="center_horizontal"
-                            android:paddingTop="8dp"
-                            
android:paddingLeft="@dimen/activity_horizontal_margin"
-                            
android:paddingRight="@dimen/activity_horizontal_margin"
-                            style="?android:textAppearanceSmall"
-                            android:textIsSelectable="true"
-                            android:textColorLink="?attr/link_color"/>
-                        <TextView
-                            android:id="@+id/page_license_text"
-                            android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:paddingTop="8dp"
-                            
android:paddingLeft="@dimen/activity_horizontal_margin"
-                            
android:paddingRight="@dimen/activity_horizontal_margin"
-                            style="?android:textAppearanceSmall"
-                            android:textIsSelectable="true"
-                            android:textColorLink="?attr/link_color"
-                            android:gravity="center"/>
-                    </LinearLayout>
+                        android:paddingTop="8dp"
+                        android:paddingLeft="@dimen/activity_horizontal_margin"
+                        
android:paddingRight="@dimen/activity_horizontal_margin"
+                        style="?android:textAppearanceSmall"
+                        android:textIsSelectable="true"
+                        android:textColorLink="?attr/link_color"
+                        android:gravity="center"/>
                 </LinearLayout>
+            </LinearLayout>
 
-                <android.support.design.widget.FloatingActionButton
-                    android:id="@+id/floating_toc_button"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    style="@style/FloatingActionButton"
-                    android:layout_gravity="bottom|end"
-                    android:src="@drawable/ic_toc"
-                    android:contentDescription="@string/menu_show_toc"
-                    app:fabSize="mini"
-                    app:elevation="4sp"
-                    app:borderWidth="0dp"
-                    app:backgroundTint="?attr/toc_button_color"
-                    app:layout_anchor="@id/bottom_content_container"
-                    app:layout_anchorGravity="bottom|right|end" />
+            <android.support.design.widget.FloatingActionButton
+                android:id="@+id/floating_toc_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                style="@style/FloatingActionButton"
+                android:layout_gravity="bottom|end"
+                android:src="@drawable/ic_toc"
+                android:contentDescription="@string/menu_show_toc"
+                app:fabSize="mini"
+                app:elevation="4sp"
+                app:borderWidth="0dp"
+                app:backgroundTint="?attr/toc_button_color"
+                app:layout_anchor="@id/bottom_content_container"
+                app:layout_anchorGravity="bottom|right|end" />
 
-            </android.support.design.widget.CoordinatorLayout>
+        </android.support.design.widget.CoordinatorLayout>
 
         </org.wikipedia.views.SwipeRefreshLayoutWithScroll>
 
diff --git a/app/src/main/res/values-v19/dimens.xml 
b/app/src/main/res/values-v19/dimens.xml
new file mode 100644
index 0000000..3d04ea5
--- /dev/null
+++ b/app/src/main/res/values-v19/dimens.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <item name="lead_title_leading_scalar" format="float" 
type="dimen">.8</item>
+    <item name="lead_subtitle_paragraph_scalar" format="float" 
type="dimen">1.1</item>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-v21/dimens.xml 
b/app/src/main/res/values-v21/dimens.xml
index 927a7ee..646954a 100644
--- a/app/src/main/res/values-v21/dimens.xml
+++ b/app/src/main/res/values-v21/dimens.xml
@@ -7,4 +7,5 @@
     <dimen name="floating_action_button_margin_right">16dp</dimen>
     <dimen name="floating_action_button_margin_bottom">16dp</dimen>
 
+    <item name="lead_subtitle_paragraph_scalar" format="float" 
type="dimen">1.15</item>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-v23/dimens.xml 
b/app/src/main/res/values-v23/dimens.xml
new file mode 100644
index 0000000..8fbe8a2
--- /dev/null
+++ b/app/src/main/res/values-v23/dimens.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <item name="lead_title_leading_scalar" format="float" 
type="dimen">.95</item>
+    <item name="lead_subtitle_leading_scalar" format="float" 
type="dimen">1.1</item>
+    <item name="lead_subtitle_paragraph_scalar" format="float" 
type="dimen">1.15</item>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml 
b/app/src/main/res/values/dimens.xml
index e3b66e0..e673751 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -59,4 +59,8 @@
     <dimen name="nav_drawer_header_height">150dp</dimen>
 
     <dimen name="shadow_thickness">3dp</dimen>
-</resources>
\ No newline at end of file
+
+    <item name="lead_title_leading_scalar" format="float" 
type="dimen">.9</item>
+    <item name="lead_subtitle_leading_scalar" format="float" 
type="dimen">1.35</item>
+    <item name="lead_subtitle_paragraph_scalar" format="float" 
type="dimen">1.15</item>
+</resources>

-- 
To view, visit https://gerrit.wikimedia.org/r/239315
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ib253c84d706e492eb71ea71e589a2063fcbdaa65
Gerrit-PatchSet: 6
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to