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

Change subject: Make the first edit pencil serve a dual purpose.
......................................................................


Make the first edit pencil serve a dual purpose.

This does a few things:
- Moves the first edit pencil into the native ArticleHeaderView (and
  removes the first edit pencil from the WebView).
- Shows a PopupMenu at the location of the pencil that allows options to
  edit the description or the lead section of the article.
- Splits the single TextView that contained the title+description into two
  TextViews, so that the second TextView (containing the description) can
  have a padding to accommodate the edit pencil.

Bug: T151468
Change-Id: I6f2fadaeeb0345b208e3f112d3f012e33784dbf9
---
M app/src/main/assets/bundle.js
M app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderView.java
M app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
M app/src/main/res/layout/view_article_header.xml
A app/src/main/res/menu/menu_article_header_edit.xml
M app/src/main/res/values-qq/strings.xml
M app/src/main/res/values/strings.xml
M www/js/sections.js
8 files changed, 140 insertions(+), 63 deletions(-)

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



diff --git a/app/src/main/assets/bundle.js b/app/src/main/assets/bundle.js
index aaa1373..cacc496 100644
--- a/app/src/main/assets/bundle.js
+++ b/app/src/main/assets/bundle.js
@@ -451,8 +451,6 @@
     issuesContainer.id = "issues_container";
     document.getElementById( "content" ).appendChild( issuesContainer );
 
-    var editButton = buildEditSectionButton( payload.section.id );
-
     var content = document.createElement( "div" );
     content.setAttribute( "dir", window.directionality );
     content.innerHTML = payload.section.text;
@@ -498,9 +496,6 @@
             transformer.transform( "widenImages", content ); // offsetWidth
         }
     }
-
-    // insert the edit pencil
-    content.insertBefore( editButton, content.firstChild );
 
     transformer.transform("displayDisambigLink", content);
     transformer.transform("displayIssuesLink", content);
diff --git 
a/app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderView.java 
b/app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderView.java
index 8817846..46e972a 100644
--- a/app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderView.java
+++ b/app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderView.java
@@ -12,6 +12,7 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.content.ContextCompat;
+import android.support.v7.widget.PopupMenu;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
@@ -19,14 +20,16 @@
 import android.text.TextPaint;
 import android.text.TextUtils;
 import android.text.method.LinkMovementMethod;
-import android.text.style.AbsoluteSizeSpan;
 import android.text.style.ClickableSpan;
+import android.text.style.ForegroundColorSpan;
 import android.text.style.StyleSpan;
 import android.text.style.TypefaceSpan;
 import android.util.AttributeSet;
 import android.view.Gravity;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
@@ -39,6 +42,7 @@
 import org.wikipedia.richtext.ParagraphSpan;
 import org.wikipedia.richtext.RichTextUtil;
 import org.wikipedia.util.DimenUtil;
+import org.wikipedia.util.FeedbackUtil;
 import org.wikipedia.util.ReleaseUtil;
 import org.wikipedia.util.StringUtil;
 import org.wikipedia.views.AppTextView;
@@ -49,18 +53,21 @@
 
 import butterknife.BindView;
 import butterknife.ButterKnife;
+import butterknife.OnClick;
 
 import static org.wikipedia.util.DimenUtil.leadImageHeightForDevice;
 import static org.wikipedia.util.L10nUtil.isLangRTL;
 import static org.wikipedia.util.ResourceUtil.getThemedAttributeId;
 
-public class ArticleHeaderView extends LinearLayout implements 
ObservableWebView.OnScrollChangeListener {
+public class ArticleHeaderView extends FrameLayout implements 
ObservableWebView.OnScrollChangeListener {
     @BindView(R.id.view_article_header_image) ArticleHeaderImageView image;
     @BindView(R.id.view_article_header_image_gradient) View gradient;
-    @BindView(R.id.view_article_header_text) AppTextView text;
+    @BindView(R.id.view_article_title_text) AppTextView titleText;
+    @BindView(R.id.view_article_subtitle_text) AppTextView subtitleText;
     @BindView(R.id.view_article_header_divider) View divider;
     @BindView(R.id.view_article_header_container) LinearLayout container;
     @BindView(R.id.view_article_header_status_bar_placeholder) 
StatusBarBlankView statusBarPlaceholder;
+    @BindView(R.id.view_article_header_edit_pencil) View editPencil;
 
     @Nullable private Callback callback;
     @NonNull private CharSequence title = "";
@@ -72,6 +79,8 @@
 
     public interface Callback {
         void onDescriptionClicked();
+        void onEditDescription();
+        void onEditLeadSection();
     }
 
     public ArticleHeaderView(Context context) {
@@ -155,14 +164,6 @@
         updateScroll();
     }
 
-    public int getLineCount() {
-        return text.getLineCount();
-    }
-
-    public CharSequence getText() {
-        return text.getText();
-    }
-
     public void setTitle(@Nullable CharSequence text) {
         title = StringUtil.emptyIfNull(text);
         updateText();
@@ -178,18 +179,22 @@
     }
 
     public void setLocale(String locale) {
-        text.setLocale(locale);
-        LayoutParams params = (LayoutParams) divider.getLayoutParams();
-        if (isLangRTL(locale)) {
-            params.gravity = Gravity.RIGHT;
-        } else {
-            params.gravity = Gravity.LEFT;
-        }
-        divider.setLayoutParams(params);
+        titleText.setLocale(locale);
+        subtitleText.setLocale(locale);
+        LinearLayout.LayoutParams dividerParams = (LinearLayout.LayoutParams) 
divider.getLayoutParams();
+        dividerParams.gravity = isLangRTL(locale) ? Gravity.RIGHT : 
Gravity.LEFT;
+        divider.setLayoutParams(dividerParams);
+        FrameLayout.LayoutParams pencilParams = (FrameLayout.LayoutParams) 
editPencil.getLayoutParams();
+        pencilParams.gravity = Gravity.BOTTOM | (isLangRTL(locale) ? 
Gravity.LEFT : Gravity.RIGHT);
+        int subtitlePadding = editPencil.getWidth();
+        subtitleText.setPadding(isLangRTL(locale) ? subtitlePadding : 0,
+                subtitleText.getPaddingTop(),
+                isLangRTL(locale) ? 0 : subtitlePadding,
+                subtitleText.getPaddingBottom());
     }
 
     public void setTextColor(@ColorInt int color) {
-        text.setTextColor(color);
+        titleText.setTextColor(color);
     }
 
     public void setPronunciation(@Nullable String url) {
@@ -204,6 +209,20 @@
     @Override
     public void onScrollChanged(int oldScrollY, int scrollY, boolean 
isHumanScroll) {
         updateScroll(scrollY);
+    }
+
+    @OnClick(R.id.view_article_header_edit_pencil) void onEditClick() {
+        // TODO: unblock when ready for beta+
+        if (ReleaseUtil.isPreBetaRelease()) {
+            PopupMenu menu = new PopupMenu(editPencil.getContext(), 
editPencil);
+            menu.getMenuInflater().inflate(R.menu.menu_article_header_edit, 
menu.getMenu());
+            menu.setOnMenuItemClickListener(new EditMenuClickListener());
+            menu.show();
+        } else {
+            if (callback != null) {
+                callback.onEditLeadSection();
+            }
+        }
     }
 
     @Override
@@ -245,18 +264,20 @@
             builder.append(" ");
             builder.append(pronunciationSpanned());
         }
+        titleText.setMovementMethod(new LinkMovementMethod());
+        titleText.setText(builder);
 
         if (hasSubtitle() || ReleaseUtil.isPreBetaRelease()) { // TODO: remove 
condition when ready
-            builder.append("\n");
-            builder.append(subtitleSpanned());
+            subtitleText.setMovementMethod(new LinkMovementMethod());
+            subtitleText.setText(subtitleSpanned());
+            subtitleText.setVisibility(VISIBLE);
+        } else {
+            subtitleText.setVisibility(GONE);
         }
-
-        text.setText(builder);
-        text.setMovementMethod(new LinkMovementMethod());
     }
 
     private Spanned pronunciationSpanned() {
-        AudioUrlSpan pronunciationSpan = new AudioUrlSpan(text, avPlayer, 
pronunciationUrl,
+        AudioUrlSpan pronunciationSpan = new AudioUrlSpan(titleText, avPlayer, 
pronunciationUrl,
                 AudioUrlSpan.ALIGN_BASELINE);
         pronunciationSpan.setTint(getColor(getThemedAttributeId(getContext(),
                 R.attr.window_inverse_color)));
@@ -278,10 +299,9 @@
                 0,
                 description.length(),
                 Spannable.SPAN_INCLUSIVE_EXCLUSIVE,
-                new 
AbsoluteSizeSpan(getDimensionPixelSize(R.dimen.descriptionTextSize), false),
                 new LeadingSpan(leadingScalar),
                 new ParagraphSpan(paragraphScalar),
-                descriptionClickSpan,
+                TextUtils.isEmpty(subtitle) ? descriptionClickSpan : new 
ForegroundColorSpan(getColor(R.color.foundation_gray)),
                 TextUtils.isEmpty(subtitle) ? new StyleSpan(Typeface.ITALIC) : 
null);
     }
 
@@ -292,18 +312,24 @@
     }
 
     private void setTextHeightConstrained() {
-        LinearLayout.LayoutParams params = new 
LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f);
-        text.setLayoutParams(params);
+        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) 
titleText.getLayoutParams();
+        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
+        params.height = 0;
+        params.weight = 1f;
+        titleText.setLayoutParams(params);
     }
 
     private void setTextHeightUnconstrained() {
-        LinearLayout.LayoutParams params = new 
LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
ViewGroup.LayoutParams.WRAP_CONTENT);
-        text.setLayoutParams(params);
+        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) 
titleText.getLayoutParams();
+        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
+        params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
+        titleText.setLayoutParams(params);
     }
 
     private void init() {
         inflate(getContext(), R.layout.view_article_header, this);
         ButterKnife.bind(this);
+        FeedbackUtil.setToolbarButtonLongPressToast(editPencil);
         hide();
     }
 
@@ -359,4 +385,24 @@
             audioSpan.toggle();
         }
     }
+
+    private class EditMenuClickListener implements 
PopupMenu.OnMenuItemClickListener {
+        @Override
+        public boolean onMenuItemClick(MenuItem item) {
+            switch (item.getItemId()) {
+                case R.id.menu_article_header_edit_description:
+                    if (callback != null) {
+                        callback.onEditDescription();
+                    }
+                    return true;
+                case R.id.menu_article_header_edit_lead_section:
+                    if (callback != null) {
+                        callback.onEditLeadSection();
+                    }
+                    return true;
+                default:
+                    return false;
+            }
+        }
+    }
 }
\ No newline at end of file
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 61ab8ac..cf36120 100755
--- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
+++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
@@ -11,7 +11,6 @@
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 
-import org.apache.commons.lang3.StringUtils;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.wikipedia.Constants;
@@ -192,18 +191,7 @@
      * @param description WikiData description to be shown.
      */
     private void layoutWikiDataDescription(@Nullable final String description) 
{
-        if (TextUtils.isEmpty(description)) {
-            articleHeaderView.setSubtitle(null);
-        } else {
-            int titleLineCount = articleHeaderView.getLineCount();
-
-            articleHeaderView.setSubtitle(StringUtils.capitalize(description));
-
-            // Only show the description if it's two lines or less.
-            if ((articleHeaderView.getLineCount() - titleLineCount) > 2) {
-                articleHeaderView.setSubtitle(null);
-            }
-        }
+        articleHeaderView.setSubtitle(description);
     }
 
     /**
@@ -262,6 +250,16 @@
                     
parentFragment.startActivity(DescriptionEditActivity.newIntent(getActivity(), 
getTitle()));
                 }
             }
+
+            @Override
+            public void onEditDescription() {
+                
parentFragment.startActivity(DescriptionEditActivity.newIntent(getActivity(), 
getTitle()));
+            }
+
+            @Override
+            public void onEditLeadSection() {
+                parentFragment.getEditHandler().startEditingSection(0, null);
+            }
         });
     }
 
diff --git a/app/src/main/res/layout/view_article_header.xml 
b/app/src/main/res/layout/view_article_header.xml
index 3cf4e8c..250b7a7 100644
--- a/app/src/main/res/layout/view_article_header.xml
+++ b/app/src/main/res/layout/view_article_header.xml
@@ -1,12 +1,12 @@
 <merge
     xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";
     xmlns:tools="http://schemas.android.com/tools";>
 
     <LinearLayout
         android:id="@+id/view_article_header_container"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:gravity="bottom"
         android:orientation="vertical">
 
         <org.wikipedia.views.StatusBarBlankView
@@ -21,29 +21,59 @@
 
         <org.wikipedia.views.AppTextView
             style="@style/RtlAwareTextView"
-            android:id="@+id/view_article_header_text"
+            android:id="@+id/view_article_title_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:paddingTop="12dp"
-            android:paddingRight="@dimen/activity_horizontal_margin"
-            android:paddingBottom="16dp"
-            android:paddingLeft="@dimen/activity_horizontal_margin"
-            android:gravity="bottom"
+            android:layout_marginRight="@dimen/activity_horizontal_margin"
+            android:layout_marginLeft="@dimen/activity_horizontal_margin"
             android:textSize="@dimen/titleTextSize"
             android:lineSpacingMultiplier="@dimen/lead_title_leading_scalar"
-            android:maxLines="5"
+            android:maxLines="3"
             android:ellipsize="end"
+            android:textColorHighlight="?attr/window_background_color"
+            tools:text="Title" />
+
+        <org.wikipedia.views.AppTextView
+            style="@style/RtlAwareTextView"
+            android:id="@+id/view_article_subtitle_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="@dimen/activity_horizontal_margin"
+            android:layout_marginLeft="@dimen/activity_horizontal_margin"
+            android:paddingTop="4dp"
+            android:paddingEnd="40dp"
+            android:paddingRight="40dp"
+            android:textSize="@dimen/descriptionTextSize"
+            android:lineSpacingMultiplier="@dimen/lead_subtitle_leading_scalar"
+            android:maxLines="2"
+            android:ellipsize="end"
+            android:textColor="@color/foundation_gray"
             android:textColorLink="@color/foundation_gray"
             android:textColorHighlight="?attr/window_background_color"
-            tools:text="Title\nSubtitle" />
+            tools:text="Subtitle" />
 
         <View
             android:id="@+id/view_article_header_divider"
             android:layout_width="53.5dp"
             android:layout_height="1dp"
+            android:layout_marginTop="20dp"
             android:layout_marginLeft="@dimen/activity_horizontal_margin"
             android:layout_marginRight="@dimen/activity_horizontal_margin"
             android:background="@color/foundation_gray"/>
     </LinearLayout>
 
+    <ImageView
+        android:id="@+id/view_article_header_edit_pencil"
+        android:layout_width="28dp"
+        android:layout_height="28dp"
+        android:layout_marginLeft="@dimen/activity_horizontal_margin"
+        android:layout_marginRight="@dimen/activity_horizontal_margin"
+        android:layout_gravity="bottom|end"
+        app:srcCompat="@drawable/ic_mode_edit_white_24dp"
+        android:scaleType="fitCenter"
+        android:tint="@color/dark_gray"
+        android:background="?attr/selectableItemBackgroundBorderless"
+        android:contentDescription="@string/article_header_edit_hint" />
+
 </merge>
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_article_header_edit.xml 
b/app/src/main/res/menu/menu_article_header_edit.xml
new file mode 100644
index 0000000..6dc1be0
--- /dev/null
+++ b/app/src/main/res/menu/menu_article_header_edit.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android";>
+    <item android:id="@+id/menu_article_header_edit_description"
+        android:title="@string/article_header_edit_description" />
+    <item android:id="@+id/menu_article_header_edit_lead_section"
+        android:title="@string/article_header_edit_lead_section" />
+</menu>
\ No newline at end of file
diff --git a/app/src/main/res/values-qq/strings.xml 
b/app/src/main/res/values-qq/strings.xml
index 6e7789a..e24e4fe 100644
--- a/app/src/main/res/values-qq/strings.xml
+++ b/app/src/main/res/values-qq/strings.xml
@@ -223,6 +223,9 @@
   <string name="user_logged_in_blocked_from_editing">Message shown in dialog 
box to users who are blocked from editing when they attempt to save an 
edit</string>
   <string name="user_anon_blocked_from_editing">Message shown in dialog box to 
users who are blocked from editing based on their IP address</string>
   <string name="edit_how_page_improved">Question that asks the user how they 
improved the article after editing</string>
+  <string name="article_header_edit_hint">Button hint for editing either the 
lead section or the description of the article.</string>
+  <string name="article_header_edit_description">Menu label for editing the 
description of the article.</string>
+  <string name="article_header_edit_lead_section">Menu label for editing the 
first section of the article.</string>
   <string name="edit_next">Button text to go \"next\" after the editing screen 
to the preview screen.
 {{Identical|Next}}</string>
   <string name="edit_done">Button text to finish editing and save the changes.
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index 13265a1..1b1414e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -256,6 +256,9 @@
     <string name="article_menu_bar_bookmark">Add this article to a reading 
list</string>
     <string name="article_menu_bar_share">Share the article link</string>
     <string name="article_menu_bar_navigate">Navigate to the location of the 
article</string>
+    <string name="article_header_edit_hint">Edit…</string>
+    <string name="article_header_edit_description">Edit title 
description</string>
+    <string name="article_header_edit_lead_section">Edit introduction</string>
     <!-- /Article menu bar -->
 
     <!-- Reading lists -->
diff --git a/www/js/sections.js b/www/js/sections.js
index 6704d44..5afa917 100644
--- a/www/js/sections.js
+++ b/www/js/sections.js
@@ -75,8 +75,6 @@
     issuesContainer.id = "issues_container";
     document.getElementById( "content" ).appendChild( issuesContainer );
 
-    var editButton = buildEditSectionButton( payload.section.id );
-
     var content = document.createElement( "div" );
     content.setAttribute( "dir", window.directionality );
     content.innerHTML = payload.section.text;
@@ -122,9 +120,6 @@
             transformer.transform( "widenImages", content ); // offsetWidth
         }
     }
-
-    // insert the edit pencil
-    content.insertBefore( editButton, content.firstChild );
 
     transformer.transform("displayDisambigLink", content);
     transformer.transform("displayIssuesLink", content);

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I6f2fadaeeb0345b208e3f112d3f012e33784dbf9
Gerrit-PatchSet: 3
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <dbr...@wikimedia.org>
Gerrit-Reviewer: BearND <bsitzm...@wikimedia.org>
Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org>
Gerrit-Reviewer: Dbrant <dbr...@wikimedia.org>
Gerrit-Reviewer: Mholloway <mhollo...@wikimedia.org>
Gerrit-Reviewer: Niedzielski <sniedziel...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to