From 24265515df99aef08068e24195a7a8c6fa58feac Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Thu, 25 Oct 2018 16:17:52 -0700 Subject: [PATCH 1/2] Remove Privacy Consent Requirement to Add Observers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Apps should be able to add observers (ie. addSubscriptionObserver) even if privacy consent has not yet been granted. --- .../src/main/java/com/onesignal/OneSignal.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java index dbc2ba6f3..38696b135 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java @@ -2591,10 +2591,6 @@ public static void removeNotificationReceivedHandler() { */ public static void addPermissionObserver(OSPermissionObserver observer) { - //if applicable, check if the user provided privacy consent - if (shouldLogUserPrivacyConsentErrorMessageForMethodName("addPermissionObserver()")) - return; - if (appContext == null) { Log(LOG_LEVEL.ERROR, "OneSignal.init has not been called. Could not add permission observer"); return; @@ -2632,10 +2628,6 @@ public static void removePermissionObserver(OSPermissionObserver observer) { */ public static void addSubscriptionObserver(OSSubscriptionObserver observer) { - //if applicable, check if the user provided privacy consent - if (shouldLogUserPrivacyConsentErrorMessageForMethodName("addSubscriptionObserver()")) - return; - if (appContext == null) { Log(LOG_LEVEL.ERROR, "OneSignal.init has not been called. Could not add subscription observer"); return; @@ -2670,10 +2662,6 @@ public static void removeSubscriptionObserver(OSSubscriptionObserver observer) { */ public static void addEmailSubscriptionObserver(@NonNull OSEmailSubscriptionObserver observer) { - //if applicable, check if the user provided privacy consent - if (shouldLogUserPrivacyConsentErrorMessageForMethodName("addEmailSubscriptionObserver()")) - return; - if (appContext == null) { Log(LOG_LEVEL.ERROR, "OneSignal.init has not been called. Could not add email subscription observer"); return; From 5a7e9f916dd1671b977ef4a33a5f9ed52ae4e070 Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Thu, 25 Oct 2018 16:34:35 -0700 Subject: [PATCH 2/2] Add Regression Tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Adds tests to make sure that apps can add the observers even if privacy consent hasn't been granted • The tests verify that the observers fire correctly once consent is granted. --- .../onesignal/MainOneSignalClassRunner.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java index d5f769dc6..130ceed7f 100644 --- a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java +++ b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java @@ -2352,6 +2352,83 @@ public void shouldReturnCorrectConsentRequiredStatusWhenSetBeforeInit() throws E assertTrue(OneSignal.userProvidedPrivacyConsent()); } + + // Functions to add observers (like addSubscriptionObserver) should continue + // to work even if privacy consent has not been granted. + @Test + public void shouldAddSubscriptionObserverIfConsentNotGranted() throws Exception { + OneSignal.setRequiresUserPrivacyConsent(true); + OneSignalInit(); + threadAndTaskWait(); + + OSSubscriptionObserver subscriptionObserver = new OSSubscriptionObserver() { + @Override + public void onOSSubscriptionChanged(OSSubscriptionStateChanges stateChanges) { + lastSubscriptionStateChanges = stateChanges; + currentSubscription = stateChanges.getTo().getSubscribed(); + } + }; + OneSignal.addSubscriptionObserver(subscriptionObserver); + lastSubscriptionStateChanges = null; + // Make sure garbage collection doesn't nuke any observers. + Runtime.getRuntime().gc(); + + OneSignal.provideUserConsent(true); + threadAndTaskWait(); + + // make sure the subscription observer was fired + assertTrue(lastSubscriptionStateChanges.getTo().getSubscribed()); + assertFalse(lastSubscriptionStateChanges.getFrom().getSubscribed()); + } + + @Test + public void shouldAddPermissionObserverIfConsentNotGranted() throws Exception { + OneSignal.setRequiresUserPrivacyConsent(true); + OneSignalInit(); + threadAndTaskWait(); + + OSPermissionObserver permissionObserver = new OSPermissionObserver() { + @Override + public void onOSPermissionChanged(OSPermissionStateChanges stateChanges) { + lastPermissionStateChanges = stateChanges; + currentPermission = stateChanges.getTo().getEnabled(); + } + }; + OneSignal.addPermissionObserver(permissionObserver); + + OneSignal.provideUserConsent(true); + threadAndTaskWait(); + + // make sure the permission observer was fired + assertFalse(lastPermissionStateChanges.getFrom().getEnabled()); + assertTrue(lastPermissionStateChanges.getTo().getEnabled()); + } + + @Test + public void shouldAddEmailSubscriptionObserverIfConsentNotGranted() throws Exception { + OneSignal.setRequiresUserPrivacyConsent(true); + OneSignalInit(); + OSEmailSubscriptionObserver subscriptionObserver = new OSEmailSubscriptionObserver() { + @Override + public void onOSEmailSubscriptionChanged(OSEmailSubscriptionStateChanges stateChanges) { + lastEmailSubscriptionStateChanges = stateChanges; + } + }; + OneSignal.addEmailSubscriptionObserver(subscriptionObserver); + + OneSignal.provideUserConsent(true); + threadAndTaskWait(); + + OneSignal.setEmail("josh@onesignal.com"); + threadAndTaskWait(); + + // make sure the email subscription observer was fired + assertNull(lastEmailSubscriptionStateChanges.getFrom().getEmailUserId()); + assertEquals("b007f967-98cc-11e4-bed1-118f05be4522", lastEmailSubscriptionStateChanges.getTo().getEmailUserId()); + assertEquals("josh@onesignal.com", lastEmailSubscriptionStateChanges.getTo().getEmailAddress()); + assertTrue(lastEmailSubscriptionStateChanges.getTo().getSubscribed()); + } + /* // Can't get test to work from a app flow due to the main thread being locked one way or another in a robolectric env. // Running ActivityLifecycleListener.focusHandlerThread...advanceToNextPostedRunnable waits on the main thread.