package org.wikipedia.dataclient.restbase.page;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.dataclient.page.PageLead;
import org.wikipedia.dataclient.page.PageLeadProperties;
import org.wikipedia.dataclient.page.Protection;
import org.wikipedia.dataclient.restbase.RbServiceError;
import org.wikipedia.login.User;
import org.wikipedia.page.GeoTypeAdapter;
import org.wikipedia.page.Namespace;
import org.wikipedia.page.Page;
import org.wikipedia.page.PageProperties;
import org.wikipedia.page.PageTitle;
import org.wikipedia.page.Section;
import org.wikipedia.util.UriUtil;
import org.wikipedia.util.log.L;
import java.util.Collections;
import java.util.List;
import static org.apache.commons.lang3.StringUtils.defaultString;
/**
* Gson POJO for loading the first stage of page content.
*/
public class RbPageLead implements PageLead, PageLeadProperties {
@SuppressWarnings("unused") private RbServiceError error;
@SuppressWarnings("unused") private int id;
@SuppressWarnings("unused") private long revision;
@SuppressWarnings("unused") @Nullable private String lastmodified;
@SuppressWarnings("unused") @Nullable private String displaytitle;
@SuppressWarnings("unused") @Nullable private String redirected;
@SuppressWarnings("unused") @Nullable private String normalizedtitle;
@SuppressWarnings("unused") @Nullable @SerializedName("wikibase_item") private String wikiBaseItem;
@SuppressWarnings("unused") @Nullable @SerializedName("pronunciation") private TitlePronunciation titlePronunciation;
@SuppressWarnings("unused") @Nullable @JsonAdapter(GeoTypeAdapter.class) private Location geo;
@SuppressWarnings("unused") private int languagecount;
@SuppressWarnings("unused") private boolean editable;
@SuppressWarnings("unused") private boolean mainpage;
@SuppressWarnings("unused") private boolean disambiguation;
@SuppressWarnings("unused") @Nullable private String description;
@SuppressWarnings("unused") @Nullable private Image image;
@SuppressWarnings("unused") @Nullable private Protection protection;
@SuppressWarnings("unused") @Nullable private List<Section> sections;
@Override
public boolean hasError() {
return error != null || sections == null;
}
@Override
@Nullable
public RbServiceError getError() {
return error;
}
@Override
public void logError(String message) {
if (error != null) {
message += ": " + error.toString();
}
L.e(message);
}
/** Note: before using this check that #getMobileview != null */
@Override
public Page toPage(PageTitle title) {
return new Page(adjustPageTitle(title),
getSections(),
toPageProperties(title.getWikiSite()));
}
/* package */ PageTitle adjustPageTitle(PageTitle title) {
if (redirected != null) {
// Handle redirects properly.
title = new PageTitle(redirected, title.getWikiSite(), title.getThumbUrl());
} else if (normalizedtitle != null) {
// We care about the normalized title only if we were not redirected
title = new PageTitle(normalizedtitle, title.getWikiSite(), title.getThumbUrl());
}
title.setDescription(description);
return title;
}
@Override
public String getLeadSectionContent() {
if (sections != null) {
return sections.get(0).getContent();
} else {
return "";
}
}
/** Converter */
public PageProperties toPageProperties(@NonNull WikiSite wiki) {
return new PageProperties(wiki, this);
}
@Override
public int getId() {
return id;
}
@NonNull @Override public Namespace getNamespace(@NonNull WikiSite wiki) {
return guessNamespace(wiki, defaultString(normalizedtitle));
}
@Override
public long getRevision() {
return revision;
}
@Override
@Nullable
public String getLastModified() {
return lastmodified;
}
@Override
@Nullable
public String getTitlePronunciationUrl() {
return titlePronunciation == null
? null
: UriUtil.resolveProtocolRelativeUrl(titlePronunciation.getUrl());
}
@Override
@Nullable
public Location getGeo() {
return geo;
}
@Override
public int getLanguageCount() {
return languagecount;
}
@Override
@Nullable
public String getDisplayTitle() {
return displaytitle;
}
@Override
@Nullable
public String getRedirected() {
return redirected;
}
@Override
@Nullable
public String getNormalizedTitle() {
return normalizedtitle;
}
@Override
@Nullable
public String getWikiBaseItem() {
return wikiBaseItem;
}
@Override
@Nullable
public String getDescription() {
return description;
}
@Override
@Nullable
public String getLeadImageUrl(int leadThumbnailWidth) {
return image != null ? image.getUrl(leadThumbnailWidth) : null;
}
@Override
@Nullable
public String getLeadImageName() {
return image != null ? image.getFile() : null;
}
@Override
@Nullable
public String getFirstAllowedEditorRole() {
return protection != null ? protection.getFirstAllowedEditorRole() : null;
}
@Override
public boolean isEditable() {
return editable || isLoggedInUserAllowedToEdit();
}
private boolean isLoggedInUserAllowedToEdit() {
User user = User.getUser();
return user != null
&& protection != null
&& user.isAllowed(protection.getEditRoles());
}
@Override
public boolean isMainPage() {
return mainpage;
}
@Override
public boolean isDisambiguation() {
return disambiguation;
}
@Override @NonNull public List<Section> getSections() {
return sections == null ? Collections.<Section>emptyList() : sections;
}
// TODO: remove this method and #getNamespace() WikiSite dependency when T135141 is fixed.
@NonNull private Namespace guessNamespace(@NonNull WikiSite wiki, @NonNull String title) {
String[] parts = title.split(":", -1);
String name = parts.length > 1 ? parts[0] : null;
return Namespace.fromLegacyString(wiki, name);
}
/**
* For the lead image File: page name
*/
public static class TitlePronunciation {
@SuppressWarnings("unused,NullableProblems") @NonNull private String url;
@NonNull
public String getUrl() {
return url;
}
}
/**
* For the lead image File: page name
*/
public static class Image {
@SuppressWarnings("unused") private String file;
@SuppressWarnings("unused") private ThumbUrls urls;
public String getFile() {
return file;
}
@Nullable
public String getUrl(int leadImageThumbWidth) {
return urls != null ? urls.get(leadImageThumbWidth) : null;
}
}
/**
* For the lead image URLs
*/
public static class ThumbUrls {
private static final int SMALL = 640;
private static final int MEDIUM = 800;
private static final int LARGE = 1024;
@SuppressWarnings("unused") @SerializedName("640") private String small;
@SuppressWarnings("unused") @SerializedName("800") private String medium;
@SuppressWarnings("unused") @SerializedName("1024") private String large;
@Nullable
public String get(int leadImageThumbWidth) {
switch (leadImageThumbWidth) {
case SMALL:
return small;
case MEDIUM:
return medium;
case LARGE:
return large;
default:
return null;
}
}
}
}