mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 12:53:55 +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 fr.free.nrw.commons.media.MediaClient;
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
||||
import io.reactivex.Single;
|
||||
import timber.log.Timber;
|
||||
|
|
@ -19,16 +18,13 @@ import timber.log.Timber;
|
|||
*/
|
||||
@Singleton
|
||||
public class MediaDataExtractor {
|
||||
private final MediaWikiApi mediaWikiApi;
|
||||
private final OkHttpJsonApiClient okHttpJsonApiClient;
|
||||
private final MediaClient mediaClient;
|
||||
|
||||
@Inject
|
||||
public MediaDataExtractor(MediaWikiApi mwApi,
|
||||
OkHttpJsonApiClient okHttpJsonApiClient,
|
||||
public MediaDataExtractor(OkHttpJsonApiClient okHttpJsonApiClient,
|
||||
MediaClient mediaClient) {
|
||||
this.okHttpJsonApiClient = okHttpJsonApiClient;
|
||||
this.mediaWikiApi = mwApi;
|
||||
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.explore.categories.ExploreActivity;
|
||||
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.utils.ConfigUtils;
|
||||
import fr.free.nrw.commons.utils.ViewUtil;
|
||||
|
|
@ -64,9 +63,6 @@ import timber.log.Timber;
|
|||
|
||||
public class LoginActivity extends AccountAuthenticatorActivity {
|
||||
|
||||
@Inject
|
||||
MediaWikiApi mwApi;
|
||||
|
||||
@Inject
|
||||
SessionManager sessionManager;
|
||||
|
||||
|
|
|
|||
|
|
@ -17,10 +17,8 @@ import javax.inject.Singleton;
|
|||
|
||||
import fr.free.nrw.commons.BuildConfig;
|
||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import io.reactivex.Completable;
|
||||
import io.reactivex.Observable;
|
||||
import timber.log.Timber;
|
||||
|
||||
/**
|
||||
* Manage the current logged in user session.
|
||||
|
|
@ -28,17 +26,14 @@ import timber.log.Timber;
|
|||
@Singleton
|
||||
public class SessionManager {
|
||||
private final Context context;
|
||||
private final MediaWikiApi mediaWikiApi;
|
||||
private Account currentAccount; // Unlike a savings account... ;-)
|
||||
private JsonKvStore defaultKvStore;
|
||||
private static final String KEY_RAWUSERNAME = "rawusername";
|
||||
|
||||
@Inject
|
||||
public SessionManager(Context context,
|
||||
MediaWikiApi mediaWikiApi,
|
||||
@Named("default_preferences") JsonKvStore defaultKvStore) {
|
||||
this.context = context;
|
||||
this.mediaWikiApi = mediaWikiApi;
|
||||
this.currentAccount = null;
|
||||
this.defaultKvStore = defaultKvStore;
|
||||
}
|
||||
|
|
@ -146,7 +141,6 @@ public class SessionManager {
|
|||
return Completable.fromObservable(Observable.fromArray(allAccounts)
|
||||
.map(a -> accountManager.removeAccount(a, null, null).getResult()))
|
||||
.doOnComplete(() -> {
|
||||
mediaWikiApi.logout();
|
||||
currentAccount = null;
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,19 +1,21 @@
|
|||
package fr.free.nrw.commons.category;
|
||||
|
||||
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.Calendar;
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
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;
|
||||
|
||||
/**
|
||||
|
|
@ -22,7 +24,6 @@ import timber.log.Timber;
|
|||
public class CategoriesModel{
|
||||
private static final int SEARCH_CATS_LIMIT = 25;
|
||||
|
||||
private final MediaWikiApi mwApi;
|
||||
private final CategoryClient categoryClient;
|
||||
private final CategoryDao categoryDao;
|
||||
private final JsonKvStore directKvStore;
|
||||
|
|
@ -32,11 +33,9 @@ public class CategoriesModel{
|
|||
|
||||
@Inject GpsCategoryModel gpsCategoryModel;
|
||||
@Inject
|
||||
public CategoriesModel(MediaWikiApi mwApi,
|
||||
CategoryClient categoryClient,
|
||||
public CategoriesModel(CategoryClient categoryClient,
|
||||
CategoryDao categoryDao,
|
||||
@Named("default_preferences") JsonKvStore directKvStore) {
|
||||
this.mwApi = mwApi;
|
||||
this.categoryClient = categoryClient;
|
||||
this.categoryDao = categoryDao;
|
||||
this.directKvStore = directKvStore;
|
||||
|
|
|
|||
|
|
@ -4,15 +4,16 @@ package fr.free.nrw.commons.category;
|
|||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
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.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ProgressBar;
|
||||
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 java.util.ArrayList;
|
||||
|
|
@ -26,10 +27,8 @@ import butterknife.ButterKnife;
|
|||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||
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.ViewUtil;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import timber.log.Timber;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
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.content.ComponentName;
|
||||
import android.content.Context;
|
||||
|
|
@ -17,12 +13,19 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
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.media.MediaDetailPagerFragment;
|
||||
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.nearby.NearbyController;
|
||||
import fr.free.nrw.commons.nearby.NearbyNotificationCardView;
|
||||
|
|
@ -57,11 +59,12 @@ import io.reactivex.Observable;
|
|||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import java.util.ArrayList;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
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
|
||||
extends CommonsDaggerSupportFragment
|
||||
implements
|
||||
|
|
@ -72,7 +75,6 @@ public class ContributionsFragment
|
|||
ICampaignsView, ContributionsContract.View {
|
||||
@Inject @Named("default_preferences") JsonKvStore store;
|
||||
@Inject ContributionDao contributionDao;
|
||||
@Inject MediaWikiApi mediaWikiApi;
|
||||
@Inject NearbyController nearbyController;
|
||||
@Inject OkHttpJsonApiClient okHttpJsonApiClient;
|
||||
@Inject CampaignsPresenter presenter;
|
||||
|
|
|
|||
|
|
@ -10,25 +10,12 @@ import android.content.SyncResult;
|
|||
import android.database.Cursor;
|
||||
import android.os.Bundle;
|
||||
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.Named;
|
||||
|
||||
import fr.free.nrw.commons.Utils;
|
||||
import fr.free.nrw.commons.di.ApplicationlessInjection;
|
||||
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 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.kvstore.JsonKvStore;
|
||||
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.UserInterface;
|
||||
import fr.free.nrw.commons.review.ReviewInterface;
|
||||
|
|
@ -78,14 +76,6 @@ public class NetworkingModule {
|
|||
return httpLoggingInterceptor;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
public MediaWikiApi provideMediaWikiApi(Context context,
|
||||
@Named("default_preferences") JsonKvStore defaultKvStore,
|
||||
Gson gson) {
|
||||
return new ApacheHttpClientMediaWikiApi(BuildConfig.WIKIMEDIA_API_HOST);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
public OkHttpJsonApiClient provideOkHttpJsonApiClient(OkHttpClient okHttpClient,
|
||||
|
|
|
|||
|
|
@ -3,15 +3,16 @@ package fr.free.nrw.commons.explore.categories;
|
|||
|
||||
import android.content.res.Configuration;
|
||||
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.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ProgressBar;
|
||||
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 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.RecentSearchesDao;
|
||||
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.ViewUtil;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import timber.log.Timber;
|
||||
|
|
@ -62,7 +61,6 @@ public class SearchCategoryFragment extends CommonsDaggerSupportFragment {
|
|||
boolean isLoadingCategories;
|
||||
|
||||
@Inject RecentSearchesDao recentSearchesDao;
|
||||
@Inject MediaWikiApi mwApi;
|
||||
@Inject CategoryClient categoryClient;
|
||||
|
||||
@Inject
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
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.app.DownloadManager;
|
||||
import android.content.Intent;
|
||||
|
|
@ -18,10 +14,15 @@ import android.view.MenuItem;
|
|||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
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.categories.ExploreActivity;
|
||||
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.NetworkUtils;
|
||||
import fr.free.nrw.commons.utils.PermissionUtils;
|
||||
import fr.free.nrw.commons.utils.ViewUtil;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
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 {
|
||||
|
||||
@Inject MediaWikiApi mwApi;
|
||||
@Inject SessionManager sessionManager;
|
||||
@Inject @Named("default_preferences") JsonKvStore store;
|
||||
@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
|
||||
* @param sessionManager
|
||||
* @param okHttpJsonApiClient instance of MediaWikiApi
|
||||
* @param okHttpJsonApiClient
|
||||
*/
|
||||
@Inject
|
||||
public QuizChecker(SessionManager sessionManager,
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ import butterknife.ButterKnife;
|
|||
import fr.free.nrw.commons.Media;
|
||||
import fr.free.nrw.commons.R;
|
||||
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.utils.DialogUtil;
|
||||
import fr.free.nrw.commons.utils.ViewUtil;
|
||||
|
|
@ -58,8 +57,6 @@ public class ReviewActivity extends NavigationBaseActivity {
|
|||
public ReviewPagerAdapter reviewPagerAdapter;
|
||||
public ReviewController reviewController;
|
||||
@Inject
|
||||
MediaWikiApi mwApi;
|
||||
@Inject
|
||||
ReviewHelper reviewHelper;
|
||||
@Inject
|
||||
DeleteHelper deleteHelper;
|
||||
|
|
|
|||
|
|
@ -15,8 +15,6 @@ import javax.inject.Singleton;
|
|||
|
||||
import fr.free.nrw.commons.Media;
|
||||
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.Single;
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ import javax.inject.Inject;
|
|||
import javax.inject.Singleton;
|
||||
|
||||
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.utils.ImageUtils;
|
||||
import fr.free.nrw.commons.utils.ImageUtilsWrapper;
|
||||
|
|
@ -32,7 +31,6 @@ import static fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK;
|
|||
public class ImageProcessingService {
|
||||
private final FileUtilsWrapper fileUtilsWrapper;
|
||||
private final ImageUtilsWrapper imageUtilsWrapper;
|
||||
private final MediaWikiApi mwApi;
|
||||
private final ReadFBMD readFBMD;
|
||||
private final EXIFReader EXIFReader;
|
||||
private final MediaClient mediaClient;
|
||||
|
|
@ -41,11 +39,10 @@ public class ImageProcessingService {
|
|||
@Inject
|
||||
public ImageProcessingService(FileUtilsWrapper fileUtilsWrapper,
|
||||
ImageUtilsWrapper imageUtilsWrapper,
|
||||
MediaWikiApi mwApi, ReadFBMD readFBMD, EXIFReader EXIFReader,
|
||||
ReadFBMD readFBMD, EXIFReader EXIFReader,
|
||||
MediaClient mediaClient, Context context) {
|
||||
this.fileUtilsWrapper = fileUtilsWrapper;
|
||||
this.imageUtilsWrapper = imageUtilsWrapper;
|
||||
this.mwApi = mwApi;
|
||||
this.readFBMD = readFBMD;
|
||||
this.EXIFReader = EXIFReader;
|
||||
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.MainActivity;
|
||||
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.wikidata.WikidataEditService;
|
||||
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_CAMPAIGN = EXTRA_PREFIX + ".campaign";
|
||||
|
||||
@Inject MediaWikiApi mwApi;
|
||||
@Inject WikidataEditService wikidataEditService;
|
||||
@Inject SessionManager sessionManager;
|
||||
@Inject ContributionDao contributionDao;
|
||||
|
|
@ -88,7 +86,6 @@ public class UploadService extends HandlerService<Contribution> {
|
|||
this.contribution = contribution;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProgress(long transferred, long total) {
|
||||
Timber.d("Uploaded %d of %d", transferred, total);
|
||||
if (!notificationTitleChanged) {
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ import javax.inject.Singleton;
|
|||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.actions.PageEditClient;
|
||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import fr.free.nrw.commons.utils.ViewUtil;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
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
|
||||
* 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
|
||||
*/
|
||||
@Singleton
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue