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 0e1a4ecb8..a318d6baa 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 @@ -7,7 +7,6 @@ import android.content.Intent; import android.os.Build; import android.support.annotation.NonNull; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -18,6 +17,7 @@ import javax.inject.Singleton; import fr.free.nrw.commons.R; import fr.free.nrw.commons.filepicker.DefaultCallback; import fr.free.nrw.commons.filepicker.FilePicker; +import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.kvstore.BasicKvStore; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.nearby.Place; @@ -116,7 +116,7 @@ public class ContributionController { } @Override - public void onImagesPicked(@NonNull List imagesFiles, FilePicker.ImageSource source, int type) { + public void onImagesPicked(@NonNull List imagesFiles, FilePicker.ImageSource source, int type) { Intent intent = handleImagesPicked(activity, imagesFiles, getSourceFromImageSource(source)); activity.startActivity(intent); } @@ -124,8 +124,8 @@ public class ContributionController { } public List handleExternalImagesPicked(Activity activity, - Intent data) { - return getUploadableFiles(FilePicker.handleExternalImagesPicked(data, activity)); + Intent data) { + return FilePicker.handleExternalImagesPicked(data, activity); } /** @@ -133,13 +133,12 @@ public class ContributionController { * Attaches place object for nearby uploads */ private Intent handleImagesPicked(Context context, - List imagesFiles, + List imagesFiles, String source) { - ArrayList uploadableFiles = getUploadableFiles(imagesFiles); Intent shareIntent = new Intent(context, UploadActivity.class); shareIntent.setAction(ACTION_INTERNAL_UPLOADS); shareIntent.putExtra(EXTRA_SOURCE, source); - shareIntent.putParcelableArrayListExtra(EXTRA_FILES, uploadableFiles); + shareIntent.putParcelableArrayListExtra(EXTRA_FILES, new ArrayList<>(imagesFiles)); Place place = directKvStore.getJson(PLACE_OBJECT, Place.class); if (place != null) { shareIntent.putExtra(PLACE_OBJECT, place); @@ -148,15 +147,6 @@ public class ContributionController { return shareIntent; } - @NonNull - private ArrayList getUploadableFiles(List imagesFiles) { - ArrayList uploadableFiles = new ArrayList<>(); - for (File file : imagesFiles) { - uploadableFiles.add(new UploadableFile(file)); - } - return uploadableFiles; - } - /** * Get image upload source */ 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 b5ab8590f..2beb70d79 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 @@ -289,20 +289,20 @@ public class FilePicker implements Constants { } @Nullable - private static File takenCameraPicture(Context context) throws IOException, URISyntaxException { + private static UploadableFile takenCameraPicture(Context context) throws IOException, URISyntaxException { String lastCameraPhoto = PreferenceManager.getDefaultSharedPreferences(context).getString(KEY_LAST_CAMERA_PHOTO, null); if (lastCameraPhoto != null) { - return new File(lastCameraPhoto); + return new UploadableFile(new File(lastCameraPhoto)); } else { return null; } } @Nullable - private static File takenCameraVideo(Context context) throws IOException, URISyntaxException { + private static UploadableFile takenCameraVideo(Context context) throws IOException, URISyntaxException { String lastCameraPhoto = PreferenceManager.getDefaultSharedPreferences(context).getString(KEY_LAST_CAMERA_VIDEO, null); if (lastCameraPhoto != null) { - return new File(lastCameraPhoto); + return new UploadableFile(new File(lastCameraPhoto)); } else { return null; } @@ -343,7 +343,7 @@ public class FilePicker implements Constants { } } - public static List handleExternalImagesPicked(Intent data, Activity activity) { + public static List handleExternalImagesPicked(Intent data, Activity activity) { try { return getFilesFromGalleryPictures(data, activity); } catch (IOException e) { @@ -406,7 +406,7 @@ public class FilePicker implements Constants { private static void onPictureReturnedFromDocuments(Intent data, Activity activity, @NonNull FilePicker.Callbacks callbacks) { try { Uri photoPath = data.getData(); - File photoFile = PickedFiles.pickedExistingPicture(activity, photoPath); + UploadableFile photoFile = PickedFiles.pickedExistingPicture(activity, photoPath); callbacks.onImagesPicked(singleFileList(photoFile), FilePicker.ImageSource.DOCUMENTS, restoreType(activity)); if (configuration(activity).shouldCopyPickedImagesToPublicGalleryAppFolder()) { @@ -420,7 +420,7 @@ public class FilePicker implements Constants { private static void onPictureReturnedFromGallery(Intent data, Activity activity, @NonNull FilePicker.Callbacks callbacks) { try { - List files = getFilesFromGalleryPictures(data, activity); + List files = getFilesFromGalleryPictures(data, activity); callbacks.onImagesPicked(files, FilePicker.ImageSource.GALLERY, restoreType(activity)); } catch (Exception e) { e.printStackTrace(); @@ -428,20 +428,20 @@ public class FilePicker implements Constants { } } - private static List getFilesFromGalleryPictures(Intent data, Activity activity) throws IOException { - List files = new ArrayList<>(); + private static List getFilesFromGalleryPictures(Intent data, Activity activity) throws IOException { + List files = new ArrayList<>(); ClipData clipData = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { clipData = data.getClipData(); } if (clipData == null) { Uri uri = data.getData(); - File file = PickedFiles.pickedExistingPicture(activity, uri); + UploadableFile file = PickedFiles.pickedExistingPicture(activity, uri); files.add(file); } else { for (int i = 0; i < clipData.getItemCount(); i++) { Uri uri = clipData.getItemAt(i).getUri(); - File file = PickedFiles.pickedExistingPicture(activity, uri); + UploadableFile file = PickedFiles.pickedExistingPicture(activity, uri); files.add(file); } } @@ -460,8 +460,8 @@ public class FilePicker implements Constants { revokeWritePermission(activity, Uri.parse(lastImageUri)); } - File photoFile = FilePicker.takenCameraPicture(activity); - List files = new ArrayList<>(); + UploadableFile photoFile = FilePicker.takenCameraPicture(activity); + List files = new ArrayList<>(); files.add(photoFile); if (photoFile == null) { @@ -493,8 +493,8 @@ public class FilePicker implements Constants { revokeWritePermission(activity, Uri.parse(lastVideoUri)); } - File photoFile = FilePicker.takenCameraVideo(activity); - List files = new ArrayList<>(); + UploadableFile photoFile = FilePicker.takenCameraVideo(activity); + List files = new ArrayList<>(); files.add(photoFile); if (photoFile == null) { @@ -545,7 +545,7 @@ public class FilePicker implements Constants { public interface Callbacks { void onImagePickerError(Exception e, FilePicker.ImageSource source, int type); - void onImagesPicked(@NonNull List imageFiles, FilePicker.ImageSource source, int type); + void onImagesPicked(@NonNull List imageFiles, FilePicker.ImageSource source, int type); void onCanceled(FilePicker.ImageSource source, int type); } diff --git a/app/src/main/java/fr/free/nrw/commons/filepicker/PickedFiles.java b/app/src/main/java/fr/free/nrw/commons/filepicker/PickedFiles.java index fb5663d2b..c8e76440e 100644 --- a/app/src/main/java/fr/free/nrw/commons/filepicker/PickedFiles.java +++ b/app/src/main/java/fr/free/nrw/commons/filepicker/PickedFiles.java @@ -55,13 +55,14 @@ class PickedFiles implements Constants { writeToFile(in, dst); } - static void copyFilesInSeparateThread(final Context context, final List filesToCopy) { + static void copyFilesInSeparateThread(final Context context, final List filesToCopy) { new Thread(new Runnable() { @Override public void run() { List copiedFiles = new ArrayList<>(); int i = 1; - for (File fileToCopy : filesToCopy) { + for (UploadableFile uploadableFile : filesToCopy) { + File fileToCopy = uploadableFile.getFile(); File dstDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), getFolderName(context)); if (!dstDir.exists()) dstDir.mkdirs(); @@ -84,8 +85,8 @@ class PickedFiles implements Constants { }).run(); } - static List singleFileList(File file) { - List list = new ArrayList<>(); + static List singleFileList(UploadableFile file) { + List list = new ArrayList<>(); list.add(file); return list; } @@ -106,13 +107,13 @@ class PickedFiles implements Constants { }); } - static File pickedExistingPicture(@NonNull Context context, Uri photoUri) throws IOException { + static UploadableFile pickedExistingPicture(@NonNull Context context, Uri photoUri) throws IOException { InputStream pictureInputStream = context.getContentResolver().openInputStream(photoUri); File directory = tempImageDirectory(context); File photoFile = new File(directory, UUID.randomUUID().toString() + "." + getMimeType(context, photoUri)); photoFile.createNewFile(); writeToFile(pictureInputStream, photoFile); - return photoFile; + return new UploadableFile(photoUri, photoFile); } static File getCameraPicturesLocation(@NonNull Context context) throws IOException { diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/UploadableFile.java b/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java similarity index 80% rename from app/src/main/java/fr/free/nrw/commons/contributions/UploadableFile.java rename to app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java index c6fc50513..1eb46194e 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/UploadableFile.java +++ b/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java @@ -1,6 +1,5 @@ -package fr.free.nrw.commons.contributions; +package fr.free.nrw.commons.filepicker; -import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; @@ -23,16 +22,29 @@ public class UploadableFile implements Parcelable { return new UploadableFile[size]; } }; + + private final Uri contentUri; private final File file; - public UploadableFile(File file) { + public UploadableFile(Uri contentUri, File file) { + this.contentUri = contentUri; this.file = file; } + public UploadableFile(File file) { + this.file = file; + this.contentUri = Uri.parse(file.getAbsolutePath()); + } + public UploadableFile(Parcel in) { + this.contentUri = in.readParcelable(Uri.class.getClassLoader()); file = (File) in.readSerializable(); } + public File getFile() { + return file; + } + public String getFilePath() { return file.getPath(); } @@ -50,11 +62,6 @@ public class UploadableFile implements Parcelable { return 0; } - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeSerializable(file); - } - /** * Get filePath creation date from uri from all possible content providers * @@ -62,8 +69,7 @@ public class UploadableFile implements Parcelable { */ public long getFileCreatedDate(Context context) { try { - ContentResolver contentResolver = context.getContentResolver(); - Cursor cursor = contentResolver.query(getMediaUri(), null, null, null, null); + Cursor cursor = context.getContentResolver().query(contentUri, null, null, null, null); if (cursor == null) { return -1;//Could not fetch last_modified } @@ -74,7 +80,7 @@ public class UploadableFile implements Parcelable { } //If both the content providers do not give the data, lets leave it to Jesus if (lastModifiedColumnIndex == -1) { - return -1L; + return -1l; } cursor.moveToFirst(); return cursor.getLong(lastModifiedColumnIndex); @@ -82,4 +88,10 @@ public class UploadableFile implements Parcelable { return -1;////Could not fetch last_modified } } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeParcelable(contentUri, 0); + parcel.writeSerializable(file); + } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java index 32056079f..ca0d0c70d 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java @@ -54,7 +54,7 @@ import fr.free.nrw.commons.category.CategoriesModel; import fr.free.nrw.commons.category.CategoryItem; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.ContributionController; -import fr.free.nrw.commons.contributions.UploadableFile; +import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.nearby.Place; @@ -62,7 +62,6 @@ import fr.free.nrw.commons.theme.BaseActivity; import fr.free.nrw.commons.utils.DialogUtil; import fr.free.nrw.commons.utils.NetworkUtils; import fr.free.nrw.commons.utils.PermissionUtils; -import fr.free.nrw.commons.utils.StringUtils; import fr.free.nrw.commons.utils.ViewUtil; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -73,8 +72,6 @@ import timber.log.Timber; import static fr.free.nrw.commons.contributions.Contribution.SOURCE_EXTERNAL; import static fr.free.nrw.commons.contributions.ContributionController.ACTION_INTERNAL_UPLOADS; import static fr.free.nrw.commons.upload.UploadService.EXTRA_FILES; -import static fr.free.nrw.commons.utils.ImageUtils.Result; -import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult; import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT; public class UploadActivity extends BaseActivity implements UploadView, SimilarImageInterface { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java index 2a97f6714..e9a4ae2df 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java @@ -19,8 +19,8 @@ import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.contributions.Contribution; -import fr.free.nrw.commons.contributions.UploadableFile; import fr.free.nrw.commons.filepicker.MimeTypeMapWrapper; +import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.kvstore.BasicKvStore; import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.settings.Prefs; @@ -100,6 +100,7 @@ public class UploadModel { SimilarImageInterface similarImageInterface) { fileProcessor.initFileDetails(Objects.requireNonNull(uploadableFile.getFilePath()), context.getContentResolver()); long fileCreatedDate = uploadableFile.getFileCreatedDate(context); + Timber.d("File created date is %d", fileCreatedDate); GPSExtractor gpsExtractor = fileProcessor.processFileCoordinates(similarImageInterface); return new UploadItem(Uri.parse(uploadableFile.getFilePath()), uploadableFile.getMimeType(context), source, gpsExtractor, place, fileCreatedDate); } @@ -283,8 +284,11 @@ public class UploadModel { contribution.setTag("mimeType", item.mimeType); contribution.setSource(item.source); contribution.setContentProviderUri(item.mediaUri); + Timber.d("Created timestamp while building contribution is %s, %s", + item.getCreatedTimestamp(), + new Date(item.getCreatedTimestamp())); if (item.createdTimestamp != -1L) { - contribution.setDateCreated(new Date(item.createdTimestamp)); + contribution.setDateCreated(new Date(item.getCreatedTimestamp())); //Set the date only if you have it, else the upload service is gonna try it the other way } return contribution; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java index ee42460ca..05d13ed9d 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java @@ -6,7 +6,6 @@ import android.content.Context; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.inject.Named; @@ -15,7 +14,7 @@ import javax.inject.Singleton; import fr.free.nrw.commons.R; import fr.free.nrw.commons.category.CategoriesModel; import fr.free.nrw.commons.contributions.Contribution; -import fr.free.nrw.commons.contributions.UploadableFile; +import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.kvstore.BasicKvStore; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.nearby.Place; diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadModelTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadModelTest.kt index 94473dcd2..94fa2aec3 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadModelTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadModelTest.kt @@ -3,7 +3,7 @@ package fr.free.nrw.commons.upload import android.app.Application import android.content.Context import fr.free.nrw.commons.auth.SessionManager -import fr.free.nrw.commons.contributions.UploadableFile +import fr.free.nrw.commons.filepicker.UploadableFile import fr.free.nrw.commons.kvstore.BasicKvStore import fr.free.nrw.commons.mwapi.MediaWikiApi import fr.free.nrw.commons.nearby.Place diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadPresenterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadPresenterTest.kt index 64d5af976..2e17fd1ad 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadPresenterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadPresenterTest.kt @@ -1,6 +1,6 @@ package fr.free.nrw.commons.upload -import fr.free.nrw.commons.contributions.UploadableFile +import fr.free.nrw.commons.filepicker.UploadableFile import fr.free.nrw.commons.mwapi.MediaWikiApi import fr.free.nrw.commons.nearby.Place import io.reactivex.Observable