From 74c47bd053555585af2ac8fc92e7c2f02b5ae9e0 Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Thu, 9 Jul 2026 09:33:58 +0530 Subject: [PATCH 01/11] Added new api for updatePropositionForSurfaces api with xdm and data support --- .../EdgePersonalizationResponseHandler.java | 143 ++++++---- .../messaging/InternalMessagingUtils.java | 37 +++ .../mobile/messaging/MessagingConstants.java | 2 + .../mobile/messaging/MessagingExtension.java | 5 +- .../com/adobe/marketing/mobile/Messaging.java | 65 ++++- .../marketing/mobile/MessagingTests.java | 175 ++++++++++++ ...gePersonalizationResponseHandlerTests.java | 255 ++++++++++++++++++ .../InternalMessagingUtilsTests.java | 67 +++++ 8 files changed, 700 insertions(+), 49 deletions(-) diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java index 5b5a96df..cb8549b3 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java @@ -168,8 +168,30 @@ class EdgePersonalizationResponseHandler { * @param event The fetch propositions {@link Event} * @param surfaces A {@code List} of surfaces for fetching propositions, if available. */ - @SuppressWarnings("NestedIfDepth") void fetchPropositions(final Event event, final List surfaces) { + fetchPropositions(event, surfaces, null, null); + } + + /** + * Generates and dispatches an event prompting the Edge extension to fetch propositions + * (currently in-app messages, content cards, or code-based experiences), attaching any + * caller-provided custom XDM and/or free-form data to the personalization request. The surface + * URIs used in the request are generated using the application id of the app. If the + * application id is unavailable, calling this method will do nothing. + * + * @param event The fetch propositions {@link Event} + * @param surfaces A {@code List} of surfaces for fetching propositions, if available. + * @param customXdm An optional {@code Map} of custom XDM to merge into the + * personalization request XDM. + * @param customData An optional {@code Map} of custom data to merge into the + * personalization request data. + */ + @SuppressWarnings("NestedIfDepth") + void fetchPropositions( + final Event event, + final List surfaces, + final Map customXdm, + final Map customData) { // get a completion handler for requesting event if one exists final CompletionHandler handler = parent.completionHandlerForOriginatingEventId(event.getUniqueIdentifier()); @@ -216,52 +238,9 @@ void fetchPropositions(final Event event, final List surfaces) { validatedSurfaceUris.add(surface.getUri()); } - // begin construction of event data - final Map eventData = new HashMap<>(); - final Map messageRequestData = new HashMap<>(); - final Map personalizationData = new HashMap<>(); - - // add query parameters containing supported schemas and requested surfaces - personalizationData.put( - MessagingConstants.EventDataKeys.Messaging.Inbound.Key.SCHEMAS, SUPPORTED_SCHEMAS); - personalizationData.put( - MessagingConstants.EventDataKeys.Messaging.Inbound.Key.SURFACES, - validatedSurfaceUris); - messageRequestData.put( - MessagingConstants.EventDataKeys.Messaging.Inbound.Key.PERSONALIZATION, - personalizationData); - eventData.put( - MessagingConstants.EventDataKeys.Messaging.Inbound.Key.QUERY, messageRequestData); - - // add xdm with an event type of personalization.request - final Map xdmData = - new HashMap() { - { - put( - MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.EVENT_TYPE, - MessagingConstants.EventDataKeys.Messaging.Inbound.EventType - .PERSONALIZATION_REQUEST); - } - }; - eventData.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.XDM, xdmData); - - // add a data object to the request specifying the format desired in the response from XAS - final Map data = new HashMap<>(); - final Map ajo = new HashMap<>(); - final Map inAppResponseFormat = new HashMap<>(); - inAppResponseFormat.put( - MessagingConstants.EventDataKeys.Messaging.Data.AdobeKeys.INAPP_RESPONSE_FORMAT, - MessagingConstants.EventDataKeys.Messaging.Data.Value.NEW_IAM); - ajo.put(MessagingConstants.EventDataKeys.Messaging.Data.AdobeKeys.AJO, inAppResponseFormat); - data.put(MessagingConstants.EventDataKeys.Messaging.Data.AdobeKeys.NAMESPACE, ajo); - eventData.put(MessagingConstants.EventDataKeys.Messaging.Data.Key.DATA, data); - - // add a request object so we get a response event from edge when the propositions stream is - // closed for this event - final Map request = new HashMap<>(); - request.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.SEND_COMPLETION, true); - eventData.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.REQUEST, request); - // end construction of event data + // build the personalization request event data, merging any caller-provided custom XDM/data + final Map eventData = + createPersonalizationRequestEventData(validatedSurfaceUris, customXdm, customData); final Event newEvent = new Event.Builder( @@ -334,6 +313,76 @@ public void call(final Event responseCompleteEvent) { }); } + /** + * Builds the event data for a {@code personalization.request} edge event for the provided + * surface URIs. + * + *

Any {@code customXdm} is merged into the request XDM and any {@code customData} is merged + * into the request data. Internal keys required by the SDK — the personalization request {@code + * eventType} in XDM and the {@code __adobe} in-app response format in data — always take + * precedence and cannot be overwritten by the caller. + * + * @param validatedSurfaceUris the validated surface URI strings to request propositions for. + * @param customXdm optional custom XDM to merge into the request XDM. + * @param customData optional custom data to merge into the request data. + * @return the event data {@code Map} for the chained edge request event. + */ + Map createPersonalizationRequestEventData( + final List validatedSurfaceUris, + final Map customXdm, + final Map customData) { + final Map eventData = new HashMap<>(); + final Map messageRequestData = new HashMap<>(); + final Map personalizationData = new HashMap<>(); + + // add query parameters containing supported schemas and requested surfaces + personalizationData.put( + MessagingConstants.EventDataKeys.Messaging.Inbound.Key.SCHEMAS, SUPPORTED_SCHEMAS); + personalizationData.put( + MessagingConstants.EventDataKeys.Messaging.Inbound.Key.SURFACES, + validatedSurfaceUris); + messageRequestData.put( + MessagingConstants.EventDataKeys.Messaging.Inbound.Key.PERSONALIZATION, + personalizationData); + eventData.put( + MessagingConstants.EventDataKeys.Messaging.Inbound.Key.QUERY, messageRequestData); + + // add xdm with an event type of personalization.request, merging any caller-provided XDM. + // the internal eventType is required and always wins over a caller-provided value. + final Map xdmData = new HashMap<>(); + if (customXdm != null && !customXdm.isEmpty()) { + xdmData.putAll(customXdm); + } + xdmData.put( + MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.EVENT_TYPE, + MessagingConstants.EventDataKeys.Messaging.Inbound.EventType + .PERSONALIZATION_REQUEST); + eventData.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.XDM, xdmData); + + // add a data object specifying the response format desired from XAS, merging any + // caller-provided data. the internal __adobe namespace is required and always wins. + final Map data = new HashMap<>(); + if (customData != null && !customData.isEmpty()) { + data.putAll(customData); + } + final Map ajo = new HashMap<>(); + final Map inAppResponseFormat = new HashMap<>(); + inAppResponseFormat.put( + MessagingConstants.EventDataKeys.Messaging.Data.AdobeKeys.INAPP_RESPONSE_FORMAT, + MessagingConstants.EventDataKeys.Messaging.Data.Value.NEW_IAM); + ajo.put(MessagingConstants.EventDataKeys.Messaging.Data.AdobeKeys.AJO, inAppResponseFormat); + data.put(MessagingConstants.EventDataKeys.Messaging.Data.AdobeKeys.NAMESPACE, ajo); + eventData.put(MessagingConstants.EventDataKeys.Messaging.Data.Key.DATA, data); + + // add a request object so we get a response event from edge when the propositions stream is + // closed for this event + final Map request = new HashMap<>(); + request.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.SEND_COMPLETION, true); + eventData.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.REQUEST, request); + + return eventData; + } + /** * Process the event containing the finalized edge response personalization notification data. * diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/InternalMessagingUtils.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/InternalMessagingUtils.java index 16f75905..d950d22b 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/InternalMessagingUtils.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/InternalMessagingUtils.java @@ -379,6 +379,43 @@ static List getSurfaces(final Event event) { return retrievedSurfaces; } + /** + * Retrieves the caller-provided custom XDM from an {@code updatePropositionsForSurfaces} {@code + * Event}'s event data. + * + * @param event A Messaging Request Content {@link Event}. + * @return {@code Map} containing the custom XDM, or {@code null} if not present + */ + static Map getUpdatePropositionsXdm(final Event event) { + if (event == null || event.getEventData() == null) { + return null; + } + return DataReader.optTypedMap( + Object.class, + event.getEventData(), + MessagingConstants.EventDataKeys.Messaging.XDM, + null); + } + + /** + * Retrieves the caller-provided custom free-form data from an {@code + * updatePropositionsForSurfaces} {@code Event}'s event data. + * + * @param event A Messaging Request Content {@link Event}. + * @return {@code Map} containing the custom data, or {@code null} if not + * present + */ + static Map getUpdatePropositionsData(final Event event) { + if (event == null || event.getEventData() == null) { + return null; + } + return DataReader.optTypedMap( + Object.class, + event.getEventData(), + MessagingConstants.EventDataKeys.Messaging.DATA, + null); + } + // ======================================================================================== // Event id retrieval // ======================================================================================== diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java index f64956da..a19b16c8 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java @@ -205,6 +205,8 @@ final class Messaging { static final String UPDATE_PROPOSITIONS = "updatepropositions"; static final String GET_PROPOSITIONS = "getpropositions"; static final String SURFACES = "surfaces"; + static final String XDM = "xdm"; + static final String DATA = "data"; static final String ENDING_EVENT_ID = "endingEventId"; static final String RESPONSE_ERROR = "responseerror"; static final String PUSH_NOTIFICATION_TRACKING_STATUS = "pushTrackingStatus"; diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingExtension.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingExtension.java index 9c59f090..b936d0cc 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingExtension.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingExtension.java @@ -380,7 +380,10 @@ void processEvent(final Event eventToProcess) { SELF_TAG, "Processing request to retrieve propositions from the remote."); edgePersonalizationResponseHandler.fetchPropositions( - eventToProcess, InternalMessagingUtils.getSurfaces(eventToProcess)); + eventToProcess, + InternalMessagingUtils.getSurfaces(eventToProcess), + InternalMessagingUtils.getUpdatePropositionsXdm(eventToProcess), + InternalMessagingUtils.getUpdatePropositionsData(eventToProcess)); } else if (InternalMessagingUtils.isGetPropositionsEvent(eventToProcess)) { // Queue the get propositions event in the // edgePersonalizationResponseHandler.serialWorkDispatcher to ensure any prior update diff --git a/code/messaging/src/phone/java/com/adobe/marketing/mobile/Messaging.java b/code/messaging/src/phone/java/com/adobe/marketing/mobile/Messaging.java index 247d88a8..a54c669e 100644 --- a/code/messaging/src/phone/java/com/adobe/marketing/mobile/Messaging.java +++ b/code/messaging/src/phone/java/com/adobe/marketing/mobile/Messaging.java @@ -65,6 +65,8 @@ public final class Messaging { private static final String PUSH_NOTIFICATION_TRACKING_STATUS = "pushTrackingStatus"; private static final String _XDM = "_xdm"; private static final String SURFACES = "surfaces"; + private static final String XDM = "xdm"; + private static final String DATA = "data"; private static final String PROPOSITIONS = "propositions"; private static final String UPDATE_PROPOSITIONS_EVENT = "updatepropositions"; private static final String GET_PROPOSITIONS_EVENT = "getpropositions"; @@ -512,7 +514,7 @@ public void call(final Event event) { * propositions */ public static void updatePropositionsForSurfaces(@NonNull final List surfaces) { - updatePropositionsForSurfaces(surfaces, null); + updatePropositionsForSurfaces(surfaces, null, null, null); } /** @@ -527,6 +529,59 @@ public static void updatePropositionsForSurfaces(@NonNull final List su public static void updatePropositionsForSurfaces( @NonNull final List surfaces, @Nullable final AdobeCallback callback) { + updatePropositionsForSurfaces(surfaces, null, null, callback); + } + + /** + * Dispatches an event to fetch propositions for the provided surfaces from Adobe Journey + * Optimizer via the Experience Edge network, attaching custom XDM and/or free-form data to the + * personalization request. + * + *

Any fields provided in {@code xdm} are merged into the request's XDM object, and any + * fields provided in {@code data} are merged into the request's free-form data object. Internal + * keys required by the SDK (for example, the personalization request {@code eventType}) always + * take precedence and cannot be overwritten by the caller. + * + * @param surfaces A {@code List} containing {@link Surface}s to be used for retrieving + * propositions + * @param xdm An optional {@code Map} of custom XDM fields to attach to the + * personalization request (for example, context fields used by decisioning eligibility + * rules) + * @param data An optional {@code Map} of custom free-form data to attach to the + * personalization request + */ + public static void updatePropositionsForSurfaces( + @NonNull final List surfaces, + @Nullable final Map xdm, + @Nullable final Map data) { + updatePropositionsForSurfaces(surfaces, xdm, data, null); + } + + /** + * Dispatches an event to fetch propositions for the provided surfaces from Adobe Journey + * Optimizer via the Experience Edge network, attaching custom XDM and/or free-form data to the + * personalization request. + * + *

Any fields provided in {@code xdm} are merged into the request's XDM object, and any + * fields provided in {@code data} are merged into the request's free-form data object. Internal + * keys required by the SDK (for example, the personalization request {@code eventType}) always + * take precedence and cannot be overwritten by the caller. + * + * @param surfaces A {@code List} containing {@link Surface}s to be used for retrieving + * propositions + * @param xdm An optional {@code Map} of custom XDM fields to attach to the + * personalization request (for example, context fields used by decisioning eligibility + * rules) + * @param data An optional {@code Map} of custom free-form data to attach to the + * personalization request + * @param callback An optional callback to be called once the proposition response has been + * processed by the Messaging extension + */ + public static void updatePropositionsForSurfaces( + @NonNull final List surfaces, + @Nullable final Map xdm, + @Nullable final Map data, + @Nullable final AdobeCallback callback) { if (surfaces == null || surfaces.isEmpty()) { Log.warning( LOG_TAG, @@ -555,6 +610,14 @@ public static void updatePropositionsForSurfaces( eventData.put(UPDATE_PROPOSITIONS_EVENT, true); eventData.put(SURFACES, validSurfacesFlattened); + if (xdm != null && !xdm.isEmpty()) { + eventData.put(XDM, xdm); + } + + if (data != null && !data.isEmpty()) { + eventData.put(DATA, data); + } + final Event updatePropositionsEvent = new Event.Builder( UPDATE_PROPOSITIONS, diff --git a/code/messaging/src/test/java/com/adobe/marketing/mobile/MessagingTests.java b/code/messaging/src/test/java/com/adobe/marketing/mobile/MessagingTests.java index 5a2623e0..9e47611f 100644 --- a/code/messaging/src/test/java/com/adobe/marketing/mobile/MessagingTests.java +++ b/code/messaging/src/test/java/com/adobe/marketing/mobile/MessagingTests.java @@ -1251,6 +1251,181 @@ public void test_updatePropositionsForSurfaces() { }); } + @Test + public void test_updatePropositionsForSurfaces_withXdmAndData() { + final ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(Event.class); + runWithMockedMobileCore( + eventCaptor, + null, + () -> { + List surfacePaths = new ArrayList<>(); + surfacePaths.add(new Surface("promos/feed1")); + + Map restaurant = new HashMap<>(); + restaurant.put("restaurantId", "6099"); + Map xdm = new HashMap<>(); + xdm.put("_chipotle", restaurant); + + Map data = new HashMap<>(); + data.put("customKey", "customValue"); + + // test + Messaging.updatePropositionsForSurfaces(surfacePaths, xdm, data); + + // verify + MobileCore.dispatchEvent(eventCaptor.capture()); + + Event event = eventCaptor.getAllValues().get(0); + Map eventData = event.getEventData(); + assertNotNull(eventData); + assertEquals( + true, + DataReader.optBoolean( + eventData, + MessagingTestConstants.EventDataKeys.Messaging + .UPDATE_PROPOSITIONS, + false)); + + Map capturedXdm = + DataReader.optTypedMap(Object.class, eventData, "xdm", null); + assertNotNull(capturedXdm); + Map capturedChipotle = + DataReader.optTypedMap(Object.class, capturedXdm, "_chipotle", null); + assertEquals("6099", capturedChipotle.get("restaurantId")); + + Map capturedData = + DataReader.optTypedMap(Object.class, eventData, "data", null); + assertNotNull(capturedData); + assertEquals("customValue", capturedData.get("customKey")); + }); + } + + @Test + public void test_updatePropositionsForSurfaces_withXdmAndData_andCallback() { + final ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(Event.class); + runWithMockedMobileCore( + eventCaptor, + null, + () -> { + List surfacePaths = new ArrayList<>(); + surfacePaths.add(new Surface("promos/feed1")); + + Map xdm = new HashMap<>(); + xdm.put("key", "value"); + + // test - exercise the callback-bearing overload + Messaging.updatePropositionsForSurfaces( + surfacePaths, xdm, null, callback -> {}); + + // verify + MobileCore.dispatchEvent(eventCaptor.capture()); + + Event event = eventCaptor.getAllValues().get(0); + Map eventData = event.getEventData(); + Map capturedXdm = + DataReader.optTypedMap(Object.class, eventData, "xdm", null); + assertEquals("value", capturedXdm.get("key")); + // data absent when not provided + assertNull(DataReader.optTypedMap(Object.class, eventData, "data", null)); + }); + } + + @Test + public void test_updatePropositionsForSurfaces_withXdmOnly() { + final ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(Event.class); + runWithMockedMobileCore( + eventCaptor, + null, + () -> { + List surfacePaths = new ArrayList<>(); + surfacePaths.add(new Surface("promos/feed1")); + Map xdm = new HashMap<>(); + xdm.put("key", "value"); + + // test + Messaging.updatePropositionsForSurfaces(surfacePaths, xdm, null); + + // verify + MobileCore.dispatchEvent(eventCaptor.capture()); + Event event = eventCaptor.getAllValues().get(0); + Map eventData = event.getEventData(); + Map capturedXdm = + DataReader.optTypedMap(Object.class, eventData, "xdm", null); + assertEquals("value", capturedXdm.get("key")); + assertNull(DataReader.optTypedMap(Object.class, eventData, "data", null)); + }); + } + + @Test + public void test_updatePropositionsForSurfaces_withDataOnly() { + final ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(Event.class); + runWithMockedMobileCore( + eventCaptor, + null, + () -> { + List surfacePaths = new ArrayList<>(); + surfacePaths.add(new Surface("promos/feed1")); + Map data = new HashMap<>(); + data.put("customKey", "customValue"); + + // test + Messaging.updatePropositionsForSurfaces(surfacePaths, null, data); + + // verify + MobileCore.dispatchEvent(eventCaptor.capture()); + Event event = eventCaptor.getAllValues().get(0); + Map eventData = event.getEventData(); + Map capturedData = + DataReader.optTypedMap(Object.class, eventData, "data", null); + assertEquals("customValue", capturedData.get("customKey")); + assertNull(DataReader.optTypedMap(Object.class, eventData, "xdm", null)); + }); + } + + @Test + public void + test_updatePropositionsForSurfaces_withXdm_whenEmptyListProvided_thenNoEventDispatched() { + final ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(Event.class); + runWithMockedMobileCore( + eventCaptor, + null, + () -> { + Map xdm = new HashMap<>(); + xdm.put("key", "value"); + + // test - empty surfaces should short-circuit even when xdm is provided + Messaging.updatePropositionsForSurfaces(new ArrayList<>(), xdm, null); + + // verify no event dispatched + MobileCore.dispatchEvent(eventCaptor.capture()); + assertNull(eventCaptor.getValue()); + }); + } + + @Test + public void test_updatePropositionsForSurfaces_backwardCompatible_noXdmOrDataKeys() { + final ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(Event.class); + runWithMockedMobileCore( + eventCaptor, + null, + () -> { + List surfacePaths = new ArrayList<>(); + surfacePaths.add(new Surface("promos/feed1")); + + // test - the existing surfaces-only overload should not attach xdm/data keys + Messaging.updatePropositionsForSurfaces(surfacePaths); + + // verify + MobileCore.dispatchEvent(eventCaptor.capture()); + + Event event = eventCaptor.getAllValues().get(0); + Map eventData = event.getEventData(); + assertNotNull(eventData); + assertNull(DataReader.optTypedMap(Object.class, eventData, "xdm", null)); + assertNull(DataReader.optTypedMap(Object.class, eventData, "data", null)); + }); + } + @Test public void test_updatePropositionsForSurfaces_whenSomeSurfacePathsInvalid_thenOnlyValidPathsUsedForFeedRetrieval() { diff --git a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java index 75694176..f8394bcc 100644 --- a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java +++ b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java @@ -278,6 +278,261 @@ public void test_fetchMessages_ValidApplicationPackageNamePresent() { }); } + // ======================================================================================== + // createPersonalizationRequestEventData (custom XDM / data merge) + // ======================================================================================== + @Test + public void createPersonalizationRequestEventData_baseStructure_whenNoCustomXdmOrData() { + runUsingMockedServiceProvider( + () -> { + Map expected = null; + try { + expected = + JSONUtils.toMap( + new JSONObject( + "{\"xdm\":{\"eventType\":\"personalization.request\"}," + + " \"request\":{\"sendCompletion\":true}," + + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/surface\"]," + + " \"schemas\":[\"https://ns.adobe.com/personalization/html-content-item\"," + + " \"https://ns.adobe.com/personalization/json-content-item\"," + + " \"https://ns.adobe.com/personalization/ruleset-item\"]}}}")); + } catch (JSONException e) { + fail(e.getMessage()); + } + + Map actual = + edgePersonalizationResponseHandler + .createPersonalizationRequestEventData( + Collections.singletonList("mobileapp://test/surface"), + null, + null); + + assertEquals(expected, actual); + }); + } + + @Test + public void createPersonalizationRequestEventData_withCustomXdm() { + runUsingMockedServiceProvider( + () -> { + Map customXdm = new HashMap<>(); + customXdm.put("_chipotle", Collections.singletonMap("restaurantId", "6099")); + + Map expected = null; + try { + expected = + JSONUtils.toMap( + new JSONObject( + "{\"xdm\":{\"eventType\":\"personalization.request\"," + + " \"_chipotle\":{\"restaurantId\":\"6099\"}}," + + " \"request\":{\"sendCompletion\":true}," + + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/surface\"]," + + " \"schemas\":[\"https://ns.adobe.com/personalization/html-content-item\"," + + " \"https://ns.adobe.com/personalization/json-content-item\"," + + " \"https://ns.adobe.com/personalization/ruleset-item\"]}}}")); + } catch (JSONException e) { + fail(e.getMessage()); + } + + Map actual = + edgePersonalizationResponseHandler + .createPersonalizationRequestEventData( + Collections.singletonList("mobileapp://test/surface"), + customXdm, + null); + + assertEquals(expected, actual); + }); + } + + @Test + public void createPersonalizationRequestEventData_withCustomData() { + runUsingMockedServiceProvider( + () -> { + Map customData = new HashMap<>(); + customData.put("customKey", "customValue"); + + Map expected = null; + try { + expected = + JSONUtils.toMap( + new JSONObject( + "{\"xdm\":{\"eventType\":\"personalization.request\"}," + + " \"request\":{\"sendCompletion\":true}," + + " \"data\":{\"customKey\":\"customValue\"," + + " \"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/surface\"]," + + " \"schemas\":[\"https://ns.adobe.com/personalization/html-content-item\"," + + " \"https://ns.adobe.com/personalization/json-content-item\"," + + " \"https://ns.adobe.com/personalization/ruleset-item\"]}}}")); + } catch (JSONException e) { + fail(e.getMessage()); + } + + Map actual = + edgePersonalizationResponseHandler + .createPersonalizationRequestEventData( + Collections.singletonList("mobileapp://test/surface"), + null, + customData); + + assertEquals(expected, actual); + }); + } + + @Test + public void createPersonalizationRequestEventData_customXdmCannotOverrideInternalEventType() { + runUsingMockedServiceProvider( + () -> { + // caller attempts to override the internal eventType + Map customXdm = new HashMap<>(); + customXdm.put("eventType", "some.other.type"); + customXdm.put("_chipotle", Collections.singletonMap("restaurantId", "6099")); + + Map expected = null; + try { + expected = + JSONUtils.toMap( + new JSONObject( + "{\"xdm\":{\"eventType\":\"personalization.request\"," + + " \"_chipotle\":{\"restaurantId\":\"6099\"}}," + + " \"request\":{\"sendCompletion\":true}," + + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/surface\"]," + + " \"schemas\":[\"https://ns.adobe.com/personalization/html-content-item\"," + + " \"https://ns.adobe.com/personalization/json-content-item\"," + + " \"https://ns.adobe.com/personalization/ruleset-item\"]}}}")); + } catch (JSONException e) { + fail(e.getMessage()); + } + + Map actual = + edgePersonalizationResponseHandler + .createPersonalizationRequestEventData( + Collections.singletonList("mobileapp://test/surface"), + customXdm, + null); + + // internal eventType wins; custom sibling preserved + assertEquals(expected, actual); + }); + } + + @Test + public void + createPersonalizationRequestEventData_customDataCannotOverrideInternalAdobeNamespace() { + runUsingMockedServiceProvider( + () -> { + // caller attempts to override the internal __adobe response-format namespace + Map customData = new HashMap<>(); + customData.put( + "__adobe", + Collections.singletonMap( + "ajo", + Collections.singletonMap("in-app-response-format", 999))); + customData.put("customKey", "customValue"); + + Map expected = null; + try { + expected = + JSONUtils.toMap( + new JSONObject( + "{\"xdm\":{\"eventType\":\"personalization.request\"}," + + " \"request\":{\"sendCompletion\":true}," + + " \"data\":{\"customKey\":\"customValue\"," + + " \"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/surface\"]," + + " \"schemas\":[\"https://ns.adobe.com/personalization/html-content-item\"," + + " \"https://ns.adobe.com/personalization/json-content-item\"," + + " \"https://ns.adobe.com/personalization/ruleset-item\"]}}}")); + } catch (JSONException e) { + fail(e.getMessage()); + } + + Map actual = + edgePersonalizationResponseHandler + .createPersonalizationRequestEventData( + Collections.singletonList("mobileapp://test/surface"), + null, + customData); + + // internal __adobe wins; custom sibling preserved + assertEquals(expected, actual); + }); + } + + @Test + public void createPersonalizationRequestEventData_withCustomXdmAndData() { + runUsingMockedServiceProvider( + () -> { + Map customXdm = new HashMap<>(); + customXdm.put("_chipotle", Collections.singletonMap("restaurantId", "6099")); + Map customData = new HashMap<>(); + customData.put("customKey", "customValue"); + + Map expected = null; + try { + expected = + JSONUtils.toMap( + new JSONObject( + "{\"xdm\":{\"eventType\":\"personalization.request\"," + + " \"_chipotle\":{\"restaurantId\":\"6099\"}}," + + " \"request\":{\"sendCompletion\":true}," + + " \"data\":{\"customKey\":\"customValue\"," + + " \"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/surface\"]," + + " \"schemas\":[\"https://ns.adobe.com/personalization/html-content-item\"," + + " \"https://ns.adobe.com/personalization/json-content-item\"," + + " \"https://ns.adobe.com/personalization/ruleset-item\"]}}}")); + } catch (JSONException e) { + fail(e.getMessage()); + } + + Map actual = + edgePersonalizationResponseHandler + .createPersonalizationRequestEventData( + Collections.singletonList("mobileapp://test/surface"), + customXdm, + customData); + + assertEquals(expected, actual); + }); + } + + @Test + public void createPersonalizationRequestEventData_multipleSurfaces() { + runUsingMockedServiceProvider( + () -> { + List surfaceUris = new ArrayList<>(); + surfaceUris.add("mobileapp://test/one"); + surfaceUris.add("mobileapp://test/two"); + + Map expected = null; + try { + expected = + JSONUtils.toMap( + new JSONObject( + "{\"xdm\":{\"eventType\":\"personalization.request\"}," + + " \"request\":{\"sendCompletion\":true}," + + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/one\",\"mobileapp://test/two\"]," + + " \"schemas\":[\"https://ns.adobe.com/personalization/html-content-item\"," + + " \"https://ns.adobe.com/personalization/json-content-item\"," + + " \"https://ns.adobe.com/personalization/ruleset-item\"]}}}")); + } catch (JSONException e) { + fail(e.getMessage()); + } + + Map actual = + edgePersonalizationResponseHandler + .createPersonalizationRequestEventData(surfaceUris, null, null); + + assertEquals(expected, actual); + }); + } + @Test public void test_fetchMessages_ValidApplicationPackageNamePresent_NullOriginatingEventCompletionHandler() { diff --git a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/InternalMessagingUtilsTests.java b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/InternalMessagingUtilsTests.java index 267da38a..6034dd0f 100644 --- a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/InternalMessagingUtilsTests.java +++ b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/InternalMessagingUtilsTests.java @@ -1303,6 +1303,73 @@ public void getSurfaces_returnsListOfSurfaces_whenSurfacesFoundInEvent() { assertEquals("mobileapp://surface/path2", result.get(1).getUri()); } + // ======================================================================================== + // getUpdatePropositionsXdm / getUpdatePropositionsData + // ======================================================================================== + @Test + public void getUpdatePropositionsXdm_returnsXdm_whenPresent() { + // setup + Map xdm = new HashMap<>(); + xdm.put("key", "value"); + Map eventData = new HashMap<>(); + eventData.put("xdm", xdm); + Event event = + new Event.Builder("event", EventType.MESSAGING, EventSource.REQUEST_CONTENT) + .setEventData(eventData) + .build(); + + // test & verify + Map result = InternalMessagingUtils.getUpdatePropositionsXdm(event); + assertNotNull(result); + assertEquals("value", result.get("key")); + } + + @Test + public void getUpdatePropositionsXdm_returnsNull_whenAbsent() { + Event event = + new Event.Builder("event", EventType.MESSAGING, EventSource.REQUEST_CONTENT) + .setEventData(new HashMap<>()) + .build(); + assertNull(InternalMessagingUtils.getUpdatePropositionsXdm(event)); + } + + @Test + public void getUpdatePropositionsXdm_returnsNull_whenEventIsNull() { + assertNull(InternalMessagingUtils.getUpdatePropositionsXdm(null)); + } + + @Test + public void getUpdatePropositionsData_returnsData_whenPresent() { + // setup + Map data = new HashMap<>(); + data.put("customKey", "customValue"); + Map eventData = new HashMap<>(); + eventData.put("data", data); + Event event = + new Event.Builder("event", EventType.MESSAGING, EventSource.REQUEST_CONTENT) + .setEventData(eventData) + .build(); + + // test & verify + Map result = InternalMessagingUtils.getUpdatePropositionsData(event); + assertNotNull(result); + assertEquals("customValue", result.get("customKey")); + } + + @Test + public void getUpdatePropositionsData_returnsNull_whenAbsent() { + Event event = + new Event.Builder("event", EventType.MESSAGING, EventSource.REQUEST_CONTENT) + .setEventData(new HashMap<>()) + .build(); + assertNull(InternalMessagingUtils.getUpdatePropositionsData(event)); + } + + @Test + public void getUpdatePropositionsData_returnsNull_whenEventIsNull() { + assertNull(InternalMessagingUtils.getUpdatePropositionsData(null)); + } + // ======================================================================================== // Event id retrieval // ======================================================================================== From 3aa31f8382d4f79f6ad62ee26d7489a1f4f9bcee Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Tue, 14 Jul 2026 17:51:42 +0530 Subject: [PATCH 02/11] fixed failing test on CI --- .../marketing/mobile/messaging/MessagingExtensionTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/MessagingExtensionTests.java b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/MessagingExtensionTests.java index 729b4f7f..72c5d913 100644 --- a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/MessagingExtensionTests.java +++ b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/MessagingExtensionTests.java @@ -2325,7 +2325,7 @@ public void test_processEvent_updatePropositionsEvent() { // verify verify(mockEdgePersonalizationResponseHandler, times(1)) - .fetchPropositions(any(Event.class), listArgumentCaptor.capture()); + .fetchPropositions(any(Event.class), listArgumentCaptor.capture(), isNull(), isNull()); List capturedSurfaces = listArgumentCaptor.getValue(); assertEquals(2, capturedSurfaces.size()); List sortedList = new ArrayList<>(); From 3069324d6796f0a1ba5d4ce630adbece6e4908a7 Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Tue, 14 Jul 2026 18:25:37 +0530 Subject: [PATCH 03/11] lint fix --- .../marketing/mobile/messaging/MessagingExtensionTests.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/MessagingExtensionTests.java b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/MessagingExtensionTests.java index 72c5d913..b8b29f98 100644 --- a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/MessagingExtensionTests.java +++ b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/MessagingExtensionTests.java @@ -2325,7 +2325,11 @@ public void test_processEvent_updatePropositionsEvent() { // verify verify(mockEdgePersonalizationResponseHandler, times(1)) - .fetchPropositions(any(Event.class), listArgumentCaptor.capture(), isNull(), isNull()); + .fetchPropositions( + any(Event.class), + listArgumentCaptor.capture(), + isNull(), + isNull()); List capturedSurfaces = listArgumentCaptor.getValue(); assertEquals(2, capturedSurfaces.size()); List sortedList = new ArrayList<>(); From 6f1297364da64b37eaf4adfee6ed873270f8f1b7 Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Tue, 14 Jul 2026 23:25:14 +0530 Subject: [PATCH 04/11] updated personalization.request event type to decisioning.propositionFetch --- .../messaging/MessagingPublicAPITests.java | 26 +++++++++---------- .../EdgePersonalizationResponseHandler.java | 2 +- .../mobile/messaging/MessagingConstants.java | 2 +- ...gePersonalizationResponseHandlerTests.java | 12 ++++----- .../messaging/MessagingTestConstants.java | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/code/messaging/src/androidTest/java/com/adobe/marketing/mobile/messaging/MessagingPublicAPITests.java b/code/messaging/src/androidTest/java/com/adobe/marketing/mobile/messaging/MessagingPublicAPITests.java index 55ed4e26..33c433c2 100644 --- a/code/messaging/src/androidTest/java/com/adobe/marketing/mobile/messaging/MessagingPublicAPITests.java +++ b/code/messaging/src/androidTest/java/com/adobe/marketing/mobile/messaging/MessagingPublicAPITests.java @@ -502,7 +502,7 @@ public void testRefreshInAppMessages() throws InterruptedException { DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(1, surfacesList.size()); assertEquals("mobileapp://com.adobe.marketing.mobile.messaging.test", surfacesList.get(0)); } @@ -562,7 +562,7 @@ public void testUpdatePropositionsForSurfacePaths() throws InterruptedException DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -628,7 +628,7 @@ public void testUpdatePropositionsForSurfacePaths_somePathsInvalid() DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -941,7 +941,7 @@ public void testContentCard_Removal() throws InterruptedException { DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -1099,7 +1099,7 @@ public void testContentCard_Qualification() throws InterruptedException { DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -1206,7 +1206,7 @@ public void testContentCard_Unqualification() throws InterruptedException { DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -1348,7 +1348,7 @@ public void testContentCard_Requalification() throws InterruptedException { DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -1530,7 +1530,7 @@ public void testContentCard_Disqualification() throws InterruptedException { DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -1699,7 +1699,7 @@ public void testContentCardWithoutTriggers_Qualification() throws InterruptedExc DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -1809,7 +1809,7 @@ public void testContentCardWithoutTriggers_Unqualification() throws InterruptedE DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -1954,7 +1954,7 @@ public void testContentCardWithoutTriggers_Requalification() throws InterruptedE DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -2128,7 +2128,7 @@ public void testContentCardWithoutTriggers_Disqualification() throws Interrupted DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", @@ -2303,7 +2303,7 @@ public void testContentCard_WithIAM() throws InterruptedException { DataReader.optTypedMap(Object.class, queryDataMap, "personalization", null); final List surfacesList = DataReader.optStringList(personalizationDataMap, "surfaces", null); - assertEquals("personalization.request", xdmDataMap.get("eventType")); + assertEquals("decisioning.propositionFetch", xdmDataMap.get("eventType")); assertEquals(2, surfacesList.size()); assertEquals( "mobileapp://com.adobe.marketing.mobile.messaging.test/promos/feed1", diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java index 5b5a96df..31f395e0 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java @@ -233,7 +233,7 @@ void fetchPropositions(final Event event, final List surfaces) { eventData.put( MessagingConstants.EventDataKeys.Messaging.Inbound.Key.QUERY, messageRequestData); - // add xdm with an event type of personalization.request + // add xdm with an event type of decisioning.propositionFetch final Map xdmData = new HashMap() { { diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java index f64956da..450a86e1 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java @@ -273,7 +273,7 @@ final class Inbound { private Inbound() {} final class EventType { - static final String PERSONALIZATION_REQUEST = "personalization.request"; + static final String PERSONALIZATION_REQUEST = "decisioning.propositionFetch"; private EventType() {} } diff --git a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java index 75694176..060f303d 100644 --- a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java +++ b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java @@ -235,7 +235,7 @@ public void test_fetchMessages_ValidApplicationPackageNamePresent() { expectedEventData = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://mockPackageName\"]," @@ -303,7 +303,7 @@ public void test_fetchMessages_ValidApplicationPackageNamePresent() { expectedEventData = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://mockPackageName\"]," @@ -355,7 +355,7 @@ public void test_fetchMessages_ValidApplicationPackageNamePresent_AdobeErrorRece expectedEventData = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://mockPackageName\"]," @@ -517,7 +517,7 @@ public void test_fetchMessages_SurfacePathsProvided() { expectedEventData = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://mockPackageName/promos/feed1\"," @@ -577,7 +577,7 @@ public void test_fetchMessages_SurfacePathsProvided_InvalidPathsDropped() { expectedEventData = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://mockPackageName/promos/feed1\"," @@ -655,7 +655,7 @@ public void test_fetchMessages_EmptySurfacePathsProvided() { expectedEventData = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://mockPackageName\"]," diff --git a/code/messagingtestutils/src/main/java/com/adobe/marketing/mobile/messaging/MessagingTestConstants.java b/code/messagingtestutils/src/main/java/com/adobe/marketing/mobile/messaging/MessagingTestConstants.java index dd0fff13..bc186112 100644 --- a/code/messagingtestutils/src/main/java/com/adobe/marketing/mobile/messaging/MessagingTestConstants.java +++ b/code/messagingtestutils/src/main/java/com/adobe/marketing/mobile/messaging/MessagingTestConstants.java @@ -254,7 +254,7 @@ public final class EventType { public static final String DISPLAY = "decisioning.propositionDisplay"; public static final String DISQUALIFY = "decisioning.propositionDisqualify"; public static final String SUPPRESS_DISPLAY = "decisioning.propositionSuppressDisplay"; - public static final String PERSONALIZATION_REQUEST = "personalization.request"; + public static final String PERSONALIZATION_REQUEST = "decisioning.propositionFetch"; public static final String PUSH_NOTIFICATION_EVENT_TYPE_STRING_OPENED = "pushTracking.applicationOpened"; public static final String PUSH_NOTIFICATION_EVENT_TYPE_STRING_CUSTOM_ACTION = "pushTracking.customAction"; From 4e47089da3d33099b37556a795032579f40cfd5a Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Fri, 17 Jul 2026 15:18:50 +0530 Subject: [PATCH 05/11] updated constant name --- .../adobe/marketing/mobile/messaging/E2EFunctionalTests.java | 4 ++-- .../mobile/messaging/EdgePersonalizationResponseHandler.java | 2 +- .../adobe/marketing/mobile/messaging/MessagingConstants.java | 2 +- .../marketing/mobile/messaging/MessagingTestConstants.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/messaging/src/androidTest/java/com/adobe/marketing/mobile/messaging/E2EFunctionalTests.java b/code/messaging/src/androidTest/java/com/adobe/marketing/mobile/messaging/E2EFunctionalTests.java index 8cc3e955..3d5d3dad 100644 --- a/code/messaging/src/androidTest/java/com/adobe/marketing/mobile/messaging/E2EFunctionalTests.java +++ b/code/messaging/src/androidTest/java/com/adobe/marketing/mobile/messaging/E2EFunctionalTests.java @@ -15,7 +15,7 @@ import static com.adobe.marketing.mobile.messaging.MessagingConstants.EventDataKeys.Messaging.Data.AdobeKeys.INAPP_RESPONSE_FORMAT; import static com.adobe.marketing.mobile.messaging.MessagingConstants.EventDataKeys.Messaging.Data.AdobeKeys.NAMESPACE; import static com.adobe.marketing.mobile.messaging.MessagingConstants.EventDataKeys.Messaging.Data.Value.NEW_IAM; -import static com.adobe.marketing.mobile.messaging.MessagingConstants.EventDataKeys.Messaging.Inbound.EventType.PERSONALIZATION_REQUEST; +import static com.adobe.marketing.mobile.messaging.MessagingConstants.EventDataKeys.Messaging.Inbound.EventType.PROPOSITION_FETCH; import static com.adobe.marketing.mobile.messaging.MessagingConstants.EventDataKeys.Messaging.Inbound.Key.PERSONALIZATION; import static com.adobe.marketing.mobile.messaging.MessagingConstants.EventDataKeys.Messaging.Inbound.Key.QUERY; import static com.adobe.marketing.mobile.messaging.MessagingConstants.EventDataKeys.Messaging.Inbound.Key.SCHEMAS; @@ -140,7 +140,7 @@ Map createExpectedEdgePersonalizationEventData() { final Map xdmData = new HashMap() { { - put(EVENT_TYPE, PERSONALIZATION_REQUEST); + put(EVENT_TYPE, PROPOSITION_FETCH); } }; expectedEdgePersonalizationEventData.put(XDM, xdmData); diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java index 31f395e0..62cbce6e 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java @@ -240,7 +240,7 @@ void fetchPropositions(final Event event, final List surfaces) { put( MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.EVENT_TYPE, MessagingConstants.EventDataKeys.Messaging.Inbound.EventType - .PERSONALIZATION_REQUEST); + .PROPOSITION_FETCH); } }; eventData.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.XDM, xdmData); diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java index 450a86e1..d08707c1 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/MessagingConstants.java @@ -273,7 +273,7 @@ final class Inbound { private Inbound() {} final class EventType { - static final String PERSONALIZATION_REQUEST = "decisioning.propositionFetch"; + static final String PROPOSITION_FETCH = "decisioning.propositionFetch"; private EventType() {} } diff --git a/code/messagingtestutils/src/main/java/com/adobe/marketing/mobile/messaging/MessagingTestConstants.java b/code/messagingtestutils/src/main/java/com/adobe/marketing/mobile/messaging/MessagingTestConstants.java index bc186112..64f2f9f4 100644 --- a/code/messagingtestutils/src/main/java/com/adobe/marketing/mobile/messaging/MessagingTestConstants.java +++ b/code/messagingtestutils/src/main/java/com/adobe/marketing/mobile/messaging/MessagingTestConstants.java @@ -254,7 +254,7 @@ public final class EventType { public static final String DISPLAY = "decisioning.propositionDisplay"; public static final String DISQUALIFY = "decisioning.propositionDisqualify"; public static final String SUPPRESS_DISPLAY = "decisioning.propositionSuppressDisplay"; - public static final String PERSONALIZATION_REQUEST = "decisioning.propositionFetch"; + public static final String PROPOSITION_FETCH = "decisioning.propositionFetch"; public static final String PUSH_NOTIFICATION_EVENT_TYPE_STRING_OPENED = "pushTracking.applicationOpened"; public static final String PUSH_NOTIFICATION_EVENT_TYPE_STRING_CUSTOM_ACTION = "pushTracking.customAction"; From a497598171c648b726893f417f34f4a40d6f61f5 Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Fri, 17 Jul 2026 17:27:10 +0530 Subject: [PATCH 06/11] fixed event type constant use --- .../mobile/messaging/EdgePersonalizationResponseHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java index cb8549b3..5c73142a 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java @@ -356,7 +356,7 @@ Map createPersonalizationRequestEventData( xdmData.put( MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.EVENT_TYPE, MessagingConstants.EventDataKeys.Messaging.Inbound.EventType - .PERSONALIZATION_REQUEST); + .PROPOSITION_FETCH); eventData.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.XDM, xdmData); // add a data object specifying the response format desired from XAS, merging any From e347483ce6ec0ba929230f8398434bc80d5c803c Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Fri, 17 Jul 2026 18:06:03 +0530 Subject: [PATCH 07/11] lint fix --- .../mobile/messaging/EdgePersonalizationResponseHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java index 5c73142a..2ca02341 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java @@ -355,8 +355,7 @@ Map createPersonalizationRequestEventData( } xdmData.put( MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.EVENT_TYPE, - MessagingConstants.EventDataKeys.Messaging.Inbound.EventType - .PROPOSITION_FETCH); + MessagingConstants.EventDataKeys.Messaging.Inbound.EventType.PROPOSITION_FETCH); eventData.put(MessagingConstants.EventDataKeys.Messaging.XDMDataKeys.XDM, xdmData); // add a data object specifying the response format desired from XAS, merging any From 92358c3aeae31b4b493f608a7f7812806c88c52a Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Fri, 17 Jul 2026 18:25:17 +0530 Subject: [PATCH 08/11] fixed unit test to use eventtype as decisioning.propositionFetch --- .../EdgePersonalizationResponseHandler.java | 4 ++-- .../EdgePersonalizationResponseHandlerTests.java | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java index 2ca02341..9faaa9a3 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java @@ -314,7 +314,7 @@ public void call(final Event responseCompleteEvent) { } /** - * Builds the event data for a {@code personalization.request} edge event for the provided + * Builds the event data for a {@code decisioning.propositionFetch} edge event for the provided * surface URIs. * *

Any {@code customXdm} is merged into the request XDM and any {@code customData} is merged @@ -347,7 +347,7 @@ Map createPersonalizationRequestEventData( eventData.put( MessagingConstants.EventDataKeys.Messaging.Inbound.Key.QUERY, messageRequestData); - // add xdm with an event type of personalization.request, merging any caller-provided XDM. + // add xdm with an event type of decisioning.propositionFetch, merging any caller-provided XDM. // the internal eventType is required and always wins over a caller-provided value. final Map xdmData = new HashMap<>(); if (customXdm != null && !customXdm.isEmpty()) { diff --git a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java index b5678938..b2c6a851 100644 --- a/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java +++ b/code/messaging/src/test/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandlerTests.java @@ -290,7 +290,7 @@ public void createPersonalizationRequestEventData_baseStructure_whenNoCustomXdmO expected = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/surface\"]," @@ -324,7 +324,7 @@ public void createPersonalizationRequestEventData_withCustomXdm() { expected = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"," + " \"_chipotle\":{\"restaurantId\":\"6099\"}}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," @@ -359,7 +359,7 @@ public void createPersonalizationRequestEventData_withCustomData() { expected = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"customKey\":\"customValue\"," + " \"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," @@ -396,7 +396,7 @@ public void createPersonalizationRequestEventData_customXdmCannotOverrideInterna expected = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"," + " \"_chipotle\":{\"restaurantId\":\"6099\"}}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," @@ -439,7 +439,7 @@ public void createPersonalizationRequestEventData_customXdmCannotOverrideInterna expected = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"customKey\":\"customValue\"," + " \"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," @@ -477,7 +477,7 @@ public void createPersonalizationRequestEventData_withCustomXdmAndData() { expected = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"," + " \"_chipotle\":{\"restaurantId\":\"6099\"}}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"customKey\":\"customValue\"," @@ -514,7 +514,7 @@ public void createPersonalizationRequestEventData_multipleSurfaces() { expected = JSONUtils.toMap( new JSONObject( - "{\"xdm\":{\"eventType\":\"personalization.request\"}," + "{\"xdm\":{\"eventType\":\"decisioning.propositionFetch\"}," + " \"request\":{\"sendCompletion\":true}," + " \"data\":{\"__adobe\":{\"ajo\":{\"in-app-response-format\":2}}}," + " \"query\":{\"personalization\":{\"surfaces\":[\"mobileapp://test/one\",\"mobileapp://test/two\"]," From 50d2375b863d7b25e3151512955598f85295634e Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Fri, 17 Jul 2026 18:42:53 +0530 Subject: [PATCH 09/11] lint fix --- .../mobile/messaging/EdgePersonalizationResponseHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java index 9faaa9a3..ed733347 100644 --- a/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java +++ b/code/messaging/src/main/java/com/adobe/marketing/mobile/messaging/EdgePersonalizationResponseHandler.java @@ -347,7 +347,8 @@ Map createPersonalizationRequestEventData( eventData.put( MessagingConstants.EventDataKeys.Messaging.Inbound.Key.QUERY, messageRequestData); - // add xdm with an event type of decisioning.propositionFetch, merging any caller-provided XDM. + // add xdm with an event type of decisioning.propositionFetch, merging any caller-provided + // XDM. // the internal eventType is required and always wins over a caller-provided value. final Map xdmData = new HashMap<>(); if (customXdm != null && !customXdm.isEmpty()) { From cebe5475e74e0369bbbd84ff3deea6e865b25fa6 Mon Sep 17 00:00:00 2001 From: akhiljain1907 Date: Mon, 10 Aug 2026 17:16:18 +0530 Subject: [PATCH 10/11] updated Github documentation for new api update propositions for surfaces with custom xdm support --- Documentation/sources/api-usage.md | 72 ++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/Documentation/sources/api-usage.md b/Documentation/sources/api-usage.md index 5f6bb688..c6afac25 100644 --- a/Documentation/sources/api-usage.md +++ b/Documentation/sources/api-usage.md @@ -254,6 +254,78 @@ Messaging.updatePropositionsForSurfaces(surfaces, success -> { }); ``` +### updatePropositionsForSurfaces(surfaces, xdm, data, callback) + +Dispatches an event for the Edge network extension to fetch personalization decisions from the AJO campaigns for the provided `Surface`s array, attaching optional custom XDM and free-form data fields to the personalization request. The returned decision `Proposition`s are cached in-memory by the Messaging extension. + +Any fields provided in `xdm` are merged into the XDM object of the outgoing personalization request. Any fields provided in `data` are merged into the free-form data object of the request. Internal keys required by the SDK — for example, the personalization request `eventType` — always take precedence and cannot be overwritten by the caller. + +If provided, `callback` will be called on the Messaging extension's background thread once the response has been fully processed. `true` will be passed to the `callback` if a network response was returned and successfully processed. + +To retrieve previously cached decision `Proposition`s, use `getPropositionsForSurfaces` API. + +#### Java + +##### Syntax + +```java +public static void updatePropositionsForSurfaces(@NonNull final List surfaces, @Nullable final Map xdm, @Nullable final Map data, @Nullable final AdobeCallback callback) +``` + +##### Example + +#### Kotlin + +```kotlin +val surface1 = Surface("myActivity#button") +val surface2 = Surface("myActivityAttributes") +val surfaces = listOf(surface1, surface2) + +// Custom XDM fields — e.g. context data used by decisioning eligibility rules +val xdmData = mapOf("userTier" to "gold", "loyaltyPoints" to 1200) + +// Optional free-form data attached to the request +val freeFormData = mapOf("campaignSource" to "homeScreen") + +Messaging.updatePropositionsForSurfaces(surfaces, xdmData, freeFormData) { success -> + if (success) { + // handle success scenario + } else { + // handle error scenario + } +} +``` + +#### Java + +```java +final Surface surface1 = new Surface("myActivity#button"); +final Surface surface2 = new Surface("myActivityAttributes"); + +final List surfaces = new ArrayList<>(); +surfaces.add(surface1); +surfaces.add(surface2); + +// Custom XDM fields — e.g. context data used by decisioning eligibility rules +final Map xdmData = new HashMap<>(); +xdmData.put("userTier", "gold"); +xdmData.put("loyaltyPoints", 1200); + +// Optional free-form data attached to the request +final Map freeFormData = new HashMap<>(); +freeFormData.put("campaignSource", "homeScreen"); + +Messaging.updatePropositionsForSurfaces(surfaces, xdmData, freeFormData, success -> { + if (success) { + // handle success scenario + } else { + // handle error scenario + } +}); +``` + +--- + ### getPropositionsForSurfaces Retrieves the previously fetched propositions from the SDK's in-memory propositions cache for the provided surfaces. The callback is invoked with the decision propositions corresponding to the given surfaces or `AdobeError`, if it occurs. From 95d91c77dedba8792b7694f0039dfa550ba20128 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 10 Aug 2026 11:56:46 +0000 Subject: [PATCH 11/11] Updating version to 3.11.0 --- code/gradle.properties | 2 +- .../src/phone/java/com/adobe/marketing/mobile/Messaging.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/gradle.properties b/code/gradle.properties index 80abe465..f5b43289 100644 --- a/code/gradle.properties +++ b/code/gradle.properties @@ -16,7 +16,7 @@ org.gradle.caching=true android.useAndroidX=true moduleName=messaging -moduleVersion=3.10.0 +moduleVersion=3.11.0 #Maven artifact mavenRepoName=AdobeMobileMessagingSdk diff --git a/code/messaging/src/phone/java/com/adobe/marketing/mobile/Messaging.java b/code/messaging/src/phone/java/com/adobe/marketing/mobile/Messaging.java index a54c669e..49a0306f 100644 --- a/code/messaging/src/phone/java/com/adobe/marketing/mobile/Messaging.java +++ b/code/messaging/src/phone/java/com/adobe/marketing/mobile/Messaging.java @@ -37,7 +37,7 @@ import java.util.concurrent.Executors; public final class Messaging { - private static final String EXTENSION_VERSION = "3.10.0"; + private static final String EXTENSION_VERSION = "3.11.0"; private static final String LOG_TAG = "Messaging"; private static final String CLASS_NAME = "Messaging";