diff --git a/button-merchant/src/main/java/com/usebutton/merchant/ButtonApi.java b/button-merchant/src/main/java/com/usebutton/merchant/ButtonApi.java index 4ad13af..57b40e3 100644 --- a/button-merchant/src/main/java/com/usebutton/merchant/ButtonApi.java +++ b/button-merchant/src/main/java/com/usebutton/merchant/ButtonApi.java @@ -46,11 +46,6 @@ PostInstallLink getPendingLink(String applicationId, @Nullable String advertisin Map signalsMap) throws ButtonNetworkException; - @Nullable - @WorkerThread - Void postActivity(String applicationId, String sourceToken, String timestamp, Order order) - throws ButtonNetworkException; - @Nullable @WorkerThread Void postOrder(Order order, String applicationId, String sourceToken, diff --git a/button-merchant/src/main/java/com/usebutton/merchant/ButtonApiImpl.java b/button-merchant/src/main/java/com/usebutton/merchant/ButtonApiImpl.java index 1e67392..1c2fb52 100644 --- a/button-merchant/src/main/java/com/usebutton/merchant/ButtonApiImpl.java +++ b/button-merchant/src/main/java/com/usebutton/merchant/ButtonApiImpl.java @@ -112,36 +112,6 @@ public PostInstallLink getPendingLink(String applicationId, @Nullable String adv return null; } - @Override - public Void postActivity(String applicationId, String sourceToken, String timestamp, - Order order) throws ButtonNetworkException { - - try { - // Create request body - JSONObject requestBody = new JSONObject(); - requestBody.put("app_id", applicationId); - requestBody.put("user_local_time", timestamp); - requestBody.put("btn_ref", sourceToken); - requestBody.put("order_id", order.getId()); - requestBody.put("total", order.getAmount()); - requestBody.put("currency", order.getCurrencyCode()); - requestBody.put("source", "merchant-library"); - - ApiRequest apiRequest = new ApiRequest.Builder(ApiRequest.RequestMethod.POST, - "/v1/activity/order") - .setBody(requestBody) - .build(); - - // Execute POST request and parse response - connectionManager.executeRequest(apiRequest); - } catch (JSONException e) { - Log.e(TAG, "Error creating request body", e); - throw new ButtonNetworkException(e); - } - - return null; - } - @Nullable @Override public Void postOrder(Order order, String applicationId, String sourceToken, diff --git a/button-merchant/src/main/java/com/usebutton/merchant/ButtonInternal.java b/button-merchant/src/main/java/com/usebutton/merchant/ButtonInternal.java index c7039cc..aa2eaf2 100644 --- a/button-merchant/src/main/java/com/usebutton/merchant/ButtonInternal.java +++ b/button-merchant/src/main/java/com/usebutton/merchant/ButtonInternal.java @@ -44,9 +44,6 @@ interface ButtonInternal { void trackIncomingIntent(ButtonRepository buttonRepository, DeviceManager deviceManager, Features features, Intent intent); - void trackOrder(ButtonRepository buttonRepository, DeviceManager manager, - @NonNull Order order, @Nullable UserActivityListener listener); - @Nullable String getAttributionToken(ButtonRepository buttonRepository); diff --git a/button-merchant/src/main/java/com/usebutton/merchant/ButtonInternalImpl.java b/button-merchant/src/main/java/com/usebutton/merchant/ButtonInternalImpl.java index 0e748a4..6f4b938 100644 --- a/button-merchant/src/main/java/com/usebutton/merchant/ButtonInternalImpl.java +++ b/button-merchant/src/main/java/com/usebutton/merchant/ButtonInternalImpl.java @@ -100,52 +100,6 @@ public void trackIncomingIntent(ButtonRepository buttonRepository, DeviceManager reportDeeplinkOpenEvent(buttonRepository, deviceManager, features, data); } - @Override - public void trackOrder(ButtonRepository buttonRepository, DeviceManager manager, - @NonNull Order order, @Nullable final UserActivityListener listener) { - if (buttonRepository.getApplicationId() == null) { - if (listener != null) { - executor.execute(new Runnable() { - @Override - public void run() { - listener.onResult(new ApplicationIdNotFoundException()); - } - }); - } - - return; - } - - /// Create internal class that will forward callback to the UserActivityListener - Task.Listener taskListener = new Task.Listener() { - @Override - public void onTaskComplete(@Nullable Object object) { - if (listener != null) { - executor.execute(new Runnable() { - @Override - public void run() { - listener.onResult(null); - } - }); - } - } - - @Override - public void onTaskError(final Throwable throwable) { - if (listener != null) { - executor.execute(new Runnable() { - @Override - public void run() { - listener.onResult(throwable); - } - }); - } - } - }; - - buttonRepository.postUserActivity(manager, order, taskListener); - } - @Nullable @Override public String getAttributionToken(ButtonRepository buttonRepository) { diff --git a/button-merchant/src/main/java/com/usebutton/merchant/ButtonMerchant.java b/button-merchant/src/main/java/com/usebutton/merchant/ButtonMerchant.java index 39161f2..611afd1 100644 --- a/button-merchant/src/main/java/com/usebutton/merchant/ButtonMerchant.java +++ b/button-merchant/src/main/java/com/usebutton/merchant/ButtonMerchant.java @@ -88,8 +88,11 @@ public static void trackIncomingIntent(@NonNull Context context, @NonNull Intent @Deprecated public static void trackOrder(@NonNull Context context, @NonNull Order order, @Nullable UserActivityListener userActivityListener) { - buttonInternal.trackOrder(getButtonRepository(context), getDeviceManager(context), order, - userActivityListener); + if (userActivityListener != null) { + Throwable error = new Throwable("trackOrder(~) is no longer supported." + + " You can safely remove your usage of this method."); + userActivityListener.onResult(error); + } } /** diff --git a/button-merchant/src/main/java/com/usebutton/merchant/ButtonRepository.java b/button-merchant/src/main/java/com/usebutton/merchant/ButtonRepository.java index c303351..9e55030 100644 --- a/button-merchant/src/main/java/com/usebutton/merchant/ButtonRepository.java +++ b/button-merchant/src/main/java/com/usebutton/merchant/ButtonRepository.java @@ -49,8 +49,6 @@ interface ButtonRepository { void getPendingLink(DeviceManager deviceManager, Features features, Task.Listener listener); - void postUserActivity(DeviceManager deviceManager, Order order, Task.Listener listener); - boolean checkedDeferredDeepLink(); void updateCheckDeferredDeepLink(boolean checkedDeferredDeepLink); diff --git a/button-merchant/src/main/java/com/usebutton/merchant/ButtonRepositoryImpl.java b/button-merchant/src/main/java/com/usebutton/merchant/ButtonRepositoryImpl.java index 8586958..c434703 100644 --- a/button-merchant/src/main/java/com/usebutton/merchant/ButtonRepositoryImpl.java +++ b/button-merchant/src/main/java/com/usebutton/merchant/ButtonRepositoryImpl.java @@ -106,13 +106,6 @@ public void getPendingLink(DeviceManager deviceManager, Features features, executorService.submit(getPendingLinkTask); } - @Override - public void postUserActivity(DeviceManager deviceManager, Order order, Task.Listener listener) { - executorService.submit( - new UserActivityTask(listener, buttonApi, getApplicationId(), getSourceToken(), - deviceManager, order)); - } - @Override public boolean checkedDeferredDeepLink() { return persistenceManager.checkedDeferredDeepLink(); diff --git a/button-merchant/src/main/java/com/usebutton/merchant/UserActivityTask.java b/button-merchant/src/main/java/com/usebutton/merchant/UserActivityTask.java deleted file mode 100644 index 831dcd1..0000000 --- a/button-merchant/src/main/java/com/usebutton/merchant/UserActivityTask.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * UserActivityTask.java - * - * Copyright (c) 2018 Button, Inc. (https://usebutton.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -package com.usebutton.merchant; - -import android.support.annotation.Nullable; - -/** - * Asynchronous task used to report user activity to the Button API. - */ -class UserActivityTask extends Task { - - private final ButtonApi buttonApi; - private final String applicationId; - private final String sourceToken; - private final DeviceManager deviceManager; - private final Order order; - - UserActivityTask(Listener listener, ButtonApi buttonApi, - String applicationId, String sourceToken, DeviceManager deviceManager, - Order order) { - super(listener); - this.buttonApi = buttonApi; - this.applicationId = applicationId; - this.sourceToken = sourceToken; - this.deviceManager = deviceManager; - this.order = order; - } - - @Nullable - @Override - Void execute() throws Exception { - return buttonApi.postActivity(applicationId, sourceToken, deviceManager.getTimeStamp(), - order); - } -} diff --git a/button-merchant/src/test/java/com/usebutton/merchant/ButtonApiImplTest.java b/button-merchant/src/test/java/com/usebutton/merchant/ButtonApiImplTest.java index 4256388..f31a4bf 100644 --- a/button-merchant/src/test/java/com/usebutton/merchant/ButtonApiImplTest.java +++ b/button-merchant/src/test/java/com/usebutton/merchant/ButtonApiImplTest.java @@ -134,42 +134,6 @@ public void getPendingLink_returnsException_catchException() throws Exception { Collections.emptyMap()); } - @Test(expected = ButtonNetworkException.class) - public void postUserActivity_returnsException_catchException() throws Exception { - when(connectionManager.executeRequest(any(ApiRequest.class))) - .thenThrow(ButtonNetworkException.class); - - Order order = new Order.Builder("123").setCurrencyCode("AUG").build(); - buttonApi.postActivity("valid_application_id", "valid_aid", "valid_ts", order); - } - - @Test - public void postUserActivity_validateRequest() throws Exception { - ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(ApiRequest.class); - JSONObject body = new JSONObject("{\"meta\":{\"status\":\"ok\"}}\n"); - NetworkResponse response = new NetworkResponse(200, body); - when(connectionManager.executeRequest(argumentCaptor.capture())) - .thenReturn(response); - - Order order = new Order.Builder("123").setAmount(999).setCurrencyCode("AUG").build(); - buttonApi.postActivity("valid_application_id", "valid_aid", "valid_ts", order); - - ApiRequest apiRequest = argumentCaptor.getValue(); - JSONObject requestBody = apiRequest.getBody(); - - assertEquals(ApiRequest.RequestMethod.POST, apiRequest.getRequestMethod()); - assertEquals("/v1/activity/order", apiRequest.getPath()); - - // request body - assertEquals("valid_application_id", requestBody.getString("app_id")); - assertEquals("valid_ts", requestBody.getString("user_local_time")); - assertEquals("valid_aid", requestBody.getString("btn_ref")); - assertEquals("123", requestBody.getString("order_id")); - assertEquals(999, requestBody.getLong("total")); - assertEquals("AUG", requestBody.getString("currency")); - assertEquals("merchant-library", requestBody.getString("source")); - } - @Test public void postOrder_validateRequestMethodAndPath() throws Exception { Order order = new Order.Builder("123", new Date(), Collections.emptyList()) diff --git a/button-merchant/src/test/java/com/usebutton/merchant/ButtonInternalImplTest.java b/button-merchant/src/test/java/com/usebutton/merchant/ButtonInternalImplTest.java index 36bf8dd..149f555 100644 --- a/button-merchant/src/test/java/com/usebutton/merchant/ButtonInternalImplTest.java +++ b/button-merchant/src/test/java/com/usebutton/merchant/ButtonInternalImplTest.java @@ -36,8 +36,6 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import java.util.concurrent.Executor; @@ -49,7 +47,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -113,129 +110,6 @@ public void trackIncomingIntent_withNullIntentData_doNotPersist() { verify(buttonRepository, never()).setSourceToken(anyString()); } - @Test - public void trackIncomingIntent_withValidIntentData_shouldReportDeeplinkOpenEvent() { - ButtonRepository buttonRepository = mock(ButtonRepository.class); - Intent intent = mock(Intent.class); - Uri uri = mock(Uri.class); - Uri.Builder builder = mock(Uri.Builder.class); - when(intent.getData()).thenReturn(uri); - when(uri.buildUpon()).thenReturn(builder); - when(uri.buildUpon().clearQuery()).thenReturn(builder); - when(builder.build()).thenReturn(uri); - when(uri.getQueryParameter("btn_ref")).thenReturn("valid_source_token"); - ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(Event.class); - - buttonInternal.trackIncomingIntent(buttonRepository, mock(DeviceManager.class), - mock(Features.class), intent); - - verify(buttonRepository).reportEvent(any(DeviceManager.class), any(Features.class), - eventCaptor.capture()); - Event event = eventCaptor.getValue(); - - assertEquals(Event.Name.DEEPLINK_OPENED, event.getName()); - } - - @Test - public void trackIncomingIntent_withNullIntentData_shouldNotReportDeeplinkOpenEvent() { - ButtonRepository buttonRepository = mock(ButtonRepository.class); - Intent intent = mock(Intent.class); - when(intent.getData()).thenReturn(null); - - buttonInternal.trackIncomingIntent(buttonRepository, mock(DeviceManager.class), - mock(Features.class), intent); - - verify(buttonRepository, never()).reportEvent(any(DeviceManager.class), - any(Features.class), any(Event.class)); - } - - @Test - public void trackOrder_withValidParams_NonNullListener() { - ButtonRepository buttonRepository = mock(ButtonRepository.class); - - when(buttonRepository.getApplicationId()).thenReturn("valid_id"); - buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class), - mock(UserActivityListener.class)); - - verify(buttonRepository).postUserActivity(any(DeviceManager.class), any(Order.class), - any(Task.Listener.class)); - } - - @Test - public void trackOrder_nullApplicationId() { - ButtonRepository buttonRepository = mock(ButtonRepository.class); - UserActivityListener listener = mock(UserActivityListener.class); - - when(buttonRepository.getApplicationId()).thenReturn(null); - buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class), - listener); - - verify(listener).onResult(any(ApplicationIdNotFoundException.class)); - verify(buttonRepository, never()).postUserActivity(any(DeviceManager.class), - any(Order.class), - any(Task.Listener.class)); - } - - @Test - public void trackOrder_nullApplicationIdAndListener() { - ButtonRepository buttonRepository = mock(ButtonRepository.class); - - when(buttonRepository.getApplicationId()).thenReturn(null); - buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class), - null); - - verify(buttonRepository, never()).postUserActivity(any(DeviceManager.class), - any(Order.class), - any(Task.Listener.class)); - } - - @Test - public void trackOrder_validateUserActivityListenerOnSuccess() { - ButtonRepository buttonRepository = mock(ButtonRepository.class); - final UserActivityListener listener = mock(UserActivityListener.class); - - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - final Task.Listener listener1 = invocation.getArgument(2); - listener1.onTaskComplete(null); - return null; - } - }).when(buttonRepository) - .postUserActivity(any(DeviceManager.class), any(Order.class), - any(Task.Listener.class)); - - when(buttonRepository.getApplicationId()).thenReturn("valid_id"); - - buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class), - listener); - verify(listener).onResult(null); - } - - @Test - public void trackOrder_validateUserActivityListenerOnError() { - ButtonRepository buttonRepository = mock(ButtonRepository.class); - final UserActivityListener listener = mock(UserActivityListener.class); - final Throwable throwable = new ButtonNetworkException(""); - - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - final Task.Listener listener1 = invocation.getArgument(2); - listener1.onTaskError(throwable); - return null; - } - }).when(buttonRepository) - .postUserActivity(any(DeviceManager.class), any(Order.class), - any(Task.Listener.class)); - - when(buttonRepository.getApplicationId()).thenReturn("valid_id"); - - buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class), - listener); - verify(listener).onResult(throwable); - } - @Test public void setAttributionToken_ShouldNotifyListenersWithToken() { String validToken = "valid_source_token"; diff --git a/button-merchant/src/test/java/com/usebutton/merchant/ButtonMerchantTest.java b/button-merchant/src/test/java/com/usebutton/merchant/ButtonMerchantTest.java index f99e942..6333dd6 100644 --- a/button-merchant/src/test/java/com/usebutton/merchant/ButtonMerchantTest.java +++ b/button-merchant/src/test/java/com/usebutton/merchant/ButtonMerchantTest.java @@ -46,6 +46,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; public class ButtonMerchantTest { @@ -94,10 +95,13 @@ public void trackIncomingIntent_verifyButtonInternal() { } @Test - public void trackOrder_verifyButtonInternal() { - ButtonMerchant.trackOrder(context, mock(Order.class), mock(UserActivityListener.class)); - verify(buttonInternal).trackOrder(any(ButtonRepository.class), any(DeviceManager.class), - any(Order.class), any(UserActivityListener.class)); + public void trackOrder_verifyDeprecation() { + UserActivityListener listener = mock(UserActivityListener.class); + + ButtonMerchant.trackOrder(context, mock(Order.class), listener); + + verify(listener).onResult(any(Throwable.class)); + verifyZeroInteractions(buttonInternal); } @Test diff --git a/button-merchant/src/test/java/com/usebutton/merchant/ButtonRepositoryImplTest.java b/button-merchant/src/test/java/com/usebutton/merchant/ButtonRepositoryImplTest.java index ca07edf..db8f899 100644 --- a/button-merchant/src/test/java/com/usebutton/merchant/ButtonRepositoryImplTest.java +++ b/button-merchant/src/test/java/com/usebutton/merchant/ButtonRepositoryImplTest.java @@ -108,14 +108,6 @@ public void getPendingLink_executeTask() { verify(executorService).submit(any(GetPendingLinkTask.class)); } - @Test - public void postUserActivity_executeTask() { - buttonRepository.postUserActivity(mock(DeviceManager.class), mock(Order.class), - mock(Task.Listener.class)); - - verify(executorService).submit(any(UserActivityTask.class)); - } - @Test public void checkedDeferredDeepLink_retrieveFromPersistenceManager() { when(persistenceManager.checkedDeferredDeepLink()).thenReturn(true); diff --git a/button-merchant/src/test/java/com/usebutton/merchant/UserActivityTaskTest.java b/button-merchant/src/test/java/com/usebutton/merchant/UserActivityTaskTest.java deleted file mode 100644 index f566a2c..0000000 --- a/button-merchant/src/test/java/com/usebutton/merchant/UserActivityTaskTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * GetPendingLinkTaskTest.java - * - * Copyright (c) 2018 Button, Inc. (https://usebutton.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -package com.usebutton.merchant; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class UserActivityTaskTest { - - @Mock - private ButtonApi buttonApi; - - @Mock - private DeviceManager deviceManager; - - @Mock - private Task.Listener listener; - - private String applicationId = "valid_application_id"; - private String sourceToken = "valid_source_token"; - private Order order = new Order.Builder("123").build(); - - private UserActivityTask task; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - task = new UserActivityTask(listener, buttonApi, applicationId, sourceToken, deviceManager, - order); - } - - @Test - public void execute_verifyApiCall() throws Exception { - when(deviceManager.getTimeStamp()).thenReturn("valid_ts"); - - task.execute(); - verify(buttonApi).postActivity(applicationId, sourceToken, "valid_ts", order); - } -} \ No newline at end of file