@@ -514,6 +514,102 @@ public void getPushSubscriptionToken(Promise promise) {
514514 }
515515 }
516516
517+ @ ReactMethod
518+ public void waitForPushSubscriptionIdAsync (final int timeoutMs , final Promise promise ) {
519+ IPushSubscription pushSubscription = OneSignal .getUser ().getPushSubscription ();
520+ String currentId = pushSubscription .getId ();
521+
522+ // If ID already exists, resolve immediately
523+ if (currentId != null && !currentId .isEmpty ()) {
524+ promise .resolve (currentId );
525+ return ;
526+ }
527+
528+ // Create a one-time observer
529+ final IPushSubscriptionObserver observer = new IPushSubscriptionObserver () {
530+ private boolean isResolved = false ;
531+ private final android .os .Handler handler = new android .os .Handler (android .os .Looper .getMainLooper ());
532+ private Runnable timeoutRunnable ;
533+
534+ {
535+ // Set up timeout
536+ timeoutRunnable = new Runnable () {
537+ @ Override
538+ public void run () {
539+ if (!isResolved ) {
540+ isResolved = true ;
541+ OneSignal .getUser ().getPushSubscription ().removeObserver (this );
542+ promise .resolve (null );
543+ }
544+ }
545+ };
546+ handler .postDelayed (timeoutRunnable , timeoutMs );
547+ }
548+
549+ @ Override
550+ public void onPushSubscriptionChange (PushSubscriptionChangedState state ) {
551+ String newId = state .getCurrent ().getId ();
552+ if (newId != null && !newId .isEmpty () && !isResolved ) {
553+ isResolved = true ;
554+ handler .removeCallbacks (timeoutRunnable );
555+ OneSignal .getUser ().getPushSubscription ().removeObserver (this );
556+ promise .resolve (newId );
557+ }
558+ }
559+ };
560+
561+ // Add the observer
562+ pushSubscription .addObserver (observer );
563+ }
564+
565+ @ ReactMethod
566+ public void waitForPushSubscriptionTokenAsync (final int timeoutMs , final Promise promise ) {
567+ IPushSubscription pushSubscription = OneSignal .getUser ().getPushSubscription ();
568+ String currentToken = pushSubscription .getToken ();
569+
570+ // If token already exists, resolve immediately
571+ if (currentToken != null && !currentToken .isEmpty ()) {
572+ promise .resolve (currentToken );
573+ return ;
574+ }
575+
576+ // Create a one-time observer
577+ final IPushSubscriptionObserver observer = new IPushSubscriptionObserver () {
578+ private boolean isResolved = false ;
579+ private final android .os .Handler handler = new android .os .Handler (android .os .Looper .getMainLooper ());
580+ private Runnable timeoutRunnable ;
581+
582+ {
583+ // Set up timeout
584+ timeoutRunnable = new Runnable () {
585+ @ Override
586+ public void run () {
587+ if (!isResolved ) {
588+ isResolved = true ;
589+ OneSignal .getUser ().getPushSubscription ().removeObserver (this );
590+ promise .resolve (null );
591+ }
592+ }
593+ };
594+ handler .postDelayed (timeoutRunnable , timeoutMs );
595+ }
596+
597+ @ Override
598+ public void onPushSubscriptionChange (PushSubscriptionChangedState state ) {
599+ String newToken = state .getCurrent ().getToken ();
600+ if (newToken != null && !newToken .isEmpty () && !isResolved ) {
601+ isResolved = true ;
602+ handler .removeCallbacks (timeoutRunnable );
603+ OneSignal .getUser ().getPushSubscription ().removeObserver (this );
604+ promise .resolve (newToken );
605+ }
606+ }
607+ };
608+
609+ // Add the observer
610+ pushSubscription .addObserver (observer );
611+ }
612+
517613 @ ReactMethod
518614 public void getOptedIn (Promise promise ) {
519615 IPushSubscription pushSubscription = OneSignal .getUser ().getPushSubscription ();
0 commit comments