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);