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

Reply via email to