1515
1616import android .app .Activity ;
1717import android .app .Application ;
18+ import android .content .Intent ;
1819import android .net .Uri ;
1920import android .os .Bundle ;
21+ import android .os .Handler ;
22+ import android .os .Looper ;
2023import android .support .annotation .NonNull ;
2124import android .support .annotation .Nullable ;
25+ import android .support .v4 .app .Fragment ;
26+ import android .support .v4 .app .FragmentActivity ;
2227
28+ import com .facebook .react .bridge .ActivityEventListener ;
2329import com .facebook .react .bridge .ReactApplicationContext ;
2430import com .facebook .react .bridge .ReactContextBaseJavaModule ;
2531import com .facebook .react .bridge .ReactMethod ;
2632import com .facebook .react .bridge .ReadableMap ;
2733import com .pspdfkit .PSPDFKit ;
2834import com .pspdfkit .document .PdfDocument ;
35+ import com .pspdfkit .document .image .CameraImagePickerFragment ;
36+ import com .pspdfkit .document .image .GalleryImagePickerFragment ;
2937import com .pspdfkit .listeners .SimpleDocumentListener ;
3038import com .pspdfkit .ui .PdfActivity ;
39+ import com .pspdfkit .ui .PdfFragment ;
3140
3241import java .util .HashMap ;
3342import java .util .Map ;
3443
35- public class PSPDFKitModule extends ReactContextBaseJavaModule implements Application .ActivityLifecycleCallbacks {
44+ public class PSPDFKitModule extends ReactContextBaseJavaModule implements Application .ActivityLifecycleCallbacks , ActivityEventListener {
3645
3746 private static final String VERSION_KEY = "versionString" ;
3847 private static final String FILE_SCHEME = "file:///" ;
@@ -42,10 +51,28 @@ public class PSPDFKitModule extends ReactContextBaseJavaModule implements Applic
4251 @ Nullable
4352 private Runnable onPdfActivityOpenedTask ;
4453
54+ /**
55+ * Used to dispatch onActivityResult calls to our fragments.
56+ */
57+ @ NonNull
58+ private Handler handler = new Handler (Looper .getMainLooper ());
59+
4560 public PSPDFKitModule (ReactApplicationContext reactContext ) {
4661 super (reactContext );
4762 }
4863
64+ @ Override
65+ public void initialize () {
66+ super .initialize ();
67+ getReactApplicationContext ().addActivityEventListener (this );
68+ }
69+
70+ @ Override
71+ public void onCatalystInstanceDestroy () {
72+ super .onCatalystInstanceDestroy ();
73+ getReactApplicationContext ().removeActivityEventListener (this );
74+ }
75+
4976 @ Override
5077 public String getName () {
5178 return "PSPDFKit" ;
@@ -165,4 +192,36 @@ public synchronized void onActivityDestroyed(Activity activity) {
165192 resumedActivity = null ;
166193 }
167194 }
195+
196+ @ Override
197+ public void onActivityResult (Activity activity , final int requestCode , final int resultCode , final Intent data ) {
198+ if (activity instanceof FragmentActivity ) {
199+ // Forward the result to all our fragments.
200+ FragmentActivity fragmentActivity = (FragmentActivity ) activity ;
201+ for (final Fragment fragment : fragmentActivity .getSupportFragmentManager ().getFragments ()) {
202+ if (fragment instanceof PdfFragment ||
203+ fragment instanceof GalleryImagePickerFragment ||
204+ fragment instanceof CameraImagePickerFragment ) {
205+ // When starting an intent from a fragment its request code is shifted to make it unique,
206+ // we undo it here manually since react by default eats all activity results.
207+ int requestIndex = requestCode >> 16 ;
208+ if (requestIndex != 0 ) {
209+ // We need to wait until the next frame with delivering the result to the fragment,
210+ // otherwise the app will crash since the fragment won't be ready.
211+ handler .post (new Runnable () {
212+ @ Override
213+ public void run () {
214+ fragment .onActivityResult (requestCode & 0xffff , resultCode , data );
215+ }
216+ });
217+ }
218+ }
219+ }
220+ }
221+ }
222+
223+ @ Override
224+ public void onNewIntent (Intent intent ) {
225+ // Not required right now.
226+ }
168227}
0 commit comments