Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -444,14 +444,16 @@ private void completeUserLogin(@Nullable String email, @Nullable String userId,
IterableLogger.w(TAG, "Cannot complete user login - JWT auth enabled but no validated authToken present");
if (_setUserFailureCallbackHandler != null) {
_setUserFailureCallbackHandler.onFailure("JWT authentication is enabled but no valid authToken is available", null);
resetCallbackHandlers();
}
return;
}

if (config.autoPushRegistration) {
registerForPush();
} else if (_setUserSuccessCallbackHandler != null) {
_setUserSuccessCallbackHandler.onSuccess(new JSONObject()); // passing blank json object here as onSuccess is @Nonnull
_setUserSuccessCallbackHandler.onSuccess(IterableResponse.setEmailLocalSuccessResponse);
resetCallbackHandlers();
}

getInAppManager().syncInApp();
Expand Down Expand Up @@ -747,6 +749,7 @@ private IterableHelper.SuccessHandler getSuccessHandler() {

if (originalSuccessHandler != null) {
originalSuccessHandler.onSuccess(data);
resetCallbackHandlers();
}
};
}
Expand All @@ -762,11 +765,17 @@ private IterableHelper.FailureHandler getFailureHandler() {

if (originalFailureHandler != null) {
originalFailureHandler.onFailure(reason, data);
resetCallbackHandlers();
}
};
}
return wrappedFailureHandler;
}

private void resetCallbackHandlers() {
_setUserFailureCallbackHandler = null;
_setUserSuccessCallbackHandler = null;
}
//endregion

//region SDK initialization
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import org.json.JSONObject;

import java.util.Map;

/**
* Created by David Truong dt@iterable.com
*/
Expand Down Expand Up @@ -33,4 +35,10 @@ public interface FailureHandler {
public interface SuccessAuthHandler {
void onSuccess(@NonNull String authToken);
}
}

class IterableResponse {
final static JSONObject setEmailLocalSuccessResponse = new JSONObject(Map.of("message", "setEmail was completed locally."));

final static JSONObject setReadLocalSuccessResponse = new JSONObject(Map.of("message", "setRead was completed locally."));
}
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public synchronized void setRead(@NonNull IterableInAppMessage message, boolean
public synchronized void setRead(@NonNull IterableInAppMessage message, boolean read, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
message.setRead(read);
if (successHandler != null) {
successHandler.onSuccess(new JSONObject()); // passing blank json object here as onSuccess is @Nonnull
successHandler.onSuccess(IterableResponse.setReadLocalSuccessResponse);
}
notifyOnChange();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1199,4 +1199,36 @@ public void testRegisterDeviceTokenIntegration_ConsentLoggingNotTriggeredWhenDis

//endregion

@Test
public void testSetEmailWithCallbackAndManualRegisterDeviceToken_NoDoubleCallback() throws Exception {
// Setup: Mock server responses
server.enqueue(new MockResponse().setResponseCode(200).setBody("{}"));

IterableConfig config = new IterableConfig.Builder()
.setAutoPushRegistration(false)
.setPushIntegrationName("testIntegration")
.build();

IterableApi.initialize(getContext(), "apiKey", config);

IterableHelper.SuccessHandler successHandler = mock(IterableHelper.SuccessHandler.class);

IterableApi.getInstance().setEmail("test@example.com", successHandler, null);

verify(successHandler, times(1)).onSuccess(any(JSONObject.class));

IterableApi.getInstance().registerDeviceToken("test_token");

Thread.sleep(200);
shadowOf(getMainLooper()).idle();

verify(successHandler, times(1)).onSuccess(any(JSONObject.class));

RecordedRequest registerRequest = server.takeRequest(1, TimeUnit.SECONDS);
assertNotNull("Should have made registerDeviceToken request", registerRequest);
assertTrue("Should be registerDeviceToken endpoint", registerRequest.getPath().contains("registerDeviceToken"));
}

//endregion

}
Loading