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