diff --git a/.travis.yml b/.travis.yml
index 7c7f76eaa..aaf3ab7f9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -17,14 +17,17 @@ jdk:
android:
components:
- - platform-tools
- tools
+ - platform-tools
- build-tools-26.0.1
- extra-google-m2repository
- extra-android-m2repository
- ${ANDROID_TARGET}
- android-25
+ - android-26
- sys-img-${ANDROID_ABI}-${ANDROID_TARGET}
+ licenses:
+ - 'android-sdk-license-.+'
before_script:
- echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI
diff --git a/CREDITS b/CREDITS
index b404302fb..29264b99d 100644
--- a/CREDITS
+++ b/CREDITS
@@ -29,6 +29,7 @@ their contribution to the product.
* Jan Piotrowski
* Bruke Mekuria Mulugeta
* Paul Hawke
+* Vishan Seru
3rd party open source libraries used:
* Butterknife
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7572a9a73..b0cbdd34f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,6 +14,7 @@
+
categories;
private Map descriptions;
- private Date date;
private String license;
private @Nullable LatLng coordinates;
private LicenseList licenseList;
@@ -153,7 +152,7 @@ public class MediaDataExtractor {
}
private Node findTemplate(Element parentNode, String title_) throws IOException {
- String title= new PageTitle(title_).getDisplayText();
+ String title = new PageTitle(title_).getDisplayText();
NodeList nodes = parentNode.getChildNodes();
for (int i = 0, length = nodes.getLength(); i < length; i++) {
Node node = nodes.item(i);
@@ -179,7 +178,7 @@ public class MediaDataExtractor {
}
private static abstract class TemplateChildNodeComparator {
- abstract public boolean match(Node node);
+ public abstract boolean match(Node node);
}
private Node findTemplateParameter(Node templateNode, String name) throws IOException {
diff --git a/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java b/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java
index 3e147f4a8..2b017ac8b 100644
--- a/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java
+++ b/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java
@@ -35,7 +35,7 @@ public class MediaWikiImageView extends SimpleDraweeView {
if (currentThumbnailTask != null) {
currentThumbnailTask.cancel(true);
}
- if(media == null) {
+ if (media == null) {
return;
}
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 0ccdaf724..7274c5319 100644
--- a/app/src/main/java/fr/free/nrw/commons/Utils.java
+++ b/app/src/main/java/fr/free/nrw/commons/Utils.java
@@ -13,8 +13,10 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.BufferedInputStream;
+import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
@@ -281,4 +283,37 @@ public class Utils {
public static boolean isDarkTheme(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("theme", false);
}
+
+ /**
+ * Will be used to fetch the logs generated by the app ever since the beginning of times....
+ * i.e. since the time the app started.
+ *
+ * @return String containing all the logs since the time the app started
+ */
+ public static String getAppLogs() {
+ final String processId = Integer.toString(android.os.Process.myPid());
+
+ StringBuilder stringBuilder = new StringBuilder();
+
+ try {
+ String[] command = new String[] {"logcat","-d","-v","threadtime"};
+
+ Process process = Runtime.getRuntime().exec(command);
+
+ BufferedReader bufferedReader = new BufferedReader(
+ new InputStreamReader(process.getInputStream())
+ );
+
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ if (line.contains(processId)) {
+ stringBuilder.append(line);
+ }
+ }
+ } catch (IOException ioe) {
+ Timber.e("getAppLogs failed", ioe);
+ }
+
+ return stringBuilder.toString();
+ }
}
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 61672ad89..9e3423928 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
@@ -248,8 +248,8 @@ public class LoginActivity extends AccountAuthenticatorActivity {
@Override
public void afterTextChanged(Editable editable) {
- boolean enabled = usernameEdit.getText().length() != 0 && passwordEdit.getText().length() != 0 &&
- (BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE);
+ boolean enabled = usernameEdit.getText().length() != 0 && passwordEdit.getText().length() != 0
+ && (BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE);
loginButton.setEnabled(enabled);
}
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java
index f27bfe210..330baaf58 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java
@@ -238,6 +238,8 @@ public class ContributionsActivity extends AuthenticatedActivity
@Override
public void onLoadFinished(Loader cursorLoader, Cursor cursor) {
+ contributionsList.changeProgressBarVisibility(false);
+
if (contributionsList.getAdapter() == null) {
contributionsList.setAdapter(new ContributionsListAdapter(getApplicationContext(),
cursor, 0));
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 0882d09c4..7be6dd663 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
@@ -34,7 +34,7 @@ class ContributionsListAdapter extends CursorAdapter {
views.seqNumView.setText(String.valueOf(cursor.getPosition() + 1));
views.seqNumView.setVisibility(View.VISIBLE);
- switch(contribution.getState()) {
+ switch (contribution.getState()) {
case Contribution.STATE_COMPLETED:
views.stateView.setVisibility(View.GONE);
views.progressView.setVisibility(View.GONE);
@@ -50,7 +50,7 @@ class ContributionsListAdapter extends CursorAdapter {
views.progressView.setVisibility(View.VISIBLE);
long total = contribution.getDataLength();
long transferred = contribution.getTransferred();
- if(transferred == 0 || transferred >= total) {
+ if (transferred == 0 || transferred >= total) {
views.progressView.setIndeterminate(true);
} else {
views.progressView.setProgress((int)(((double)transferred / (double)total) * 100));
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java
index 83dbced97..9a313854c 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java
@@ -19,6 +19,7 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ListAdapter;
+import android.widget.ProgressBar;
import android.widget.TextView;
import butterknife.BindView;
@@ -41,8 +42,9 @@ public class ContributionsListFragment extends Fragment {
GridView contributionsList;
@BindView(R.id.waitingMessage)
TextView waitingMessage;
- @BindView(R.id.emptyMessage)
- TextView emptyMessage;
+ @BindView(R.id.loadingContributionsProgressBar)
+ ProgressBar progressBar;
+
private ContributionController controller;
@Override
@@ -67,6 +69,7 @@ public class ContributionsListFragment extends Fragment {
waitingMessage.setVisibility(GONE);
}
+ changeProgressBarVisibility(true);
return v;
}
@@ -78,6 +81,10 @@ public class ContributionsListFragment extends Fragment {
this.contributionsList.setAdapter(adapter);
}
+ public void changeProgressBarVisibility(boolean isVisible) {
+ this.progressBar.setVisibility(isVisible ? View.VISIBLE : View.GONE);
+ }
+
@Override
public void onSaveInstanceState(Bundle outState) {
if (outState == null) {
diff --git a/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java b/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java
index 8ef9f336c..5e28a8a32 100644
--- a/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java
+++ b/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java
@@ -7,7 +7,7 @@ import android.database.sqlite.SQLiteOpenHelper;
import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.modifications.ModifierSequence;
-public class DBOpenHelper extends SQLiteOpenHelper{
+public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "commons.db";
private static final int DATABASE_VERSION = 6;
diff --git a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java
index 1e3202914..787c8c8a5 100644
--- a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java
+++ b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java
@@ -13,7 +13,7 @@ public class LatLng {
* @param longitude double value
*/
public LatLng(double latitude, double longitude, float accuracy) {
- if(-180.0D <= longitude && longitude < 180.0D) {
+ if (-180.0D <= longitude && longitude < 180.0D) {
this.longitude = longitude;
} else {
this.longitude = ((longitude - 180.0D) % 360.0D + 360.0D) % 360.0D - 180.0D;
@@ -33,9 +33,9 @@ public class LatLng {
}
public boolean equals(Object o) {
- if(this == o) {
+ if (this == o) {
return true;
- } else if(!(o instanceof LatLng)) {
+ } else if (!(o instanceof LatLng)) {
return false;
} else {
LatLng var2 = (LatLng)o;
diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/CategoryModifier.java b/app/src/main/java/fr/free/nrw/commons/modifications/CategoryModifier.java
index bb650513b..556815a97 100644
--- a/app/src/main/java/fr/free/nrw/commons/modifications/CategoryModifier.java
+++ b/app/src/main/java/fr/free/nrw/commons/modifications/CategoryModifier.java
@@ -13,7 +13,7 @@ public class CategoryModifier extends PageModifier {
public CategoryModifier(String... categories) {
super(MODIFIER_NAME);
JSONArray categoriesArray = new JSONArray();
- for(String category: categories) {
+ for (String category: categories) {
categoriesArray.put(category);
}
try {
@@ -34,7 +34,7 @@ public class CategoryModifier extends PageModifier {
categories = params.optJSONArray(PARAM_CATEGORIES);
StringBuilder categoriesString = new StringBuilder();
- for(int i=0; i < categories.length(); i++) {
+ for (int i = 0; i < categories.length(); i++) {
String category = categories.optString(i);
categoriesString.append("\n[[Category:").append(category).append("]]");
}
diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java
index 11caa94fa..0f0a81316 100644
--- a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java
+++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java
@@ -13,7 +13,7 @@ import android.text.TextUtils;
import fr.free.nrw.commons.CommonsApplication;
import timber.log.Timber;
-public class ModificationsContentProvider extends ContentProvider{
+public class ModificationsContentProvider extends ContentProvider {
private static final int MODIFICATIONS = 1;
private static final int MODIFICATIONS_ID = 2;
@@ -46,7 +46,7 @@ public class ModificationsContentProvider extends ContentProvider{
int uriType = uriMatcher.match(uri);
- switch(uriType) {
+ switch (uriType) {
case MODIFICATIONS:
break;
default:
@@ -107,7 +107,7 @@ public class ModificationsContentProvider extends ContentProvider{
sqlDB.beginTransaction();
switch (uriType) {
case MODIFICATIONS:
- for(ContentValues value: values) {
+ for (ContentValues value: values) {
Timber.d("Inserting! %s", value);
sqlDB.insert(ModifierSequence.Table.TABLE_NAME, null, value);
}
diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequence.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequence.java
index 36012e55e..880b53313 100644
--- a/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequence.java
+++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequence.java
@@ -27,7 +27,7 @@ public class ModifierSequence {
public ModifierSequence(Uri mediaUri, JSONObject data) {
this(mediaUri);
JSONArray modifiersJSON = data.optJSONArray("modifiers");
- for (int i=0; i< modifiersJSON.length(); i++) {
+ for (int i = 0; i < modifiersJSON.length(); i++) {
modifiers.add(PageModifier.fromJSON(modifiersJSON.optJSONObject(i)));
}
}
@@ -49,7 +49,7 @@ public class ModifierSequence {
public String getEditSummary() {
StringBuilder editSummary = new StringBuilder();
- for(PageModifier modifier: modifiers) {
+ for (PageModifier modifier: modifiers) {
editSummary.append(modifier.getEditSumary()).append(" ");
}
editSummary.append("Via Commons Mobile App");
@@ -93,12 +93,12 @@ public class ModifierSequence {
public void save() {
try {
- if(contentUri == null) {
+ if (contentUri == null) {
contentUri = client.insert(ModificationsContentProvider.BASE_URI, this.toContentValues());
} else {
client.update(contentUri, toContentValues(), null, null);
}
- } catch(RemoteException e) {
+ } catch (RemoteException e) {
throw new RuntimeException(e);
}
}
diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/PageModifier.java b/app/src/main/java/fr/free/nrw/commons/modifications/PageModifier.java
index f4b3c7359..0da25d9a6 100644
--- a/app/src/main/java/fr/free/nrw/commons/modifications/PageModifier.java
+++ b/app/src/main/java/fr/free/nrw/commons/modifications/PageModifier.java
@@ -7,9 +7,9 @@ public abstract class PageModifier {
public static PageModifier fromJSON(JSONObject data) {
String name = data.optString("name");
- if(name.equals(CategoryModifier.MODIFIER_NAME)) {
+ if (name.equals(CategoryModifier.MODIFIER_NAME)) {
return new CategoryModifier(data.optJSONObject("data"));
- } else if(name.equals(TemplateRemoveModifier.MODIFIER_NAME)) {
+ } else if (name.equals(TemplateRemoveModifier.MODIFIER_NAME)) {
return new TemplateRemoveModifier(data.optJSONObject("data"));
}
diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/TemplateRemoveModifier.java b/app/src/main/java/fr/free/nrw/commons/modifications/TemplateRemoveModifier.java
index 6149084c1..f9942b007 100644
--- a/app/src/main/java/fr/free/nrw/commons/modifications/TemplateRemoveModifier.java
+++ b/app/src/main/java/fr/free/nrw/commons/modifications/TemplateRemoveModifier.java
@@ -41,18 +41,18 @@ public class TemplateRemoveModifier extends PageModifier {
Pattern templateStartPattern = Pattern.compile("\\{\\{" + templateNormalized, Pattern.CASE_INSENSITIVE);
Matcher matcher = templateStartPattern.matcher(pageContents);
- while(matcher.find()) {
+ while (matcher.find()) {
int braceCount = 1;
int startIndex = matcher.start();
int curIndex = matcher.end();
Matcher openMatch = PATTERN_TEMPLATE_OPEN.matcher(pageContents);
Matcher closeMatch = PATTERN_TEMPLATE_CLOSE.matcher(pageContents);
- while(curIndex < pageContents.length()) {
+ while (curIndex < pageContents.length()) {
boolean openFound = openMatch.find(curIndex);
boolean closeFound = closeMatch.find(curIndex);
- if(openFound && (!closeFound || openMatch.start() < closeMatch.start())) {
+ if (openFound && (!closeFound || openMatch.start() < closeMatch.start())) {
braceCount++;
curIndex = openMatch.end();
} else if (closeFound) {
@@ -71,8 +71,8 @@ public class TemplateRemoveModifier extends PageModifier {
}
// Strip trailing whitespace
- while(curIndex < pageContents.length()) {
- if(pageContents.charAt(curIndex) == ' ' || pageContents.charAt(curIndex) == '\n') {
+ while (curIndex < pageContents.length()) {
+ if (pageContents.charAt(curIndex) == ' ' || pageContents.charAt(curIndex) == '\n') {
curIndex++;
} else {
break;
diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java
index 4cbfe7c3a..dc8bba6a1 100644
--- a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java
+++ b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java
@@ -390,7 +390,7 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
public UploadResult uploadFile(String filename, InputStream file, long dataLength, String pageContents, String editSummary, final ProgressListener progressListener) throws IOException {
ApiResult result = api.upload(filename, file, dataLength, pageContents, editSummary, progressListener::onProgress);
- Log.e("WTF", "Result: " +result.toString());
+ Log.e("WTF", "Result: " + result.toString());
String resultStatus = result.getString("/api/upload/@result");
if (!resultStatus.equals("Success")) {
diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java
index d0322a187..94b6b5f19 100644
--- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java
@@ -258,6 +258,8 @@ public class NearbyActivity extends NavigationBaseActivity {
}
private void refreshView() {
+ curLatLang = locationManager.getLatestLocation();
+ progressBar.setVisibility(View.VISIBLE);
nearbyAsyncTask = new NearbyAsyncTask(this);
nearbyAsyncTask.execute();
}
diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java
index 50d661ef6..de14a2ef8 100644
--- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java
+++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java
@@ -46,7 +46,7 @@ public class NearbyPlaces {
try {
// increase the radius gradually to find a satisfactory number of nearby places
- while (radius < MAX_RADIUS) {
+ while (radius <= MAX_RADIUS) {
places = getFromWikidataQuery(curLatLng, lang, radius);
Timber.d("%d results at radius: %f", places.size(), radius);
if (places.size() >= MIN_RESULTS) {
@@ -62,6 +62,11 @@ public class NearbyPlaces {
Timber.d("back to initial radius: %f", radius);
radius = INITIAL_RADIUS;
}
+ // make sure we will be able to send at least one request next time
+ if (radius > MAX_RADIUS) {
+ radius = MAX_RADIUS;
+ }
+
return places;
}
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 0640ea444..f4398d4e2 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
@@ -1,19 +1,39 @@
package fr.free.nrw.commons.settings;
+import android.Manifest;
import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
+import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
+import android.support.annotation.NonNull;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.FileProvider;
+import android.widget.Toast;
+import java.io.File;
+
+import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
+import fr.free.nrw.commons.utils.FileUtils;
public class SettingsFragment extends PreferenceFragment {
+
+ private static final int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 100;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -66,6 +86,63 @@ public class SettingsFragment extends PreferenceFragment {
return true;
});
+ Preference sendLogsPreference = findPreference("sendLogFile");
+ sendLogsPreference.setOnPreferenceClickListener(preference -> {
+ //first we need to check if we have the necessary permissions
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ if (ContextCompat.checkSelfPermission(
+ getActivity(),
+ Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ ==
+ PackageManager.PERMISSION_GRANTED) {
+ sendAppLogsViaEmail();
+ } else {
+ //first get the necessary permission
+ requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
+ }
+ } else {
+ sendAppLogsViaEmail();
+ }
+ return true;
+ });
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) {
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ sendAppLogsViaEmail();
+ }
+ }
+ }
+
+ private void sendAppLogsViaEmail() {
+ String appLogs = Utils.getAppLogs();
+ File appLogsFile = FileUtils.createAndGetAppLogsFile(appLogs);
+
+ Context applicationContext = getActivity().getApplicationContext();
+ Uri appLogsFilePath = FileProvider.getUriForFile(
+ getActivity(),
+ applicationContext.getPackageName() + ".provider",
+ appLogsFile
+ );
+
+ Intent feedbackIntent = new Intent(Intent.ACTION_SEND);
+ feedbackIntent.setType("message/rfc822");
+ feedbackIntent.putExtra(Intent.EXTRA_EMAIL,
+ new String[]{CommonsApplication.FEEDBACK_EMAIL});
+ feedbackIntent.putExtra(Intent.EXTRA_SUBJECT,
+ String.format(CommonsApplication.FEEDBACK_EMAIL_SUBJECT,
+ BuildConfig.VERSION_NAME));
+ feedbackIntent.putExtra(Intent.EXTRA_STREAM,appLogsFilePath);
+
+ try {
+ startActivity(feedbackIntent);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(getActivity(), R.string.no_email_client, Toast.LENGTH_SHORT).show();
+ }
}
}
diff --git a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java
index af4f0eff4..086b97359 100644
--- a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java
@@ -14,7 +14,7 @@ public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
- if(Utils.isDarkTheme(this)){
+ if (Utils.isDarkTheme(this)) {
currentTheme = true;
setTheme(R.style.DarkAppTheme);
} else {
@@ -28,7 +28,7 @@ public class BaseActivity extends AppCompatActivity {
protected void onResume() {
// Restart activity if theme is changed
boolean newTheme = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("theme",false);
- if(currentTheme!=newTheme){ //is activity theme changed
+ if (currentTheme != newTheme) { //is activity theme changed
Intent intent = getIntent();
finish();
startActivity(intent);
diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
index 3537e4a1d..e1a6c5905 100644
--- a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
@@ -1,5 +1,7 @@
package fr.free.nrw.commons.theme;
+import android.accounts.Account;
+import android.accounts.AccountManager;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.support.annotation.NonNull;
@@ -9,7 +11,9 @@ import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
+import android.view.View;
import android.view.ViewGroup;
+import android.widget.TextView;
import android.widget.Toast;
import butterknife.BindView;
@@ -18,6 +22,7 @@ import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.WelcomeActivity;
+import fr.free.nrw.commons.auth.AccountUtil;
import fr.free.nrw.commons.auth.LoginActivity;
import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.nearby.NearbyActivity;
@@ -47,6 +52,22 @@ public abstract class NavigationBaseActivity extends BaseActivity
toggle.setDrawerIndicatorEnabled(true);
toggle.syncState();
setDrawerPaneWidth();
+ setUserName();
+ }
+
+ /**
+ * Set the username in navigationHeader.
+ */
+ private void setUserName() {
+
+ View navHeaderView = navigationView.getHeaderView(0);
+ TextView username = (TextView) navHeaderView.findViewById(R.id.username);
+
+ AccountManager accountManager = AccountManager.get(this);
+ Account[] allAccounts = accountManager.getAccountsByType(AccountUtil.accountType());
+ if (allAccounts.length != 0) {
+ username.setText(allAccounts[0].name);
+ }
}
public void initBackButton() {
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java
index a211a38bf..2cf18e7d7 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java
@@ -123,8 +123,9 @@ public class FileUtils {
} catch (IllegalArgumentException e) {
Timber.d(e);
} finally {
- if (cursor != null)
+ if (cursor != null) {
cursor.close();
+ }
}
return null;
}
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/GPSExtractor.java b/app/src/main/java/fr/free/nrw/commons/upload/GPSExtractor.java
index e7326246c..d9d369b65 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/GPSExtractor.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/GPSExtractor.java
@@ -221,7 +221,7 @@ public class GPSExtractor {
return decimalCoords;
}
- private double convertToDegree(String stringDMS){
+ private double convertToDegree(String stringDMS) {
double result;
String[] DMS = stringDMS.split(",", 3);
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java
index e57ce4e44..abeae0507 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java
@@ -124,7 +124,7 @@ public class MultipleShareActivity
dialog.setTitle(getResources().getQuantityString(R.plurals.starting_multiple_uploads, photosList.size(), photosList.size()));
dialog.show();
- for(int i = 0; i < photosList.size(); i++) {
+ for (int i = 0; i < photosList.size(); i++) {
Contribution up = photosList.get(i);
final int uploadCount = i + 1; // Goddamn Java
@@ -164,7 +164,7 @@ public class MultipleShareActivity
public void onCategoriesSave(List categories) {
if (categories.size() > 0) {
ContentProviderClient client = getContentResolver().acquireContentProviderClient(ModificationsContentProvider.AUTHORITY);
- for(Contribution contribution: photosList) {
+ for (Contribution contribution: photosList) {
ModifierSequence categoriesSequence = new ModifierSequence(contribution.getContentUri());
categoriesSequence.queueModifier(new CategoryModifier(categories.toArray(new String[]{})));
@@ -189,7 +189,7 @@ public class MultipleShareActivity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch(item.getItemId()) {
+ switch (item.getItemId()) {
case android.R.id.home:
if (mediaDetails.isVisible()) {
getSupportFragmentManager().popBackStack();
@@ -225,7 +225,7 @@ public class MultipleShareActivity
}
private void showDetail(int i) {
- if (mediaDetails == null ||!mediaDetails.isVisible()) {
+ if (mediaDetails == null || !mediaDetails.isVisible()) {
mediaDetails = new MediaDetailPagerFragment(true);
getSupportFragmentManager()
.beginTransaction()
@@ -252,7 +252,7 @@ public class MultipleShareActivity
if (photosList == null) {
photosList = new ArrayList<>();
ArrayList urisList = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
- for(int i=0; i < urisList.size(); i++) {
+ for (int i = 0; i < urisList.size(); i++) {
Contribution up = new Contribution();
Uri uri = urisList.get(i);
up.setLocalUri(uri);
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java b/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java
index f515f2d0c..cf1e1c2c3 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java
@@ -67,7 +67,7 @@ public class MwVolleyApi {
* @param coords Coordinates to build query with
* @return URL for API query
*/
- private String buildUrl (String coords){
+ private String buildUrl(String coords) {
Uri.Builder builder = Uri.parse(MWURL).buildUpon();
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java
index 4a41fc4d1..7951be98c 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java
@@ -59,7 +59,7 @@ public class UploadController {
}
public void cleanup() {
- if(isUploadServiceConnected) {
+ if (isUploadServiceConnected) {
app.unbindService(uploadServiceConnection);
}
}
@@ -82,11 +82,11 @@ public class UploadController {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(app);
//Set creator, desc, and license
- if(TextUtils.isEmpty(contribution.getCreator())) {
+ if (TextUtils.isEmpty(contribution.getCreator())) {
contribution.setCreator(app.getCurrentAccount().name);
}
- if(contribution.getDescription() == null) {
+ if (contribution.getDescription() == null) {
contribution.setDescription("");
}
@@ -103,11 +103,11 @@ public class UploadController {
protected Contribution doInBackground(Void... voids /* stare into you */) {
long length;
try {
- if(contribution.getDataLength() <= 0) {
+ if (contribution.getDataLength() <= 0) {
length = app.getContentResolver()
.openAssetFileDescriptor(contribution.getLocalUri(), "r")
.getLength();
- if(length == -1) {
+ if (length == -1) {
// Let us find out the long way!
length = Utils.countBytes(app.getContentResolver()
.openInputStream(contribution.getLocalUri()));
diff --git a/app/src/main/java/fr/free/nrw/commons/utils/ExecutorUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/ExecutorUtils.java
index df67cfea7..15f18ee5e 100644
--- a/app/src/main/java/fr/free/nrw/commons/utils/ExecutorUtils.java
+++ b/app/src/main/java/fr/free/nrw/commons/utils/ExecutorUtils.java
@@ -15,6 +15,6 @@ public class ExecutorUtils {
}
};
- public static Executor uiExecutor () { return uiExecutor;}
+ public static Executor uiExecutor() { return uiExecutor; }
}
diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java
index 1c816b9e1..6c3fc9a90 100644
--- a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java
+++ b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java
@@ -1,11 +1,17 @@
package fr.free.nrw.commons.utils;
+import android.os.Environment;
+
import java.io.BufferedReader;
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
import fr.free.nrw.commons.CommonsApplication;
+import timber.log.Timber;
public class FileUtils {
/**
@@ -53,5 +59,32 @@ public class FileUtils {
return deletedAll;
}
+ public static File createAndGetAppLogsFile(String logs) {
+ try {
+ File commonsAppDirectory = new File(Environment.getExternalStorageDirectory().toString() + "/CommonsApp");
+ if (!commonsAppDirectory.exists()) {
+ commonsAppDirectory.mkdir();
+ }
+ File logsFile = new File(commonsAppDirectory,"logs.txt");
+ if (logsFile.exists()) {
+ //old logs file is useless
+ logsFile.delete();
+ }
+
+ logsFile.createNewFile();
+
+ FileOutputStream outputStream = new FileOutputStream(logsFile);
+ OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
+ outputStreamWriter.append(logs);
+ outputStreamWriter.close();
+ outputStream.flush();
+ outputStream.close();
+
+ return logsFile;
+ } catch (IOException ioe) {
+ Timber.e(ioe);
+ return null;
+ }
+ }
}
diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java
index aa79513e8..d0e432c33 100644
--- a/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java
+++ b/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java
@@ -23,8 +23,8 @@ public class FragmentUtils {
.commitNow();
return true;
} catch (IllegalStateException e) {
- Timber.e(e, "Could not add & commit fragment. " +
- "Did you mean to call commitAllowingStateLoss?");
+ Timber.e(e, "Could not add & commit fragment. "
+ + "Did you mean to call commitAllowingStateLoss?");
}
return false;
}
diff --git a/app/src/main/res/drawable-hdpi/welcome_copyright.png b/app/src/main/res/drawable-hdpi/welcome_copyright.png
deleted file mode 100644
index 48f90bfde..000000000
Binary files a/app/src/main/res/drawable-hdpi/welcome_copyright.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/welcome_copyright.webp b/app/src/main/res/drawable-hdpi/welcome_copyright.webp
new file mode 100644
index 000000000..34b5327cf
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/welcome_copyright.webp differ
diff --git a/app/src/main/res/drawable-hdpi/welcome_wikipedia.png b/app/src/main/res/drawable-hdpi/welcome_wikipedia.png
deleted file mode 100644
index 6e1a8ae8c..000000000
Binary files a/app/src/main/res/drawable-hdpi/welcome_wikipedia.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/welcome_wikipedia.webp b/app/src/main/res/drawable-hdpi/welcome_wikipedia.webp
new file mode 100644
index 000000000..96ce4e276
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/welcome_wikipedia.webp differ
diff --git a/app/src/main/res/drawable-ldpi/welcome_copyright.png b/app/src/main/res/drawable-ldpi/welcome_copyright.png
deleted file mode 100644
index 6cdf2520e..000000000
Binary files a/app/src/main/res/drawable-ldpi/welcome_copyright.png and /dev/null differ
diff --git a/app/src/main/res/drawable-ldpi/welcome_copyright.webp b/app/src/main/res/drawable-ldpi/welcome_copyright.webp
new file mode 100644
index 000000000..c1bd8a976
Binary files /dev/null and b/app/src/main/res/drawable-ldpi/welcome_copyright.webp differ
diff --git a/app/src/main/res/drawable-ldpi/welcome_wikipedia.png b/app/src/main/res/drawable-ldpi/welcome_wikipedia.png
deleted file mode 100644
index e55b56421..000000000
Binary files a/app/src/main/res/drawable-ldpi/welcome_wikipedia.png and /dev/null differ
diff --git a/app/src/main/res/drawable-ldpi/welcome_wikipedia.webp b/app/src/main/res/drawable-ldpi/welcome_wikipedia.webp
new file mode 100644
index 000000000..dd8090b75
Binary files /dev/null and b/app/src/main/res/drawable-ldpi/welcome_wikipedia.webp differ
diff --git a/app/src/main/res/drawable-mdpi/welcome_copyright.png b/app/src/main/res/drawable-mdpi/welcome_copyright.png
deleted file mode 100644
index 65462b967..000000000
Binary files a/app/src/main/res/drawable-mdpi/welcome_copyright.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/welcome_copyright.webp b/app/src/main/res/drawable-mdpi/welcome_copyright.webp
new file mode 100644
index 000000000..69e238747
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/welcome_copyright.webp differ
diff --git a/app/src/main/res/drawable-mdpi/welcome_wikipedia.png b/app/src/main/res/drawable-mdpi/welcome_wikipedia.png
deleted file mode 100644
index 8d1e8e322..000000000
Binary files a/app/src/main/res/drawable-mdpi/welcome_wikipedia.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/welcome_wikipedia.webp b/app/src/main/res/drawable-mdpi/welcome_wikipedia.webp
new file mode 100644
index 000000000..5a50f5757
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/welcome_wikipedia.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/welcome_copyright.png b/app/src/main/res/drawable-xhdpi/welcome_copyright.png
deleted file mode 100644
index 973fb4598..000000000
Binary files a/app/src/main/res/drawable-xhdpi/welcome_copyright.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/welcome_copyright.webp b/app/src/main/res/drawable-xhdpi/welcome_copyright.webp
new file mode 100644
index 000000000..2feb197d2
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/welcome_copyright.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/welcome_wikipedia.png b/app/src/main/res/drawable-xhdpi/welcome_wikipedia.png
deleted file mode 100644
index 2f8dfb364..000000000
Binary files a/app/src/main/res/drawable-xhdpi/welcome_wikipedia.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/welcome_wikipedia.webp b/app/src/main/res/drawable-xhdpi/welcome_wikipedia.webp
new file mode 100644
index 000000000..48e83d760
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/welcome_wikipedia.webp differ
diff --git a/app/src/main/res/drawable/empty_photo.png b/app/src/main/res/drawable/empty_photo.png
deleted file mode 100644
index 2ad718194..000000000
Binary files a/app/src/main/res/drawable/empty_photo.png and /dev/null differ
diff --git a/app/src/main/res/drawable/empty_photo.webp b/app/src/main/res/drawable/empty_photo.webp
new file mode 100644
index 000000000..3f749936a
Binary files /dev/null and b/app/src/main/res/drawable/empty_photo.webp differ
diff --git a/app/src/main/res/drawable/llamas.png b/app/src/main/res/drawable/llamas.png
deleted file mode 100644
index fc3e258d5..000000000
Binary files a/app/src/main/res/drawable/llamas.png and /dev/null differ
diff --git a/app/src/main/res/drawable/llamas.webp b/app/src/main/res/drawable/llamas.webp
new file mode 100644
index 000000000..6e9b013d6
Binary files /dev/null and b/app/src/main/res/drawable/llamas.webp differ
diff --git a/app/src/main/res/drawable/mount_zao.png b/app/src/main/res/drawable/mount_zao.png
deleted file mode 100644
index 86b98661e..000000000
Binary files a/app/src/main/res/drawable/mount_zao.png and /dev/null differ
diff --git a/app/src/main/res/drawable/mount_zao.webp b/app/src/main/res/drawable/mount_zao.webp
new file mode 100644
index 000000000..83fd07b30
Binary files /dev/null and b/app/src/main/res/drawable/mount_zao.webp differ
diff --git a/app/src/main/res/drawable/rainbow_bridge.png b/app/src/main/res/drawable/rainbow_bridge.png
deleted file mode 100644
index a3f78efe6..000000000
Binary files a/app/src/main/res/drawable/rainbow_bridge.png and /dev/null differ
diff --git a/app/src/main/res/drawable/rainbow_bridge.webp b/app/src/main/res/drawable/rainbow_bridge.webp
new file mode 100644
index 000000000..890ebbca5
Binary files /dev/null and b/app/src/main/res/drawable/rainbow_bridge.webp differ
diff --git a/app/src/main/res/drawable/selfie_x.png b/app/src/main/res/drawable/selfie_x.png
deleted file mode 100644
index c049e2f18..000000000
Binary files a/app/src/main/res/drawable/selfie_x.png and /dev/null differ
diff --git a/app/src/main/res/drawable/selfie_x.webp b/app/src/main/res/drawable/selfie_x.webp
new file mode 100644
index 000000000..35c6c0c25
Binary files /dev/null and b/app/src/main/res/drawable/selfie_x.webp differ
diff --git a/app/src/main/res/drawable/sydney_opera_house.png b/app/src/main/res/drawable/sydney_opera_house.png
deleted file mode 100644
index fc1009cd1..000000000
Binary files a/app/src/main/res/drawable/sydney_opera_house.png and /dev/null differ
diff --git a/app/src/main/res/drawable/sydney_opera_house.webp b/app/src/main/res/drawable/sydney_opera_house.webp
new file mode 100644
index 000000000..fd7453004
Binary files /dev/null and b/app/src/main/res/drawable/sydney_opera_house.webp differ
diff --git a/app/src/main/res/drawable/tulip.png b/app/src/main/res/drawable/tulip.png
deleted file mode 100644
index 6467a0701..000000000
Binary files a/app/src/main/res/drawable/tulip.png and /dev/null differ
diff --git a/app/src/main/res/drawable/tulip.webp b/app/src/main/res/drawable/tulip.webp
new file mode 100644
index 000000000..21a8a21df
Binary files /dev/null and b/app/src/main/res/drawable/tulip.webp differ
diff --git a/app/src/main/res/layout/drawer_header.xml b/app/src/main/res/layout/drawer_header.xml
index 5ea1160d9..c27cab1ba 100644
--- a/app/src/main/res/layout/drawer_header.xml
+++ b/app/src/main/res/layout/drawer_header.xml
@@ -1,8 +1,28 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_contributions.xml b/app/src/main/res/layout/fragment_contributions.xml
index 2be422005..fa53d9721 100644
--- a/app/src/main/res/layout/fragment_contributions.xml
+++ b/app/src/main/res/layout/fragment_contributions.xml
@@ -1,5 +1,6 @@
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml
index 0a9e52d6e..174aaee96 100644
--- a/app/src/main/res/values-ast/strings.xml
+++ b/app/src/main/res/values-ast/strings.xml
@@ -73,9 +73,9 @@
Configuración
Date d\'alta
Tocante a
- Software de códigu abiertu lliberáu baxo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Llicencia Apache v2</a>. %1$s ya\'l so logotipu son marques rexistraes de la Fundación Wikimedia y utilícense col so permisu. Nun tamos acreditaos pola Fundación Wikimedia nin tamos afiliaos con ella.
+ La app de Wikimedia Commons ye software de códigu abiertu, creáu y calteníu por becaos y voluntarios de la comunidá de Wikimedia. La Fundación Wikimedia nun participa na creación, desendolcu nin caltenimientu de la app.
El <a href=\"https://github.com/commons-app/apps-android-commons\">códigu fonte</a> ya\'l <a href=\"https://commons-app.github.io/\">sitiu web</a> tán en GitHub. Crea una nueva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia en GitHub</a> pa informar de problemes y suxerencies.
- Wikimedia:Commons-android-strings-about privacy policy/ast
+ <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Política d\'intimidá</a>
<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a>
Tocante a
Unviar comentarios (per corréu)
@@ -198,4 +198,5 @@
Dar permisu
Usar almacenamientu esternu
Guardar nel preséu les imaxes tomaes cola cámara de la app
+ Anicia sesión na to cuenta
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 055de35df..49b2e9d2c 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -198,5 +198,7 @@
Giv tilladelse
Brug eksternt lager
Gem billeder taget med din enheds program på kameraet
+ Send logfil
+ Send logfil til udviklerne via e-post
Log ind på din konto
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 264bfa72a..0147104d0 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -198,5 +198,7 @@
Berechtigung geben
Externen Speicher verwenden
Mit der In-App-Kamera aufgenommene Bilder auf deinem Gerät speichern
+ Logdatei senden
+ Logdatei an die Entwickler per E-Mail senden
Bei deinem Benutzerkonto anmelden
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 57eca4e2c..d802b28bd 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -198,5 +198,7 @@
Otorgar permiso
Utilizar almacenamiento externo
Guardar en el dispositivo imágenes capturadas con la cámara de la aplicación
+ Enviar archivo de registro
+ Enviar archivo de registro a los desarrolladores por correo electrónico
Accede a tu cuenta
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 01ed93eb6..6d7df14b4 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -198,5 +198,7 @@
Accorder le droit
Utiliser le stockage externe
Enregistrer les images prises avec l’appareil photo de votre appareil
+ Envoyer le fichier de log
+ Envoyer le fichier de log aux développeurs par courriel
Connectez-vous à votre compte
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 95ac9bb22..721ed066a 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -75,7 +75,7 @@
Névjegy
A Wikimedia Commons applikáció egy nyílt forráskódú szoftver, amit a Wikimedia-közösség önkéntesei készítettek és tartanak karban. A Wikimédia Alapítvány nem vesz részt az applikáció megalkotásában, fejlesztésében és üzemeltetésében.
<a href=\"https://github.com/commons-app/apps-android-commons\">Forráskód</a> és <a href=\"https://commons-app.github.io/\">weboldal</a> a GitHubon. Nyiss egy új <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-problémát</a> hibabejelentéssel vagy fejlesztési javaslattal.
- <a href=\"https://wikimediafoundation.org/wiki/Adatvédelmi_irányelv\">Adatvédelmi irányelvek</a>
+ <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Adatvédelmi irányelvek</a>
<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Köszönetnyilvánítás</a>
Névjegy
Visszajelzés küldése (e-mailben)
@@ -190,6 +190,7 @@
nincs leírás
Commons leírólap
Wikidata-elem
+ Egy egyedi, leíró cím a fájlnak, ami fájlnévként fog szolgálni. Egyszerű nyelvezetet használhatsz szóközökkel. Ne tedd bele a kiterjesztést.
Kérlek a lehető legteljesebb módon írd le a fájlt: hol készült, mit ábrázol, mi a kontextus? Kérlek add meg az objektumokat vagy személyeket a képen, valamint a nehezen kitalálható információkat (például a kép készítésének dátumát, ha az egy tájkép). Amennyiben a média valami szokatlant ábrázol, kérlek fejtsd ki, hogy mi teszi szokatlanná.
Engedély adása
Külső tárhely használata
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 5342b9f3f..f49382806 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -72,9 +72,9 @@
הגדרות
רישום
אודות
- תכנת קוד פתוח המתפרסמת לפי תנאי <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. השם %1$s והסמל שמשויך אליו הם סימני מסחר של קרן ויקימדיה ומשמשים באישור קרן ויקימדיה. איננו נתמכים על־ידי קרן ויקימדיה או קשורים אליה בשותפות.
+ יישום ויקישיתוף (Wikimedia Commons app) הוא יישום קוד פתוח שמפותח ומתוחזק על־ידי מקבלי מלגות ומתנדבים של קהילת ויקימדיה. קרן ויקימדיה אינה מעורבת ביצירה, פיתוח, או תחזוקה של היישום.
<a href=\"https://github.com/commons-app/apps-android-commons\">קוד מקור</a> ו<a href=\"https://commons-app.github.io/\">אתר</a> בגיטהאב. נא ליצור <a href=\"https://github.com/commons-app/apps-android-commons/issues\">דיווח בגיטהאב</a> בשביל באגים והצעות.
-
+ <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">מדיניות פרטיות</a>
<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">יוצרים</a>
אודות
שליחת משוב (בדוא\"ל)
@@ -172,6 +172,7 @@
צבעוני
בלי תמונות סלפי
תמונה קניינית
+ ברוך בואך ויקיפדיה
בית האופרה של סידני
ביטול
פתיחה
@@ -191,6 +192,8 @@
שגיאה במשירת תמונות במטמון
כותרת מתארת ייחודית לקובץ, שתשמש שם קובץ. אפשר להשתמש בשפה פשוטה עם רווחים. אין לכלול סיומת קובץ
נא לתאר את המדיה כמה שיותר: איפה היא נוצרה? מה היא מראה? מה ההקשר? נא לתאר את העצמים או את האנשים. נא לחשוף מידע שאי־אפשר לנחש בקלות, למשל, הזמן ביום אם זאת תמונת נוף. אם המדיה מציגה משהו בלתי־רגיל, נא להסביר מה מיוחד בה.
+ לתת הרשאה
להשתמש באחסון חיצוני
שמירת תמונות שצולמו באמצעות מצלמה בתוך היישום במכשיר שלך
+ כניסה לחשבון שלך
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index d75e2c350..cc2794d5f 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -72,7 +72,7 @@
설정
가입하기
정보
- 오픈 소스 소프트웨어는 <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">아파치 라이선스 v2</a>에 따라 공개됩니다. %1$s 및 관련 로고는 위키미디어 재단의 상표이며 위키미디어 재단의 허가를 통해 사용될 수 있습니다. 저희는 위키미디어 재단에 의해 보증되거나 제휴되어 있지 않습니다.
+ 위키미디어 공용 앱은 오픈 소스 애플리케이션이며 위키미디어 공동체 내의 자원봉사자에 의해 유지됩니다. 위키미디어 재단은 애플리케이션의 생성, 개발, 유지보수에 관여하지 않습니다.
소스 코드는 <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>에 있으며, 웹사이트는 <a href=\"https://commons-app.github.io/\">GitHub</a>에 있습니다. 버그나 기타 제안은 <a href=\" https://github.com/commons-app/apps-android-commons/issues\">GitHub</a>에 보고해주세요.
<a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">개인정보 정책</a>
<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">제작진</a>
@@ -195,5 +195,7 @@
권한 부여
외부 저장소 사용하기
장치의 인앱 카메라로 찍은 사진 저장하기
+ 로그 파일 보내기
+ 이메일로 개발자에게 로그 파일 보내기
자신의 계정으로 로그인
diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml
index f07449353..c17e362c7 100644
--- a/app/src/main/res/values-lb/strings.xml
+++ b/app/src/main/res/values-lb/strings.xml
@@ -72,7 +72,7 @@
Astellungen
Mellt Iech un
Iwwer
- \'Open-Source-Software\' verëffentlecht ënner der <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache Lizenz v2</a>. %1$s a säi Logo si Markenzeeche vun der Wikimedia Foundation a gi mat der Autorisatioun vun der Wikimedia Foundation benotzt. Mir sinn net confirméiert vun oder liéiert mat der Wikimedia Foundation.
+ D\'App Wikimedia Commons ass eng \'Open-Source-App\' déi vu Fräiwëllege vun der Wikimedia Foundation entwéckelt gouf an och vun hinnen ënnerhal gëtt. D\'Wikimedia Foundation ass net an d\'Entwécklung oder den Ënnerhalt vun der App implizéiert.
<a href=\"https://github.com/commons-app/apps-android-commons\">Quell</a> an <a href=\"https://commons-app.github.io/\">Internetsite</a> vu GitHub.\nLeet w.e.g. <a href=\"https://github.com/commons-app/apps-android-commons/issues\"> e GitHub Problem</a> fir Problemer ze mellen a Proposen ze maachen.
<a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Dateschutzerklärung</a>
<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Merci</a>
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 5557efef8..000d94051 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -198,5 +198,7 @@
Дај дозвола
Користи надворешен склад
Зачувување на направените слики во прилогот со камерата на вашиот уред
+ Испрати дневничка податотека
+ Испрати дневничка податотека на разработувачите по е-пошта
Најавете се со вашата сметка
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index d68af6afa..1c7bcc54a 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -198,5 +198,7 @@
Gi tillatelse
Bruk ekstern lagring
Lagre bilder som er tatt med kameraet i appen på enheten din
+ Send loggfil
+ Send loggfil til utviklerne via epost
Logg inn med kontoen din
diff --git a/app/src/main/res/values-pms/strings.xml b/app/src/main/res/values-pms/strings.xml
index 3c04b6370..890f688e8 100644
--- a/app/src/main/res/values-pms/strings.xml
+++ b/app/src/main/res/values-pms/strings.xml
@@ -198,5 +198,7 @@
Dé ël përmess
Dovré n\'anmagasinament estern
Argistré le plance pijà con la màchina fòto ëd sò angign
+ Mandé l\'archivi d\'argistr
+ Mandé l\'archivi d\'argistr ai dësvlupator për pòsta eletrònica
Ch\'as colega a sò cont
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 8f5926878..d6706ed98 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -77,7 +77,7 @@
Настройки
Зарегистрироваться
О приложении
- Приложение с открытым исходным кодом, выпущено по лицензии <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. %1$s и его логотип являются товарными знаками Фонда Викимедиа и используются с разрешения Фонда Викимедиа. Мы не поддерживаемся и не связаны с Фондом Викимедиа.
+ Приложение «Викисклад» - это программа с открытым кодом, которую создали волонтёры и участники грантов Викимедиа. Фонд Викимедиа не участвует в создании, разработке или обслуживании этого приложения.
<a href=\"https://github.com/commons-app/apps-android-commons\">Исходный код</a> и <a href=\"https://commons-app.github.io/\">сайт</a> на GitHub. Создайте новый <a href=\"https://github.com/commons-app/apps-android-commons/issues\">запрос на GitHub</a>, чтоб сообщить об ошибке или внести предложение.
<a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Политика конфиденциальности</a>
<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Благодарности</a>
@@ -90,6 +90,7 @@
Повторить
Отмена
Это изображение будет лицензировано под %1$s
+ Отправляя это изображение, я подтверждаю, что это моя собственная работа, которая не содержит защищённых авторским правом материалов или селфи, а также отвечает <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines/ru\">правилам Викисклада</a>.
Скачать
Лицензия
Использовать предыдущие заголовок/описание
@@ -196,7 +197,10 @@
Страница файла на Викискладе
Элемент Викиданных
Ошибка при кэшировании картинок
+ Уникальное описание, которое будет сохранено как имя файла. Вы можете использовать естественный язык, разделяя слова пробелами. Пожалуйста, не указывайте расширение файла.
+ Пожалуйста, подробно опишите загружаемый файл: где он был снят? что на нём изображено? каков его контекст? Пожалуйста опишите изображённых персон или объекты. Добавьте информацию, о которой нельзя легко догадаться, например, время суток, когда снимался файл. Если снято что-то необычное, постарайтесь пояснить, что именно в этом необычного.
Дать разрешение
Использовать внешнее хранилище
Сохранять изображения, сделанные с помощью встроенной камеры на устройстве
+ Войдите в свою учётную запись
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 04ea46ecf..4ed4fe377 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -198,4 +198,5 @@
Давање дозволе
Употреба спољашњег складишта
Спремање слика направљених камером апликације на Вашем уређају
+ Пријавите се на свој налог
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 416a776eb..a77c2ade6 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -198,5 +198,7 @@
Ge behörighet
Använd extern lagring
Spara bilder som tas med kameran i appen på din enhet
+ Skicka loggfil
+ Skicka loggfilen till utvecklarna via e-post
Logga in på ditt konto
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
new file mode 100644
index 000000000..7af596a8b
--- /dev/null
+++ b/app/src/main/res/values-ur/strings.xml
@@ -0,0 +1,121 @@
+
+
+ کامنز
+ ترتیبات
+ صارف نام
+ پاس ورڈ
+ داخل ہوں
+ کھاتہ بنائیں
+ لاگ آن
+ براہ مہربانی کچھ دیر انتظار کریں۔۔۔
+ لاگ ان کامیاب۔
+ داخل ہونے میں ناکامی ہوئی!
+ فائل نہیں ملی، براہ کرم دوسری فائل آزمائیں۔
+ تصدیق ناکام!
+ اپلوڈ شروع!
+ %1$s اپلوڈ شد!
+ اپنی اپلوڈ دیکھنے کے لیے ٹیپ کریں۔
+ %1$s کی اپلوڈنگ شروع ہو رہی ہے
+ %1$s اپلوڈ جاری
+ %1$s کی اپلوڈنگ مکمل ہو رہی ہے
+ اپلوڈ %1$s ہونے میں ناکام
+ دیکھنے کے لیے ٹیپ کریں
+
+ - %d فائل اپلوڈ ہورہی ہے
+ - %d فائلیں اپلوڈ ہورہی ہے
+
+ میں حالیہ اپلوڈ
+ قطار
+ ناکام
+ %1$d%% مکمل
+ اپلوڈ جاری ہے
+ از نگار خانہ
+ تصویر لیں
+ قریبی
+ میری اپلوڈ
+ شیئر
+ براؤزر میں کھولیں
+ عنوان
+ وضاحت
+ لاگ ان ہونے میں ناکام - نیٹ ورک ناکامی
+ لاگ ان ہونے میں ناکام - براہ مہربانی اپنا صارف نام کی جانچ کریں
+ لاگ ان ہونے میں ناکام - براہ مہربانی - اپنے پاس ورڈ کی جانچ کریں
+ بے شمار ناکام کوششیں کچھ منٹوں میں دوبارہ کوشش کریں۔
+ معذرت، یہ صارف کومنز پر بلاک کردیا گیا ہے
+ آپ کو اپنے دو عامل کے تصدیق کوڈ فراہم کرنا چاہیے۔
+ داخل ہونے میں ناکام
+ اپلوڈ کریں
+ سیٹ کو نام دیں
+ اصلاحات
+ اپلوڈ کریں
+ زمرہ جات تلاش کریں
+ محفوظ کریں
+ تازہ کریں
+ جی پی ایس آپ کے آلے میں غیر فعال ہے۔ آپ اس کو فعال کرنا چاہینگے؟
+ جی پی ایس فعال کریں
+ ابھی تک کوئی اپلوڈ نہیں
+
+ - \@string/contributions_subtitle_zero
+ - %d اپلوڈ
+ - %d اپلوڈ
+
+
+ - شروع %d اپلوڈ
+ - شروع %d اپلوڈ
+
+
+ - %d اپلوڈ
+ - %d اپلوڈ
+
+ %1$s سے کوئی زمرہ جات میل نہیں کھاتے
+ ویکیمیڈیا کامنز پر اپنی تصاویر کو قابل دریافت بنانے کے لیے زمرے شامل کریں۔\n\nزمرے شامل کرنے کے لیے لکھنا شروع کریں۔\n\nاس مرحلے کو نظر انداز کرنے کے لیے اس پیغام یا (یا پیچھے) پر ٹیپ کریں۔
+ زمرہ جات
+ ترتیبات
+ کھاتہ بنائیں
+ بابت
+ ویکیمیڈیا کامنز ایپ ایک اوپن سورس ایپ ہے جو موہوب الیہ اور رضاکاروں کی جانب سے برقرار رکھی جاتی اور بنائی گئی ہے۔ ویکیمیڈیا فاؤنڈیش کا اس ایپ کی برقراری اور تخلیق سے کوئی واسطہ نہیں ہے۔
+ <a href=\"https://github.com/commons-app/apps-android-commons\">ماخذ</a> اور <a href=\"https://commons-app.github.io/\">ویب سائٹ</a> در گٹ ہب۔<a href=\"https://github.com/commons-app/apps-android-commons/issues\">نیا گٹ ہب اجرا بنائیں</a> تاکہ آپ bug شکایتیں اور تجایز دیں سکیں
+ <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">سرگرمی کی تدبیر</a>
+ <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">کریڈٹ</a>
+ تعارف
+ فیڈبیک بھیجیے (براستہ ای میل)
+ ای میل کلائنٹ انسٹال نہیں
+ حال ہی میں استعمال کیے گئے زمرے
+ سب سے پہلے sync کے انتظار میں۔۔۔
+ آپ نے ابھی تک کوئی تصاویر اپلوڈ نہیں کی ہے۔
+ دوبارہ کوشش کریں
+ منسوخ
+ %1$s تلے یہ تصویر لائسنس یافتہ ہو گی
+ اس تصویر کو درج کر کے، میں اقرار کرتا ہوں کہ یہ میرا اپنا کام ہے، اس ميں کاپی رائٹ مواد یا سیلفیاں نہیں ہیں، اور بصورت دیگر میں <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">ویکیمیڈیا کامنز پالیسیوں</a> کا پابند ہوں۔
+ ڈاؤنلوڈ
+ اجازت نامہ
+ گزشتہ عنوان/وضاحت استعمال کریں
+ خودکارانہ طریقے سے حالیہ جگہ حاصل کریں
+ نائٹ موڈ
+ کالا تھیم استعمال کریں
+ CC BY-SA 3.0 (آسٹریا)
+ CC BY-SA 3.0 (جرمنی)
+ CC BY-SA 3.0 (اسٹونیا)
+ CC BY-SA 3.0 (اسپین)
+ CC BY-SA 3.0 (کرویئشا)
+ CC BY-SA 3.0 (لکسمبرگ)
+ ہاں!
+ زمرہ جات
+ لوڈ ہو رہا ہے۔۔۔
+ غیر منتخب
+ کوئی وضاحت نہیں
+ نامعلوم اجازت نامہ
+ ریفریش کریں
+ ٹھیک ہے
+ جی
+ نہیں
+ اجازت نامہ
+ متناسقات
+ کامنز لوگو
+ کوئی سیلفی نہیں
+ تعارف
+ ترتیبات
+ آپ کی رائے
+ لاگ آوٹ
+ معلمی
+
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index b5db7bb40..0d2d5a958 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -198,5 +198,7 @@
給予權限
使用外部存儲裝置
在您的裝置上使用照相機應用程式來儲存照片
+ 寄送日誌檔案
+ 經由電子郵件寄送日誌檔案給開發人員
登入您的帳號
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 3bed9e026..01b8c4511 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -198,5 +198,7 @@
提供权限
使用外部存储
在您的设备上,使用应用中的照相机保存照片
+ 发送日志文件
+ 通过电子邮件将日志文件发送给开发人员
登录您的账户
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ba5cd955f..068b6980a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -207,5 +207,7 @@ Tap this message (or hit back) to skip this step.
Give permission
Use external storage
Save pictures taken with the in-app camera on your device
- Login to your account
+ Send log file
+ Send log file to developers via email
+ Login to your account
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index fab5c93e7..b7b63d39c 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -53,4 +53,9 @@
android:summary="@string/use_external_storage_summary"
/>
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml
index ddfff67cc..696723b68 100644
--- a/app/src/main/res/xml/provider_paths.xml
+++ b/app/src/main/res/xml/provider_paths.xml
@@ -1,4 +1,5 @@
+
\ No newline at end of file