diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 691562b04..8feca4268 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,25 +1,18 @@ -_Before creating an issue, please search the existing issues to see if a similar one has already been created. You can search issues by specific labels (e.g. `label:nearby `) or just by typing keywords into the search filter._ - **Summary:** Summarize your issue in one sentence (what goes wrong, what did you expect to happen) +_Before creating an issue, please search the existing issues to see if a similar one has already been created. You can search issues by specific labels (e.g. `label:nearby `) or just by typing keywords into the search filter._ + **Steps to reproduce:** -How can we reproduce the issue? +How can we reproduce the issue? +What did you expect the app to do, and what did you see instead? **Add System logs:** Add logcat files here (if possible). -**Expected behavior:** - -What did you expect the App to do? - -**Observed behavior:** - -What did you see instead? Describe your issue in detail here. - **Device and Android version:** What make and model device (e.g., Samsung J7) did you encounter this on? What Android @@ -28,7 +21,7 @@ version (e.g., Android 4.0 Ice Cream Sandwich or Android 6.0 Marshmallow) are yo **Commons app version:** -You can find this information by going to the navigation drawer in the app and tapping 'About' +You can find this information by going to the navigation drawer in the app and tapping 'About'. If you are building from our codebase instead of downloading the app, please also mention the branch and build variant (e.g. master and prodDebug). **Screen-shots:** diff --git a/app/build.gradle b/app/build.gradle index 3f062c5c6..de49c6b93 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ dependencies { implementation 'com.jakewharton.timber:timber:4.5.1' implementation 'info.debatty:java-string-similarity:0.24' implementation 'com.borjabravo:readmoretextview:2.1.0' - implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'com.android.support.constraint:constraint-layout:1.1.0' implementation('com.mapbox.mapboxsdk:mapbox-android-sdk:5.5.0@aar') { transitive = true } diff --git a/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java b/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java index 9ef6b7843..896158439 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java @@ -5,6 +5,8 @@ import android.accounts.AccountManager; import android.content.Context; import android.content.SharedPreferences; +import javax.annotation.Nullable; + import fr.free.nrw.commons.mwapi.MediaWikiApi; import io.reactivex.Completable; import io.reactivex.Observable; @@ -31,6 +33,7 @@ public class SessionManager { /** * @return Account|null */ + @Nullable public Account getCurrentAccount() { if (currentAccount == null) { AccountManager accountManager = AccountManager.get(context); diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java index ed6001f94..76f3e5a0f 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java @@ -24,6 +24,7 @@ import static android.content.Intent.EXTRA_STREAM; import static fr.free.nrw.commons.contributions.Contribution.SOURCE_CAMERA; import static fr.free.nrw.commons.contributions.Contribution.SOURCE_GALLERY; import static fr.free.nrw.commons.upload.UploadService.EXTRA_SOURCE; +import static fr.free.nrw.commons.wikidata.WikidataConstants.WIKIDATA_ENTITY_ID_PREF; public class ContributionController { @@ -91,6 +92,7 @@ public class ContributionController { } public void handleImagePicked(int requestCode, Intent data, boolean isDirectUpload, String wikiDataEntityId) { + Timber.d("Is direct upload %s and the Wikidata entity ID is %s", isDirectUpload, wikiDataEntityId); FragmentActivity activity = fragment.getActivity(); Timber.d("handleImagePicked() called with onActivityResult()"); Intent shareIntent = new Intent(activity, ShareActivity.class); @@ -119,7 +121,7 @@ public class ContributionController { try { shareIntent.putExtra("isDirectUpload", isDirectUpload); if (wikiDataEntityId != null && !wikiDataEntityId.equals("")) { - shareIntent.putExtra("wikiDataEntityId", wikiDataEntityId); + shareIntent.putExtra(WIKIDATA_ENTITY_ID_PREF, wikiDataEntityId); } activity.startActivity(shareIntent); } catch (SecurityException e) { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java index 099792bc5..0599b4fe2 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java @@ -35,6 +35,7 @@ import timber.log.Timber; import static android.app.Activity.RESULT_OK; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static fr.free.nrw.commons.wikidata.WikidataConstants.WIKIDATA_ENTITY_ID_PREF; public class NearbyListFragment extends DaggerFragment { private Bundle bundleForUpdates; // Carry information from activity about changed nearby places and current location @@ -146,7 +147,7 @@ public class NearbyListFragment extends DaggerFragment { if (resultCode == RESULT_OK) { Timber.d("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s", requestCode, resultCode, data); - controller.handleImagePicked(requestCode, data, true, directPrefs.getString("WikiDataEntityId", null)); + controller.handleImagePicked(requestCode, data, true, directPrefs.getString(WIKIDATA_ENTITY_ID_PREF, null)); } else { Timber.e("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s", requestCode, resultCode, data); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index 934d74353..44807c195 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -63,6 +63,7 @@ import uk.co.deanwild.materialshowcaseview.MaterialShowcaseView; import static android.app.Activity.RESULT_OK; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static fr.free.nrw.commons.wikidata.WikidataConstants.WIKIDATA_ENTITY_ID_PREF; public class NearbyMapFragment extends DaggerFragment { @@ -711,7 +712,7 @@ public class NearbyMapFragment extends DaggerFragment { fabCamera.setOnClickListener(view -> { if (fabCamera.isShown()) { - Timber.d("Camera button tapped. Image title: " + place.getName() + "Image desc: " + place.getLongDescription()); + Timber.d("Camera button tapped. Place: %s", place.toString()); storeSharedPrefs(); directUpload.initiateCameraUpload(); } @@ -719,7 +720,7 @@ public class NearbyMapFragment extends DaggerFragment { fabGallery.setOnClickListener(view -> { if (fabGallery.isShown()) { - Timber.d("Gallery button tapped. Image title: " + place.getName() + "Image desc: " + place.getLongDescription()); + Timber.d("Gallery button tapped. Place: %s", place.toString()); storeSharedPrefs(); directUpload.initiateGalleryUpload(); } @@ -731,7 +732,7 @@ public class NearbyMapFragment extends DaggerFragment { editor.putString("Title", place.getName()); editor.putString("Desc", place.getLongDescription()); editor.putString("Category", place.getCategory()); - editor.putString("WikiDataEntityId", place.getWikiDataEntityId()); + editor.putString(WIKIDATA_ENTITY_ID_PREF, place.getWikiDataEntityId()); editor.apply(); } @@ -767,7 +768,7 @@ public class NearbyMapFragment extends DaggerFragment { if (resultCode == RESULT_OK) { Timber.d("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s", requestCode, resultCode, data); - controller.handleImagePicked(requestCode, data, true, directPrefs.getString("WikiDataEntityId", null)); + controller.handleImagePicked(requestCode, data, true, directPrefs.getString(WIKIDATA_ENTITY_ID_PREF, null)); } else { Timber.e("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s", requestCode, resultCode, data); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java index 93075e8fe..285fcf83e 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java @@ -10,6 +10,7 @@ import java.util.Map; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; +import timber.log.Timber; public class Place { @@ -58,10 +59,12 @@ public class Place { @Nullable public String getWikiDataEntityId() { if (!hasWikidataLink()) { + Timber.d("Wikidata entity ID is null for place with sitelink %s", siteLinks.toString()); return null; } String wikiDataLink = siteLinks.getWikidataLink().toString(); + Timber.d("Wikidata entity is %s", wikiDataLink); return wikiDataLink.replace("http://www.wikidata.org/entity/", ""); } @@ -94,7 +97,18 @@ public class Place { @Override public String toString() { - return String.format("Place(%s@%s)", name, location); + return "Place{" + + "name='" + name + '\'' + + ", label='" + label + '\'' + + ", longDescription='" + longDescription + '\'' + + ", secondaryImageUrl='" + secondaryImageUrl + '\'' + + ", location='" + location + '\'' + + ", category='" + category + '\'' + + ", image='" + image + '\'' + + ", secondaryImage=" + secondaryImage + + ", distance='" + distance + '\'' + + ", siteLinks='" + siteLinks.toString() + '\'' + + '}'; } /** diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java b/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java index f4b29df77..8993db344 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java @@ -58,6 +58,15 @@ public class Sitelinks implements Parcelable { return Uri.parse(sanitisedStringUrl); } + @Override + public String toString() { + return "Sitelinks{" + + "wikipediaLink='" + wikipediaLink + '\'' + + ", commonsLink='" + commonsLink + '\'' + + ", wikidataLink='" + wikidataLink + '\'' + + '}'; + } + private Sitelinks(Sitelinks.Builder builder) { this.wikidataLink = builder.wikidataLink; this.wikipediaLink = builder.wikipediaLink; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java b/app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java index 2845b8d1f..b29d686f5 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java @@ -106,20 +106,20 @@ public class FileProcessor implements SimilarImageDialogFragment.onResponse { ParcelFileDescriptor descriptor = contentResolver.openFileDescriptor(mediaUri, "r"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (descriptor != null) { - imageObj = new GPSExtractor(descriptor.getFileDescriptor(), context, prefs); + imageObj = new GPSExtractor(descriptor.getFileDescriptor()); } } else { String filePath = getPathOfMediaOrCopy(); if (filePath != null) { - imageObj = new GPSExtractor(filePath, context, prefs); + imageObj = new GPSExtractor(filePath); } } - decimalCoords = imageObj.getCoords(gpsEnabled); + decimalCoords = imageObj.getCoords(); if (decimalCoords == null || !imageObj.imageCoordsExists) { //Find other photos taken around the same time which has gps coordinates if (!haveCheckedForOtherImages) - findOtherImages(gpsEnabled);// Do not do repeat the process + findOtherImages();// Do not do repeat the process } else { useImageCoords(); } @@ -137,9 +137,8 @@ public class FileProcessor implements SimilarImageDialogFragment.onResponse { /** * Find other images around the same location that were taken within the last 20 sec * - * @param gpsEnabled True if GPS is enabled */ - private void findOtherImages(boolean gpsEnabled) { + private void findOtherImages() { Timber.d("filePath" + getPathOfMediaOrCopy()); long timeOfCreation = new File(filePath).lastModified();//Time when the original image was created @@ -161,17 +160,17 @@ public class FileProcessor implements SimilarImageDialogFragment.onResponse { } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (descriptor != null) { - tempImageObj = new GPSExtractor(descriptor.getFileDescriptor(), context, prefs); + tempImageObj = new GPSExtractor(descriptor.getFileDescriptor()); } } else { if (filePath != null) { - tempImageObj = new GPSExtractor(file.getAbsolutePath(), context, prefs); + tempImageObj = new GPSExtractor(file.getAbsolutePath()); } } if (tempImageObj != null) { - Timber.d("not null fild EXIF" + tempImageObj.imageCoordsExists + " coords" + tempImageObj.getCoords(gpsEnabled)); - if (tempImageObj.getCoords(gpsEnabled) != null && tempImageObj.imageCoordsExists) { + Timber.d("not null fild EXIF" + tempImageObj.imageCoordsExists + " coords" + tempImageObj.getCoords()); + if (tempImageObj.getCoords() != null && tempImageObj.imageCoordsExists) { // Current image has gps coordinates and it's not current gps locaiton Timber.d("This file has image coords:" + file.getAbsolutePath()); SimilarImageDialogFragment newFragment = new SimilarImageDialogFragment(); @@ -250,7 +249,7 @@ public class FileProcessor implements SimilarImageDialogFragment.onResponse { @Override public void onPositiveResponse() { imageObj = tempImageObj; - decimalCoords = imageObj.getCoords(false);// Not necessary to use gps as image already ha EXIF data + decimalCoords = imageObj.getCoords();// Not necessary to use gps as image already ha EXIF data Timber.d("EXIF from tempImageObj"); useImageCoords(); } 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 b9750e350..e45b31f05 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 @@ -1,13 +1,6 @@ package fr.free.nrw.commons.upload; -import android.content.Context; -import android.content.SharedPreferences; -import android.location.Criteria; -import android.location.Location; -import android.location.LocationListener; -import android.location.LocationManager; import android.media.ExifInterface; -import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; @@ -19,31 +12,21 @@ import timber.log.Timber; /** * Extracts geolocation to be passed to API for category suggestions. If a picture with geolocation - * is uploaded, extract latitude and longitude from EXIF data of image. If a picture without - * geolocation is uploaded, retrieve user's location (if enabled in Settings). + * is uploaded, extract latitude and longitude from EXIF data of image. */ public class GPSExtractor { - private final Context context; - private SharedPreferences prefs; private ExifInterface exif; private double decLatitude; private double decLongitude; - private Double currentLatitude = null; - private Double currentLongitude = null; public boolean imageCoordsExists; - private MyLocationListener myLocationListener; - private LocationManager locationManager; /** * Construct from the file descriptor of the image (only for API 24 or newer). * @param fileDescriptor the file descriptor of the image - * @param context the context */ @RequiresApi(24) - public GPSExtractor(@NonNull FileDescriptor fileDescriptor, Context context, SharedPreferences prefs) { - this.context = context; - this.prefs = prefs; + public GPSExtractor(@NonNull FileDescriptor fileDescriptor) { try { exif = new ExifInterface(fileDescriptor); } catch (IOException | IllegalArgumentException e) { @@ -54,65 +37,22 @@ public class GPSExtractor { /** * Construct from the file path of the image. * @param path file path of the image - * @param context the context + * */ - public GPSExtractor(@NonNull String path, Context context, SharedPreferences prefs) { - this.prefs = prefs; + public GPSExtractor(@NonNull String path) { try { exif = new ExifInterface(path); } catch (IOException | IllegalArgumentException e) { Timber.w(e); } - this.context = context; - } - - /** - * Check if user enabled retrieval of their current location in Settings - * @return true if enabled, false if disabled - */ - private boolean gpsPreferenceEnabled() { - boolean gpsPref = prefs.getBoolean("allowGps", false); - Timber.d("Gps pref set to: %b", gpsPref); - return gpsPref; - } - - /** - * Registers a LocationManager to listen for current location - */ - protected void registerLocationManager() { - locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); - Criteria criteria = new Criteria(); - String provider = locationManager.getBestProvider(criteria, true); - myLocationListener = new MyLocationListener(); - - try { - locationManager.requestLocationUpdates(provider, 400, 1, myLocationListener); - Location location = locationManager.getLastKnownLocation(provider); - if (location != null) { - myLocationListener.onLocationChanged(location); - } - } catch (IllegalArgumentException e) { - Timber.e(e, "Illegal argument exception"); - } catch (SecurityException e) { - Timber.e(e, "Security exception"); - } - } - - protected void unregisterLocationManager() { - try { - locationManager.removeUpdates(myLocationListener); - } catch (SecurityException e) { - Timber.e(e, "Security exception"); - } } /** * Extracts geolocation (either of image from EXIF data, or of user) - * @param useGPS set to true if location permissions allowed (by API 23), false if disallowed * @return coordinates as string (needs to be passed as a String in API query) */ @Nullable - public String getCoords(boolean useGPS) { + public String getCoords() { String latitude; String longitude; String latitudeRef; @@ -120,30 +60,9 @@ public class GPSExtractor { String decimalCoords; //If image has no EXIF data and user has enabled GPS setting, get user's location + //TODO: Always return null as a temporary fix for #1599 if (exif == null || exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE) == null) { - if (useGPS) { - registerLocationManager(); - - imageCoordsExists = false; - Timber.d("EXIF data has no location info"); - - //Check what user's preference is for automatic location detection - boolean gpsPrefEnabled = gpsPreferenceEnabled(); - - //Check that currentLatitude and currentLongitude have been - // explicitly set by MyLocationListener - // and do not default to (0.0,0.0) - if (gpsPrefEnabled && currentLatitude != null && currentLongitude != null) { - Timber.d("Current location values: Lat = %f Long = %f", - currentLatitude, currentLongitude); - return String.valueOf(currentLatitude) + "|" + String.valueOf(currentLongitude); - } else { - // No coords found - return null; - } - } else { - return null; - } + return null; } else { //If image has EXIF data, extract image coords imageCoordsExists = true; @@ -166,33 +85,6 @@ public class GPSExtractor { } } - /** - * Listen for user's location when it changes - */ - private class MyLocationListener implements LocationListener { - - @Override - public void onLocationChanged(Location location) { - currentLatitude = location.getLatitude(); - currentLongitude = location.getLongitude(); - } - - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - Timber.d("%s's status changed to %d", provider, status); - } - - @Override - public void onProviderEnabled(String provider) { - Timber.d("Provider %s enabled", provider); - } - - @Override - public void onProviderDisabled(String provider) { - Timber.d("Provider %s disabled", provider); - } - } - public double getDecLatitude() { return decLatitude; } 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 58d6d61ca..0e2dc7a8e 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 @@ -329,18 +329,18 @@ public class MultipleShareActivity extends AuthenticatedActivity if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(imageUri,"r"); if (fd != null) { - gpsExtractor = new GPSExtractor(fd.getFileDescriptor(),this,prefs); + gpsExtractor = new GPSExtractor(fd.getFileDescriptor()); } } else { String filePath = FileUtils.getPath(this,imageUri); if (filePath != null) { - gpsExtractor = new GPSExtractor(filePath,this,prefs); + gpsExtractor = new GPSExtractor(filePath); } } if (gpsExtractor != null) { //get image coordinates from exif data or user location - return gpsExtractor.getCoords(locationPermitted); + return gpsExtractor.getCoords(); } } catch (FileNotFoundException fnfe) { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index b3d0f98c4..f9f289d33 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -21,9 +21,7 @@ import android.os.Environment; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; import android.support.graphics.drawable.VectorDrawableCompat; -import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.view.KeyEvent; import android.view.MenuItem; @@ -69,6 +67,7 @@ import timber.log.Timber; import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.DUPLICATE_PROCEED; import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE; import static fr.free.nrw.commons.upload.FileUtils.getSHA1; +import static fr.free.nrw.commons.wikidata.WikidataConstants.WIKIDATA_ENTITY_ID_PREF; /** * Activity for the title/desc screen after image is selected. Also starts processing image @@ -78,7 +77,6 @@ public class ShareActivity extends AuthenticatedActivity implements SingleUploadFragment.OnUploadActionInitiated, OnCategoriesSaveHandler { - private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2; private static final int REQUEST_PERM_ON_SUBMIT_STORAGE = 4; //Had to make them class variables, to extract out the click listeners, also I see no harm in this final Rect startBounds = new Rect(); @@ -131,7 +129,6 @@ public class ShareActivity private String title; private String description; private String wikiDataEntityId; - private Snackbar snackbar; private boolean duplicateCheckPassed = false; private boolean isNearbyUpload = false; private Animator CurrentAnimator; @@ -295,22 +292,6 @@ public class ShareActivity Timber.d("Uri: %s", mediaUri.toString()); Timber.d("Ext storage dir: %s", Environment.getExternalStorageDirectory()); - useNewPermissions = false; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - useNewPermissions = true; - if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { - locationPermitted = true; - } - } - - // Check location permissions if M or newer for category suggestions, request via snackbar if not present - if (!locationPermitted) { - requestPermissionUsingSnackBar( - getString(R.string.location_permission_rationale), - new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, - REQUEST_PERM_ON_CREATE_LOCATION); - } - SingleUploadFragment shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView"); categorizationFragment = (CategorizationFragment) getSupportFragmentManager().findFragmentByTag("categorization"); if (shareView == null && categorizationFragment == null) { @@ -345,6 +326,8 @@ public class ShareActivity if (intent.hasExtra("isDirectUpload")) { Timber.d("This was initiated by a direct upload from Nearby"); isNearbyUpload = true; + wikiDataEntityId = intent.getStringExtra(WIKIDATA_ENTITY_ID_PREF); + Timber.d("Received wikiDataEntityId from contribution controller %s", wikiDataEntityId); } mimeType = intent.getType(); } @@ -409,7 +392,7 @@ public class ShareActivity } /** - * Handles BOTH snackbar permission request (for location) and submit button permission request (for storage) + * Handles submit button permission request (for storage) * * @param requestCode type of request * @param permissions permissions requested @@ -418,41 +401,19 @@ public class ShareActivity @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { - case REQUEST_PERM_ON_CREATE_LOCATION: { - if (grantResults.length >= 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - locationPermitted = true; - checkIfFileExists(); - } - return; - } - // Storage (from submit button) - this needs to be separate from (1) because only the // submit button should bring user to next screen case REQUEST_PERM_ON_SUBMIT_STORAGE: { if (grantResults.length >= 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - //It is OK to call this at both (1) and (4) because if perm had been granted at - //snackbar, user should not be prompted at submit button checkIfFileExists(); //Uploading only begins if storage permission granted from arrow icon uploadBegins(); - snackbar.dismiss(); } } } } - /** - * Displays Snackbar to ask for location permissions - */ - private Snackbar requestPermissionUsingSnackBar(String rationale, final String[] perms, final int code) { - Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), rationale, - Snackbar.LENGTH_INDEFINITE).setAction(R.string.ok, - view -> ActivityCompat.requestPermissions(ShareActivity.this, perms, code)); - snackbar.show(); - return snackbar; - } - /** * Check if file user wants to upload already exists on Commons */ @@ -489,12 +450,6 @@ public class ShareActivity @Override public void onPause() { super.onPause(); - try { - gpsObj.unregisterLocationManager(); - Timber.d("Unregistered locationManager"); - } catch (NullPointerException e) { - Timber.d("locationManager does not exist, not unregistered"); - } } @Override 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 388747c7f..dc87a5f05 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 @@ -1,5 +1,7 @@ package fr.free.nrw.commons.upload; +import android.annotation.SuppressLint; +import android.accounts.Account; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; @@ -13,6 +15,7 @@ import android.os.AsyncTask; import android.os.IBinder; import android.provider.MediaStore; import android.text.TextUtils; +import android.widget.Toast; import java.io.BufferedInputStream; import java.io.IOException; @@ -22,10 +25,15 @@ import java.util.concurrent.Executors; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.HandlerService; + import fr.free.nrw.commons.auth.LoginActivity; + +import fr.free.nrw.commons.R; + import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.settings.Prefs; +import fr.free.nrw.commons.utils.ViewUtil; import timber.log.Timber; public class UploadController { @@ -95,6 +103,7 @@ public class UploadController { public void startUpload(String title, Uri mediaUri, String description, String mimeType, String source, String decimalCoords, String wikiDataEntityId, ContributionUploadProgress onComplete) { Contribution contribution; + //TODO: Modify this to include coords contribution = new Contribution(mediaUri, null, title, description, -1, null, null, sessionManager.getCurrentAccount().name, @@ -107,6 +116,20 @@ public class UploadController { //Calls the next overloaded method startUpload(contribution, onComplete); + Timber.d("Wikidata entity ID received from Share activity is %s", wikiDataEntityId); + //TODO: Modify this to include coords + Account currentAccount = sessionManager.getCurrentAccount(); + if(currentAccount == null) { + Timber.d("Current account is null"); + ViewUtil.showLongToast(context, context.getString(R.string.user_not_logged_in)); + sessionManager.forceLogin(context); + return; + } + contribution = new Contribution(mediaUri, null, title, description, -1, + null, null, currentAccount.name, + CommonsApplication.DEFAULT_EDIT_SUMMARY, decimalCoords); + + contribution.setTag("mimeType", mimeType); contribution.setSource(source); contribution.setWikiDataEntityId(wikiDataEntityId); @@ -120,6 +143,7 @@ public class UploadController { * @param contribution the contribution object * @param onComplete the progress tracker */ + @SuppressLint("StaticFieldLeak") public void startUpload(final Contribution contribution, final ContributionUploadProgress onComplete) { //Set creator, desc, and license if (TextUtils.isEmpty(contribution.getCreator())) { 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 d5ab1d65a..19bf6c2d3 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 @@ -251,8 +251,10 @@ public class UploadService extends HandlerService { String resultStatus = uploadResult.getResultStatus(); if (!resultStatus.equals("Success")) { + Timber.d("Contribution upload failed. Wikidata entity won't be edited"); showFailedNotification(contribution); } else { + Timber.d("Contribution upload success. Initiating Wikidata edit for entity id %s", contribution.getWikiDataEntityId()); wikidataEditService.createClaimWithLogging(contribution.getWikiDataEntityId(), filename); contribution.setFilename(uploadResult.getCanonicalFilename()); contribution.setImageUrl(uploadResult.getImageUrl()); diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataConstants.java b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataConstants.java new file mode 100644 index 000000000..e7e929dac --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataConstants.java @@ -0,0 +1,5 @@ +package fr.free.nrw.commons.wikidata; + +public class WikidataConstants { + public static final String WIKIDATA_ENTITY_ID_PREF = "WikiDataEntityId"; +} 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 8bff40b89..d07bb56f3 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 @@ -48,10 +48,16 @@ public class WikidataEditService { * @param fileName */ public void createClaimWithLogging(String wikidataEntityId, String fileName) { - if(wikidataEntityId == null - || fileName == null) { + if(wikidataEntityId == null) { + Timber.d("Skipping creation of claim as Wikidata entity ID is null"); return; } + + if(fileName == null) { + Timber.d("Skipping creation of claim as fileName entity ID is null"); + return; + } + editWikidataProperty(wikidataEntityId, fileName); } diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index fb18f34f2..237f1e3b8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -144,4 +144,6 @@ %1$s رسالة على صفحة الحديث %1$s ذكر لك على %2$s. شارك التطبيق + صورة اليوم + صورة اليوم diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index c412c11c2..1284867be 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -257,6 +257,8 @@ ইন্টারনেট অনুপলব্ধ ইন্টারনেট উপলব্ধ কোন বিজ্ঞপ্তি পাওয়া যায়নি + ভাষাসমূহ + বাতিল পুনঃচেষ্টা করুন বুঝেছি! কোন চিত্র পাওয়া যায়নি! diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f6fddb820..b0e1c1081 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -284,4 +284,5 @@ Fehler bei der Aktualisierung des dazugehörigen Wikidata-Objekts! Hintergrundbild festlegen Hintergrundbild erfolgreich festgelegt! + Sitzung abgelaufen. Bitte erneut anmelden. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 02ba64754..c1a7f786a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -288,4 +288,5 @@ Αποτυχία ενημέρωσης της αντιστοιχούσας οντότητας του Wikidata! Ρύθμιση ταπετσαρίας Η ταπετσαρία ρυθμίστηκε επιτυχώς! + Η συνεδρία σύνδεσης έληξε, παρακαλώ συνδεθείτε ξανά. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 78f6e5a20..c12fcf4df 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -1,5 +1,6 @@ Utseende + Generelt Tilbakemelding + Beliggenhet Commons Innstillinger Brukernavn Passord + Logg inn på Commons Beta-kontoen din Logg inn + Glemt passordet? Registrer deg Logger inn Vennligst vent … @@ -48,8 +52,10 @@ Del Vis i nettleser Tittel + Angi en tittel for denne fila Beskrivelse Innlogging feilet - nettverksproblem + Kunne ikke logge inn – sjekk brukernavnet og passordet ditt For mange misslykkede forsøk. Vennligst prøv igjen om noen få minutter. Beklager, denne brukeren har blitt blokkert på Commons Du må oppgi tofaktorautentiseringskoden din. @@ -61,6 +67,7 @@ Søk kategorier Lagre Oppdater + Liste GPS er slått av på denne enheten. Ønsker du å slå den på? Slå på GPS Ingen opplastinger ennå @@ -82,11 +89,12 @@ Kategorier Innstillinger Registrer deg + Utvalgte bilder Om Wikimedia Commons-appen er åpen kildekode og er skapt og vedlikeholdt av stipendiater og frivillige fra Wikimedia-fellesskapet. Wikimedia Foundation er ikke involvert i utviklingen eller vedlikeholdet av appen. Opprett en ny <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-sak</a> for feilrapporter og forslag. - <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Personvernpolicy</a> - <a href=\"https://github.com/commons-app/apps-android-comons/blob/master/CREDITS\">Bidragsytere</a> + <u>Personvernpolicy</u> + <u>Bidragsytere</u> Om Send tilbakemelding (via Epost) Ingen epostklient installert @@ -101,7 +109,7 @@ Standardlisens Bruk forrige tittel/beskrivelse Hent automatisk nåværende plassering - Hent nåværende plassering for å tilby kategoriforslag om bildet ikke er geotagget + Hent nåværende plassering om bildet ikke er geotagget, og tagger bildet med plasseringen. Advarsel: Dette vil avsløre hvor du befinner deg for øyeblikket. Nattmodus Bruk mørk drakt Navngivelse-Del på samme vilkår 4.0 @@ -129,15 +137,18 @@ Last opp bilder som er tatt eller skapt av deg: – Naturlige objekter (blomster, dyr, fjell)\n– Nyttige objekter (sykler, jernbanestasjoner)\n– Berømte personer (ordføreren din, OL-deltakere du har møtt) Naturlige objekter (blomster, dyr, fjell) + Nyttige objekter (sykler, togstasjoner) Berømte personer (din ordfører, OL-deltakere du møtte) Vennligst IKKE last opp: - Selfies eller bilder av vennene dine\n- Bilder som du har lastet ned fra internet\n- Skjermbilder tatt fra proprietære apper Selvportrett eller bilder av dine venner Bilder du lastet ned fra Internett + Skjermbilder av proprietære programmer Opplastingseksempel: - Tittel: Sydneys operahus\n- Beskrivelse: Operahuset i Sydney sett fra andre siden av bukten\n- Kategorier: Operahuset i Sydney ifra vest, Operahuset i Sydney utenfra Tittel: Operahuset i Sydney Beskrivelse: Operahuset i Sydney som det sees fra motsatt side av bukten + Kategorier: Sydneys operahus fra vest, Sydneys operahus fra utsiden Bidra med dine bilder. Hjelp til med å blåse liv i Wikipedias artikler! Bilder på Wikipedia kommer fra Wikimedia Commons. Bildene dine kan være til hjelp for mennesker over hele verden som søker kunnskap og dannelse. @@ -150,8 +161,8 @@ Ingen beskrivelse Ukjent lisens Gjenoppfrisk - Nødvendig tillatelse: Lese ekstern lagring. Appen virker ikke uten dette. - Påkrevd tillatelse: Skriv til ekstern lagring. Appen fungerer ikke uten dette. + Nødvendig tillatelse: Lese ekstern lagring. Appen kan ikke få tilgang til galleriet ditt uten dette. + Nødvendig tillatelse: Skriv til ekstern lagring. Appen får ikke tilgang til kameraet ditt uten dette. Valgfri tillatelse: Hent nåværende posisjon for kategoriforslag OK Plasser i nærheten @@ -164,6 +175,8 @@ Medietittel Beskrivelse Beskrivelse av mediet skal være her. Denne kan potensielt være ganske lang, og vil trenge å strekke seg over flere linjer. Vi håper det ser bra nok ut. + Opphavsperson + Brukernavnet til opphavspersonen til utvalgte bilder kommer her. Opplastingsdato Lisens Koordinater @@ -206,10 +219,12 @@ Logg ut Veiviser Varsler + Utvalgt Steder i nærheten kan ikke vises uten tillatelse for stedsbestemmelse ingen beskrivelse funnet Commons-filside Wikidata-element + Wikipedia-artikkel Feil under mellomlagring av bilder En unik beskrivende tittel for fila, som vil fungere som filnavn. Du kan bruke vanlig språk med mellomrom. Ikke ta med filendelsen Beskriv bidraget så mye som mulig: Hvor ble det tatt? Hva viser det? Hva er konteksten? Beskriv objektene eller personene. Gi informasjon som ikke kan gjettes lett, for eksempel når på dagen bildet ble tatt om det er et landskapsbilde. Om bildet viser noe uvanlig, forklar hva som gjør det uvanlig. @@ -222,6 +237,10 @@ Send loggfil Send loggfil til utviklerne via epost Ingen internettleser funnet som kan åpne lenken + Feil! URL ikke funnet + Nominer for sletting + Dette bildet har blitt nominert for sletting. + Vis i nettleseren Stedet har ikke blitt endret. Sted ikke tilgjengelig. Tillatelse kreves for å vise listen over steder i nærheten @@ -232,8 +251,38 @@ Takk for at du har gjort en redigering %1$s nevnte deg på %2$s. Skift visning - Ofte stilte spørsmål + VEIBESKRIVELSE + WIKIDATA + WIKIPEDIA + COMMONS + <u>Vurder oss</u> + <u>Ofte stilte spørsmål</u> + Hopp over innledning Internett er utilgjengelig + Internett tilgjengelig + Feil under henting av varsler + Ingen varsler funnet <u>Oversett</u> + Språk + Velg språket du ønsker å sende inn oversettelser for + Fortsett + Avbryt Prøv igjen + Skjønner! + Det er steder i nærheten av deg som trenger bilder for å illustrere Wikipedia-artiklene sine + Trykk på denne knappen for å få en liste over disse stedene + Du kan laste opp et bilde for alle steder fra galleriet eller kameraet ditt + Ingen bilder funnet! + Feil oppsto under lasting av bilder. + Lastet opp av: %1$s + Del appen + Koordinater ble ikke spesifisert under bildevalget + Feil under henting av steder i nærheten. + Dagens bilde + Dagens bilde + Bildet ble lagt til på %1$s på Wikidata! + Kunne ikke oppdatere tilsvarende Wikidata-element! + Angi som bakgrunnsbilde + Bakgrunnsbildet ble endret! + Innloggingsøkten har utløpt, logg inn på nytt. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 975cf23b0..8edd29ac6 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -94,6 +94,7 @@ Kategorie Ustawienia Zarejestruj się + Wyróżniony obrazek O aplikacji Aplikacja Wikimedia Commons jest oprogramowaniem typu open-source tworzonym i rozwijanym przez stypendystów i wolontariuszy ze społeczności Wikimedii. Fundacja Wikimedia nie bierze udziału w tworzeniu, rozwijaniu ani utrzymywaniu aplikacji. <a href=\"https://github.com/commons-app/apps-android-commons\">Kod źródłowy</a> oraz <a href=\"https://commons-app.github.io/\">strona internetowa</a> na GitHub. Aby zgłosić błąd lub sugestię, utwórz nowe <a href=\"https://github.com/commons-app/apps-android-commons/issues\">zgłoszenie na GitHub</a>. @@ -159,6 +160,7 @@ Nieznana licencja Odśwież Wymagane uprawnienia: odczyt z dysku zewnętrznego. Aplikacja nie będzie w stanie funkcjonować bez tego. + Wymagane uprawnienia: odczyt z dysku zewnętrznego. Aplikacja nie będzie w stanie funkcjonować bez tego. Opcjonalne zezwolenie: uzyskiwanie bieżącej lokalizacji dla wygenerowania propozycji kategorii OK Pobliskie miejsca @@ -175,6 +177,7 @@ Data przesłania Licencja Współrzędne + Nie dostarczone Zostań beta-testerem Dołącz do kanału bety w Google Play i dostań wczesny dostęp do nowych funkcji i łatek Kod 2FA @@ -205,12 +208,15 @@ Wyloguj Samouczek Powiadomienia + Wyróżnione nie znaleziono opisu Element Wikidanych Artykuł na Wikipedii Podaj krótką, opisową i unikalną nazwę, która będzie służyła jako nazwa pliku. Możesz używać prostego języka i spacji. Nie dodawaj rozszerzenia pliku. + Uzyskaj uprawnienie Zaloguj się na swoje konto Błąd! Nie znaleziono adresu URL + Zgłoszone do usunięcia Ta grafika została zgłoszona do usunięcia. Otwórz w przeglądarce Witamy w Wikimedia Commons, %1$s! Cieszymy się, że tu jesteś. @@ -225,9 +231,13 @@ Pomiń samouczek Nie znaleziono powiadomień Języki + Dalej Anuluj + Ponów próbę + Wszystko jasne! Nie znaleziono grafik! Wystąpił błąd podczas ładowania grafik. + Przesłano przez $1 Ustaw tapetę Tapeta ustawiona pomyślnie! diff --git a/app/src/main/res/values-pms/strings.xml b/app/src/main/res/values-pms/strings.xml index 32542fe9c..7f9682eed 100644 --- a/app/src/main/res/values-pms/strings.xml +++ b/app/src/main/res/values-pms/strings.xml @@ -278,4 +278,5 @@ Falì a agiorné l\'entità ëd Wikidata corëspondenta! Definì la tapissarìa La tapissarìa a l\'é stàita definìa për da bin! + Session ëscadùa, për piasì ch\'a rintra torna ant ël sistema. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b69aa15c4..8230b9388 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -290,4 +290,5 @@ Falha ao atualizar a entidade Wikidata correspondente! Definir imagem de fundo Imagem de fundo definida! + A sessão expirou. Inicie uma nova sessão, por favor. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 565b941c0..648ae853d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -5,6 +5,7 @@ * Giro720 * Hamilton Abreu * Imperadeiro98 +* Ldacosta * Lijealso * Luckas * Malafaya @@ -289,4 +290,5 @@ Falha ao atualizar a entidade Wikidata correspondente! Definir imagem de fundo Imagem de fundo definida! + A sessão expirou. Inicie uma nova sessão, por favor. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0b499b414..9bb9d7be6 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -296,4 +296,5 @@ Не удалось обновить соответствующую страницу викиданных! Сделать фоновой заставкой Фоновая заставка успешно установлена! + Сессия авторизации истекла, пожалуйста авторизуйтесь заново. diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml index 62b64658f..65b7d3c12 100644 --- a/app/src/main/res/values-sd/strings.xml +++ b/app/src/main/res/values-sd/strings.xml @@ -16,7 +16,7 @@ ڳجھولفظ وڪي ڪامنز جي آزمائشي کاتي ۾ داخل ٿيو داخل ٿيو - ڳجھو لفظ وساري ويٺا آهيو؟ + پاسورڊ وساري ويٺا آهيو؟ کاتو کوليو داخل ٿيندي براءِ مھرباني انتظار ڪريو… @@ -51,10 +51,10 @@ هن فائيل لاءِ ڪا سُرخي ڏيو تشريح ناقابلِ داخل ٿيڻ - باھمڄار ناڪامي - داخل نه ٿيا آهيو - مهرباني ڪري ڳجهو لفظ ۽ کاتي جو نالو چيڪ ڪيو + داخل نه ٿيا آهيو - مهرباني ڪري پاسورڊ ۽ کاتي جو نالو چيڪ ڪيو ھيڪانديون ناڪام ڪوششون. براءِ مھرباني ڪجھ منٽن کانپوءِ ٻيھر ڪوشش ڪريو. افسوس، ھي واپرائيندڙ العام تي بندشيل آھي - اوهان هر صورت ۾ ٻن عنصرن واري تصديق جو ڪوڊ ڏيو. + اوهان هر صورت ۾ پنهنجو ٻن عنصرن وارو تصديقي ڪوڊ ڏيو. داخل ٿيڻ ناڪام چاڙھيو ھن سيٽ کي نالو ڏيو @@ -64,7 +64,7 @@ سانڍيو تازو ڪيو فهرست - اوهان جي ڊوائيس ۾ جي پي ايس بند آهي. اوهان کولڻ چاهيو ٿا؟ + اوهان جي ڊوائيس ۾ جي پي ايس بند آهي. ڇا اوهان ان کي کولڻ چاهيو ٿا؟ جي پي ايس چالو ڪيو (اين ايبل جي پي ايس) اڃان تائين ڪو به ڄاڙهه (اَپلوڊ) نه ٿيو آهي @@ -133,7 +133,7 @@ مشھور شخصيتون (توھان جو ناظم، اولمپڪ رانديگر جنھن سان توھان مليو) براءِ مھرباني نہ چاڙھيو: u2022 سيلفيون يا پنھنجي دوستن جو تصويرون \nu2022 اھي تصويرون جيڪي توھان انٽرنيٽ تان ڊائونلوڊ ڪيون \nu2022 پروپرائيٽري ايپس جا اسڪرين شاٽ - سيلفي يا اوهان جي دوست جي تصوير + پاڻفي يا اوهان جي دوستن جون تصويرون انٽرنيٽ تان کنيل تصويرون مثال چاڙھ: - عنوان: سڊني اوپيرا گھر \n- تشريح: سڊني اوپيرا گھر نھر جي پاسي کان ڏيک \n- زمرا: سڊني اوپيرا گھر، سڊني اوپيرا گھر اولھ کان، سڊني اوپيرا گھر ڏورانھان ڏيک @@ -150,7 +150,7 @@ ڪا تشريح ناھي اڻڄاتل لائسنس تازو ڪريو - گھربل اجازت: خارجي اسٽوريج پڙھڻ. ايپ ھن کانسواءِ فنڪشن نٿي ڪري سگھي. + گھربل اجازت: خارجي اسٽوريج پڙهو. ايپ ھن کانسواءِ تصوير گيليري نٿو ڏسي سگھي. چونڊ اجازت: زمرن جي تجويزن لاءِ ھاڻوڪي مڪانيت وٺو ٺيڪ ويجھڙائيءَ ۾ جڳھون @@ -161,6 +161,7 @@ عنوان ابلاغ جو عنوان تشريح + ليکڪ چاڙھيل تاريخ لائسنس (اجازت نامو) آزمائشي آزمائيندڙ ٿيو @@ -190,17 +191,20 @@ اوهان جي راءِ ٻاهر نڪرو سکيا (ٽيوٽوريل) + نوٽيفيڪيشنس + چونڊ ڪيل ويجھيو جڳھون بغير مڪانيت اجازت جي نٿيون ڏيکاري سگھجن ڪا به وضاحت نه ملي ڪامن فائيل جو ورق وڪيڊيٽا جزو (وڪيڊيٽا آئيٽم) + وڪيپيڊيا مضمون اجازت ڏيو ٻاھري سنڀار استعمال ڪريو ايپ ۾ ڪئمرا سان ڪڍيل تصويرون پنھنجي ڊوائيس تي سانڍيو پنھنجي کاتي ۾ داخل ٿيو لاگ فائيل موڪليو لاگ فائيل سرجڻھارن کي برقٽپال ذريعي موڪليو - تصوير مٽائڻ لاءِ نامزد ڪئي وئي آهي. + هن تصوير کي ڊاهڻ لاءِ مقرر ڪيو ويو آهي. برائوزر ۾ ڏسو مڪانيت تبديلي ناھي ٿي. مڪانيت موجود ناھي. @@ -208,11 +212,13 @@ ھدايتون وٺو مضمون پڙھو وڪيپيڊيا ڪامنز ۾ ڀليڪار، %1$s! اسان کي خوشي آهي ته اوهان هتي آهيو - %1$s اوهان جي بحث صفحي تي پيغام ڇڏيو آهي. + %1$s اوهان جي بحث واري صفحي تي پيغام ڇڏيو آهي. سنوارڻ لاءِ مهرباني %1$s اوهان جو %2$s تي ذڪر ڪيو آهي. طرف + وڪيڊيٽا وڪيپيڊيا + ڪامنز <u>پذيرائي ڏيو</u> <u>عام سوال</u> سبق کي ڇڏيو @@ -221,9 +227,15 @@ <u>ترجمو</u> ٻوليون رد + ٻيهر ڪوشش ڪريو سمجھي ويس! ڪوبہ عڪس نہ لڌو! + تصويرون لوڊ ڪرڻ دوران چُڪ ٿي آهي. + پاران چاڙهيل: %1$s ايپ ونڊيو اڄ جي تصوير اڄ جي تصوير + وال پيپر لڳايو + وال پيپر ڪاميابيءَ سان لڳي ويو! + لاگ اِن سيشن ايڪسپائير ٿي ويو آهي، مهرباني ڪري وري لاڳ اِن ٿيو. diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 7a4dffb41..7d446473a 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -20,7 +20,7 @@ لاگ ان کامیاب! لاگ ان ناکام! فائل کائنی لبھی،ٻئی فائل کیتے کوشش کرو۔ - تصدیق ناکام! + تصدیق ناکام، ولدا لاڳ ان تھیوو اپ لوڈ شروع! %1$s اپ لوڈ تھی ڳیا! آپݨی اپلوڈ ݙیکھݨ کیتے ٹیپ کرو @@ -46,18 +46,18 @@ ایں سیٹ دا ناں ݙسو تبدیلیاں اپلوڈ - قسماں دی ڳول + ونکیاں دی ڳول بچاؤ سجرا، تازہ کرو فہرست جی پی ایس چلاؤ اڄݨ ککھ وی اپ لوڈ نی تھیا - قسماں، زمرے + ونکیاں ترتیباں سائن اپ تعارف تعارف - حالیہ ورتیاں ڳیاں قسماں + حالیہ ورتیاں ڳیاں ونکیاں ولدا کوشش کرو منسوخ ڈاؤن لوڈ ، لہاوݨ @@ -74,7 +74,7 @@ وکی پیڈیا تے فوٹو وکی میڈیا کامنز کنوں امدن۔ تہاݙے فوٹو پوری دنیا دے لوکاں کوں تعلیم ݙیوݨ کیتے مدد ݙیندن جیا! - قسماں، زمرے + ونکیاں لوڈ تھیدا پئے۔۔۔ کجھ نی چݨیا کوئی تفصیل کائنی diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 7d61a97cb..cdb954d38 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -5,18 +5,25 @@ * Uchup19 --> + Pidangan + Umum + Eupan balik + Lokasi Commons + Séting Sandiasma Kecap sandi + Asup log kana akun Commons Beta anjeun Asup log + Poho Kecap Sandi? Daptar Asup log Tungguan… Laksana login! Gagal login! Berkas teu kapanggih. Coba berkas séjén. - Oténtikasi gagal! + Oténtikasi gagal! mangga asup log deui Mitembeyan ngunjal! %1$s diunjal! Toél pikeun némpo unjalan anjeun @@ -25,7 +32,7 @@ Méréskeun unjalan %1$s Ngunjal %1$s gagal Toél pikeun nempo - + ngunjal %1$d berkas ngunjal %1$d berkas @@ -75,6 +82,7 @@ Kategori Séting Daptar + Gambar petingan Ngeunaan Aplikasi Wikimédia Commons mangrupa aplikasi sumber nembrak nu dijieun jeung dikokolakeun ku panampa hibah sarta rélawan komunitas Wikimédia. Wikimedia Foundation teu pépérodeun dina nyieun, ngamekarkeun, atawa mulasara ieu aplikasi. <a href=\"https://github.com/commons-app/apps-android-commons\">Sumber</a> sarta <a href=\"https://commons-app.github.io/\">situ wéb</a> dina GitHub. Jieun anyar <a href=\"https://github.com/commons-app/apps-android-commons/issues\">perkara GitHub</a> pikeun saran jeung laporan kutu. @@ -91,7 +99,7 @@ Ieu gambar bakal ditangtayungan ku lisénsi %1$s Ku ngirimkeun ieu gambar, kuring ngedalkeun yén ieu mangrupa karya kuring sorangan, yén ieu karya teu ngandung matéri atawa hak pribadi nu ditangtayungan ku hak cipta, sarta mun teu nurut kana <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">Kawijakan Wikimedia Commons</a>. Undeur - Lisénsi + Lisénsi buhun Paké baé judul/pedaran saméméhna Comot lokasi sacara otomatis Catet lokasi ayeuna pikeun nawarkeun usulan kategori lamun gambar tanpa géotag @@ -125,6 +133,7 @@ - Sélpi atawa poto sobat anjeun\n- Poto anu diundeur ti Internét\n- Poto layar aplikasi Conto unjalan: - Judul: Gedung Opera Sydney\n- Pedaran: Gedung Opera Sydney (Sydney Opera House) ditempo ti basisir peuntas\n- Kategori: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views + Judul: Rumah Opera Sydney Sumbangkeun gambar Anjeun. Bantuan ngahirupkeun artikel Wikipédia! Gambar di Wikipédia asalna ti Wikimedia Commons. Gambar-gambar anjeun ngabantu ngatik jalma di sakuliah dunya. @@ -151,6 +160,7 @@ Judul berkas Déskripsi Pedaran berkas nyangkaruk didieu. Bisa jadi matak ngalikakeun, sarta ngempladkeun kana sawatara baris. Sanajan kitu, muga bisa katémbong écés. + Pangarang Tanggal ngunjal Lisénsi Koordinat @@ -165,6 +175,9 @@ Oténtikasi dua faktor kiwari teu dirojong. Yakin anjeun rék kaluar? Logo Commons + Situs wéb Commons + Kaca Facebook Commons + Kode Sumber Github Commons Gambar Kasang Tukang Gambar Média Gagal Gambar Teu Kapanggih @@ -189,10 +202,13 @@ Eupan balik Kaluar Pituduh + Iber + Petingan Tempat sabudeureun teu bisa ditémbongkeun tanpa idin lokasi teu manggihan pedaran Kaca berkas commons item Wikidata + Artikel Wikipédia Kasalahan nalika muat gambar Judul déskriptif anu unik pikeun berkas, anu bakal miboga fungsi minangka ngaran berkas. Anjeun bisa maké basa basajan kalawan spasi. Ulah ngawuwuhkeun éksténsi berkas Pék émbarkeun wincikan média saloba-lobabana: Dimana éta dicokot? Naon nu titojokeunna? Naon kontéksna? Pék jéntrékeun obyék atawa jalmana. Ébré informasi anu teu gampang kajudi, kawas wayah mun éta mangrupa pamandangan. Ari média nu némbongkeun perkara nu teu guyub, pék jéntrékeun naon nu ngabalukarkeun éta téh teu guyub. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index b582761bd..b216afffe 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -286,4 +286,5 @@ Misslyckades att uppdatera motsvarande Wikidataentitet! Ange som bakgrundsbild Bakgrundsbilden ändrades! + Inloggningssessionen löptes ut, var god logga in igen. diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 1b611137d..c3dd661c7 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -1,6 +1,6 @@ - விக்கிமீடியா காமன்சு + காமன்சு அமைப்புகள் பயனர் பெயர் கடவுச்சொல் diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d04974f5a..15ecf2afe 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -4,6 +4,7 @@ * Emperyan * Hedda * Incelemeelemani +* Joseph * McAang * Neslihan Turan * Rapsar @@ -288,4 +289,5 @@ Karşılık gelen Vikiveri varlığı güncellenemedi! Duvar kağıdı ayarla Duvar kağıdı başarıyla ayarlandı! + Oturumun süresi doldu, lütfen tekrar giriş yapın. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8bace5fb9..be964d068 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -295,4 +295,5 @@ Не вдалось оновити відповідну сторінку Вікіданих! Поставити шпалерами екрану Шпалери екрану виставлено успішно! + Сесія авторизації спливла. Будь ласка, авторизуйтесь знову. diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index cc4246e94..f422443dc 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -39,7 +39,7 @@ از نگار خانہ تصویر لیں قریبی - میری اپلوڈ + میرے اپلوڈ کردہ شیئر براؤزر میں کھولیں عنوان diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d2871c3b7..fa40954ce 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -289,4 +289,5 @@ 更新所對應的維基數據項目失敗! 設定桌布 桌布設定成功! + 登入用 session 逾期,請重新登入。 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 090ddd1dd..697b7a3e5 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -11,7 +11,7 @@ --> 外观 - 常规 + 一般 反馈 位置 共享资源 @@ -285,4 +285,5 @@ 更新对应维基数据实体失败! 设置墙纸 墙纸已成功设置! + 登录会话已过期,请重新登录。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1372d5866..72ac85782 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -289,4 +289,6 @@ Failed to update corresponding Wikidata entity! Set wallpaper Wallpaper set successfully! + + Login session expired, please log in again. diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 49720b247..8fc5524a2 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -38,16 +38,8 @@ - - - - - + diff --git a/dependency-injection.md b/dependency-injection.md index 5d3599e54..f29d7b603 100644 --- a/dependency-injection.md +++ b/dependency-injection.md @@ -1,6 +1,6 @@ ## Overview -At its core, dependency injection is just the principle of `"tell, dont ask"` put into practice; for instance, if a class needs to use the `MediaWikiApi`, it should be handed an instance of the classs rather than reaching out to get it. This has the effect of decoupling code, making it easier to test and reuse. +At its core, dependency injection is just the principle of `"tell, don't ask"` put into practice; for instance, if a class needs to use the `MediaWikiApi`, it should be handed an instance of the class rather than reaching out to get it. This has the effect of decoupling code, making it easier to test and reuse. ## Dependency Injection in the Commons app