diff --git a/app/CommonsContributions/051e9f3a-bbee-4e3c-971c-08569d9bb4e94846693856974536499.jpg b/app/CommonsContributions/051e9f3a-bbee-4e3c-971c-08569d9bb4e94846693856974536499.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/06876c20-179d-41c7-8133-d7f2ac5f7d2e1106291165438240953.jpg b/app/CommonsContributions/06876c20-179d-41c7-8133-d7f2ac5f7d2e1106291165438240953.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/10903ce5-7829-4f4d-84b0-4ab57493a48b734121478395541900.jpg b/app/CommonsContributions/10903ce5-7829-4f4d-84b0-4ab57493a48b734121478395541900.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/1b36da5f-2ff3-46a8-9f99-269c25d364512858522545540582402.jpg b/app/CommonsContributions/1b36da5f-2ff3-46a8-9f99-269c25d364512858522545540582402.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/3ee59601-a3f4-437c-8cfb-e55f483d11248885492791928395774.jpg b/app/CommonsContributions/3ee59601-a3f4-437c-8cfb-e55f483d11248885492791928395774.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/46a33782-8fa5-4371-80d7-d2bd76554cec7228654986027794969.jpg b/app/CommonsContributions/46a33782-8fa5-4371-80d7-d2bd76554cec7228654986027794969.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/4d55cb4b-78d3-4bd1-8c9c-d7aaadb46bdd6921367460242901277.jpg b/app/CommonsContributions/4d55cb4b-78d3-4bd1-8c9c-d7aaadb46bdd6921367460242901277.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/536eb10d-9d6a-4cb8-be83-faa8a02e6c7c7471475810321627979.jpg b/app/CommonsContributions/536eb10d-9d6a-4cb8-be83-faa8a02e6c7c7471475810321627979.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/8bd603db-e8b1-446d-9761-68dff78d6ef09219164220733919906.jpg b/app/CommonsContributions/8bd603db-e8b1-446d-9761-68dff78d6ef09219164220733919906.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/8cad7512-d289-4cf9-87be-fa9f9199d4807606639795782708013.jpg b/app/CommonsContributions/8cad7512-d289-4cf9-87be-fa9f9199d4807606639795782708013.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/8d87411c-fc3c-4b95-a184-db21b794ff946307559257054977971.jpg b/app/CommonsContributions/8d87411c-fc3c-4b95-a184-db21b794ff946307559257054977971.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/a9e47bea-07d3-42ca-b35d-800e76f852875510703587110466065.jpg b/app/CommonsContributions/a9e47bea-07d3-42ca-b35d-800e76f852875510703587110466065.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/b00ccd10-ca2f-4333-9580-2edbc8307d5e4421123441972824963.jpg b/app/CommonsContributions/b00ccd10-ca2f-4333-9580-2edbc8307d5e4421123441972824963.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/c64f8d82-6c6c-46aa-b3c1-5d1bc41e70978580045962509399017.jpg b/app/CommonsContributions/c64f8d82-6c6c-46aa-b3c1-5d1bc41e70978580045962509399017.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/c7b06107-f57f-4e3e-8ff1-097b92883f2d2900749229848194150.jpg b/app/CommonsContributions/c7b06107-f57f-4e3e-8ff1-097b92883f2d2900749229848194150.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/cf59b42c-f222-4bbb-8104-04c48db08cb57896460337428876531.jpg b/app/CommonsContributions/cf59b42c-f222-4bbb-8104-04c48db08cb57896460337428876531.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/CommonsContributions/d46e83bd-2a1d-4149-96d0-2356c790641e6285354011780394317.jpg b/app/CommonsContributions/d46e83bd-2a1d-4149-96d0-2356c790641e6285354011780394317.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/build.gradle b/app/build.gradle
index ddd786bac..7746c21d3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -55,6 +55,8 @@ dependencies {
testImplementation "androidx.paging:paging-common-ktx:$PAGING_VERSION"
implementation "androidx.paging:paging-rxjava2-ktx:$PAGING_VERSION"
implementation "androidx.recyclerview:recyclerview:1.2.0-alpha02"
+ implementation "androidx.activity:activity:1.2.0"
+ implementation "androidx.fragment:fragment:1.3.0"
implementation "com.squareup.okhttp3:okhttp-ws:$OKHTTP_VERSION"
// Logging
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 803945f9a..e2c5424c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,6 +17,7 @@
+
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 13155f37b..41546d4d2 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
@@ -4,7 +4,10 @@ import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static fr.free.nrw.commons.di.NetworkingModule.NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE;
+import android.Manifest;
+import android.Manifest.permission;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
@@ -21,6 +24,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
+import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -28,6 +32,8 @@ import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;
import androidx.recyclerview.widget.RecyclerView.ItemAnimator;
import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener;
import androidx.recyclerview.widget.SimpleItemAnimator;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts.RequestPermission;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
@@ -319,6 +325,24 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
rvContributionsList.smoothScrollToPosition(0);
}
+ // Register the permissions callback, which handles the user's response to the
+ // system permissions dialog. Save the return value, an instance of
+ // ActivityResultLauncher, as an instance variable.
+ private ActivityResultLauncher requestPermissionLauncher =
+ registerForActivityResult(new RequestPermission(), isGranted -> {
+ if (isGranted) {
+ // Permission is granted. Continue the action or workflow in your
+ // app.
+ } else {
+ // Explain to the user that the feature is unavailable because the
+ // feature requires a permission that the user has denied. At the
+ // same time, respect the user's decision. Don't link to system
+ // settings in an effort to convince the user to change their
+ // decision.
+ }
+ });
+
+
private void animateFAB(final boolean isFabOpen) {
this.isFabOpen = !isFabOpen;
if (fabPlus.isShown()) {
@@ -338,6 +362,26 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
fabCamera.show();
fabGallery.show();
fabCustomGallery.show();
+
+ //int i = ContextCompat.checkSelfPermission(
+ // getContext(), permission.ACCESS_MEDIA_LOCATION);
+ //if (i !=
+ // PackageManager.PERMISSION_GRANTED) {
+
+ /*if (shouldShowRequestPermissionRationale(...)) {
+ // In an educational UI, explain to the user why your app requires this
+ // permission for a specific feature to behave as expected, and what
+ // features are disabled if it's declined. In this UI, include a
+ // "cancel" or "no thanks" button that lets the user continue
+ // using your app without granting the permission.
+ showInContextUI(...);
+ } else {*/
+ // You can directly ask for the permission.
+ // The registered ActivityResultCallback gets the result of this request.
+ requestPermissionLauncher.launch(
+ Manifest.permission.ACCESS_MEDIA_LOCATION);
+ //}
+ //}
}
this.isFabOpen = !isFabOpen;
}
diff --git a/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.java b/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.java
index bc43cb154..a0a990356 100644
--- a/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.java
+++ b/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.java
@@ -8,6 +8,7 @@ import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
+import androidx.exifinterface.media.ExifInterface;
import androidx.preference.PreferenceManager;
import android.provider.MediaStore;
import android.text.TextUtils;
@@ -19,6 +20,7 @@ import fr.free.nrw.commons.customselector.model.Image;
import fr.free.nrw.commons.customselector.ui.selector.CustomSelectorActivity;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
@@ -270,11 +272,29 @@ public class FilePicker implements Constants {
ClipData clipData = data.getClipData();
if (clipData == null) {
Uri uri = data.getData();
+
+ InputStream stream = activity.getBaseContext().getContentResolver().openInputStream(uri);
+ //if (stream == null) {
+ //Log.w(TAG, "Got a null input stream for " + photoUri);
+ //continue;
+ //}
+ ExifInterface exif = new ExifInterface(stream);
+ double[] location = exif.getLatLong();
+
UploadableFile file = PickedFiles.pickedExistingPicture(activity, uri);
files.add(file);
} else {
for (int i = 0; i < clipData.getItemCount(); i++) {
Uri uri = clipData.getItemAt(i).getUri();
+
+ InputStream stream = activity.getBaseContext().getContentResolver().openInputStream(uri);
+ //if (stream == null) {
+ //Log.w(TAG, "Got a null input stream for " + photoUri);
+ //continue;
+ //}
+ ExifInterface exif = new ExifInterface(stream);
+ double[] location = exif.getLatLong();
+
UploadableFile file = PickedFiles.pickedExistingPicture(activity, uri);
files.add(file);
}
diff --git a/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java b/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java
index 7df1cc964..39e797e1d 100644
--- a/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java
+++ b/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java
@@ -125,7 +125,9 @@ public class UploadableFile implements Parcelable {
*/
private DateTimeWithSource getDateTimeFromExif() {
try {
- ExifInterface exif = new ExifInterface(file.getAbsolutePath());
+ ExifInterface exif = new ExifInterface(file.getAbsolutePath() /* unfortunately at this point the file (/data/user/0/fr.free.nrw.commons/cache/CommonsContributions/15d5892c-d7c4-46f7-8645-020a7ab032ab.jpg) has 0,0 as EXIF lat/lon */);
+ double[] location = exif.getLatLong();
+ exif.getAltitude(-1);
// TAG_DATETIME returns the last edited date, we need TAG_DATETIME_ORIGINAL for creation date
// See issue https://github.com/commons-app/apps-android-commons/issues/1971
String dateTimeSubString = exif.getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL);