Data client simplification / removal (#5507)

* Removed unused code from the data client module

* Move remaining code out of the data-client and remove it
This commit is contained in:
Paul Hawke 2024-02-02 19:26:06 -06:00 committed by GitHub
parent 72a6fd2c90
commit 0c3085257d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
337 changed files with 964 additions and 31321 deletions

View file

@ -16,7 +16,6 @@ if (isRunningOnTravisAndIsNotPRBuild) {
dependencies {
implementation project(':wikimedia-data-client')
// Utils
implementation 'in.yuvi:http.fluent:1.3'
implementation 'com.google.code.gson:gson:2.8.5'

View file

@ -59,7 +59,7 @@ import org.acra.annotation.AcraCore;
import org.acra.annotation.AcraDialog;
import org.acra.annotation.AcraMailSender;
import org.acra.data.StringFormat;
import org.wikipedia.language.AppLanguageLookUpTable;
import fr.free.nrw.commons.language.AppLanguageLookUpTable;
import timber.log.Timber;
@AcraCore(

View file

@ -3,8 +3,7 @@ package fr.free.nrw.commons
import android.os.Parcelable
import fr.free.nrw.commons.location.LatLng
import kotlinx.android.parcel.Parcelize
import org.wikipedia.dataclient.mwapi.MwQueryPage
import org.wikipedia.page.PageTitle
import fr.free.nrw.commons.wikidata.model.page.PageTitle
import java.util.*
@Parcelize

View file

@ -15,7 +15,6 @@ import okhttp3.Response;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import okhttp3.logging.HttpLoggingInterceptor.Level;
import org.wikipedia.dataclient.okhttp.HttpStatusException;
import timber.log.Timber;
public final class OkHttpConnectionFactory {
@ -110,4 +109,30 @@ public final class OkHttpConnectionFactory {
private OkHttpConnectionFactory() {
}
public static class HttpStatusException extends IOException {
private final int code;
private final String url;
public HttpStatusException(@NonNull Response rsp) {
this.code = rsp.code();
this.url = rsp.request().url().uri().toString();
try {
if (rsp.body() != null && rsp.body().contentType() != null
&& rsp.body().contentType().toString().contains("json")) {
}
} catch (Exception e) {
// Log?
}
}
public int code() {
return code;
}
@Override
public String getMessage() {
String str = "Code: " + code + ", URL: " + url;
return str;
}
}
}

View file

@ -20,8 +20,8 @@ import androidx.core.content.ContextCompat;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import java.util.Calendar;
import java.util.Date;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.page.PageTitle;
import fr.free.nrw.commons.wikidata.model.WikiSite;
import fr.free.nrw.commons.wikidata.model.page.PageTitle;
import java.util.Locale;
import java.util.regex.Pattern;

View file

@ -1,6 +1,6 @@
package fr.free.nrw.commons.actions
import org.wikipedia.dataclient.mwapi.MwResponse
import fr.free.nrw.commons.wikidata.mwapi.MwResponse
/**
* Response of the Thanks API.

View file

@ -1,11 +1,11 @@
package fr.free.nrw.commons.actions
import fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX
import fr.free.nrw.commons.wikidata.model.Entities
import fr.free.nrw.commons.wikidata.model.edit.Edit
import io.reactivex.Observable
import io.reactivex.Single
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import org.wikipedia.edit.Edit
import org.wikipedia.wikidata.Entities
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import retrofit2.http.*
/**

View file

@ -30,7 +30,7 @@ import fr.free.nrw.commons.auth.login.LoginResult;
import fr.free.nrw.commons.databinding.ActivityLoginBinding;
import fr.free.nrw.commons.utils.ActivityUtils;
import java.util.Locale;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import fr.free.nrw.commons.auth.login.LoginCallback;
import javax.inject.Inject;

View file

@ -2,7 +2,7 @@ package fr.free.nrw.commons.auth.csrf
import androidx.annotation.VisibleForTesting
import fr.free.nrw.commons.auth.SessionManager
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import fr.free.nrw.commons.auth.login.LoginClient
import fr.free.nrw.commons.auth.login.LoginCallback
import fr.free.nrw.commons.auth.login.LoginFailedException

View file

@ -1,7 +1,7 @@
package fr.free.nrw.commons.auth.csrf
import fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Headers

View file

@ -6,7 +6,7 @@ import fr.free.nrw.commons.auth.login.LoginResult.ResetPasswordResult
import fr.free.nrw.commons.wikidata.WikidataConstants.WIKIPEDIA_URL
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

View file

@ -2,7 +2,7 @@ package fr.free.nrw.commons.auth.login
import fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX
import io.reactivex.Observable
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import retrofit2.Call
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded

View file

@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName
import fr.free.nrw.commons.auth.login.LoginResult.OAuthResult
import fr.free.nrw.commons.auth.login.LoginResult.ResetPasswordResult
import fr.free.nrw.commons.auth.login.LoginResult.Result
import org.wikipedia.dataclient.mwapi.MwServiceError
import fr.free.nrw.commons.wikidata.mwapi.MwServiceError
class LoginResponse {
@SerializedName("error")

View file

@ -12,7 +12,7 @@ import androidx.annotation.Nullable;
import fr.free.nrw.commons.campaigns.models.Campaign;
import fr.free.nrw.commons.theme.BaseActivity;
import org.wikipedia.util.DateUtil;
import fr.free.nrw.commons.utils.DateUtil;
import java.text.ParseException;
import java.util.Date;

View file

@ -1,7 +1,7 @@
package fr.free.nrw.commons.category
import io.reactivex.Single
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import javax.inject.Inject
import javax.inject.Singleton

View file

@ -29,7 +29,7 @@ import fr.free.nrw.commons.media.MediaDetailPagerFragment;
import fr.free.nrw.commons.theme.BaseActivity;
import java.util.ArrayList;
import java.util.List;
import org.wikipedia.page.PageTitle;
import fr.free.nrw.commons.wikidata.model.page.PageTitle;
/**
* This activity displays details of a particular category

View file

@ -2,7 +2,7 @@ package fr.free.nrw.commons.category;
import io.reactivex.Single;
import java.util.Map;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import retrofit2.http.GET;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;

View file

@ -52,7 +52,7 @@ import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import org.wikipedia.dataclient.WikiSite;
import fr.free.nrw.commons.wikidata.model.WikiSite;
/**

View file

@ -2,7 +2,7 @@ package fr.free.nrw.commons.delete;
import android.content.Context;
import org.wikipedia.util.DateUtil;
import fr.free.nrw.commons.utils.DateUtil;
import java.util.Date;
import java.util.Locale;

View file

@ -41,7 +41,6 @@ import java.util.Map;
import java.util.Objects;
import javax.inject.Named;
import javax.inject.Singleton;
import org.wikipedia.AppAdapter;
/**
* The Dependency Provider class for Commons Android.

View file

@ -45,8 +45,8 @@ import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import okhttp3.logging.HttpLoggingInterceptor.Level;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.json.GsonUtil;
import fr.free.nrw.commons.wikidata.model.WikiSite;
import fr.free.nrw.commons.wikidata.GsonUtil;
import timber.log.Timber;
@Module

View file

@ -7,11 +7,11 @@ import fr.free.nrw.commons.upload.depicts.DepictsInterface
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
import fr.free.nrw.commons.upload.structure.depictions.get
import fr.free.nrw.commons.wikidata.WikidataProperties
import fr.free.nrw.commons.wikidata.model.DataValue
import fr.free.nrw.commons.wikidata.model.DepictSearchItem
import fr.free.nrw.commons.wikidata.model.Entities
import fr.free.nrw.commons.wikidata.model.Statement_partial
import io.reactivex.Single
import org.wikipedia.wikidata.DataValue
import org.wikipedia.wikidata.Entities
import org.wikipedia.wikidata.Statement_partial
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton

View file

@ -6,12 +6,12 @@ import fr.free.nrw.commons.upload.structure.depictions.get
import fr.free.nrw.commons.utils.CommonsDateUtil
import fr.free.nrw.commons.utils.MediaDataExtractorUtil
import fr.free.nrw.commons.wikidata.WikidataProperties
import fr.free.nrw.commons.wikidata.model.DataValue
import fr.free.nrw.commons.wikidata.model.Entities
import org.apache.commons.lang3.StringUtils
import org.wikipedia.dataclient.mwapi.MwQueryPage
import org.wikipedia.gallery.ExtMetadata
import org.wikipedia.gallery.ImageInfo
import org.wikipedia.wikidata.DataValue
import org.wikipedia.wikidata.Entities
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage
import fr.free.nrw.commons.wikidata.model.gallery.ExtMetadata
import fr.free.nrw.commons.wikidata.model.gallery.ImageInfo
import java.text.ParseException
import java.util.*
import javax.inject.Inject

View file

@ -1,4 +1,4 @@
package org.wikipedia.language;
package fr.free.nrw.commons.language;
import android.content.Context;
import android.content.res.Resources;
@ -8,8 +8,7 @@ import androidx.annotation.ArrayRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.wikipedia.dataclient.R;
import fr.free.nrw.commons.R;
import java.lang.ref.SoftReference;
import java.util.Arrays;
import java.util.List;

View file

@ -5,10 +5,10 @@ import fr.free.nrw.commons.Media
import fr.free.nrw.commons.category.ContinuationClient
import fr.free.nrw.commons.explore.media.MediaConverter
import fr.free.nrw.commons.utils.CommonsDateUtil
import fr.free.nrw.commons.wikidata.model.Entities
import io.reactivex.Single
import org.wikipedia.dataclient.mwapi.MwQueryPage
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import org.wikipedia.wikidata.Entities
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton

View file

@ -115,9 +115,9 @@ import java.util.regex.Pattern;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import org.wikipedia.dataclient.mwapi.MwQueryPage;
import org.wikipedia.language.AppLanguageLookUpTable;
import org.wikipedia.util.DateUtil;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage;
import fr.free.nrw.commons.language.AppLanguageLookUpTable;
import fr.free.nrw.commons.utils.DateUtil;
import timber.log.Timber;
public class MediaDetailFragment extends CommonsDaggerSupportFragment implements

View file

@ -2,10 +2,10 @@ package fr.free.nrw.commons.media;
import static fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX;
import fr.free.nrw.commons.wikidata.model.Entities;
import io.reactivex.Observable;
import io.reactivex.Single;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import org.wikipedia.wikidata.Entities;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import retrofit2.http.GET;
import retrofit2.http.Query;

View file

@ -2,7 +2,7 @@ package fr.free.nrw.commons.media;
import io.reactivex.Single;
import java.util.Map;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import retrofit2.http.GET;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;

View file

@ -3,7 +3,7 @@ package fr.free.nrw.commons.media;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.wikipedia.dataclient.mwapi.MwResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwResponse;
public class MwParseResponse extends MwResponse {
@Nullable

View file

@ -4,10 +4,10 @@ import fr.free.nrw.commons.BetaConstants
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.category.ContinuationClient
import fr.free.nrw.commons.explore.media.MediaConverter
import fr.free.nrw.commons.wikidata.model.Entities
import io.reactivex.Single
import org.wikipedia.dataclient.mwapi.MwQueryPage
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import org.wikipedia.wikidata.Entities
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import javax.inject.Inject
import javax.inject.Singleton

View file

@ -3,7 +3,7 @@ package fr.free.nrw.commons.media;
import static fr.free.nrw.commons.media.MediaInterface.MEDIA_PARAMS;
import io.reactivex.Single;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import retrofit2.http.GET;
import retrofit2.http.Query;

View file

@ -17,8 +17,8 @@ import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import org.wikipedia.dataclient.mwapi.MwQueryPage;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import timber.log.Timber;
/**

View file

@ -1,10 +1,9 @@
package fr.free.nrw.commons.mwapi;
import org.wikipedia.dataclient.mwapi.MwQueryLogEvent;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import org.wikipedia.dataclient.mwapi.MwQueryResult;
import org.wikipedia.dataclient.mwapi.UserInfo;
import org.wikipedia.util.DateUtil;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResult;
import fr.free.nrw.commons.wikidata.mwapi.UserInfo;
import fr.free.nrw.commons.utils.DateUtil;
import java.util.Collections;
import java.util.Date;
@ -44,16 +43,4 @@ public class UserClient {
}
}).single(false);
}
public Observable<MwQueryLogEvent> logEvents(String user) {
try {
return userInterface.getUserLogEvents(user, Collections.emptyMap())
.map(MwQueryResponse::query)
.map(MwQueryResult::logevents)
.flatMap(Observable::fromIterable);
} catch (Throwable throwable) {
return Observable.empty();
}
}
}

View file

@ -1,6 +1,6 @@
package fr.free.nrw.commons.mwapi;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import java.util.Map;

View file

@ -9,8 +9,8 @@ import fr.free.nrw.commons.bookmarks.BookmarkFragment;
import fr.free.nrw.commons.contributions.ContributionsFragment;
import fr.free.nrw.commons.explore.ExploreFragment;
import fr.free.nrw.commons.nearby.fragments.NearbyParentFragment;
import org.wikipedia.model.EnumCode;
import org.wikipedia.model.EnumCodeMap;
import fr.free.nrw.commons.wikidata.model.EnumCode;
import fr.free.nrw.commons.wikidata.model.EnumCodeMap;
import fr.free.nrw.commons.R;

View file

@ -7,8 +7,8 @@ import androidx.fragment.app.Fragment;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.bookmarks.BookmarkFragment;
import fr.free.nrw.commons.explore.ExploreFragment;
import org.wikipedia.model.EnumCode;
import org.wikipedia.model.EnumCodeMap;
import fr.free.nrw.commons.wikidata.model.EnumCode;
import fr.free.nrw.commons.wikidata.model.EnumCodeMap;
public enum NavTabLoggedOut implements EnumCode {

View file

@ -3,7 +3,7 @@ package fr.free.nrw.commons.notification
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
import fr.free.nrw.commons.notification.models.Notification
import fr.free.nrw.commons.databinding.ItemNotificationBinding
import org.wikipedia.util.StringUtil
import fr.free.nrw.commons.utils.StringUtil
fun notificationDelegate(onNotificationClicked: (Notification) -> Unit) =

View file

@ -6,12 +6,12 @@ import fr.free.nrw.commons.notification.models.NotificationType
import io.reactivex.Observable
import io.reactivex.Single
import fr.free.nrw.commons.auth.csrf.CsrfTokenClient
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import org.wikipedia.util.DateUtil
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import fr.free.nrw.commons.utils.DateUtil
import javax.inject.Inject
import javax.inject.Named
import javax.inject.Singleton
import org.wikipedia.notifications.Notification as WikimediaNotification
import fr.free.nrw.commons.wikidata.model.notifications.Notification as WikimediaNotification
@Singleton
class NotificationClient @Inject constructor(

View file

@ -2,7 +2,7 @@ package fr.free.nrw.commons.notification
import fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX
import io.reactivex.Observable
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.GET

View file

@ -9,7 +9,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import org.wikipedia.dataclient.mwapi.MwQueryPage;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage;
import java.util.ArrayList;
import java.util.concurrent.Callable;

View file

@ -13,7 +13,7 @@ import java.util.Collections;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.commons.lang3.StringUtils;
import org.wikipedia.dataclient.mwapi.MwQueryPage;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryPage;
import timber.log.Timber;
@Singleton

View file

@ -1,6 +1,6 @@
package fr.free.nrw.commons.review;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import io.reactivex.Observable;
import retrofit2.http.GET;

View file

@ -6,7 +6,7 @@ import android.util.AttributeSet;
import androidx.appcompat.widget.AppCompatTextView;
import org.wikipedia.util.StringUtil;
import fr.free.nrw.commons.utils.StringUtil;
/**
* An {@link AppCompatTextView} which formats the text to HTML displayable text and makes any

View file

@ -11,7 +11,7 @@ import fr.free.nrw.commons.R
import fr.free.nrw.commons.databinding.RowItemLanguagesSpinnerBinding
import fr.free.nrw.commons.utils.LangCodeUtils
import org.apache.commons.lang3.StringUtils
import org.wikipedia.language.AppLanguageLookUpTable
import fr.free.nrw.commons.language.AppLanguageLookUpTable
import java.util.*
/**
@ -39,7 +39,8 @@ class LanguagesAdapter constructor(
private var languageNamesList: List<String>
private var languageCodesList: List<String>
var language: AppLanguageLookUpTable = AppLanguageLookUpTable(context)
var language: AppLanguageLookUpTable =
AppLanguageLookUpTable(context)
init {
languageNamesList = language.localizedNames
languageCodesList = language.codes

View file

@ -27,7 +27,7 @@ import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import fr.free.nrw.commons.auth.csrf.CsrfTokenClient;
import org.wikipedia.dataclient.mwapi.MwException;
import fr.free.nrw.commons.wikidata.mwapi.MwException;
import timber.log.Timber;
@Singleton

View file

@ -2,7 +2,6 @@ package fr.free.nrw.commons.upload
import android.os.Parcel
import android.os.Parcelable
import org.wikipedia.gallery.ImageInfo
private const val RESULT_SUCCESS = "Success"

View file

@ -4,8 +4,8 @@ import static fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX;
import androidx.annotation.NonNull;
import io.reactivex.Observable;
import org.wikipedia.dataclient.mwapi.MwPostResponse;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwPostResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;

View file

@ -1,8 +1,8 @@
package fr.free.nrw.commons.upload.depicts;
import fr.free.nrw.commons.wikidata.model.DepictSearchResponse;
import fr.free.nrw.commons.wikidata.model.Entities;
import io.reactivex.Single;
import org.wikipedia.wikidata.Entities;
import retrofit2.http.GET;
import retrofit2.http.Query;

View file

@ -8,10 +8,10 @@ import fr.free.nrw.commons.nearby.Place
import fr.free.nrw.commons.upload.WikidataItem
import fr.free.nrw.commons.wikidata.WikidataProperties
import fr.free.nrw.commons.wikidata.WikidataProperties.*
import fr.free.nrw.commons.wikidata.model.DataValue
import fr.free.nrw.commons.wikidata.model.Entities
import fr.free.nrw.commons.wikidata.model.Statement_partial
import kotlinx.android.parcel.Parcelize
import org.wikipedia.wikidata.DataValue
import org.wikipedia.wikidata.Entities
import org.wikipedia.wikidata.Statement_partial
import java.math.BigInteger
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException

View file

@ -0,0 +1,53 @@
package fr.free.nrw.commons.utils;
import static android.text.format.DateFormat.getBestDateTimePattern;
import androidx.annotation.NonNull;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
public final class DateUtil {
private static Map<String, SimpleDateFormat> DATE_FORMATS = new HashMap<>();
// TODO: Switch to DateTimeFormatter when minSdk = 26.
public static synchronized String iso8601DateFormat(Date date) {
return getCachedDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT, true).format(date);
}
public static synchronized Date iso8601DateParse(String date) throws ParseException {
return getCachedDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT, true).parse(date);
}
public static String getMonthOnlyDateString(@NonNull Date date) {
return getDateStringWithSkeletonPattern(date, "MMMM d");
}
public static String getExtraShortDateString(@NonNull Date date) {
return getDateStringWithSkeletonPattern(date, "MMM d");
}
public static synchronized String getDateStringWithSkeletonPattern(@NonNull Date date, @NonNull String pattern) {
return getCachedDateFormat(getBestDateTimePattern(Locale.getDefault(), pattern), Locale.getDefault(), false).format(date);
}
private static SimpleDateFormat getCachedDateFormat(String pattern, Locale locale, boolean utc) {
if (!DATE_FORMATS.containsKey(pattern)) {
SimpleDateFormat df = new SimpleDateFormat(pattern, locale);
if (utc) {
df.setTimeZone(TimeZone.getTimeZone("UTC"));
}
DATE_FORMATS.put(pattern, df);
}
return DATE_FORMATS.get(pattern);
}
private DateUtil() {
}
}

View file

@ -0,0 +1,38 @@
package fr.free.nrw.commons.utils;
import android.os.Build;
import android.text.Html;
import android.text.Spanned;
import android.text.SpannedString;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public final class StringUtil {
/**
* @param source String that may contain HTML tags.
* @return returned Spanned string that may contain spans parsed from the HTML source.
*/
@NonNull public static Spanned fromHtml(@Nullable String source) {
if (source == null) {
return new SpannedString("");
}
if (!source.contains("<") && !source.contains("&")) {
// If the string doesn't contain any hints of HTML entities, then skip the expensive
// processing that fromHtml() performs.
return new SpannedString(source);
}
source = source.replaceAll("&#8206;", "\u200E")
.replaceAll("&#8207;", "\u200F")
.replaceAll("&amp;", "&");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY);
} else {
//noinspection deprecation
return Html.fromHtml(source);
}
}
private StringUtil() {
}
}

View file

@ -1,7 +1,6 @@
package fr.free.nrw.commons.wikidata
import okhttp3.OkHttpClient
import org.wikipedia.json.GsonUtil
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory

View file

@ -1,13 +1,16 @@
package org.wikipedia.json;
package fr.free.nrw.commons.wikidata;
import android.net.Uri;
import androidx.annotation.VisibleForTesting;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.wikipedia.dataclient.SharedPreferenceCookieManager;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.page.Namespace;
import org.wikipedia.wikidata.DataValue;
import fr.free.nrw.commons.wikidata.json.RequiredFieldsCheckOnReadTypeAdapterFactory;
import fr.free.nrw.commons.wikidata.model.DataValue;
import fr.free.nrw.commons.wikidata.model.WikiSite;
import fr.free.nrw.commons.wikidata.json.NamespaceTypeAdapter;
import fr.free.nrw.commons.wikidata.json.PostProcessingTypeAdapter;
import fr.free.nrw.commons.wikidata.json.UriTypeAdapter;
import fr.free.nrw.commons.wikidata.json.WikiSiteTypeAdapter;
import fr.free.nrw.commons.wikidata.model.page.Namespace;
public final class GsonUtil {
private static final String DATE_FORMAT = "MMM dd, yyyy HH:mm:ss";
@ -18,7 +21,6 @@ public final class GsonUtil {
.registerTypeHierarchyAdapter(Uri.class, new UriTypeAdapter().nullSafe())
.registerTypeHierarchyAdapter(Namespace.class, new NamespaceTypeAdapter().nullSafe())
.registerTypeAdapter(WikiSite.class, new WikiSiteTypeAdapter().nullSafe())
.registerTypeAdapter(SharedPreferenceCookieManager.class, new CookieManagerTypeAdapter().nullSafe())
.registerTypeAdapterFactory(new RequiredFieldsCheckOnReadTypeAdapterFactory())
.registerTypeAdapterFactory(new PostProcessingTypeAdapter());
@ -28,10 +30,5 @@ public final class GsonUtil {
return DEFAULT_GSON;
}
@VisibleForTesting
public static GsonBuilder getDefaultGsonBuilder() {
return DEFAULT_GSON_BUILDER;
}
private GsonUtil() { }
}

View file

@ -10,7 +10,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import fr.free.nrw.commons.auth.csrf.CsrfTokenClient;
import org.wikipedia.dataclient.mwapi.MwPostResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwPostResponse;
import timber.log.Timber;
/**

View file

@ -9,7 +9,7 @@ import javax.inject.Singleton;
import fr.free.nrw.commons.wikidata.model.AddEditTagResponse;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import org.wikipedia.wikidata.Statement_partial;
import fr.free.nrw.commons.wikidata.model.Statement_partial;
@Singleton
public class WikidataClient {

View file

@ -15,6 +15,12 @@ import fr.free.nrw.commons.upload.WikidataItem;
import fr.free.nrw.commons.upload.WikidataPlace;
import fr.free.nrw.commons.utils.ConfigUtils;
import fr.free.nrw.commons.utils.ViewUtil;
import fr.free.nrw.commons.wikidata.model.DataValue;
import fr.free.nrw.commons.wikidata.model.DataValue.ValueString;
import fr.free.nrw.commons.wikidata.model.EditClaim;
import fr.free.nrw.commons.wikidata.model.Snak_partial;
import fr.free.nrw.commons.wikidata.model.Statement_partial;
import fr.free.nrw.commons.wikidata.model.WikiBaseMonolingualTextValue;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
import java.util.ArrayList;
@ -27,13 +33,7 @@ import java.util.UUID;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.wikipedia.dataclient.mwapi.MwPostResponse;
import org.wikipedia.wikidata.DataValue;
import org.wikipedia.wikidata.DataValue.ValueString;
import org.wikipedia.wikidata.EditClaim;
import org.wikipedia.wikidata.Snak_partial;
import org.wikipedia.wikidata.Statement_partial;
import org.wikipedia.wikidata.WikiBaseMonolingualTextValue;
import fr.free.nrw.commons.wikidata.mwapi.MwPostResponse;
import timber.log.Timber;
/**

View file

@ -2,7 +2,7 @@ package fr.free.nrw.commons.wikidata;
import androidx.annotation.NonNull;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse;
import fr.free.nrw.commons.wikidata.model.WbCreateClaimResponse;
import io.reactivex.Observable;

View file

@ -8,7 +8,7 @@ import fr.free.nrw.commons.kvstore.JsonKvStore
import okhttp3.Cookie
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import org.wikipedia.dataclient.WikiSite
import fr.free.nrw.commons.wikidata.model.WikiSite
private const val COOKIE_STORE = "cookie_store"

View file

@ -1,11 +1,11 @@
package org.wikipedia.json;
package fr.free.nrw.commons.wikidata.json;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import org.wikipedia.page.Namespace;
import fr.free.nrw.commons.wikidata.model.page.Namespace;
import java.io.IOException;

View file

@ -1,4 +1,4 @@
package org.wikipedia.json;
package fr.free.nrw.commons.wikidata.json;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;

View file

@ -1,4 +1,4 @@
package org.wikipedia.json;
package fr.free.nrw.commons.wikidata.json;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -12,7 +12,7 @@ import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import org.wikipedia.json.annotations.Required;
import fr.free.nrw.commons.wikidata.json.annotations.Required;
import java.io.IOException;
import java.lang.reflect.Field;
@ -29,7 +29,7 @@ import java.util.Set;
* TODO: Handle null values in lists during deserialization, perhaps with a new @RequiredElements
* annotation and another corresponding TypeAdapter(Factory).
*/
class RequiredFieldsCheckOnReadTypeAdapterFactory implements TypeAdapterFactory {
public class RequiredFieldsCheckOnReadTypeAdapterFactory implements TypeAdapterFactory {
@Nullable @Override public final <T> TypeAdapter<T> create(@NonNull Gson gson, @NonNull TypeToken<T> typeToken) {
Class<?> rawType = typeToken.getRawType();
Set<Field> requiredFields = collectRequiredFields(rawType);

View file

@ -1,4 +1,4 @@
package org.wikipedia.json;
package fr.free.nrw.commons.wikidata.json;
/*
* Copyright (C) 2011 Google Inc.

View file

@ -1,4 +1,4 @@
package org.wikipedia.json;
package fr.free.nrw.commons.wikidata.json;
import android.net.Uri;

View file

@ -1,4 +1,4 @@
package org.wikipedia.json;
package fr.free.nrw.commons.wikidata.json;
import android.net.Uri;
@ -8,7 +8,7 @@ import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import org.wikipedia.dataclient.WikiSite;
import fr.free.nrw.commons.wikidata.model.WikiSite;
import java.io.IOException;

View file

@ -1,4 +1,4 @@
package org.wikipedia.json.annotations;
package fr.free.nrw.commons.wikidata.json.annotations;
import java.lang.annotation.Documented;

View file

@ -1,4 +1,4 @@
package org.wikipedia.model
package fr.free.nrw.commons.wikidata.model
import org.apache.commons.lang3.builder.EqualsBuilder
import org.apache.commons.lang3.builder.HashCodeBuilder

View file

@ -1,6 +1,6 @@
package org.wikipedia.wikidata
package fr.free.nrw.commons.wikidata.model
import org.wikipedia.json.RuntimeTypeAdapterFactory
import fr.free.nrw.commons.wikidata.json.RuntimeTypeAdapterFactory
sealed class DataValue(val type: String) {
companion object {

View file

@ -1,6 +1,4 @@
package org.wikipedia.wikidata
import org.wikipedia.wikidata.DataValue.EntityId
package fr.free.nrw.commons.wikidata.model
data class EditClaim(val claims: List<Statement_partial>) {
@ -16,7 +14,7 @@ data class EditClaim(val claims: List<Statement_partial>) {
Snak_partial(
"value",
propertyName,
EntityId(
DataValue.EntityId(
WikiBaseEntityValue(
"item",
it,

View file

@ -1,4 +1,4 @@
package org.wikipedia.wikidata;
package fr.free.nrw.commons.wikidata.model;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -8,11 +8,10 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.wikipedia.dataclient.mwapi.MwResponse;
import org.wikipedia.json.PostProcessingTypeAdapter;
import fr.free.nrw.commons.wikidata.mwapi.MwResponse;
@SuppressWarnings("unused")
public class Entities extends MwResponse implements PostProcessingTypeAdapter.PostProcessable {
public class Entities extends MwResponse {
@Nullable private Map<String, Entity> entities;
private int success;

View file

@ -1,4 +1,4 @@
package org.wikipedia.model
package fr.free.nrw.commons.wikidata.model
interface EnumCode {
fun code(): Int

View file

@ -1,4 +1,4 @@
package org.wikipedia.model
package fr.free.nrw.commons.wikidata.model
import android.util.SparseArray

View file

@ -1,4 +1,4 @@
package org.wikipedia.wikidata
package fr.free.nrw.commons.wikidata.model
import com.google.gson.annotations.SerializedName

View file

@ -1,4 +1,4 @@
package org.wikipedia.wikidata
package fr.free.nrw.commons.wikidata.model
import com.google.gson.annotations.SerializedName

View file

@ -1,4 +1,4 @@
package org.wikipedia.wikidata
package fr.free.nrw.commons.wikidata.model
import com.google.gson.annotations.SerializedName

View file

@ -1,4 +1,4 @@
package org.wikipedia.wikidata
package fr.free.nrw.commons.wikidata.model
import com.google.gson.annotations.SerializedName

View file

@ -1,4 +1,4 @@
package org.wikipedia.dataclient;
package fr.free.nrw.commons.wikidata.model;
import android.net.Uri;
import android.os.Parcel;
@ -9,9 +9,8 @@ import androidx.annotation.NonNull;
import com.google.gson.annotations.SerializedName;
import org.wikipedia.language.AppLanguageLookUpTable;
import org.wikipedia.page.PageTitle;
import org.wikipedia.util.UriUtil;
import org.apache.commons.lang3.StringUtils;
import fr.free.nrw.commons.language.AppLanguageLookUpTable;
/**
* The base URL and Wikipedia language code for a MediaWiki site. Examples:
@ -38,8 +37,10 @@ import org.wikipedia.util.UriUtil;
* </ul>
*/
public class WikiSite implements Parcelable {
private static String WIKIPEDIA_URL = "https://wikipedia.org/";
public static final String DEFAULT_SCHEME = "https";
private static String DEFAULT_BASE_URL = Service.WIKIPEDIA_URL;
private static String DEFAULT_BASE_URL = WIKIPEDIA_URL;
public static final Parcelable.Creator<WikiSite> CREATOR = new Parcelable.Creator<WikiSite>() {
@Override
@ -57,14 +58,6 @@ public class WikiSite implements Parcelable {
@SerializedName("domain") @NonNull private final Uri uri;
@NonNull private String languageCode;
public static boolean supportedAuthority(@NonNull String authority) {
return authority.endsWith(Uri.parse(DEFAULT_BASE_URL).getAuthority());
}
public static void setDefaultBaseUrl(@NonNull String url) {
DEFAULT_BASE_URL = TextUtils.isEmpty(url) ? Service.WIKIPEDIA_URL : url;
}
public static WikiSite forLanguageCode(@NonNull String languageCode) {
Uri uri = ensureScheme(Uri.parse(DEFAULT_BASE_URL));
return new WikiSite((languageCode.isEmpty()
@ -80,7 +73,7 @@ public class WikiSite implements Parcelable {
// Special case for Wikipedia only: assume English subdomain when none given.
authority = "en.wikipedia.org";
}
String langVariant = UriUtil.getLanguageVariantFromUri(tempUri);
String langVariant = getLanguageVariantFromUri(tempUri);
if (!TextUtils.isEmpty(langVariant)) {
languageCode = langVariant;
} else {
@ -92,6 +85,16 @@ public class WikiSite implements Parcelable {
.build();
}
/** Get language variant code from a Uri, e.g. "zh-*", otherwise returns empty string. */
@NonNull
private String getLanguageVariantFromUri(@NonNull Uri uri) {
if (TextUtils.isEmpty(uri.getPath())) {
return "";
}
String[] parts = StringUtils.split(StringUtils.defaultString(uri.getPath()), '/');
return parts.length > 1 && !parts[0].equals("wiki") ? parts[0] : "";
}
public WikiSite(@NonNull String url) {
this(url.startsWith("http") ? Uri.parse(url) : url.startsWith("//")
? Uri.parse(DEFAULT_SCHEME + ":" + url) : Uri.parse(DEFAULT_SCHEME + "://" + url));
@ -147,15 +150,6 @@ public class WikiSite implements Parcelable {
return String.format("%1$s://%2$s", scheme(), mobileAuthority());
}
/**
* @return The canonical "desktop" form of the authority. For example, if the authority
* is in a "mobile" form, e.g. en.m.wikipedia.org, this will become en.wikipedia.org.
*/
@NonNull
public String desktopAuthority() {
return authority().replace(".m.", ".");
}
@NonNull
public String subdomain() {
return languageCodeToSubdomain(languageCode);
@ -199,37 +193,6 @@ public class WikiSite implements Parcelable {
return languageCode;
}
// TODO: this method doesn't have much to do with WikiSite. Move to PageTitle?
/**
* Create a PageTitle object from an internal link string.
*
* @param internalLink Internal link target text (eg. /wiki/Target).
* Should be URL decoded before passing in
* @return A {@link PageTitle} object representing the internalLink passed in.
*/
public PageTitle titleForInternalLink(String internalLink) {
// Strip the /wiki/ from the href
return new PageTitle(UriUtil.removeInternalLinkPrefix(internalLink), this);
}
// TODO: this method doesn't have much to do with WikiSite. Move to PageTitle?
/**
* Create a PageTitle object from a Uri, taking into account any fragment (section title) in the link.
* @param uri Uri object to be turned into a PageTitle.
* @return {@link PageTitle} object that corresponds to the given Uri.
*/
public PageTitle titleForUri(Uri uri) {
String path = uri.getPath();
if (!TextUtils.isEmpty(uri.getFragment())) {
path += "#" + uri.getFragment();
}
return titleForInternalLink(path);
}
@NonNull public String dbName() {
return subdomain().replaceAll("-", "_") + "wiki";
}
// Auto-generated
@Override
public boolean equals(Object o) {

View file

@ -0,0 +1,36 @@
package fr.free.nrw.commons.wikidata.model.edit;
import androidx.annotation.Nullable;
import fr.free.nrw.commons.wikidata.mwapi.MwPostResponse;
public class Edit extends MwPostResponse {
@Nullable private Result edit;
@Nullable public Result edit() {
return edit;
}
public class Result {
@Nullable private String result;
@Nullable private String code;
@Nullable private String info;
@Nullable private String warning;
public boolean editSucceeded() {
return "Success".equals(result);
}
@Nullable public String code() {
return code;
}
@Nullable public String info() {
return info;
}
@Nullable public String warning() {
return warning;
}
}
}

View file

@ -1,9 +1,8 @@
package org.wikipedia.edit;
package fr.free.nrw.commons.wikidata.model.edit;
import android.os.Parcel;
import android.os.Parcelable;
import org.wikipedia.model.BaseModel;
import fr.free.nrw.commons.wikidata.model.BaseModel;
public abstract class EditResult extends BaseModel implements Parcelable {
private final String result;

View file

@ -1,4 +1,4 @@
package org.wikipedia.gallery;
package fr.free.nrw.commons.wikidata.model.gallery;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -7,7 +7,7 @@ import com.google.gson.annotations.SerializedName;
import org.apache.commons.lang3.StringUtils;
@SuppressWarnings("unused")
public class ExtMetadata {
@SerializedName("DateTime") @Nullable private Values dateTime;
@SerializedName("ObjectName") @Nullable private Values objectName;

View file

@ -1,4 +1,4 @@
package org.wikipedia.gallery;
package fr.free.nrw.commons.wikidata.model.gallery;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -12,7 +12,7 @@ import java.io.Serializable;
/**
* Gson POJO for a standard image info object as returned by the API ImageInfo module
*/
@SuppressWarnings("unused")
public class ImageInfo implements Serializable {
private int size;
private int width;

View file

@ -1,4 +1,4 @@
package org.wikipedia.gallery;
package fr.free.nrw.commons.wikidata.model.gallery;
import androidx.annotation.Nullable;
@ -10,7 +10,7 @@ import java.util.List;
* Gson POJO for a standard video info object as returned by the API VideoInfo module
*/
public class VideoInfo extends ImageInfo {
@SuppressWarnings("unused") @Nullable private List<String> codecs;
@Nullable private List<String> codecs;
@SuppressWarnings("unused,NullableProblems") @Nullable private String name;
@SuppressWarnings("unused,NullableProblems") @Nullable @SerializedName("short_name") private String shortName;
}

View file

@ -0,0 +1,190 @@
package fr.free.nrw.commons.wikidata.model.notifications;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.annotations.SerializedName;
import org.apache.commons.lang3.StringUtils;
import fr.free.nrw.commons.utils.DateUtil;
import fr.free.nrw.commons.wikidata.GsonUtil;
import java.text.ParseException;
import java.util.Date;
import timber.log.Timber;
public class Notification {
@Nullable private String wiki;
private long id;
@Nullable private String type;
@Nullable private String category;
@Nullable private Title title;
@Nullable private Timestamp timestamp;
@SerializedName("*") @Nullable private Contents contents;
@NonNull public String wiki() {
return StringUtils.defaultString(wiki);
}
public long id() {
return id;
}
public void setId(final long id) {
this.id = id;
}
public long key() {
return id + wiki().hashCode();
}
@NonNull public String type() {
return StringUtils.defaultString(type);
}
@Nullable public Title title() {
return title;
}
@Nullable public Contents getContents() {
return contents;
}
public void setContents(@Nullable final Contents contents) {
this.contents = contents;
}
@NonNull public Date getTimestamp() {
return timestamp != null ? timestamp.date() : new Date();
}
public void setTimestamp(@Nullable final Timestamp timestamp) {
this.timestamp = timestamp;
}
@NonNull String getUtcIso8601() {
return StringUtils.defaultString(timestamp != null ? timestamp.utciso8601 : null);
}
public boolean isFromWikidata() {
return wiki().equals("wikidatawiki");
}
@Override public String toString() {
return Long.toString(id);
}
public static class Title {
@Nullable private String full;
@Nullable private String text;
@NonNull public String text() {
return StringUtils.defaultString(text);
}
@NonNull public String full() {
return StringUtils.defaultString(full);
}
}
public static class Timestamp {
@Nullable private String utciso8601;
public void setUtciso8601(@Nullable final String utciso8601) {
this.utciso8601 = utciso8601;
}
public Date date() {
try {
return DateUtil.iso8601DateParse(utciso8601);
} catch (ParseException e) {
Timber.e(e);
return new Date();
}
}
}
public static class Link {
@Nullable private String url;
@Nullable private String label;
@Nullable private String tooltip;
@Nullable private String description;
@Nullable private String icon;
@NonNull public String getUrl() {
return StringUtils.defaultString(url);
}
public void setUrl(@Nullable final String url) {
this.url = url;
}
@NonNull public String getTooltip() {
return StringUtils.defaultString(tooltip);
}
@NonNull public String getLabel() {
return StringUtils.defaultString(label);
}
@NonNull public String getIcon() {
return StringUtils.defaultString(icon);
}
}
public static class Links {
@Nullable private JsonElement primary;
private Link primaryLink;
public void setPrimary(@Nullable final JsonElement primary) {
this.primary = primary;
}
@Nullable public Link getPrimary() {
if (primary == null) {
return null;
}
if (primaryLink == null && primary instanceof JsonObject) {
primaryLink = GsonUtil.getDefaultGson().fromJson(primary, Link.class);
}
return primaryLink;
}
}
public static class Contents {
@Nullable private String header;
@Nullable private String compactHeader;
@Nullable private String body;
@Nullable private String icon;
@Nullable private Links links;
@NonNull public String getHeader() {
return StringUtils.defaultString(header);
}
@NonNull public String getCompactHeader() {
return StringUtils.defaultString(compactHeader);
}
public void setCompactHeader(@Nullable final String compactHeader) {
this.compactHeader = compactHeader;
}
@NonNull public String getBody() {
return StringUtils.defaultString(body);
}
@Nullable public Links getLinks() {
return links;
}
public void setLinks(@Nullable final Links links) {
this.links = links;
}
}
}

View file

@ -1,4 +1,4 @@
package org.wikipedia.page;
package fr.free.nrw.commons.wikidata.model.page;
import android.location.Location;

View file

@ -1,4 +1,4 @@
package org.wikipedia.page;
package fr.free.nrw.commons.wikidata.model.page;
import android.location.Location;

View file

@ -1,18 +1,9 @@
package org.wikipedia.page;
package fr.free.nrw.commons.wikidata.model.page;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.language.AppLanguageLookUpTable;
import org.wikipedia.model.CodeEnum;
import org.wikipedia.model.EnumCode;
import org.wikipedia.model.EnumCodeMap;
import org.wikipedia.staticdata.FileAliasData;
import org.wikipedia.staticdata.SpecialAliasData;
import java.util.Locale;
import fr.free.nrw.commons.wikidata.model.EnumCode;
import fr.free.nrw.commons.wikidata.model.EnumCodeMap;
/** An enumeration describing the different possible namespace codes. Do not attempt to use this
* class to preserve URL path information such as Talk: or User: or localization.
@ -146,48 +137,11 @@ public enum Namespace implements EnumCode {
GADGET_DEFINITION_TALK(2303),
TOPIC(2600);
public static final CodeEnum<Namespace> CODE_ENUM = Namespace::of;
private static final int TALK_MASK = 0x1;
private static final EnumCodeMap<Namespace> MAP = new EnumCodeMap<>(Namespace.class);
private final int code;
/** Warning: this method returns an English translation for the current namespace. */
@Deprecated
@Nullable
public String toLegacyString() {
String string = this == MAIN ? null : this.name();
if (string != null) {
string = StringUtils.capitalize(string.toLowerCase(Locale.ENGLISH));
}
return string;
}
/** Warning: this method is localized only for File and Special pages. */
@Deprecated @NonNull public static Namespace fromLegacyString(@NonNull WikiSite wiki,
@Nullable String name) {
if (FileAliasData.valueFor(wiki.languageCode()).equals(name)
|| FileAliasData.valueFor(AppLanguageLookUpTable.FALLBACK_LANGUAGE_CODE).equals(name)) {
return Namespace.FILE;
}
if (SpecialAliasData.valueFor(wiki.languageCode()).equals(name)
|| SpecialAliasData.valueFor(AppLanguageLookUpTable.FALLBACK_LANGUAGE_CODE).equals(name)) {
return Namespace.SPECIAL;
}
// This works for the links provided by the app itself since they always have the English
// version of the namespace.
// TODO: It would be nice to add a mapping table, as is done for File and Special,
// so we can also handle links passed to the app.
if (name != null && name.contains("Talk")) {
return Namespace.TALK;
}
return Namespace.MAIN;
}
@NonNull
public static Namespace of(int code) {
return MAP.get(code);

View file

@ -1,22 +1,16 @@
package org.wikipedia.page;
package fr.free.nrw.commons.wikidata.model.page;
import android.location.Location;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.wikipedia.AppAdapter;
import org.wikipedia.dataclient.page.PageLeadProperties;
import java.text.ParseException;
import java.util.Date;
import static org.apache.commons.lang3.StringUtils.defaultString;
import static org.wikipedia.util.DateUtil.iso8601DateParse;
/**
* Immutable class that contains metadata associated with a PageTitle.
@ -45,108 +39,10 @@ public class PageProperties implements Parcelable {
*/
private final boolean canEdit;
/**
* Side note: Should later be moved out of this class but I like the similarities with
* PageProperties(JSONObject).
*/
public PageProperties(PageLeadProperties core) {
pageId = core.getId();
namespace = core.getNamespace();
revisionId = core.getRevision();
displayTitleText = defaultString(core.getDisplayTitle());
titlePronunciationUrl = core.getTitlePronunciationUrl();
geo = core.getGeo();
editProtectionStatus = core.getFirstAllowedEditorRole();
languageCount = core.getLanguageCount();
// todo: don't hardcode this here
leadImageUrl = core.getLeadImageUrl(AppAdapter.get().getDesiredLeadImageDp());
leadImageName = core.getLeadImageFileName();
lastModified = new Date();
String lastModifiedText = core.getLastModified();
if (lastModifiedText != null) {
try {
lastModified.setTime(iso8601DateParse(lastModifiedText).getTime());
} catch (ParseException e) {
Log.d("PageProperties", "Failed to parse date: " + lastModifiedText);
}
}
// assume formatversion=2 is used so we get real booleans from the API
canEdit = core.isEditable();
isMainPage = core.isMainPage();
isDisambiguationPage = core.isDisambiguation();
wikiBaseItem = core.getWikiBaseItem();
descriptionSource = core.getDescriptionSource();
}
/**
* Constructor to be used when building a Page from a compilation. Initializes the title and
* namespace fields, and explicitly disables editing. All other fields initialized to defaults.
* @param title Title to which these properties apply.
*/
public PageProperties(@NonNull PageTitle title, boolean isMainPage) {
pageId = 0;
namespace = title.namespace();
revisionId = 0;
displayTitleText = title.getDisplayText();
titlePronunciationUrl = null;
geo = null;
editProtectionStatus = "";
languageCount = 1;
leadImageUrl = null;
leadImageName = "";
lastModified = new Date();
canEdit = false;
this.isMainPage = isMainPage;
isDisambiguationPage = false;
wikiBaseItem = null;
descriptionSource = null;
}
public int getPageId() {
return pageId;
}
@NonNull public Namespace getNamespace() {
return namespace;
}
public long getRevisionId() {
return revisionId;
}
public Date getLastModified() {
return lastModified;
}
public String getDisplayTitle() {
return displayTitleText;
}
@Nullable
public String getTitlePronunciationUrl() {
return titlePronunciationUrl;
}
@Nullable
public Location getGeo() {
return geo;
}
public String getEditProtectionStatus() {
return editProtectionStatus;
}
public int getLanguageCount() {
return languageCount;
}
public boolean canEdit() {
return canEdit;
}
public boolean isMainPage() {
return isMainPage;
}
@ -155,30 +51,6 @@ public class PageProperties implements Parcelable {
return isDisambiguationPage;
}
/**
* @return Nullable URL with no scheme. For example, foo.bar.com/ instead of
* http://foo.bar.com/.
*/
@Nullable
public String getLeadImageUrl() {
return leadImageUrl;
}
@Nullable
public String getLeadImageName() {
return leadImageName;
}
@Nullable
public String getWikiBaseItem() {
return wikiBaseItem;
}
@Nullable
public String getDescriptionSource() {
return descriptionSource;
}
@Override
public int describeContents() {
return 0;

View file

@ -1,23 +1,19 @@
package org.wikipedia.page;
package fr.free.nrw.commons.wikidata.model.page;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.util.StringUtil;
import fr.free.nrw.commons.wikidata.model.WikiSite;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.Normalizer;
import java.util.Arrays;
import java.util.Locale;
import static org.wikipedia.util.UriUtil.decodeURL;
import timber.log.Timber;
/**
* Represents certain vital information about a page, including the title, namespace,
@ -157,18 +153,23 @@ public class PageTitle implements Parcelable {
this.properties = properties;
}
@Nullable
public String getNamespace() {
return namespace;
}
@NonNull public Namespace namespace() {
if (properties != null) {
return properties.getNamespace();
/**
* Decodes a URL-encoded string into its UTF-8 equivalent. If the string cannot be decoded, the
* original string is returned.
* @param url The URL-encoded string that you wish to decode.
* @return The decoded string, or the input string if the decoding failed.
*/
@NonNull private String decodeURL(@NonNull String url) {
try {
return URLDecoder.decode(url, "UTF-8");
} catch (IllegalArgumentException e) {
// Swallow IllegalArgumentException (can happen with malformed encoding), and just
// return the original string.
Timber.d("URL decoding failed. String was: %s", url);
return url;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
// Properties has the accurate namespace but it doesn't exist. Guess based on title.
return Namespace.fromLegacyString(wiki, namespace);
}
@NonNull public WikiSite getWikiSite() {
@ -257,34 +258,11 @@ public class PageTitle implements Parcelable {
public String getPrefixedText() {
// TODO: find a better way to check if the namespace is a ISO Alpha2 Code (two digits country code)
return namespace == null ? getText() : StringUtil.addUnderscores(namespace) + ":" + getText();
return namespace == null ? getText() : addUnderscores(namespace) + ":" + getText();
}
/**
* Check if the Title represents a File:
*
* @return true if it is a File page, false if not
*/
public boolean isFilePage() {
return namespace().file();
}
/**
* Check if the Title represents a special page
*
* @return true if it is a special page, false if not
*/
public boolean isSpecial() {
return namespace().special();
}
/**
* Check if the Title represents a talk page
*
* @return true if it is a talk page, false if not
*/
public boolean isTalkPage() {
return namespace().talk();
private String addUnderscores(@NonNull String text) {
return text.replace(" ", "_");
}
@Override public void writeToParcel(Parcel parcel, int flags) {
@ -305,7 +283,19 @@ public class PageTitle implements Parcelable {
PageTitle other = (PageTitle)o;
// Not using namespace directly since that can be null
return StringUtil.normalizedEquals(other.getPrefixedText(), getPrefixedText()) && other.wiki.equals(wiki);
return normalizedEquals(other.getPrefixedText(), getPrefixedText()) && other.wiki.equals(wiki);
}
// Compare two strings based on their normalized form, using the Unicode Normalization Form C.
// This should be used when comparing or verifying strings that will be exchanged between
// different platforms (iOS, desktop, etc) that may encode strings using inconsistent
// composition, especially for accents, diacritics, etc.
private boolean normalizedEquals(@Nullable String str1, @Nullable String str2) {
if (str1 == null || str2 == null) {
return (str1 == null && str2 == null);
}
return Normalizer.normalize(str1, Normalizer.Form.NFC)
.equals(Normalizer.normalize(str2, Normalizer.Form.NFC));
}
@Override public int hashCode() {

View file

@ -1,11 +1,11 @@
package org.wikipedia.dataclient.mwapi;
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.NonNull;
public class ImageDetails {
@SuppressWarnings("unused") private String name;
@SuppressWarnings("unused") private String title;
private String name;
private String title;
@NonNull public String getName() {
return name;

View file

@ -1,4 +1,4 @@
package org.wikipedia.dataclient.mwapi;
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -12,33 +12,17 @@ import java.util.Collections;
import java.util.List;
import java.util.Set;
@SuppressWarnings("unused")
public class ListUserResponse {
@SerializedName("name") @Nullable private String name;
private long userid;
@Nullable private List<String> groups;
@Nullable private String cancreate;
@Nullable private List<UserResponseCreateError> cancreateerror;
@Nullable public String name() {
return name;
}
public boolean canCreate() {
return cancreate != null;
}
@NonNull public Set<String> getGroups() {
return groups != null ? new ArraySet<>(groups) : Collections.emptySet();
}
public static class UserResponseCreateError {
@Nullable private String message;
@Nullable private String code;
@Nullable private String type;
@NonNull public String message() {
return StringUtils.defaultString(message);
}
}
}

View file

@ -1,13 +1,12 @@
package org.wikipedia.dataclient.mwapi;
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.List;
public class MwException extends RuntimeException {
@SuppressWarnings("unused") @Nullable private final MwServiceError error;
@Nullable private final MwServiceError error;
@SuppressWarnings("unused") @Nullable private final List<MwServiceError> errors;
@Nullable private final List<MwServiceError> errors;
public MwException(@Nullable MwServiceError error,
@Nullable final List<MwServiceError> errors) {
@ -15,11 +14,6 @@ public class MwException extends RuntimeException {
this.errors = errors;
}
@NonNull
public List<MwServiceError> getErrors() {
return errors;
}
public String getErrorCode() {
if(error!=null) {
return error.getCode();

View file

@ -1,19 +1,14 @@
package org.wikipedia.dataclient.mwapi;
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.Nullable;
public class MwPostResponse extends MwResponse {
@Nullable @SuppressWarnings("unused") private String options;
@SuppressWarnings("unused") private int success;
private int success;
public boolean success(@Nullable String result) {
return "success".equals(result);
}
@Nullable public String getOptions() {
return options;
}
public int getSuccessVal() {
return success;
}

View file

@ -0,0 +1,229 @@
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import org.apache.commons.lang3.StringUtils;
import fr.free.nrw.commons.wikidata.model.gallery.ImageInfo;
import fr.free.nrw.commons.wikidata.model.BaseModel;
import java.util.Collections;
import java.util.List;
/**
* A class representing a standard page object as returned by the MediaWiki API.
*/
public class MwQueryPage extends BaseModel {
private int pageid;
private int index;
@NonNull private String title;
@NonNull private CategoryInfo categoryinfo;
@Nullable private List<Revision> revisions;
@SerializedName("fileusage") @Nullable private List<FileUsage> fileUsages;
@SerializedName("globalusage") @Nullable private List<GlobalUsage> globalUsages;
@Nullable private List<Coordinates> coordinates;
@Nullable private List<Category> categories;
@Nullable private Thumbnail thumbnail;
@Nullable private String description;
@SerializedName("imageinfo") @Nullable private List<ImageInfo> imageInfo;
@Nullable private String redirectFrom;
@Nullable private String convertedFrom;
@Nullable private String convertedTo;
@NonNull public String title() {
return title;
}
@NonNull public CategoryInfo categoryInfo() {
return categoryinfo;
}
public int index() {
return index;
}
@Nullable public List<Revision> revisions() {
return revisions;
}
@Nullable public List<Category> categories() {
return categories;
}
@Nullable public List<Coordinates> coordinates() {
// TODO: Handle null values in lists during deserialization, perhaps with a new
// @RequiredElements annotation and corresponding TypeAdapter
if (coordinates != null) {
coordinates.removeAll(Collections.singleton(null));
}
return coordinates;
}
public int pageId() {
return pageid;
}
@Nullable public String thumbUrl() {
return thumbnail != null ? thumbnail.source() : null;
}
@Nullable public String description() {
return description;
}
@Nullable public ImageInfo imageInfo() {
return imageInfo != null ? imageInfo.get(0) : null;
}
public void redirectFrom(@Nullable String from) {
redirectFrom = from;
}
public void convertedFrom(@Nullable String from) {
convertedFrom = from;
}
public void convertedTo(@Nullable String to) {
convertedTo = to;
}
public void appendTitleFragment(@Nullable String fragment) {
title += "#" + fragment;
}
public boolean checkWhetherFileIsUsedInWikis() {
if (globalUsages != null && globalUsages.size() > 0) {
return true;
}
if (fileUsages == null || fileUsages.size() == 0) {
return false;
}
final int totalCount = fileUsages.size();
/* Ignore usage under https://commons.wikimedia.org/wiki/User:Didym/Mobile_upload/
which has been a gallery of all of our uploads since 2014 */
for (final FileUsage fileUsage : fileUsages) {
if ( ! fileUsage.title().contains("User:Didym/Mobile upload")) {
return true;
}
}
return false;
}
public static class Revision {
@SerializedName("revid") private long revisionId;
private String user;
@SerializedName("contentformat") @NonNull private String contentFormat;
@SerializedName("contentmodel") @NonNull private String contentModel;
@SerializedName("timestamp") @NonNull private String timeStamp;
@NonNull private String content;
@NonNull public String content() {
return content;
}
@NonNull public String timeStamp() {
return StringUtils.defaultString(timeStamp);
}
public long getRevisionId() {
return revisionId;
}
@NonNull
public String getUser() {
return StringUtils.defaultString(user);
}
}
public static class Coordinates {
@Nullable private Double lat;
@Nullable private Double lon;
@Nullable public Double lat() {
return lat;
}
@Nullable public Double lon() {
return lon;
}
}
public static class CategoryInfo {
private boolean hidden;
private int size;
private int pages;
private int files;
private int subcats;
public boolean isHidden() {
return hidden;
}
}
static class Thumbnail {
private String source;
private int width;
private int height;
String source() {
return source;
}
}
public static class GlobalUsage {
@SerializedName("title") private String title;
@SerializedName("wiki")private String wiki;
@SerializedName("url") private String url;
public String getTitle() {
return title;
}
public String getWiki() {
return wiki;
}
public String getUrl() {
return url;
}
}
public static class FileUsage {
@SerializedName("pageid") private int pageid;
@SerializedName("ns") private int ns;
@SerializedName("title") private String title;
public int pageId() {
return pageid;
}
public int ns() {
return ns;
}
public String title() {
return title;
}
}
public static class Category {
private int ns;
@SuppressWarnings("unused,NullableProblems") @Nullable private String title;
private boolean hidden;
public int ns() {
return ns;
}
@NonNull public String title() {
return StringUtils.defaultString(title);
}
public boolean hidden() {
return hidden;
}
}
}

View file

@ -0,0 +1,26 @@
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import java.util.Map;
public class MwQueryResponse extends MwResponse {
@SerializedName("continue") @Nullable private Map<String, String> continuation;
@SerializedName("query") @Nullable private MwQueryResult query;
@Nullable public Map<String, String> continuation() {
return continuation;
}
@Nullable public MwQueryResult query() {
return query;
}
public boolean success() {
return query != null;
}
}

View file

@ -1,27 +1,22 @@
package org.wikipedia.dataclient.mwapi;
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import fr.free.nrw.commons.wikidata.json.PostProcessingTypeAdapter;
import org.apache.commons.lang3.StringUtils;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.gallery.ImageInfo;
import org.wikipedia.gallery.VideoInfo;
import org.wikipedia.json.PostProcessingTypeAdapter;
import org.wikipedia.model.BaseModel;
import org.wikipedia.notifications.Notification;
import org.wikipedia.page.PageTitle;
import org.wikipedia.settings.SiteInfo;
import fr.free.nrw.commons.wikidata.model.gallery.ImageInfo;
import fr.free.nrw.commons.wikidata.model.BaseModel;
import fr.free.nrw.commons.wikidata.model.notifications.Notification;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SuppressWarnings("unused")
public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapter.PostProcessable {
@SerializedName("pages") @Nullable private List<MwQueryPage> pages;
@Nullable private List<Redirect> redirects;
@ -29,17 +24,8 @@ public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapte
@SerializedName("userinfo") private UserInfo userInfo;
@Nullable private List<ListUserResponse> users;
@Nullable private Tokens tokens;
@SerializedName("authmanagerinfo") @Nullable private MwAuthManagerInfo amInfo;
@Nullable private MarkReadResponse echomarkread;
@Nullable private MarkReadResponse echomarkseen;
@Nullable private NotificationList notifications;
@Nullable private Map<String, Notification.UnreadNotificationWikiItem> unreadnotificationpages;
@SerializedName("general") @Nullable private SiteInfo generalSiteInfo;
@SerializedName("wikimediaeditortaskscounts") @Nullable private EditorTaskCounts editorTaskCounts;
@SerializedName("allimages") @Nullable private List<ImageDetails> allImages;
@SerializedName("geosearch") @Nullable private List<GeoSearchItem> geoSearch;
@Nullable private List<MwQueryLogEvent> logevents;
@Nullable public List<MwQueryPage> pages() {
return pages;
@ -57,11 +43,6 @@ public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapte
return allImages == null ? Collections.emptyList() : allImages;
}
@NonNull
public List<GeoSearchItem> geoSearch() {
return geoSearch == null ? Collections.emptyList() : geoSearch;
}
@Nullable public UserInfo userInfo() {
return userInfo;
}
@ -70,10 +51,6 @@ public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapte
return tokens != null ? tokens.csrf() : null;
}
@Nullable public String createAccountToken() {
return tokens != null ? tokens.createAccount() : null;
}
@Nullable public String loginToken() {
return tokens != null ? tokens.login() : null;
}
@ -82,26 +59,6 @@ public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapte
return notifications;
}
@Nullable public Map<String, Notification.UnreadNotificationWikiItem> unreadNotificationWikis() {
return unreadnotificationpages;
}
@Nullable public MarkReadResponse getEchoMarkSeen() {
return echomarkseen;
}
@Nullable public String captchaId() {
String captchaId = null;
if (amInfo != null) {
for (MwAuthManagerInfo.Request request : amInfo.requests()) {
if ("CaptchaAuthenticationRequest".equals(request.id())) {
captchaId = request.fields().get("captchaId").value();
}
}
}
return captchaId;
}
@Nullable public ListUserResponse getUserResponse(@NonNull String userName) {
if (users != null) {
for (ListUserResponse user : users) {
@ -126,52 +83,6 @@ public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapte
return result;
}
@NonNull public Map<String, VideoInfo> videos() {
Map<String, VideoInfo> result = new HashMap<>();
if (pages != null) {
for (MwQueryPage page : pages) {
if (page.videoInfo() != null) {
result.put(page.title(), page.videoInfo());
}
}
}
return result;
}
@NonNull public List<PageTitle> langLinks() {
List<PageTitle> result = new ArrayList<>();
if (pages == null || pages.isEmpty() || pages.get(0).langLinks() == null) {
return result;
}
// noinspection ConstantConditions
for (MwQueryPage.LangLink link : pages.get(0).langLinks()) {
PageTitle title = new PageTitle(link.title(), WikiSite.forLanguageCode(link.lang()));
result.add(title);
}
return result;
}
@NonNull public List<NearbyPage> nearbyPages(@NonNull WikiSite wiki) {
List<NearbyPage> result = new ArrayList<>();
if (pages != null) {
for (MwQueryPage page : pages) {
NearbyPage nearbyPage = new NearbyPage(page, wiki);
if (nearbyPage.getLocation() != null) {
result.add(nearbyPage);
}
}
}
return result;
}
@Nullable public SiteInfo siteInfo() {
return generalSiteInfo;
}
@Nullable public EditorTaskCounts editorTaskCounts() {
return editorTaskCounts;
}
@Override
public void postProcess() {
resolveConvertedTitles();
@ -212,16 +123,11 @@ public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapte
}
}
@Nullable
public List<MwQueryLogEvent> logevents() {
return logevents;
}
private static class Redirect {
@SuppressWarnings("unused") private int index;
@SuppressWarnings("unused") @Nullable private String from;
@SuppressWarnings("unused") @Nullable private String to;
@SuppressWarnings("unused") @SerializedName("tofragment") @Nullable private String toFragment;
private int index;
@Nullable private String from;
@Nullable private String to;
@SerializedName("tofragment") @Nullable private String toFragment;
@Nullable public String to() {
return to;
@ -237,8 +143,8 @@ public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapte
}
public static class ConvertedTitle {
@SuppressWarnings("unused") @Nullable private String from;
@SuppressWarnings("unused") @Nullable private String to;
@Nullable private String from;
@Nullable private String to;
@Nullable public String to() {
return to;
@ -270,40 +176,12 @@ public class MwQueryResult extends BaseModel implements PostProcessingTypeAdapte
}
}
public static class MarkReadResponse {
@SuppressWarnings("unused") @Nullable private String result;
@SuppressWarnings("unused,NullableProblems") @Nullable private String timestamp;
@Nullable public String getResult() {
return result;
}
@Nullable public String getTimestamp() {
return timestamp;
}
}
public static class NotificationList {
@SuppressWarnings("unused") private int count;
@SuppressWarnings("unused") private int rawcount;
@SuppressWarnings("unused") @Nullable private Notification.SeenTime seenTime;
@SuppressWarnings("unused") @Nullable private List<Notification> list;
@SuppressWarnings("unused") @SerializedName("continue") @Nullable private String continueStr;
@Nullable public List<Notification> list() {
@Nullable
private List<Notification> list;
@Nullable
public List<Notification> list() {
return list;
}
@Nullable public String getContinue() {
return continueStr;
}
public int getCount() {
return count;
}
@Nullable public Notification.SeenTime getSeenTime() {
return seenTime;
}
}
}

View file

@ -1,12 +1,12 @@
package org.wikipedia.dataclient.mwapi;
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import org.wikipedia.json.PostProcessingTypeAdapter;
import org.wikipedia.model.BaseModel;
import fr.free.nrw.commons.wikidata.json.PostProcessingTypeAdapter;
import fr.free.nrw.commons.wikidata.model.BaseModel;
import java.util.List;

View file

@ -0,0 +1,29 @@
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
import fr.free.nrw.commons.wikidata.model.BaseModel;
/**
* Gson POJO for a MediaWiki API error.
*/
public class MwServiceError extends BaseModel {
@Nullable private String code;
@Nullable private String text;
@NonNull public String getTitle() {
return StringUtils.defaultString(code);
}
@NonNull public String getDetails() {
return StringUtils.defaultString(text);
}
@Nullable
public String getCode() {
return code;
}
}

View file

@ -0,0 +1,34 @@
package fr.free.nrw.commons.wikidata.mwapi;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Map;
public class UserInfo {
@NonNull private String name;
@NonNull private int id;
//Block information
private int blockid;
private String blockedby;
private int blockedbyid;
private String blockreason;
private String blocktimestamp;
private String blockexpiry;
// Object type is any JSON type.
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
@Nullable private Map<String, ?> options;
public int id() {
return id;
}
@NonNull
public String blockexpiry() {
if (blockexpiry != null)
return blockexpiry;
else return "";
}
}

View file

@ -12,7 +12,6 @@ import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.mockito.MockitoAnnotations
import org.wikipedia.dataclient.mwapi.MwQueryResponse
/**
* Test methods in media data extractor

View file

@ -14,7 +14,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.wikipedia.json.GsonUtil;
import fr.free.nrw.commons.wikidata.GsonUtil;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

Some files were not shown because too many files have changed in this diff Show more