Remove unused code

This commit is contained in:
maskara 2018-01-22 03:54:26 +05:30
parent 6664f7f324
commit 41d6abdf40
17 changed files with 0 additions and 653 deletions

View file

@ -46,9 +46,6 @@ dependencies {
implementation 'com.facebook.fresco:fresco:1.5.0' implementation 'com.facebook.fresco:fresco:1.5.0'
implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.facebook.stetho:stetho:1.5.0'
implementation "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION"
implementation "com.squareup.retrofit2:converter-gson:$RETROFIT_VERSION"
implementation 'org.apache.commons:commons-lang3:3.5'
implementation "com.google.dagger:dagger:$DAGGER_VERSION" implementation "com.google.dagger:dagger:$DAGGER_VERSION"
implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION" implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION"
@ -121,7 +118,6 @@ android {
productFlavors { productFlavors {
prod { prod {
buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.org/w/api.php\"" buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.org/w/api.php\""
buildConfigField "String", "COMMONS_BASE_URL", "\"https://commons.wikimedia.org\""
buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\"" buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\""
buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.wikimedia.org/wikipedia/commons\"" buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.wikimedia.org/wikipedia/commons\""
buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.org/wiki/\"" buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.org/wiki/\""
@ -136,7 +132,6 @@ android {
beta { beta {
// What values do we need to hit the BETA versions of the site / api ? // What values do we need to hit the BETA versions of the site / api ?
buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.beta.wmflabs.org/w/api.php\"" buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.beta.wmflabs.org/w/api.php\""
buildConfigField "String", "COMMONS_BASE_URL", "\"https://commons.wikimedia.beta.wmflabs.org\""
buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\"" buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\""
buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.beta.wmflabs.org/wikipedia/commons\"" buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.beta.wmflabs.org/wikipedia/commons\""
buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/\"" buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/\""

View file

@ -9,7 +9,6 @@ import android.support.v4.util.LruCache;
import javax.inject.Named; import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import dagger.Binds;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.BuildConfig;
@ -22,7 +21,6 @@ import fr.free.nrw.commons.location.LocationServiceManager;
import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi; import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi;
import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.nearby.NearbyPlaces; import fr.free.nrw.commons.nearby.NearbyPlaces;
import fr.free.nrw.commons.notification.NotificationClient;
import fr.free.nrw.commons.upload.UploadController; import fr.free.nrw.commons.upload.UploadController;
import static android.content.Context.MODE_PRIVATE; import static android.content.Context.MODE_PRIVATE;
@ -137,10 +135,4 @@ public class CommonsApplicationModule {
public LruCache<String, String> provideLruCache() { public LruCache<String, String> provideLruCache() {
return new LruCache<>(1024); return new LruCache<>(1024);
} }
@Provides
@Singleton
public NotificationClient provideNotificationClient() {
return new NotificationClient(BuildConfig.COMMONS_BASE_URL);
}
} }

View file

@ -1,20 +0,0 @@
package fr.free.nrw.commons.json;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.gson.Gson;
import fr.free.nrw.commons.network.GsonUtil;
public final class GsonMarshaller {
public static String marshal(@Nullable Object object) {
return marshal(GsonUtil.getDefaultGson(), object);
}
public static String marshal(@NonNull Gson gson, @Nullable Object object) {
return gson.toJson(object);
}
private GsonMarshaller() { }
}

View file

@ -1,36 +0,0 @@
package fr.free.nrw.commons.json;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import fr.free.nrw.commons.network.GsonUtil;
public final class GsonUnmarshaller {
/** @return Unmarshalled object. */
public static <T> T unmarshal(Class<T> clazz, @Nullable String json) {
return unmarshal(GsonUtil.getDefaultGson(), clazz, json);
}
/** @return Unmarshalled collection of objects. */
public static <T> T unmarshal(TypeToken<T> typeToken, @Nullable String json) {
return unmarshal(GsonUtil.getDefaultGson(), typeToken, json);
}
/** @return Unmarshalled object. */
public static <T> T unmarshal(@NonNull Gson gson, Class<T> clazz, @Nullable String json) {
return gson.fromJson(json, clazz);
}
/** @return Unmarshalled collection of objects. */
public static <T> T unmarshal(@NonNull Gson gson, TypeToken<T> typeToken, @Nullable String json) {
// From the manual: "Fairly hideous... Unfortunately, no way to get around this in Java".
return gson.fromJson(json, typeToken.getType());
}
private GsonUnmarshaller() { }
}

View file

@ -1,95 +0,0 @@
package fr.free.nrw.commons.json;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.ArraySet;
import com.google.gson.Gson;
import com.google.gson.JsonParseException;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Set;
import fr.free.nrw.commons.json.annotations.Required;
/**
* TypeAdapterFactory that provides TypeAdapters that return null values for objects that are
* missing fields annotated with @Required.
*
* BEWARE: This means that a List or other Collection of objects that have @Required fields can
* contain null elements after deserialization!
*
* TODO: Handle null values in lists during deserialization, perhaps with a new @RequiredElements
* annotation and another corresponding TypeAdapter(Factory).
*/
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);
if (requiredFields.isEmpty()) {
return null;
}
setFieldsAccessible(requiredFields, true);
return new Adapter<>(gson.getDelegateAdapter(this, typeToken), requiredFields);
}
@NonNull private Set<Field> collectRequiredFields(@NonNull Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
Set<Field> required = new ArraySet<>();
for (Field field : fields) {
if (field.isAnnotationPresent(Required.class)) {
required.add(field);
}
}
return Collections.unmodifiableSet(required);
}
private void setFieldsAccessible(Iterable<Field> fields, boolean accessible) {
for (Field field : fields) {
field.setAccessible(accessible);
}
}
private static final class Adapter<T> extends TypeAdapter<T> {
@NonNull private final TypeAdapter<T> delegate;
@NonNull private final Set<Field> requiredFields;
private Adapter(@NonNull TypeAdapter<T> delegate, @NonNull final Set<Field> requiredFields) {
this.delegate = delegate;
this.requiredFields = requiredFields;
}
@Override public void write(JsonWriter out, T value) throws IOException {
delegate.write(out, value);
}
@Override @Nullable public T read(JsonReader in) throws IOException {
T deserialized = delegate.read(in);
return allRequiredFieldsPresent(deserialized, requiredFields) ? deserialized : null;
}
private boolean allRequiredFieldsPresent(@NonNull T deserialized,
@NonNull Set<Field> required) {
for (Field field : required) {
try {
if (field.get(deserialized) == null) {
return false;
}
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new JsonParseException(e);
}
}
return true;
}
}
}

View file

@ -1,22 +0,0 @@
package fr.free.nrw.commons.json;
import android.net.Uri;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
public class UriTypeAdapter extends TypeAdapter<Uri> {
@Override
public void write(JsonWriter out, Uri value) throws IOException {
out.value(value.toString());
}
@Override
public Uri read(JsonReader in) throws IOException {
String url = in.nextString();
return Uri.parse(url);
}
}

View file

@ -1,21 +0,0 @@
package fr.free.nrw.commons.json.annotations;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
/**
* Annotate fields in Retrofit POJO classes with this to enforce their presence in order to return
* an instantiated object.
*
* E.g.: @NonNull @Required private String title;
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(FIELD)
public @interface Required {
}

View file

@ -1,20 +0,0 @@
package fr.free.nrw.commons.mwapi;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
public abstract class BaseModel {
@Override public String toString() {
return ToStringBuilder.reflectionToString(this);
}
@Override public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
@Override public boolean equals(Object other) {
return EqualsBuilder.reflectionEquals(this, other);
}
}

View file

@ -1,40 +0,0 @@
package fr.free.nrw.commons.mwapi;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import com.google.gson.annotations.SerializedName;
import java.util.List;
import java.util.Map;
public class MwQueryResponse<T> extends MwResponse {
@SuppressWarnings("unused") @SerializedName("batchcomplete") private boolean batchComplete;
@SuppressWarnings("unused") @SerializedName("continue") @Nullable
private Map<String, String> continuation;
@Nullable private T query;
public boolean batchComplete() {
return batchComplete;
}
@Nullable public Map<String, String> continuation() {
return continuation;
}
@Nullable public T query() {
return query;
}
@Override public boolean success() {
return super.success() && query != null;
}
@VisibleForTesting
protected void setQuery(@Nullable T query) {
this.query = query;
}
}

View file

@ -1,46 +0,0 @@
package fr.free.nrw.commons.mwapi;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import java.util.Map;
public abstract class MwResponse extends BaseModel {
@SuppressWarnings("unused") @Nullable
private MwServiceError error;
@SuppressWarnings("unused") @Nullable private Map<String, Warning> warnings;
@SuppressWarnings("unused,NullableProblems") @SerializedName("servedby") @NonNull
private String servedBy;
@Nullable public MwServiceError getError() {
return error;
}
public boolean hasError() {
return error != null;
}
public boolean success() {
return error == null;
}
@Nullable public String code() {
return error != null ? error.getTitle() : null;
}
@Nullable public String info() {
return error != null ? error.getDetails() : null;
}
public boolean badToken() {
return error != null && error.badToken();
}
private class Warning {
@SuppressWarnings("unused,NullableProblems") @NonNull private String warnings;
}
}

View file

@ -1,72 +0,0 @@
package fr.free.nrw.commons.mwapi;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
import java.util.List;
/**
* Gson POJO for a MediaWiki API error.
*/
public class MwServiceError implements ServiceError {
@SuppressWarnings("unused") @Nullable
private String code;
@SuppressWarnings("unused") @Nullable private String info;
@SuppressWarnings("unused") @Nullable private String docref;
@SuppressWarnings("unused") @NonNull
private List<Message> messages = Collections.emptyList();
@Override @Nullable public String getTitle() {
return code;
}
@Override @Nullable public String getDetails() {
return info;
}
@Nullable public String getDocRef() {
return docref;
}
public boolean badToken() {
return "badtoken".equals(code);
}
public boolean hasMessageName(@NonNull String messageName) {
for (Message msg : messages) {
if (messageName.equals(msg.name)) {
return true;
}
}
return false;
}
@Nullable public String getMessageHtml(@NonNull String messageName) {
for (Message msg : messages) {
if (messageName.equals(msg.name)) {
return msg.html();
}
}
return null;
}
@Override public String toString() {
return "MwServiceError{"
+ "code='" + code + '\''
+ ", info='" + info + '\''
+ ", docref='" + docref + '\''
+ '}';
}
private static final class Message {
@SuppressWarnings("unused") @Nullable private String name;
@SuppressWarnings("unused") @Nullable private String html;
@NonNull private String html() {
return StringUtils.defaultString(html);
}
}
}

View file

@ -1,7 +0,0 @@
package fr.free.nrw.commons.mwapi;
public interface ServiceError {
String getTitle();
String getDetails();
}

View file

@ -1,31 +0,0 @@
package fr.free.nrw.commons.network;
import android.net.Uri;
import android.support.annotation.VisibleForTesting;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import fr.free.nrw.commons.json.UriTypeAdapter;
public final class GsonUtil {
private static final String DATE_FORMAT = "MMM dd, yyyy HH:mm:ss";
private static final GsonBuilder DEFAULT_GSON_BUILDER = new GsonBuilder()
.setDateFormat(DATE_FORMAT)
.registerTypeHierarchyAdapter(Uri.class, new UriTypeAdapter().nullSafe());
private static final Gson DEFAULT_GSON = DEFAULT_GSON_BUILDER.create();
public static Gson getDefaultGson() {
return DEFAULT_GSON;
}
@VisibleForTesting
public static GsonBuilder getDefaultGsonBuilder() {
return DEFAULT_GSON_BUILDER;
}
private GsonUtil() {
}
}

View file

@ -1,22 +0,0 @@
package fr.free.nrw.commons.network;
import android.support.annotation.NonNull;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public final class RetrofitFactory {
public static Retrofit newInstance(@NonNull String endpoint) {
return new Retrofit.Builder()
.client(new OkHttpClient())
.baseUrl(endpoint)
.addConverterFactory(GsonConverterFactory.create(GsonUtil.getDefaultGson()))
.build();
}
private RetrofitFactory() {
}
}

View file

@ -1,101 +0,0 @@
package fr.free.nrw.commons.notification;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import com.google.gson.JsonParseException;
import java.util.List;
import fr.free.nrw.commons.mwapi.MwQueryResponse;
import fr.free.nrw.commons.network.RetrofitFactory;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
import timber.log.Timber;
public final class NotificationClient {
@NonNull
private final Service service;
public interface Callback {
void success(@NonNull List<Notification> notifications);
void failure(Throwable t);
}
public NotificationClient(@NonNull String endpoint) {
service = RetrofitFactory.newInstance(endpoint).create(Service.class);
}
@VisibleForTesting
static class CallbackAdapter implements retrofit2.Callback<MwQueryResponse<NotificationObject.QueryNotifications>> {
@NonNull
private final Callback callback;
CallbackAdapter(@NonNull Callback callback) {
this.callback = callback;
}
@Override
public void onResponse(Call<MwQueryResponse<NotificationObject.QueryNotifications>> call,
Response<MwQueryResponse<NotificationObject.QueryNotifications>> response) {
Timber.d("Resonse is %s", response);
if (response.body() != null && response.body().query() != null) {
callback.success(response.body().query().get());
} else {
callback.failure(new JsonParseException("Notification response is malformed."));
}
}
@Override
public void onFailure(Call<MwQueryResponse<NotificationObject.QueryNotifications>> call, Throwable caught) {
Timber.e(caught, "Error occurred while fetching notifications");
callback.failure(caught);
}
}
/**
* Obrain a list of unread notifications for the user who is currently logged in.
*
* @param callback Callback that will receive the list of notifications.
* @param wikis List of wiki names for which notifications should be received. These must be
* in the "DB name" format, as in "enwiki", "zhwiki", "wikidatawiki", etc.
*/
public void getNotifications(@NonNull final Callback callback, @NonNull String... wikis) {
String wikiList = TextUtils.join("|", wikis);
requestNotifications(service, wikiList).enqueue(new CallbackAdapter(callback));
}
@VisibleForTesting
@NonNull
Call<MwQueryResponse<NotificationObject.QueryNotifications>> requestNotifications(@NonNull Service service, @NonNull String wikiList) {
return service.getNotifications(wikiList);
}
@VisibleForTesting
@NonNull
Call<MwQueryResponse<MarkReadResponse.QueryMarkReadResponse>> requestMarkRead(@NonNull Service service, @NonNull String token, @NonNull String idList) {
return service.markRead(token, idList);
}
@VisibleForTesting
interface Service {
String ACTION = "w/api.php?format=json&formatversion=2&action=";
@GET(ACTION + "query&meta=notifications&notfilter=!read&notprop=list")
@NonNull
Call<MwQueryResponse<NotificationObject.QueryNotifications>> getNotifications(@Query("notwikis") @NonNull String wikiList);
@FormUrlEncoded
@POST(ACTION + "echomarkread")
@NonNull
Call<MwQueryResponse<MarkReadResponse.QueryMarkReadResponse>> markRead(@Field("token") @NonNull String token,
@Field("list") @NonNull String idList);
}
}

View file

@ -1,106 +0,0 @@
package fr.free.nrw.commons.notification;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class NotificationObject {
public static final String TYPE_EDIT_USER_TALK = "edit-user-talk";
public static final String TYPE_REVERTED = "reverted";
public static final String TYPE_EDIT_THANK = "edit-thank";
public static final String WIKIDATA_WIKI = "wikidatawiki";
@SuppressWarnings("unused,NullableProblems") @NonNull
private String wiki;
@SuppressWarnings("unused") private int id;
@SuppressWarnings("unused,NullableProblems") @NonNull private String type;
@SuppressWarnings("unused,NullableProblems") @NonNull private String category;
@SuppressWarnings("unused") private int revid;
@SuppressWarnings("unused,NullableProblems") @NonNull private Title title;
@SuppressWarnings("unused,NullableProblems") @NonNull private Agent agent;
@NonNull public String wiki() {
return wiki;
}
public int id() {
return id;
}
@NonNull public String type() {
return type;
}
@NonNull public Agent agent() {
return agent;
}
@NonNull public Title title() {
return title;
}
public int revID() {
return revid;
}
public boolean isFromWikidata() {
return wiki.equals(WIKIDATA_WIKI);
}
@Override public String toString() {
return Integer.toString(id);
}
public static class Title {
@SuppressWarnings("unused,NullableProblems") @NonNull private String full;
@SuppressWarnings("unused,NullableProblems") @NonNull private String text;
@SuppressWarnings("unused") @Nullable
private String namespace;
@SuppressWarnings("unused") @SerializedName("namespace-key") private int namespaceKey;
@NonNull public String text() {
return text;
}
@NonNull public String full() {
return full;
}
public boolean isMainNamespace() {
return namespaceKey == 0;
}
public void setFull(@NonNull String title) {
full = title;
}
}
public static class Agent {
@SuppressWarnings("unused,NullableProblems") @NonNull private String id;
@SuppressWarnings("unused,NullableProblems") @NonNull private String name;
@NonNull public String name() {
return name;
}
}
public static class NotificationList {
@SuppressWarnings("unused,NullableProblems") @NonNull private List<Notification> list;
@NonNull public List<Notification> getNotifications() {
return list;
}
}
public static class QueryNotifications {
@SuppressWarnings("unused,NullableProblems") @NonNull private NotificationList notifications;
@NonNull public List<Notification> get() {
return notifications.getNotifications();
}
}
}

View file

@ -14,7 +14,6 @@ android.useDeprecatedNdk=true
BUTTERKNIFE_VERSION=8.6.0 BUTTERKNIFE_VERSION=8.6.0
DAGGER_VERSION=2.13 DAGGER_VERSION=2.13
LEAK_CANARY=1.5.4 LEAK_CANARY=1.5.4
RETROFIT_VERSION=2.3.0
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
#TODO: Temporary disabled. https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#aapt2 #TODO: Temporary disabled. https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#aapt2