package org.wikipedia.dataclient.mwapi.page;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import com.google.gson.annotations.SerializedName;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.dataclient.mwapi.MwServiceError;
import org.wikipedia.dataclient.page.PageLead;
import org.wikipedia.dataclient.page.PageLeadProperties;
import org.wikipedia.dataclient.page.Protection;
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.log.L;
import java.util.Collections;
import java.util.List;
/**
* Gson POJO for loading the first stage of page content.
*/
public class MwMobileViewPageLead implements PageLead {
@SuppressWarnings("unused") private MwServiceError error;
@SuppressWarnings("unused") private Mobileview mobileview;
@Override
public boolean hasError() {
// if mobileview is not set something went terribly wrong
return error != null || mobileview == null;
}
@Override
@Nullable
public MwServiceError 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(@NonNull PageTitle title) {
return new Page(adjustPageTitle(title),
mobileview.getSections(),
mobileview.toPageProperties(title.getWikiSite()));
}
private PageTitle adjustPageTitle(@NonNull PageTitle title) {
if (mobileview.getRedirected() != null) {
// Handle redirects properly.
title = new PageTitle(mobileview.getRedirected(), title.getWikiSite(),
title.getThumbUrl());
} else if (mobileview.getNormalizedTitle() != null) {
// We care about the normalized title only if we were not redirected
title = new PageTitle(mobileview.getNormalizedTitle(), title.getWikiSite(),
title.getThumbUrl());
}
title.setDescription(mobileview.getDescription());
return title;
}
@Override
public String getLeadSectionContent() {
if (mobileview != null) {
return mobileview.getSections().get(0).getContent();
}
return "";
}
@Nullable
@Override
public String getTitlePronunciationUrl() {
return null;
}
@Nullable @Override public String getLeadImageUrl(int leadThumbnailWidth) {
return mobileview == null ? null : mobileview.getLeadImageUrl(leadThumbnailWidth);
}
@Nullable
@Override
public Location getGeo() {
return null;
}
@VisibleForTesting
public Mobileview getMobileview() {
return mobileview;
}
/**
* Almost everything is in this inner class.
*/
public static class Mobileview implements PageLeadProperties {
@SuppressWarnings("unused") private int id;
@SuppressWarnings("unused") private int namespace;
@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") 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 Thumb thumb;
@SuppressWarnings("unused") @Nullable private Protection protection;
@SuppressWarnings("unused") @Nullable private List<Section> sections;
@SuppressWarnings("unused") @Nullable private PageProps pageprops;
/** Converter */
public PageProperties toPageProperties(@NonNull WikiSite wiki) {
return new PageProperties(wiki, this);
}
@Override
public int getId() {
return id;
}
@Override @NonNull public Namespace getNamespace(@NonNull WikiSite wiki) {
return Namespace.of(namespace);
}
@Override
public long getRevision() {
return revision;
}
@Override
@Nullable
public String getLastModified() {
return lastmodified;
}
@Override
public int getLanguageCount() {
return languagecount;
}
@Override
@Nullable
public String getDisplayTitle() {
return displaytitle;
}
@Override
@Nullable
public String getTitlePronunciationUrl() {
return null;
}
@Override
@Nullable
public Location getGeo() {
return null;
}
@Override
@Nullable
public String getRedirected() {
return redirected;
}
@Override
@Nullable
public String getNormalizedTitle() {
return normalizedtitle;
}
@Override
@Nullable
public String getDescription() {
return description;
}
@Override
@Nullable
public String getLeadImageUrl(int leadThumbnailWidth) {
return thumb != null ? thumb.getUrl() : null;
}
@Override
@Nullable
public String getLeadImageName() {
return image != null ? image.getFile() : null;
}
@Override
@Nullable
public String getWikiBaseItem() {
return pageprops != null && pageprops.getWikiBaseItem() != null ? pageprops.getWikiBaseItem() : null;
}
@Override
@Nullable
public String getFirstAllowedEditorRole() {
return protection != null ? protection.getFirstAllowedEditorRole() : null;
}
@Override
public boolean isEditable() {
return editable;
}
@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;
}
}
/**
* For the lead image File: page name
*/
public static class Image {
@SuppressWarnings("unused") private String file;
public String getFile() {
return file;
}
}
/**
* For the lead image URL
*/
public static class Thumb {
@SuppressWarnings("unused") private String url;
public String getUrl() {
return url;
}
}
static class PageProps {
@SuppressWarnings("unused") @SerializedName("wikibase_item") @Nullable
private String wikiBaseItem;
@Nullable String getWikiBaseItem() {
return wikiBaseItem;
}
}
}