mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 21:03:54 +01:00
parent
13d847ea77
commit
ccd7b3d3d2
26 changed files with 40 additions and 632 deletions
|
|
@ -6,7 +6,6 @@ import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import fr.free.nrw.commons.media.MediaClient;
|
import fr.free.nrw.commons.media.MediaClient;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
||||||
import io.reactivex.Single;
|
import io.reactivex.Single;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
@ -19,16 +18,13 @@ import timber.log.Timber;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class MediaDataExtractor {
|
public class MediaDataExtractor {
|
||||||
private final MediaWikiApi mediaWikiApi;
|
|
||||||
private final OkHttpJsonApiClient okHttpJsonApiClient;
|
private final OkHttpJsonApiClient okHttpJsonApiClient;
|
||||||
private final MediaClient mediaClient;
|
private final MediaClient mediaClient;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public MediaDataExtractor(MediaWikiApi mwApi,
|
public MediaDataExtractor(OkHttpJsonApiClient okHttpJsonApiClient,
|
||||||
OkHttpJsonApiClient okHttpJsonApiClient,
|
|
||||||
MediaClient mediaClient) {
|
MediaClient mediaClient) {
|
||||||
this.okHttpJsonApiClient = okHttpJsonApiClient;
|
this.okHttpJsonApiClient = okHttpJsonApiClient;
|
||||||
this.mediaWikiApi = mwApi;
|
|
||||||
this.mediaClient = mediaClient;
|
this.mediaClient = mediaClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,6 @@ import fr.free.nrw.commons.contributions.MainActivity;
|
||||||
import fr.free.nrw.commons.di.ApplicationlessInjection;
|
import fr.free.nrw.commons.di.ApplicationlessInjection;
|
||||||
import fr.free.nrw.commons.explore.categories.ExploreActivity;
|
import fr.free.nrw.commons.explore.categories.ExploreActivity;
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.theme.NavigationBaseActivity;
|
import fr.free.nrw.commons.theme.NavigationBaseActivity;
|
||||||
import fr.free.nrw.commons.utils.ConfigUtils;
|
import fr.free.nrw.commons.utils.ConfigUtils;
|
||||||
import fr.free.nrw.commons.utils.ViewUtil;
|
import fr.free.nrw.commons.utils.ViewUtil;
|
||||||
|
|
@ -64,9 +63,6 @@ import timber.log.Timber;
|
||||||
|
|
||||||
public class LoginActivity extends AccountAuthenticatorActivity {
|
public class LoginActivity extends AccountAuthenticatorActivity {
|
||||||
|
|
||||||
@Inject
|
|
||||||
MediaWikiApi mwApi;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
SessionManager sessionManager;
|
SessionManager sessionManager;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,8 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import fr.free.nrw.commons.BuildConfig;
|
import fr.free.nrw.commons.BuildConfig;
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import io.reactivex.Completable;
|
import io.reactivex.Completable;
|
||||||
import io.reactivex.Observable;
|
import io.reactivex.Observable;
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manage the current logged in user session.
|
* Manage the current logged in user session.
|
||||||
|
|
@ -28,17 +26,14 @@ import timber.log.Timber;
|
||||||
@Singleton
|
@Singleton
|
||||||
public class SessionManager {
|
public class SessionManager {
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final MediaWikiApi mediaWikiApi;
|
|
||||||
private Account currentAccount; // Unlike a savings account... ;-)
|
private Account currentAccount; // Unlike a savings account... ;-)
|
||||||
private JsonKvStore defaultKvStore;
|
private JsonKvStore defaultKvStore;
|
||||||
private static final String KEY_RAWUSERNAME = "rawusername";
|
private static final String KEY_RAWUSERNAME = "rawusername";
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SessionManager(Context context,
|
public SessionManager(Context context,
|
||||||
MediaWikiApi mediaWikiApi,
|
|
||||||
@Named("default_preferences") JsonKvStore defaultKvStore) {
|
@Named("default_preferences") JsonKvStore defaultKvStore) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.mediaWikiApi = mediaWikiApi;
|
|
||||||
this.currentAccount = null;
|
this.currentAccount = null;
|
||||||
this.defaultKvStore = defaultKvStore;
|
this.defaultKvStore = defaultKvStore;
|
||||||
}
|
}
|
||||||
|
|
@ -146,7 +141,6 @@ public class SessionManager {
|
||||||
return Completable.fromObservable(Observable.fromArray(allAccounts)
|
return Completable.fromObservable(Observable.fromArray(allAccounts)
|
||||||
.map(a -> accountManager.removeAccount(a, null, null).getResult()))
|
.map(a -> accountManager.removeAccount(a, null, null).getResult()))
|
||||||
.doOnComplete(() -> {
|
.doOnComplete(() -> {
|
||||||
mediaWikiApi.logout();
|
|
||||||
currentAccount = null;
|
currentAccount = null;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,21 @@
|
||||||
package fr.free.nrw.commons.category;
|
package fr.free.nrw.commons.category;
|
||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.upload.GpsCategoryModel;
|
|
||||||
import fr.free.nrw.commons.utils.StringSortingUtils;
|
|
||||||
import io.reactivex.Observable;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
|
||||||
|
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||||
|
import fr.free.nrw.commons.upload.GpsCategoryModel;
|
||||||
|
import fr.free.nrw.commons.utils.StringSortingUtils;
|
||||||
|
import io.reactivex.Observable;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,7 +24,6 @@ import timber.log.Timber;
|
||||||
public class CategoriesModel{
|
public class CategoriesModel{
|
||||||
private static final int SEARCH_CATS_LIMIT = 25;
|
private static final int SEARCH_CATS_LIMIT = 25;
|
||||||
|
|
||||||
private final MediaWikiApi mwApi;
|
|
||||||
private final CategoryClient categoryClient;
|
private final CategoryClient categoryClient;
|
||||||
private final CategoryDao categoryDao;
|
private final CategoryDao categoryDao;
|
||||||
private final JsonKvStore directKvStore;
|
private final JsonKvStore directKvStore;
|
||||||
|
|
@ -32,11 +33,9 @@ public class CategoriesModel{
|
||||||
|
|
||||||
@Inject GpsCategoryModel gpsCategoryModel;
|
@Inject GpsCategoryModel gpsCategoryModel;
|
||||||
@Inject
|
@Inject
|
||||||
public CategoriesModel(MediaWikiApi mwApi,
|
public CategoriesModel(CategoryClient categoryClient,
|
||||||
CategoryClient categoryClient,
|
|
||||||
CategoryDao categoryDao,
|
CategoryDao categoryDao,
|
||||||
@Named("default_preferences") JsonKvStore directKvStore) {
|
@Named("default_preferences") JsonKvStore directKvStore) {
|
||||||
this.mwApi = mwApi;
|
|
||||||
this.categoryClient = categoryClient;
|
this.categoryClient = categoryClient;
|
||||||
this.categoryDao = categoryDao;
|
this.categoryDao = categoryDao;
|
||||||
this.directKvStore = directKvStore;
|
this.directKvStore = directKvStore;
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,16 @@ package fr.free.nrw.commons.category;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import androidx.recyclerview.widget.GridLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.GridLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.pedrogomez.renderers.RVRendererAdapter;
|
import com.pedrogomez.renderers.RVRendererAdapter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -26,10 +27,8 @@ import butterknife.ButterKnife;
|
||||||
import fr.free.nrw.commons.R;
|
import fr.free.nrw.commons.R;
|
||||||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||||
import fr.free.nrw.commons.explore.categories.SearchCategoriesAdapterFactory;
|
import fr.free.nrw.commons.explore.categories.SearchCategoriesAdapterFactory;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.utils.NetworkUtils;
|
import fr.free.nrw.commons.utils.NetworkUtils;
|
||||||
import fr.free.nrw.commons.utils.ViewUtil;
|
import fr.free.nrw.commons.utils.ViewUtil;
|
||||||
import io.reactivex.Observable;
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,5 @@
|
||||||
package fr.free.nrw.commons.contributions;
|
package fr.free.nrw.commons.contributions;
|
||||||
|
|
||||||
import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED;
|
|
||||||
import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION;
|
|
||||||
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
|
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
@ -17,12 +13,19 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
|
import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
|
||||||
import androidx.fragment.app.FragmentTransaction;
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import fr.free.nrw.commons.HandlerService;
|
import fr.free.nrw.commons.HandlerService;
|
||||||
|
|
@ -41,7 +44,6 @@ import fr.free.nrw.commons.location.LocationServiceManager;
|
||||||
import fr.free.nrw.commons.location.LocationUpdateListener;
|
import fr.free.nrw.commons.location.LocationUpdateListener;
|
||||||
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
|
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
|
||||||
import fr.free.nrw.commons.media.MediaDetailPagerFragment.MediaDetailProvider;
|
import fr.free.nrw.commons.media.MediaDetailPagerFragment.MediaDetailProvider;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
||||||
import fr.free.nrw.commons.nearby.NearbyController;
|
import fr.free.nrw.commons.nearby.NearbyController;
|
||||||
import fr.free.nrw.commons.nearby.NearbyNotificationCardView;
|
import fr.free.nrw.commons.nearby.NearbyNotificationCardView;
|
||||||
|
|
@ -57,11 +59,12 @@ import io.reactivex.Observable;
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.disposables.CompositeDisposable;
|
import io.reactivex.disposables.CompositeDisposable;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
import java.util.ArrayList;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.inject.Named;
|
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
|
import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED;
|
||||||
|
import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION;
|
||||||
|
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
|
||||||
|
|
||||||
public class ContributionsFragment
|
public class ContributionsFragment
|
||||||
extends CommonsDaggerSupportFragment
|
extends CommonsDaggerSupportFragment
|
||||||
implements
|
implements
|
||||||
|
|
@ -72,7 +75,6 @@ public class ContributionsFragment
|
||||||
ICampaignsView, ContributionsContract.View {
|
ICampaignsView, ContributionsContract.View {
|
||||||
@Inject @Named("default_preferences") JsonKvStore store;
|
@Inject @Named("default_preferences") JsonKvStore store;
|
||||||
@Inject ContributionDao contributionDao;
|
@Inject ContributionDao contributionDao;
|
||||||
@Inject MediaWikiApi mediaWikiApi;
|
|
||||||
@Inject NearbyController nearbyController;
|
@Inject NearbyController nearbyController;
|
||||||
@Inject OkHttpJsonApiClient okHttpJsonApiClient;
|
@Inject OkHttpJsonApiClient okHttpJsonApiClient;
|
||||||
@Inject CampaignsPresenter presenter;
|
@Inject CampaignsPresenter presenter;
|
||||||
|
|
|
||||||
|
|
@ -10,25 +10,12 @@ import android.content.SyncResult;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import org.wikipedia.dataclient.mwapi.MwQueryLogEvent;
|
|
||||||
import org.wikipedia.dataclient.mwapi.MwQueryResult;
|
|
||||||
import org.wikipedia.util.DateUtil;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
|
||||||
import fr.free.nrw.commons.Utils;
|
|
||||||
import fr.free.nrw.commons.di.ApplicationlessInjection;
|
import fr.free.nrw.commons.di.ApplicationlessInjection;
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||||
import fr.free.nrw.commons.mwapi.LogEventResult;
|
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.mwapi.UserClient;
|
import fr.free.nrw.commons.mwapi.UserClient;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,6 @@ import fr.free.nrw.commons.actions.PageEditInterface;
|
||||||
import fr.free.nrw.commons.category.CategoryInterface;
|
import fr.free.nrw.commons.category.CategoryInterface;
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||||
import fr.free.nrw.commons.media.MediaInterface;
|
import fr.free.nrw.commons.media.MediaInterface;
|
||||||
import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
||||||
import fr.free.nrw.commons.mwapi.UserInterface;
|
import fr.free.nrw.commons.mwapi.UserInterface;
|
||||||
import fr.free.nrw.commons.review.ReviewInterface;
|
import fr.free.nrw.commons.review.ReviewInterface;
|
||||||
|
|
@ -78,14 +76,6 @@ public class NetworkingModule {
|
||||||
return httpLoggingInterceptor;
|
return httpLoggingInterceptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
public MediaWikiApi provideMediaWikiApi(Context context,
|
|
||||||
@Named("default_preferences") JsonKvStore defaultKvStore,
|
|
||||||
Gson gson) {
|
|
||||||
return new ApacheHttpClientMediaWikiApi(BuildConfig.WIKIMEDIA_API_HOST);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
public OkHttpJsonApiClient provideOkHttpJsonApiClient(OkHttpClient okHttpClient,
|
public OkHttpJsonApiClient provideOkHttpJsonApiClient(OkHttpClient okHttpClient,
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,16 @@ package fr.free.nrw.commons.explore.categories;
|
||||||
|
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import androidx.recyclerview.widget.GridLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.GridLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.pedrogomez.renderers.RVRendererAdapter;
|
import com.pedrogomez.renderers.RVRendererAdapter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -31,10 +32,8 @@ import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||||
import fr.free.nrw.commons.explore.recentsearches.RecentSearch;
|
import fr.free.nrw.commons.explore.recentsearches.RecentSearch;
|
||||||
import fr.free.nrw.commons.explore.recentsearches.RecentSearchesDao;
|
import fr.free.nrw.commons.explore.recentsearches.RecentSearchesDao;
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.utils.NetworkUtils;
|
import fr.free.nrw.commons.utils.NetworkUtils;
|
||||||
import fr.free.nrw.commons.utils.ViewUtil;
|
import fr.free.nrw.commons.utils.ViewUtil;
|
||||||
import io.reactivex.Observable;
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
@ -62,7 +61,6 @@ public class SearchCategoryFragment extends CommonsDaggerSupportFragment {
|
||||||
boolean isLoadingCategories;
|
boolean isLoadingCategories;
|
||||||
|
|
||||||
@Inject RecentSearchesDao recentSearchesDao;
|
@Inject RecentSearchesDao recentSearchesDao;
|
||||||
@Inject MediaWikiApi mwApi;
|
|
||||||
@Inject CategoryClient categoryClient;
|
@Inject CategoryClient categoryClient;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,5 @@
|
||||||
package fr.free.nrw.commons.media;
|
package fr.free.nrw.commons.media;
|
||||||
|
|
||||||
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
|
|
||||||
import static android.content.Context.DOWNLOAD_SERVICE;
|
|
||||||
import static fr.free.nrw.commons.Utils.handleWebUrl;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.DownloadManager;
|
import android.app.DownloadManager;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
|
@ -18,10 +14,15 @@ import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||||
import androidx.viewpager.widget.ViewPager;
|
import androidx.viewpager.widget.ViewPager;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import fr.free.nrw.commons.Media;
|
import fr.free.nrw.commons.Media;
|
||||||
|
|
@ -37,18 +38,18 @@ import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||||
import fr.free.nrw.commons.explore.SearchActivity;
|
import fr.free.nrw.commons.explore.SearchActivity;
|
||||||
import fr.free.nrw.commons.explore.categories.ExploreActivity;
|
import fr.free.nrw.commons.explore.categories.ExploreActivity;
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.utils.ImageUtils;
|
import fr.free.nrw.commons.utils.ImageUtils;
|
||||||
import fr.free.nrw.commons.utils.NetworkUtils;
|
import fr.free.nrw.commons.utils.NetworkUtils;
|
||||||
import fr.free.nrw.commons.utils.PermissionUtils;
|
import fr.free.nrw.commons.utils.PermissionUtils;
|
||||||
import fr.free.nrw.commons.utils.ViewUtil;
|
import fr.free.nrw.commons.utils.ViewUtil;
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.inject.Named;
|
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
|
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
|
||||||
|
import static android.content.Context.DOWNLOAD_SERVICE;
|
||||||
|
import static fr.free.nrw.commons.Utils.handleWebUrl;
|
||||||
|
|
||||||
public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment implements ViewPager.OnPageChangeListener {
|
public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment implements ViewPager.OnPageChangeListener {
|
||||||
|
|
||||||
@Inject MediaWikiApi mwApi;
|
|
||||||
@Inject SessionManager sessionManager;
|
@Inject SessionManager sessionManager;
|
||||||
@Inject @Named("default_preferences") JsonKvStore store;
|
@Inject @Named("default_preferences") JsonKvStore store;
|
||||||
@Inject BookmarkPicturesDao bookmarkDao;
|
@Inject BookmarkPicturesDao bookmarkDao;
|
||||||
|
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
package fr.free.nrw.commons.mwapi;
|
|
||||||
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import org.apache.http.conn.ClientConnectionManager;
|
|
||||||
import org.apache.http.conn.scheme.PlainSocketFactory;
|
|
||||||
import org.apache.http.conn.scheme.Scheme;
|
|
||||||
import org.apache.http.conn.scheme.SchemeRegistry;
|
|
||||||
import org.apache.http.conn.ssl.SSLSocketFactory;
|
|
||||||
import org.apache.http.impl.client.AbstractHttpClient;
|
|
||||||
import org.apache.http.impl.client.DefaultHttpClient;
|
|
||||||
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
|
|
||||||
import org.apache.http.params.BasicHttpParams;
|
|
||||||
import org.apache.http.params.CoreProtocolPNames;
|
|
||||||
import org.wikipedia.util.DateUtil;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import fr.free.nrw.commons.BuildConfig;
|
|
||||||
import fr.free.nrw.commons.CommonsApplication;
|
|
||||||
|
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Addshore
|
|
||||||
*/
|
|
||||||
public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
|
|
||||||
private AbstractHttpClient httpClient;
|
|
||||||
private CustomMwApi api;
|
|
||||||
|
|
||||||
public ApacheHttpClientMediaWikiApi(String apiURL) {
|
|
||||||
BasicHttpParams params = new BasicHttpParams();
|
|
||||||
SchemeRegistry schemeRegistry = new SchemeRegistry();
|
|
||||||
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
|
|
||||||
final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
|
|
||||||
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
|
|
||||||
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
|
|
||||||
params.setParameter(CoreProtocolPNames.USER_AGENT, CommonsApplication.getInstance().getUserAgent());
|
|
||||||
httpClient = new DefaultHttpClient(cm, params);
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
httpClient.addRequestInterceptor(NetworkInterceptors.getHttpRequestInterceptor());
|
|
||||||
}
|
|
||||||
api = new CustomMwApi(apiURL, httpClient);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calls media wiki's logout API
|
|
||||||
*/
|
|
||||||
public void logout() {
|
|
||||||
try {
|
|
||||||
api.logout();
|
|
||||||
} catch (IOException e) {
|
|
||||||
Timber.e(e, "Error occurred while logging out");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
||||||
package fr.free.nrw.commons.mwapi;
|
|
||||||
|
|
||||||
import org.apache.http.client.HttpClient;
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Node;
|
|
||||||
import org.w3c.dom.NodeList;
|
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
|
|
||||||
import java.io.IOError;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.transform.Transformer;
|
|
||||||
import javax.xml.transform.TransformerException;
|
|
||||||
import javax.xml.transform.TransformerFactory;
|
|
||||||
import javax.xml.transform.dom.DOMSource;
|
|
||||||
import javax.xml.transform.stream.StreamResult;
|
|
||||||
import javax.xml.xpath.XPath;
|
|
||||||
import javax.xml.xpath.XPathConstants;
|
|
||||||
import javax.xml.xpath.XPathExpressionException;
|
|
||||||
import javax.xml.xpath.XPathFactory;
|
|
||||||
|
|
||||||
import in.yuvi.http.fluent.Http;
|
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
public class CustomApiResult {
|
|
||||||
private Node doc;
|
|
||||||
private XPath evaluator;
|
|
||||||
|
|
||||||
CustomApiResult(Node doc) {
|
|
||||||
this.doc = doc;
|
|
||||||
this.evaluator = XPathFactory.newInstance().newXPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
static CustomApiResult fromRequestBuilder(String requestIdentifier, Http.HttpRequestBuilder builder, HttpClient client) throws IOException {
|
|
||||||
try {
|
|
||||||
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
|
||||||
Document doc = docBuilder.parse(builder.use(client).charset("utf-8").data("format", "xml").asResponse().getEntity().getContent());
|
|
||||||
printStringFromDocument(requestIdentifier, doc);
|
|
||||||
return new CustomApiResult(doc);
|
|
||||||
} catch (ParserConfigurationException e) {
|
|
||||||
// I don't know wtf I can do about this on...
|
|
||||||
Timber.e(e, "Error occurred while parsing the response for method %s", requestIdentifier);
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (IllegalStateException e) {
|
|
||||||
// So, this should never actually happen - since we assume MediaWiki always generates valid json
|
|
||||||
// So the only thing causing this would be a network truncation
|
|
||||||
// Sooo... I can throw IOError
|
|
||||||
// Thanks Java, for making me spend significant time on shit that happens once in a bluemoon
|
|
||||||
// I surely am writing Nuclear Submarine controller code
|
|
||||||
Timber.e(e, "Error occurred while parsing the response for method %s", requestIdentifier);
|
|
||||||
throw new IOError(e);
|
|
||||||
} catch (SAXException e) {
|
|
||||||
// See Rant above
|
|
||||||
Timber.e(e, "Error occurred while parsing the response for method %s", requestIdentifier);
|
|
||||||
throw new IOError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void printStringFromDocument(String requestIdentifier, Document doc)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
DOMSource domSource = new DOMSource(doc);
|
|
||||||
StringWriter writer = new StringWriter();
|
|
||||||
StreamResult result = new StreamResult(writer);
|
|
||||||
TransformerFactory tf = TransformerFactory.newInstance();
|
|
||||||
Transformer transformer = tf.newTransformer();
|
|
||||||
transformer.transform(domSource, result);
|
|
||||||
Timber.d("API response for method %s is\n %s", requestIdentifier, writer.toString());
|
|
||||||
}
|
|
||||||
catch(TransformerException ex)
|
|
||||||
{
|
|
||||||
Timber.e(ex, "Error occurred in transforming response for method %s", requestIdentifier);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Node getDocument() {
|
|
||||||
return doc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<CustomApiResult> getNodes(String xpath) {
|
|
||||||
try {
|
|
||||||
ArrayList<CustomApiResult> results = new ArrayList<>();
|
|
||||||
NodeList nodes = (NodeList) evaluator.evaluate(xpath, doc, XPathConstants.NODESET);
|
|
||||||
for(int i = 0; i < nodes.getLength(); i++) {
|
|
||||||
results.add(new CustomApiResult(nodes.item(i)));
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
} catch (XPathExpressionException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
public CustomApiResult getNode(String xpath) {
|
|
||||||
try {
|
|
||||||
return new CustomApiResult((Node) evaluator.evaluate(xpath, doc, XPathConstants.NODE));
|
|
||||||
} catch (XPathExpressionException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getNumber(String xpath) {
|
|
||||||
try {
|
|
||||||
return (Double) evaluator.evaluate(xpath, doc, XPathConstants.NUMBER);
|
|
||||||
} catch (XPathExpressionException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getString(String xpath) {
|
|
||||||
try {
|
|
||||||
return (String) evaluator.evaluate(xpath, doc, XPathConstants.STRING);
|
|
||||||
} catch (XPathExpressionException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,188 +0,0 @@
|
||||||
package fr.free.nrw.commons.mwapi;
|
|
||||||
|
|
||||||
import org.apache.http.cookie.Cookie;
|
|
||||||
import org.apache.http.impl.client.AbstractHttpClient;
|
|
||||||
import org.apache.http.impl.cookie.BasicClientCookie;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import in.yuvi.http.fluent.Http;
|
|
||||||
import in.yuvi.http.fluent.ProgressListener;
|
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
public class CustomMwApi {
|
|
||||||
public class RequestBuilder {
|
|
||||||
private HashMap<String, Object> params;
|
|
||||||
private CustomMwApi api;
|
|
||||||
|
|
||||||
RequestBuilder(CustomMwApi api) {
|
|
||||||
params = new HashMap<>();
|
|
||||||
this.api = api;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RequestBuilder param(String key, Object value) {
|
|
||||||
params.put(key, value);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CustomApiResult get() throws IOException {
|
|
||||||
return api.makeRequest("GET", params);
|
|
||||||
}
|
|
||||||
|
|
||||||
public CustomApiResult post() throws IOException {
|
|
||||||
return api.makeRequest("POST", params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private AbstractHttpClient client;
|
|
||||||
private String apiURL;
|
|
||||||
public boolean isLoggedIn;
|
|
||||||
private String authCookie = null;
|
|
||||||
private String userName = null;
|
|
||||||
private String userID = null;
|
|
||||||
|
|
||||||
public CustomMwApi(String apiURL, AbstractHttpClient client) {
|
|
||||||
this.apiURL = apiURL;
|
|
||||||
this.client = client;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RequestBuilder action(String action) {
|
|
||||||
RequestBuilder builder = new RequestBuilder(this);
|
|
||||||
builder.param("action", action);
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAuthCookie() {
|
|
||||||
if (authCookie == null){
|
|
||||||
authCookie = "";
|
|
||||||
List<Cookie> cookies = client.getCookieStore().getCookies();
|
|
||||||
for(Cookie cookie: cookies) {
|
|
||||||
authCookie += cookie.getName() + "=" + cookie.getValue() + ";";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return authCookie;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAuthCookie(String authCookie) {
|
|
||||||
if (authCookie == null) {//If the authCookie is null, no need to proceed
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.authCookie = authCookie;
|
|
||||||
this.isLoggedIn = true;
|
|
||||||
String[] cookies = authCookie.split(";");
|
|
||||||
String domain;
|
|
||||||
try {
|
|
||||||
domain = new URL(apiURL).getHost();
|
|
||||||
} catch (MalformedURLException e) {
|
|
||||||
// Mighty well better not happen!
|
|
||||||
e.printStackTrace();
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
// This works because I know which cookies are going to be set by MediaWiki, and they don't contain a = or ; in them :D
|
|
||||||
for(String cookie: cookies) {
|
|
||||||
String[] parts = cookie.split("=");
|
|
||||||
BasicClientCookie c = new BasicClientCookie(parts[0], parts[1]);
|
|
||||||
c.setDomain(domain);
|
|
||||||
client.getCookieStore().addCookie(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeAllCookies() {
|
|
||||||
client.getCookieStore().clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean validateLogin() throws IOException {
|
|
||||||
CustomApiResult userMeta = this.action("query").param("meta", "userinfo").get();
|
|
||||||
this.userID = userMeta.getString("/api/query/userinfo/@id");
|
|
||||||
this.userName = userMeta.getString("/api/query/userinfo/@name");
|
|
||||||
Timber.d("User id is %s and user name is %s", userID, userName);
|
|
||||||
return !userID.equals("0");
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserID() throws IOException {
|
|
||||||
if (this.userID == null || this.userID.equals("0")) {
|
|
||||||
this.validateLogin();
|
|
||||||
}
|
|
||||||
return userID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserName() throws IOException {
|
|
||||||
if (this.userID == null || this.userID.equals("0")) {
|
|
||||||
this.validateLogin();
|
|
||||||
}
|
|
||||||
return userName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String login(String username, String password) throws IOException {
|
|
||||||
CustomApiResult tokenData = this.action("login").param("lgname", username).param("lgpassword", password).post();
|
|
||||||
String result = tokenData.getString("/api/login/@result");
|
|
||||||
if (result.equals("NeedToken")) {
|
|
||||||
String token = tokenData.getString("/api/login/@token");
|
|
||||||
CustomApiResult confirmData = this.action("login").param("lgname", username).param("lgpassword", password).param("lgtoken", token).post();
|
|
||||||
String finalResult = confirmData.getString("/api/login/@result");
|
|
||||||
if (finalResult.equals("Success")) {
|
|
||||||
isLoggedIn = true;
|
|
||||||
}
|
|
||||||
return finalResult;
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public CustomApiResult uploadToStash(String filename, InputStream file, long length, String token, ProgressListener uploadProgressListener) throws IOException {
|
|
||||||
Timber.d("Initiating upload for file %s", filename);
|
|
||||||
Http.HttpRequestBuilder builder = Http.multipart(apiURL)
|
|
||||||
.data("action", "upload")
|
|
||||||
.data("stash", "1")
|
|
||||||
.data("token", token)
|
|
||||||
.data("ignorewarnings", "1")
|
|
||||||
.data("filename", filename)
|
|
||||||
.sendProgressListener(uploadProgressListener);
|
|
||||||
if (length != -1) {
|
|
||||||
builder.file("file", filename, file, length);
|
|
||||||
} else {
|
|
||||||
builder.file("file", filename, file);
|
|
||||||
}
|
|
||||||
|
|
||||||
return CustomApiResult.fromRequestBuilder("uploadToStash", builder, client);
|
|
||||||
}
|
|
||||||
|
|
||||||
public CustomApiResult uploadFromStash(String filename, String filekey, String text, String comment, String token) throws IOException {
|
|
||||||
Http.HttpRequestBuilder builder = Http.multipart(apiURL)
|
|
||||||
.data("action", "upload")
|
|
||||||
.data("token", token)
|
|
||||||
.data("ignorewarnings", "1")
|
|
||||||
.data("text", text)
|
|
||||||
.data("comment", comment)
|
|
||||||
.data("filename", filename)
|
|
||||||
.data("filekey", filekey);
|
|
||||||
|
|
||||||
return CustomApiResult.fromRequestBuilder("uploadFromStash", builder, client);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void logout() throws IOException {
|
|
||||||
// I should be doing more validation here, but meh
|
|
||||||
isLoggedIn = false;
|
|
||||||
this.action("logout").post();
|
|
||||||
removeAllCookies();
|
|
||||||
authCookie = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private CustomApiResult makeRequest(String method, HashMap<String, Object> params) throws IOException {
|
|
||||||
Http.HttpRequestBuilder builder;
|
|
||||||
if (method.equals("POST")) {
|
|
||||||
builder = Http.post(apiURL);
|
|
||||||
} else {
|
|
||||||
builder = Http.get(apiURL);
|
|
||||||
}
|
|
||||||
builder.data(params);
|
|
||||||
return CustomApiResult.fromRequestBuilder(apiURL, builder, client);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
package fr.free.nrw.commons.mwapi;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class LogEventResult {
|
|
||||||
private final List<LogEvent> logEvents;
|
|
||||||
private final String queryContinue;
|
|
||||||
|
|
||||||
LogEventResult(@NonNull List<LogEvent> logEvents, String queryContinue) {
|
|
||||||
this.logEvents = logEvents;
|
|
||||||
this.queryContinue = queryContinue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
public List<LogEvent> getLogEvents() {
|
|
||||||
return logEvents;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public String getQueryContinue() {
|
|
||||||
return queryContinue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class LogEvent {
|
|
||||||
private final String pageId;
|
|
||||||
private final String filename;
|
|
||||||
private final Date dateUpdated;
|
|
||||||
|
|
||||||
LogEvent(String pageId, String filename, Date dateUpdated) {
|
|
||||||
this.pageId = pageId;
|
|
||||||
this.filename = filename;
|
|
||||||
this.dateUpdated = dateUpdated;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDeleted() {
|
|
||||||
return pageId.equals("0");
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFilename() {
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Date getDateUpdated() {
|
|
||||||
return dateUpdated;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
package fr.free.nrw.commons.mwapi;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import io.reactivex.Single;
|
|
||||||
|
|
||||||
public interface MediaWikiApi {
|
|
||||||
|
|
||||||
void logout();
|
|
||||||
|
|
||||||
// Single<CampaignResponseDTO> getCampaigns();
|
|
||||||
|
|
||||||
interface ProgressListener {
|
|
||||||
void onProgress(long transferred, long total);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
||||||
package fr.free.nrw.commons.mwapi;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import org.apache.http.Header;
|
|
||||||
import org.apache.http.HttpRequest;
|
|
||||||
import org.apache.http.HttpRequestInterceptor;
|
|
||||||
import org.apache.http.impl.client.ClientParamsStack;
|
|
||||||
import org.apache.http.params.HttpParamsNames;
|
|
||||||
import org.apache.http.protocol.HttpContext;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
public class NetworkInterceptors {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interceptor to log the HTTP request
|
|
||||||
*/
|
|
||||||
@NonNull
|
|
||||||
public static HttpRequestInterceptor getHttpRequestInterceptor() {
|
|
||||||
return (HttpRequest request, HttpContext httpContext) -> {
|
|
||||||
Timber.v("<<<<<<<<<<<<<< START OF REQUEST LOGGING [%s] >>>>>>>>>>>>", request.getRequestLine().getUri());
|
|
||||||
|
|
||||||
Timber.v("Request line:\n %s", request.getRequestLine().toString());
|
|
||||||
logRequestParams(request);
|
|
||||||
logRequestHeaders(request);
|
|
||||||
Timber.v("Protocol version:\n %s", request.getProtocolVersion());
|
|
||||||
|
|
||||||
Timber.v("<<<<<<<<<<<<<< END OF REQUEST LOGGING [%s] >>>>>>>>>>>>", request.getRequestLine().getUri());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Log all request params from a HTTPRequest
|
|
||||||
* @param request
|
|
||||||
*/
|
|
||||||
private static void logRequestParams(HttpRequest request) {
|
|
||||||
Set<String> names = new HashSet<>();
|
|
||||||
if (request.getParams() instanceof ClientParamsStack) {
|
|
||||||
ClientParamsStack cps = (ClientParamsStack) request.getParams();
|
|
||||||
if (cps.getApplicationParams() != null
|
|
||||||
&& cps.getRequestParams() instanceof HttpParamsNames) {
|
|
||||||
names.addAll(((HttpParamsNames) cps.getApplicationParams()).getNames());
|
|
||||||
}
|
|
||||||
if (cps.getClientParams() != null
|
|
||||||
&& cps.getClientParams() instanceof HttpParamsNames) {
|
|
||||||
names.addAll(((HttpParamsNames) cps.getClientParams()).getNames());
|
|
||||||
}
|
|
||||||
if (cps.getRequestParams() != null
|
|
||||||
&& cps.getRequestParams() instanceof HttpParamsNames) {
|
|
||||||
names.addAll(((HttpParamsNames) cps.getRequestParams()).getNames());
|
|
||||||
}
|
|
||||||
if (cps.getOverrideParams() != null
|
|
||||||
&& cps.getRequestParams() instanceof HttpParamsNames) {
|
|
||||||
names.addAll(((HttpParamsNames) cps.getOverrideParams()).getNames());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
HttpParamsNames params = (HttpParamsNames) request.getParams();
|
|
||||||
names = params.getNames();
|
|
||||||
}
|
|
||||||
|
|
||||||
Timber.v("<<<<<<<<<<<<<< REQUEST PARAMS >>>>>>>>>>>>");
|
|
||||||
for (String name : names) {
|
|
||||||
Timber.v("Param >> %s: %s", name, request.getParams().getParameter(name));
|
|
||||||
}
|
|
||||||
Timber.v("<<<<<<<<<<<<<< REQUEST PARAMS >>>>>>>>>>>>");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Log all headers from a HTTPRequest
|
|
||||||
* @param request
|
|
||||||
*/
|
|
||||||
private static void logRequestHeaders(HttpRequest request) {
|
|
||||||
Header[] headerFields = request.getAllHeaders();
|
|
||||||
|
|
||||||
Timber.v("<<<<<<<<<<<<<< HEADERS >>>>>>>>>>>>");
|
|
||||||
for (int e = 0; e < request.getAllHeaders().length; e++) {
|
|
||||||
Timber.v("Header >> %s: %s", headerFields[e].getName(), headerFields[e].getValue());
|
|
||||||
}
|
|
||||||
Timber.v("<<<<<<<<<<<<<< HEADERS >>>>>>>>>>>>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -47,7 +47,7 @@ public class QuizChecker {
|
||||||
/**
|
/**
|
||||||
* constructor to set the parameters for quiz
|
* constructor to set the parameters for quiz
|
||||||
* @param sessionManager
|
* @param sessionManager
|
||||||
* @param okHttpJsonApiClient instance of MediaWikiApi
|
* @param okHttpJsonApiClient
|
||||||
*/
|
*/
|
||||||
@Inject
|
@Inject
|
||||||
public QuizChecker(SessionManager sessionManager,
|
public QuizChecker(SessionManager sessionManager,
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@ import butterknife.ButterKnife;
|
||||||
import fr.free.nrw.commons.Media;
|
import fr.free.nrw.commons.Media;
|
||||||
import fr.free.nrw.commons.R;
|
import fr.free.nrw.commons.R;
|
||||||
import fr.free.nrw.commons.delete.DeleteHelper;
|
import fr.free.nrw.commons.delete.DeleteHelper;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.theme.NavigationBaseActivity;
|
import fr.free.nrw.commons.theme.NavigationBaseActivity;
|
||||||
import fr.free.nrw.commons.utils.DialogUtil;
|
import fr.free.nrw.commons.utils.DialogUtil;
|
||||||
import fr.free.nrw.commons.utils.ViewUtil;
|
import fr.free.nrw.commons.utils.ViewUtil;
|
||||||
|
|
@ -58,8 +57,6 @@ public class ReviewActivity extends NavigationBaseActivity {
|
||||||
public ReviewPagerAdapter reviewPagerAdapter;
|
public ReviewPagerAdapter reviewPagerAdapter;
|
||||||
public ReviewController reviewController;
|
public ReviewController reviewController;
|
||||||
@Inject
|
@Inject
|
||||||
MediaWikiApi mwApi;
|
|
||||||
@Inject
|
|
||||||
ReviewHelper reviewHelper;
|
ReviewHelper reviewHelper;
|
||||||
@Inject
|
@Inject
|
||||||
DeleteHelper deleteHelper;
|
DeleteHelper deleteHelper;
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,6 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import fr.free.nrw.commons.Media;
|
import fr.free.nrw.commons.Media;
|
||||||
import fr.free.nrw.commons.media.MediaClient;
|
import fr.free.nrw.commons.media.MediaClient;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
|
||||||
import io.reactivex.Observable;
|
import io.reactivex.Observable;
|
||||||
import io.reactivex.Single;
|
import io.reactivex.Single;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import fr.free.nrw.commons.media.MediaClient;
|
import fr.free.nrw.commons.media.MediaClient;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.nearby.Place;
|
import fr.free.nrw.commons.nearby.Place;
|
||||||
import fr.free.nrw.commons.utils.ImageUtils;
|
import fr.free.nrw.commons.utils.ImageUtils;
|
||||||
import fr.free.nrw.commons.utils.ImageUtilsWrapper;
|
import fr.free.nrw.commons.utils.ImageUtilsWrapper;
|
||||||
|
|
@ -32,7 +31,6 @@ import static fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK;
|
||||||
public class ImageProcessingService {
|
public class ImageProcessingService {
|
||||||
private final FileUtilsWrapper fileUtilsWrapper;
|
private final FileUtilsWrapper fileUtilsWrapper;
|
||||||
private final ImageUtilsWrapper imageUtilsWrapper;
|
private final ImageUtilsWrapper imageUtilsWrapper;
|
||||||
private final MediaWikiApi mwApi;
|
|
||||||
private final ReadFBMD readFBMD;
|
private final ReadFBMD readFBMD;
|
||||||
private final EXIFReader EXIFReader;
|
private final EXIFReader EXIFReader;
|
||||||
private final MediaClient mediaClient;
|
private final MediaClient mediaClient;
|
||||||
|
|
@ -41,11 +39,10 @@ public class ImageProcessingService {
|
||||||
@Inject
|
@Inject
|
||||||
public ImageProcessingService(FileUtilsWrapper fileUtilsWrapper,
|
public ImageProcessingService(FileUtilsWrapper fileUtilsWrapper,
|
||||||
ImageUtilsWrapper imageUtilsWrapper,
|
ImageUtilsWrapper imageUtilsWrapper,
|
||||||
MediaWikiApi mwApi, ReadFBMD readFBMD, EXIFReader EXIFReader,
|
ReadFBMD readFBMD, EXIFReader EXIFReader,
|
||||||
MediaClient mediaClient, Context context) {
|
MediaClient mediaClient, Context context) {
|
||||||
this.fileUtilsWrapper = fileUtilsWrapper;
|
this.fileUtilsWrapper = fileUtilsWrapper;
|
||||||
this.imageUtilsWrapper = imageUtilsWrapper;
|
this.imageUtilsWrapper = imageUtilsWrapper;
|
||||||
this.mwApi = mwApi;
|
|
||||||
this.readFBMD = readFBMD;
|
this.readFBMD = readFBMD;
|
||||||
this.EXIFReader = EXIFReader;
|
this.EXIFReader = EXIFReader;
|
||||||
this.mediaClient = mediaClient;
|
this.mediaClient = mediaClient;
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ import fr.free.nrw.commons.contributions.ContributionDao;
|
||||||
import fr.free.nrw.commons.contributions.ContributionsContentProvider;
|
import fr.free.nrw.commons.contributions.ContributionsContentProvider;
|
||||||
import fr.free.nrw.commons.contributions.MainActivity;
|
import fr.free.nrw.commons.contributions.MainActivity;
|
||||||
import fr.free.nrw.commons.media.MediaClient;
|
import fr.free.nrw.commons.media.MediaClient;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.utils.CommonsDateUtil;
|
import fr.free.nrw.commons.utils.CommonsDateUtil;
|
||||||
import fr.free.nrw.commons.wikidata.WikidataEditService;
|
import fr.free.nrw.commons.wikidata.WikidataEditService;
|
||||||
import io.reactivex.Observable;
|
import io.reactivex.Observable;
|
||||||
|
|
@ -45,7 +44,6 @@ public class UploadService extends HandlerService<Contribution> {
|
||||||
public static final String EXTRA_FILES = EXTRA_PREFIX + ".files";
|
public static final String EXTRA_FILES = EXTRA_PREFIX + ".files";
|
||||||
public static final String EXTRA_CAMPAIGN = EXTRA_PREFIX + ".campaign";
|
public static final String EXTRA_CAMPAIGN = EXTRA_PREFIX + ".campaign";
|
||||||
|
|
||||||
@Inject MediaWikiApi mwApi;
|
|
||||||
@Inject WikidataEditService wikidataEditService;
|
@Inject WikidataEditService wikidataEditService;
|
||||||
@Inject SessionManager sessionManager;
|
@Inject SessionManager sessionManager;
|
||||||
@Inject ContributionDao contributionDao;
|
@Inject ContributionDao contributionDao;
|
||||||
|
|
@ -88,7 +86,6 @@ public class UploadService extends HandlerService<Contribution> {
|
||||||
this.contribution = contribution;
|
this.contribution = contribution;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onProgress(long transferred, long total) {
|
public void onProgress(long transferred, long total) {
|
||||||
Timber.d("Uploaded %d of %d", transferred, total);
|
Timber.d("Uploaded %d of %d", transferred, total);
|
||||||
if (!notificationTitleChanged) {
|
if (!notificationTitleChanged) {
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ import javax.inject.Singleton;
|
||||||
import fr.free.nrw.commons.R;
|
import fr.free.nrw.commons.R;
|
||||||
import fr.free.nrw.commons.actions.PageEditClient;
|
import fr.free.nrw.commons.actions.PageEditClient;
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
|
||||||
import fr.free.nrw.commons.utils.ViewUtil;
|
import fr.free.nrw.commons.utils.ViewUtil;
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
|
|
@ -20,7 +19,7 @@ import timber.log.Timber;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is meant to handle the Wikidata edits made through the app
|
* This class is meant to handle the Wikidata edits made through the app
|
||||||
* It will talk with MediaWikiApi to make necessary API calls, log the edits and fire listeners
|
* It will talk with MediaWiki Apis to make the necessary calls, log the edits and fire listeners
|
||||||
* on successful edits
|
* on successful edits
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package fr.free.nrw.commons
|
package fr.free.nrw.commons
|
||||||
|
|
||||||
import fr.free.nrw.commons.media.MediaClient
|
import fr.free.nrw.commons.media.MediaClient
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi
|
|
||||||
import io.reactivex.Single
|
import io.reactivex.Single
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
|
|
@ -18,12 +17,8 @@ import org.mockito.MockitoAnnotations
|
||||||
*/
|
*/
|
||||||
class MediaDataExtractorTest {
|
class MediaDataExtractorTest {
|
||||||
|
|
||||||
@Mock
|
|
||||||
internal var mwApi: MediaWikiApi? = null
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
internal var mediaClient: MediaClient? = null
|
internal var mediaClient: MediaClient? = null
|
||||||
|
|
||||||
@InjectMocks
|
@InjectMocks
|
||||||
var mediaDataExtractor: MediaDataExtractor? = null
|
var mediaDataExtractor: MediaDataExtractor? = null
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package fr.free.nrw.commons.review
|
||||||
|
|
||||||
import fr.free.nrw.commons.Media
|
import fr.free.nrw.commons.Media
|
||||||
import fr.free.nrw.commons.media.MediaClient
|
import fr.free.nrw.commons.media.MediaClient
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi
|
|
||||||
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient
|
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
import io.reactivex.Single
|
import io.reactivex.Single
|
||||||
import junit.framework.Assert.assertNotNull
|
import junit.framework.Assert.assertNotNull
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package fr.free.nrw.commons.upload
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import fr.free.nrw.commons.location.LatLng
|
import fr.free.nrw.commons.location.LatLng
|
||||||
import fr.free.nrw.commons.media.MediaClient
|
import fr.free.nrw.commons.media.MediaClient
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi
|
|
||||||
import fr.free.nrw.commons.nearby.Place
|
import fr.free.nrw.commons.nearby.Place
|
||||||
import fr.free.nrw.commons.utils.ImageUtils
|
import fr.free.nrw.commons.utils.ImageUtils
|
||||||
import fr.free.nrw.commons.utils.ImageUtilsWrapper
|
import fr.free.nrw.commons.utils.ImageUtilsWrapper
|
||||||
|
|
@ -24,8 +23,6 @@ class u {
|
||||||
@Mock
|
@Mock
|
||||||
internal var imageUtilsWrapper: ImageUtilsWrapper? = null
|
internal var imageUtilsWrapper: ImageUtilsWrapper? = null
|
||||||
@Mock
|
@Mock
|
||||||
internal var mwApi: MediaWikiApi? = null
|
|
||||||
@Mock
|
|
||||||
internal var readFBMD: ReadFBMD?=null
|
internal var readFBMD: ReadFBMD?=null
|
||||||
@Mock
|
@Mock
|
||||||
internal var readEXIF: EXIFReader?=null
|
internal var readEXIF: EXIFReader?=null
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,10 @@ import android.content.Context
|
||||||
import fr.free.nrw.commons.auth.SessionManager
|
import fr.free.nrw.commons.auth.SessionManager
|
||||||
import fr.free.nrw.commons.filepicker.UploadableFile
|
import fr.free.nrw.commons.filepicker.UploadableFile
|
||||||
import fr.free.nrw.commons.kvstore.JsonKvStore
|
import fr.free.nrw.commons.kvstore.JsonKvStore
|
||||||
import fr.free.nrw.commons.mwapi.MediaWikiApi
|
|
||||||
import fr.free.nrw.commons.nearby.Place
|
import fr.free.nrw.commons.nearby.Place
|
||||||
import fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK
|
import fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK
|
||||||
import io.reactivex.Single
|
import io.reactivex.Single
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Assert.assertFalse
|
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
@ -41,8 +39,6 @@ class UploadModelTest {
|
||||||
@Mock
|
@Mock
|
||||||
internal var context: Context? = null
|
internal var context: Context? = null
|
||||||
@Mock
|
@Mock
|
||||||
internal var mwApi: MediaWikiApi? = null
|
|
||||||
@Mock
|
|
||||||
internal var sessionManage: SessionManager? = null
|
internal var sessionManage: SessionManager? = null
|
||||||
@Mock
|
@Mock
|
||||||
internal var fileUtilsWrapper: FileUtilsWrapper? = null
|
internal var fileUtilsWrapper: FileUtilsWrapper? = null
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue