1717import java .security .SecureRandom ;
1818import java .security .Signature ;
1919import java .security .interfaces .RSAPublicKey ;
20+ import java .util .Objects ;
2021import java .util .UUID ;
2122
2223import android .app .Activity ;
24+ import android .content .BroadcastReceiver ;
2325import android .content .Context ;
2426import android .content .ContentResolver ;
2527import android .content .Intent ;
28+ import android .content .IntentFilter ;
2629import android .content .SharedPreferences ;
2730import android .content .pm .PackageInfo ;
2831import android .graphics .Color ;
4649import com .facebook .react .bridge .ReadableMap ;
4750import com .facebook .react .bridge .WritableArray ;
4851import com .facebook .react .bridge .WritableMap ;
52+ import com .facebook .react .modules .core .DeviceEventManagerModule ;
4953
5054import com .google .crypto .tink .shaded .protobuf .InvalidProtocolBufferException ;
5155
5256import androidx .annotation .NonNull ;
5357import androidx .annotation .RequiresApi ;
5458import androidx .biometric .BiometricManager ;
5559import androidx .biometric .BiometricPrompt ;
60+ import androidx .core .content .ContextCompat ;
5661import androidx .fragment .app .FragmentActivity ;
5762import androidx .security .crypto .MasterKey ;
5863import androidx .security .crypto .EncryptedSharedPreferences ;
@@ -63,6 +68,7 @@ public class AuthgearReactNativeModule extends ReactContextBaseJavaModule implem
6368
6469 private static class Handle {
6570 Promise mPromise ;
71+ BroadcastReceiver mBroadcastReceiver ;
6672
6773 Handle (Promise promise ) {
6874 this .mPromise = promise ;
@@ -786,16 +792,40 @@ public void openAuthorizeURLWithWebView(ReadableMap options, Promise promise) {
786792
787793 Context ctx = currentActivity ;
788794
795+ String invocationID = options .getString ("invocationID" );
789796 Uri url = Uri .parse (options .getString ("url" ));
790797 Uri redirectURI = Uri .parse (options .getString ("redirectURI" ));
791798 Integer actionBarBackgroundColor = this .readColorInt (options , "actionBarBackgroundColor" );
792799 Integer actionBarButtonTintColor = this .readColorInt (options , "actionBarButtonTintColor" );
800+ String wechatRedirectURIString = options .getString ("androidWechatRedirectURI" );
793801
794802 WebKitWebViewActivity .Options webViewOptions = new WebKitWebViewActivity .Options ();
795803 webViewOptions .url = url ;
796804 webViewOptions .redirectURI = redirectURI ;
797805 webViewOptions .actionBarBackgroundColor = actionBarBackgroundColor ;
798806 webViewOptions .actionBarButtonTintColor = actionBarButtonTintColor ;
807+ if (wechatRedirectURIString != null ) {
808+ String intentAction = String .format ("com.authgear.reactnative.callback.%s" , invocationID );
809+ handle .mBroadcastReceiver = new BroadcastReceiver () {
810+ @ Override
811+ public void onReceive (Context context , Intent intent ) {
812+ if (Objects .equals (intent .getAction (), intentAction )) {
813+ String uriString = intent .getExtras ().getString ("uri" );
814+ WritableMap map = Arguments .createMap ();
815+ map .putString ("invocationID" , invocationID );
816+ map .putString ("url" , uriString );
817+ AuthgearReactNativeModule .this .sendEvent ("authgear-react-native" , map );
818+ }
819+ }
820+ };
821+
822+ IntentFilter intentFilter = new IntentFilter (intentAction );
823+
824+ webViewOptions .wechatRedirectURI = Uri .parse (wechatRedirectURIString );
825+ webViewOptions .wechatRedirectURIIntentAction = intentAction ;
826+
827+ ContextCompat .registerReceiver (ctx .getApplicationContext (), handle .mBroadcastReceiver , intentFilter , ContextCompat .RECEIVER_NOT_EXPORTED );
828+ }
799829
800830 Intent intent = WebKitWebViewActivity .createIntent (ctx , webViewOptions );
801831 currentActivity .startActivityForResult (intent , requestCode );
@@ -820,6 +850,10 @@ private Integer readColorInt(ReadableMap map, String key) {
820850 return null ;
821851 }
822852
853+ private void sendEvent (String name , ReadableMap map ) {
854+ this .reactContext .getJSModule (DeviceEventManagerModule .RCTDeviceEventEmitter .class ).emit (name , map );
855+ }
856+
823857 @ ReactMethod
824858 public void openAuthorizeURL (String urlString , String callbackURL , boolean shareSessionWithSystemBrowser , Promise promise ) {
825859 final Handle handle = new Handle (promise );
@@ -981,6 +1015,9 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode,
9811015 if (startActivityHandle != null ) {
9821016 final int tag = startActivityHandle .tag ;
9831017 final Promise promise = startActivityHandle .value .mPromise ;
1018+ if (startActivityHandle .value .mBroadcastReceiver != null ) {
1019+ activity .getApplicationContext ().unregisterReceiver (startActivityHandle .value .mBroadcastReceiver );
1020+ }
9841021 switch (tag ) {
9851022 case ACTIVITY_PROMISE_TAG_CODE_AUTHORIZATION :
9861023 if (resultCode == Activity .RESULT_CANCELED ) {
0 commit comments