Niedzielski has uploaded a new change for review. https://gerrit.wikimedia.org/r/252367
Change subject: Add article title pronunciations ...................................................................... Add article title pronunciations * Unpack the article title pronunciation URL from the lead Content Service response and allow it to be played. * Fix a bug where the lead subtitle was not cleared when transitioning from an article with a displayable subtitle to one without. Bug: T114524 Change-Id: Icf96e6f0d92f55f28dca8793aa6d17cdf3bc851a --- M app/src/main/java/org/wikipedia/media/AvPlayerImplementation.java M app/src/main/java/org/wikipedia/media/MediaPlayerImplementation.java M app/src/main/java/org/wikipedia/page/Page.java M app/src/main/java/org/wikipedia/page/PageProperties.java M app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java M app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java M app/src/main/java/org/wikipedia/server/PageLead.java M app/src/main/java/org/wikipedia/server/PageLeadProperties.java M app/src/main/java/org/wikipedia/server/mwapi/MwPageLead.java M app/src/main/java/org/wikipedia/server/restbase/RbPageCombo.java M app/src/main/java/org/wikipedia/server/restbase/RbPageLead.java M app/src/main/java/org/wikipedia/views/ArticleHeaderView.java 12 files changed, 83 insertions(+), 20 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/67/252367/1 diff --git a/app/src/main/java/org/wikipedia/media/AvPlayerImplementation.java b/app/src/main/java/org/wikipedia/media/AvPlayerImplementation.java index 8348d7d..dce958e 100644 --- a/app/src/main/java/org/wikipedia/media/AvPlayerImplementation.java +++ b/app/src/main/java/org/wikipedia/media/AvPlayerImplementation.java @@ -3,12 +3,23 @@ import android.support.annotation.NonNull; interface AvPlayerImplementation { + // May be called when initialized. void deinit(); + + // May only be called when deinitialized. void init(); + + // May be called when initialized. void load(@NonNull String path, @NonNull AvPlayer.Callback callback, @NonNull AvPlayer.ErrorCallback errorCallback); + + // May be called when playing or paused. void stop(); + + // May be called when loaded and not playing. void play(@NonNull AvPlayer.Callback callback, @NonNull AvPlayer.ErrorCallback errorCallback); + + // May be called when playing. void pause(); -} \ No newline at end of file +} diff --git a/app/src/main/java/org/wikipedia/media/MediaPlayerImplementation.java b/app/src/main/java/org/wikipedia/media/MediaPlayerImplementation.java index 670e906..d5bd274 100644 --- a/app/src/main/java/org/wikipedia/media/MediaPlayerImplementation.java +++ b/app/src/main/java/org/wikipedia/media/MediaPlayerImplementation.java @@ -9,7 +9,6 @@ public class MediaPlayerImplementation implements AvPlayerImplementation { private static final boolean VERBOSE = false; - private boolean paused; @NonNull private final MediaPlayer player = new MediaPlayer(); @@ -23,10 +22,6 @@ @Override public void init() { - if (VERBOSE) { - L.v("Resetting"); - } - player.reset(); } @Override @@ -44,10 +39,9 @@ } // Do not call MediaPlayer.stop(). This requires going through the whole lifecycle again. - if (!paused) { - pause(); - } + // Also, seek triggers playback, so call before pausing. player.seekTo(0); + pause(); } @Override @@ -62,7 +56,6 @@ if (VERBOSE) { L.v("Pausing"); } - paused = true; player.pause(); } @@ -70,9 +63,9 @@ @NonNull MediaPlayer.OnPreparedListener listener, @NonNull MediaPlayer.OnErrorListener errorListener) { if (VERBOSE) { - L.v("Loading"); + L.v("Loading path=" + path); } - paused = false; + player.reset(); player.setOnPreparedListener(listener); player.setOnErrorListener(errorListener); if (setDataSource(path)) { @@ -87,7 +80,6 @@ if (VERBOSE) { L.v("Playing"); } - paused = false; player.setOnCompletionListener(listener); player.setOnErrorListener(errorListener); player.start(); diff --git a/app/src/main/java/org/wikipedia/page/Page.java b/app/src/main/java/org/wikipedia/page/Page.java index abf31f3..7188062 100755 --- a/app/src/main/java/org/wikipedia/page/Page.java +++ b/app/src/main/java/org/wikipedia/page/Page.java @@ -1,5 +1,7 @@ package org.wikipedia.page; +import android.support.annotation.Nullable; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -56,6 +58,11 @@ return pageProperties.getDisplayTitle(); } + @Nullable + public String getTitlePronunciationUrl() { + return getPageProperties().getTitlePronunciationUrl(); + } + public PageProperties getPageProperties() { return pageProperties; } diff --git a/app/src/main/java/org/wikipedia/page/PageProperties.java b/app/src/main/java/org/wikipedia/page/PageProperties.java index a8407cc..7db6470 100644 --- a/app/src/main/java/org/wikipedia/page/PageProperties.java +++ b/app/src/main/java/org/wikipedia/page/PageProperties.java @@ -19,6 +19,8 @@ * Immutable class that contains metadata associated with a PageTitle. */ public class PageProperties implements Parcelable { + private static final String JSON_NAME_TITLE_PRONUNCIATION_URL = "titlePronunciationUrl"; + private final int pageId; private final long revisionId; private final Date lastModified; @@ -28,8 +30,9 @@ private final boolean isMainPage; private final boolean isDisambiguationPage; /** Nullable URL with no scheme. For example, foo.bar.com/ instead of http://foo.bar.com/. */ - private final String leadImageUrl; + @Nullable private final String leadImageUrl; private final String leadImageName; + @Nullable private final String titlePronunciationUrl; /** * True if the user who first requested this page can edit this page @@ -45,6 +48,7 @@ pageId = core.getId(); revisionId = core.getRevision(); displayTitleText = StringUtil.emptyIfNull(core.getDisplayTitle()); + titlePronunciationUrl = core.getTitlePronunciationUrl(); editProtectionStatus = core.getFirstAllowedEditorRole(); languageCount = core.getLanguageCount(); leadImageUrl = core.getLeadImageUrl(); @@ -74,6 +78,7 @@ pageId = json.optInt("id"); revisionId = json.optLong("revision"); displayTitleText = json.optString("displaytitle"); + titlePronunciationUrl = json.optString(JSON_NAME_TITLE_PRONUNCIATION_URL, null); // Mediawiki API is stupid! if (!(json.opt("protection") instanceof JSONArray) && json.optJSONObject("protection") != null @@ -124,6 +129,11 @@ return displayTitleText; } + @Nullable + public String getTitlePronunciationUrl() { + return titlePronunciationUrl; + } + public String getEditProtectionStatus() { return editProtectionStatus; } @@ -168,6 +178,7 @@ parcel.writeLong(revisionId); parcel.writeLong(lastModified.getTime()); parcel.writeString(displayTitleText); + parcel.writeString(titlePronunciationUrl); parcel.writeString(editProtectionStatus); parcel.writeInt(languageCount); parcel.writeInt(canEdit ? 1 : 0); @@ -182,6 +193,7 @@ revisionId = in.readLong(); lastModified = new Date(in.readLong()); displayTitleText = in.readString(); + titlePronunciationUrl = in.readString(); editProtectionStatus = in.readString(); languageCount = in.readInt(); canEdit = in.readInt() == 1; @@ -217,6 +229,7 @@ && revisionId == that.revisionId && lastModified.equals(that.lastModified) && displayTitleText.equals(that.displayTitleText) + && TextUtils.equals(titlePronunciationUrl, that.titlePronunciationUrl) && languageCount == that.languageCount && canEdit == that.canEdit && isMainPage == that.isMainPage @@ -230,6 +243,7 @@ public int hashCode() { int result = lastModified.hashCode(); result = 31 * result + displayTitleText.hashCode(); + result = 31 * result + (titlePronunciationUrl != null ? titlePronunciationUrl.hashCode() : 0); result = 31 * result + (editProtectionStatus != null ? editProtectionStatus.hashCode() : 0); result = 31 * result + languageCount; result = 31 * result + (isMainPage ? 1 : 0); @@ -255,6 +269,7 @@ json.put("lastmodified", WikipediaApp.getInstance().getSimpleDateFormat() .format(getLastModified())); json.put("displaytitle", displayTitleText); + json.put(JSON_NAME_TITLE_PRONUNCIATION_URL, titlePronunciationUrl); if (editProtectionStatus == null) { json.put("protection", new JSONArray()); } else { 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 0c2f85d..377b5a7 100755 --- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java +++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java @@ -185,6 +185,7 @@ // set the page title text, and honor any HTML formatting in the title articleHeaderView.setTitle(Html.fromHtml(getPage().getDisplayTitle())); articleHeaderView.setLocale(getPage().getTitle().getSite().getLanguageCode()); + articleHeaderView.setPronunciation(getPage().getTitlePronunciationUrl()); // Set the subtitle, too, so text measurements are accurate. layoutWikiDataDescription(getTitle().getDescription()); @@ -314,7 +315,9 @@ * @param description WikiData description to be shown. */ private void layoutWikiDataDescription(@Nullable final String description) { - if (!TextUtils.isEmpty(description)) { + if (TextUtils.isEmpty(description)) { + articleHeaderView.setSubtitle(null); + } else { int titleLineCount = articleHeaderView.getLineCount(); articleHeaderView.setSubtitle(description); diff --git a/app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java b/app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java index 21a84a9..b7ec392 100644 --- a/app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java +++ b/app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java @@ -30,8 +30,11 @@ @NonNull private final String path; - public AudioUrlSpan(@NonNull View view, @NonNull AvPlayer player, @NonNull String path) { - super(view, drawable(view.getContext())); + public AudioUrlSpan(@NonNull View view, + @NonNull AvPlayer player, + @NonNull String path, + int verticalAlignment) { + super(view, drawable(view.getContext()), verticalAlignment); this.player = player; this.path = path; } diff --git a/app/src/main/java/org/wikipedia/server/PageLead.java b/app/src/main/java/org/wikipedia/server/PageLead.java index 18cb045..965efa6 100644 --- a/app/src/main/java/org/wikipedia/server/PageLead.java +++ b/app/src/main/java/org/wikipedia/server/PageLead.java @@ -1,5 +1,7 @@ package org.wikipedia.server; +import android.support.annotation.Nullable; + import org.wikipedia.page.Page; import org.wikipedia.page.PageTitle; @@ -22,6 +24,9 @@ String getLeadSectionContent(); + @Nullable + String getTitlePronunciationUrl(); + /** So we can have polymorphic Retrofit Callbacks */ interface Callback { void success(PageLead pageLead, Response response); diff --git a/app/src/main/java/org/wikipedia/server/PageLeadProperties.java b/app/src/main/java/org/wikipedia/server/PageLeadProperties.java index a31f12c..eaf5351 100644 --- a/app/src/main/java/org/wikipedia/server/PageLeadProperties.java +++ b/app/src/main/java/org/wikipedia/server/PageLeadProperties.java @@ -25,6 +25,9 @@ String getDisplayTitle(); @Nullable + String getTitlePronunciationUrl(); + + @Nullable String getRedirected(); @Nullable diff --git a/app/src/main/java/org/wikipedia/server/mwapi/MwPageLead.java b/app/src/main/java/org/wikipedia/server/mwapi/MwPageLead.java index 04d55b8..45616be 100644 --- a/app/src/main/java/org/wikipedia/server/mwapi/MwPageLead.java +++ b/app/src/main/java/org/wikipedia/server/mwapi/MwPageLead.java @@ -79,6 +79,12 @@ } } + @Nullable + @Override + public String getTitlePronunciationUrl() { + return null; + } + @VisibleForTesting public Mobileview getMobileview() { return mobileview; @@ -133,6 +139,12 @@ } @Nullable + @Override + public String getTitlePronunciationUrl() { + return null; + } + + @Nullable public String getRedirected() { return redirected; } diff --git a/app/src/main/java/org/wikipedia/server/restbase/RbPageCombo.java b/app/src/main/java/org/wikipedia/server/restbase/RbPageCombo.java index b19f2cf..0c10dd7 100644 --- a/app/src/main/java/org/wikipedia/server/restbase/RbPageCombo.java +++ b/app/src/main/java/org/wikipedia/server/restbase/RbPageCombo.java @@ -59,6 +59,12 @@ return lead != null ? lead.getLeadSectionContent() : ""; } + @Override + @Nullable + public String getTitlePronunciationUrl() { + return lead == null ? null : lead.getTitlePronunciationUrl(); + } + /** Converter */ public PageProperties toPageProperties() { return new PageProperties(lead); diff --git a/app/src/main/java/org/wikipedia/server/restbase/RbPageLead.java b/app/src/main/java/org/wikipedia/server/restbase/RbPageLead.java index 69e70fa..6de234e 100644 --- a/app/src/main/java/org/wikipedia/server/restbase/RbPageLead.java +++ b/app/src/main/java/org/wikipedia/server/restbase/RbPageLead.java @@ -35,6 +35,7 @@ @Expose @Nullable private String redirected; @Expose @Nullable private String normalizedtitle; @Expose @Nullable private String extract; + @Expose @Nullable @SerializedName("pronunciation") private String titlePronunciationUrl; @Expose private int languagecount; @Expose private boolean editable; @Expose private boolean mainpage; @@ -114,6 +115,12 @@ return extract; } + @Override + @Nullable + public String getTitlePronunciationUrl() { + return titlePronunciationUrl; + } + public int getLanguageCount() { return languagecount; } @@ -173,7 +180,6 @@ public void setLeadImageThumbWidth(int leadImageThumbWidth) { this.leadImageThumbWidth = leadImageThumbWidth; } - /** * For the lead image File: page name @@ -289,4 +295,4 @@ } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java index c898cc9..d65bff5 100644 --- a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java +++ b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java @@ -229,7 +229,7 @@ } private Spanned pronunciationSpanned() { - AudioUrlSpan span = new AudioUrlSpan(text, avPlayer, pronunciationUrl); + AudioUrlSpan span = new AudioUrlSpan(text, avPlayer, pronunciationUrl, AudioUrlSpan.ALIGN_BASELINE); span.setTint(hasImage() ? Color.WHITE : getContrastingThemeColor()); return RichTextUtil.setSpans(new SpannableString(" "), 0, -- To view, visit https://gerrit.wikimedia.org/r/252367 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Icf96e6f0d92f55f28dca8793aa6d17cdf3bc851a 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