|
15 | 15 |
|
16 | 16 | import android.app.Activity; |
17 | 17 | import android.app.Application; |
| 18 | +import android.content.Intent; |
18 | 19 | import android.net.Uri; |
19 | 20 | import android.os.Bundle; |
| 21 | +import android.os.Handler; |
| 22 | +import android.os.Looper; |
20 | 23 | import android.support.annotation.NonNull; |
21 | 24 | import android.support.annotation.Nullable; |
| 25 | +import android.support.v4.app.Fragment; |
| 26 | +import android.support.v4.app.FragmentActivity; |
22 | 27 |
|
| 28 | +import com.facebook.react.bridge.ActivityEventListener; |
23 | 29 | import com.facebook.react.bridge.ReactApplicationContext; |
24 | 30 | import com.facebook.react.bridge.ReactContextBaseJavaModule; |
25 | 31 | import com.facebook.react.bridge.ReactMethod; |
26 | 32 | import com.facebook.react.bridge.ReadableMap; |
27 | 33 | import com.pspdfkit.PSPDFKit; |
28 | 34 | import com.pspdfkit.document.PdfDocument; |
| 35 | +import com.pspdfkit.document.image.CameraImagePickerFragment; |
| 36 | +import com.pspdfkit.document.image.GalleryImagePickerFragment; |
29 | 37 | import com.pspdfkit.listeners.SimpleDocumentListener; |
30 | 38 | import com.pspdfkit.ui.PdfActivity; |
| 39 | +import com.pspdfkit.ui.PdfFragment; |
31 | 40 |
|
32 | 41 | import java.util.HashMap; |
33 | 42 | import java.util.Map; |
34 | 43 |
|
35 | | -public class PSPDFKitModule extends ReactContextBaseJavaModule implements Application.ActivityLifecycleCallbacks { |
| 44 | +public class PSPDFKitModule extends ReactContextBaseJavaModule implements Application.ActivityLifecycleCallbacks, ActivityEventListener { |
36 | 45 |
|
37 | 46 | private static final String VERSION_KEY = "versionString"; |
38 | 47 | private static final String FILE_SCHEME = "file:///"; |
39 | 48 |
|
| 49 | + private static final int REQUEST_CODE_TO_INDEX = 16; |
| 50 | + private static final int MASKED_REQUEST_CODE_TO_REAL_CODE = 0xffff; |
| 51 | + |
40 | 52 | @Nullable |
41 | 53 | private Activity resumedActivity; |
42 | 54 | @Nullable |
43 | 55 | private Runnable onPdfActivityOpenedTask; |
44 | 56 |
|
| 57 | + /** |
| 58 | + * Used to dispatch onActivityResult calls to our fragments. |
| 59 | + */ |
| 60 | + @NonNull |
| 61 | + private Handler activityResultHandler = new Handler(Looper.getMainLooper()); |
| 62 | + |
45 | 63 | public PSPDFKitModule(ReactApplicationContext reactContext) { |
46 | 64 | super(reactContext); |
47 | 65 | } |
48 | 66 |
|
| 67 | + @Override |
| 68 | + public void initialize() { |
| 69 | + super.initialize(); |
| 70 | + getReactApplicationContext().addActivityEventListener(this); |
| 71 | + } |
| 72 | + |
| 73 | + @Override |
| 74 | + public void onCatalystInstanceDestroy() { |
| 75 | + super.onCatalystInstanceDestroy(); |
| 76 | + getReactApplicationContext().removeActivityEventListener(this); |
| 77 | + } |
| 78 | + |
49 | 79 | @Override |
50 | 80 | public String getName() { |
51 | 81 | return "PSPDFKit"; |
@@ -165,4 +195,36 @@ public synchronized void onActivityDestroyed(Activity activity) { |
165 | 195 | resumedActivity = null; |
166 | 196 | } |
167 | 197 | } |
| 198 | + |
| 199 | + @Override |
| 200 | + public void onActivityResult(Activity activity, final int requestCode, final int resultCode, final Intent data) { |
| 201 | + if (activity instanceof FragmentActivity) { |
| 202 | + // Forward the result to all our fragments. |
| 203 | + FragmentActivity fragmentActivity = (FragmentActivity) activity; |
| 204 | + for (final Fragment fragment : fragmentActivity.getSupportFragmentManager().getFragments()) { |
| 205 | + if (fragment instanceof PdfFragment || |
| 206 | + fragment instanceof GalleryImagePickerFragment || |
| 207 | + fragment instanceof CameraImagePickerFragment) { |
| 208 | + // When starting an intent from a fragment its request code is shifted to make it unique, |
| 209 | + // we undo it here manually since react by default eats all activity results. |
| 210 | + int requestIndex = requestCode >> REQUEST_CODE_TO_INDEX; |
| 211 | + if (requestIndex != 0) { |
| 212 | + // We need to wait until the next frame with delivering the result to the fragment, |
| 213 | + // otherwise the app will crash since the fragment won't be ready. |
| 214 | + activityResultHandler.post(new Runnable() { |
| 215 | + @Override |
| 216 | + public void run() { |
| 217 | + fragment.onActivityResult(requestCode & MASKED_REQUEST_CODE_TO_REAL_CODE, resultCode, data); |
| 218 | + } |
| 219 | + }); |
| 220 | + } |
| 221 | + } |
| 222 | + } |
| 223 | + } |
| 224 | + } |
| 225 | + |
| 226 | + @Override |
| 227 | + public void onNewIntent(Intent intent) { |
| 228 | + // Not required right now. |
| 229 | + } |
168 | 230 | } |
0 commit comments