Skip to content

Commit 3dd1d6a

Browse files
committed
Merge branch 'refactoring'
2 parents c7d53c7 + b53f930 commit 3dd1d6a

File tree

6 files changed

+336
-111
lines changed

6 files changed

+336
-111
lines changed

android/src/main/java/com/imagepicker/ImagePickerModule.java

Lines changed: 71 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44
import android.app.Activity;
55
import android.content.ActivityNotFoundException;
66
import android.content.Context;
7-
import android.content.DialogInterface;
87
import android.content.Intent;
98
import android.graphics.Bitmap;
109
import android.graphics.BitmapFactory;
1110
import android.graphics.BitmapFactory.Options;
1211
import android.graphics.Matrix;
13-
import android.graphics.drawable.ColorDrawable;
1412
import android.media.ExifInterface;
1513
import android.net.Uri;
1614
import android.os.Build;
@@ -19,10 +17,8 @@
1917
import android.support.annotation.NonNull;
2018
import android.support.v4.app.ActivityCompat;
2119
import android.support.v4.content.FileProvider;
22-
import android.app.AlertDialog;
2320
import android.util.Base64;
2421
import android.util.Log;
25-
import android.widget.ArrayAdapter;
2622
import android.webkit.MimeTypeMap;
2723
import android.content.pm.PackageManager;
2824
import android.media.MediaScannerConnection;
@@ -34,8 +30,9 @@
3430
import com.facebook.react.bridge.ReactContextBaseJavaModule;
3531
import com.facebook.react.bridge.ReactMethod;
3632
import com.facebook.react.bridge.ReadableMap;
37-
import com.facebook.react.bridge.ReadableArray;
3833
import com.facebook.react.bridge.WritableMap;
34+
import com.imagepicker.utils.RealPathUtil;
35+
import com.imagepicker.utils.UI;
3936

4037
import java.io.ByteArrayOutputStream;
4138
import java.io.File;
@@ -50,9 +47,7 @@
5047
import java.text.DateFormat;
5148
import java.text.ParsePosition;
5249
import java.text.SimpleDateFormat;
53-
import java.util.ArrayList;
5450
import java.util.Date;
55-
import java.util.List;
5651
import java.util.Locale;
5752
import java.util.TimeZone;
5853
import java.util.UUID;
@@ -64,10 +59,10 @@ public class ImagePickerModule extends ReactContextBaseJavaModule implements Act
6459
static final int REQUEST_LAUNCH_VIDEO_LIBRARY = 13003;
6560
static final int REQUEST_LAUNCH_VIDEO_CAPTURE = 13004;
6661

67-
private final ReactApplicationContext mReactContext;
62+
private final ReactApplicationContext reactContext;
6863

69-
private Uri mCameraCaptureURI;
70-
private Callback mCallback;
64+
private Uri cameraCaptureURI;
65+
private Callback callback;
7166
private Boolean noData = false;
7267
private Boolean pickVideo = false;
7368
private int maxWidth = 0;
@@ -81,7 +76,7 @@ public class ImagePickerModule extends ReactContextBaseJavaModule implements Act
8176
public ImagePickerModule(ReactApplicationContext reactContext) {
8277
super(reactContext);
8378

84-
mReactContext = reactContext;
79+
this.reactContext = reactContext;
8580

8681
reactContext.addActivityEventListener(this);
8782
}
@@ -95,90 +90,52 @@ public String getName() {
9590
public void showImagePicker(final ReadableMap options, final Callback callback) {
9691
Activity currentActivity = getCurrentActivity();
9792

98-
if (currentActivity == null) {
99-
response = Arguments.createMap();
93+
if (currentActivity == null)
94+
{
95+
cleanResponse();
10096
response.putString("error", "can't find current Activity");
10197
callback.invoke(response);
10298
return;
10399
}
104100

105-
final List<String> titles = new ArrayList<String>();
106-
final List<String> actions = new ArrayList<String>();
107-
108-
if (options.hasKey("takePhotoButtonTitle")
109-
&& options.getString("takePhotoButtonTitle") != null
110-
&& !options.getString("takePhotoButtonTitle").isEmpty()
111-
&& isCameraAvailable()) {
112-
titles.add(options.getString("takePhotoButtonTitle"));
113-
actions.add("photo");
114-
}
115-
if (options.hasKey("chooseFromLibraryButtonTitle")
116-
&& options.getString("chooseFromLibraryButtonTitle") != null
117-
&& !options.getString("chooseFromLibraryButtonTitle").isEmpty()) {
118-
titles.add(options.getString("chooseFromLibraryButtonTitle"));
119-
actions.add("library");
120-
}
121-
if (options.hasKey("customButtons")) {
122-
ReadableArray customButtons = options.getArray("customButtons");
123-
for (int i = 0; i < customButtons.size(); i++) {
124-
ReadableMap button = customButtons.getMap(i);
125-
int currentIndex = titles.size();
126-
titles.add(currentIndex, button.getString("title"));
127-
actions.add(currentIndex, button.getString("name"));
101+
UI.showDialog(currentActivity, options, new UI.OnAction()
102+
{
103+
@Override
104+
public void onTakePhoto()
105+
{
106+
launchCamera(options, callback);
128107
}
129-
}
130-
if (options.hasKey("cancelButtonTitle")
131-
&& options.getString("cancelButtonTitle") != null
132-
&& !options.getString("cancelButtonTitle").isEmpty()) {
133-
titles.add(options.getString("cancelButtonTitle"));
134-
actions.add("cancel");
135-
}
136-
137-
ArrayAdapter<String> adapter = new ArrayAdapter<String>(currentActivity, android.R.layout.select_dialog_item, titles);
138-
AlertDialog.Builder builder = new AlertDialog.Builder(currentActivity, android.R.style.Theme_Holo_Light_Dialog);
139-
if (options.hasKey("title") && options.getString("title") != null && !options.getString("title").isEmpty()) {
140-
builder.setTitle(options.getString("title"));
141-
}
142-
143-
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
144-
public void onClick(DialogInterface dialog, int index) {
145-
String action = actions.get(index);
146-
response = Arguments.createMap();
147-
148-
switch (action) {
149-
case "photo":
150-
launchCamera(options, callback);
151-
break;
152-
case "library":
153-
launchImageLibrary(options, callback);
154-
break;
155-
case "cancel":
156-
response.putBoolean("didCancel", true);
157-
callback.invoke(response);
158-
break;
159-
default: // custom button
160-
response.putString("customButton", action);
161-
callback.invoke(response);
162-
}
108+
109+
@Override
110+
public void onUseLibrary()
111+
{
112+
launchImageLibrary(options, callback);
163113
}
164-
});
165114

166-
final AlertDialog dialog = builder.create();
167-
/**
168-
* override onCancel method to callback cancel in case of a touch outside of
169-
* the dialog or the BACK key pressed
170-
*/
171-
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
172115
@Override
173-
public void onCancel(DialogInterface dialog) {
174-
response = Arguments.createMap();
175-
dialog.dismiss();
116+
public void onCancel()
117+
{
118+
cleanResponse();
176119
response.putBoolean("didCancel", true);
177120
callback.invoke(response);
178121
}
122+
123+
@Override
124+
public void onCustomButton(@NonNull final String action)
125+
{
126+
cleanResponse();
127+
response.putString("customButton", action);
128+
callback.invoke(response);
129+
}
130+
131+
@Override
132+
public void onDialogWasCanceled(@NonNull final String action)
133+
{
134+
cleanResponse();
135+
response.putBoolean(action, true);
136+
callback.invoke(response);
137+
}
179138
});
180-
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
181-
dialog.show();
182139
}
183140

184141
// NOTE: Currently not reentrant / doesn't support concurrent requests
@@ -220,17 +177,17 @@ public void launchCamera(final ReadableMap options, final Callback callback) {
220177

221178
// we create a tmp file to save the result
222179
File imageFile = createNewFile();
223-
mCameraCaptureURI = compatUriFromFile(mReactContext, imageFile);
224-
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraCaptureURI);
180+
cameraCaptureURI = compatUriFromFile(reactContext, imageFile);
181+
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraCaptureURI);
225182
}
226183

227-
if (cameraIntent.resolveActivity(mReactContext.getPackageManager()) == null) {
184+
if (cameraIntent.resolveActivity(reactContext.getPackageManager()) == null) {
228185
response.putString("error", "Cannot launch camera");
229186
callback.invoke(response);
230187
return;
231188
}
232189

233-
mCallback = callback;
190+
this.callback = callback;
234191

235192
try {
236193
currentActivity.startActivityForResult(cameraIntent, requestCode);
@@ -272,13 +229,13 @@ public void launchImageLibrary(final ReadableMap options, final Callback callbac
272229
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
273230
}
274231

275-
if (libraryIntent.resolveActivity(mReactContext.getPackageManager()) == null) {
232+
if (libraryIntent.resolveActivity(reactContext.getPackageManager()) == null) {
276233
response.putString("error", "Cannot launch photo library");
277234
callback.invoke(response);
278235
return;
279236
}
280237

281-
mCallback = callback;
238+
this.callback = callback;
282239

283240
try {
284241
currentActivity.startActivityForResult(libraryIntent, requestCode);
@@ -291,7 +248,7 @@ public void launchImageLibrary(final ReadableMap options, final Callback callbac
291248

292249
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
293250
//robustness code
294-
if (mCallback == null || (mCameraCaptureURI == null && requestCode == REQUEST_LAUNCH_IMAGE_CAPTURE)
251+
if (callback == null || (cameraCaptureURI == null && requestCode == REQUEST_LAUNCH_IMAGE_CAPTURE)
295252
|| (requestCode != REQUEST_LAUNCH_IMAGE_CAPTURE && requestCode != REQUEST_LAUNCH_IMAGE_LIBRARY
296253
&& requestCode != REQUEST_LAUNCH_VIDEO_LIBRARY && requestCode != REQUEST_LAUNCH_VIDEO_CAPTURE)) {
297254
return;
@@ -302,15 +259,15 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
302259
// user cancel
303260
if (resultCode != Activity.RESULT_OK) {
304261
response.putBoolean("didCancel", true);
305-
mCallback.invoke(response);
306-
mCallback = null;
262+
callback.invoke(response);
263+
callback = null;
307264
return;
308265
}
309266

310267
Uri uri;
311268
switch (requestCode) {
312269
case REQUEST_LAUNCH_IMAGE_CAPTURE:
313-
uri = mCameraCaptureURI;
270+
uri = cameraCaptureURI;
314271
this.fileScan(uri.getPath());
315272
break;
316273
case REQUEST_LAUNCH_IMAGE_LIBRARY:
@@ -319,15 +276,15 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
319276
case REQUEST_LAUNCH_VIDEO_LIBRARY:
320277
response.putString("uri", data.getData().toString());
321278
response.putString("path", getRealPathFromURI(data.getData()));
322-
mCallback.invoke(response);
323-
mCallback = null;
279+
callback.invoke(response);
280+
callback = null;
324281
return;
325282
case REQUEST_LAUNCH_VIDEO_CAPTURE:
326283
response.putString("uri", data.getData().toString());
327284
response.putString("path", getRealPathFromURI(data.getData()));
328285
this.fileScan(response.getString("path"));
329-
mCallback.invoke(response);
330-
mCallback = null;
286+
callback.invoke(response);
287+
callback = null;
331288
return;
332289
default:
333290
uri = null;
@@ -355,8 +312,8 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
355312
// image not in cache
356313
response.putString("error", "Could not read photo");
357314
response.putString("uri", uri.toString());
358-
mCallback.invoke(response);
359-
mCallback = null;
315+
callback.invoke(response);
316+
callback = null;
360317
return;
361318
}
362319
}
@@ -406,8 +363,8 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
406363
} catch (IOException e) {
407364
e.printStackTrace();
408365
response.putString("error", e.getMessage());
409-
mCallback.invoke(response);
410-
mCallback = null;
366+
callback.invoke(response);
367+
callback = null;
411368
return;
412369
}
413370

@@ -443,8 +400,8 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
443400

444401
putExtraFileInfo(realPath, response);
445402

446-
mCallback.invoke(response);
447-
mCallback = null;
403+
callback.invoke(response);
404+
callback = null;
448405
}
449406

450407
/**
@@ -498,12 +455,12 @@ private boolean permissionsCheck(Activity activity) {
498455
}
499456

500457
private boolean isCameraAvailable() {
501-
return mReactContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)
502-
|| mReactContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
458+
return reactContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)
459+
|| reactContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
503460
}
504461

505462
private @NonNull String getRealPathFromURI(@NonNull final Uri uri) {
506-
return RealPathUtil.getRealPathFromURI(mReactContext, uri);
463+
return RealPathUtil.getRealPathFromURI(reactContext, uri);
507464
}
508465

509466
/**
@@ -518,8 +475,8 @@ private boolean isCameraAvailable() {
518475
* @throws Exception
519476
*/
520477
private File createFileFromURI(Uri uri) throws Exception {
521-
File file = new File(mReactContext.getExternalCacheDir(), "photo-" + uri.getLastPathSegment());
522-
InputStream input = mReactContext.getContentResolver().openInputStream(uri);
478+
File file = new File(reactContext.getExternalCacheDir(), "photo-" + uri.getLastPathSegment());
479+
InputStream input = reactContext.getContentResolver().openInputStream(uri);
523480
OutputStream output = new FileOutputStream(file);
524481

525482
try {
@@ -649,7 +606,7 @@ private File createNewFile() {
649606
.append(UUID.randomUUID().toString())
650607
.append(".jpg")
651608
.toString();
652-
File path = mReactContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
609+
File path = reactContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
653610

654611
File f = new File(path, filename);
655612
try {
@@ -715,7 +672,7 @@ private void parseOptions(final ReadableMap options) {
715672
}
716673

717674
public void fileScan(String path) {
718-
MediaScannerConnection.scanFile(mReactContext,
675+
MediaScannerConnection.scanFile(reactContext,
719676
new String[] { path }, null,
720677
new MediaScannerConnection.OnScanCompletedListener() {
721678

@@ -731,6 +688,11 @@ public void onNewIntent(Intent intent) { }
731688
// Some people need this for compilation
732689
public void onActivityResult(int requestCode, int resultCode, Intent data) { }
733690

691+
private void cleanResponse()
692+
{
693+
response = Arguments.createMap();
694+
}
695+
734696
private static Uri compatUriFromFile(@NonNull final Context context, @NonNull final File file) {
735697
Uri result = null;
736698
if (Build.VERSION.SDK_INT < 19)

0 commit comments

Comments
 (0)