jenkins-bot has submitted this change and it was merged.
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.
Depends: Ie8bcd2fbd1d649d5f2c402662398244b42dde061
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/richtext/DrawableSpan.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
13 files changed, 129 insertions(+), 21 deletions(-)
Approvals:
Dbrant: Looks good to me, approved
jenkins-bot: Verified
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 4d23b31..dcfbb5e 100755
--- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
+++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
@@ -183,6 +183,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());
@@ -310,7 +311,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/richtext/DrawableSpan.java
b/app/src/main/java/org/wikipedia/richtext/DrawableSpan.java
index 9fc8ac1..206fa71 100644
--- a/app/src/main/java/org/wikipedia/richtext/DrawableSpan.java
+++ b/app/src/main/java/org/wikipedia/richtext/DrawableSpan.java
@@ -2,6 +2,8 @@
import android.content.Context;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.annotation.DrawableRes;
@@ -70,6 +72,36 @@
return drawable;
}
+ // Make vertical alignment consistent across APIs. See
https://code.google.com/p/android/issues/detail?id=21397
+ @Override
+ @SuppressWarnings("checkstyle:parameternumber")
+ public void draw(Canvas canvas,
+ CharSequence text,
+ int start,
+ int end,
+ float x,
+ int top,
+ int y,
+ int bottom, Paint paint) {
+ if (drawable == null) {
+ return;
+ }
+
+ canvas.save();
+
+ int transY;
+ if (mVerticalAlignment == ALIGN_BOTTOM) {
+ transY = bottom;
+ } else {
+ transY = y;
+ }
+ transY -= drawable.getBounds().bottom;
+
+ canvas.translate(x, transY);
+ drawable.draw(canvas);
+ canvas.restore();
+ }
+
public void setDrawable(@Nullable Drawable drawable) {
this.drawable = drawable;
}
@@ -92,4 +124,4 @@
setIntrinsicBounds();
}
-}
\ No newline at end of file
+}
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..7af8400 100644
--- a/app/src/main/java/org/wikipedia/server/restbase/RbPageLead.java
+++ b/app/src/main/java/org/wikipedia/server/restbase/RbPageLead.java
@@ -16,6 +16,7 @@
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.lang.reflect.Type;
@@ -35,6 +36,7 @@
@Expose @Nullable private String redirected;
@Expose @Nullable private String normalizedtitle;
@Expose @Nullable private String extract;
+ @Expose @Nullable @SerializedName("pronunciation") private
TitlePronunciation titlePronunciation;
@Expose private int languagecount;
@Expose private boolean editable;
@Expose private boolean mainpage;
@@ -114,6 +116,12 @@
return extract;
}
+ @Override
+ @Nullable
+ public String getTitlePronunciationUrl() {
+ return titlePronunciation == null ? null : titlePronunciation.getUrl();
+ }
+
public int getLanguageCount() {
return languagecount;
}
@@ -174,6 +182,17 @@
this.leadImageThumbWidth = leadImageThumbWidth;
}
+ /**
+ * For the lead image File: page name
+ */
+ public static class TitlePronunciation {
+ @Expose @NonNull private String url;
+
+ @NonNull
+ public String getUrl() {
+ return url;
+ }
+ }
/**
* For the lead image File: page name
@@ -191,7 +210,6 @@
return urls != null ? urls.get(leadImageThumbWidth) : null;
}
}
-
/**
* For the lead image URLs
@@ -289,4 +307,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 692f747..9dc48eb 100644
--- a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java
+++ b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java
@@ -251,7 +251,8 @@
}
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: merged
Gerrit-Change-Id: Icf96e6f0d92f55f28dca8793aa6d17cdf3bc851a
Gerrit-PatchSet: 4
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[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