Skip to content

Commit

Permalink
Added api for removing dismiss listener. (#4492)
Browse files Browse the repository at this point in the history
Added api for removing dismiss listener.
  • Loading branch information
eldhosembabu committed Jan 4, 2023
1 parent 2c27445 commit f1e092b
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 4 deletions.
1 change: 1 addition & 0 deletions firebase-inappmessaging/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Unreleased
* [changed] Migrate firebase-inappmessaging SDK to use common executor pool.
* [changed] Refactoring to reduce load on app's Main thread.
* [feature] Added new api for removing dismiss listener.

# 20.2.0
* [fixed] Fixed a bug that prevented marking more than one message as
Expand Down
1 change: 1 addition & 0 deletions firebase-inappmessaging/api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ package com.google.firebase.inappmessaging {
method @NonNull public static com.google.firebase.inappmessaging.FirebaseInAppMessaging getInstance();
method public boolean isAutomaticDataCollectionEnabled();
method public void removeClickListener(@NonNull com.google.firebase.inappmessaging.FirebaseInAppMessagingClickListener);
method public void removeDismissListener(@NonNull com.google.firebase.inappmessaging.FirebaseInAppMessagingDismissListener);
method public void removeDisplayErrorListener(@NonNull com.google.firebase.inappmessaging.FirebaseInAppMessagingDisplayErrorListener);
method public void removeImpressionListener(@NonNull com.google.firebase.inappmessaging.FirebaseInAppMessagingImpressionListener);
method public void setAutomaticDataCollectionEnabled(@Nullable Boolean);
Expand Down
2 changes: 1 addition & 1 deletion firebase-inappmessaging/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
version=20.2.1
version=20.3.0
latestReleasedVersion=20.2.0
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,7 @@ public void onUnrelatedEvents_doesNotNotify() {
analyticsConnector.invokeListenerOnEvent(ANALYTICS_EVENT_NAME);
analyticsConnector.invokeListenerOnEvent("some_other_event");
analyticsConnector.invokeListenerOnEvent(ANALYTICS_EVENT_NAME);
await().timeout(2, SECONDS).until(() -> subscriber.valueCount() > 0);
await().timeout(2, SECONDS).until(() -> subscriber.valueCount() > 1);

List<Object> triggeredMessages = getPlainValues(subscriber);
assertThat(triggeredMessages.size()).isEqualTo(2);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,17 @@ public void removeDisplayErrorListener(
developerListenerManager.removeDisplayErrorListener(displayErrorListener);
}

/**
* Unregisters a dismiss listener.
*
* @param dismissListener the listener callback to be removed which was added using {@link
* #addDismissListener}
*/
public void removeDismissListener(
@NonNull FirebaseInAppMessagingDismissListener dismissListener) {
developerListenerManager.removeDismissListener(dismissListener);
}

/**
* Removes all registered listeners.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package com.google.firebase.inappmessaging.internal;

import androidx.annotation.VisibleForTesting;
import com.google.firebase.annotations.concurrent.Background;
import com.google.firebase.inappmessaging.FirebaseInAppMessagingClickListener;
import com.google.firebase.inappmessaging.FirebaseInAppMessagingDismissListener;
Expand Down Expand Up @@ -145,10 +146,25 @@ public void removeDisplayErrorListener(
registeredErrorListeners.remove(displayErrorListener);
}

public void removeDismissListener(FirebaseInAppMessagingDismissListener dismissListener) {
registeredDismissListeners.remove(dismissListener);
}

public void removeAllListeners() {
registeredClickListeners.clear();
registeredImpressionListeners.clear();
registeredErrorListeners.clear();
registeredDismissListeners.clear();
}

@VisibleForTesting
public Map getAllListeners() {
Map listeners = new HashMap();
listeners.putAll(registeredClickListeners);
listeners.putAll(registeredImpressionListeners);
listeners.putAll(registeredErrorListeners);
listeners.putAll(registeredDismissListeners);
return listeners;
}

private abstract static class ExecutorAndListener<T> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

import android.app.Application;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.test.core.app.ApplicationProvider;
import com.google.android.gms.tasks.Tasks;
import com.google.firebase.FirebaseApp;
Expand Down Expand Up @@ -56,10 +57,12 @@
import io.reactivex.Flowable;
import io.reactivex.FlowableEmitter;
import io.reactivex.Maybe;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
Expand Down Expand Up @@ -151,9 +154,8 @@ public Builder toBuilder() {
@Mock private FirebaseInAppMessagingDisplayCallbacks displayCallbacks;
@Mock private ProgramaticContextualTriggers programaticContextualTriggers;

@Mock
DeveloperListenerManager developerListenerManager =
new DeveloperListenerManager(TestOnlyExecutors.background());
Mockito.spy(new DeveloperListenerManager(TestOnlyExecutors.background()));

FirebaseApp firebaseApp1;
FirebaseOptions options;
Expand Down Expand Up @@ -214,6 +216,8 @@ public void setup() {
displayCallbacksFactory,
developerListenerManager,
TestOnlyExecutors.lite());

developerListenerManager.removeAllListeners();
}

@Test
Expand Down Expand Up @@ -299,4 +303,80 @@ public void addDisplayErrorListener_forwardsEventListenerRequestsToDeveloperList
firebaseInAppMessaging.addDisplayErrorListener((inAppMessage, error) -> {});
verify(developerListenerManager, times(1)).addDisplayErrorListener(any());
}

@Test
public void addRemoveListeners_WorksAsExpected() {
FirebaseInAppMessagingClickListener clickListener = (inAppMessage, action) -> {};
FirebaseInAppMessagingDismissListener dismissListener = inAppMessage -> {};
FirebaseInAppMessagingImpressionListener impressionListener = inAppMessage -> {};
FirebaseInAppMessagingDisplayErrorListener displayErrorListener = (inAppMessage, error) -> {};

verifyListenerPresenceAndListenersCountMatch(null, false, 0);

firebaseInAppMessaging.addClickListener(clickListener);
verifyListenerPresenceAndListenersCountMatch(clickListener, true, 1);

firebaseInAppMessaging.addDismissListener(dismissListener);
verifyListenerPresenceAndListenersCountMatch(dismissListener, true, 2);

firebaseInAppMessaging.addImpressionListener(impressionListener);
verifyListenerPresenceAndListenersCountMatch(impressionListener, true, 3);

firebaseInAppMessaging.addDisplayErrorListener(displayErrorListener);
verifyListenerPresenceAndListenersCountMatch(displayErrorListener, true, 4);

firebaseInAppMessaging.removeClickListener(clickListener);
verifyListenerPresenceAndListenersCountMatch(clickListener, false, 3);

firebaseInAppMessaging.removeDismissListener(dismissListener);
verifyListenerPresenceAndListenersCountMatch(dismissListener, false, 2);

firebaseInAppMessaging.removeImpressionListener(impressionListener);
verifyListenerPresenceAndListenersCountMatch(impressionListener, false, 1);

firebaseInAppMessaging.removeDisplayErrorListener(displayErrorListener);
verifyListenerPresenceAndListenersCountMatch(displayErrorListener, false, 0);

verifyListenerPresenceAndListenersCountMatch(null, false, 0);
}

@Test
public void addRemoveAllListeners_WorksAsExpected() {
FirebaseInAppMessagingClickListener clickListener = (inAppMessage, action) -> {};
FirebaseInAppMessagingDismissListener dismissListener = inAppMessage -> {};
FirebaseInAppMessagingImpressionListener impressionListener = inAppMessage -> {};
FirebaseInAppMessagingDisplayErrorListener displayErrorListener = (inAppMessage, error) -> {};

verifyListenerPresenceAndListenersCountMatch(null, false, 0);

firebaseInAppMessaging.addClickListener(clickListener);
firebaseInAppMessaging.addDismissListener(dismissListener);
firebaseInAppMessaging.addImpressionListener(impressionListener);
firebaseInAppMessaging.addDisplayErrorListener(displayErrorListener);

verifyListenerPresenceAndListenersCountMatch(null, false, 4);

firebaseInAppMessaging.removeAllListeners();

verifyListenerPresenceAndListenersCountMatch(null, false, 0);
}

/**
* Verifies the presence of the provided listener in the set of listeners inside
* DeveloperListenerManager.
*
* @param listener the listener object or null. If null, only count verification will be done.
* @param shouldPresent should be present or absent.
* @param listenersCount the number of listeners that should be present.
*/
private void verifyListenerPresenceAndListenersCountMatch(
@Nullable Object listener, boolean shouldPresent, int listenersCount) {
Map listeners = developerListenerManager.getAllListeners();

if (listener != null) {
assertThat(listeners.containsKey(listener)).isEqualTo(shouldPresent);
}

assertThat(listeners.keySet().size()).isEqualTo(listenersCount);
}
}

0 comments on commit f1e092b

Please sign in to comment.