Skip to content

Commit 32b7133

Browse files
committed
feat(android): add event-driven wait methods for push subscription ID/token
1 parent 2672f26 commit 32b7133

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)