extraMap = new HashMap<>(4);
- extraMap.put(QUEUE_TIME, Long.toString(fetchState.responseTime - fetchState.submitTime));
- extraMap.put(FETCH_TIME, Long.toString(fetchState.fetchCompleteTime - fetchState.responseTime));
- extraMap.put(TOTAL_TIME, Long.toString(fetchState.fetchCompleteTime - fetchState.submitTime));
- extraMap.put(IMAGE_SIZE, Integer.toString(byteSize));
- return extraMap;
- }
-
- protected void fetchWithRequest(
- final OkHttpNetworkFetchState fetchState,
- final NetworkFetcher.Callback callback,
- final Request request) {
- final Call call = mCallFactory.newCall(request);
-
- fetchState
- .getContext()
- .addCallbacks(
- new BaseProducerContextCallbacks() {
- @Override
- public void onCancellationRequested() {
- if (Looper.myLooper() != Looper.getMainLooper()) {
- call.cancel();
- } else {
- mCancellationExecutor.execute(
- new Runnable() {
- @Override
- public void run() {
- call.cancel();
- }
- });
- }
- }
- });
-
- call.enqueue(
- new okhttp3.Callback() {
- @Override
- public void onResponse(Call call, Response response) throws IOException {
- fetchState.responseTime = SystemClock.elapsedRealtime();
- final ResponseBody body = response.body();
- try {
- if (!response.isSuccessful()) {
- handleException(
- call, new IOException("Unexpected HTTP code " + response), callback);
- return;
- }
-
- BytesRange responseRange =
- BytesRange.fromContentRangeHeader(response.header("Content-Range"));
- if (responseRange != null
- && !(responseRange.from == 0
- && responseRange.to == BytesRange.TO_END_OF_CONTENT)) {
- // Only treat as a partial image if the range is not all of the content
- fetchState.setResponseBytesRange(responseRange);
- fetchState.setOnNewResultStatusFlags(Consumer.IS_PARTIAL_RESULT);
- }
-
- long contentLength = body.contentLength();
- if (contentLength < 0) {
- contentLength = 0;
- }
- callback.onResponse(body.byteStream(), (int) contentLength);
- } catch (Exception e) {
- handleException(call, e, callback);
- } finally {
- body.close();
- }
- }
-
- @Override
- public void onFailure(Call call, IOException e) {
- handleException(call, e, callback);
- }
- });
- }
-
- /**
- * Handles exceptions.
- *
- * OkHttp notifies callers of cancellations via an IOException. If IOException is caught after
- * request cancellation, then the exception is interpreted as successful cancellation and
- * onCancellation is called. Otherwise onFailure is called.
- */
- private void handleException(final Call call, final Exception e, final Callback callback) {
- if (call.isCanceled()) {
- callback.onCancellation();
- } else {
- callback.onFailure(e);
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java
index 152afc82a..773e9d615 100644
--- a/app/src/main/java/fr/free/nrw/commons/Media.java
+++ b/app/src/main/java/fr/free/nrw/commons/Media.java
@@ -45,6 +45,7 @@ public class Media implements Parcelable {
};
// Primary metadata fields
+ @Nullable
public Uri localUri;
public String thumbUrl;
public String imageUrl;
diff --git a/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java b/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java
index 8b12ee5f0..6fe317c0a 100644
--- a/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java
+++ b/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java
@@ -8,8 +8,6 @@ import org.wikipedia.dataclient.okhttp.HttpStatusException;
import java.io.File;
import java.io.IOException;
-import fr.free.nrw.commons.di.SslUtils;
-import fr.free.nrw.commons.utils.ConfigUtils;
import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
@@ -31,17 +29,13 @@ public final class OkHttpConnectionFactory {
@NonNull
private static OkHttpClient createClient() {
- OkHttpClient.Builder builder = new OkHttpClient.Builder()
+ return new OkHttpClient.Builder()
.cookieJar(SharedPreferenceCookieManager.getInstance())
.cache(NET_CACHE)
.addInterceptor(getLoggingInterceptor())
.addInterceptor(new UnsuccessfulResponseInterceptor())
- .addInterceptor(new CommonHeaderRequestInterceptor());
-
- if(ConfigUtils.isBetaFlavour()){
- builder.sslSocketFactory(SslUtils.INSTANCE.getTrustAllHostsSSLSocketFactory());
- }
- return builder.build();
+ .addInterceptor(new CommonHeaderRequestInterceptor())
+ .build();
}
private static HttpLoggingInterceptor getLoggingInterceptor() {
diff --git a/app/src/main/java/fr/free/nrw/commons/Urls.kt b/app/src/main/java/fr/free/nrw/commons/Urls.kt
index 7c60d9f91..52bbf8f48 100644
--- a/app/src/main/java/fr/free/nrw/commons/Urls.kt
+++ b/app/src/main/java/fr/free/nrw/commons/Urls.kt
@@ -6,7 +6,8 @@ internal object Urls {
const val WEBSITE_URL = "https://commons-app.github.io"
const val CREDITS_URL = "https://github.com/commons-app/apps-android-commons/blob/master/CREDITS"
const val FAQ_URL = "https://github.com/commons-app/apps-android-commons/wiki/Frequently-Asked-Questions"
- const val PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=fr.free.nrw.commons"
+ const val PLAY_STORE_PREFIX = "market://details?id="
+ const val PLAY_STORE_URL_PREFIX = "https://play.google.com/store/apps/details?id="
const val TRANSLATE_WIKI_URL = "https://translatewiki.net/w/i.php?title=Special:Translate&group=commons-android-strings&filter=%21translated&action=translate&language="
const val FACEBOOK_WEB_URL = "https://www.facebook.com/1921335171459985"
const val FACEBOOK_APP_URL = "fb://page/1921335171459985"
diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java
index 06b04716c..5f75c86ba 100644
--- a/app/src/main/java/fr/free/nrw/commons/Utils.java
+++ b/app/src/main/java/fr/free/nrw/commons/Utils.java
@@ -115,12 +115,12 @@ public class Utils {
* @param context
*/
public static void rateApp(Context context) {
- final String appPackageName = BuildConfig.class.getPackage().getName();
+ final String appPackageName = context.getPackageName();
try {
- context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
+ context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Urls.PLAY_STORE_PREFIX + appPackageName)));
}
catch (android.content.ActivityNotFoundException anfe) {
- handleWebUrl(context, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName));
+ handleWebUrl(context, Uri.parse(Urls.PLAY_STORE_URL_PREFIX + appPackageName));
}
}
diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java
index 6b5f0dfc0..ed1bd29c7 100644
--- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java
@@ -145,13 +145,6 @@ public class LoginActivity extends AccountAuthenticatorActivity {
}
}
- @OnFocusChange(R.id.login_username)
- void onUsernameFocusChanged(View view, boolean hasFocus) {
- if (!hasFocus) {
- ViewUtil.hideKeyboard(view);
- }
- }
-
@OnFocusChange(R.id.login_password)
void onPasswordFocusChanged(View view, boolean hasFocus) {
if (!hasFocus) {
diff --git a/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java b/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java
index 305fd1a5a..c983af03a 100644
--- a/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java
+++ b/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java
@@ -111,10 +111,8 @@ public class GridViewAdapter extends ArrayAdapter {
*/
private void setAuthorView(Media item, TextView author) {
if (!TextUtils.isEmpty(item.getCreator())) {
- String uploadedByTemplate = getContext().getString(R.string.image_uploaded_by);
-
- String uploadedBy = String.format(Locale.getDefault(), uploadedByTemplate, item.getCreator());
- author.setText(uploadedBy);
+ author.setVisibility(View.VISIBLE);
+ author.setText(getContext().getString(R.string.image_uploaded_by, item.getCreator()));
} else {
author.setVisibility(View.GONE);
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java
index 7314e48ce..84873abaf 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java
@@ -70,6 +70,7 @@ public class Contribution extends Media {
public String decimalCoords;
public boolean isMultiple;
public String wikiDataEntityId;
+ private String p18Value;
public Uri contentProviderUri;
public String dateCreatedSource;
@@ -287,6 +288,19 @@ public class Contribution extends Media {
this.wikiDataEntityId = wikiDataEntityId;
}
+ public String getP18Value() {
+ return p18Value;
+ }
+
+ /**
+ * When the corresponding image property of wiki entity is known as in case of nearby uploads,
+ * it can be set using the setter method
+ * @param p18Value p18 value, image property of the wikidata item
+ */
+ public void setP18Value(String p18Value) {
+ this.p18Value = p18Value;
+ }
+
public void setContentProviderUri(Uri contentProviderUri) {
this.contentProviderUri = contentProviderUri;
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java
index b4d0a8659..261784b52 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java
@@ -8,6 +8,8 @@ import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Transaction;
+import androidx.room.Update;
+import io.reactivex.disposables.Disposable;
import java.util.List;
import io.reactivex.Completable;
@@ -52,4 +54,7 @@ public abstract class ContributionDao {
@Query("Delete FROM contribution WHERE state = :state")
public abstract void deleteAll(int state);
+
+ @Update
+ public abstract Single update(Contribution contribution);
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java
index e29c072bd..740cfbd05 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java
@@ -1,40 +1,36 @@
package fr.free.nrw.commons.contributions;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.net.Uri;
+import android.text.TextUtils;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
-
-import androidx.collection.LruCache;
+import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
-
-import com.facebook.drawee.view.SimpleDraweeView;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.concurrent.TimeUnit;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
-import fr.free.nrw.commons.MediaDataExtractor;
+import com.facebook.drawee.view.SimpleDraweeView;
+import com.facebook.imagepipeline.request.ImageRequest;
+import com.facebook.imagepipeline.request.ImageRequestBuilder;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback;
-import fr.free.nrw.commons.contributions.model.DisplayableContribution;
-import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.media.MediaClient;
-import fr.free.nrw.commons.upload.FileUtils;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
import timber.log.Timber;
public class ContributionViewHolder extends RecyclerView.ViewHolder {
+ private static final long TIMEOUT_SECONDS = 15;
+ private static final String NO_CAPTION = "No caption";
private final Callback callback;
@BindView(R.id.contributionImage)
SimpleDraweeView imageView;
@@ -44,21 +40,13 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.contributionProgress) ProgressBar progressView;
@BindView(R.id.failed_image_options) LinearLayout failedImageOptions;
- @Inject
- MediaDataExtractor mediaDataExtractor;
@Inject
MediaClient mediaClient;
-
- @Inject
- @Named("thumbnail-cache")
- LruCache thumbnailCache;
-
- private DisplayableContribution contribution;
- private CompositeDisposable compositeDisposable = new CompositeDisposable();
private int position;
- private static int TIMEOUT_SECONDS = 15;
- private static final String NO_CAPTION = "No caption";
+ private Contribution contribution;
+ private Random random = new Random();
+ private CompositeDisposable compositeDisposable = new CompositeDisposable();
ContributionViewHolder(View parent, Callback callback) {
super(parent);
@@ -66,16 +54,22 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
this.callback=callback;
}
- public void init(int position, DisplayableContribution contribution) {
- ApplicationlessInjection.getInstance(itemView.getContext())
- .getCommonsApplicationComponent().inject(this);
- this.position=position;
+ public void init(int position, Contribution contribution) {
this.contribution = contribution;
- fetchAndDisplayThumbnail(contribution);
fetchAndDisplayCaption(contribution);
- titleView.setText(contribution.getDisplayTitle());
+ this.position = position;
+ imageView.getHierarchy().setPlaceholderImage(new ColorDrawable(
+ Color.argb(100, random.nextInt(256), random.nextInt(256), random.nextInt(256))));
+ String imageSource = chooseImageSource(contribution.thumbUrl, contribution.getLocalUri());
+ if (!TextUtils.isEmpty(imageSource)) {
+ final ImageRequest imageRequest =
+ ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageSource))
+ .setProgressiveRenderingEnabled(true)
+ .build();
+ imageView.setImageRequest(imageRequest);
+ }
- seqNumView.setText(String.valueOf(contribution.getPosition() + 1));
+ seqNumView.setText(String.valueOf(position + 1));
seqNumView.setVisibility(View.VISIBLE);
switch (contribution.getState()) {
@@ -118,7 +112,7 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
*
* @param contribution
*/
- private void fetchAndDisplayCaption(DisplayableContribution contribution) {
+ private void fetchAndDisplayCaption(Contribution contribution) {
if ((contribution.getState() != Contribution.STATE_COMPLETED)) {
titleView.setText(contribution.getDisplayTitle());
} else {
@@ -137,40 +131,18 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
}
/**
- * This method fetches the thumbnail url from file name
- * If the thumbnail url is present in cache, then it is used otherwise API call is made to fetch the thumbnail
- * This can be removed once #2904 is in place and contribution contains all metadata beforehand
- * @param contribution
+ * Returns the image source for the image view, first preference is given to thumbUrl if that is
+ * null, moves to local uri and if both are null return null
+ *
+ * @param thumbUrl
+ * @param localUri
+ * @return
*/
- private void fetchAndDisplayThumbnail(DisplayableContribution contribution) {
- String keyForLRUCache = contribution.getFilename();
- String cacheUrl = thumbnailCache.get(keyForLRUCache);
- if (!StringUtils.isBlank(cacheUrl)) {
- imageView.setImageURI(cacheUrl);
- return;
- }
-
- imageView.setBackground(null);
- if ((contribution.getState() != Contribution.STATE_COMPLETED) && FileUtils.fileExists(
- contribution.getLocalUri())) {
- imageView.setImageURI(contribution.getLocalUri());
- } else {
- Timber.d("Fetching thumbnail for %s", contribution.getFilename());
- Disposable disposable = mediaDataExtractor
- .getMediaFromFileName(contribution.getFilename())
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(media -> {
- thumbnailCache.put(keyForLRUCache, media.getThumbUrl());
- imageView.setImageURI(media.getThumbUrl());
- });
- compositeDisposable.add(disposable);
- }
-
- }
-
- public void clear() {
- compositeDisposable.clear();
+ @Nullable
+ private String chooseImageSource(String thumbUrl, Uri localUri) {
+ return !TextUtils.isEmpty(thumbUrl) ? thumbUrl :
+ localUri != null ? localUri.toString() :
+ null;
}
/**
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContract.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContract.java
index 90120d379..8b0049004 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContract.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContract.java
@@ -26,10 +26,15 @@ public class ContributionsContract {
}
public interface UserActionListener extends BasePresenter {
+
Contribution getContributionsWithTitle(String uri);
void deleteUpload(Contribution contribution);
Media getItemAtPosition(int i);
+
+ void updateContribution(Contribution contribution);
+
+ void fetchMediaDetails(Contribution contribution);
}
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java
index 064ec9a60..4ee01ee64 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java
@@ -20,6 +20,8 @@ import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
import androidx.fragment.app.FragmentTransaction;
+import fr.free.nrw.commons.MediaDataExtractor;
+import io.reactivex.disposables.Disposable;
import java.util.List;
import javax.inject.Inject;
@@ -219,6 +221,12 @@ public class ContributionsFragment
public Contribution getContributionForPosition(int position) {
return (Contribution) contributionsPresenter.getItemAtPosition(position);
}
+
+ @Override
+ public void fetchMediaUriFor(Contribution contribution) {
+ Timber.d("Fetching thumbnail for %s", contribution.filename);
+ contributionsPresenter.fetchMediaDetails(contribution);
+ }
});
if(null==mediaDetailPagerFragment){
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java
index 234222c92..8b8d2fff1 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java
@@ -1,5 +1,8 @@
package fr.free.nrw.commons.contributions;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.ViewGroup;
@@ -10,7 +13,6 @@ import java.util.ArrayList;
import java.util.List;
import fr.free.nrw.commons.R;
-import fr.free.nrw.commons.contributions.model.DisplayableContribution;
/**
* Represents The View Adapter for the List of Contributions
@@ -22,7 +24,7 @@ public class ContributionsListAdapter extends RecyclerView.Adapter();
+ contributions = new ArrayList<>();
}
/**
@@ -41,9 +43,12 @@ public class ContributionsListAdapter extends RecyclerView.Adapter contributionList) {
- if(null!=contributionList) {
- this.contributions.clear();
- this.contributions.addAll(contributionList);
- notifyDataSetChanged();
- }
+ public void setContributions(@NonNull List contributionList) {
+ contributions = contributionList;
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return contributions.get(position)._id;
}
public interface Callback {
@@ -68,5 +75,7 @@ public class ContributionsListAdapter extends RecyclerView.Adapter updateContribution(Contribution contribution) {
+ return contributionDao.update(contribution);
+ }
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsPresenter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsPresenter.java
index f340c5516..2e0833379 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsPresenter.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsPresenter.java
@@ -12,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
+import fr.free.nrw.commons.MediaDataExtractor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -63,6 +64,10 @@ public class ContributionsPresenter implements UserActionListener {
@Inject
SessionManager sessionManager;
+
+ @Inject
+ MediaDataExtractor mediaDataExtractor;
+
private LifecycleOwner lifeCycleOwner;
@Inject
@@ -181,4 +186,24 @@ public class ContributionsPresenter implements UserActionListener {
}
return contributionList.get(i);
}
+
+ @Override
+ public void updateContribution(Contribution contribution) {
+ compositeDisposable.add(repository
+ .updateContribution(contribution)
+ .subscribeOn(ioThreadScheduler)
+ .subscribe());
+ }
+
+ @Override
+ public void fetchMediaDetails(Contribution contribution) {
+ compositeDisposable.add(mediaDataExtractor
+ .getMediaFromFileName(contribution.filename)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(media -> {
+ contribution.thumbUrl=media.thumbUrl;
+ updateContribution(contribution);
+ }));
+ }
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsRepository.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsRepository.java
index 10e0878ec..500babaf5 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsRepository.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsRepository.java
@@ -61,4 +61,8 @@ public class ContributionsRepository {
public long getLong(String key) {
return localDataSource.getLong(key);
}
+
+ public Single updateContribution(Contribution contribution) {
+ return localDataSource.updateContribution(contribution);
+ }
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/model/DisplayableContribution.java b/app/src/main/java/fr/free/nrw/commons/contributions/model/DisplayableContribution.java
deleted file mode 100644
index 4350a6455..000000000
--- a/app/src/main/java/fr/free/nrw/commons/contributions/model/DisplayableContribution.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package fr.free.nrw.commons.contributions.model;
-
-import fr.free.nrw.commons.contributions.Contribution;
-
-public class DisplayableContribution extends Contribution {
- private int position;
- public DisplayableContribution(Contribution contribution,
- int position) {
- super(contribution.getContentUri(),
- contribution.getFilename(),
- contribution.getLocalUri(),
- contribution.getImageUrl(),
- contribution.getDateCreated(),
- contribution.getState(),
- contribution.getDataLength(),
- contribution.getDateUploaded(),
- contribution.getTransferred(),
- contribution.getSource(),
- contribution.getCaptions(),
- contribution.getDescription(),
- contribution.getCreator(),
- contribution.getMultiple(),
- contribution.getWidth(),
- contribution.getHeight(),
- contribution.getLicense());
- this._id=contribution._id;
- this.position = position;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(int position) {
- this.position = position;
- }
-}
diff --git a/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java b/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java
index ee673cdc1..5253f0dbd 100644
--- a/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java
+++ b/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.java
@@ -98,6 +98,12 @@ public class DeleteHelper {
String userPageString = "\n{{subst:idw|" + media.getFilename() +
"}} ~~~~";
+ String creator = media.getCreator();
+ if (creator == null || creator.isEmpty()) {
+ throw new RuntimeException("Failed to nominate for deletion");
+ }
+ String creatorName = creator.replace(" (page does not exist)", "");
+
return pageEditClient.prependEdit(media.filename, fileDeleteString + "\n", summary)
.flatMap(result -> {
if (result) {
@@ -111,7 +117,7 @@ public class DeleteHelper {
throw new RuntimeException("Failed to nominate for deletion");
}).flatMap(result -> {
if (result) {
- return pageEditClient.appendEdit("User_Talk:" + username, userPageString + "\n", summary);
+ return pageEditClient.appendEdit("User_Talk:" + creatorName, userPageString + "\n", summary);
}
throw new RuntimeException("Failed to nominate for deletion");
});
diff --git a/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationComponent.java b/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationComponent.java
index 291ff5dcd..f813de762 100644
--- a/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationComponent.java
+++ b/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationComponent.java
@@ -55,8 +55,6 @@ public interface CommonsApplicationComponent extends AndroidInjector(object : X509TrustManager {
-
- override fun getAcceptedIssuers(): Array {
- return arrayOf()
- }
-
- @Throws(CertificateException::class)
- override fun checkClientTrusted(chain: Array, authType: String) {
- }
-
- @Throws(CertificateException::class)
- override fun checkServerTrusted(chain: Array, authType: String) {
- }
- })
-
- // Install the all-trusting trust manager
- val sslContext = SSLContext.getInstance("SSL")
- sslContext.init(null, trustAllCerts, java.security.SecureRandom())
- // Create an ssl socket factory with our all-trusting manager
-
- return sslContext.socketFactory
- } catch (e: KeyManagementException) {
- e.printStackTrace()
- return null
- } catch (e: NoSuchAlgorithmException) {
- e.printStackTrace()
- return null
- }
-
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.java b/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.java
index 4a90016ee..5d168d6b1 100644
--- a/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.java
+++ b/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.java
@@ -8,7 +8,7 @@ import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
-import android.preference.PreferenceManager;
+import androidx.preference.PreferenceManager;
import android.provider.MediaStore;
import android.text.TextUtils;
diff --git a/app/src/main/java/fr/free/nrw/commons/filepicker/FilePickerConfiguration.java b/app/src/main/java/fr/free/nrw/commons/filepicker/FilePickerConfiguration.java
index 343b67e1a..08a204e8b 100644
--- a/app/src/main/java/fr/free/nrw/commons/filepicker/FilePickerConfiguration.java
+++ b/app/src/main/java/fr/free/nrw/commons/filepicker/FilePickerConfiguration.java
@@ -1,7 +1,7 @@
package fr.free.nrw.commons.filepicker;
import android.content.Context;
-import android.preference.PreferenceManager;
+import androidx.preference.PreferenceManager;
public class FilePickerConfiguration implements Constants {
diff --git a/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java b/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java
index 2c34e0118..a34e8d2ad 100644
--- a/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java
+++ b/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java
@@ -6,7 +6,6 @@ import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
-
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -214,6 +213,14 @@ public class LocationServiceManager implements LocationListener {
Timber.d("Provider %s disabled", provider);
}
+ public boolean isNetworkProviderEnabled() {
+ return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
+ }
+
+ public boolean isGPSProviderEnabled() {
+ return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
+ }
+
public enum LocationChangeType{
LOCATION_SIGNIFICANTLY_CHANGED, //Went out of borders of nearby markers
LOCATION_SLIGHTLY_CHANGED, //User might be walking or driving
diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java
index e328adb30..8178f63e3 100644
--- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java
@@ -397,69 +397,75 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
@OnClick(R.id.nominateDeletion)
public void onDeleteButtonClicked(){
- if(AccountUtil.getUserName(getContext()).equals(media.getCreator())){
- final ArrayAdapter languageAdapter = new ArrayAdapter<>(getActivity(),
- R.layout.simple_spinner_dropdown_list, reasonList);
- final Spinner spinner = new Spinner(getActivity());
- spinner.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- spinner.setAdapter(languageAdapter);
- spinner.setGravity(17);
+ if (AccountUtil.getUserName(getContext()) != null && AccountUtil.getUserName(getContext()).equals(media.getCreator())) {
+ final ArrayAdapter languageAdapter = new ArrayAdapter<>(getActivity(),
+ R.layout.simple_spinner_dropdown_list, reasonList);
+ final Spinner spinner = new Spinner(getActivity());
+ spinner.setLayoutParams(
+ new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT));
+ spinner.setAdapter(languageAdapter);
+ spinner.setGravity(17);
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setView(spinner);
- builder.setTitle(R.string.nominate_delete)
- .setPositiveButton(R.string.about_translate_proceed, (dialog, which) -> onDeleteClicked(spinner));
- builder.setNegativeButton(R.string.about_translate_cancel, (dialog, which) -> dialog.dismiss());
- AlertDialog dialog = builder.create();
- dialog.show();
- if(isDeleted) {
- dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
- }
- }
- //Reviewer correct me if i have misunderstood something over here
- //But how does this if (delete.getVisibility() == View.VISIBLE) {
- // enableDeleteButton(true); makes sense ?
- else{
- AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
- alert.setMessage(getString(R.string.dialog_box_text_nomination,media.getDisplayTitle()));
- final EditText input = new EditText(getActivity());
- alert.setView(input);
- input.requestFocus();
- alert.setPositiveButton(R.string.ok, (dialog1, whichButton) -> {
- String reason = input.getText().toString();
- onDeleteClickeddialogtext(reason);
- });
- alert.setNegativeButton(R.string.cancel, (dialog12, whichButton) -> {
- });
- AlertDialog d = alert.create();
- input.addTextChangedListener(new TextWatcher() {
- private void handleText() {
- final Button okButton = d.getButton(AlertDialog.BUTTON_POSITIVE);
- if (input.getText().length() == 0) {
- okButton.setEnabled(false);
- } else {
- okButton.setEnabled(true);
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setView(spinner);
+ builder.setTitle(R.string.nominate_delete)
+ .setPositiveButton(R.string.about_translate_proceed,
+ (dialog, which) -> onDeleteClicked(spinner));
+ builder.setNegativeButton(R.string.about_translate_cancel,
+ (dialog, which) -> dialog.dismiss());
+ AlertDialog dialog = builder.create();
+ dialog.show();
+ if (isDeleted) {
+ dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
}
}
+ //Reviewer correct me if i have misunderstood something over here
+ //But how does this if (delete.getVisibility() == View.VISIBLE) {
+ // enableDeleteButton(true); makes sense ?
+ else {
+ AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
+ alert.setMessage(
+ getString(R.string.dialog_box_text_nomination, media.getDisplayTitle()));
+ final EditText input = new EditText(getActivity());
+ alert.setView(input);
+ input.requestFocus();
+ alert.setPositiveButton(R.string.ok, (dialog1, whichButton) -> {
+ String reason = input.getText().toString();
+ onDeleteClickeddialogtext(reason);
+ });
+ alert.setNegativeButton(R.string.cancel, (dialog12, whichButton) -> {
+ });
+ AlertDialog d = alert.create();
+ input.addTextChangedListener(new TextWatcher() {
+ private void handleText() {
+ final Button okButton = d.getButton(AlertDialog.BUTTON_POSITIVE);
+ if (input.getText().length() == 0) {
+ okButton.setEnabled(false);
+ } else {
+ okButton.setEnabled(true);
+ }
+ }
- @Override
- public void afterTextChanged(Editable arg0) {
- handleText();
- }
+ @Override
+ public void afterTextChanged(Editable arg0) {
+ handleText();
+ }
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ }
+ });
+ d.show();
+ d.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
}
- });
- d.show();
- d.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
- }
}
+
@SuppressLint("CheckResult")
private void onDeleteClicked(Spinner spinner) {
String reason = spinner.getSelectedItem().toString();
diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyFilterSearchRecyclerViewAdapter.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyFilterSearchRecyclerViewAdapter.java
index efe89db95..c2d4eec9c 100644
--- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyFilterSearchRecyclerViewAdapter.java
+++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyFilterSearchRecyclerViewAdapter.java
@@ -70,7 +70,7 @@ public class NearbyFilterSearchRecyclerViewAdapter
@NonNull
@Override
public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- View itemView = inflater.inflate(callback.isDarkTheme()?R.layout.nearby_search_list_item_dark:R.layout.nearby_search_list_item, parent, false);
+ View itemView = inflater.inflate(callback.isDarkTheme() ? R.layout.nearby_search_list_item_dark : R.layout.nearby_search_list_item, parent, false);
return new RecyclerViewHolder(itemView);
}
@@ -79,17 +79,20 @@ public class NearbyFilterSearchRecyclerViewAdapter
Label label = displayedLabels.get(position);
holder.placeTypeIcon.setImageResource(label.getIcon());
holder.placeTypeLabel.setText(label.toString());
+ holder.placeTypeLayout.setSelected(label.isSelected());
- holder.placeTypeLayout.setBackgroundColor(label.isSelected() ? ContextCompat.getColor(context, R.color.divider_grey) : callback.isDarkTheme()?Color.BLACK:Color.WHITE);
holder.placeTypeLayout.setOnClickListener(view -> {
callback.setCheckboxUnknown();
+
if (label.isSelected()) {
selectedLabels.remove(label);
} else {
selectedLabels.add(label);
}
+
label.setSelected(!label.isSelected());
- holder.placeTypeLayout.setBackgroundColor(label.isSelected() ? ContextCompat.getColor(context, R.color.divider_grey) : Color.WHITE);
+ holder.placeTypeLayout.setSelected(label.isSelected());
+
callback.filterByMarkerType(selectedLabels, 0, false, false);
});
}
@@ -165,7 +168,7 @@ public class NearbyFilterSearchRecyclerViewAdapter
notifyDataSetChanged();
}
- public interface Callback{
+ public interface Callback {
void setCheckboxUnknown();
diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java b/app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java
index fb857dee7..1034ab437 100644
--- a/app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java
+++ b/app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java
@@ -28,6 +28,8 @@ public interface NearbyParentFragmentContract {
void setFABRecenterAction(android.view.View.OnClickListener onClickListener);
void animateFABs();
void recenterMap(LatLng curLatLng);
+ void showLocationOffDialog();
+ void openLocationSettings();
void hideBottomSheet();
void hideBottomDetailsSheet();
void displayBottomSheetWithInfo(Marker marker);
diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java
index a912d3586..55e0483a9 100644
--- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java
@@ -6,9 +6,11 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.os.Bundle;
+import android.provider.Settings;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -52,8 +54,11 @@ import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.Style;
import com.mapbox.mapboxsdk.maps.UiSettings;
+import com.mapbox.pluginscalebar.ScaleBarOptions;
+import com.mapbox.pluginscalebar.ScaleBarPlugin;
import com.pedrogomez.renderers.RVRendererAdapter;
+import fr.free.nrw.commons.utils.DialogUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -229,8 +234,8 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
UiSettings uiSettings = mapBoxMap.getUiSettings();
uiSettings.setCompassGravity(Gravity.BOTTOM | Gravity.LEFT);
uiSettings.setCompassMargins(12, 0, 0, 24);
- uiSettings.setLogoEnabled(false);
- uiSettings.setAttributionEnabled(false);
+ uiSettings.setLogoEnabled(true);
+ uiSettings.setAttributionEnabled(true);
uiSettings.setRotateGesturesEnabled(false);
NearbyParentFragment.this.isMapBoxReady=true;
performMapReadyActions();
@@ -239,8 +244,19 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
.zoom(ZOOM_LEVEL)
.build();
mapBoxMap.setCameraPosition(cameraPosition);
- });
+ ScaleBarPlugin scaleBarPlugin = new ScaleBarPlugin(mapView, mapBoxMap);
+ int color = isDarkTheme ? R.color.bottom_bar_light : R.color.bottom_bar_dark;
+ ScaleBarOptions scaleBarOptions = new ScaleBarOptions(getContext())
+ .setTextColor(color)
+ .setTextSize(R.dimen.description_text_size)
+ .setBarHeight(R.dimen.tiny_gap)
+ .setBorderWidth(R.dimen.miniscule_margin)
+ .setMarginTop(R.dimen.tiny_padding)
+ .setMarginLeft(R.dimen.tiny_padding)
+ .setTextBarMargin(R.dimen.tiny_padding);
+ scaleBarPlugin.create(scaleBarOptions);
+ });
});
}
@@ -1238,6 +1254,9 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
@Override
public void recenterMap(fr.free.nrw.commons.location.LatLng curLatLng) {
if (curLatLng == null) {
+ if (!(locationManager.isNetworkProviderEnabled() || locationManager.isGPSProviderEnabled())) {
+ showLocationOffDialog();
+ }
return;
}
addCurrentLocationMarker(curLatLng);
@@ -1268,6 +1287,28 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
mapBox.animateCamera(CameraUpdateFactory.newCameraPosition(position), 1000);
}
+ @Override
+ public void showLocationOffDialog() {
+ // This creates a dialog box that prompts the user to enable location
+ DialogUtil
+ .showAlertDialog(getActivity(), getString(R.string.ask_to_turn_location_on), getString(R.string.nearby_needs_location),
+ getString(R.string.yes), getString(R.string.no), this::openLocationSettings, null);
+ }
+
+ @Override
+ public void openLocationSettings() {
+ // This method opens the location settings of the device along with a followup toast.
+ Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+ PackageManager packageManager = getActivity().getPackageManager();
+
+ if (intent.resolveActivity(packageManager)!= null) {
+ startActivity(intent);
+ Toast.makeText(getContext(), R.string.recommend_high_accuracy_mode, Toast.LENGTH_LONG).show();
+ } else {
+ Toast.makeText(getContext(), R.string.cannot_open_location_settings, Toast.LENGTH_LONG).show();
+ }
+ }
+
@Override
public void hideBottomSheet() {
bottomSheetListBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
diff --git a/app/src/main/java/fr/free/nrw/commons/repository/UploadRemoteDataSource.java b/app/src/main/java/fr/free/nrw/commons/repository/UploadRemoteDataSource.java
index e8cbd153b..32d7fa800 100644
--- a/app/src/main/java/fr/free/nrw/commons/repository/UploadRemoteDataSource.java
+++ b/app/src/main/java/fr/free/nrw/commons/repository/UploadRemoteDataSource.java
@@ -182,11 +182,10 @@ public class UploadRemoteDataSource {
* ask the UplaodModel for the image quality of the UploadItem
*
* @param uploadItem
- * @param shouldValidateTitle
* @return
*/
- public Single getImageQuality(UploadItem uploadItem, boolean shouldValidateTitle) {
- return uploadModel.getImageQuality(uploadItem, shouldValidateTitle);
+ public Single getImageQuality(UploadItem uploadItem) {
+ return uploadModel.getImageQuality(uploadItem);
}
/**
diff --git a/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java b/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java
index 3eeb46a47..043489b82 100644
--- a/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java
+++ b/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java
@@ -193,11 +193,10 @@ public class UploadRepository {
* query the RemoteDataSource for image quality
*
* @param uploadItem
- * @param shouldValidateTitle
* @return
*/
- public Single getImageQuality(UploadItem uploadItem, boolean shouldValidateTitle) {
- return remoteDataSource.getImageQuality(uploadItem, shouldValidateTitle);
+ public Single getImageQuality(UploadItem uploadItem) {
+ return remoteDataSource.getImageQuality(uploadItem);
}
/**
diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java
index b42b159d8..00ef4ed4b 100644
--- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java
@@ -3,28 +3,17 @@ package fr.free.nrw.commons.settings;
import android.Manifest;
import android.net.Uri;
import android.os.Bundle;
-import android.preference.EditTextPreference;
-import android.preference.ListPreference;
-import android.preference.MultiSelectListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.SwitchPreference;
-import android.text.Editable;
-import android.text.TextWatcher;
-
+import android.text.InputFilter;
+import android.text.InputType;
+import androidx.preference.EditTextPreference;
+import androidx.preference.ListPreference;
+import androidx.preference.MultiSelectListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import com.google.android.material.snackbar.Snackbar;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.single.BasePermissionListener;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.di.ApplicationlessInjection;
@@ -33,10 +22,15 @@ import fr.free.nrw.commons.logging.CommonsLogSender;
import fr.free.nrw.commons.upload.Language;
import fr.free.nrw.commons.utils.PermissionUtils;
import fr.free.nrw.commons.utils.ViewUtil;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import javax.inject.Inject;
+import javax.inject.Named;
-import static fr.free.nrw.commons.utils.SystemThemeUtils.THEME_MODE_DEFAULT;
-
-public class SettingsFragment extends PreferenceFragment {
+public class SettingsFragment extends PreferenceFragmentCompat {
@Inject
@Named("default_preferences")
@@ -49,29 +43,19 @@ public class SettingsFragment extends PreferenceFragment {
private ListPreference langListPreference;
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
ApplicationlessInjection
- .getInstance(getActivity().getApplicationContext())
- .getCommonsApplicationComponent()
- .inject(this);
+ .getInstance(getActivity().getApplicationContext())
+ .getCommonsApplicationComponent()
+ .inject(this);
- // Load the preferences from an XML resource
- addPreferencesFromResource(R.xml.preferences);
+ // Set the preferences from an XML resource
+ setPreferencesFromResource(R.xml.preferences, rootKey);
- themeListPreference = (ListPreference) findPreference(Prefs.KEY_THEME_VALUE);
+ themeListPreference = findPreference(Prefs.KEY_THEME_VALUE);
prepareTheme();
- //Check if the Author Name switch is enabled and appropriately handle the author name usage
- SwitchPreference useAuthorName = (SwitchPreference) findPreference("useAuthorName");
- EditTextPreference authorName = (EditTextPreference) findPreference("authorName");
- authorName.setEnabled(defaultKvStore.getBoolean("useAuthorName", false));
- useAuthorName.setOnPreferenceChangeListener((preference, newValue) -> {
- authorName.setEnabled((Boolean)newValue);
- return true;
- });
-
- MultiSelectListPreference multiSelectListPref = (MultiSelectListPreference) findPreference(Prefs.MANAGED_EXIF_TAGS);
+ MultiSelectListPreference multiSelectListPref = findPreference(Prefs.MANAGED_EXIF_TAGS);
if (multiSelectListPref != null) {
multiSelectListPref.setOnPreferenceChangeListener((preference, newValue) -> {
if (newValue instanceof HashSet && !((HashSet) newValue).contains(getString(R.string.exif_tag_location))) {
@@ -81,42 +65,44 @@ public class SettingsFragment extends PreferenceFragment {
});
}
- final EditTextPreference uploadLimit = (EditTextPreference) findPreference("uploads");
+ final EditTextPreference uploadLimit = findPreference("uploads");
int currentUploadLimit = defaultKvStore.getInt(Prefs.UPLOADS_SHOWING, 100);
- uploadLimit.setText(Integer.toString(currentUploadLimit));
- uploadLimit.setSummary(Integer.toString(currentUploadLimit));
- uploadLimit.getEditText().addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ uploadLimit.setText(String.valueOf(currentUploadLimit));
+ uploadLimit.setOnPreferenceChangeListener((preference, newValue) -> {
+
+ if (newValue.toString().length() == 0) {
+ return false;
}
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (s.length() == 0) return;
-
- int value = Integer.parseInt(s.toString());
-
- if (value > 500) {
- uploadLimit.getEditText().setError(getString(R.string.maximum_limit_alert));
- value = 500;
- } else if (value == 0) {
- uploadLimit.getEditText().setError(getString(R.string.cannot_be_zero));
- value = 100;
- }
-
- defaultKvStore.putInt(Prefs.UPLOADS_SHOWING, value);
- defaultKvStore.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED, true);
- uploadLimit.setText(Integer.toString(value));
- uploadLimit.setSummary(Integer.toString(value));
+ int value = Integer.parseInt(newValue.toString());
+ if (value > 500) {
+ Snackbar error = Snackbar.make(getView(), R.string.maximum_limit_alert, Snackbar.LENGTH_LONG);
+ error.show();
+ return false;
+ } else if (value == 0) {
+ Snackbar error = Snackbar.make(getView(), R.string.cannot_be_zero, Snackbar.LENGTH_LONG);
+ error.show();
+ return false;
}
+ return true;
});
- langListPreference = (ListPreference) findPreference("descriptionDefaultLanguagePref");
+ uploadLimit.setOnBindEditTextListener(editText -> {
+
+ editText.setInputType(InputType.TYPE_CLASS_NUMBER);
+ editText.selectAll();
+ int maxLength = 3; // set maxLength to 3
+ editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
+
+ int value = Integer.parseInt(editText.getText().toString());
+
+ defaultKvStore.putInt(Prefs.UPLOADS_SHOWING, value);
+ defaultKvStore.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED, true);
+ uploadLimit.setText(Integer.toString(value));
+ });
+
+ langListPreference = findPreference("descriptionDefaultLanguagePref");
prepareLanguages();
Preference betaTesterPreference = findPreference("becomeBetaTester");
betaTesterPreference.setOnPreferenceClickListener(preference -> {
@@ -129,42 +115,26 @@ public class SettingsFragment extends PreferenceFragment {
return true;
});
// Disable some settings when not logged in.
- if (defaultKvStore.getBoolean("login_skipped", false)){
- SwitchPreference useExternalStorage = (SwitchPreference) findPreference("useExternalStorage");
- SwitchPreference displayNearbyCardView = (SwitchPreference) findPreference("displayNearbyCardView");
- SwitchPreference displayLocationPermissionForCardView = (SwitchPreference) findPreference("displayLocationPermissionForCardView");
- SwitchPreference displayCampaignsCardView = (SwitchPreference) findPreference("displayCampaignsCardView");
- useExternalStorage.setEnabled(false);
+ if (defaultKvStore.getBoolean("login_skipped", false)) {
+ findPreference("useExternalStorage").setEnabled(false);
+ findPreference("useAuthorName").setEnabled(false);
+ findPreference("displayNearbyCardView").setEnabled(false);
+ findPreference("displayLocationPermissionForCardView").setEnabled(false);
+ findPreference("displayCampaignsCardView").setEnabled(false);
uploadLimit.setEnabled(false);
- useAuthorName.setEnabled(false);
- displayNearbyCardView.setEnabled(false);
- displayLocationPermissionForCardView.setEnabled(false);
- displayCampaignsCardView.setEnabled(false);
}
}
/**
- * Uses previously saved theme if there is any, if not then uses default.
+ * Sets the theme pref
*/
private void prepareTheme() {
-
- themeListPreference.setSummary(getThemeSummary(getCurrentTheme()));
-
themeListPreference.setOnPreferenceChangeListener((preference, newValue) -> {
getActivity().recreate();
return true;
});
}
- private CharSequence getThemeSummary(String value) {
- int prefIndex = themeListPreference.findIndexOfValue(value);
- return themeListPreference.getEntries()[prefIndex];
- }
-
- private String getCurrentTheme() {
- return defaultKvStore.getString(Prefs.KEY_THEME_VALUE, THEME_MODE_DEFAULT);
- }
-
/**
* Prepares language summary and language codes list and adds them to list preference as pairs.
* Uses previously saved language if there is any, if not uses phone local as initial language.
@@ -195,19 +165,14 @@ public class SettingsFragment extends PreferenceFragment {
String languageCode = getCurrentLanguageCode();
if (languageCode.equals("")){
// If current language code is empty, means none selected by user yet so use phone local
- langListPreference.setSummary(Locale.getDefault().getDisplayLanguage());
langListPreference.setValue(Locale.getDefault().getLanguage());
} else {
// If any language is selected by user previously, use it
- int prefIndex = langListPreference.findIndexOfValue(languageCode);
- langListPreference.setSummary(langListPreference.getEntries()[prefIndex]);
langListPreference.setValue(languageCode);
}
langListPreference.setOnPreferenceChangeListener((preference, newValue) -> {
String userSelectedValue = (String) newValue;
- int prefIndex = langListPreference.findIndexOfValue(userSelectedValue);
- langListPreference.setSummary(langListPreference.getEntries()[prefIndex]);
saveLanguageValue(userSelectedValue);
return true;
});
diff --git a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleEditTextPreference.java b/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleEditTextPreference.java
deleted file mode 100644
index 758168d1c..000000000
--- a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleEditTextPreference.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package fr.free.nrw.commons.ui.LongTitlePreferences;
-
-import android.content.Context;
-import android.preference.EditTextPreference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.TextView;
-
-/**
- * Created by seannemann on 6/27/2018.
- */
-
-public class LongTitleEditTextPreference extends EditTextPreference {
- public LongTitleEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public LongTitleEditTextPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public LongTitleEditTextPreference(Context context) {
-
- super(context);
- }
-
- @Override
- protected void onBindView(View view)
- {
- super.onBindView(view);
-
- TextView title= view.findViewById(android.R.id.title);
- if (title != null) {
- title.setSingleLine(false);
- }
- }
-}
diff --git a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleListPreference.java b/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleListPreference.java
deleted file mode 100644
index 24b97d095..000000000
--- a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleListPreference.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package fr.free.nrw.commons.ui.LongTitlePreferences;
-
-import android.content.Context;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.TextView;
-
-/**
- * Created by seannemann on 6/27/2018.
- */
-
-public class LongTitleListPreference extends ListPreference {
- public LongTitleListPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public LongTitleListPreference(Context context) {
- super(context);
- }
-
- @Override
- protected void onBindView(View view)
- {
- super.onBindView(view);
-
- TextView title= view.findViewById(android.R.id.title);
- if (title != null) {
- title.setSingleLine(false);
- }
- }
-}
diff --git a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleMultiSelectListPreference.java b/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleMultiSelectListPreference.java
deleted file mode 100644
index 9c5f327ac..000000000
--- a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleMultiSelectListPreference.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package fr.free.nrw.commons.ui.LongTitlePreferences;
-
-import android.content.Context;
-import android.preference.MultiSelectListPreference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.TextView;
-
-public class LongTitleMultiSelectListPreference extends MultiSelectListPreference {
- /*
- public LongTitleMultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- public LongTitleMultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
- */
- public LongTitleMultiSelectListPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public LongTitleMultiSelectListPreference(Context context) {
- super(context);
- }
-
- @Override
- protected void onBindView(View view)
- {
- super.onBindView(view);
-
- TextView title= view.findViewById(android.R.id.title);
- if (title != null) {
- title.setSingleLine(false);
- }
- }
-
-}
diff --git a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitlePreference.java b/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitlePreference.java
deleted file mode 100644
index 0facf0889..000000000
--- a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitlePreference.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package fr.free.nrw.commons.ui.LongTitlePreferences;
-
-import android.content.Context;
-import android.preference.Preference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.TextView;
-
-/**
- * Created by seannemann on 6/27/2018.
- */
-
-public class LongTitlePreference extends Preference {
- public LongTitlePreference(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public LongTitlePreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public LongTitlePreference(Context context) {
- super(context);
- }
-
- @Override
- protected void onBindView(View view)
- {
- super.onBindView(view);
-
- TextView title= view.findViewById(android.R.id.title);
- if (title != null) {
- title.setSingleLine(false);
- }
- }
-}
diff --git a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitlePreferenceCategory.java b/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitlePreferenceCategory.java
deleted file mode 100644
index 7ba8a1c18..000000000
--- a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitlePreferenceCategory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package fr.free.nrw.commons.ui.LongTitlePreferences;
-
-import android.content.Context;
-import android.preference.PreferenceCategory;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.TextView;
-
-/**
- * Created by seannemann on 6/27/2018.
- */
-
-public class LongTitlePreferenceCategory extends PreferenceCategory {
- public LongTitlePreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public LongTitlePreferenceCategory(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public LongTitlePreferenceCategory(Context context) {
- super(context);
- }
-
- @Override
- protected void onBindView(View view)
- {
- super.onBindView(view);
-
- TextView title= view.findViewById(android.R.id.title);
- if (title != null) {
- title.setSingleLine(false);
- }
- }
-}
diff --git a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleSwitchPreference.java b/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleSwitchPreference.java
deleted file mode 100644
index 5614e93e9..000000000
--- a/app/src/main/java/fr/free/nrw/commons/ui/LongTitlePreferences/LongTitleSwitchPreference.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package fr.free.nrw.commons.ui.LongTitlePreferences;
-
-import android.content.Context;
-import android.preference.SwitchPreference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.TextView;
-
-/**
- * Created by seannemann on 6/27/2018.
- */
-
-public class LongTitleSwitchPreference extends SwitchPreference {
- public LongTitleSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public LongTitleSwitchPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public LongTitleSwitchPreference(Context context) {
- super(context);
- }
-
- @Override
- protected void onBindView(View view)
- {
- super.onBindView(view);
-
- TextView title= view.findViewById(android.R.id.title);
- if (title != null) {
- title.setSingleLine(false);
- }
- }
-}
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java b/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java
index 6c58b3339..7bcec4fb0 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.java
@@ -1,25 +1,22 @@
package fr.free.nrw.commons.upload;
+import static fr.free.nrw.commons.utils.ImageUtils.EMPTY_CAPTION;
+import static fr.free.nrw.commons.utils.ImageUtils.FILE_NAME_EXISTS;
+import static fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK;
+
import android.content.Context;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
import fr.free.nrw.commons.media.MediaClient;
import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.utils.ImageUtils;
import fr.free.nrw.commons.utils.ImageUtilsWrapper;
import io.reactivex.Single;
+import io.reactivex.schedulers.Schedulers;
+import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.apache.commons.lang3.StringUtils;
import timber.log.Timber;
-import static fr.free.nrw.commons.utils.ImageUtils.EMPTY_CAPTION;
-import static fr.free.nrw.commons.utils.ImageUtils.FILE_NAME_EXISTS;
-import static fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK;
-
/**
* Methods for pre-processing images to be uploaded
*/
@@ -43,38 +40,34 @@ public class ImageProcessingService {
this.mediaClient = mediaClient;
}
- /**
- * Check image quality before upload
- * - checks duplicate image
- * - checks dark image
- * - checks geolocation for image
- * - check for valid caption
- */
- Single validateImage(UploadModel.UploadItem uploadItem, boolean checkTitle) {
- int currentImageQuality = uploadItem.getImageQuality();
- Timber.d("Current image quality is %d", currentImageQuality);
- if (currentImageQuality == ImageUtils.IMAGE_KEEP) {
- return Single.just(ImageUtils.IMAGE_OK);
- }
- Timber.d("Checking the validity of image");
- String filePath = uploadItem.getMediaUri().getPath();
- Single duplicateImage = checkDuplicateImage(filePath);
- Single wrongGeoLocation = checkImageGeoLocation(uploadItem.getPlace(), filePath);
- Single darkImage = checkDarkImage(filePath);
- Single itemTitle = checkTitle ? validateItemTitle(uploadItem) : Single.just(ImageUtils.IMAGE_OK);
- Single checkFBMD = checkFBMD(filePath);
- Single checkEXIF = checkEXIF(filePath);
- Single zipResult = Single.zip(duplicateImage, wrongGeoLocation, darkImage, itemTitle,
- (duplicate, wrongGeo, dark, title) -> {
- Timber.d("Result for duplicate: %d, geo: %d, dark: %d, title: %d", duplicate, wrongGeo, dark, title);
- return duplicate | wrongGeo | dark | title;
- });
- return Single.zip(zipResult, checkFBMD , checkEXIF , (zip , fbmd , exif)->{
- Timber.d("zip:" + zip + "fbmd:" + fbmd + "exif:" + exif);
- return zip | fbmd | exif;
- });
+ /**
+ * Check image quality before upload - checks duplicate image - checks dark image - checks
+ * geolocation for image - check for valid title
+ */
+ Single validateImage(UploadModel.UploadItem uploadItem) {
+ int currentImageQuality = uploadItem.getImageQuality();
+ Timber.d("Current image quality is %d", currentImageQuality);
+ if (currentImageQuality == ImageUtils.IMAGE_KEEP) {
+ return Single.just(ImageUtils.IMAGE_OK);
}
+ Timber.d("Checking the validity of image");
+ String filePath = uploadItem.getMediaUri().getPath();
+
+ return Single.zip(
+ checkDuplicateImage(filePath),
+ checkImageGeoLocation(uploadItem.getPlace(), filePath),
+ checkDarkImage(filePath),
+ validateItemTitle(uploadItem),
+ checkFBMD(filePath),
+ checkEXIF(filePath),
+ (duplicateImage, wrongGeoLocation, darkImage, itemTitle, fbmd, exif) -> {
+ Timber.d("duplicate: %d, geo: %d, dark: %d, title: %d" + "fbmd:" + fbmd + "exif:" + exif,
+ duplicateImage, wrongGeoLocation, darkImage, itemTitle);
+ return duplicateImage | wrongGeoLocation | darkImage | itemTitle | fbmd | exif;
+ }
+ );
+ }
/**
* We want to discourage users from uploading images to Commons that were taken from Facebook.
@@ -115,7 +108,8 @@ public class ImageProcessingService {
.map(doesFileExist -> {
Timber.d("Result for valid title is %s", doesFileExist);
return doesFileExist ? FILE_NAME_EXISTS : IMAGE_OK;
- });
+ })
+ .subscribeOn(Schedulers.io());
}
/**
@@ -126,14 +120,14 @@ public class ImageProcessingService {
*/
private Single checkDuplicateImage(String filePath) {
Timber.d("Checking for duplicate image %s", filePath);
- return Single.fromCallable(() ->
- fileUtilsWrapper.getFileInputStream(filePath))
+ return Single.fromCallable(() -> fileUtilsWrapper.getFileInputStream(filePath))
.map(fileUtilsWrapper::getSHA1)
.flatMap(mediaClient::checkFileExistsUsingSha)
.map(b -> {
Timber.d("Result for duplicate image %s", b);
return b ? ImageUtils.IMAGE_DUPLICATE : ImageUtils.IMAGE_OK;
- });
+ })
+ .subscribeOn(Schedulers.io());
}
/**
@@ -166,7 +160,8 @@ public class ImageProcessingService {
return Single.just(ImageUtils.IMAGE_OK);
}
return imageUtilsWrapper.checkImageGeolocationIsDifferent(geoLocation, place.getLocation());
- });
+ })
+ .subscribeOn(Schedulers.io());
}
}
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ReadFBMD.java b/app/src/main/java/fr/free/nrw/commons/upload/ReadFBMD.java
index 99b2a5a5e..e98ab9ec5 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/ReadFBMD.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/ReadFBMD.java
@@ -1,48 +1,48 @@
package fr.free.nrw.commons.upload;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
import fr.free.nrw.commons.utils.ImageUtils;
import io.reactivex.Single;
+import java.io.FileInputStream;
+import java.io.IOException;
+import javax.inject.Inject;
+import javax.inject.Singleton;
/**
- * We want to discourage users from uploading images to Commons that were taken from Facebook.
- * This attempts to detect whether an image was downloaded from Facebook by heuristically
- * searching for metadata that is specific to images that come from Facebook.
+ * We want to discourage users from uploading images to Commons that were taken from Facebook. This
+ * attempts to detect whether an image was downloaded from Facebook by heuristically searching for
+ * metadata that is specific to images that come from Facebook.
*/
@Singleton
public class ReadFBMD {
- @Inject
- public ReadFBMD() {
- }
+ @Inject
+ public ReadFBMD() {
+ }
- public Single processMetadata(String path) {
- try {
- int psBlockOffset;
- int fbmdOffset;
+ public Single processMetadata(String path) {
+ return Single.fromCallable(() -> {
+ try {
+ int psBlockOffset;
+ int fbmdOffset;
- try (FileInputStream fs = new FileInputStream(path)) {
- byte[] bytes = new byte[4096];
- fs.read(bytes);
- fs.close();
- String fileStr = new String(bytes);
- psBlockOffset = fileStr.indexOf("8BIM");
- fbmdOffset = fileStr.indexOf("FBMD");
- }
-
- if (psBlockOffset > 0 && fbmdOffset > 0
- && fbmdOffset > psBlockOffset && fbmdOffset - psBlockOffset < 0x80) {
- return Single.just(ImageUtils.FILE_FBMD);
- }
- } catch (IOException e) {
- e.printStackTrace();
+ try (FileInputStream fs = new FileInputStream(path)) {
+ byte[] bytes = new byte[4096];
+ fs.read(bytes);
+ fs.close();
+ String fileStr = new String(bytes);
+ psBlockOffset = fileStr.indexOf("8BIM");
+ fbmdOffset = fileStr.indexOf("FBMD");
}
- return Single.just(ImageUtils.IMAGE_OK);
- }
+
+ if (psBlockOffset > 0 && fbmdOffset > 0
+ && fbmdOffset > psBlockOffset && fbmdOffset - psBlockOffset < 0x80) {
+ return ImageUtils.FILE_FBMD;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return ImageUtils.IMAGE_OK;
+ });
+ }
}
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.java b/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.java
deleted file mode 100644
index 7a547103a..000000000
--- a/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package fr.free.nrw.commons.upload;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
-import android.text.TextUtils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import fr.free.nrw.commons.R;
-import fr.free.nrw.commons.utils.BiMap;
-import fr.free.nrw.commons.utils.LangCodeUtils;
-
-
-public class SpinnerLanguagesAdapter extends ArrayAdapter {
-
- private final int resource;
- private final LayoutInflater layoutInflater;
- private List languageNamesList;
- private List languageCodesList;
- private final BiMap selectedLanguages;
- public String selectedLangCode="";
- private Context context;
- private boolean dropDownClicked;
- private String savedLanguageValue;
-
-
-
- public SpinnerLanguagesAdapter(@NonNull Context context,
- int resource,
- BiMap selectedLanguages,
- String savedLanguageValue) {
- super(context, resource);
- this.resource = resource;
- this.layoutInflater = LayoutInflater.from(context);
- languageNamesList = new ArrayList<>();
- languageCodesList = new ArrayList<>();
- prepareLanguages();
- this.selectedLanguages = selectedLanguages;
- this.context = context;
- this.dropDownClicked = false;
- this.savedLanguageValue = savedLanguageValue;
- }
-
- private void prepareLanguages() {
- List languages = getLocaleSupportedByDevice();
-
- for(Language language: languages) {
- if(!languageCodesList.contains(language.getLocale().getLanguage())) {
- languageNamesList.add(language.getLocale().getDisplayName());
- languageCodesList.add(language.getLocale().getLanguage());
- }
- }
- }
-
- private List getLocaleSupportedByDevice() {
- List languages = new ArrayList<>();
- Locale[] localesArray = Locale.getAvailableLocales();
- for (Locale locale : localesArray) {
- languages.add(new Language(locale));
- }
-
- Collections.sort(languages, (language, t1) -> language.getLocale().getDisplayName()
- .compareTo(t1.getLocale().getDisplayName()));
- return languages;
- }
-
- @Override
- public boolean isEnabled(int position) {
- return !languageCodesList.get(position).isEmpty()&&
- (!selectedLanguages.containsKey(languageCodesList.get(position)) ||
- languageCodesList.get(position).equals(selectedLangCode));
- }
-
- @Override
- public int getCount() {
- return languageNamesList.size();
- }
-
- @Override
- public View getDropDownView(int position, @Nullable View convertView,
- @NonNull ViewGroup parent) {
- if (convertView == null) {
- convertView = layoutInflater.inflate(resource, parent, false);
- }
- ViewHolder holder = new ViewHolder(convertView);
- holder.init(position, true, savedLanguageValue);
-
- dropDownClicked = true;
- return convertView;
- }
-
- @Override
- public @NonNull
- View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
- ViewHolder holder;
- if (convertView == null) {
- convertView = layoutInflater.inflate(resource, parent, false);
- holder = new ViewHolder(convertView);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
- holder.init(position, false, savedLanguageValue);
- return convertView;
- }
-
-
- public class ViewHolder {
-
- @Nullable
- @BindView(R.id.tv_language)
- TextView tvLanguage;
-
- @Nullable
- @BindView(R.id.view)
- View view;
-
- public ViewHolder(View itemView) {
- ButterKnife.bind(this, itemView);
- }
-
- public void init(int position, boolean isDropDownView, String savedLanguageValue) {
- String languageCode = LangCodeUtils.fixLanguageCode(languageCodesList.get(position));
- final String languageName = StringUtils.capitalize(languageNamesList.get(position));
-
- if(TextUtils.isEmpty(savedLanguageValue)){
- savedLanguageValue = Locale.getDefault().getLanguage();
- }
-
- if (!isDropDownView) {
- if( !dropDownClicked && savedLanguageValue !=null){
- languageCode = LangCodeUtils.fixLanguageCode(savedLanguageValue);
- }
- if (view != null) {
- view.setVisibility(View.GONE);
- }
- if (languageCode.length() > 2)
- tvLanguage.setText(languageCode.substring(0, 2));
- else
- tvLanguage.setText(languageCode);
- } else {
- view.setVisibility(View.VISIBLE);
- if (languageCodesList.get(position).isEmpty()) {
- tvLanguage.setText(languageName);
- tvLanguage.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
- } else {
- tvLanguage.setText(
- String.format("%s [%s]", languageName, languageCode));
- if (selectedLanguages.containsKey(languageCodesList.get(position)) &&
- !languageCodesList.get(position).equals(selectedLangCode)) {
- tvLanguage.setTextColor(Color.GRAY);
- }
- }
- }
- }
- }
-
- String getLanguageCode(int position) {
- return languageCodesList.get(position);
- }
-
- int getIndexOfUserDefaultLocale(Context context) {
- return languageCodesList.indexOf(context.getResources().getConfiguration().locale.getLanguage());
- }
-
- int getIndexOfLanguageCode(String languageCode) {
- return languageCodesList.indexOf(languageCode);
- }
-}
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.kt
new file mode 100644
index 000000000..b9c5f46c6
--- /dev/null
+++ b/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.kt
@@ -0,0 +1,104 @@
+package fr.free.nrw.commons.upload
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ArrayAdapter
+import androidx.annotation.LayoutRes
+import androidx.core.os.ConfigurationCompat
+import fr.free.nrw.commons.R
+import fr.free.nrw.commons.utils.BiMap
+import fr.free.nrw.commons.utils.LangCodeUtils
+import kotlinx.android.extensions.LayoutContainer
+import kotlinx.android.synthetic.main.row_item_languages_spinner.*
+import org.apache.commons.lang3.StringUtils
+import java.util.*
+
+/**
+ * This class handles the display of language spinners and their dropdown views for UploadMediaDetailFragment
+ *
+ * @property selectedLanguages - controls the enabled state of dropdown views
+ *
+ * @param context - required by super constructor
+ */
+class SpinnerLanguagesAdapter constructor(
+ context: Context,
+ private val selectedLanguages: BiMap<*, String>
+) : ArrayAdapter(context, -1) {
+
+ private val languageNamesList: List
+ private val languageCodesList: List
+
+ init {
+ val sortedLanguages = Locale.getAvailableLocales()
+ .map(::Language)
+ .sortedBy { it.locale.displayName }
+ languageNamesList = sortedLanguages.map { it.locale.displayName }
+ languageCodesList = sortedLanguages.map { it.locale.language }
+ }
+
+ var selectedLangCode = ""
+
+ override fun isEnabled(position: Int) = languageCodesList[position].let {
+ it.isNotEmpty() && !selectedLanguages.containsKey(it) && it != selectedLangCode
+ }
+
+ override fun getCount() = languageNamesList.size
+
+ override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup) =
+ (convertView ?: parent.inflate(R.layout.row_item_languages_spinner).also {
+ it.tag = DropDownViewHolder(it)
+ }).apply {
+ (tag as DropDownViewHolder).init(
+ languageCodesList[position],
+ languageNamesList[position],
+ isEnabled(position)
+ )
+ }
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup) =
+ (convertView ?: parent.inflate(R.layout.row_item_languages_spinner).also {
+ it.tag = SpinnerViewHolder(it)
+ }).apply { (tag as SpinnerViewHolder).init(languageCodesList[position]) }
+
+ class SpinnerViewHolder(override val containerView: View) : LayoutContainer {
+ fun init(languageCode: String) {
+ LangCodeUtils.fixLanguageCode(languageCode).let {
+ tv_language.text = if (it.length > 2) it.take(2) else it
+ }
+ }
+ }
+
+ class DropDownViewHolder(override val containerView: View) : LayoutContainer {
+ fun init(languageCode: String, languageName: String, enabled: Boolean) {
+ tv_language.isEnabled = enabled
+ if (languageCode.isEmpty()) {
+ tv_language.text = StringUtils.capitalize(languageName)
+ tv_language.textAlignment = View.TEXT_ALIGNMENT_CENTER
+ } else {
+ tv_language.text =
+ "${StringUtils.capitalize(languageName)}" +
+ " [${LangCodeUtils.fixLanguageCode(languageCode)}]"
+ }
+ }
+ }
+
+ fun getLanguageCode(position: Int): String {
+ return languageCodesList[position]
+ }
+
+ fun getIndexOfUserDefaultLocale(context: Context): Int {
+ return languageCodesList.indexOf(context.locale.language)
+ }
+
+ fun getIndexOfLanguageCode(languageCode: String): Int {
+ return languageCodesList.indexOf(languageCode)
+ }
+}
+
+private fun ViewGroup.inflate(@LayoutRes resId: Int) =
+ LayoutInflater.from(context).inflate(resId, this, false)
+
+private val Context.locale: Locale
+ get() = ConfigurationCompat.getLocales(resources.configuration)[0]
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java
index fc31de440..be7256c10 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java
@@ -202,8 +202,8 @@ public class UploadMediaDetailAdapter extends RecyclerView.Adapter getImageQuality(UploadItem uploadItem, boolean checkTitle) {
- return imageProcessingService.validateImage(uploadItem, checkTitle);
+ public Single getImageQuality(UploadItem uploadItem) {
+ return imageProcessingService.validateImage(uploadItem);
}
private UploadItem getUploadItem(UploadableFile uploadableFile,
@@ -213,6 +201,8 @@ public class UploadModel {
CommonsApplication.DEFAULT_EDIT_SUMMARY, selectedDepictions, item.gpsCoords.getCoords());
if (item.place != null) {
contribution.setWikiDataEntityId(item.place.getWikiDataEntityId());
+ // If item already has an image, we need to know it. We don't want to override existing image later
+ contribution.setP18Value(item.place.pic);
}
if (null == selectedCategories) {//Just a fail safe, this should never be null
selectedCategories = new ArrayList<>();
@@ -409,4 +399,4 @@ public class UploadModel {
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java
index 79e487223..1da8848b0 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java
@@ -289,12 +289,15 @@ public class UploadService extends HandlerService {
Timber.d("Contribution upload success. Initiating Wikidata edit for entity id %s",
contribution.getWikiDataEntityId());
// to perform upload of depictions we pass on depiction entityId of the selected depictions to the wikidataEditService
+ final String p18Value = contribution.getP18Value();
if (contribution.getDepictionsEntityIds() != null) {
for (String s : contribution.getDepictionsEntityIds()) {
- wikidataEditService.createClaimWithLogging(s, canonicalFilename);
+ wikidataEditService.createClaimWithLogging(s, canonicalFilename,
+ p18Value);
}
}
- wikidataEditService.createClaimWithLogging(contribution.getWikiDataEntityId(), canonicalFilename);
+ wikidataEditService.createClaimWithLogging(contribution.getWikiDataEntityId(), canonicalFilename,
+ p18Value);
wikidataEditService.createLabelforWikidataEntity(contribution.getWikiDataEntityId(), canonicalFilename,
(Map) contribution.getCaptions());
contribution.setFilename(canonicalFilename);
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java
index ac4a5a0fb..e7c51d61c 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java
@@ -254,7 +254,7 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
@OnClick(R.id.btn_next)
public void onNextButtonClicked() {
uploadItem.setMediaDetails(uploadMediaDetailAdapter.getUploadMediaDetails());
- presenter.verifyImageQuality(uploadItem, true);
+ presenter.verifyImageQuality(uploadItem);
}
@OnClick(R.id.btn_previous)
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailsContract.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailsContract.java
index 587d8c061..3d017543f 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailsContract.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailsContract.java
@@ -43,7 +43,7 @@ public interface UploadMediaDetailsContract {
void receiveImage(UploadableFile uploadableFile, @Contribution.FileSource String source,
Place place);
- void verifyImageQuality(UploadItem uploadItem, boolean validateTitle);
+ void verifyImageQuality(UploadItem uploadItem);
void setUploadItem(int index, UploadItem uploadItem);
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.java
index 3a6880a49..aabcaf722 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.java
@@ -111,14 +111,14 @@ public class UploadMediaPresenter implements UserActionListener, SimilarImageInt
* asks the repository to verify image quality
*
* @param uploadItem
- * @param validateTitle
*/
@Override
- public void verifyImageQuality(UploadItem uploadItem, boolean validateTitle) {
+ public void verifyImageQuality(UploadItem uploadItem) {
view.showProgress(true);
- Disposable imageQualityDisposable = repository
- .getImageQuality(uploadItem, true)
- .subscribeOn(ioScheduler)
+
+ compositeDisposable.add(
+ repository
+ .getImageQuality(uploadItem)
.observeOn(mainThreadScheduler)
.subscribe(imageResult -> {
view.showProgress(false);
@@ -129,9 +129,8 @@ public class UploadMediaPresenter implements UserActionListener, SimilarImageInt
view.showMessage("" + throwable.getLocalizedMessage(),
R.color.color_error);
Timber.e(throwable, "Error occurred while handling image");
- });
-
- compositeDisposable.add(imageQualityDisposable);
+ })
+ );
}
/**
diff --git a/app/src/main/java/fr/free/nrw/commons/utils/ImageUtilsWrapper.java b/app/src/main/java/fr/free/nrw/commons/utils/ImageUtilsWrapper.java
index 5cfaf08ec..bb40ee1cf 100644
--- a/app/src/main/java/fr/free/nrw/commons/utils/ImageUtilsWrapper.java
+++ b/app/src/main/java/fr/free/nrw/commons/utils/ImageUtilsWrapper.java
@@ -1,31 +1,30 @@
package fr.free.nrw.commons.utils;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
import fr.free.nrw.commons.location.LatLng;
import io.reactivex.Single;
import io.reactivex.schedulers.Schedulers;
+import javax.inject.Inject;
+import javax.inject.Singleton;
@Singleton
public class ImageUtilsWrapper {
- @Inject
- public ImageUtilsWrapper() {
+ @Inject
+ public ImageUtilsWrapper() {
- }
+ }
- public Single checkIfImageIsTooDark(String bitmapPath) {
- return Single.just(ImageUtils.checkIfImageIsTooDark(bitmapPath))
- .subscribeOn(Schedulers.computation())
- .observeOn(Schedulers.computation());
- }
+ public Single checkIfImageIsTooDark(String bitmapPath) {
+ return Single.fromCallable(() -> ImageUtils.checkIfImageIsTooDark(bitmapPath))
+ .subscribeOn(Schedulers.computation());
+ }
- public Single checkImageGeolocationIsDifferent(String geolocationOfFileString, LatLng latLng) {
- boolean isImageGeoLocationDifferent = ImageUtils.checkImageGeolocationIsDifferent(geolocationOfFileString, latLng);
- return Single.just(isImageGeoLocationDifferent)
- .subscribeOn(Schedulers.computation())
- .observeOn(Schedulers.computation())
- .map(isDifferent -> isDifferent ? ImageUtils.IMAGE_GEOLOCATION_DIFFERENT : ImageUtils.IMAGE_OK);
- }
+ public Single checkImageGeolocationIsDifferent(String geolocationOfFileString,
+ LatLng latLng) {
+ return Single.fromCallable(
+ () -> ImageUtils.checkImageGeolocationIsDifferent(geolocationOfFileString, latLng))
+ .subscribeOn(Schedulers.computation())
+ .map(isDifferent -> isDifferent ? ImageUtils.IMAGE_GEOLOCATION_DIFFERENT
+ : ImageUtils.IMAGE_OK);
+ }
}
diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.java b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.java
index 206acb7fe..c6790b8fb 100644
--- a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.java
+++ b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.java
@@ -2,22 +2,9 @@ package fr.free.nrw.commons.wikidata;
import android.annotation.SuppressLint;
import android.content.Context;
-
+import androidx.annotation.NonNull;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
-
-import org.wikipedia.csrf.CsrfTokenClient;
-import org.wikipedia.dataclient.Service;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.kvstore.JsonKvStore;
@@ -29,6 +16,15 @@ import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+import org.wikipedia.csrf.CsrfTokenClient;
+import org.wikipedia.dataclient.Service;
import timber.log.Timber;
/**
@@ -75,11 +71,17 @@ public class WikidataEditService {
/**
* Create a P18 claim and log the edit with custom tag
+<<<<<<< HEAD
*
* @param wikidataEntityId
* @param fileName
+=======
+ * @param wikidataEntityId a unique id of each Wikidata items
+ * @param fileName name of the file we will upload
+ * @param p18Value pic attribute of Wikidata item
+>>>>>>> origin/master
*/
- public void createClaimWithLogging(String wikidataEntityId, String fileName) {
+ public void createClaimWithLogging(String wikidataEntityId, String fileName, @NonNull String p18Value) {
if (wikidataEntityId == null) {
Timber.d("Skipping creation of claim as Wikidata entity ID is null");
return;
@@ -95,6 +97,11 @@ public class WikidataEditService {
return;
}
+ if (!p18Value.trim().isEmpty()) {
+ Timber.d("Skipping creation of claim as p18Value is not empty, we won't override existing image");
+ return;
+ }
+
editWikidataProperty(wikidataEntityId, fileName);
//editWikiBaseDepictsProperty(wikidataEntityId, fileName);
}
@@ -316,4 +323,4 @@ public class WikidataEditService {
ViewUtil.showLongToast(context, context.getString(R.string.wikidata_edit_failure));
});
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/res/drawable/linearlayout_color_dark_selector.xml b/app/src/main/res/drawable/linearlayout_color_dark_selector.xml
new file mode 100644
index 000000000..ffb78141a
--- /dev/null
+++ b/app/src/main/res/drawable/linearlayout_color_dark_selector.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/linearlayout_color_selector.xml b/app/src/main/res/drawable/linearlayout_color_selector.xml
new file mode 100644
index 000000000..f11c4a93a
--- /dev/null
+++ b/app/src/main/res/drawable/linearlayout_color_selector.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/nearby_search_list_item.xml b/app/src/main/res/layout/nearby_search_list_item.xml
index b6261e80b..439e6fe70 100644
--- a/app/src/main/res/layout/nearby_search_list_item.xml
+++ b/app/src/main/res/layout/nearby_search_list_item.xml
@@ -1,18 +1,20 @@
+
+ android:padding="@dimen/tiny_margin"
+ android:background="@drawable/linearlayout_color_selector">
+ android:layout_height="wrap_content"/>
+ android:layout_height="wrap_content"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/nearby_search_list_item_dark.xml b/app/src/main/res/layout/nearby_search_list_item_dark.xml
index fd87641f3..e62ab7b42 100644
--- a/app/src/main/res/layout/nearby_search_list_item_dark.xml
+++ b/app/src/main/res/layout/nearby_search_list_item_dark.xml
@@ -4,16 +4,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/tiny_margin"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:background="@drawable/linearlayout_color_dark_selector">
+ android:layout_height="wrap_content"/>
+ android:textColor="@color/white"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/row_item_languages_spinner.xml b/app/src/main/res/layout/row_item_languages_spinner.xml
index 2d60e21c8..2c8dd8feb 100644
--- a/app/src/main/res/layout/row_item_languages_spinner.xml
+++ b/app/src/main/res/layout/row_item_languages_spinner.xml
@@ -22,9 +22,4 @@
tools:text="en"
/>
-
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
index e5e2e18c8..f63c78ba7 100644
--- a/app/src/main/res/values-af/strings.xml
+++ b/app/src/main/res/values-af/strings.xml
@@ -71,7 +71,7 @@
GPS is uitgesit in uw apparaat. Wil u die aansit?
GPS aansit
Nog geen uploads
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -369,7 +369,6 @@
Gebruik die gepaste outeur se naam
Gebruik \'n pasgemaakte outeurnaam in plaas van u gebruikersnaam terwyl u foto\'s oplaai
Pasgemaakte outeurnaam
- Die pasgemaakte outeur se naam om te gebruik in plaas van u gebruikersnaam in oplaaie
bydraes
Naby
Kennisgewings
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 4bd8f03ba..282df85ef 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -11,6 +11,7 @@
* Mido
* Monrokhoury
* Mr. Ibrahem
+* NEHAOUA
* OsamaK
* ترجمان05
* ديفيد
@@ -49,7 +50,7 @@
اكتمال رفع %1$s
فشل رفع %1$s
انقر لتشاهد
-
+
- %1$d رفع ملف
- %1$d رفع ملفات
@@ -85,16 +86,16 @@
عطل نظام الملاحة العالمي GPS بجهازك. أترغب في التنشيط؟
تفعيل GPS
لا مرفوعات بعد
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
-
+
- جارٍ بدء %1$d رفع
- جارٍ بدء %1$d مرفوعات
- {{جمع|واحد=%1$d رفع|%1$d رفع}}
+ {{جمع|واحد=%1$d رفع|%1$d رفع}}
لا توجد تصنيفات تطابق %1$s
أضف تصنيفات لجعل صورك أكثر قابلية للاكتشاف على ويكيميديا كومنز.\n\nابدأ الكتابة لإضافة تصنيفات.
تصنيفات
@@ -106,8 +107,8 @@
حول
تطبيق ويكيميديا كومنز تطبيق مفتوح المصدر تم إنشاؤه وصيانته من قبل المستفيدين والمتطوعين من مجتمع ويكيميديا، لا تشارك مؤسسة ويكيميديا في إنشاء التطبيق أو تطويره أو صيانته.
أنشئ <a href=\"%1$s\">مشكلة غيت هب</a> جديدة لتقارير الأخطاء والاقتراحات.
- <u>Pسياسة الخصوصية</u>
- <u>الإحالات</u>
+ سياسة الخصوصية
+ الإحالات
حول
إرسال ملاحظات (عبر البريد الإلكتروني)
عميل البريد الإلكتروني غير مثبت
@@ -116,7 +117,7 @@
لم ترفع بعد أية صور.
إعادة المحاولة
إلغاء
-
+
- سيتم ترخيص هذه الصورة تحت %1$s
- سيتم ترخيص هذه الصور تحت %1$s
@@ -126,7 +127,7 @@
استخدم العنوان والوصف السابق
الحصول تلقائيا على الموقع الحالي
يسترد الموقع الحالي إذا لم يتم وسم الصورة جغرافيا، وكان هناك وسم جغرافي عليها، تحذير: سيكشف هذا عن موقعك الحالي.
- الوضع الليلي
+ الوضع الليلي
النسبة-الترخيص بالمثل 4.0
الإحالة 4.0
النسبة-الترخيص بالمثل 3.0
@@ -167,7 +168,7 @@
تجنب المواد محفوظة الحقوق الموجودة على الإنترنت وصور الملصقات وأغلفة الكتب، إلخ.
هل تظن أنك فهمت؟
نعم!
- <u>المزيد من المعلومات</u>
+ مزيد من المعلومات
تصنيفات
جارٍ التحميل…
لا شيء محدد
@@ -269,7 +270,7 @@
خطأ! المسار غير موجود
ترشيح للحذف
الصورة تم ترشيحها للحذف.
- <u>انظر صفحة الويب للتفاصيل</u>
+ انظر صفحة الويب للتفاصيل
جارٍ ترشيح %1$s للحذف.
جارٍ ترشيح الملف للحذف: %1$s
عرض في المتصفح
@@ -281,7 +282,7 @@
انسخ نص الويكي إلى الكليب بورد
نص الويكي تم نسخه إلى الكليب بورد
الموقع لم يتغير.
- الموقع غير متوفر.
+ قد لا تعمل الأجهزة المجاورة بشكل صحيح، الموقع غير متوفر.
صلاحية مطلوبة لعرض قائمة بالأماكن القريبة
الحصول على الاتجاهات
قراءة المقالة
@@ -294,8 +295,8 @@
ويكي بيانات
ويكيبيديا
كومنز
- <u>قيِّمنا</u>
- <u>الأسئلة المتكررة</u>
+ قيِّمنا
+ الأسئلة المتكررة
تخطي البرنامج التعليمي
الإنترنت غير متوفر
الإنترنت متاح
@@ -303,7 +304,7 @@
خطأ في جلب الصورة للمراجعة، اضغط على تحديث للمحاولة مرة أخرى.
خطأ في جلب تصنيات الصورة للمراجعة، اضغط على تحديث للمحاولة مرة أخرى.
لم يتم العثور على إشعارات
- <u>ترجمة</u>
+ ترجمة
اللغات
اختر اللغة التي ترغب في تقديم ترجمات لها
تقدم
@@ -386,7 +387,6 @@
استخدم اسم مؤلف مخصصا
استخدم اسم مؤلف مخصصا بدلا من اسم المستخدم الخاص بك أثناء رفع الصور
اسم المؤلف المخصص
- اسم المؤلف المخصص لاستخدامه بدلا من اسم المستخدم الخاص بك في المرفوعات
مساهمات
مجاور
الإشعارات
@@ -405,7 +405,7 @@
إرسال
يوجد ملف باسم الملف %1$s، هل أنت متأكد أنك تريد المتابعة؟
لا يمكن العثور على تطبيق خرائط متوافق على جهازك; الرجاء تثبيت تطبيق خرائط لاستخدام هذه الميزة.
-
+
- %1$d رفع
- %1$d مرفوعات
@@ -445,6 +445,7 @@
عرض إذن الموقع
اطلب إذن الموقع عند الحاجة إلى ميزة عرض بطاقة التنبيه القريبة.
حدث خطأ ما; لم نتمكن من جلب إنجازاتك
+ لقد قدمت الكثير من المساهمات لا يستطيع نظامنا لحساب الإنجازات التعامل معها. هذا هو الإنجاز النهائي.
ينتهي في:
عرض الحملات
انظر الحملات الجارية
@@ -495,7 +496,7 @@
الصورة التالية
النقر فوق هذا الزر سيمنحك صورة أخرى مرفوعة مؤخرا من ويكيميديا كومنز
يمكنك مراجعة الصور وتحسين جودة ويكيميديا كومنز.\n وسائط اللمراجعة الأربعة هي:\n - هل هذه الصورة في النطاق؟\n - هل تتبع هذه الصورة قواعد حقوق النشر؟\n - هل هذه الصورة مصنفة بشكل صحيح؟\n - إذا سارت الأمور على ما يرام يمكنك أيضا شكر المساهم.
-
+
- جارٍ تلقي محتوى مشترك، قد تستغرق معالجة الصورة بعض الوقت بناءً على حجم الصور وجهازك
- جارٍ تلقي محتوى مشترك، قد تستغرق معالجة الصور بعض الوقت بناءً على حجم الصور وجهازك
@@ -564,5 +565,17 @@
نوع المكان:
جسر، متحف، فندق، إلخ
حدث خطأ ما عند الدخول، يجب عليك إعادة تعيين كلمة المرور!!
+ تم العثور على مكان قريب
+ هل هذه صورة للمكان %1$؟
+ استكشف
+ العلامات
+ الإعدادات
+ أزل من العلامات
+ اضف إلى العلامات
+ هناك خطأ ما. تعذر تعيين الخلفية
اجعلها خلفية
+ إعداد الخلفية. أرجو الإنتظار…
+ افتراضي
+ غامق
+ فاتح
diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml
index db5d38594..4c81d8ecd 100644
--- a/app/src/main/res/values-ast/strings.xml
+++ b/app/src/main/res/values-ast/strings.xml
@@ -72,7 +72,7 @@
El GPS ta desactiváu nel preséu. ¿Quiés activalu?
Activar GPS
Inda nun hai xubes
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -376,7 +376,6 @@
Usar nome d\'autor personalizáu
Usar un nome d\'autor personalizáu en cuenta del to nome d\'usuariu al xubir semeyes
Nome d\'autor personalizáu
- El nome d\'autor personalizáu pa usar nes xubíes en cuenta del to nome d\'usuariu
Collaboraciones
Cercanu
Avisos
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 7366a3e74..6c80025b7 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -214,7 +214,6 @@
Използване на персонализирано авторско име
При качването използвайте персонализирано авторско име вместо потребителското си име
Персонализирано авторско име
- Персонализираното авторско име, което ще се използва вместо потребителското ви име при качване
Известия (архивирани)
Списък
Следваща
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index 0e115eb18..31f204d77 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -81,7 +81,7 @@
GPS আপনার ডিভাইসে অক্ষম করা আছে। আপনি কি এটি সক্ষম করতে চান?
GPS সক্রিয় করুন
এখনো কোন আপলোড নেই
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml
index fb7ef893d..89256ca19 100644
--- a/app/src/main/res/values-br/strings.xml
+++ b/app/src/main/res/values-br/strings.xml
@@ -38,7 +38,7 @@
Oc\'h echuiñ enporzhiadenn %1$s
C\'hwitet en deus enporzhiañ %1$s
Pouezit evit diskwel
-
+
- %1$d restr o vezañ karget
- %1$d restr o vezañ karget
@@ -74,16 +74,16 @@
Diwerededkaet eo ar GPS war hoc\'h ardivink.\nHa c\'hoant ho peus da weredekaat anezhañ ?
Gweredekaat ar GPS
Enporzhiadenn ebet c\'hoazh !
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
-
+
- %1$d bellgargadenn loc\'het
- %1$d pellgargadennoù loc\'het
-
+
- %1$d bellgargadenn
- %1$d pellgargadennoù
@@ -107,7 +107,7 @@
N\'ho peus ket enporzhiet skeudennoù c\'hoazh.
Klask en-dro
Nullañ
-
+
- gant an aotre-implijout %1$s e vo ar skeudenn-mañ
- gant an aotreoù-implijout %1$s e vo ar skeudenn-mañ
diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml
index 4c96163a1..179527659 100644
--- a/app/src/main/res/values-bs/strings.xml
+++ b/app/src/main/res/values-bs/strings.xml
@@ -26,7 +26,7 @@
Postavljanje datoteke %1$s završeno
Postavljanje datoteke %1$s nije uspjelo
Dodirnite da biste vidjeli
-
+
- postavlja se %1$d datoteka
- postavlja se %1$d datoteka
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 56c45a453..4f8e1ccfd 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -76,7 +76,7 @@
El vostre dispositiu no té el GPS habilitat. El voleu habilitar?
Habilita el GPS
Encara no hi ha cap càrrega
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -353,7 +353,6 @@
Utilitza un nom d\'autor personalitzat
Utilitza un nom d\'autor personalitzat en comptes del vostre nom d\'usuari a l\'hora de pujar fotos
Nom de l\'autor personalitzat
- El nom d\'autor personalitzat que s\'utilitzarà en comptes del vostre nom d\'usuari en les pujades
Contribucions
A prop
Notificacions
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 4c9ca0a6b..3d0cf5ac3 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -52,7 +52,7 @@
Dokončení nahrávání souboru %1$s
Načítání souboru %1$s se nezdařilo
Klepnutím zobrazíte
-
+
- %1$d soubor se nahrává
- %1$d souborů se nahrává
@@ -88,16 +88,16 @@
GPS ve vašem zařízení není povoleno. Chtěli byste ho spustit?
Spustit GPS
Žádné nahrané soubory
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
-
+
- Spouští se nahrávání %1$d souboru
- Spouští se nahrávání %1$d souborů
-
+
- %1$d nahrávání
- %1$d nahrávání
@@ -122,7 +122,7 @@
Zatím jste nenahrál žádné fotky.
Opakovat
Zrušit
-
+
- Tento obrázek bude zveřejněn pod licencí %1$s
- Tyto obrázky budou zveřejněny pod licencí %1$s
@@ -132,7 +132,7 @@
Použít předchozí název a popis
Automaticky získat aktuální polohu
Nabídnout kategorie na základě aktuální polohy (pokud není obrázek opatřen souřadnicemi). Varování: Tímto krokem poskytujete svou současnou polohu.
- Noční režim
+ Vzhled
Uveďte autora-Zachovejte licenci 4.0
Uveďte autora 4.0
Uveďte autora-Zachovejte licenci 3.0
@@ -392,7 +392,6 @@
Použít vlastní název autora
Při nahrávání fotografií používejte vlastní jméno autora namísto uživatelského jména
Vlastní název autora
- Vlastní název autora, který chcete používat místo uživatelského jména v nahrávání
Příspěvky
Poblíž
Upozornění
@@ -411,7 +410,7 @@
Odeslat
Soubor s názvem %1$s již existuje. Opravdu chcete pokračovat?
Na vašem zařízení nebyla nalezena žádná kompatibilní aplikace poskytující mapy. Pro použití této funkce nainstalujte aplikaci poskytující mapy.
-
+
- %1$d nahrání
- %1$d nahrání
@@ -501,7 +500,7 @@
Další soubor
Kliknutím na toto tlačítko se zobrazí další nedávno nahraný obrázek z Wikimedia Commons
Můžete kontrolovat obrázky a zlepšit kvalitu Wikimedia Commons.\n\nTři aspekty, které se posuzují:\n - Je tento obrázek v pořádku?\n - Dodržuje tento obrázok pravidla autorských práv?\n - Je tento obrázek správně kategorizován?\n\nPokud je vše v pořádku, autorovi můžete poděkovat.
-
+
- Probíhá příjem sdíleného obsahu. Zpracování obrázku může chvíli trvat v závislosti na velikosti obrázku a vašem zařízení
- Probíhá příjem sdíleného obsahu. Zpracování obrázků může chvíli trvat v závislosti na velikosti obrázků a vašem zařízení
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index 3a7d55d52..79593090c 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -36,7 +36,7 @@
Yn gorffen uwchlwytho %1$s
Methwyd uwchlwytho %1$s
Tapiwch i weld
-
+
- %1$d ffeil yn uwchlwytho
- %1$d ffeil yn uwchlwytho
@@ -72,16 +72,16 @@
Ataliwyd GPS ar eich dyfais. Ydych chi am ei droi\'n weithredol?
Gweithredu\'r GPS
Heb uwchlwytho eto
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
-
+
- Cychwyn %1$d uwchlwythiad
- Cychwyn uwchlwytho %1$d ffeil
-
+
- %1$d uwchlwythiad
- %1$d uwchlwythiad
@@ -106,7 +106,7 @@
Nid ydych wedi uwchlwytho ffotograffau eto.
Ailgynnig
Diddymer
-
+
- Caiff y ddelwedd hon ei thrwyddedu yn ôl termau\'r drwydded %1$s
- Caiff y delweddau hyn eu trwyddedu dan %1$s
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 771a98d91..e07baae86 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -117,7 +117,7 @@
Brug forrige titel og beskrivelse
Hent automatisk nuværende placering
Henter den nuværende placering for at tilbyde kategoriforslag hvis billedet ikke er geografisk mærket og geomærker billedet. Advarsel: Dette vil afsløre din nuværende placering.
- Nat-tilstand
+ Tema
Attribution-ShareAlike 4.0
Attribution 4.0
Attribution-ShareAlike 3.0
@@ -385,4 +385,8 @@
Findes
Mangler et billede
Bro, museum, hotel, osv.
+ Bogmærker
+ Standard
+ Mørkt
+ Lyst
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 56eb7e690..4a11d13fa 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -82,7 +82,7 @@
GPS ist auf deinem Gerät deaktiviert. Möchtest du es aktivieren?
GPS aktivieren
Noch keine hochgeladenen Dateien
-
+
- \@string/contributions_subtitle_zero
- Eine hochgeladene Datei
- %1$d hochgeladene Dateien
@@ -385,7 +385,6 @@
Benutzerdefinierten Namen des Autors verwenden
Einen benutzerdefinierten Namen des Autors anstelle deines Benutzernamens beim Hochladen von Fotos verwenden
Benutzerdefinierter Name des Autors
- Der benutzerdefinierte Name des Autors, der anstelle deines Benutzernamens in den hochgeladenen Dateien erscheinen soll.
Beiträge
In der Nähe
Benachrichtigungen
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 0d6ad346c..c38732446 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -83,7 +83,7 @@
Το GPS στην συσκευή είναι απενεργοποιημένο. Θέλετε να το ενεργοποιήσετε;
Ενεργοποιήσετε το GPS
Δεν έχουν ακόμη επιφορτωθεί αρχεία
-
+
- Δεν υπάρχουν φορτώσεις ακόμη
- %1$d φόρτωση
- %1$d φορτώσεις
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index e89c59a71..55ac4b244 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -75,7 +75,7 @@
GPS estas malŝaltita en via aparato. Ĉu vi volas ŝalti ĝin?
Ŝalti la GPS
Neniuj alŝutaĵoj ĝis nun!
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -378,7 +378,6 @@
Uzi laŭmendan aŭtoran nomon
Uzi laŭmendan aŭtoran nomon anstataŭ via uzantnomon por alŝutado de fotoj
Laŭmenda aŭtora nomo
- La laŭmenda aŭtora nomo uzota anstataŭ via uzantnomo por alŝutoj
Kontribuoj
Apude
Sciigoj
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 9cd32dfef..e24900047 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -97,7 +97,7 @@
El GPS está desactivado en tu dispositivo. ¿Quieres activarlo?
Activar GPS
No hay subidas aún
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -401,7 +401,6 @@
Usar nombre de autor personalizado
Usar un nombre de autor personalizado en vez de tu nombre de usuario al subir fotos
Nombre de autor personalizado
- El nombre de autor personalizado para usar en las subidas en vez de tu nombre de usuario
Contribuciones
Cercanos
Notificaciones
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 600769d1d..e62a3e388 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -77,7 +77,7 @@
GPSa desgaituta dago gailu honetan. Gaitu nahi duzu?
GPSa gaitu
Oraindik ez da ezer igo
-
+
- \@string/contributions_subtitle_zero
- igoera (%1$d)
- (%1$d) igoera
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index e9fec5fef..b02bb3cbd 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -82,7 +82,7 @@
GPS ei ole käytössä. Haluatko ottaa sen käyttöön?
Ota GPS käyttöön
Ei tallennuksia vielä
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -287,14 +287,14 @@
Wikidata
Wikipedia
Commons
- <u>Arvostele meidät</u>
- <u>UKK</u>
+ Arvostele meidät
+ UKK
Ohita opetus
Internet ei saatavissa
Internet saatavana
Virhe ilmoitusten haussa
Ilmoituksia ei löytynyt
- <u>Käännä</u>
+ Käännä
Kielet
Valitse kieli, joksi haluaisit kääntää
Jatka
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index d8cdf44cd..9d8bb7a05 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -96,7 +96,7 @@
Le GPS est désactivé sur votre appareil. Voulez-vous l’activer ?
Activer le GPS
Encore aucun téléversement
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -400,7 +400,6 @@
Utilisez un nom d\'auteur personnalisé
Utilisez un nom d\'auteur personnalisé au lieu de votre nom d\'utilisateur lorsque vous téléversez des photos
Nom d\'auteur personnalisé
- Le nom d\'auteur personnalisé à utiliser au lieu du nom d\'utilisateur dans vos téléversements
Contributions
Proche
Notifications
@@ -459,6 +458,7 @@
Afficher l\'autorisation de géolocalisation
Demander le droit de géolocaliser quand cela est nécessaire à la fonction de notification de proximité.
Un problème est survenu, nous n\'avons pas pu récupérer vos accomplissements
+ Vous avez effectué tellement de contributions que notre système de calcul des accomplissements est débordé. Il s\'agit là de l\'accomplissement ultime.
Se termine le:
Campagnes d\'affichage
Voir les campagnes en cours
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index e73516e74..fd3b45f8d 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -78,7 +78,7 @@
O GPS está desactivado no seu dispositivo. Quere activalo?
Activar GPS
Aínda non hai subas
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -382,7 +382,6 @@
Usar nome personalizado de autor
Usar un nome personalizado de autor en lugar do seu nome de usuario á hora de cargar imaxes
Nome personalizado de autor
- O nome personalizado de autor a utilizar nas cargas en lugar do seu nome de usuario
Contribucións
Preto
Notificacións
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index b231eb136..d103114a7 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -87,7 +87,7 @@
आपके डिवाइस में जीपीएस अक्षम है। क्या आप इसे सक्षम करना चाहेंगे?
जीपीएस सक्षम करें
अभी तक कोई अपलोड नहीं
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index b34fb2822..50ab0f894 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -35,7 +35,7 @@
Završeno postavljanje %1$s
Postavljanje %1$s neuspješno
Dodirnite da biste vidjeli
-
+
- Postavlja se %1$d datoteka
- Postavljaju se %1$d datoteke
@@ -75,11 +75,11 @@
- %1$d postavljena datoteka
- %1$d postavljene datoteke
-
+
- Započeto %1$d postavljanje
- Započeta %1$d postavljanja
-
+
- %1$d postavljanje
- %1$d postavljanja
@@ -280,10 +280,19 @@
Razina
Došlo je do pogrješke!
Obavijesti Zajedničkoga poslužitelja
+ Toliko ste pridonijeli projektu da se naš sustav za računanje postignuća ne može nositi s time. To je vrhunsko postignuće.
Došlo je do pogrješke tijekom obradbe slike. Molimo Vas, pokušajte ponovo!
Molimo Vas, pričekajte ...
Preskoči ovu sliku
Zadani jezik za opis
+ Istraži
+ Oznake
+ Postavke
+ Uklonjeno iz oznaka
+ Dodano u oznake
+ Nešto je pošlo po zlu. Ne možemo postaviti pozadinu
+ Postavi kao pozadinu
+ Postavljanje pozadine. Molimo, pričekajte...
Zadano
Tamno
Svijetlo
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index d9bbe3c62..99310cce5 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -374,7 +374,6 @@
Gunakan nama lain
Gunakan nama lain, bukan nama pengguna Anda saat mengunggah foto
Nama lain
- Nama lain untuk digunakan sebagai ganti nama pengguna Anda pada unggahan
Kontribusi
Sekitar
Pemberitahuan
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index 1b4daceda..09eac819c 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -71,7 +71,7 @@
GPS er óvirkt í tækinu þínu. Viltu virkja það?
Virkja GPS
Engar innsendingar ennþá
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -369,7 +369,6 @@
Nota sérsniðið nafn höfundar
Nota sérsniðið nafn höfundar í stað notandanafnsins þíns þegar ljósmyndir eru sendar inn
Sérsniðið nafn höfundar
- Sérsniðið nafn höfundar sem nota á í stað notandanafnsins þíns þegar myndir eru sendar inn
Framlög
Nálægt
Tilkynningar
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index feccb2b0f..85e33fcd6 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -83,7 +83,7 @@
Il GPS è disabilitato nel dispositivo. Vuoi attivarlo?
Attiva GPS
Non è stato ancora caricato niente
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -381,7 +381,6 @@
Usa il nome dell\'autore personalizzato
Utilizza un nome dell\'autore personalizzato al posto del tuo nome utente durante il caricamento delle foto
Nome dell\'autore personalizzato
- Il nome dell\'autore personalizzato da usare al posto del tuo nome utente nei caricamenti
Contributi
Nelle vicinanze
Notifiche
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 9ea157c7f..60f35b7c3 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -50,7 +50,7 @@
העלאת %1$s מסתיימת
העלאת %1$s נכשלה
לחץ כדי להציג
-
+
- מועלה קובץ אחד
- מועלים %1$d קבצים
@@ -86,16 +86,16 @@
ה־GPS במכשיר שלך אינו מופעל. האם להפעיל אותו?
הפעלת GPS
לא הועלה עדיין שום דבר
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
-
+
- התחלת העלאה
- התחלת 1$d% העלאות
-
+
- העלאה אחת
- %1$d העלאות
@@ -120,7 +120,7 @@
עדיין לא העלית תמונות.
לנסות שוב
ביטול
-
+
- התמונה הזאת תפורסם ברישיון %1$s
- התמונות האלה תפורסמנה ברישיון %1$s
@@ -390,7 +390,6 @@
שימוש בשם יוצר מותאם אישית
שימוש בשם יוצר בהתאמה אישית במקום בשם המשתמש שלך בעת העלאת תמונות
שם יוצר מותאם אישית
- שם יוצר מותאם אישית לשימוש במקום שם המשתמש שלך להעלאות
תרומות
בסביבה
התראות
@@ -409,7 +408,7 @@
שליחה
כבר קיים קובץ בשם %1$s. להמשיך?
לא נמצא יישום מפה תואם במכשיר שלך. נא להתקין יישום מפה כדי להשתמש בתכונה זו.
-
+
- העלאה אחת
- %1$d העלאות
@@ -500,7 +499,7 @@
התמונה הבאה
לחיצה על הכפתור הזה תציג בפניך תמונה נוספת שנוספה לאחרונה לוויקישיתוף
ניתן לסקור את התמונות ולשפר את האיכות של ויקישיתוף.\nארבע יסודות הסקירה הם:\n- האם התמונה קשורה לנושא?\n- האם התמונה תואמת לכללי זכויות היוצרים?\n- האם התמונה נמצאת בקטגוריה הנכונה?\n- אם הכול בסדר, ניתן גם להודות למי שתרם אותה.
-
+
- מתקבל תוכן שיתופי. עיבוד התמונה עשוי לארוך זמן מה כתלות בגודל התמונה והמכשיר שלך
- מתקבל תוכן שיתופי. עיבוד התמונות עשוי לארוך זמן מה כתלות בגודל התמונות והמכשיר שלך
@@ -582,4 +581,7 @@
ברירת מחדל
כהה
בהירה
+ פתיחת הגדרות המיקום נכשלה. נא להפעיל את איתור המיקום ידנית
+ לתוצאות המיטביות יש להשתמש במצב דיוק גבוה.
+ להפעיל מיקום?
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 256dbfa9c..40ca17def 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -386,7 +386,6 @@
専用の投稿者名を使う
画像の投稿にはユーザー名ではなく専用の投稿者名を使う
投稿専用の名前
- ユーザー名ではなく、投稿専用の投稿者名
投稿記録
付近
お知らせ
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 0c68be3ce..3ad8f90ff 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -371,7 +371,6 @@
사용자 지정 저자 이름을 사용합니다
사진을 업로드하는 중에 사용자 이름 대신 사용자 지정 저자 이름을 사용합니다
저자 이름 사용자 지정
- 업로드할 때 사용자 이름 대신 사용할 사용자 지정 저자 이름
기여
근처
알림
diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml
index bbbac5bbd..83049c8f1 100644
--- a/app/src/main/res/values-lb/strings.xml
+++ b/app/src/main/res/values-lb/strings.xml
@@ -69,7 +69,7 @@
GPS ass op Ärem Apparat ausgeschalt. Wëllt Dir en aktivéieren?
GPS aktivéieren
Nach keng eropgeluede Fichieren
-
+
- N@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -134,7 +134,7 @@
CC Zero
Wikimedia Commons späichert déi meescht Biller, déi op Wikipedia benotzt ginn.
Är Biller hëllefe Leit op der ganzer Welt ze forméieren!
- Lued wgl. Biller erop déi komplett vun Iech opgeholl oder gemaacht goufen:
+ Luet wgl. nëmme Biller erop déi komplett vun Iech opgeholl oder gemaach goufen:
Natierlech Objeten (Blummen, Déieren, Bierger)
Nëtzlech Objeten (Vëloen, Garen)
Berühmt Leit (Äre Buergermeeschter, Olympioniken deenen Dir begéint sidd)
@@ -222,7 +222,7 @@
Bild ass schonn op Commons.
Dëst Bild gouf op enger anerer Plaz gemaach.
Wëllt Dir dëst Bild nach ëmmer eroplueden?
- Lued wgl. nëmme Biller erop déi Dir selwer opgeholl hutt. Lued keng Biller erop déi Dir aus dem Internet erofgelueden hutt.
+ Luet wgl. nëmme Biller erop déi Dir selwer opgeholl hutt. Luet keng Biller erop déi Dir aus dem Internet erofgelueden hutt.
Autorisatioun ginn
Externe Späicher benotzen
Biller späicheren déi mat der in-app Kamera vun Ärem Apparat gemaach goufen
@@ -322,6 +322,7 @@
Jo, schécken
Neen, zréck goen
Dëst ni méi froen
+ Dir hutt esou vill Kontributioune gemaach datt eise Berechnungssystem iwwerfuerdert ass. Dëst ass déi bescht Leeschtung.
Fäerdeg
Net sécher
Merci schécken
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 5d6f2bf7c..273cbc750 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -73,7 +73,7 @@
GPS е исклучен на вашиот уред. Дали сакате да го вклучите?
Вклучи GPS
Сè уште нема подигања
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -377,7 +377,6 @@
Употреби прилагодено авторско име
При подигањето користете прилагодено авторско име наместо вашето корисничко име
Прилагодено авторско име
- Прилагоденото авторско име што ќе се користи место вашето корисничко име при подигања
Придонеси
Во близина
Известувања
@@ -569,4 +568,8 @@
По основно
Темен
Светол
+ Не можев да ги отворам поставките за местоположба. Вклучете ја местоположбата рачно.
+ За да добиете најдобар исход, изберете го режимот на висока уточнетост.
+ Да ја вклучам местоположбата?
+ „Во близина“ бара местоположба за да работи
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index eb0cc61c9..a21aa1d15 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -80,7 +80,7 @@
GPS er slått av på denne enheten. Ønsker du å slå den på?
Slå på GPS
Ingen opplastinger ennå
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -384,7 +384,6 @@
Bruk egendefinert opphavspersonnavn
Bruk et egendefinert opphavspersonnavn i stedet for brukernavnet ditt når bilder lastes opp
Egendefinert opphavspersonnavn
- Det egendefinerte opphavspersonnavnet som skal brukes i stedet for brukernavnet ditt i opplastinger
Bidrag
I nærheten
Varsler
diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml
index 1be311df4..85772b472 100644
--- a/app/src/main/res/values-ne/strings.xml
+++ b/app/src/main/res/values-ne/strings.xml
@@ -92,12 +92,12 @@
तपाईंले हालसम्म कुनै पनि फोटो उर्ध्वभरण गर्नुभएको छैन
पुन: प्रयास गर्नुहोस्
रद्द गर्नुहोस्
- यी तस्वीरहरू %1$s अनुमतिपत्र अनुसार प्राप्त हुनेछ
+ यी तस्वीरहरू %1$s अनुमतिपत्र अनुसार प्राप्त हुनेछ
डाउनलोड गर्ने
पूर्वनिर्धारित अनुमति पत्र
अघिल्लो शीर्षक र वर्णनकाे प्रयोग गर्नुहोस्
स्वचालित रूपमा हालको स्थान प्राप्त गर्नुहोस्
- रात्री रिती
+ थिम
एट्रिब्युसन- सेयरअलाइक ४.०
एट्रिब्युसन ४.०
एट्रिब्युसन- सेयरअलाइक ३.०
@@ -298,5 +298,12 @@
तपाईले हालसम्म कुनैपनि सम्पादन गर्नु भएकाे छैन
खाता सृजना गरियो!
नजिकैको स्थान भेटियो
+ अन्वेषण
+ पुस्तक चिनोहरू
+ सेटिङ्गहरू
पुस्तक चिनाेमा थपियाे
+ भित्तेपत्रकाे रूपमा चयन गर्नुहोस्
+ पुनर्निर्धारित
+ गाढा
+ हल्का
diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml
index a700f7490..d09090c2c 100644
--- a/app/src/main/res/values-nqo/strings.xml
+++ b/app/src/main/res/values-nqo/strings.xml
@@ -62,12 +62,12 @@
GPS ߟߊߞߎߣߎ߲ߣߍ߲߫ ߕߴߌ ߟߊ߫ ߞߍߟߊ߲ ߠߊ߫. ߊ߬ ߟߊߞߎߣߎ߲ ߞߊߘߴߌ ߦߋ߫ ߓߊ߬؟
GPS ߟߊߞߎߣߎ߲߫
ߟߊ߬ߦߟߍ߬ߣߍ߲߬ ߕߴߦߋ߲߬ ߡߎߣߎ߲߬
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
- {{Plural|ߟߊ߬ߝߟߐ߬ߟߌ=ߞߋߟߋ߲߫ %1$d ߟߊߦߟߍ߬|ߟߊߝߟߐߟߌ %1$d ߟߊ߬ߦߟߍ߬ߟߌ|ߟߊߝߟߐߟߌ %1$d ߟߎ߫ ߟߊߦߍ߬ߟߍ}}
+ {{Plural|ߟߊ߬ߝߟߐ߬ߟߌ=ߞߋߟߋ߲߫ %1$d ߟߊߦߟߍ߬|ߟߊߝߟߐߟߌ %1$d ߟߊ߬ߦߟߍ߬ߟߌ|ߟߊߝߟߐߟߌ %1$d ߟߎ߫ ߟߊߦߍ߬ߟߍ}}
ߞߎߡߘߊ߫ %1$s ߡߊ߫ ߛߐ߬ߘߐ߲߬.
ߦߌߟߡߊ ߟߎ߬
ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߦߊ߬ߘߊ
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 010b1a8e6..57d011361 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -52,7 +52,7 @@
Zakończono wysyłanie pliku %1$s
Wysyłanie %1$s nieudane
Dotknij, aby zobaczyć
-
+
- Przesyłanie %1$d pliku
- Przesyłanie %1$d plików
@@ -88,16 +88,16 @@
GPS w twoim urządzeniu jest wyłączony. Czy chcesz go włączyć?
Włącz GPS
Na razie brak przesłanych plików!
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
-
+
- Rozpoczęto %1$d przesyłanie
- Rozpoczęto %1$d przesyłania
-
+
- %1$d przesłanie
- %1$d przesłania
@@ -121,7 +121,7 @@
Nie przesłałeś jeszcze żadnych zdjęć.
Ponów próbę
Anuluj
-
+
- 1=Ten obraz będzie udostępniany na licencji %1$s
Przesyłając ten obraz deklaruję, że jest on moją własną pracą, nie zawiera elementów objętych prawem autorskim lub selfie i jest zgodny z <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines/pl\">Zasadami i zaleceniami Wikimedia Commons</a>.
diff --git a/app/src/main/res/values-pms/strings.xml b/app/src/main/res/values-pms/strings.xml
index ec06501a7..9d1cf343e 100644
--- a/app/src/main/res/values-pms/strings.xml
+++ b/app/src/main/res/values-pms/strings.xml
@@ -375,7 +375,6 @@
Ch\'a deuvra un nòm d\'autor përsonalisà
Ch\'a deuvra un nòm d\'autor përsonalisà al pòst ëd sò stranòm cand a caria dle fòto
Nòm d\'autor përsonalisà
- Ël nòm d\'autor përsonalisà da dovré al pòst ëd sò stranòm për ij cariament
Contribussion
Davzin
Notìfiche
@@ -434,6 +433,7 @@
Smon-e l\'autorisassion ëd localisassion
Ciamé ël përmess ëd localisé cand a-i na j\'é da manca për la fonsion ëd visualisassion ëd la carta dle notìfiche dë vzinansa.
Cheicòs a l\'ha nen marcià, i l\'oma nen podù arcuperé soe realisassion
+ A l\'ha fàit tante contribussion che ël sistema ëd càlcol dj\'arzultà otnù a l\'é debordà. Cost-sì a l\'é l\'ùltim arzultà otnù.
A finiss ai:
Campagne ëd visualisassion
Vëdde le campagne an cors
@@ -566,4 +566,8 @@
Stàndard
Sombr
Ciàir
+ Falì a duverté ij paràmeter ëd localisassion. Për piasì, ch\'a anvisca la localisassion a man
+ Për dij mej arzultà, ch\'a serna ël meud Àuta precision.
+ Anvisché la localisassion?
+ Nearby a l\'ha damanca dla localisassion abilità për marcé \'me ch\'as dev
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 3cbaf8037..b114a2f66 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -389,7 +389,6 @@
Usar o nome do autor personalizado
Usar um nome de autor personalizado em vez de seu nome de usuário ao carregar as fotos
Nome do autor personalizado
- O nome do autor personalizado a usar em vez do seu nome de usuário nos carregamentos
Contribuições
Próximo
Notificações
@@ -581,4 +580,8 @@
Padrão
Escuro
Claro
+ Falha ao abrir as configurações de localização. Ative o local manualmente
+ Para obter melhores resultados, escolha o modo de alta precisão.
+ Ativar a localização?
+ Proximidade precisa de localização ativado para funcionar corretamente
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index f1303e04d..4f10d3838 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -85,7 +85,7 @@
O GPS está desativado no seu dispositivo. Gostaria de ativá-lo?
Ativar GPS
Ainda não foram enviados ficheiros
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -389,7 +389,6 @@
Usar um nome de autor personalizado
Ao carregar fotografias, usar um nome de autor personalizado em vez do seu nome de utilizador
Nome de autor personalizado
- O nome de autor personalizado a usar nos carregamentos, em vez do seu nome de utilizador
Contribuições
Aqui perto
Notificações
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 94e5b9b9c..4faf769ad 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -77,7 +77,7 @@
GPS-ul este dezactivat pe device-ul dumneavoastră. Doriți să-l activați?
Activează GPS
Niciun fișier încă!
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -112,7 +112,7 @@
Încă nu ați încărcat nicio fotografie.
Reîncercare
Revocare
-
+
- Această imagine va fi licențiată sub %1$s
- Această imagine va fi licențiată sub %1$s
@@ -375,7 +375,6 @@
Utilizați numele de autor personalizat
Utilizați un nume de autor personalizat în locul numelui de utilizator în timp ce încărcați fotografii
Numele autorului personalizat
- Numele autorului personalizat pe care doriți să îl utilizați în loc de numele dvs. de utilizator în încărcări
Contribuții
În apropiere
Notificări
@@ -394,7 +393,7 @@
Trimite
Există un fișier cu numele de fișier %1$s. Sunteți sigur că doriți să continuați?
Nu s-a găsit nicio aplicație de hartă compatibilă pe dispozitiv. Instalați o aplicație de hartă pentru a utiliza această caracteristică.
-
+
- %1$d Încărcați
- %1$d Încărcări
@@ -447,7 +446,7 @@
Trimitere mulțumiri
Da, de ce nu
Următoarea imagine
-
+
- Primirea conținutului partajat. Procesarea imaginii poate dura ceva timp, în funcție de dimensiunea imaginii și a dispozitivului dvs.
- Primirea conținutului partajat. Procesarea imaginilor poate dura ceva timp, în funcție de mărimea imaginilor și a dispozitivului
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 13b1d0633..519f3c2b9 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -57,7 +57,7 @@
Завершение загрузки %1$s
Загрузка %1$s не удалась
Нажмите для просмотра
- %1$d {{PLURAL:%1$d|one=файл загружается|few=файла загружается|файлов загружается}}
+ %1$d {{PLURAL:%1$d|one=файл загружается|few=файла загружается|файлов загружается}}
Мои недавние загрузки
В очереди
Ошибка загрузки.
@@ -90,18 +90,18 @@
GPS отключён в вашем устройстве. Хотите включить его?
Включить GPS
Загрузок пока нет
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
- (%1$d)
-
+
- Начинается %1$d загрузка
- Начинается %1$d загрузки
- Начинается %1$d загрузок
-
+
- %1$d загрузка
- %1$d загрузки
- %1$d загрузок
@@ -127,7 +127,7 @@
Вы ещё не загрузили ни одного изображения.
Повторить
Отмена
-
+
- Это изображение будет лицензировано под %1$s
- Эти изображения будут лицензированы под %1$s
@@ -397,7 +397,6 @@
Использовать альтернативное имя автора
При загрузке изображений использовать альтернативное имя для указания авторства вместо имени пользователя
Альтернативное имя автора
- Альтернативное имя автора, которое будет указываться в загрузках вместо имени пользователя
Вклад
Поблизости
Уведомления
@@ -416,7 +415,7 @@
Отправить
Уже существует файл с именем %1$s. Вы уверены, что хотите продолжить?
Не найдено совместимое картографическое приложение на вашем устройстве. Установите его, чтобы вы могли использовать эту функцию.
-
+
- %1$d загрузка
- %1$d загрузки
- %1$d загрузок
@@ -457,6 +456,7 @@
Показать разрешение на геолокацию
Запрашивать разрешение на геолокацию, которое требуется для нотификаций мест поблизости.
Что-то пошло не так. Не получается получить список ваших достижений
+ Вы сделали так много, что наша система расчёта достижений не справляется. Это финальное достижение.
Заканчивается:
Показ кампаний
Просмотр текущих кампаний
@@ -507,7 +507,7 @@
Следующий файл
Нажатие этой кнопки приводит к показу следующего недавно загруженного изображения с Викисклада
Вы можете проверить файлы, и, таким образом, улучшить их качество на Викискладе.\n Есть четыре проверки:\n - Уместен ли файл на Викискладе?\n - Соответствует ли файл правилам об авторском праве?\n - Правильно ли файл категоризирован?\n - Если всё хорошо, можете поблагодарить загрузившего этот файл.
-
+
- Получение общего содержимого. Обработка изображения может занять некоторое время, в зависимости от размера изображения и модели вашего устройства
- Получение общего содержимого. Обработка изображений может занять некоторое время, в зависимости от размера изображения и модели вашего устройства
@@ -589,4 +589,8 @@
По умолчанию
Тёмная
Светлая
+ Не удалось открыть настройки местоположения. Пожалуйста, включите местоположение вручную
+ Для достижения наилучших результатов выберите режим высокой точности.
+ Включить местоположение?
+ Рядом необходимо, чтобы местоположение было включено для правильной работы.
diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml
index 8e7031331..f33bd7660 100644
--- a/app/src/main/res/values-sd/strings.xml
+++ b/app/src/main/res/values-sd/strings.xml
@@ -72,7 +72,7 @@
اوهان جي ڊوائيس ۾ جي پي ايس بند آهي. ڇا اوهان ان کي کولڻ چاهيو ٿا؟
جي پي ايس چالو ڪيو (اين ايبل جي پي ايس)
اڃا تائين ڪوبہ چاڙھ ناھي
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
diff --git a/app/src/main/res/values-sh/strings.xml b/app/src/main/res/values-sh/strings.xml
index d835118fa..3fab1d60d 100644
--- a/app/src/main/res/values-sh/strings.xml
+++ b/app/src/main/res/values-sh/strings.xml
@@ -34,7 +34,7 @@
Završavanje otpremanja „%1$s”
Otpremanje „%1$s” nije uspelo
Dodirnite da biste pogledali
-
+
- Otprema se %1$d datoteka
- Otpremaju se %1$d datoteke
@@ -70,16 +70,16 @@
GPS je onemogućen na Vašem uređaju. Želite li ga omogućiti?
Omogući GPS
Još uvijek nema otpremanja
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
-
+
- Počinje %1$d otpremanje
- Počinju %1$d otpremanja
-
+
- %1$d otpremanje
- %1$d otpremanja
@@ -104,7 +104,7 @@
Još uvijek niste otpremili nijednu sliku.
Pokušaj ponovo
Otkaži
-
+
- Ova slika će se izvoditi pod licencom %1$s
- Ove slike će se izvoditi pod licencama %1$s
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index ad6926656..b37681efc 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -38,7 +38,7 @@
Dokončenie nahrávania %1$s
Nahrávanie %1$s zlyhalo
Kliknutím zobrazíte
-
+
- nahráva sa %1$d súbor
- nahrávajú sa %1$d súbory
@@ -74,16 +74,16 @@
GPS nie je povolené vo vašom zariadení. Chceli by ste ho povoliť?
Povoliť GPS
Žiadne nahrané súbory
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
-
+
- Spúšťam nahrávanie %1$d súboru
- Spúšťam nahrávanie %1$d súborov
-
+
- %1$d nahranie
- %1$d nahrania
@@ -108,7 +108,7 @@
Ešte ste nenahrali žiadne fotografie.
Znova
Zrušiť
-
+
- Tento obrázok bude licenciovaný pod licenciou %1$s
- Tieto obrázky budú licenciované pod licenciou %1$s
@@ -378,7 +378,6 @@
Použiť vlastné meno autora
Pri nahrávaní fotografií použiť vlastné meno autora namiesto používateľského mena
Vlastné meno autora
- Vlastné meno autora, ktoré sa použije namiesto používateľského mena
Príspevky
V okolí
Upozornenia
@@ -397,7 +396,7 @@
Odoslať
Súbor s názvom %1$s už existuje. Naozaj chcete pokračovať?
Nebola nájdená žiadna kompatibilná aplikácia s mapami. Pre použitie tejto fukncie si, prosím, nainštalujte aplikáciu poskytujúcu mapy.
-
+
- %1$d nahranie
- %1$d nahrania
@@ -437,6 +436,7 @@
Zobraziť povolenia prístupu k polohe
Požiada o oprávnenie k prístupu k polohe, pokiaľ je to potrebné pre funkciu zobrazenia miest v okolí.
Nastala chyba, nepodarilo sa nám načítať vaše úspechy
+ Urobili ste toľko príspevkov, že to náš systém výpočtu úspechov nedokáže zvládnuť. Toto je konečný úspech.
Končí:
Zobraziť kampane
Zobrazovať prebiehajúce kampane
@@ -487,7 +487,7 @@
Ďalší súbor
Kliknutím na toto tlačidlo sa zobrazí ďalší nedávno nahraný obrázok z Wikimedia Commons
Môžete kontrolovať obrázky a zlepšiť kvalitu Wikimedia Commons.\n\nTri aspekty, ktoré sa posudzujú, sú:\n - Je tento obrázok v poriadku?\n - Dodržiava tento obrázok pravidlá autorských práv?\n - Je tento obrázok správne kategorizovaný?\n\nAk je všetko v poriadku, autorovi môžete taktiež poďakovať.
-
+
- Prebieha príjem zdieľaného obsahu. Spracovanie obrázku môže chvíľu trvať v závislosti od veľkosti obrázku a vášho zariadenia
- Prebieha príjem zdieľaného obsahu. Spracovanie obrázkov môže chvíľu trvať v závislosti od veľkosti obrázkov a vášho zariadenia
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 5698def14..f201b3aea 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -123,7 +123,7 @@
Користи претходан наслов и опис
Аутоматски добави тренутну локацију
Прима тренутну локацију ако слика није геотагована и геотагује исту њоме. Упозорење: Овиме ће да се открије Ваша тренутна локација.
- Ноћни режим
+ Тема
Ауторство-Делити под истим условима 4.0
Ауторство 4.0
Ауторство-Делити под истим условима 3.0
@@ -266,7 +266,7 @@
Грешка! URL није пронађен
Номиновање за брисање
Ова слика је била номинована за брисање
- Погледајте вебстраницу за детаље
+ Погледајте веб-страницу за више информација
Предлагање %1$s за брисање.
Предлагање датотеке %1$s за брисање.
Види у претраживачу
@@ -376,7 +376,6 @@
Користи прилагођено име аутора
Коришћење прилагођеног имена аутора уместо вашег корисничког имена при отпремању фотографија
Прилагођено име аутора
- Прилагођено име аутора за коришћење уместо вашег корисничког имена у отпремањима
Доприноси
У близини
Обавештења
@@ -522,11 +521,11 @@
Остало
Зато што је то
Подели слику преко
- Нисте направили доприносе
- Налог је отворен!
+ Још нисте допринели
+ Налог је отворен.
Текст је копиран у оставу
Обавештење је означено прочитаним
- Дошло је до грешке!
+ Дошло је до грешке.
Постоји
Потребна слика
Тип места:
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 0158b9696..3f567ae94 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -77,7 +77,7 @@
GPS:en är inaktiverad på denna enhet. Vill du aktivera den?
Aktivera GPS
Inga uppladdningar ännu
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -121,7 +121,7 @@
Använd föregående titel och beskrivning
Hämta aktuell plats automatiskt
Hämtar aktuell plats om bilden inte är geotaggad och geotaggar bilden med den. Varning: Detta kommer att avslöja din nuvarande position.
- Nattläge
+ Tema
Erkännande-DelaLika 4.0
Erkännande 4.0
Erkännande-DelaLika 3.0
@@ -381,7 +381,6 @@
Använd anpassat författarnamn
Använd ett anpassat författarnamn istället för ditt användarnamn när du laddar upp foton
Anpassat författarnamn
- Det anpassade författarnamnet att använda istället för ditt användarnamn i uppladdningar
Bidrag
I närheten
Aviseringar
@@ -440,6 +439,7 @@
Visa platsbehörighet
Fråga efter platsbehörighet vid behov för att visa aviseringskortet för i närheten.
Någonting gick fel. Vi kunde inte hämta dina prestationer
+ Du har gjort så många bidrag att vårt system för att beräkna prestationer inte hinner med. Detta är den ultimata prestationen.
Slutar den:
Visa kampanjer
Se pågående kampanjer
@@ -569,4 +569,7 @@
Någonting gick fel. Kunde inte ändra bakgrundsbild
Ange som bakgrundsbild
Anger som bakgrundsbild. Var god vänta…
+ Standard
+ Mörkt
+ Ljust
diff --git a/app/src/main/res/values-tcy/strings.xml b/app/src/main/res/values-tcy/strings.xml
index a9c5ee770..d95410a14 100644
--- a/app/src/main/res/values-tcy/strings.xml
+++ b/app/src/main/res/values-tcy/strings.xml
@@ -362,7 +362,6 @@
ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್ ಬಳಸುಲೆ.
ಚಿತ್ರೊಲೆನ್ ಮಿತೇರಾನಗ ಇರೆನ ಬಳಕೆಪುದರುದ ಬದಲ್ ಒಂಜಿ ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್ ಬಳಸುಲೆ.
ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್
- ಮಿತೇರುಲೆಡ್ ಇರೆನ ಬಳಕೆಪುದರ್ದ ಬದಲ್ ಬಳಸರೆ ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್.
ಕಾಣಿಕೆಲು
ಕೈತಲ್ದ
ಅಧಿಸೂಚನೆಲು
diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml
index bdfecd9cb..ef6505cd1 100644
--- a/app/src/main/res/values-te/strings.xml
+++ b/app/src/main/res/values-te/strings.xml
@@ -72,7 +72,7 @@
మీ పరికరంలో GPS అచేతనం చేసి ఉంది. దాన్ని చేతనం చేస్తారా?
GPS ను చేతనం చెయ్యి
ఇంకా ఎక్కింపులేమీ లేవు
-
+
- \@string/contributions_subtitle_zero
- (%1$d)
- (%1$d)
@@ -374,7 +374,6 @@
కర్తకు ఐచ్ఛికంగా మరో పేరును వాడండి
ఫోటోలను ఎక్కించేటపుడు మీ వాడుకరిపేరు కాకుండా మరో ఐచ్ఛికమైన పేరును వాడండి
ఐచ్ఛికమైన కర్త పేరు
- ఎక్కింపుల్లో కర్తగా వాడేందుకు మీ వాడుకరిపేరు కాకుండా మరో పేరు
తోడ్పాటు
చుట్టుపక్కల
గమనింపులు
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index e2c4725bf..5dd753902 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -168,7 +168,7 @@
Başlık: Sidney Opera Binası
Açıklama: Sidney Opera Binası\'nın körfezin karşısından görünümü
Kategoriler: Batıdan Sidney Opera Binası, Sidney Opera Binası uzaktan manzaraları
- Resimlerinize katkıda bulunun. Wikipedia makalelerinin hayata geçirilmesine yardım edin!
+ Resimlerinize katkıda bulunun. Vikipedi maddelerin hayata geçirilmesine yardım edin!
Vikipedi\'ye Wikimedia Commons\'tan gelen görüntüler.
Resimleriniz tüm dünyadaki insanları eğitmeye yardımcı olur.
İnternetten bulduğunuz telif hakkıyla korunan malzemelerin yanı sıra poster, kitap kapağı vb. kullanımında kaçının.
@@ -393,7 +393,6 @@
Özel yazar adı kullan
Fotoğraf yüklerken kullanıcı adınız yerine özel bir yazar adı kullanın
Özel yazar adı
- Yüklemelerde kullanıcı adınız yerine kullanılacak özel yazar adı
Katkılar
Yakınındakiler
Bildirimler
@@ -585,4 +584,8 @@
Varsayılan
Koyu
Açık
+ Konum ayarları açılamadı. Lütfen konumu manüel olarak açın
+ En iyi sonuçlar için Yüksek Hassasiyet modunu seçin.
+ Konum açılsın mı?
+ Yakında ihtiyaç duyulan konumun düzgün çalışması için etkin
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 2c82d56c4..a9142c629 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -83,7 +83,7 @@
GPS вимкнено на Вашому пристрої. Бажаєте увімкнути його?
Увімкнути GPS
Ще нема завантажень
-
+
- \@string/contributions_subtitle_zero
- %1$d завантаження
- %1$d завантаження
@@ -123,7 +123,7 @@
Ви ще не завантажили жодної світлини.
Повторити
Скасувати
-
+
- Це зображення буде ліцензовано на умовах %1$s
- Ці зображення буде ліцензовано на умовах %1$s
- Ці зображення буде ліцензовано на умовах %1$s
@@ -186,7 +186,7 @@
Запит дозволу на зберігання
Обов\'язковий дозвіл: читання зовнішньої пам\'яті. Без цього дозволу програма не зможе отримати доступ до вашої галереї.
Обов\'язковий дозвіл: записування на зовнішнє сховище. Програма не зможе отримати доступ до камери/галереї без цього дозволу.
- Запит на визначення місцезнаходження
+ Запит на визначення розташування
Додатковий дозвіл: отримувати поточне розташування для підказок категорій
Гаразд
Місця поблизу
@@ -394,7 +394,6 @@
Використати альтернативне ім\'я автора
При завантаженні фото використовувати альтернативне ім\'я для зазначення авторства замість власного імені користувача
Альтернативне ім\'я автора
- Альтернативне ім\'я для зазначення авторства, що буде використовуватись замість Вашого імені користувача у завантаженнях
Внесок
Поблизу
Сповіщення
@@ -413,7 +412,7 @@
Надіслати
Файл із назвою %1$s існує. Ви впевнені, що хочете продовжити?
На Вашому пристрої не знайдено сумісного додатка з картами. Будь ласка, встановіть додаток з картами, якщо хочете скористатись цією функцією.
-
+
- %1$d завантаження
- %1$d завантаження
- %1$d завантажень
@@ -454,6 +453,7 @@
Дозвіл на показ місця перебування
Запитувати про дозвіл на показ місця перебування, коли це потрібно для функції перегляду місць поблизу.
Щось пішло не так. Нам не вдалося отримати Ваші досягнення
+ Ви зробили так багато, що наша система підрахунку досягнень не може впоратись зі своїм завданням. Це — абсолютне досягнення.
Завершується:
Показати кампанії
Чинні кампанії
@@ -504,7 +504,7 @@
Наступне зображення
Натискання цієї кнопки дасть вам інше недавно завантажене зображення з Вікісховища
Ви можете перевіряти зображення і покращувати якість Вікісховища.\nЄ чотири параметри перевірки:\n— Чи зображення відповідає призначенню Вікісховища?\n— Чи зображення відповідає правилам авторського права?\n— Чи зображення коректно категоризоване?\n— Якщо все добре, то ви можете подякувати завантажувачу.
-
+
- Отримання спільного контенту. Обробка зображення може зайняти трохи часу, залежно від розміру зображення і від Вашого пристрою
- Отримання спільного контенту. Обробка зображень може зайняти трохи часу, залежно від розміру зображень і від Вашого пристрою
- Отримання спільного контенту. Обробка зображень може зайняти трохи часу, залежно від розміру зображень і від Вашого пристрою
@@ -587,4 +587,8 @@
Стандартна
Темна
Світла
+ Не вдалося відкрити налаштування місця розташування. Будь ласка, увімкніть визначення місця розташування вручну
+ Щоб отримати кращі результати, виберіть режим високої точності.
+ Увімкнути визначення місця розташування?
+ «Поблизу» потребує увімкненого визначення місця розташування, щоб працювати належним чином
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 1a9035940..61b7a7b6d 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -386,7 +386,6 @@
使用自定義作者名稱
使用自定義作者名稱來取代在上傳照片時您的使用者名稱
自定義作者名稱
- 自定義作者名稱用來取代在上傳時您的使用者名稱
貢獻
附近
通知
@@ -548,8 +547,8 @@
糢糊
無意義
其它
- 攝影作品
- 來自網路的隨意照片
+ 按壓照片
+ 來自網路的隨機照片
標誌
其它
因為這
@@ -578,4 +577,8 @@
預設
暗黑
明亮
+ 開啟位置設定失敗,請手動打開位置
+ 為了獲得最佳結果,請選擇高精準度模式。
+ 打開位置?
+ 附近功能需要啟用位置才能運作正常
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 90229fe7d..3e53dc212 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -397,7 +397,6 @@
使用自定义的作者姓名
在上传照片时使用自定义的作者姓名,而不是用户名
自定义作者姓名
- 上传时自定义的作者姓名,不是用户名
贡献
附近
通知
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bb9104e22..67dd9d5bd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -404,7 +404,6 @@
Use custom author name
Use a custom author name instead of your username while uploading photos
Custom author name
- The custom author name to use instead of your username in uploads
Contributions
Nearby
Notifications
@@ -623,4 +622,10 @@ Upload your first media by tapping on the add button.
Default
Dark
Light
+
+ Failed to open location settings. Please turn on location manually
+ For best results, choose the High Accuracy mode.
+ Turn on location?
+ Nearby needs location enabled to work properly
+
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 9de29aeb1..e58dbefd6 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -1,99 +1,109 @@
-
+
-
+
-
+ app:useSimpleSummaryProvider="true"
+ android:defaultValue="0" />
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
-
+
-
+
-
+
\ No newline at end of file
diff --git a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt
index d0faddc8f..5fd56601f 100644
--- a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt
+++ b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt
@@ -1,6 +1,8 @@
package fr.free.nrw.commons.delete
import android.content.Context
+import com.nhaarman.mockitokotlin2.eq
+import com.nhaarman.mockitokotlin2.verify
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.actions.PageEditClient
import fr.free.nrw.commons.notification.NotificationHelper
@@ -14,7 +16,6 @@ import org.mockito.InjectMocks
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
-import org.wikipedia.AppAdapter
import javax.inject.Inject
import javax.inject.Named
@@ -65,9 +66,13 @@ class DeleteHelperTest {
`when`(media?.displayTitle).thenReturn("Test file")
media?.filename="Test file.jpg"
+ val creatorName = "Creator"
+ `when`(media?.getCreator()).thenReturn("$creatorName (page does not exist)")
+
val makeDeletion = deleteHelper?.makeDeletion(context, media, "Test reason")?.blockingGet()
assertNotNull(makeDeletion)
assertTrue(makeDeletion!!)
+ verify(pageEditClient)?.appendEdit(eq("User_Talk:$creatorName"), ArgumentMatchers.anyString(), ArgumentMatchers.anyString())
}
/**
@@ -83,6 +88,7 @@ class DeleteHelperTest {
.thenReturn(Observable.just(true))
`when`(media?.displayTitle).thenReturn("Test file")
`when`(media?.filename).thenReturn("Test file.jpg")
+ `when`(media?.creator).thenReturn("Creator (page does not exist)")
deleteHelper?.makeDeletion(context, media, "Test reason")?.blockingGet()
}
@@ -97,6 +103,7 @@ class DeleteHelperTest {
.thenReturn(Observable.just(false))
`when`(media?.displayTitle).thenReturn("Test file")
`when`(media?.filename).thenReturn("Test file.jpg")
+ `when`(media?.creator).thenReturn("Creator (page does not exist)")
deleteHelper?.makeDeletion(context, media, "Test reason")?.blockingGet()
}
@@ -111,6 +118,24 @@ class DeleteHelperTest {
.thenReturn(Observable.just(true))
`when`(media?.displayTitle).thenReturn("Test file")
`when`(media?.filename).thenReturn("Test file.jpg")
+ `when`(media?.creator).thenReturn("Creator (page does not exist)")
+
+ deleteHelper?.makeDeletion(context, media, "Test reason")?.blockingGet()
+ }
+
+ @Test(expected = RuntimeException::class)
+ fun makeDeletionForEmptyCreatorName() {
+ `when`(pageEditClient?.prependEdit(ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString()))
+ .thenReturn(Observable.just(true))
+ `when`(pageEditClient?.appendEdit(ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString()))
+ .thenReturn(Observable.just(true))
+ `when`(pageEditClient?.edit(ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString()))
+ .thenReturn(Observable.just(true))
+
+ `when`(media?.displayTitle).thenReturn("Test file")
+ media?.filename="Test file.jpg"
+
+ `when`(media?.getCreator()).thenReturn(null)
deleteHelper?.makeDeletion(context, media, "Test reason")?.blockingGet()
}
diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/ImageProcessingServiceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/ImageProcessingServiceTest.kt
index c2d7aa08a..97026b7e2 100644
--- a/app/src/test/kotlin/fr/free/nrw/commons/upload/ImageProcessingServiceTest.kt
+++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/ImageProcessingServiceTest.kt
@@ -88,7 +88,7 @@ class u {
@Test
fun validateImageForKeepImage() {
`when`(uploadItem.imageQuality).thenReturn(ImageUtils.IMAGE_KEEP)
- val validateImage = imageProcessingService!!.validateImage(uploadItem, false)
+ val validateImage = imageProcessingService!!.validateImage(uploadItem)
assertEquals(ImageUtils.IMAGE_OK, validateImage.blockingGet())
}
@@ -96,13 +96,13 @@ class u {
fun validateImageForDuplicateImage() {
`when`(mediaClient!!.checkFileExistsUsingSha(ArgumentMatchers.anyString()))
.thenReturn(Single.just(true))
- val validateImage = imageProcessingService!!.validateImage(uploadItem, false)
+ val validateImage = imageProcessingService!!.validateImage(uploadItem)
assertEquals(ImageUtils.IMAGE_DUPLICATE, validateImage.blockingGet())
}
@Test
fun validateImageForOkImage() {
- val validateImage = imageProcessingService!!.validateImage(uploadItem, false)
+ val validateImage = imageProcessingService!!.validateImage(uploadItem)
assertEquals(ImageUtils.IMAGE_OK, validateImage.blockingGet())
}
@@ -110,7 +110,7 @@ class u {
fun validateImageForDarkImage() {
`when`(imageUtilsWrapper?.checkIfImageIsTooDark(ArgumentMatchers.anyString()))
.thenReturn(Single.just(ImageUtils.IMAGE_DARK))
- val validateImage = imageProcessingService!!.validateImage(uploadItem, false)
+ val validateImage = imageProcessingService!!.validateImage(uploadItem)
assertEquals(ImageUtils.IMAGE_DARK, validateImage.blockingGet())
}
@@ -118,23 +118,15 @@ class u {
fun validateImageForWrongGeoLocation() {
`when`(imageUtilsWrapper!!.checkImageGeolocationIsDifferent(ArgumentMatchers.anyString(), any(LatLng::class.java)))
.thenReturn(Single.just(ImageUtils.IMAGE_GEOLOCATION_DIFFERENT))
- val validateImage = imageProcessingService!!.validateImage(uploadItem, false)
+ val validateImage = imageProcessingService!!.validateImage(uploadItem)
assertEquals(ImageUtils.IMAGE_GEOLOCATION_DIFFERENT, validateImage.blockingGet())
}
- @Test
- fun validateImageForFileNameExistsWithCheckTitleOff() {
- `when`(mediaClient?.checkPageExistsUsingTitle(ArgumentMatchers.anyString()))
- .thenReturn(Single.just(true))
- val validateImage = imageProcessingService!!.validateImage(uploadItem, false)
- assertEquals(ImageUtils.IMAGE_OK, validateImage.blockingGet())
- }
-
@Test
fun validateImageForFileNameExistsWithCheckTitleOn() {
`when`(mediaClient?.checkPageExistsUsingTitle(ArgumentMatchers.anyString()))
.thenReturn(Single.just(true))
- val validateImage = imageProcessingService!!.validateImage(uploadItem, true)
+ val validateImage = imageProcessingService!!.validateImage(uploadItem)
assertEquals(ImageUtils.FILE_NAME_EXISTS, validateImage.blockingGet())
}
-}
\ No newline at end of file
+}
diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaPresenterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaPresenterTest.kt
index cfd794d59..171604286 100644
--- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaPresenterTest.kt
+++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaPresenterTest.kt
@@ -92,9 +92,9 @@ class UploadMediaPresenterTest {
*/
@Test
fun verifyImageQualityTest() {
- Mockito.`when`(repository?.getImageQuality(ArgumentMatchers.any(UploadModel.UploadItem::class.java), ArgumentMatchers.any(Boolean::class.java))).thenReturn(testSingleImageResult)
+ Mockito.`when`(repository?.getImageQuality(ArgumentMatchers.any(UploadModel.UploadItem::class.java))).thenReturn(testSingleImageResult)
Mockito.`when`(uploadItem?.imageQuality).thenReturn(ArgumentMatchers.anyInt())
- uploadMediaPresenter?.verifyImageQuality(uploadItem, true)
+ uploadMediaPresenter?.verifyImageQuality(uploadItem)
verify(view)?.showProgress(true)
testScheduler?.triggerActions()
verify(view)?.showProgress(false)
@@ -232,4 +232,4 @@ class UploadMediaPresenterTest {
verify(repository)?.updateUploadItem(0,uploadItem)
}
-}
\ No newline at end of file
+}
diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadModelTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadModelTest.kt
index c6f851889..764c0a447 100644
--- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadModelTest.kt
+++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadModelTest.kt
@@ -65,7 +65,7 @@ class UploadModelTest {
.thenReturn(mock(FileInputStream::class.java))
`when`(fileUtilsWrapper!!.getGeolocationOfFile(anyString()))
.thenReturn("")
- `when`(imageProcessingService!!.validateImage(any(UploadModel.UploadItem::class.java), anyBoolean()))
+ `when`(imageProcessingService!!.validateImage(any(UploadModel.UploadItem::class.java)))
.thenReturn(Single.just(IMAGE_OK))
}
@@ -129,4 +129,4 @@ class UploadModelTest {
@Test
fun buildContributions() {
}
-}
\ No newline at end of file
+}
diff --git a/app/src/test/kotlin/fr/free/nrw/commons/wikidata/WikidataEditServiceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/wikidata/WikidataEditServiceTest.kt
index 09369a00c..d308e77ee 100644
--- a/app/src/test/kotlin/fr/free/nrw/commons/wikidata/WikidataEditServiceTest.kt
+++ b/app/src/test/kotlin/fr/free/nrw/commons/wikidata/WikidataEditServiceTest.kt
@@ -37,13 +37,19 @@ class WikidataEditServiceTest {
@Test
fun noClaimsWhenEntityIdIsNull() {
- wikidataEditService!!.createClaimWithLogging(null, "Test.jpg")
+ wikidataEditService!!.createClaimWithLogging(null, "Test.jpg","")
verifyZeroInteractions(wikidataClient!!)
}
@Test
fun noClaimsWhenFileNameIsNull() {
- wikidataEditService!!.createClaimWithLogging("Q1", null)
+ wikidataEditService!!.createClaimWithLogging("Q1", null,"")
+ verifyZeroInteractions(wikidataClient!!)
+ }
+
+ @Test
+ fun noClaimsWhenP18IsNotEmpty() {
+ wikidataEditService!!.createClaimWithLogging("Q1", "Test.jpg","Previous.jpg")
verifyZeroInteractions(wikidataClient!!)
}
@@ -51,7 +57,7 @@ class WikidataEditServiceTest {
fun noClaimsWhenLocationIsNotCorrect() {
`when`(directKvStore!!.getBoolean("Picture_Has_Correct_Location", true))
.thenReturn(false)
- wikidataEditService!!.createClaimWithLogging("Q1", "Test.jpg")
+ wikidataEditService!!.createClaimWithLogging("Q1", "Test.jpg","")
verifyZeroInteractions(wikidataClient!!)
}
@@ -63,7 +69,7 @@ class WikidataEditServiceTest {
.thenReturn(Observable.just(1L))
`when`(wikidataClient!!.addEditTag(anyLong(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString()))
.thenReturn(Observable.just(mock(AddEditTagResponse::class.java)))
- wikidataEditService!!.createClaimWithLogging("Q1", "Test.jpg")
+ wikidataEditService!!.createClaimWithLogging("Q1", "Test.jpg","")
verify(wikidataClient!!, times(1))
.createClaim(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())
}
diff --git a/gradle.properties b/gradle.properties
index 742f1f5df..73196c6e0 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,12 +15,13 @@
#Thu Mar 01 15:28:48 IST 2018
org.gradle.jvmargs=-Xmx1536M
android.enableBuildCache=true
-android.enableUnitTestBinaryResources=true
KOTLIN_VERSION=1.3.21
BUTTERKNIFE_VERSION=10.1.0
LEAK_CANARY_VERSION=1.6.2
DAGGER_VERSION=2.21
+ROOM_VERSION=2.2.3
+PREFERENCE_VERSION=1.1.0
systemProp.http.proxyPort=0
systemProp.http.proxyHost=