Skip to content

Commit 7f423fb

Browse files
eldhosembabumrober
authored andcommitted
Added api for removing dismiss listener. (#4492)
Added api for removing dismiss listener.
1 parent 007b60d commit 7f423fb

File tree

7 files changed

+113
-4
lines changed

7 files changed

+113
-4
lines changed

firebase-inappmessaging/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Unreleased
22
* [changed] Migrate firebase-inappmessaging SDK to use common executor pool.
33
* [changed] Refactoring to reduce load on app's Main thread.
4+
* [feature] Added new api for removing dismiss listener.
45

56
# 20.2.0
67
* [fixed] Fixed a bug that prevented marking more than one message as

firebase-inappmessaging/api.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ package com.google.firebase.inappmessaging {
1414
method @NonNull public static com.google.firebase.inappmessaging.FirebaseInAppMessaging getInstance();
1515
method public boolean isAutomaticDataCollectionEnabled();
1616
method public void removeClickListener(@NonNull com.google.firebase.inappmessaging.FirebaseInAppMessagingClickListener);
17+
method public void removeDismissListener(@NonNull com.google.firebase.inappmessaging.FirebaseInAppMessagingDismissListener);
1718
method public void removeDisplayErrorListener(@NonNull com.google.firebase.inappmessaging.FirebaseInAppMessagingDisplayErrorListener);
1819
method public void removeImpressionListener(@NonNull com.google.firebase.inappmessaging.FirebaseInAppMessagingImpressionListener);
1920
method public void setAutomaticDataCollectionEnabled(@Nullable Boolean);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
version=20.2.1
1+
version=20.3.0
22
latestReleasedVersion=20.2.0

firebase-inappmessaging/src/androidTest/java/com/google/firebase/inappmessaging/FirebaseInAppMessagingFlowableTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ public void onUnrelatedEvents_doesNotNotify() {
504504
analyticsConnector.invokeListenerOnEvent(ANALYTICS_EVENT_NAME);
505505
analyticsConnector.invokeListenerOnEvent("some_other_event");
506506
analyticsConnector.invokeListenerOnEvent(ANALYTICS_EVENT_NAME);
507-
await().timeout(2, SECONDS).until(() -> subscriber.valueCount() > 0);
507+
await().timeout(2, SECONDS).until(() -> subscriber.valueCount() > 1);
508508

509509
List<Object> triggeredMessages = getPlainValues(subscriber);
510510
assertThat(triggeredMessages.size()).isEqualTo(2);

firebase-inappmessaging/src/main/java/com/google/firebase/inappmessaging/FirebaseInAppMessaging.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,17 @@ public void removeDisplayErrorListener(
336336
developerListenerManager.removeDisplayErrorListener(displayErrorListener);
337337
}
338338

339+
/**
340+
* Unregisters a dismiss listener.
341+
*
342+
* @param dismissListener the listener callback to be removed which was added using {@link
343+
* #addDismissListener}
344+
*/
345+
public void removeDismissListener(
346+
@NonNull FirebaseInAppMessagingDismissListener dismissListener) {
347+
developerListenerManager.removeDismissListener(dismissListener);
348+
}
349+
339350
/**
340351
* Removes all registered listeners.
341352
*

firebase-inappmessaging/src/main/java/com/google/firebase/inappmessaging/internal/DeveloperListenerManager.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
package com.google.firebase.inappmessaging.internal;
1616

17+
import androidx.annotation.VisibleForTesting;
1718
import com.google.firebase.annotations.concurrent.Background;
1819
import com.google.firebase.inappmessaging.FirebaseInAppMessagingClickListener;
1920
import com.google.firebase.inappmessaging.FirebaseInAppMessagingDismissListener;
@@ -145,10 +146,25 @@ public void removeDisplayErrorListener(
145146
registeredErrorListeners.remove(displayErrorListener);
146147
}
147148

149+
public void removeDismissListener(FirebaseInAppMessagingDismissListener dismissListener) {
150+
registeredDismissListeners.remove(dismissListener);
151+
}
152+
148153
public void removeAllListeners() {
149154
registeredClickListeners.clear();
150155
registeredImpressionListeners.clear();
151156
registeredErrorListeners.clear();
157+
registeredDismissListeners.clear();
158+
}
159+
160+
@VisibleForTesting
161+
public Map getAllListeners() {
162+
Map listeners = new HashMap();
163+
listeners.putAll(registeredClickListeners);
164+
listeners.putAll(registeredImpressionListeners);
165+
listeners.putAll(registeredErrorListeners);
166+
listeners.putAll(registeredDismissListeners);
167+
return listeners;
152168
}
153169

154170
private abstract static class ExecutorAndListener<T> {

firebase-inappmessaging/src/test/java/com/google/firebase/inappmessaging/FirebaseInAppMessagingTest.java

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import android.app.Application;
3131
import androidx.annotation.NonNull;
32+
import androidx.annotation.Nullable;
3233
import androidx.test.core.app.ApplicationProvider;
3334
import com.google.android.gms.tasks.Tasks;
3435
import com.google.firebase.FirebaseApp;
@@ -56,10 +57,12 @@
5657
import io.reactivex.Flowable;
5758
import io.reactivex.FlowableEmitter;
5859
import io.reactivex.Maybe;
60+
import java.util.Map;
5961
import org.junit.Before;
6062
import org.junit.Test;
6163
import org.junit.runner.RunWith;
6264
import org.mockito.Mock;
65+
import org.mockito.Mockito;
6366
import org.mockito.MockitoAnnotations;
6467
import org.robolectric.RobolectricTestRunner;
6568
import org.robolectric.annotation.Config;
@@ -151,9 +154,8 @@ public Builder toBuilder() {
151154
@Mock private FirebaseInAppMessagingDisplayCallbacks displayCallbacks;
152155
@Mock private ProgramaticContextualTriggers programaticContextualTriggers;
153156

154-
@Mock
155157
DeveloperListenerManager developerListenerManager =
156-
new DeveloperListenerManager(TestOnlyExecutors.background());
158+
Mockito.spy(new DeveloperListenerManager(TestOnlyExecutors.background()));
157159

158160
FirebaseApp firebaseApp1;
159161
FirebaseOptions options;
@@ -214,6 +216,8 @@ public void setup() {
214216
displayCallbacksFactory,
215217
developerListenerManager,
216218
TestOnlyExecutors.lite());
219+
220+
developerListenerManager.removeAllListeners();
217221
}
218222

219223
@Test
@@ -299,4 +303,80 @@ public void addDisplayErrorListener_forwardsEventListenerRequestsToDeveloperList
299303
firebaseInAppMessaging.addDisplayErrorListener((inAppMessage, error) -> {});
300304
verify(developerListenerManager, times(1)).addDisplayErrorListener(any());
301305
}
306+
307+
@Test
308+
public void addRemoveListeners_WorksAsExpected() {
309+
FirebaseInAppMessagingClickListener clickListener = (inAppMessage, action) -> {};
310+
FirebaseInAppMessagingDismissListener dismissListener = inAppMessage -> {};
311+
FirebaseInAppMessagingImpressionListener impressionListener = inAppMessage -> {};
312+
FirebaseInAppMessagingDisplayErrorListener displayErrorListener = (inAppMessage, error) -> {};
313+
314+
verifyListenerPresenceAndListenersCountMatch(null, false, 0);
315+
316+
firebaseInAppMessaging.addClickListener(clickListener);
317+
verifyListenerPresenceAndListenersCountMatch(clickListener, true, 1);
318+
319+
firebaseInAppMessaging.addDismissListener(dismissListener);
320+
verifyListenerPresenceAndListenersCountMatch(dismissListener, true, 2);
321+
322+
firebaseInAppMessaging.addImpressionListener(impressionListener);
323+
verifyListenerPresenceAndListenersCountMatch(impressionListener, true, 3);
324+
325+
firebaseInAppMessaging.addDisplayErrorListener(displayErrorListener);
326+
verifyListenerPresenceAndListenersCountMatch(displayErrorListener, true, 4);
327+
328+
firebaseInAppMessaging.removeClickListener(clickListener);
329+
verifyListenerPresenceAndListenersCountMatch(clickListener, false, 3);
330+
331+
firebaseInAppMessaging.removeDismissListener(dismissListener);
332+
verifyListenerPresenceAndListenersCountMatch(dismissListener, false, 2);
333+
334+
firebaseInAppMessaging.removeImpressionListener(impressionListener);
335+
verifyListenerPresenceAndListenersCountMatch(impressionListener, false, 1);
336+
337+
firebaseInAppMessaging.removeDisplayErrorListener(displayErrorListener);
338+
verifyListenerPresenceAndListenersCountMatch(displayErrorListener, false, 0);
339+
340+
verifyListenerPresenceAndListenersCountMatch(null, false, 0);
341+
}
342+
343+
@Test
344+
public void addRemoveAllListeners_WorksAsExpected() {
345+
FirebaseInAppMessagingClickListener clickListener = (inAppMessage, action) -> {};
346+
FirebaseInAppMessagingDismissListener dismissListener = inAppMessage -> {};
347+
FirebaseInAppMessagingImpressionListener impressionListener = inAppMessage -> {};
348+
FirebaseInAppMessagingDisplayErrorListener displayErrorListener = (inAppMessage, error) -> {};
349+
350+
verifyListenerPresenceAndListenersCountMatch(null, false, 0);
351+
352+
firebaseInAppMessaging.addClickListener(clickListener);
353+
firebaseInAppMessaging.addDismissListener(dismissListener);
354+
firebaseInAppMessaging.addImpressionListener(impressionListener);
355+
firebaseInAppMessaging.addDisplayErrorListener(displayErrorListener);
356+
357+
verifyListenerPresenceAndListenersCountMatch(null, false, 4);
358+
359+
firebaseInAppMessaging.removeAllListeners();
360+
361+
verifyListenerPresenceAndListenersCountMatch(null, false, 0);
362+
}
363+
364+
/**
365+
* Verifies the presence of the provided listener in the set of listeners inside
366+
* DeveloperListenerManager.
367+
*
368+
* @param listener the listener object or null. If null, only count verification will be done.
369+
* @param shouldPresent should be present or absent.
370+
* @param listenersCount the number of listeners that should be present.
371+
*/
372+
private void verifyListenerPresenceAndListenersCountMatch(
373+
@Nullable Object listener, boolean shouldPresent, int listenersCount) {
374+
Map listeners = developerListenerManager.getAllListeners();
375+
376+
if (listener != null) {
377+
assertThat(listeners.containsKey(listener)).isEqualTo(shouldPresent);
378+
}
379+
380+
assertThat(listeners.keySet().size()).isEqualTo(listenersCount);
381+
}
302382
}

0 commit comments

Comments
 (0)