Skip to content

Commit 63609b7

Browse files
author
maskara
committed
Support in app multiple uploads
1 parent 1d1aa28 commit 63609b7

9 files changed

+134
-113
lines changed

app/src/main/java/fr/free/nrw/commons/Utils.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.free.nrw.commons;
22

3+
import android.content.ActivityNotFoundException;
34
import android.content.Context;
45
import android.content.Intent;
56
import android.graphics.Bitmap;
@@ -14,9 +15,6 @@
1415
import org.apache.commons.codec.binary.Hex;
1516
import org.apache.commons.codec.digest.DigestUtils;
1617

17-
import java.io.BufferedReader;
18-
import java.io.IOException;
19-
import java.io.InputStreamReader;
2018
import java.io.UnsupportedEncodingException;
2119
import java.net.URLEncoder;
2220
import java.util.LinkedHashMap;
@@ -203,6 +201,18 @@ public static void handleWebUrl(Context context, Uri url) {
203201
customTabsIntent.launchUrl(context, url);
204202
}
205203

204+
public static void handleGeoCoordinates(Context context, String coords) {
205+
try {
206+
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=" + coords);
207+
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
208+
mapIntent.setPackage("com.google.android.apps.maps");
209+
context.startActivity(mapIntent);
210+
} catch (ActivityNotFoundException ex) {
211+
Toast toast = Toast.makeText(context, context.getString(R.string.map_application_missing), LENGTH_SHORT);
212+
toast.show();
213+
}
214+
}
215+
206216
/**
207217
* To take screenshot of the screen and return it in Bitmap format
208218
*

app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java

+39
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55
import android.content.pm.PackageManager;
66
import android.content.pm.ResolveInfo;
77
import android.net.Uri;
8+
import android.os.Build;
89
import android.os.Bundle;
910
import android.provider.MediaStore;
1011
import android.support.annotation.Nullable;
12+
import android.support.annotation.RequiresApi;
1113
import android.support.v4.app.Fragment;
1214
import android.support.v4.app.FragmentActivity;
1315
import android.support.v4.content.FileProvider;
1416

1517
import java.io.File;
18+
import java.util.ArrayList;
1619
import java.util.Date;
1720
import java.util.List;
1821

@@ -21,6 +24,7 @@
2124

2225
import static android.content.Intent.ACTION_GET_CONTENT;
2326
import static android.content.Intent.ACTION_SEND;
27+
import static android.content.Intent.ACTION_SEND_MULTIPLE;
2428
import static android.content.Intent.EXTRA_STREAM;
2529
import static fr.free.nrw.commons.contributions.Contribution.SOURCE_CAMERA;
2630
import static fr.free.nrw.commons.contributions.Contribution.SOURCE_GALLERY;
@@ -31,6 +35,7 @@ public class ContributionController {
3135

3236
public static final int SELECT_FROM_GALLERY = 1;
3337
public static final int SELECT_FROM_CAMERA = 2;
38+
public static final int PICK_IMAGE_MULTIPLE = 3;
3439

3540
private Fragment fragment;
3641

@@ -79,6 +84,14 @@ public void startCameraCapture() {
7984
}
8085

8186
public void startGalleryPick() {
87+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
88+
startMultipleGalleryPick();
89+
} else {
90+
startSingleGalleryPick();
91+
}
92+
}
93+
94+
public void startSingleGalleryPick() {
8295
//FIXME: Starts gallery (opens Google Photos)
8396
Intent pickImageIntent = new Intent(ACTION_GET_CONTENT);
8497
pickImageIntent.setType("image/*");
@@ -92,6 +105,32 @@ public void startGalleryPick() {
92105
fragment.startActivityForResult(pickImageIntent, SELECT_FROM_GALLERY);
93106
}
94107

108+
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
109+
public void startMultipleGalleryPick() {
110+
Intent pickImageIntent = new Intent(ACTION_GET_CONTENT);
111+
pickImageIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
112+
pickImageIntent.setType("image/*");
113+
if (!fragment.isAdded()) {
114+
Timber.d("Fragment is not added, startActivityForResult cannot be called");
115+
return;
116+
}
117+
Timber.d("startGalleryPick() called with pickImageIntent");
118+
119+
fragment.startActivityForResult(pickImageIntent, PICK_IMAGE_MULTIPLE);
120+
}
121+
122+
public void handleImagesPicked(int requestCode, @Nullable ArrayList<Uri> uri) {
123+
FragmentActivity activity = fragment.getActivity();
124+
Intent shareIntent = new Intent(activity, UploadActivity.class);
125+
shareIntent.setAction(ACTION_SEND_MULTIPLE);
126+
shareIntent.putExtra(EXTRA_SOURCE, SOURCE_GALLERY);
127+
shareIntent.putExtra(EXTRA_STREAM, uri);
128+
shareIntent.setType("image/jpeg");
129+
if (activity != null) {
130+
activity.startActivity(shareIntent);
131+
}
132+
}
133+
95134
public void handleImagePicked(int requestCode, @Nullable Uri uri, boolean isDirectUpload, String wikiDataEntityId) {
96135
FragmentActivity activity = fragment.getActivity();
97136
Timber.d("handleImagePicked() called with onActivityResult(). Boolean isDirectUpload: " + isDirectUpload + "String wikiDataEntityId: " + wikiDataEntityId);

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java

+33
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package fr.free.nrw.commons.contributions;
22

3+
import android.content.ClipData;
34
import android.content.Intent;
45
import android.content.SharedPreferences;
56
import android.content.pm.PackageManager;
7+
import android.database.Cursor;
8+
import android.net.Uri;
69
import android.os.Build;
710
import android.os.Bundle;
11+
import android.provider.MediaStore;
812
import android.support.annotation.NonNull;
913
import android.support.v4.content.ContextCompat;
1014
import android.support.v7.app.AlertDialog;
15+
import android.util.Log;
1116
import android.view.LayoutInflater;
1217
import android.view.Menu;
1318
import android.view.MenuInflater;
@@ -20,6 +25,7 @@
2025
import android.widget.ProgressBar;
2126
import android.widget.TextView;
2227

28+
import java.util.ArrayList;
2329
import java.util.Arrays;
2430

2531
import javax.inject.Inject;
@@ -38,6 +44,7 @@
3844
import static android.app.Activity.RESULT_OK;
3945
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
4046
import static android.view.View.GONE;
47+
import static fr.free.nrw.commons.contributions.ContributionController.SELECT_FROM_GALLERY;
4148

4249
public class ContributionsListFragment extends CommonsDaggerSupportFragment {
4350

@@ -128,6 +135,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
128135
// If coming from camera, pass null as uri. Because camera photos get saved to a
129136
// fixed directory
130137
controller.handleImagePicked(requestCode, null, false, null);
138+
} else if (requestCode == ContributionController.PICK_IMAGE_MULTIPLE) {
139+
handleMultipleImages(requestCode, data);
131140
} else {
132141
controller.handleImagePicked(requestCode, data.getData(), false, null);
133142
}
@@ -137,6 +146,30 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
137146
}
138147
}
139148

149+
private void handleMultipleImages(int requestCode, Intent data) {
150+
if (getContext() == null) {
151+
return;
152+
}
153+
if (data.getData() != null) {
154+
controller.handleImagePicked(SELECT_FROM_GALLERY, data.getData(), false, null);
155+
} else {
156+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
157+
if (data.getClipData() != null) {
158+
ClipData mClipData = data.getClipData();
159+
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
160+
for (int i = 0; i < mClipData.getItemCount(); i++) {
161+
162+
ClipData.Item item = mClipData.getItemAt(i);
163+
Uri uri = item.getUri();
164+
mArrayUri.add(uri);
165+
}
166+
Log.v("LOG_TAG", "Selected Images" + mArrayUri.size());
167+
controller.handleImagesPicked(requestCode, mArrayUri);
168+
}
169+
}
170+
}
171+
}
172+
140173
@Override
141174
public boolean onOptionsItemSelected(MenuItem item) {
142175
switch (item.getItemId()) {

app/src/main/java/fr/free/nrw/commons/di/ActivityBuilderModule.java

-6
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,6 @@ public abstract class ActivityBuilderModule {
2727
@ContributesAndroidInjector
2828
abstract WelcomeActivity bindWelcomeActivity();
2929

30-
//@ContributesAndroidInjector
31-
//abstract ShareActivity bindShareActivity();
32-
33-
//@ContributesAndroidInjector
34-
//abstract MultipleShareActivity bindMultipleShareActivity();
35-
3630
@ContributesAndroidInjector
3731
abstract ContributionsActivity bindContributionsActivity();
3832

app/src/main/java/fr/free/nrw/commons/nearby/DirectUpload.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ void initiateGalleryUpload() {
4444
4);
4545
}
4646
} else {
47-
controller.startGalleryPick();
47+
controller.startSingleGalleryPick();
4848
}
4949
}
5050
else {
51-
controller.startGalleryPick();
51+
controller.startSingleGalleryPick();
5252
}
5353
}
5454

app/src/main/java/fr/free/nrw/commons/upload/DexterPermissionObtainer.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,14 @@ public void onManualPermissionReturned() {
9898
* for the required permission and then handles the permission status, thanks to Dexter's appropriate callbacks.
9999
*/
100100
private void askDexterToHandleExternalStoragePermission() {
101-
Timber.d(TAG, "External storage permission is being requested");
101+
Timber.d("External storage permission is being requested");
102102
if (null == dexterStoragePermissionBuilder) {
103103
dexterStoragePermissionBuilder = Dexter.withActivity(activity)
104104
.withPermission(requestedPermission)
105105
.withListener(new BasePermissionListener() {
106106
@Override
107107
public void onPermissionGranted(PermissionGrantedResponse response) {
108-
Timber.d(TAG, "User has granted us the permission for writing the external storage");
108+
Timber.d("User has granted us the permission for writing the external storage");
109109
//If permission is granted, well and good
110110
storagePromptInProgress = false;
111111
storagePromptObservable.onComplete();
@@ -114,7 +114,7 @@ public void onPermissionGranted(PermissionGrantedResponse response) {
114114

115115
@Override
116116
public void onPermissionDenied(PermissionDeniedResponse response) {
117-
Timber.d(TAG, "User has granted us the permission for writing the external storage");
117+
Timber.d("User has granted us the permission for writing the external storage");
118118
//If permission is not granted in whatsoever scenario, we show him a dialog stating why we need the permission
119119
permissionDeniedResponse = response;
120120
if (null != storagePermissionInfoDialog && !storagePermissionInfoDialog

app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,4 @@ public void onNegativeResponse() {
197197
Timber.d("EXIF from imageObj");
198198
useImageCoords();
199199
}
200-
}
200+
}

0 commit comments

Comments
 (0)